package minefantasy.system; import java.util.Iterator; import java.util.Random; import minefantasy.MineFantasyBase; import minefantasy.api.MineFantasyAPI; import minefantasy.api.anvil.ITongs; import minefantasy.api.arrow.ISpecialBow; import minefantasy.api.forge.TongsHelper; import minefantasy.api.weapon.EnumWeaponType; import minefantasy.api.weapon.WeaponClass; import minefantasy.block.BlockListMF; import minefantasy.block.BlockSaplingMF; import minefantasy.entity.EntityArrowMF; import minefantasy.item.ItemBloom; import minefantasy.item.ItemHotItem; import minefantasy.item.ItemListMF; import minefantasy.item.ToolMaterialMedieval; import minefantasy.item.weapon.ItemBowMF; import minefantasy.item.weapon.ItemWeaponMF; import mods.battlegear2.api.PlayerEventChild.QuiverArrowEvent; import net.minecraft.client.Minecraft; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityWolf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.item.ItemTool; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.PlaySoundAtEntityEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import cpw.mods.fml.common.FMLLog; public class EventManagerMF { public static String nonTendon[] = {"MoCEntityEnt"}; @ForgeSubscribe public void entityDrop(LivingDropsEvent event) { Class enClass = event.entityLiving.getClass(); String name = ""; if(enClass != null && EntityList.classToStringMapping.get(enClass) != null) { name = (String) EntityList.classToStringMapping.get(enClass); } if(event.entityLiving instanceof EntityAnimal && cfg.hardcoreCraft) { boolean primitive = false; if(event.source != null && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { primitive = isPrimitive(((EntityPlayer)event.source.getEntity()).getHeldItem()); } Random rand = event.entityLiving.getRNG(); if(primitive) { for(String ent : nonTendon) { if (enClass.getName().endsWith(ent)){ break; }else{ for(int a = 0; a < 1 + rand.nextInt(4); a ++){ event.entityLiving.entityDropItem(new ItemStack(ItemListMF.misc, 1, ItemListMF.tendon), 1.0F); } } } } } EntityLivingBase dropper = event.entityLiving; for(EntityItem item : event.drops) { if(item.getEntityItem().isItemEqual(new ItemStack(Item.leather))) { item.setDead(); if(name.equals("EntityHorse")||enClass.getName().endsWith("GaiaCentaur")||enClass.getName().endsWith("MoCEntityHorse")|| enClass.getName().endsWith("MoCEntityHorseMob")) { dropHide(event.lootingLevel, ItemListMF.hideHorse, dropper); } else if(enClass.getName().endsWith("EntityAtmosBison")) { dropHide(event.lootingLevel, ItemListMF.rawHide, dropper); } else if(enClass.getName().endsWith("GaiaHunter")) { dropHide(event.lootingLevel, ItemListMF.leatherRaw, dropper); } else if(enClass.getName().endsWith("MoCEntityFox")) { dropHide(event.lootingLevel, ItemListMF.hideHound, dropper); } else if(enClass.getName().endsWith("EntityTroll")) { dropHide(event.lootingLevel, ItemListMF.hideHound, dropper); } else if(name.equals("Cow")) { dropHide(event.lootingLevel, ItemListMF.rawHide, dropper); } else { if (!enClass.getName().startsWith("net.minecraft")&&!enClass.getName().startsWith("minefantasy")){ FMLLog.warning("[MineFantasy] "+enClass.getName()+"is attempting to drop vanilla leather, report this to the developers"); dropHide(event.lootingLevel, ItemListMF.hideGeneric, dropper); } } } } if(name.equals("Skeleton")) { for(EntityItem item : event.drops) { if(item.getEntityItem().isItemEqual(new ItemStack(Item.coal))) { item.setEntityItemStack(new ItemStack(ItemListMF.misc, 1, ItemListMF.HellCoal)); } else if(item.getEntityItem().isItemEqual(new ItemStack(Item.bow))) { item.setEntityItemStack(new ItemStack(ItemListMF.shortbow)); } } } if(name.equals("Sheep")||name.toLowerCase().contains("sheep")||name.toLowerCase().contains("goat")) { dropHide(event.lootingLevel, ItemListMF.hideSheep, dropper); if(cfg.dropMutton) { int amount = MineFantasyBase.isHOLoaded() ? 1 : dropper.getRNG().nextInt(3); if(event.lootingLevel > 0) { amount += dropper.getRNG().nextInt(event.lootingLevel); } ItemStack food = new ItemStack(dropper.isBurning() ? ItemListMF.muttonCooked : ItemListMF.muttonRaw); if(food.stackSize > 0) { for(int a = 0; a < amount; a ++) dropper.entityDropItem(food, 0.0F); } } } if(name.equals("Chicken")) { int amount = dropper.getRNG().nextInt(2) + 1 + dropper.getRNG().nextInt(1 + event.lootingLevel); ItemStack featherdrop = new ItemStack(Item.feather); if(featherdrop.stackSize > 0) for(int a = 0; a < amount; a ++) dropper.entityDropItem(featherdrop, 0.0F); } if(name.equals("Blaze")) { int amount = 1 + dropper.getRNG().nextInt(1 + event.lootingLevel); ItemStack hellDrop = new ItemStack(ItemListMF.misc, 1, ItemListMF.HellCoal); if(hellDrop.stackSize > 0) { for(int a = 0; a < amount; a ++) dropper.entityDropItem(hellDrop, 0.0F); } } if(enClass.getName().endsWith("MoCEntityBoar") || enClass.getName().endsWith("MoCEntityDeer")) { ItemStack drop = new ItemStack(Item.porkRaw); if(event.entityLiving.isBurning()) drop = new ItemStack(Item.porkCooked); int num = event.lootingLevel + event.entityLiving.getRNG().nextInt(2); for(int a = 0; a < num; a ++) event.entityLiving.entityDropItem(drop, 0.0F); } if(enClass.getName().endsWith("MoCEntityFishy")) { ItemStack drop = new ItemStack(Item.fishRaw); if(event.entityLiving.isBurning()) drop = new ItemStack(Item.fishCooked); event.entityLiving.entityDropItem(drop, 0.0F); } if(event.entityLiving instanceof EntityWolf/* && !(event.entityLiving instanceof EntityHound)*/) { dropHide(event.lootingLevel, ItemListMF.hideHound, dropper); } } private void dropHide(int loot, int hide, EntityLivingBase dropper) { int amount = 1 + dropper.getRNG().nextInt(1 + loot); ItemStack leatherdrop = new ItemStack(ItemListMF.misc, 1 , hide); if(leatherdrop.stackSize > 0) for(int a = 0; a < amount; a ++) dropper.entityDropItem(leatherdrop, 0.0F); } @ForgeSubscribe 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 ITongs) { if(!TongsHelper.hasHeldItem(held)) { if(isHotItem(item)) { if(TongsHelper.trySetHeldItem(held, item)) { drop.setDead(); if(event.isCancelable()) { event.setCanceled(true); } return; } } } } { if(cfg.burnPlayer && item != null && isHotItem(item)) { if(event.isCancelable()) { event.setCanceled(true); } } } } private boolean isPrimitive(ItemStack heldItem) { if(heldItem == null)return true; if(heldItem.isItemEqual(ItemListMF.component(ItemListMF.rock))) { return true; } if(heldItem.itemID == Item.swordStone.itemID || heldItem.itemID == Item.swordWood.itemID) { return true; } if(heldItem.getItem() != null) { if(heldItem.getItem() instanceof IPublicMaterialItem) { EnumToolMaterial mat = ((IPublicMaterialItem)heldItem.getItem()).getMaterial(); return mat == EnumToolMaterial.STONE || mat == EnumToolMaterial.WOOD || mat == ToolMaterialMedieval.PRIMITIVE_COPPER || mat == ToolMaterialMedieval.PRIMITIVE_STONE; } if(heldItem.getItem() instanceof ItemWeaponMF) { return ((ItemWeaponMF)heldItem.getItem()).isPrimitive(); } } return false; } @ForgeSubscribe public void setTarget(LivingSetAttackTargetEvent event) { if(event.entity != null && event.target != null) { if(event.entityLiving.canEntityBeSeen(event.target)) if(!TacticalManager.isDetected(event.target, event.entityLiving)) { if(event.isCancelable()) event.setCanceled(true); else { if(event.entityLiving instanceof EntityLiving) { ((EntityLiving)event.entityLiving).setAttackTarget(null); } } } if(event.entityLiving instanceof EntityCreeper && !(event.target instanceof EntityPlayer)) if(event.isCancelable()) event.setCanceled(true); else { if(event.entityLiving instanceof EntityLiving) { ((EntityLiving)event.entityLiving).setAttackTarget(null); } } } } private static String getType(String type, EnumWeaponType wC) { if(wC == EnumWeaponType.AXE || wC == EnumWeaponType.BIGAXE || wC == EnumWeaponType.BIGBLADE || wC == EnumWeaponType.BIGPOLEARM || wC == EnumWeaponType.LONGBLADE || wC == EnumWeaponType.MEDBLADE || wC == EnumWeaponType.POLEARM || wC == EnumWeaponType.SMLAXE || wC == EnumWeaponType.SMLBLADE || wC == EnumWeaponType.STAFF ) { return "blade"; } return "blunt"; } public static void makeHitSound(ItemStack weapon, Entity target) { if(!cfg.hitSound) { return; } if(weapon != null) { EnumWeaponType WC = WeaponClass.getClassFor(weapon); String material = "metal"; String type = "blunt"; material = getMaterial(material, weapon.getItem()); if(WC != null) { type = getType(type, WC); String sndString = data_minefantasy.sound("Weapon.hit." + type + "." + material + "_"); float volume = 1.0F; target.playSound(sndString, 1.0F, 1.0F); } } } private static String getMaterial(String material, Item item) { 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 IPublicMaterialItem) { EnumToolMaterial mat = ((IPublicMaterialItem)item).getMaterial(); if(mat == ToolMaterialMedieval.PRIMITIVE_STONE) { material = "stone"; } } return material; } public void readyBow(ArrowNockEvent event) { if(MineFantasyBase.isBGLoaded()) { return; } EntityPlayer player = event.entityPlayer; ItemStack bow = event.result; boolean infinite = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, bow) > 0; for(ItemStack arrow: ArrowsMF.useableArrows) { if(player.inventory.hasItemStack(arrow)) { player.setItemInUse(bow, bow.getMaxItemUseDuration()); ItemBowMF.loadArrow(player, bow, arrow, true); event.setCanceled(true); return; } } if(infinite) { player.setItemInUse(bow, bow.getMaxItemUseDuration()); ItemBowMF.loadArrow(player, bow, new ItemStack(Item.arrow), true); event.setCanceled(true); return; } } //ItemBow public void fireArrow(ArrowLooseEvent event) { if(MineFantasyBase.isBGLoaded()) { return; } ItemStack bow = event.bow; float charge = event.charge; EntityPlayer player = event.entityPlayer; World world = event.entity.worldObj; ItemBowMF.loadArrow(player, bow, null, true); for(ItemStack arrow: ArrowsMF.useableArrows) { if(shootSpecificArrow( bow, world, player, charge, arrow)) { event.setCanceled(true); return; } } } @ForgeSubscribe public void playWorldSound(PlaySoundAtEntityEvent event) { if(event != null && event.name != null) { if(event.name.equalsIgnoreCase("random.bow")) { event.name = "minefantasy:oldbow"; } } } public boolean shootSpecificArrow(ItemStack item, World world, EntityPlayer player, float power, ItemStack ammo) { boolean infinite = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0; Random itemRand = new Random(); if (player.inventory.hasItemStack(ammo)) { float charge = (float)power / 20.0F; charge = (charge * charge + charge * 2.0F) / 3.0F; if ((double)charge < 0.1D) { return false; } if (charge > 1.0F) { charge = 1.0F; } float force = 2.0F; EntityArrowMF arrow = new EntityArrowMF(world, player, charge * 2.0F, ammo.getItemDamage()); if (charge == 1.0F) { arrow.setIsCritical(true); } int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item); if (var9 > 0) { arrow.setDamage(arrow.getDamage() + (double)var9 * 0.5D + 0.5D); } int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item); if (var10 > 0) { arrow.setKnockbackStrength(var10); } if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0) { arrow.setFire(100); } if(!player.capabilities.isCreativeMode) { item.damageItem(1, player); } if(!infinite) { consumePlayerItem(player, ammo); } else { arrow.canBePickedUp = 2; } world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + charge * 0.5F); if (!world.isRemote) { world.spawnEntityInWorld(arrow); } return true; } return false; } @ForgeSubscribe public void hurtEntity(LivingHurtEvent event) { CombatManager.onAttack(event); } @ForgeSubscribe public void onAttack(LivingAttackEvent event) { Entity source = event.source.getSourceOfDamage(); if(source != null && source instanceof EntityLiving && !event.source.isProjectile()) { EntityLiving attacker = (EntityLiving)source; PotionEffect affliction = attacker.getActivePotionEffect(Potion.confusion); if(affliction != null) { Random rand = attacker.getRNG(); int tier = affliction.getAmplifier(); if(rand.nextInt(5) <= tier) { event.setCanceled(true); } } } } @ForgeSubscribe public void fertellise (BonemealEvent event) { World world = event.world; EntityPlayer player = event.entityPlayer; int x = event.X; int y = event.Y; int z = event.Z; int id = event.ID; ItemStack item = player.getHeldItem(); int meta = world.getBlockMetadata(x, y, z); if (id == BlockListMF.sapling.blockID) { if (!world.isRemote) { if ((double)world.rand.nextFloat() < ((BlockSaplingMF)BlockListMF.sapling).getBonemealChance(meta)) { ((BlockSaplingMF)BlockListMF.sapling).markOrGrowMarked(world, x, y, z, world.rand); } } event.setResult(Result.ALLOW); } } 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; } private boolean isHotItem(ItemStack item) { return item != null && (item.getItem() instanceof ItemHotItem || item.getItem() instanceof ItemBloom || MineFantasyAPI.isHotToPickup(item)); } /*@ForgeSubscribe public void loadChunk(ChunkDataEvent.Load event) { if(!cfg.regen)return; NBTTagCompound nbt = event.getData(); int layer = cfg.regenLayer; if(nbt.hasKey("MineFantasyWG_" + layer)) { return; } nbt.setBoolean("MineFantasyWG_" + layer, true); World world = event.world; int chunkX = event.getChunk().xPosition; int chunkZ = event.getChunk().zPosition; Random rand = event.world.rand; MineFantasyBase.generator.generate(rand, chunkX, chunkZ, world, world.getChunkProvider(), world.getChunkProvider()); }*/ @ForgeSubscribe public void fireMBArrow(QuiverArrowEvent.Firing event) { ItemStack bow = event.getBow(); EntityArrow arrow = event.arrow; if(bow != null && bow.getItem() != null && bow.getItem() instanceof ISpecialBow) { arrow = (EntityArrow) ((ISpecialBow)bow.getItem()).modifyArrow(arrow); } } @ForgeSubscribe public void onEntityJoinWorld(EntityJoinWorldEvent event) { if(event.entity instanceof EntityArrow) { EntityArrow arrow = (EntityArrow)event.entity; if(arrow.shootingEntity != null && arrow.shootingEntity instanceof EntityLiving) { EntityLiving attacker = (EntityLiving)arrow.shootingEntity; PotionEffect affliction = attacker.getActivePotionEffect(Potion.confusion); if(affliction != null) { Random rand = attacker.getRNG(); float tier = (float)affliction.getAmplifier()+1*5F; arrow.motionX *= 1F + ((rand.nextFloat()*0.2F - 0.1F)*tier); arrow.motionY *= 1F + ((rand.nextFloat()*0.2F - 0.1F)*tier); arrow.motionZ *= 1F + ((rand.nextFloat()*0.2F - 0.1F)*tier); } } } } /* @ForgeSubscribe public void blockWithShield(PlayerEventChild.ShieldBlockEvent event) { float damage = event.ammount; EntityLivingBase attacker = null; if(event.source.getSourceOfDamage() != null && event.source.getSourceOfDamage() instanceof EntityLivingBase) { attacker = (EntityLivingBase)event.source.getSourceOfDamage(); } ItemStack shield = event.shield; if(shield != null && shield.getItem() instanceof ItemShield) { if(attacker != null) { event.damageShield = ((ItemShield)shield.getItem()).collideWithShield(event.source, attacker, damage); } } } */ }