void ActionAttack() { try { //Predefined info needs work! #region Predefined info byte NumberAttack = 2; int AttackType = 1; int[] found = new int[3]; byte numbert = 1; int p_dmg = 0; byte status = 0, crit = 1; #endregion client.Send(Packet.ActionState(1, 1)); //Bow information if (CheckBow()) { StopSkillTimer(); StopAttackTimer(); return; } WorldMgr.targetObject target = new WorldMgr.targetObject(Character.Action.Object, this); if (Character.Action.ImbueID != 0 && ObjData.Manager.SkillBase[Character.Action.ImbueID].Series.Remove(ObjData.Manager.SkillBase[Character.Action.ImbueID].Series.Length - 2) == "SKILL_CH_LIGHTNING_GIGONGTA") { numbert = ActionGetObject(ref found, 2, target.x, target.y, Character.Action.Target, 5); } else found[1] = Character.Action.Target; if (Character.Information.Item.wID != 0) { switch (ObjData.Manager.ItemBase[Character.Information.Item.wID].TypeID4) { //Chinese base skills case 2: //One handed sword case 3: NumberAttack = 2; AttackType = 2; break; case 4: //Spear attack + glavie case 5: NumberAttack = 1; AttackType = 40; break; case 6: //Bow attack NumberAttack = 1; AttackType = 70; break; //Europe Base skills case 7: NumberAttack = 1; AttackType = 7127; // One handed sword break; case 8: NumberAttack = 1; AttackType = 7128; // Two handed sword break; case 9: NumberAttack = 2; AttackType = 7129; // Axe basic attack break; case 10: NumberAttack = 1; AttackType = 9069; // Warlock base break; case 11: NumberAttack = 1; AttackType = 8454; // Staff / Tstaff break; case 12: NumberAttack = 1; AttackType = 7909; // Crossbow base break; case 13: NumberAttack = 2; //Dagger AttackType = 7910; break; case 14: NumberAttack = 1; AttackType = 9606; // Harp base break; case 15: NumberAttack = 1; AttackType = 9970; // Light staff cleric break; case 16: NumberAttack = 1; AttackType = ObjData.Manager.SkillBase[Character.Action.UsingSkillID].ID; break; default: Console.WriteLine("Action attack case: {0} , SkillID = {1}" + ObjData.Manager.ItemBase[Character.Information.Item.wID].TypeID4, ObjData.Manager.SkillBase[Character.Action.UsingSkillID].ID); break; } } else { //Punch attack NumberAttack = 1; AttackType = 1; } //Get casting id Character.Action.AttackingID = Character.Ids.GetCastingID(); //Create new packet writer PacketWriter Writer = new PacketWriter(); Writer.Create(OperationCode.SERVER_ACTION_DATA); Writer.Byte(1); Writer.Byte(2); Writer.Byte(0x30); Writer.DWord(AttackType); Writer.DWord(Character.Information.UniqueID); Writer.DWord(Character.Action.AttackingID); Writer.DWord(Character.Action.Target); Writer.Bool(true); Writer.Byte(NumberAttack); Writer.Byte(numbert); for (int t = 1; t <= numbert; t++) { Writer.DWord(found[t]); for (byte n = 1; n <= NumberAttack; n++) { //Set defaults p_dmg = (int)Formule.gamedamage(Character.Stat.MaxPhyAttack, Character.Stat.AttackPower + MasteryGetPower(AttackType), 0, (double)target.PhyDef, Character.Information.Phy_Balance, Character.Stat.UpdatededPhyAttack); status = 0; crit = 0; //Set target target = new WorldMgr.targetObject(Helpers.GetInformation.GetObjects(found[t]), this); //Make sure we dont get null error if (Character.Action.UsingSkillID != 0) { //If we have an active imbue if (ObjData.Manager.SkillBase[Character.Action.UsingSkillID].Definedname == ObjData.s_data.Definedtype.Imbue) { p_dmg += ObjData.Manager.SkillBase[Character.Action.UsingSkillID].MaxAttack; p_dmg += Rnd.Next(0, p_dmg.ToString().Length); } } if (status != 128) { status = target.HP((int)p_dmg); } else { target.GetDead(); Character.Action.nAttack = false; } Writer.Byte(status); Writer.Byte(crit); Writer.DWord(p_dmg); Writer.Byte(0); Writer.Word(0); p_dmg = 0; } } Send(Writer.GetBytes()); client.Send(Packet.ActionState(2, 0)); } catch (Exception ex) { Log.Exception(ex); } }