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

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

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