void SkillBuffCasting(List<int> list)
{
try
{
Character.Action.Buff.Casting = true;
// add buff's special attributes (example: harmony terapy spawn packet etc)
HandleSpecialBuff(Character.Action.UsingSkillID);
Send(list, Packet.SkillPacket(0, Character.Action.CastingSkill));
// every skill is handled as surround range radius
if (Data.SkillBase[Character.Action.UsingSkillID].RadiusType == Global.s_data.RadiusTypes.ONETARGET || Data.SkillBase[Character.Action.UsingSkillID].SkillType == Global.s_data.SkillTypes.IMBUE)
{
this.SpecialBuff(Character.Action.UsingSkillID);
}
else if (Data.SkillBase[Character.Action.UsingSkillID].RadiusType != Global.s_data.RadiusTypes.ONETARGET && Data.SkillBase[Character.Action.UsingSkillID].efrUnk1 != 3) // i use it as efr not handled here :) (example: harmony)
{
byte currentSimult = 0;
lock (Systems.clients)
{
for (int i = 0; i <= Systems.clients.Count - 1; i++)
{
try
{
Systems s = Systems.clients[i];
//double distance = Formule.gamedistance((float)this.Character.Position.x, (float)this.Character.Position.y, s.Character.Position.x, s.Character.Position.y);
double distance = Formule.gamedistance(this.Character.Position, s.Character.Position);
if (distance <= Data.SkillBase[Character.Action.UsingSkillID].Distance / 10)
{
if (Data.SkillBase[Character.Action.UsingSkillID].SimultAttack == 0 || currentSimult < Data.SkillBase[Character.Action.UsingSkillID].SimultAttack)
{
// todo: here handle inv and steal detect // only add "buff" to char on pvp state (dttp)
s.SpecialBuff(Character.Action.UsingSkillID);
currentSimult++;
}
else break;
}
}
catch (Exception ex)
{
//Console.WriteLine("SkillBuffCast Error on index {1}/{2}: {0}", ex, i, Systems.clients.Count);
Systems.Debugger.Write(ex);
}
}
}
}
if (Data.SkillBase[Character.Action.UsingSkillID].SkillType == Global.s_data.SkillTypes.IMBUE ||
(Data.SkillBase[Character.Action.UsingSkillID].Properties1.ContainsKey("dura") &&
(Data.SkillBase[Character.Action.UsingSkillID].RadiusType == Global.s_data.RadiusTypes.ONETARGET || (Data.SkillBase[Character.Action.UsingSkillID].RadiusType != Global.s_data.RadiusTypes.ONETARGET && Data.SkillBase[Character.Action.UsingSkillID].efrUnk1 != 3))))
{
//Skills with duration and self targeted
Send(list, Packet.SkillIconPacket(Character.Information.UniqueID, Character.Action.UsingSkillID, Character.Action.Buff.OverID[Character.Action.Buff.slot],false));
client.Send(Packet.PlayerStat(Character));
UpdateMp();
client.Send(Packet.ActionState(2, 0));
StartBuffTimer(Data.SkillBase[Character.Action.UsingSkillID].Properties1["dura"], Character.Action.Buff.slot);
}
else if (Data.SkillBase[Character.Action.UsingSkillID].Properties1.ContainsKey("onff"))
{
//area buffs / mana consumer - time buffs
Send(list, Packet.SkillIconPacket(Character.Information.UniqueID, Character.Action.UsingSkillID, Character.Action.Buff.OverID[Character.Action.Buff.slot], false));
client.Send(Packet.PlayerStat(Character));
UpdateMp();
client.Send(Packet.ActionState(2, 0));
string series = Data.SkillBase[Character.Action.UsingSkillID].Series.Remove(Data.SkillBase[Character.Action.UsingSkillID].Series.Length - 2);
Character.Action.Buff.InfiniteBuffs.Add(series, Character.Action.Buff.slot);
}
else if ( !Data.SkillBase[Character.Action.UsingSkillID].Properties1.ContainsKey("dura") )
{
// fast buffs
Send(list, Packet.SkillIconPacket(Character.Information.UniqueID, Character.Action.UsingSkillID, Character.Action.Buff.OverID[Character.Action.Buff.slot], false));
client.Send(Packet.PlayerStat(Character));
UpdateMp();
client.Send(Packet.ActionState(2, 0));
SkillBuffEnd(Character.Action.Buff.slot);
}
Character.Action.Buff.Casting = false;
Character.Action.Buff.slot = 255;
}
catch (Exception ex)
{
Console.WriteLine("SkillBuffCast Error: {0}",ex);
Systems.Debugger.Write(ex);
}
}