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(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); }
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); } }