Exemple #1
0
		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 );
		}
Exemple #2
0
        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 ) ) );
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }