public MapleStatEffect GetEffect(int level) { MapleStatEffect ret = null; if (m_effects.Count > level - 1) { ret = m_effects[level - 1]; } return(ret); }
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); }
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}"); } } } }
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); }
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); //} } }