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

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

private ActionSkill ( ) : void
Результат void
        void ActionSkill()
        {
            try
            {
                Global.s_data.TargetTypes TargetType = Data.SkillBase[Character.Action.Skill.MainSkill].TargetType;

                /*foreach (KeyValuePair<string, int> p in Data.SkillBase[Character.Action.Skill.MainSkill].Properties1)
                {
                    Console.WriteLine("{0}", p.Key);
                }*/

                bool gotoTarget = false;

                float x = 0, y = 0;
                bool[] aRound = null;
                if (!Character.Action.sAttack) return;

                obj o = null;
                Systems sys = null;

                if (Character.Action.Object != null && Character.Action.Object.GetType().ToString() == "DarkEmu_GameServer.obj")
                    //&& (TargetType == Global.s_data.TargetTypes.MOB
                    // || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.PLAYER)
                    // || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.NOTHING)
                    // || TargetType == (Global.s_data.TargetTypes.MOB | Global.s_data.TargetTypes.PLAYER | Global.s_data.TargetTypes.NOTHING)))
                {
                    o = Character.Action.Object as obj;
                    if (o.Die || o.GetDie || o.LocalType != 1) { Character.Action.sAttack = false; StopSkillTimer(); return; }
                    if (o.Agro == null) o.Agro = new List<_agro>();

                    x = (float)o.x;
                    y = (float)o.y;
                    aRound = o.aRound;

                    if (!o.Attacking)
                        o.AddAgroDmg(Character.Information.UniqueID, 1);

                    gotoTarget = true;
                }
                else if (o == null && Character.Action.Object != null && Character.Action.Object.GetType().ToString() == "DarkEmu_GameServer.Systems")
                    // && (TargetType == Global.s_data.TargetTypes.PLAYER
                    // || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.MOB
                    // || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.NOTHING
                    // || TargetType == Global.s_data.TargetTypes.PLAYER | TargetType == Global.s_data.TargetTypes.MOB | TargetType == Global.s_data.TargetTypes.NOTHING))
                {
                    if (Data.SkillBase[Character.Action.Skill.MainSkill].canSelfTargeted && (Character.Action.Target == this.Character.Information.UniqueID))
                    {
                        if (Data.SkillBase[Character.Action.Skill.MainSkill].needPVPstate && Character.Information.PvP)
                        { }
                        else
                        {
                            /* have to seek for error msg
                            client.Send(Packet.IngameMessages2(SERVER_ACTIONSTATE, IngameMessages.UIIT_STT_ERR_COMMON_INVALID_TARGET));*/
                            Character.Action.sAttack = false;
                            StopSkillTimer();
                            return;
                        }

                        sys = Character.Action.Object as Systems;
                        x = sys.Character.Position.x;
                        y = sys.Character.Position.y;
                        aRound = sys.Character.aRound;

                        gotoTarget = true;
                    }
                    else
                    {
                        /* have to seek for error msg
                        client.Send(Packet.IngameMessages2(SERVER_ACTIONSTATE, IngameMessages.UIIT_STT_ERR_COMMON_INVALID_TARGET));*/
                        Character.Action.sAttack = false;
                        StopSkillTimer();
                        return;
                    }
                }
                // no target TargetType = 3;
                else if (Character.Action.Object == null
                     && (TargetType == Global.s_data.TargetTypes.NOTHING
                     || TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.MOB
                     || TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.PLAYER
                     || TargetType == Global.s_data.TargetTypes.NOTHING | TargetType == Global.s_data.TargetTypes.MOB | TargetType == Global.s_data.TargetTypes.PLAYER))
                {
                    gotoTarget = false;
                }
                else
                {
                    Character.Action.sAttack = false;
                    StopSkillTimer();
                    return;
                }

                // go to target
                if (gotoTarget)
                {
                    double distance = Formule.gamedistance(Character.Position.x,
                                                                    Character.Position.y,
                                                                    x,
                                                                    y);

                    if (Character.Action.Skill.Distance == 0)
                        distance -= Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                    else distance -= Character.Action.Skill.Distance;

                    if (distance >= 0)
                    {
                        float farkx = x;
                        float farky = y;

                        if (Character.Action.Skill.Distance == 0)
                        {
                            if (Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE <= 10)
                                if (Systems.aRound(ref aRound, ref farkx, ref farky))
                                { Systems.aRound(ref farkx, ref farky, 1); }
                        }

                        Character.Position.wX = farkx - Character.Position.x; //- Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                        Character.Position.wY = farky - Character.Position.y; //- Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                        Character.Position.kX = Character.Position.wX;
                        Character.Position.kY = Character.Position.wY;
                        if (!Character.InGame) return;
                        Send(Packet.Movement(new DarkEmu_GameServer.Global.vektor(Character.Information.UniqueID,
                                    (float)Formule.packetx((float)farkx, Character.Position.xSec),
                                    (float)Character.Position.z,
                                    (float)Formule.packety((float)farky, Character.Position.ySec),
                                    Character.Position.xSec,
                                    Character.Position.ySec)));

                        distance += Data.ItemBase[Character.Information.Item.wID].ATTACK_DISTANCE;
                        Character.Position.Time = (distance / (Character.Speed.RunSpeed * 0.0768)) * 1000.0;
                        Character.Position.RecordedTime = Character.Position.Time;

                        Character.Position.packetxSec = Character.Position.xSec;
                        Character.Position.packetySec = Character.Position.ySec;

                        Character.Position.packetX = (ushort)Formule.packetx((float)farkx, Character.Position.xSec);
                        Character.Position.packetY = (ushort)Formule.packety((float)farky, Character.Position.ySec);

                        Character.Position.Walking = true;
                        StartMovementTimer((int)(Character.Position.Time * 0.1));
                        return;
                    }
                }

                StartSkill();
            }
            catch (Exception ex)
            {
                Console.WriteLine("ActionSkill error {0}", ex);
                Systems.Debugger.Write(ex);
            }
        }
Systems