Code:
public static void NoTargetMagic(ClientSocket CSocket, int MagicID, int X, int Y)
{
if (CSocket.Client.Skills.ContainsKey(MagicID))
{
Struct.CharSkill Skill = CSocket.Client.Skills[MagicID];
if ((int)CSocket.Client.Map != 1039)
{
bool OK = Calculation.MagicCost(Skill.ID, Skill.Level, CSocket);
if (!OK)
{
if (CSocket.Client.Attack != null)
{
if (CSocket.Client.Attack.Enabled)
{
CSocket.Client.Attack.Stop();
CSocket.Client.Attack.Dispose();
}
}
return;
}
}
else
{
if (CSocket.Client.Attack != null)
{
if (!CSocket.Client.Attack.Enabled)
{
CSocket.Client.Attack = new System.Timers.Timer();
CSocket.Client.Attack.Interval = 900;
CSocket.Client.Attack.Elapsed += delegate { Attack(0, MagicID, 21, X, Y, CSocket); };
CSocket.Client.Attack.Start();
}
}
else
{
CSocket.Client.Attack = new System.Timers.Timer();
CSocket.Client.Attack.Interval = 900;
CSocket.Client.Attack.Elapsed += delegate { Attack(0, MagicID, 21, X, Y, CSocket); };
CSocket.Client.Attack.Start();
}
}
switch (MagicID)
{
#region Scatter
case 8001://Scatter
{
Dictionary<int, Monster> ToDo = new Dictionary<int, Monster>();
Dictionary<int, int> Targets = new Dictionary<int, int>();
try
{
Monitor.Enter(Nano.Monsters);
foreach (KeyValuePair<int, Monster> Mob in Nano.Monsters)
{
if ((int)CSocket.Client.Map == Mob.Value.Map)
{
if (Calculation.InRange(Mob.Value.X, Mob.Value.Y, CSocket.Client.X, CSocket.Client.Y, 12))
{
if (Mob.Value.Info.Name == "Guard" || Mob.Value.Info.Name == "Patrol" || Mob.Value.Info.Name == "GuardReviver")
{
if (CSocket.Client.PKMode == Struct.PkType.PK)
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
else
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.Monsters);
}
try
{
Monitor.Enter(Nano.ClientPool);
foreach (KeyValuePair<int, ClientSocket> Clients in Nano.ClientPool)
{
ClientSocket ASocket = Clients.Value;
if ((int)CSocket.Client.Map == (int)ASocket.Client.Map && CSocket.Client.ID != ASocket.Client.ID)
{
if (Calculation.InRange(ASocket.Client.X, ASocket.Client.Y, CSocket.Client.X, CSocket.Client.Y, 12) && !ASocket.Client.Dead)
{
if (CheckMode(CSocket, ASocket)&&!ASocket.Client.Flying)
{
int Damage = Calculation.Damage(CSocket.Client, ASocket.Client, 25, 0, 0);
Calculation.doPlayer(CSocket, ASocket, Damage, 21);
if (!Targets.ContainsKey(ASocket.Client.ID))
{
Targets.Add(ASocket.Client.ID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 15));
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.ClientPool);
}
foreach (KeyValuePair<int, Struct.TerrainNPC> TNPCS in Nano.TerrainNpcs)
{
Struct.TerrainNPC Tnpc = TNPCS.Value;
if ((int)CSocket.Client.Map == Tnpc.Map)
{
if (Calculation.InRange(Tnpc.X, Tnpc.Y, CSocket.Client.X, CSocket.Client.Y, 12))
{
int Damage = 0;
if (CSocket.Client.MinAttack < CSocket.Client.MaxAttack)
Damage = Nano.Rand.Next(CSocket.Client.MinAttack, CSocket.Client.MaxAttack);
Calculation.doTNpc(CSocket, Tnpc, Damage, 21);
if (!Targets.ContainsKey(Tnpc.UID))
{
Targets.Add(Tnpc.UID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 25));
}
}
}
}
//TODO: GW, TG
foreach (KeyValuePair<int, Monster> Mob in ToDo)
{
int Damage = Calculation.Damage(CSocket.Client, Mob.Value, 25, 0, 0);
Calculation.doMonster(Mob.Value, Damage, 21, CSocket);
if (!Targets.ContainsKey(Mob.Value.UID))
{
if (Mob.Value.CurrentHP > 0)
{
Targets.Add(Mob.Key, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 12));
}
}
}
ToDo.Clear();
ConquerPacket.ToLocal(ConquerPacket.MagicAttack(CSocket.Client.ID, Skill.ID, Skill.Level, Targets, CSocket.Client.X, CSocket.Client.Y), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0);
Targets.Clear();
break;
}
#endregion Scatter
#region Fast Blade
case 1045:
{
int Distance = 0;
if (Skill.Level == 0)
Distance = 3;
if (Skill.Level == 1)
Distance = 5;
if (Skill.Level == 2)
Distance = 6;
if (Skill.Level == 3)
Distance = 7;
if (Skill.Level == 4)
Distance = 8;
int[][] FB = fbCoords(CSocket.Client.X, CSocket.Client.Y, X, Y, Distance);
Dictionary<int, int> Targets = new Dictionary<int, int>();
foreach (int[] HitCoords in FB)
{
int HitX = HitCoords[0];
int HitY = HitCoords[1];
try
{
Monitor.Enter(Nano.ClientPool);
foreach (KeyValuePair<int, ClientSocket> Clients in Nano.ClientPool)
{
ClientSocket ASocket = Clients.Value;
if ((int)CSocket.Client.Map == (int)ASocket.Client.Map && CSocket.Client.ID != ASocket.Client.ID)
{
if (Calculation.InRange(ASocket.Client.X, ASocket.Client.Y, CSocket.Client.X, CSocket.Client.Y, Distance) && !ASocket.Client.Dead)
{
if (ASocket.Client.X == HitX && ASocket.Client.Y == HitY && !Targets.ContainsKey(ASocket.Client.ID))
{
if (CheckMode(CSocket, ASocket) && !ASocket.Client.Flying)
{
int Damage = Calculation.Damage(CSocket.Client, ASocket.Client, 2, 0, 0);
Calculation.doPlayer(CSocket, ASocket, Damage, 21);
Targets.Add(ASocket.Client.ID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 15));
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.ClientPool);
}
Dictionary<int, Monster> ToDo = new Dictionary<int, Monster>();
try
{
Monitor.Enter(Nano.Monsters);
foreach (KeyValuePair<int, Monster> Mob in Nano.Monsters)
{
if ((int)CSocket.Client.Map == Mob.Value.Map)
{
if (Calculation.InRange(Mob.Value.X, Mob.Value.Y, CSocket.Client.X, CSocket.Client.Y, Distance))
{
if (Mob.Value.X == HitX && Mob.Value.Y == HitY && !Targets.ContainsKey(Mob.Value.UID))
{
if (Mob.Value.Info.Name == "Guard" || Mob.Value.Info.Name == "Patrol" || Mob.Value.Info.Name == "GuardReviver")
{
if (CSocket.Client.PKMode == Struct.PkType.PK)
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
else
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.Monsters);
}
foreach (KeyValuePair<int, Struct.TerrainNPC> TNPCS in Nano.TerrainNpcs)
{
Struct.TerrainNPC Tnpc = TNPCS.Value;
if ((int)CSocket.Client.Map == Tnpc.Map)
{
if (Calculation.InRange(Tnpc.X, Tnpc.Y, CSocket.Client.X, CSocket.Client.Y, 12))
{
if (HitX == Tnpc.X && HitY == Tnpc.Y)
{
int Damage = 0;
if (CSocket.Client.MinAttack < CSocket.Client.MaxAttack)
Damage = Nano.Rand.Next(CSocket.Client.MinAttack, CSocket.Client.MaxAttack);
Calculation.doTNpc(CSocket, Tnpc, Damage, 21);
if (!Targets.ContainsKey(Tnpc.UID))
{
Targets.Add(Tnpc.UID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 25));
}
}
}
}
}
if (ToDo.Count > 0)
{
foreach (KeyValuePair<int, Monster> Mob in ToDo)
{
int Damage = Calculation.Damage(CSocket.Client, Mob.Value, 2, 0, 0);
Calculation.doMonster(Mob.Value, Damage, 21, CSocket);
if (!Targets.ContainsKey(Mob.Value.UID))
{
Targets.Add(Mob.Key, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 12));
}
}
}
ToDo.Clear();
}
ConquerPacket.ToLocal(ConquerPacket.MagicAttack(CSocket.Client.ID, Skill.ID, Skill.Level, Targets, X, Y), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0);
Targets.Clear();
break;
}
#endregion Fast Blade
#region SaintSword
case 1046:
{
int Distance = 0;
if (Skill.Level == 0)
Distance = 3;
if (Skill.Level == 1)
Distance = 5;
if (Skill.Level == 2)
Distance = 6;
if (Skill.Level == 3)
Distance = 7;
if (Skill.Level == 4)
Distance = 8;
int[][] FB = fbCoords(CSocket.Client.X, CSocket.Client.Y, X, Y, Distance);
Dictionary<int, int> Targets = new Dictionary<int, int>();
foreach (int[] HitCoords in FB)
{
int HitX = HitCoords[0];
int HitY = HitCoords[1];
try
{
Monitor.Enter(Nano.ClientPool);
foreach (KeyValuePair<int, ClientSocket> Clients in Nano.ClientPool)
{
ClientSocket ASocket = Clients.Value;
if ((int)CSocket.Client.Map == (int)ASocket.Client.Map)
{
if (Calculation.InRange(ASocket.Client.X, ASocket.Client.Y, CSocket.Client.X, CSocket.Client.Y, Distance) && !ASocket.Client.Dead)
{
if (ASocket.Client.X == HitX && ASocket.Client.Y == HitY && !Targets.ContainsKey(ASocket.Client.ID))
{
if (CheckMode(CSocket, ASocket) && !ASocket.Client.Flying)
{
int Damage = Calculation.Damage(CSocket.Client, ASocket.Client, 2, 0, 0);
Calculation.doPlayer(CSocket, ASocket, Damage, 21);
Targets.Add(ASocket.Client.ID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 15));
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.ClientPool);
}
Dictionary<int, Monster> ToDo = new Dictionary<int, Monster>();
try
{
Monitor.Enter(Nano.Monsters);
foreach (KeyValuePair<int, Monster> Mob in Nano.Monsters)
{
if ((int)CSocket.Client.Map == Mob.Value.Map)
{
if (Calculation.InRange(Mob.Value.X, Mob.Value.Y, CSocket.Client.X, CSocket.Client.Y, Distance))
{
if (Mob.Value.X == HitX && Mob.Value.Y == HitY && !Targets.ContainsKey(Mob.Value.UID))
{
if (Mob.Value.Info.Name == "Guard" || Mob.Value.Info.Name == "Patrol" || Mob.Value.Info.Name == "GuardReviver")
{
if (CSocket.Client.PKMode == Struct.PkType.PK)
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
else
{
if (!ToDo.ContainsKey(Mob.Value.UID))
ToDo.Add(Mob.Key, Mob.Value);
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Monitor.Exit(Nano.Monsters);
}
foreach (KeyValuePair<int, Struct.TerrainNPC> TNPCS in Nano.TerrainNpcs)
{
Struct.TerrainNPC Tnpc = TNPCS.Value;
if ((int)CSocket.Client.Map == Tnpc.Map)
{
if (Calculation.InRange(Tnpc.X, Tnpc.Y, CSocket.Client.X, CSocket.Client.Y, 12))
{
if (HitX == Tnpc.X && HitY == Tnpc.Y)
{
int Damage = 0;
if (CSocket.Client.MinAttack < CSocket.Client.MaxAttack)
Damage = Nano.Rand.Next(CSocket.Client.MinAttack, CSocket.Client.MaxAttack);
Calculation.doTNpc(CSocket, Tnpc, Damage, 21);
if (!Targets.ContainsKey(Tnpc.UID))
{
Targets.Add(Tnpc.UID, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 25));
}
}
}
}
}
if (ToDo.Count > 0)
{
foreach (KeyValuePair<int, Monster> Mob in ToDo)
{
int Damage = Calculation.Damage(CSocket.Client, Mob.Value, 2, 0, 0);
Calculation.doMonster(Mob.Value, Damage, 21, CSocket);
if (!Targets.ContainsKey(Mob.Value.UID))
{
Targets.Add(Mob.Key, Damage);
Calculation.SkillExp(Skill.ID, CSocket, (int)(Damage / 12));
}
}
}
ToDo.Clear();
}
ConquerPacket.ToLocal(ConquerPacket.MagicAttack(CSocket.Client.ID, Skill.ID, Skill.Level, Targets, X, Y), CSocket.Client.X, CSocket.Client.Y, (int)CSocket.Client.Map, 0, 0);
Targets.Clear();
break;
}
#endregion
}
}
}