@SubscribeEvent(priority = EventPriority.LOW) // lower priority so we get called later since we change tool NBT public void reducedDamageBlocked(LivingHurtEvent event) { // don't affect unblockable or magic damage or explosion damage // projectiles are handled in LivingAttackEvent if(event.getSource().isUnblockable() || event.getSource().isMagicDamage() || event.getSource().isExplosion() || event.getSource().isProjectile() || event.isCanceled()) { return; } if(!shouldBlockDamage(event.getEntityLiving())) { return; } EntityPlayer player = (EntityPlayer) event.getEntityLiving(); ItemStack battlesign = player.getActiveItemStack(); // got hit by something: reduce damage int damage = event.getAmount() < 2f ? 1 : Math.round(event.getAmount() / 2f); // reduce damage. After this event the damage will be halved again because we're blocking so we have to factor this in event.setAmount(event.getAmount() * 0.7f); // reflect damage if(event.getSource().getTrueSource() != null) { event.getSource().getTrueSource().attackEntityFrom(DamageSource.causeThornsDamage(player), event.getAmount() / 2f); damage = damage * 3 / 2; } ToolHelper.damageTool(battlesign, damage, player); }
boolean isPlayerGettingDamaged = event.getEntityLiving() instanceof EntityPlayer; boolean isClient = event.getEntityLiving().getEntityWorld().isRemote; boolean isReflectedDamage = event.getSource() instanceof EntityDamageSource && ((EntityDamageSource) event.getSource()).getIsThornsDamage(); final EntityPlayer player = (EntityPlayer) event.getEntityLiving(); Entity attacker = event.getSource().getTrueSource(); for(ItemStack tool : event.getEntity().getHeldEquipment()) { if(isTool(tool) && !ToolHelper.isBroken(tool)) { heldTools.add(tool); if(!event.isCanceled()) { TinkerUtil.getTraitsOrdered(tool).forEach(trait -> trait.onBlock(tool, player, event)); if(!event.isCanceled()) { TinkerUtil.getTraitsOrdered(tool).forEach(trait -> trait.onPlayerHurt(tool, player, (EntityLivingBase) attacker, event));
@SubscribeEvent public static void onLivingHurt(LivingHurtEvent event) { EntityLivingBase entity = event.getEntityLiving(); if(entity.isRiding() && entity.getRidingEntity() instanceof EntityLivingBase) entity = (EntityLivingBase) entity.getRidingEntity(); if((entity instanceof EntityZombieHorse || entity instanceof EntitySkeletonHorse) && event.getSource() == DamageSource.FALL && ((AbstractHorse) entity).isTame()) { event.setCanceled(true); } }
@Override public void onBlock(ItemStack tool, EntityPlayer player, LivingHurtEvent event) { // block fire damage if(event.getSource().isFireDamage()) { event.setCanceled(true); ToolHelper.damageTool(tool, 3, player); } if(event.getSource().getTrueSource() != null) { event.getSource().getTrueSource().setFire(3); } } }
public boolean effectOnDamage(LivingHurtEvent event, EntityPlayer player, ItemStack stack) { if(!event.getSource().isMagicDamage()) { event.setAmount(event.getAmount() / 2); if(event.getSource().getTrueSource() != null) event.getSource().getTrueSource().attackEntityFrom(DamageSource.causeIndirectMagicDamage(player, player), event.getAmount()); if(event.getAmount() > player.getHealth()) event.setAmount(player.getHealth() - 1); player.world.playSound(null, player.posX, player.posY, player.posZ, ModSounds.holyCloak, SoundCategory.PLAYERS, 1F, 1F); for(int i = 0; i < 30; i++) { double x = player.posX + Math.random() * player.width * 2 - player.width; double y = player.posY + Math.random() * player.height; double z = player.posZ + Math.random() * player.width * 2 - player.width; boolean green = Math.random() > 0.5; Botania.proxy.sparkleFX(x, y, z, 0.3F, green ? 1F : 0.3F, green ? 0.3F : 1F, 0.8F + (float) Math.random() * 0.4F, 3); } return true; } return false; }
@Override public void onPlayerHurt(LivingHurtEvent event, EntityPlayer victim, @Nonnull ItemStack armorStack, EntityEquipmentSlot slot) { if (event.getSource() == DamageSource.FALL) { boolean hasPower = ChargableUtility.hasPower(event.getEntityLiving(), (int) (event.getAmount() / ArmorModule.fallAssistDivisor)); if (hasPower) { if (event.getAmount() <= 6.0F) { event.setAmount(0F); } event.setAmount(event.getAmount() / 3F); ChargableUtility.drainSteam(victim.getItemStackFromSlot(EntityEquipmentSlot.CHEST), (int) (event.getAmount() / ArmorModule.fallAssistDivisor), victim); if (event.getAmount() == 0.0F) { event.setResult(Event.Result.DENY); event.setCanceled(true); } } } } }
@SubscribeEvent public static void onEntityDamage(LivingHurtEvent event) { if(event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); PlayerDataHandler.get(player).damage(event.getAmount()); EntityLivingBase attacker = null; if(event.getSource().getTrueSource() != null && event.getSource().getTrueSource() instanceof EntityLivingBase) attacker = (EntityLivingBase) event.getSource().getTrueSource(); PsiArmorEvent.post(new PsiArmorEvent(player, PsiArmorEvent.DAMAGE, event.getAmount(), attacker)); if(event.getSource().isFireDamage()) PsiArmorEvent.post(new PsiArmorEvent(player, PsiArmorEvent.ON_FIRE)); } }
@SubscribeEvent(priority = EventPriority.HIGHEST) public void underworldTeleport(LivingHurtEvent event) { if (!(event.getEntity() instanceof EntityPlayer)) return; if (fallResetter.contains(event.getEntity().getUniqueID())) { if (event.getEntity().posY < 0 || event.getEntity().posY > event.getEntity().world.getHeight()) { event.setCanceled(true); return; if (event.getSource() == DamageSource.FALL) { fallResetter.remove(event.getEntity().getUniqueID()); event.setCanceled(true); return; if (event.getEntity().getEntityWorld().provider.getDimension() == Wizardry.underWorld.getId()) { if (event.getEntity().posY < 0) { EntityPlayer player = ((EntityPlayer) event.getEntityLiving()); player.isDead = false; event.setAmount(0); BlockPos spawn = player.isSpawnForced(0) ? player.getBedLocation(0) : player.world.getSpawnPoint().add(player.world.rand.nextGaussian() * 16, 0, player.world.rand.nextGaussian() * 16); BlockPos teleportTo = spawn.add(0, 300 - spawn.getY(), 0); fallResetter.add(event.getEntity().getUniqueID()); TeleportUtil.teleportToDimension((EntityPlayer) event.getEntity(), 0, teleportTo.getX(), teleportTo.getY(), teleportTo.getZ()); event.setCanceled(true); } else if (event.getEntity().getEntityWorld().provider.getDimension() == 0) { if (event.getSource() == EntityDamageSource.FALL && event.getEntity().fallDistance >= ConfigValues.underworldFallDistance) { BlockPos location = event.getEntity().getPosition(); BlockPos bedrock = PosUtils.checkNeighborBlocksThoroughly(event.getEntity().getEntityWorld(), location, Blocks.BEDROCK); if (bedrock != null) { fallResetter.add(event.getEntity().getUniqueID());
@SubscribeEvent public static void onDamageTaken(LivingHurtEvent event) { if(!event.getEntityLiving().world.isRemote && event.getEntityLiving() instanceof EntityPlayer && event.getSource().getTrueSource() instanceof EntityLivingBase) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); ItemStack stack = PlayerHelper.getFirstHeldItemClass(player, IPixieSpawner.class); float chance = getChance(stack); for (ItemStack element : player.inventory.armorInventory) chance += getChance(element); IItemHandler baubles = BaublesApi.getBaublesHandler(player); for(int i = 0; i < baubles.getSlots(); i++) chance += getChance(baubles.getStackInSlot(i)); if(Math.random() < chance) { EntityPixie pixie = new EntityPixie(player.world); pixie.setPosition(player.posX, player.posY + 2, player.posZ); if(((ItemElementiumHelm) ModItems.elementiumHelm).hasArmorSet(player)) { pixie.setApplyPotionEffect(new PotionEffect(potions[event.getEntityLiving().world.rand.nextInt(potions.length)], 40, 0)); } float dmg = 4; if(!stack.isEmpty() && stack.getItem() == ModItems.elementiumSword) dmg += 2; pixie.setProps((EntityLivingBase) event.getSource().getTrueSource(), player, 0, dmg); pixie.onInitialSpawn(player.world.getDifficultyForLocation(new BlockPos(pixie)), null); player.world.spawnEntity(pixie); } } }
@Override public void onPlayerHurt(LivingHurtEvent event, EntityPlayer victim, @Nonnull ItemStack armorStack, EntityEquipmentSlot slot) { EntityLivingBase entity = event.getEntityLiving(); float amount = event.getAmount(); if (!INVALID_SOURCES.contains(event.getSource()) && ChargableUtility.hasPower(entity, ArmorModule.zincPlateConsumption)) { float health = victim.getHealth(); float maxHealth = victim.getMaxHealth(); float halfOfMax = maxHealth / 2; if (amount >= halfOfMax || health <= halfOfMax) { ItemStack zincPlates = new ItemStack(METAL_PLATE, 2, ItemMetalPlate.Types.ZINC_PLATE.getMeta()); World world = victim.world; ChargableUtility.drainSteam(victim.getItemStackFromSlot(EntityEquipmentSlot.CHEST), ArmorModule.zincPlateConsumption, victim); UtilPlates.removePlate(armorStack); EntityItem entityItem = new EntityItem(world, victim.posX, victim.posY, victim.posZ, zincPlates); world.spawnEntity(entityItem); // player.setHealth(health - (amount - 10.0F)); victim.setHealth(health); victim.performHurtAnimation(); world.playSound(victim.posX, victim.posY, victim.posZ, EsteemedInnovation.SOUND_HISS, SoundCategory.PLAYERS, 2F, 0.9F, false); event.setCanceled(true); } } } }
@SubscribeEvent public void onHurt(LivingHurtEvent event) { if (event.getEntityLiving().isPotionActive(this) && event.getSource() == DamageSource.IN_WALL) { event.setAmount(0); } }
@SubscribeEvent public void onPlayerHurt(LivingHurtEvent event) { World world = event.getEntity().world; if (!world.isRemote && event.getAmount() != 0.0F) { if (event.getEntity() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.getEntity(); if (!player.isCreative()) { ThirstHandler thirstStats = (ThirstHandler) player.getCapability(TANCapabilities.THIRST, null); //Uses hunger values for now, may change in the future thirstStats.addExhaustion(event.getSource().getHungerDamage()); } } } }
@Override public boolean effectOnDamage(LivingHurtEvent event, EntityPlayer player, ItemStack stack) { if(!event.getSource().isUnblockable()) { int range = 6; List mobs = player.world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(player.posX - range, player.posY - range, player.posZ - range, player.posX + range, player.posY + range, player.posZ + range), Predicates.instanceOf(IMob.class)); for(IMob mob : (List<IMob>) mobs) if(mob instanceof EntityLivingBase) { EntityLivingBase entity = (EntityLivingBase) mob; entity.attackEntityFrom(DamageSource.causePlayerDamage(player), event.getAmount()); } player.world.playSound(null, player.posX, player.posY, player.posZ, ModSounds.unholyCloak, SoundCategory.PLAYERS, 1F, 1F); for(int i = 0; i < 90; i++) { float rad = i * 4F * (float) Math.PI / 180F; float xMotion = (float) Math.cos(rad) * 0.2F; float zMotion = (float) Math.sin(rad) * 0.2F; Botania.proxy.wispFX(player.posX, player.posY + 0.5, player.posZ, 0.4F + (float) Math.random() + 0.25F, 0F, 0F, 0.6F + (float) Math.random() * 0.2F, xMotion, 0F, zMotion); } return true; } return false; }
@SubscribeEvent public void onPlayerHurt(LivingHurtEvent event) { if (event.getEntityLiving().getHealth() - event.getAmount() <= 0 && event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer p = (EntityPlayer) event.getEntityLiving(); for (int i = 0; i < p.inventory.getSizeInventory(); ++i) { ItemStack s = p.inventory.getStackInSlot(i); if (s.getItem() instanceof ItemSoulstone) { UtilChat.addChatMessage(p, event.getEntityLiving().getName() + UtilChat.lang("item.soulstone.used")); p.inventory.setInventorySlotContents(i, ItemStack.EMPTY); UtilSound.playSound(p, SoundEvents.BLOCK_GLASS_BREAK); p.setHealth(6);// 3 hearts int time = Const.TICKS_PER_SEC * 30; p.addPotionEffect(new PotionEffect(MobEffects.FIRE_RESISTANCE, time)); time = Const.TICKS_PER_SEC * 60;//a full minute p.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, time)); p.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, time, 4)); //and bad luck lasts much longer time = Const.TICKS_PER_SEC * 60 * 10; p.addPotionEffect(new PotionEffect(MobEffects.UNLUCK, time)); p.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, time, 1)); event.setCanceled(true); break; } } } }
@Override public void onPlayerHurt(LivingHurtEvent event, EntityPlayer victim, @Nonnull ItemStack armorStack, EntityEquipmentSlot slot) { DamageSource source = event.getSource(); if (isHotDamageSource(source) && isInHotness(victim)) { event.getEntity().motionY = 0.5D; event.setCanceled(true); } }
@SubscribeEvent public void onPlayerDamage(LivingHurtEvent event) { if(event.getEntityLiving() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntityLiving(); ItemStack belt = BaublesApi.getBaublesHandler(player).getStackInSlot(5); if(!belt.isEmpty() && belt.getItem() instanceof ItemHolyCloak && !isInEffect(belt)) { ItemHolyCloak cloak = (ItemHolyCloak) belt.getItem(); int cooldown = getCooldown(belt); // Used to prevent StackOverflows with mobs that deal damage when damaged setInEffect(belt, true); if(cooldown == 0 && cloak.effectOnDamage(event, player, belt)) setCooldown(belt, cloak.getCooldownTime(belt)); setInEffect(belt, false); } } }
@SubscribeEvent public void onHurt(LivingHurtEvent event) { Entity e = event.getEntity(); if(e instanceof EntitySquid && !e.world.isRemote && event.getSource().getTrueSource() instanceof EntityPlayer) { List<EntityPlayer> players = e.world.getEntitiesWithinAABB(EntityPlayer.class, e.getEntityBoundingBox().grow(4, 4, 4)); for(EntityPlayer player : players) player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, time, 0)); WorldServer ws = (WorldServer) e.world; ws.spawnParticle(EnumParticleTypes.SMOKE_LARGE, e.posX + e.width / 2, e.posY + e.height / 2, e.posZ + e.width / 2, 100, 0, 0, 0, 0.02); } }
@Override public void onBlock(ItemStack tool, EntityPlayer player, LivingHurtEvent event) { Entity target = event.getSource().getTrueSource(); dealSpikyDamage(true, tool, player, target); }
public void onEntityHurt(LivingHurtEvent event) { if (!event.isCanceled()) { if (HURT_GLITCHING && event.getAmount() > 0) { androidEffects.updateEffect(EFFECT_GLITCH_TIME, modify(10, AndroidAttributes.attributeGlitchTime)); sync(EnumSet.of(DataType.EFFECTS)); playGlitchSound(this, player.getRNG(), 0.2f); } triggerEventOnStats(event); } }