/// <summary> /// Handles the line skills. /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="targets">The targets. [not set yet]</param> /// <param name="interaction">The interaction packet.</param> /// <param name="usespell">The usespell packet.</param> /// <param name="spell">The spell.</param> /// <param name="damage">The damage.</param> /// <returns>Returns true if the skill was used successfully.</returns> public static bool Handle(Entities.IEntity attacker, ConcurrentBag<Entities.IEntity> targets, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage) { damage = 0; bool self = (interaction.TargetUID == attacker.EntityUID); if (self) return false; Calculations.InLineAlgorithm ila = new ProjectX_V3_Game.Calculations.InLineAlgorithm( attacker.X, interaction.X, attacker.Y, interaction.Y, (byte)spell.Range, Calculations.InLineAlgorithm.Algorithm.DDA); byte count = 0; bool bluename = false; foreach (Maps.IMapObject obj in attacker.Screen.MapObjects.Values) { if (count > 28) return true; if(!(obj as Entities.IEntity).Alive) continue; if (obj is Entities.NPC) continue; if (obj.EntityUID == attacker.EntityUID) continue; if (obj is Entities.BossMonster) { if (!(obj as Entities.BossMonster).CanBeAttacked) continue; } if (obj is Entities.Monster) { if (((byte)(obj as Entities.Monster).Behaviour) >= 3) continue; } if (obj is Entities.GameClient) { if (!(obj as Entities.GameClient).LoggedIn) continue; if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly)) continue; if (obj.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient)) continue; if (!(DateTime.Now >= (obj as Entities.GameClient).LoginProtection.AddSeconds(10))) { continue; } if (!(DateTime.Now >= (obj as Entities.GameClient).ReviveProtection.AddSeconds(5))) { continue; } if (!Combat.FixTarget(attacker, (obj as Entities.GameClient))) continue; if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.BlueName)) bluename = true; } if (!ila.InLine(obj.X, obj.Y)) continue; Entities.IEntity targetentity = obj as Entities.IEntity; damage = Calculations.Battle.GetPhysicalDamage(attacker, targetentity); Combat.ProcessDamage(attacker, targetentity, ref damage, false); if (damage > 0) { if (!(targetentity is Entities.GameClient)) { uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage); if (targetentity.Level > (attacker.Level + 10)) exp *= 2; if ((attacker is Entities.GameClient)) (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp); } usespell.AddTarget(targetentity.EntityUID, damage); targets.Add(targetentity); } count++; } if (attacker is Entities.GameClient && bluename) (attacker as Entities.GameClient).AddStatusEffect1(Enums.Effect1.BlueName, 10000); return true; }
/// <summary> /// Handles the line skills. /// </summary> /// <param name="attacker">The attacker.</param> /// <param name="targets">The targets. [not set yet]</param> /// <param name="interaction">The interaction packet.</param> /// <param name="usespell">The usespell packet.</param> /// <param name="spell">The spell.</param> /// <param name="damage">The damage.</param> /// <returns>Returns true if the skill was used successfully.</returns> public static bool Handle(Entities.IEntity attacker, ConcurrentBag <Entities.IEntity> targets, InteractionPacket interaction, UseSpellPacket usespell, Data.Spell spell, out uint damage) { damage = 0; bool self = (interaction.TargetUID == attacker.EntityUID); if (self) { return(false); } Calculations.InLineAlgorithm ila = new ProjectX_V3_Game.Calculations.InLineAlgorithm( attacker.X, interaction.X, attacker.Y, interaction.Y, (byte)spell.Range, Calculations.InLineAlgorithm.Algorithm.DDA); byte count = 0; bool bluename = false; foreach (Maps.IMapObject obj in attacker.Screen.MapObjects.Values) { if (count > 28) { return(true); } if (!(obj as Entities.IEntity).Alive) { continue; } if (obj is Entities.NPC) { continue; } if (obj.EntityUID == attacker.EntityUID) { continue; } if (obj is Entities.BossMonster) { if (!(obj as Entities.BossMonster).CanBeAttacked) { continue; } } if (obj is Entities.Monster) { if (((byte)(obj as Entities.Monster).Behaviour) >= 3) { continue; } } if (obj is Entities.GameClient) { if (!(obj as Entities.GameClient).LoggedIn) { continue; } if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.Fly)) { continue; } if (obj.Map.MapType == Enums.MapType.NoPK && (attacker is Entities.GameClient)) { continue; } if (!(DateTime.Now >= (obj as Entities.GameClient).LoginProtection.AddSeconds(10))) { continue; } if (!(DateTime.Now >= (obj as Entities.GameClient).ReviveProtection.AddSeconds(5))) { continue; } if (!Combat.FixTarget(attacker, (obj as Entities.GameClient))) { continue; } if ((obj as Entities.GameClient).ContainsFlag1(Enums.Effect1.BlueName)) { bluename = true; } } if (!ila.InLine(obj.X, obj.Y)) { continue; } Entities.IEntity targetentity = obj as Entities.IEntity; damage = Calculations.Battle.GetPhysicalDamage(attacker, targetentity); Combat.ProcessDamage(attacker, targetentity, ref damage, false); if (damage > 0) { if (!(targetentity is Entities.GameClient)) { uint exp = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(damage / 2), (int)damage); if (targetentity.Level > (attacker.Level + 10)) { exp *= 2; } if ((attacker is Entities.GameClient)) { (attacker as Entities.GameClient).AddSpellExp(spell.SpellID, exp); } } usespell.AddTarget(targetentity.EntityUID, damage); targets.Add(targetentity); } count++; } if (attacker is Entities.GameClient && bluename) { (attacker as Entities.GameClient).AddStatusEffect1(Enums.Effect1.BlueName, 10000); } return(true); }