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