void ActionAttack()
{
try
{
//Predefined info needs work!
#region Predefined info
byte AttackAmount = 2;
int AttackID = 1;
int[] found = new int[3];
byte numbert = 1;
int PhysicalDamage = 0;
byte status = 0, crit = 1;
#endregion
targetObject TargetObject = new targetObject(Character.Action.Object, this);
if (TargetObject != null)
{
client.Send(Packet.ActionState(1, 1));
//Bow information
#region Arrow for bow
if (Character.Information.Item.wID != 0)
{
if (Data.ItemBase[Character.Information.Item.wID].Itemtype == Global.item_database.ItemType.BOW || Data.ItemBase[Character.Information.Item.wID].Itemtype == Global.item_database.ItemType.EU_CROSSBOW)
{
if (Character.Information.Item.sID == 0)
{
if (!ItemCheckArrow())
{
Character.Action.nAttack = false;
client.Send(Packet.ActionPacket(2, 0x0e));
StopAttackTimer();
return;
}
}
else
{
Character.Information.Item.sAmount--;
client.Send(Packet.Arrow(Character.Information.Item.sAmount));
if (Character.Information.Item.sAmount <= 0)
{
Character.Information.Item.sID = 0;
MsSQL.UpdateData("delete from char_items where itemnumber='item" + 7 + "' AND owner='" + Character.Information.CharacterID + "'");
if (!ItemCheckArrow())
{
Character.Action.nAttack = false;
client.Send(Packet.ActionPacket(2, 0x0e));
StopAttackTimer();
return;
}
}
else
{
MsSQL.InsertData("UPDATE char_items SET quantity='" + Character.Information.Item.sAmount + "' WHERE itemnumber='" + "item" + 7 + "' AND owner='" + Character.Information.CharacterID + "' AND itemid='" + Character.Information.Item.sID + "'");
}
}
}
}
#endregion
if (Character.Action.ImbueID != 0 && Data.SkillBase[Character.Action.ImbueID].Series.Remove(Data.SkillBase[Character.Action.ImbueID].Series.Length - 2) == "SKILL_CH_LIGHTNING_GIGONGTA")
{
numbert = ActionGetObject(ref found, 2, TargetObject.x, TargetObject.y, Character.Action.Target, 5);
}
else found[1] = Character.Action.Target;
if (Character.Information.Item.wID != 0)
{
switch (Data.ItemBase[Character.Information.Item.wID].Class_C)
{
//Chinese base skills
case 2: //One handed sword
case 3:
AttackAmount = 2;
AttackID = 2;
break;
case 4: //Spear attack + glavie
case 5:
AttackAmount = 1;
AttackID = 40;
break;
case 6: //Bow attack
AttackAmount = 1;
AttackID = 70;
break;
//Europe Base skills
case 7:
AttackAmount = 1;
AttackID = 7127; // One handed sword
break;
case 8:
AttackAmount = 1;
AttackID = 7128; // Two handed sword
break;
case 9:
AttackAmount = 2;
AttackID = 7129; // Axe basic attack
break;
case 10:
AttackAmount = 1;
AttackID = 9069; // Warlock base
break;
case 11:
AttackAmount = 1;
AttackID = 8454; // Staff / Tstaff
break;
case 12:
AttackAmount = 1;
AttackID = 7909; // Crossbow base
break;
case 13:
AttackAmount = 2; //Dagger
AttackID = 7910;
break;
case 14:
AttackAmount = 1;
AttackID = 9606; // Harp base
break;
case 15:
AttackAmount = 1;
AttackID = 9970; // Light staff cleric
break;
case 16:
AttackAmount = 1;
AttackID = Data.SkillBase[Character.Action.UsingSkillID].ID;
break;
default:
Console.WriteLine("Action attack case: {0} , SkillID = {1}" + Data.ItemBase[Character.Information.Item.wID].Class_C, Data.SkillBase[Character.Action.UsingSkillID].ID);
break;
}
}
else
{
//Punch attack
AttackAmount = 1;
AttackID = 1;
}
//Get casting id
Character.Action.AttackingID = Character.Ids.GetCastingID();
//Create new packet writer
PacketWriter Writer = new PacketWriter();
Writer.Create(Systems.SERVER_ACTION_DATA);
Writer.Byte(1);
Writer.Byte(2);
Writer.Byte(0x30);
Writer.DWord(AttackID);
Writer.DWord(Character.Information.UniqueID);
Writer.DWord(Character.Action.AttackingID);
Writer.DWord(Character.Action.Target);
Writer.Bool(true);
Writer.Byte(AttackAmount);
Writer.Byte(numbert);
for (byte t = 1; t <= numbert; t++)
{
Writer.DWord(found[t]);
for (byte n = 1; n <= AttackAmount; n++)
{
PhysicalDamage = 0;
status = 0;
crit = 1;
if (t == 2) //for light skill
{
TargetObject = new targetObject(GetObjects(found[t]), this);
if (Character.Action.ImbueID != 0)
{
PhysicalDamage = (int)Formule.gamedamage((Data.SkillBase[Character.Action.ImbueID].tmpProp), MasteryGetPower(Character.Action.ImbueID), 0, 0, Character.Information.Mag_Balance, Character.Stat.UpdatededMagAttack);
PhysicalDamage += rnd.Next(0, PhysicalDamage.ToString().Length);
}
else PhysicalDamage = 1;
if (status != 128)
status = TargetObject.HP((int)PhysicalDamage);
else TargetObject.GetDead();
}
else if (t == 1)
{
PhysicalDamage = (int)Formule.gamedamage(Character.Stat.MaxPhyAttack, Character.Stat.AttackPower + MasteryGetPower(AttackID), 0, (double)TargetObject.PhyDef, Character.Information.Phy_Balance, Character.Stat.UpdatededPhyAttack);
if (Character.Action.ImbueID != 0) PhysicalDamage += (int)Formule.gamedamage((Character.Stat.MinMagAttack + Data.SkillBase[Character.Action.ImbueID].tmpProp), MasteryGetPower(Character.Action.ImbueID), 0, TargetObject.MagDef, Character.Information.Mag_Balance, Character.Stat.UpdatededMagAttack);
PhysicalDamage /= AttackAmount;
if (rnd.Next(15) <= 5)
{
PhysicalDamage *= 2;
crit = 2;
}
if (Character.Information.Berserking)
PhysicalDamage = (PhysicalDamage * Character.Information.BerserkOran) / 100;
if (PhysicalDamage <= 0)
PhysicalDamage = 1;
else
{
if (TargetObject.mAbsorb() > 0)
{
int static_dmg = (PhysicalDamage * (100 - (int)TargetObject.mAbsorb())) / 100;
TargetObject.MP((static_dmg));
PhysicalDamage = static_dmg;
}
PhysicalDamage += rnd.Next(0, PhysicalDamage.ToString().Length);
}
if (status != 128)
{
status = TargetObject.HP((int)PhysicalDamage);
}
else TargetObject.GetDead();
}
Writer.Byte(status);
Writer.Byte(crit);
Writer.DWord(PhysicalDamage);
Writer.Byte(0);
Writer.Word(0);
}
}
Send(Writer.GetBytes());
client.Send(Packet.ActionState(2, 0));
}
}
catch (Exception ex)
{
Console.WriteLine("ActionAttack Error {0}", ex);
Systems.Debugger.Write(ex);
}
}