DarkEmu_GameServer.Systems.ActionAttack C# (CSharp) Метод

ActionAttack() приватный Метод

private ActionAttack ( ) : void
Результат void
        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);
            }
        }
Systems