private void SkillCastTask(object sender, System.Timers.ElapsedEventArgs e)
        {
            _skillCast.Enabled = false;
            if ((_target == null) || (_caster == null))
            {
                return;
            }

            if (!_cast.ConditionOk(_caster))
            {
                return;
            }

            if (_cast.ReuseDelay > 0)
            {
                if (_caster.Reuse.ContainsKey(_cast.SkillId))
                {
                    TimeSpan ts = _caster.Reuse[_cast.SkillId].StopTime - DateTime.Now;

                    if (ts.TotalMilliseconds > 0)
                    {
                        if (ts.TotalHours > 0)
                        {
                            SystemMessage sm = new SystemMessage(SystemMessage.SystemMessageId.S2HoursS3MinutesS4SecondsRemainingInS1ReuseTime);
                            sm.AddSkillName(_cast.SkillId, _cast.Level);
                            sm.AddNumber(ts.Hours);
                            sm.AddNumber(ts.Minutes);
                            sm.AddNumber(ts.Seconds);
                            _caster.SendPacket(sm);
                        }
                        else
                        {
                            if (ts.TotalMinutes > 0)
                            {
                                SystemMessage sm = new SystemMessage(SystemMessage.SystemMessageId.S2MinutesS3SecondsRemainingInS1ReuseTime);
                                sm.AddSkillName(_cast.SkillId, _cast.Level);
                                sm.AddNumber(ts.Minutes);
                                sm.AddNumber(ts.Seconds);
                                _caster.SendPacket(sm);
                            }
                            else
                            {
                                SystemMessage sm = new SystemMessage(SystemMessage.SystemMessageId.S2SecondsRemainingInS1ReuseTime);
                                sm.AddSkillName(_cast.SkillId, _cast.Level);
                                sm.AddNumber(ts.Seconds);
                                _caster.SendPacket(sm);
                            }
                        }

                        return;
                    }
                }
            }

            //do

            if (_cast.ReuseDelay > 0)
            {
                L2SkillCoolTime reuse = new L2SkillCoolTime
                {
                    Id    = _cast.SkillId,
                    Lvl   = _cast.Level,
                    Total = (int)_cast.ReuseDelay,
                    Owner = _caster
                };
                reuse.Delay = reuse.Total;
                reuse.Timer();
                _caster.Reuse.Add(reuse.Id, reuse);
            }

            _target.AddAbnormal(_cast, _caster, false, false);
        }
        private void SkillCastTask(object sender, System.Timers.ElapsedEventArgs e)
        {
            SkillCast.Enabled = false;
            if (target == null || caster == null)
            {
                return;
            }

            if (caster.InstanceID != target.InstanceID)
            {
                return;
            }

            if (!cast.ConditionOk(caster))
            {
                return;
            }

            if (cast.reuse_delay > 0)
            {
                if (caster._reuse.ContainsKey(cast.skill_id))
                {
                    TimeSpan ts = caster._reuse[cast.skill_id].stopTime - DateTime.Now;

                    if (ts.TotalMilliseconds > 0)
                    {
                        if (ts.TotalHours > 0)
                        {
                            //There are $s2 hour(s), $s3 minute(s), and $s4 second(s) remaining in $s1's re-use time.
                            SystemMessage sm = new SystemMessage(2305);
                            sm.addSkillName(cast.skill_id, cast.level);
                            sm.addNumber((int)ts.Hours);
                            sm.addNumber((int)ts.Minutes);
                            sm.addNumber((int)ts.Seconds);
                            caster.sendPacket(sm);
                        }
                        else if (ts.TotalMinutes > 0)
                        {
                            //There are $s2 minute(s), $s3 second(s) remaining in $s1's re-use time.
                            SystemMessage sm = new SystemMessage(2304);
                            sm.addSkillName(cast.skill_id, cast.level);
                            sm.addNumber((int)ts.Minutes);
                            sm.addNumber((int)ts.Seconds);
                            caster.sendPacket(sm);
                        }
                        else
                        {
                            //There are $s2 second(s) remaining in $s1's re-use time.
                            SystemMessage sm = new SystemMessage(2303);
                            sm.addSkillName(cast.skill_id, cast.level);
                            sm.addNumber((int)ts.Seconds);
                            caster.sendPacket(sm);
                        }

                        return;
                    }
                }
            }



            //do

            if (cast.reuse_delay > 0)
            {
                L2SkillCoolTime reuse = new L2SkillCoolTime();
                reuse.id     = cast.skill_id;
                reuse.lvl    = cast.level;
                reuse.total  = (int)cast.reuse_delay;
                reuse.delay  = reuse.total;
                reuse._owner = caster;
                reuse.timer();
                caster._reuse.Add(reuse.id, reuse);
            }

            target.addAbnormal(cast, caster, false, false);
        }