package minefantasy.mf2.mechanics; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.armour.ISpecialArmourMF; 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.TacticalManager; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.rpg.LevelupEvent; import minefantasy.mf2.api.rpg.RPGElements; import minefantasy.mf2.api.rpg.SyncSkillEvent; import minefantasy.mf2.api.stamina.StaminaBar; import minefantasy.mf2.api.tool.IHuntingItem; import minefantasy.mf2.api.tool.ISmithTongs; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.config.ConfigExperiment; import minefantasy.mf2.config.ConfigHardcore; import minefantasy.mf2.config.ConfigStamina; import minefantasy.mf2.entity.EntityItemUnbreakable; import minefantasy.mf2.entity.mob.EntityDragon; import minefantasy.mf2.farming.FarmingHelper; import minefantasy.mf2.item.food.FoodListMF; import minefantasy.mf2.item.list.ComponentListMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.weapon.ItemWeaponMF; import minefantasy.mf2.material.BaseMaterialMF; import minefantasy.mf2.network.packet.LevelupPacket; import minefantasy.mf2.network.packet.SkillPacket; import net.minecraft.block.Block; import net.minecraft.block.BlockLeavesBase; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; 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.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.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; 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.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; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.eventhandler.Event.Result; 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); 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) { EntityAgeable a; 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")) { event.setCanceled(true); return; } if(ConfigHardcore.lessHunt) { alterDrops(dropper, event); } } if(getRegisterName(dropper).contains("Horse")) { int dropCount = rand.nextInt(3 + event.lootingLevel); 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++) { dropper.entityDropItem(new ItemStack(meat), 0.0F); } } if(getRegisterName(dropper).contains("Wolf")) { int dropCount = rand.nextInt(3 + event.lootingLevel); 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++) { 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<EntityItem> 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<EntityItem> 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) { if(mob.getClass().getName().endsWith("EntityCow") || mob.getClass().getName().endsWith("EntityHorse")) { return 3; } if(mob.getClass().getName().endsWith("EntitySheep")) { return 2; } if(mob.getClass().getName().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) { 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) { 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<ItemStack> stuckArrows = (ArrayList<ItemStack>) 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) { event.setCanceled(true); 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(eitem.getEntityItem().getUnlocalizedName().contains("dragon")) { EntityItem newEntity = new EntityItemUnbreakable(event.world, eitem); event.world.spawnEntityInWorld(newEntity); eitem.setDead(); } } } } public void alterDrops(EntityLivingBase dropper, LivingDropsEvent event) { ArrayList<ItemStack> meats = new ArrayList<ItemStack>(); if(event.drops != null && !event.drops.isEmpty()) { Iterator<EntityItem> 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 && (weapon.getItem() instanceof IHuntingItem)) { if(((IHuntingItem)weapon.getItem()).canRetrieveDrops(weapon)) { 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 = rand.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(); 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 && rand.nextInt(25) == 0) { float chance = rand.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); } if(event.getPlayer() != null) { playerMineBlock(event); } } 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(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; ItemWeaponMF.applyFatigue(event.getPlayer(), points, 20F); 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) { 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.itemStack != null) { 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(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) { if(ArmourCalculator.useThresholdSystem) { addArmourDT(event.itemStack, event.entityPlayer, event.toolTip, event.showAdvancedItemTooltips); } else { 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<String> 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<String> 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 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); if (s == null) { s = "generic"; } return s; } @SubscribeEvent public void updateEntity(LivingUpdateEvent event) { EntityLivingBase entity = event.entityLiving; float lowHp = entity.getMaxHealth()/5F; int injury = getInjuredTime(entity); if(ConfigHardcore.critLimp && !(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 + (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) { 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; } 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; 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.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) { 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); } } } } private boolean isHotItem(ItemStack item) { return item != null && (item.getItem() instanceof IHotItem); } }