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