public override void OnHit( Mobile attacker, Mobile defender, int damage ) { if( !Validate( attacker ) || !CheckMana( attacker, true ) ) return; ClearCurrentMove( attacker ); double ninjitsu = attacker.Skills[SkillName.Ninjitsu].Value; double chance; if( ninjitsu < 100 ) //This formula is an approximation from OSI data. TODO: find correct formula chance = 30 + (ninjitsu - 85) * 2.2; else chance = 63 + (ninjitsu - 100) * 1.1; if( (chance / 100) < Utility.RandomDouble() ) { attacker.SendLocalizedMessage( 1070779 ); // You missed your opponent with a Death Strike. return; } DeathStrikeInfo info; int damageBonus = 0; if( m_Table.Contains( defender ) ) { defender.SendLocalizedMessage( 1063092 ); // Your opponent lands another Death Strike! info = (DeathStrikeInfo)m_Table[defender]; if( info.m_Steps > 0 ) damageBonus = attacker.Skills[SkillName.Ninjitsu].Fixed / 150; if( info.m_Timer != null ) info.m_Timer.Stop(); m_Table.Remove( defender ); } else { defender.SendLocalizedMessage( 1063093 ); // You have been hit by a Death Strike! Move with caution! } attacker.SendLocalizedMessage( 1063094 ); // You inflict a Death Strike upon your opponent! defender.FixedParticles( 0x374A, 1, 17, 0x26BC, EffectLayer.Waist ); attacker.PlaySound( attacker.Female ? 0x50D : 0x50E ); info = new DeathStrikeInfo( defender, attacker, damageBonus ); info.m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( ProcessDeathStrike ), defender ); m_Table[defender] = info; CheckGain( attacker ); }
public override void OnHit( Mobile attacker, Mobile defender, int damage ) { if ( !Validate( attacker ) || !CheckMana( attacker, true ) ) return; ClearCurrentMove( attacker ); if ( !CheckGain( attacker ) ) { attacker.SendLocalizedMessage( 1070779 ); // You missed your opponent with a Death Strike. return; } DeathStrikeInfo info; if ( m_Table.ContainsKey( defender ) ) { defender.SendLocalizedMessage( 1063092 ); // Your opponent lands another Death Strike! info = m_Table[defender]; if ( info.m_Timer != null ) info.m_Timer.Stop(); m_Table.Remove( defender ); } else { defender.SendLocalizedMessage( 1063093 ); // You have been hit by a Death Strike! Move with caution! } attacker.SendLocalizedMessage( 1063094 ); // You inflict a Death Strike upon your opponent! defender.FixedParticles( 0x374A, 1, 17, 0x26BC, EffectLayer.Waist ); attacker.PlaySound( attacker.Female ? 0x50D : 0x50E ); info = new DeathStrikeInfo( defender, attacker ); info.m_Timer = Timer.DelayCall( DamageDelay, () => ProcessDeathStrike( info ) ); m_Table[defender] = info; int buffdamage = (int) ( attacker.Skills[SkillName.Ninjitsu].Value / 3 ); BuffInfo.AddBuff( defender, new BuffInfo( BuffIcon.DeathStrike, 1075645, DamageDelay, defender, String.Format( "{0}", buffdamage ) ) ); }
public override void OnHit(Mobile attacker, Mobile defender, int damage) { if (!Validate(attacker) || !CheckMana(attacker, true)) { return; } ClearCurrentMove(attacker); double ninjitsu = attacker.Skills.Ninjitsu.Value; double chance; // TODO: should be defined onHit method, what if the player hit and remove the weapon before process? ;) bool isRanged = attacker.Weapon is BaseRanged; if (ninjitsu < 100) // This formula is an approximation from OSI data. TODO: find correct formula { chance = 30 + (ninjitsu - 85) * 2.2; } else { chance = 63 + (ninjitsu - 100) * 1.1; } if (chance / 100 < Utility.RandomDouble()) { attacker.SendLocalizedMessage(1070779); // You missed your opponent with a Death Strike. return; } int damageBonus = 0; if (m_Table.TryGetValue(defender, out DeathStrikeInfo info)) { defender.SendLocalizedMessage(1063092); // Your opponent lands another Death Strike! if (info.m_Steps > 0) { damageBonus = attacker.Skills.Ninjitsu.Fixed / 150; } info.m_Timer?.Stop(); m_Table.Remove(defender); } else { defender.SendLocalizedMessage(1063093); // You have been hit by a Death Strike! Move with caution! } attacker.SendLocalizedMessage(1063094); // You inflict a Death Strike upon your opponent! defender.FixedParticles(0x374A, 1, 17, 0x26BC, EffectLayer.Waist); attacker.PlaySound(attacker.Female ? 0x50D : 0x50E); info = new DeathStrikeInfo(defender, attacker, damageBonus, isRanged) { m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(5.0), ProcessDeathStrike, defender) }; m_Table[defender] = info; CheckGain(attacker); }
private static void ProcessDeathStrike( DeathStrikeInfo info ) { double ninjitsu = info.m_Attacker.Skills[SkillName.Ninjitsu].Value; double hiding = info.m_Attacker.Skills[SkillName.Hiding].Value; double stealth = info.m_Attacker.Skills[SkillName.Stealth].Value; double scalar = 1.0 + ( hiding + stealth ) / 100; double damage = scalar * ( ninjitsu / 8 ); if ( info.m_IsRanged ) damage /= 2; if ( info.m_Steps < 5 ) damage /= 3; info.m_Target.Damage( (int) damage, info.m_Attacker ); if ( info.m_Timer != null ) { info.m_Timer.Stop(); info.m_Timer = null; } m_Table.Remove( info.m_Target ); }
public override void OnHit(Mobile attacker, Mobile defender, int damage) { if (!Validate(attacker) || !CheckMana(attacker, true)) { return; } ClearCurrentMove(attacker); double ninjitsu = attacker.Skills[SkillName.Ninjitsu].Value; double chance; if (ninjitsu < 100) //This formula is an approximation from OSI data. TODO: find correct formula { chance = 30 + (ninjitsu - 85) * 2.2; } else { chance = 63 + (ninjitsu - 100) * 1.1; } if ((chance / 100) < Utility.RandomDouble()) { attacker.SendLocalizedMessage(1070779); // You missed your opponent with a Death Strike. return; } DeathStrikeInfo info; int damageBonus = 0; if (m_Table.Contains(defender)) { attacker.SendLocalizedMessage(1063092); // Your opponent lands another Death Strike! info = (DeathStrikeInfo)m_Table[defender]; if (info.m_Steps > 0) { damageBonus = info.m_Attacker.Skills[SkillName.Ninjitsu].Fixed / 150; } if (info.m_Timer != null) { info.m_Timer.Stop(); } m_Table.Remove(defender); } else { attacker.SendLocalizedMessage(1063094); // You inflict a Death Strike upon your opponent! defender.SendLocalizedMessage(1063093); // You have been hit by a Death Strike! Move with caution! } defender.FixedParticles(0x374A, 1, 17, 0x26BC, EffectLayer.Waist); attacker.PlaySound(0x50D); info = new DeathStrikeInfo(defender, attacker, damageBonus); info.m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(5.0), new TimerStateCallback(ProcessDeathStrike), info); m_Table[defender] = info; CheckGain(attacker); }