void MainSkill_Attack(List<int> list)
{
if (!Character.Action.sAttack) return;
try
{
AmountControl();
int[,] p_dmg = new int[Character.Action.Skill.Found, Character.Action.Skill.NumberOfAttack];
int[] statichp = new int[Character.Action.Skill.Found];
PacketWriter Writer = new PacketWriter();
Writer.Create(Systems.SERVER_SKILL_DATA);
Writer.Byte(1);
Writer.DWord(Character.Action.Skill.MainCasting);
Writer.DWord(Character.Action.Target);
Writer.Byte(1);
Writer.Byte(Character.Action.Skill.NumberOfAttack);
Writer.Byte(Character.Action.Skill.Found);
byte[] status;
status = new byte[Character.Action.Skill.Found];
targetObject[] target = new targetObject[Character.Action.Skill.Found];
for (byte f = 0; f < Character.Action.Skill.Found; f++)
{
if (Character.Action.Skill.FoundID[f] != 0)
{
Writer.DWord(Character.Action.Skill.FoundID[f]);
target[f] = new targetObject(GetObjects(Character.Action.Skill.FoundID[f]), this);
if (target[f].sys == null && target[f].os == null) { }
else
{
statichp[f] = target[f].GetHp;
for (byte n = 0; n < Character.Action.Skill.NumberOfAttack; n++)
{
bool block = false;
/*if (Character.Information.Item.sID != 0 && Character.Information.Item.sID != 62)
{
if (Global.RandomID.GetRandom(0, 25) < 10) block = true;
}*/
if (!block)
{
byte crit = 1;
p_dmg[f, n] = 1;
if (Character.Action.Skill.P_M) // for magic damage
{
p_dmg[f, n] = (int)Formule.gamedamage((Character.Stat.MaxMagAttack + Data.SkillBase[Character.Action.Skill.SkillID[n]].MaxAttack), MasteryGetPower(Character.Action.Skill.SkillID[n]), target[f].AbsrobMag, target[f].MagDef, this.Character.Information.Mag_Balance, (Data.SkillBase[Character.Action.Skill.SkillID[n]].MagPer + Character.Stat.UpdatededMagAttack));
if (Character.Action.ImbueID != 0) p_dmg[f, n] += (int)Formule.gamedamage((Character.Stat.MinMagAttack + Data.SkillBase[Character.Action.ImbueID].MaxAttack), MasteryGetPower(Character.Action.ImbueID), 0, target[f].MagDef, Character.Information.Mag_Balance, Character.Stat.UpdatededMagAttack);
}
else // for phy damage
{
p_dmg[f, n] = (int)Formule.gamedamage((Character.Stat.MaxPhyAttack + Data.SkillBase[Character.Action.Skill.SkillID[n]].MaxAttack), MasteryGetPower(Character.Action.Skill.SkillID[n]), target[f].AbsrobPhy, target[f].PhyDef, this.Character.Information.Phy_Balance, Character.Stat.UpdatededPhyAttack + Data.SkillBase[Character.Action.Skill.SkillID[n]].MagPer);
if (Character.Action.ImbueID != 0) p_dmg[f, n] += (int)Formule.gamedamage((Character.Stat.MinMagAttack + Data.SkillBase[Character.Action.ImbueID].MaxAttack), MasteryGetPower(Character.Action.ImbueID), 0, target[f].MagDef, Character.Information.Mag_Balance, Character.Stat.UpdatededMagAttack);
if (rnd.Next(16) < 5)
{
p_dmg[f, n] *= 2;
crit = 2;
}
}
if (f > 0) p_dmg[f, n] = (p_dmg[f, n] * (100 - (f * 10))) / 100;
if (Character.Information.Berserking)
p_dmg[f, n] = (p_dmg[f, n] * Character.Information.BerserkOran) / 100;
if (p_dmg[f, n] <= 0)
p_dmg[f, n] = 1;
else
{
if (target[f].mAbsorb() > 0)
{
int static_dmg = (p_dmg[f, n] * (100 - (int)target[f].mAbsorb())) / 100;
target[f].MP(static_dmg);
p_dmg[f, n] = static_dmg;
}
p_dmg[f, n] += rnd.Next(0, p_dmg.ToString().Length);
}
statichp[f] -= p_dmg[f, n];
if (statichp[f] < 1)
{
status[f] = 128;
target[f].GetDead();
}
if (Character.Action.Skill.OzelEffect == 4 && status[f] != 128)
{
if (rnd.Next(10) > 5)
status[f] = 4;
}
Writer.Byte(status[f]); // so here we add status same opcode
Writer.Byte(crit);
Writer.DWord(p_dmg[f, n]);
Writer.Byte(0);
Writer.Word(0);
if (status[f] == 4) // if status was knockdown just add the new position of the mob where it should be knocked down
{
Writer.Byte(target[f].xSec);
Writer.Byte(target[f].ySec);
Writer.Word(Formule.packetx(target[f].x + 0.1f, target[f].xSec));
Writer.Word(0);
Writer.Word(Formule.packety(target[f].y - 0.1f, target[f].ySec));
Writer.Word(0);
Writer.Word(0);
Writer.Word(0);
}
}
else Writer.Byte(2);
}
}
}
}
Send(list, Writer.GetBytes());
for (byte f = 0; f < Character.Action.Skill.Found; f++)
{
if (target[f].sys == null && target[f].os == null)
{ }
else
{
if (target[f].sys != null && target[f].os == null) // player
DarkEmu_GameServer.Effect.EffectMain(target[f].sys, Character.Action.Skill.MainSkill);
if (target[f].sys == null && target[f].os != null) // mob
DarkEmu_GameServer.Effect.EffectMain(target[f].os, Character.Action.Skill.MainSkill);
}
}
Character.Action.sCasting = true;
Character.Action.sAttack = false;
if (Data.SkillBase[Character.Action.Skill.MainSkill].AttackTime == 0)
Data.SkillBase[Character.Action.Skill.MainSkill].AttackTime = 150;
StartsWaitTimer(Data.SkillBase[Character.Action.Skill.MainSkill].AttackTime, target, p_dmg, status);
}
catch (Exception ex)
{
Systems.Debugger.Write(ex);
}
}