Exemple #1
0
        public MapleStatEffect GetEffect(int level)
        {
            MapleStatEffect ret = null;

            if (m_effects.Count > level - 1)
            {
                ret = m_effects[level - 1];
            }
            return(ret);
        }
Exemple #2
0
        public static Skill LoadFromData(int id, IMapleData data)
        {
            var ret       = new Skill(id);
            var isBuff    = false;
            var skillType = MapleDataTool.GetInt("skillType", data, -1);
            var elem      = MapleDataTool.GetString("elemAttr", data, null);

            if (elem != null)
            {
                ret.Element = Element.GetByChar(elem[0]);
            }
            else
            {
                ret.Element = Element.Neutral;
            }
            // unfortunatly this is only set for a few skills so we have to do some more to figure out if it's a buff �.o
            var effect = data.GetChildByPath("effect");

            if (skillType != -1)
            {
                if (skillType == 2)
                {
                    isBuff = true;
                }
            }
            else
            {
                var action = data.GetChildByPath("action");
                var hit    = data.GetChildByPath("hit");
                var ball   = data.GetChildByPath("ball");
                isBuff  = effect != null && hit == null && ball == null;
                isBuff |= action != null && MapleDataTool.GetString("0", action, "").Equals("alert2");
                switch (id)
                {
                case 1121006:     // rush
                case 1221007:     // rush
                case 1311005:     // sacrifice
                case 1321003:     // rush
                case 2111002:     // explosion
                case 2111003:     // poison mist
                case 2301002:     // heal
                case 3110001:     // mortal blow
                case 3210001:     // mortal blow
                case 4101005:     // drain
                case 4111003:     // shadow web
                case 4201004:     // steal
                case 4221006:     // smokescreen
                case 9101000:     // heal + dispel
                case 1121001:     // monster magnet
                case 1221001:     // monster magnet
                case 1321001:     // monster magnet
                case 5201006:     // Recoil Shot
                case 5111004:     // energy drain
                case 14111001:    // Shadow Web
                case 20001006:
                case 20001007:
                case 21000000:
                case 21001001:
                case 21000002:
                case 14101006:
                case 21100000:
                case 21100001:
                case 21120006:     //�荤�虫��杈�
                case 21100002:
                case 21100004:
                case 21110000:
                case 5221010:
                //case 21110002:
                case 21110003:
                case 21110006:
                case 21120001:
                case 21120002:
                case 21120004:
                case 21120005:

                case 21121008:
                    isBuff = false;
                    break;

                //楠�澹��㈢������
                case 12001004:     //flame
                case 11101002:     //缁�����
                case 21100005:     //杩����歌�
                case 11001004:     //soul
                case 14001005:     //dark soul?
                case 13001004:     //storm sprite
                case 15001003:
                case 5001005:
                case 14001003: // Dark Sight

                case 15000000: // Bullet Time
                case 15001004: // Lightning
                case 11101001: // Sword Booster
                case 11101003: // Rage
                case 11101004: // Soul Blade
                case 11101005: // Soul Rush
                case 12101000: // Meditation
                case 12101001: // Slow
                case 12101004: // Spell Booster
                case 12101005: // Elemental Reset
                case 13101001: // Bow Booster
                case 13101003: // Soul Arrow : Bow
                case 13101005: // Storm Brakes
                case 13101006: // Wind Walk
                case 14100005: // Vanish
                case 14101002: // Claw Booster
                case 14101003: // Haste
                case 15100004: // Energy Charge
                case 15101002: // Knuckle Booster
                case 15101006: // Lightning Charge
                case 11111001: // Combo Attack
                case 11111007: // Soul Charge
                case 12111002: // Seal is one
                case 13111004: // Puppet
                case 13111005: // Albatross
                case 14111000: // Shadow Partner
                case 15111001: // Energy Drain
                case 15111002: // Transformation
                case 15111005: // Speed Infusion
                case 15111006: // Spark
                case 15111007: // Shark Wave
                case 13001002: //focus
                case 12001001: // Magic Guard
                case 12001002: // Magic Armor
                case 11001001: // Iron Body
                case 12111004: //ifrit KoC
                case 10000012: // Blessing of the Spirit
                case 10001000: // Three Snails
                case 10001001: // Recovery
                case 10001002: // Nimble Feet
                case 10001003: // Legendary Spiri
                case 5221003:
                case 10001004: // Monster Rider
                case 10001005: // Echo of Hero
                case 1001:     // recovery
                case 1002:     // nimble feet
                case 1004:     // monster riding
                case 1005:     // echo of hero
                case 1001003:  // iron body
                case 1101004:  // sword booster
                case 1201004:  // sword booster
                case 1101005:  // axe booster
                case 1201005:  // bw booster
                case 1301004:  // spear booster
                case 1301005:  // polearm booster
                case 3101002:  // bow booster
                case 3201002:  // crossbow booster
                case 4101003:  // claw booster
                case 4201002:  // dagger booster
                case 1101007:  // power guard
                case 1201007:  // power guard
                case 1101006:  // rage
                case 1301006:  // iron will
                case 1301007:  // hyperbody
                case 1111002:  // combo attack
                case 1211006:  // blizzard charge bw
                case 1211004:  // fire charge bw
                case 1211008:  // lightning charge bw
                case 1221004:  // divine charge bw
                case 1211003:  // fire charge sword
                case 1211005:  // ice charge sword
                case 1211007:  // thunder charge sword
                case 1221003:  // holy charge sword
                case 1311008:  // dragon blood
                case 1121000:  // maple warrior
                case 1221000:  // maple warrior
                case 1321000:  // maple warrior
                case 2121000:  // maple warrior
                case 2221000:  // maple warrior
                case 2321000:  // maple warrior
                case 3121000:  // maple warrior
                case 3221000:  // maple warrior
                case 4121000:  // maple warrior
                case 4221000:  // maple warrior
                case 1121002:  // power stance
                case 1221002:  // power stance
                case 1321002:  // power stance
                case 1121010:  // enrage
                case 1321007:  // beholder
                case 1320008:  // beholder healing
                case 1320009:  // beholder buff
                case 2001002:  // magic guard
                case 2001003:  // magic armor
                case 2101001:  // meditation
                case 2201001:  // meditation
                case 2301003:  // invincible
                case 2301004:  // bless
                case 2111005:  // spell booster
                case 2211005:  // spell booster
                case 2311003:  // holy symbol
                case 2311006:  // summon dragon
                case 2121004:  // infinity
                case 2221004:  // infinity
                case 2321004:  // infinity
                case 2321005:  // holy shield
                case 2121005:  // elquines
                case 2221005:  // ifrit
                case 2321003:  // bahamut
                case 3121006:  // phoenix
                case 3221005:  // frostprey
                case 3111002:  // puppet
                case 3211002:  // puppet
                case 3111005:  // silver hawk
                case 3211005:  // golden eagle
                case 3001003:  // focus
                case 3101004:  // soul arrow bow
                case 3201004:  // soul arrow crossbow
                case 3121002:  // sharp eyes
                case 3221002:  // sharp eyes
                case 3121008:  // concentrate
                case 3221006:  // blind
                case 4001003:  // dark sight
                case 4101004:  // haste
                case 4201003:  // haste
                case 4111001:  // meso up
                case 4111002:  // shadow partner
                case 4121006:  // shadow stars
                case 4211003:  // pick pocket
                case 4211005:  // meso guard
                case 5111005:  // Transformation (Buccaneer)
                case 5121003:  // Super Transformation (Viper)
                case 5220002:  // wrath of the octopi
                case 5211001:  // Pirate octopus summon
                case 5211002:  // Pirate bird summon
                case 5221006:  // BattleShip
                case 9001000:  // haste
                case 9101001:  // super haste
                case 9101002:  // holy symbol
                case 9101003:  // bless
                case 9101004:  // hide
                case 9101008:  // hyper body
                case 1121011:  // hero's will
                case 1221012:  // hero's will
                case 1321010:  // hero's will
                case 2321009:  // hero's will
                case 2221008:  // hero's will
                case 2121008:  // hero's will
                case 3121009:  // hero's will
                case 3221008:  // hero's will
                case 4121009:  // hero's will
                case 4221008:  // hero's will
                case 2101003:  // slow
                case 2201003:  // slow
                case 2111004:  // seal
                case 2211004:  // seal
                case 1111007:  // armor crash
                case 1211009:  // magic crash
                case 1311007:  // power crash
                case 2311005:  // doom
                case 2121002:  // mana reflection
                case 2221002:  // mana reflection
                case 2321002:  // mana reflection
                case 2311001:  // dispel
                case 1201006:  // threaten
                case 4121004:  // ninja ambush
                case 4221004:  // ninja ambush
                case 21001003:
                case 20001001:
                case 20001002:
                case 20001004:
                case 20001005:

                case 20001010:
                case 20001011:
                case 21101003:
                case 21111001:

                //  case 1100002:
                case 21121000:
                case 21121003:
                case 21120007:
                //case 21110004:
                case 21111005:
                case 9001004:
                    isBuff = true;
                    break;
                }
            }
            var keydown = data.GetChildByPath("keydown");

            if (keydown != null)
            {
                ret.HasCharge = true;
            }
            foreach (var level in data.GetChildByPath("level"))
            {
                var statEffect = MapleStatEffect.LoadSkillEffectFromData(level, id, isBuff, level.Name);
                ret.m_effects.Add(statEffect);
            }
            ret.AnimationTime = 0;
            if (effect != null)
            {
                foreach (var effectEntry in effect)
                {
                    ret.AnimationTime += MapleDataTool.ConvertToInt("delay", effectEntry, 0);
                }
            }
            return(ret);
        }
 public PlayerBuffValueHolder(long startTime, MapleStatEffect effect)
 {
     StartTime = startTime;
     Effect    = effect;
     m_mId     = (int)(Randomizer.NextDouble() * 100);
 }
Exemple #4
0
        private static void CheckHighDamage(MapleCharacter player, MapleMonster monster, AttackInfo attack,
                                            ISkill theSkill, MapleStatEffect attackEffect, int damageToMonster, int maximumDamageToMonster)
        {
            //检查高攻击伤害
            int elementalMaxDamagePerMonster;
            var element = Element.Neutral;

            if (theSkill != null)
            {
                element = theSkill.Element;
                var skillId = theSkill.SkillId;
                if (skillId == 3221007)
                {
                    maximumDamageToMonster = 99999;
                }
                else if (skillId == 4221001)
                {
                    maximumDamageToMonster = 400000;
                }
            }
            if (player.GetBuffedValue(MapleBuffStat.WkCharge) != null)
            {
                var chargeSkillId = player.GetBuffSource(MapleBuffStat.WkCharge);
                switch (chargeSkillId)
                {
                case 1211003:
                case 1211004:
                    element = Element.Fire;
                    break;

                case 1211005:
                case 1211006:
                    element = Element.Ice;
                    break;

                case 1211007:
                case 1211008:
                    element = Element.Lighting;
                    break;

                case 1221003:
                case 1221004:
                    element = Element.Holy;
                    break;
                }
                var chargeSkill = SkillFactory.GetSkill(chargeSkillId);
                maximumDamageToMonster *= (int)(chargeSkill.GetEffect(player.GetSkillLevel(chargeSkill)).Damage / 100.0);
            }
            if (element != Element.Neutral)
            {
                double elementalEffect;
                if (attack.Skill == 3211003 || attack.Skill == 3111003)
                {
                    //烈火箭和寒冰�?
                    elementalEffect = attackEffect.X / 200.0;
                }
                else
                {
                    elementalEffect = 0.5;
                }

                switch (monster.GetEffectiveness(element).Value)
                {
                case 1:     //immue
                    elementalMaxDamagePerMonster = 1;
                    break;

                case 0:     //normal
                    elementalMaxDamagePerMonster = maximumDamageToMonster;
                    break;

                case 3:     //weak
                    elementalMaxDamagePerMonster = (int)(maximumDamageToMonster * (1.0 + elementalEffect));
                    break;

                case 2:     //strong
                    elementalMaxDamagePerMonster = (int)(maximumDamageToMonster * (1.0 - elementalEffect));
                    break;

                default:
                    throw new Exception("Effectiveness不正确");
                }
            }
            else
            {
                elementalMaxDamagePerMonster = maximumDamageToMonster;
            }

            if (damageToMonster > elementalMaxDamagePerMonster)
            {
                player.AntiCheatTracker.RegisterOffense(CheatingOffense.HighDamage); //高伤�?
                if (attack.Skill != 1009 && attack.Skill != 10001009 && attack.Skill != 20001009)
                {
                    // * 3 until implementation of lagsafe pingchecks for buff expiration
                    if (damageToMonster <= elementalMaxDamagePerMonster * 4)
                    {
                        return;
                    }

                    if (player.IsGm || player.Job == MapleJob.Ares && player.Level <= 10)
                    {
                        //log.info("这里不进行操�?");
                    }
                    else
                    {
                        if (player.Level < 70)
                        {
                            AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                     $" {player.Name} 被系统封号 封号原因:伤害异常({damageToMonster}) 当前等级:{player.Level}");
                            //player.ban(player.getName() + " 被系统封�?.(异常攻击伤害�?: " + damageToMonster + " 当前等级 " + player.getLevel() + " ElementalMaxDamage: " + elementalMaxDamagePerMonster * 4 + " (IP: " + player.getClient().getSession().getRemoteAddress().toString().split(":")[0] + ")");
                        }
                    }
                }
                else
                {
                    var maxDamage = (int)Math.Floor(monster.MaxHp * 0.3);
                    if (damageToMonster > 500000)
                    {
                        AutobanManager.Instance.Autoban(player.Client,
                                                        damageToMonster +
                                                        $"伤害异常 等级: {player.Level} 攻击力: {player.Watk} 技能ID: {attack.Skill} 攻击怪物ID: {monster.Id} 造成最大伤害: {maxDamage}");
                    }
                }
            }
        }
Exemple #5
0
        public static AttackInfo ParseDamage(MapleCharacter c, InPacket p, bool ranged)
        {
            var ret = new AttackInfo();

            p.ReadByte();
            p.Skip(8);
            ret.NumAttackedAndDamage = p.ReadByte();
            p.Skip(8);
            ret.NumAttacked = RightMove(ret.NumAttackedAndDamage, 4) & 0xF;
            ret.NumDamage   = ret.NumAttackedAndDamage & 0xF;
            ret.AllDamage   = new List <Tuple <int, List <int> > >();
            ret.Skill       = p.ReadInt();
            p.Skip(8);

            if ((ret.Skill == 2121001) || (ret.Skill == 2221001) || (ret.Skill == 2321001) || (ret.Skill == 5201002) ||
                (ret.Skill == 14111006) || (ret.Skill == 5101004) || (ret.Skill == 15101003))
            {
                ret.Charge = p.ReadInt();
            }
            else
            {
                ret.Charge = 0;
            }

            if (ret.Skill == 1221011)
            {
                ret.IsHh = true;
            }

            p.ReadInt();
            ret.AresCombo = p.ReadByte(); //记录目前的Combo点数
            var sourceid = ret.Skill;     //以下�?能为Combo专用�?�?

            if ((sourceid == 21100004) || (sourceid == 21100005) || (sourceid == 21110003) || (sourceid == 21110004) ||
                (sourceid == 21120006) || (sourceid == 21120007))
            {
                //c.setCombo(1);
            }
            ret.Pos    = p.ReadByte(); //动作
            ret.Stance = p.ReadByte(); //姿势

            if (ret.Skill == 4211006)
            {
                //return parseMesoExplosion(lea, ret);
            }

            if (ranged)
            {
                p.ReadByte();
                ret.Speed = p.ReadByte();
                p.ReadByte();
                ret.Direction = p.ReadByte();
                p.Skip(7);
                if ((ret.Skill == 3121004) || (ret.Skill == 3221001) || (ret.Skill == 5221004) ||
                    (ret.Skill == 13111002))
                {
                    p.Skip(4);
                }
            }
            else
            {
                p.ReadByte();
                ret.Speed = p.ReadByte();
                p.Skip(4);
            }

            for (var i = 0; i < ret.NumAttacked; ++i)
            {
                var oid = p.ReadInt();

                p.Skip(14);

                var allDamageNumbers = new List <int>();
                for (var j = 0; j < ret.NumDamage; ++j)
                {
                    var damage = p.ReadInt();

                    MapleStatEffect effect = null;
                    if (ret.Skill != 0)
                    {
                        effect =
                            SkillFactory.GetSkill(ret.Skill)
                            .GetEffect(c.GetSkillLevel(SkillFactory.GetSkill(ret.Skill)));
                    }

                    if ((damage != 0) && (effect != null) && (effect.GetFixedDamage() != 0))
                    {
                        damage = effect.GetFixedDamage();
                    }

                    allDamageNumbers.Add(damage);
                }
                if (ret.Skill != 5221004)
                {
                    p.Skip(4);
                }

                ret.AllDamage.Add(Tuple.Create(oid, allDamageNumbers));
            }

            return(ret);
        }
Exemple #6
0
        public static void ApplyAttack(AttackInfo attack, MapleCharacter player, int maxDamagePerMonster,
                                       int attackCount)
        {
            //应用攻击
            player.AntiCheatTracker.ResetHpRegen();
            //player.resetAfkTimer();
            player.AntiCheatTracker.CheckAttack(attack.Skill);

            ISkill          theSkill     = null;
            MapleStatEffect attackEffect = null;

            if (attack.Skill != 0)
            {
                theSkill     = SkillFactory.GetSkill(attack.Skill);
                attackEffect = attack.GetAttackEffect(player, theSkill);
                if (attackEffect == null)
                {
                    AutobanManager.Instance.Autoban(player.Client, $"使用了没有的技能ID:{attack.Skill}");
                }
                else if (attack.Skill != 2301002)
                {
                    if (player.IsAlive)
                    {
                        attackEffect.ApplyTo(player);
                    }
                    else
                    {
                        player.Client.Send(PacketCreator.EnableActions());
                    }
                }
            }

            if (!player.IsAlive)
            {
                player.AntiCheatTracker.RegisterOffense(CheatingOffense.AttackingWhileDead);
                return;
            }

            if (attackCount != attack.NumDamage && attack.Skill != 4211006 && attack.NumDamage != attackCount * 2)
            {
                player.AntiCheatTracker.RegisterOffense(CheatingOffense.MismatchingBulletcount,
                                                        attack.NumDamage + "/" + attackCount);
                return;
            }

            var totDamage = 0;
            var map       = player.Map;

            if (attack.Skill == 4211006)
            {
                // meso explosion
                long delay = 0;
                foreach (var oned in attack.AllDamage)
                {
                    var mapobject = map.Mapobjects[oned.Item1];
                    if (mapobject != null && mapobject.GetType() == MapleMapObjectType.Item)
                    {
                        var mapitem = (MapleMapItem)mapobject;
                        if (mapitem.Meso > 0)
                        {
                            lock (mapitem)
                            {
                                if (mapitem.IsPickedUp)
                                {
                                    return;
                                }
                                TimerManager.Instance.RunOnceTask(() =>
                                {
                                    map.RemoveMapObject(mapitem);
                                    map.BroadcastMessage(PacketCreator.RemoveItemFromMap(mapitem.ObjectId, 4, 0),
                                                         mapitem.Position);
                                    mapitem.IsPickedUp = true;
                                }, delay);
                                delay += 100;
                            }
                        }
                        else if (mapitem.Meso == 0)
                        {
                            player.AntiCheatTracker.RegisterOffense(CheatingOffense.EtcExplosion);
                            return;
                        }
                    }
                    else if (mapobject != null && mapobject.GetType() != MapleMapObjectType.Monster)
                    {
                        player.AntiCheatTracker.RegisterOffense(CheatingOffense.ExplodingNonexistant);
                        return; // etc explosion, exploding nonexistant things, etc.
                    }
                }
            }

            foreach (var oned in attack.AllDamage)
            {
                var monster = map.GetMonsterByOid(oned.Item1);

                if (monster != null)
                {
                    var totDamageToOneMonster = 0;
                    foreach (var eachd in oned.Item2)
                    {
                        totDamageToOneMonster += eachd;
                    }
                    totDamage += totDamageToOneMonster;


                    player.CheckMonsterAggro(monster);
                    if (totDamageToOneMonster > attack.NumDamage + 1)
                    {
                        var dmgCheck = player.AntiCheatTracker.CheckDamage(totDamageToOneMonster);
                        if (dmgCheck > 5 && totDamageToOneMonster < 99999 && monster.Id < 9500317 &&
                            monster.Id > 9500319)
                        {
                            player.AntiCheatTracker
                            .RegisterOffense(CheatingOffense.SameDamage,
                                             dmgCheck + " times: " + totDamageToOneMonster);
                        }
                    }
                    // �?测单次攻击�?�,这里不会�?!
                    if (player.IsGm || player.Job == MapleJob.Ares && player.Level <= 10)
                    {
                        //log.info("这里不进行操�?");
                    }
                    else
                    {
                        if (player.Level < 10)
                        {
                            if (totDamageToOneMonster > 10000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                        if (player.Level < 20)
                        {
                            if (totDamageToOneMonster > 20000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                        if (player.Level < 30)
                        {
                            if (totDamageToOneMonster > 30000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                        if (player.Level < 50)
                        {
                            if (totDamageToOneMonster > 50000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                        if (player.Level < 70)
                        {
                            if (totDamageToOneMonster > 150000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                        if (player.Level < 150)
                        {
                            if (totDamageToOneMonster > 350000)
                            {
                                AutobanManager.Instance.BroadcastMessage(player.Client,
                                                                         player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " +
                                                                         player.Level + ")");
                                //player.ban(player.Name + " 被系统封�?.(异常攻击伤害�?: " + totDamageToOneMonster + " 当前等级 " + player.Level + " (IP: " + player.Client.getSession().getRemoteAddress().toString().split(":")[0] + ")");
                                return;
                            }
                        }
                    }

                    CheckHighDamage(player, monster, attack, theSkill, attackEffect, totDamageToOneMonster,
                                    maxDamagePerMonster);
                    var distance = player.Position.DistanceSquare(monster.Position);
                    if (distance > 400000.0)
                    {
                        // 600^2, 550 is approximatly the range of ultis
                        player.AntiCheatTracker.RegisterOffense(CheatingOffense.AttackFarawayMonster,
                                                                Math.Sqrt(distance).ToString(CultureInfo.InvariantCulture));
                    } //遥远的�?�物袭击

                    if (attack.Skill == 5111004)
                    {
                        // 能量转换
                        var edrain = SkillFactory.GetSkill(5111004);
                        var gainhp = (int)
                                     (totDamage * (double)edrain.GetEffect(player.GetSkillLevel(edrain)).X / 100.0);
                        gainhp     = Math.Min(monster.MaxHp, Math.Min(gainhp, player.MaxHp / 2));
                        player.Hp += (short)gainhp;
                    }
                    else if (attack.Skill == 15100004)
                    {
                        //光�?�拳
                        var edrain = SkillFactory.GetSkill(15100004);
                        var gainhp = (int)
                                     (totDamage * (double)edrain.GetEffect(player.GetSkillLevel(edrain)).X / 100.0);
                        gainhp     = Math.Min(monster.MaxHp, Math.Min(gainhp, player.MaxHp / 2));
                        player.Hp += (short)gainhp;
                    }

                    if (!monster.ControllerHasAggro)
                    {
                        if (monster.GetController() == player)
                        {
                            monster.ControllerHasAggro = true;
                        }
                        else
                        {
                            monster.SwitchController(player, true);
                        }
                    }
                    if (attack.Skill == 2301002 && !monster.Stats.IsUndead)
                    {
                        player.AntiCheatTracker.RegisterOffense(CheatingOffense.HealAttackingUndead); //医治攻击亡灵
                        return;
                    }
                    // Pickpocket
                    if ((attack.Skill == 4001334 || attack.Skill == 4201005 || attack.Skill == 0 ||
                         attack.Skill == 4211002 || attack.Skill == 4211004) &&
                        player.GetBuffedValue(MapleBuffStat.Pickpocket) != null)
                    {
                        HandlePickPocket(player, monster, oned);
                    }
                    if (attack.Skill == 21100005)
                    {
                        // 生命吸收21100005
                        var drain  = SkillFactory.GetSkill(21100005);
                        var gainhp =
                            (int)
                            (totDamageToOneMonster *
                             (double)drain.GetEffect(player.GetSkillLevel(drain)).X / 100.0);
                        gainhp     = Math.Min(monster.MaxHp, Math.Min(gainhp, player.MaxHp / 2));
                        player.Hp += (short)gainhp;
                    }
                    if (attack.Skill == 4101005)
                    {
                        // 生命吸收21100005
                        var drain  = SkillFactory.GetSkill(4101005);
                        var gainhp =
                            (int)
                            (totDamageToOneMonster *
                             (double)drain.GetEffect(player.GetSkillLevel(drain)).X / 100.0);
                        gainhp     = Math.Min(monster.MaxHp, Math.Min(gainhp, player.MaxHp / 2));
                        player.Hp += (short)gainhp;
                    }
                    if (attack.Skill == 14101006)
                    {
                        // 吸血
                        var drain  = SkillFactory.GetSkill(14101006);
                        var gainhp =
                            (int)
                            (totDamageToOneMonster *
                             (double)drain.GetEffect(player.GetSkillLevel(drain)).X / 100.0);
                        gainhp     = Math.Min(monster.MaxHp, Math.Min(gainhp, player.MaxHp / 2));
                        player.Hp += (short)gainhp;
                    }
                    if (player.GetBuffedValue(MapleBuffStat.Hamstring) != null)
                    {
                        var hamstring = SkillFactory.GetSkill(3121007); //降低速度的击�?�?
                        if (hamstring.GetEffect(player.GetSkillLevel(hamstring)).MakeChanceResult())
                        {
                            var monsterStatusEffect =
                                new MonsterStatusEffect(
                                    new Dictionary <MonsterStatus, int>
                            {
                                {
                                    MonsterStatus.Speed,
                                    hamstring.GetEffect(player.GetSkillLevel(hamstring)).X
                                }
                            }, hamstring, false);
                            monster.ApplyStatus(player, monsterStatusEffect, false,
                                                hamstring.GetEffect(player.GetSkillLevel(hamstring)).Y *1000);
                        }
                    }

                    if (player.GetBuffedValue(MapleBuffStat.Blind) != null)
                    {
                        //刺眼�?
                        var blind = SkillFactory.GetSkill(3221006);
                        if (blind.GetEffect(player.GetSkillLevel(blind)).MakeChanceResult())
                        {
                            var monsterStatusEffect =
                                new MonsterStatusEffect(
                                    new Dictionary <MonsterStatus, int>
                            {
                                {
                                    MonsterStatus.Acc,
                                    blind.GetEffect(player.GetSkillLevel(blind)).X
                                }
                            }
                                    , blind, false);
                            monster.ApplyStatus(player, monsterStatusEffect, false,
                                                blind.GetEffect(player.GetSkillLevel(blind)).Y *1000);
                        }
                    }

                    if (player.Job == MapleJob.Whiteknight)
                    {
                        int[] charges = { 1211005, 1211006 }; //寒冰钝器
                        foreach (var charge in charges)
                        {
                            var chargeSkill = SkillFactory.GetSkill(charge);

                            if (player.IsBuffFrom(MapleBuffStat.WkCharge, chargeSkill))
                            {
                                var iceEffectiveness = monster.GetEffectiveness(Element.Ice);
                                if (totDamageToOneMonster > 0 && iceEffectiveness == ElementalEffectiveness.Normal ||
                                    iceEffectiveness == ElementalEffectiveness.Weak)
                                {
                                    var chargeEffect =
                                        chargeSkill.GetEffect(player.GetSkillLevel(chargeSkill));
                                    var monsterStatusEffect =
                                        new MonsterStatusEffect(
                                            new Dictionary <MonsterStatus, int> {
                                        { MonsterStatus.Freeze, 1 }
                                    },
                                            chargeSkill, false);
                                    monster.ApplyStatus(player, monsterStatusEffect, false, chargeEffect.Y * 2000);
                                }
                                break;
                            }
                        }
                    }
                    var venomNl = SkillFactory.GetSkill(4120005); //武器用毒�?
                    if (player.GetSkillLevel(venomNl) <= 0)
                    {
                        venomNl = SkillFactory.GetSkill(14110004); //武器用毒�?
                    }
                    var venomShadower = SkillFactory.GetSkill(4220005);
                    if (player.GetSkillLevel(venomNl) > 0)
                    {
                        var venomEffect = venomNl.GetEffect(player.GetSkillLevel(venomNl));
                        for (var i = 0; i < attackCount; i++)
                        {
                            if (venomEffect.MakeChanceResult())
                            {
                                if (monster.VenomMultiplier < 3)
                                {
                                    monster.VenomMultiplier += 1;
                                    var monsterStatusEffect =
                                        new MonsterStatusEffect(
                                            new Dictionary <MonsterStatus, int> {
                                        { MonsterStatus.Poison, 1 }
                                    },
                                            venomNl, false);
                                    monster.ApplyStatus(player, monsterStatusEffect, false, venomEffect.Duration,
                                                        true);
                                }
                            }
                        }
                    }
                    else if (player.GetSkillLevel(venomShadower) > 0)
                    {
                        var venomEffect = venomShadower.GetEffect(player.GetSkillLevel(venomShadower));
                        for (var i = 0; i < attackCount; i++)
                        {
                            if (venomEffect.MakeChanceResult())
                            {
                                if (monster.VenomMultiplier < 3)
                                {
                                    monster.VenomMultiplier += 1;
                                    var monsterStatusEffect =
                                        new MonsterStatusEffect(
                                            new Dictionary <MonsterStatus, int> {
                                        { MonsterStatus.Poison, 1 }
                                    },
                                            venomShadower, false);
                                    monster.ApplyStatus(player, monsterStatusEffect, false, venomEffect.Duration,
                                                        true);
                                }
                            }
                        }
                    }
                    if (totDamageToOneMonster > 0 && attackEffect != null && attackEffect.MonsterStatus.Any())
                    {
                        if (attackEffect.MakeChanceResult())
                        {
                            var monsterStatusEffect =
                                new MonsterStatusEffect(attackEffect.MonsterStatus, theSkill, false);
                            monster.ApplyStatus(player, monsterStatusEffect, attackEffect.IsPoison(),
                                                attackEffect.Duration);
                        }
                    }
                    if (attack.IsHh && !monster.IsBoss)
                    {
                        map.DamageMonster(player, monster, monster.Hp - 1);
                    }
                    else if (attack.IsHh && monster.IsBoss)
                    {
                        var weaponItem = player.Inventorys[MapleInventoryType.Equipped.Value].Inventory[0xF5]; //装备
                        MapleItemInformationProvider.Instance.GetWeaponType(weaponItem.ItemId);
                    }
                    else
                    {
                        map.DamageMonster(player, monster, totDamageToOneMonster);
                    }
                }
            }
            if (totDamage > 1)
            {
                player.AntiCheatTracker.SetAttacksWithoutHit(player.AntiCheatTracker.GetAttacksWithoutHit() + 1);
                int offenseLimit;
                if (attack.Skill != 3121004)
                {
                    //暴风箭雨
                    offenseLimit = 100;
                }
                else
                {
                    offenseLimit = 300;
                }
                if (player.AntiCheatTracker.GetAttacksWithoutHit() > offenseLimit)
                {
                    player.AntiCheatTracker
                    .RegisterOffense(CheatingOffense.AttackWithoutGettingHit,
                                     player.AntiCheatTracker.GetAttacksWithoutHit().ToString());
                }
                //没有受到撞击攻击
                //if (player.hasEnergyCharge())
                //{
                //    player.increaseEnergyCharge(attack.numAttacked);
                //}
            }
        }