Beispiel #1
0
        private static void ApproachMob(KeyValuePair <int, EliteAPI.EntityEntry> mob, int distanceTolerance, EliteAPI eliteApi)
        {
            if (IsWithinRange(mob, distanceTolerance))
            {
                return;
            }

            while (true)
            {
                // Get updated mob information.
                mob = FindEntity(mob.Key, eliteApi);

                // Stop when within melee distance.
                if (IsWithinRange(mob, MeleeDistance))
                {
                    break;
                }

                // Switch to first person view.
                SetViewMode(ViewMode.FirstPerson, eliteApi);

                // Get updated player information.
                EliteAPI.XiEntity player = FindPlayer(eliteApi);

                // Make the player look at the target.
                FaceHeading(mob, player, eliteApi);

                // Start moving the player towards the target.
                StartRunning(eliteApi);

                Thread.Sleep(100);
            }

            StopRunning(eliteApi);
        }
Beispiel #2
0
        public void Move(EliteAPI.XiEntity Target)
        {
            if (Target == null)
            {
                return;
            }
            if (Moving)
            {
                float  dX       = lastX - api.Player.X;
                float  dY       = lastY - api.Player.Y;
                float  dZ       = lastZ - api.Player.Z;
                double distance = Math.Sqrt(dX * dX + dY * dY + dZ * dZ);
                if (distance < .1)
                {
                    Stuck = true;
                }
            }

            float tX = Target.X - api.Player.X;
            float tY = Target.Y - api.Player.Y;
            float tZ = Target.Z - api.Player.Z;

            api.AutoFollow.SetAutoFollowCoords(tX, tY, tZ);
            api.AutoFollow.IsAutoFollowing = true;

            lastX     = api.Player.X;
            lastY     = api.Player.Y;
            lastZ     = api.Player.Z;
            HomeStuck = false;
            Moving    = true;
        }
Beispiel #3
0
        public static EliteAPI.XiEntity Box(EliteAPI api)
        {
            TargetInfo TargetInfo = new TargetInfo(api);

            for (var x = 0; x < 2048; x++)
            {
                EliteAPI.XiEntity entity = api.Entity.GetEntity(x);
                if (entity.WarpPointer == 0 || entity.HealthPercent == 0 || entity.TargetID <= 0)
                {
                    continue;
                }
                if (entity.Distance < 10 && entity.Name == "Sturdy Pyxis")
                {
                    pyxis = entity.Face + " " + entity.Render0000;
                }
                if (entity.Distance < 10 && entity.Name == "Sturdy Pyxis" && (!grayList.ContainsKey(entity.TargetID) || grayList[entity.TargetID] < DateTime.Now))
                {
                    if (entity.Face == 965 && Properties.Settings.Default.blue)
                    {
                        return(entity);
                    }
                    if (entity.Face == 968 && Properties.Settings.Default.red)
                    {
                        return(entity);
                    }
                }
            }
            return(null);
        }
Beispiel #4
0
        public static void PlayerFound(EliteAPI.XiEntity entity, int numPlayers)
        {
            Player.isAlone = false;

            bool closerPC = Updates.nearestPC.distance == 0 || entity.Distance < Updates.nearestPC.distance || entity.Name == Updates.nearestPC.name;

            if (closerPC)
            {
                Updates.nearestPC.name     = entity.Name;
                Updates.nearestPC.distance = entity.Distance;
            }
        }
Beispiel #5
0
        /// <summary>
        /// Npc名からIndexを取得する
        /// </summary>
        /// <param name="iNpcName">NpcName</param>
        /// <returns>NpcIndex</returns>
        private int findNpcIndexFromName(string iNpcName)
        {
            List <string> regStr = new List <string>();

            for (int i = 0; i < Constants.MAX_LOOP_COUNT; i++)
            {
                for (int j = 0; j < 2048; j++)
                {
                    EliteAPI.XiEntity ent = api.Entity.GetEntity(j);
                    if (!string.IsNullOrEmpty(ent.Name) && MiscTools.GetRegexString(ent.Name, iNpcName, out regStr))
                    {
                        return(j);
                    }
                }
                Thread.Sleep(settings.BaseWait);
            }
            return(-1);
        }
Beispiel #6
0
        public static void TpTarget(EliteAPI api)
        {
            EliteAPI.TargetInfo t = api.Target.GetTargetInfo();
            string targetName     = t.TargetName;

            if (targetName.Length == 0)
            {
                Chat.SendEcho(api, "Target not selected.");
                return;
            }

            EliteAPI.XiEntity e  = api.Entity.GetEntity((int)t.TargetIndex);
            Structs.WarpPoint wp = new Structs.WarpPoint();
            Structs.Position  p  = new Structs.Position();
            p.X = e.X; p.Y = e.Z; p.Z = e.Y; wp.pos = p; wp.zone = api.Player.ZoneId;
            Chat.SendEcho(api, "Approaching " + targetName + ".");
            Player.Warp(api, wp);
        }
Beispiel #7
0
        public static void Search(EliteAPI api, EliteAPI.XiEntity entity)
        {
            string target = Player.Search.target.ToLower();

            Console.WriteLine(entity.Name);
            //Found target
            if (entity.Name.ToLower().Contains(target))
            {
                Player.Search.isSearching = false;
                Player.Search.status      = Structs.Search.success;
                Chat.SendEcho(api, Chat.Search.success);

                EliteAPI.TargetInfo t = api.Target.GetTargetInfo();
                if (t.TargetIndex != entity.TargetID)
                {
                    //Not targeted, so set target!
                    api.Target.SetTarget(Convert.ToInt32(entity.TargetID));
                }
                return;
            }
        }
Beispiel #8
0
 public static NpcType GetNpcType(EliteAPI.XiEntity entity)
 {
     if (entity.WarpPointer == 0)
     {
         return(NpcType.InanimateObject);
     }
     if (IsOfType(entity.SpawnFlags, (int)NpcType.Mob))
     {
         return(NpcType.Mob);
     }
     if (IsOfType(entity.SpawnFlags, (int)NpcType.NPC))
     {
         return(NpcType.NPC);
     }
     if (IsOfType(entity.SpawnFlags, (int)NpcType.PC))
     {
         return(NpcType.PC);
     }
     if (IsOfType(entity.SpawnFlags, (int)NpcType.Self))
     {
         return(NpcType.Self);
     }
     return(NpcType.InanimateObject);
 }
Beispiel #9
0
        static void SlaveNavDoWork()
        {
            Queue <point> followqueue = new Queue <point>();
            bool          zoneAttempt = false;

            while (1 == 1)
            {
                if (slave == null || master == null)
                {
                    continue;
                }

                PlayerInfo PlayerInfo = new PlayerInfo(slave);
                TargetInfo TargetInfo = new TargetInfo(slave);
                Movement   Movement   = new Movement(slave);
                Recast     Recast     = new Recast(slave);

                System.Threading.Thread.Sleep(100);

                if (slave.Player.Status == 0)
                {
                    if (Box(slave) != null && CheckItem(slave, "Forbidden Key"))
                    {
                        if (TargetInfo.ID != Box(slave).TargetID)
                        {
                            TargetInfo.SetTarget((int)Box(slave).TargetID);
                            continue;
                        }
                        else if (TargetInfo.Distance > 3)
                        {
                            Movement.Move(Box(slave));
                            continue;
                        }
                        else
                        {
                            Movement.Stop();
                            slave.ThirdParty.SendString("item \"Forbidden Key\" <t>");
                            if (!grayList.ContainsKey(Box(slave).TargetID))
                            {
                                grayList.Add(Box(slave).TargetID, DateTime.Now.AddSeconds(20));
                            }
                            else
                            {
                                grayList[Box(slave).TargetID] = DateTime.Now.AddSeconds(20);
                            }
                            Thread.Sleep(1500);
                            continue;
                        }
                    }
                }

                switch (master.Player.Status)
                {
                case 85:
                case 0:
                case 4:
                case 33:
                    if (master.Player.ZoneId != slave.Player.ZoneId && Properties.Settings.Default.follow)
                    {
                        if (!zoneAttempt)
                        {
                            slave.ThirdParty.KeyDown(EliteMMO.API.Keys.W);
                            Thread.Sleep(1000);
                            slave.ThirdParty.KeyUp(EliteMMO.API.Keys.W);
                            zoneAttempt = true;
                        }
                    }
                    else
                    {
                        zoneAttempt = false;
                    }
                    if (slave.Player.Status == 1 && Properties.Settings.Default.attack)
                    {
                        slave.ThirdParty.SendString("/attackoff");
                        continue;
                    }
                    if (master.Player.Status == 85 && slave.Player.Status != 85 && Properties.Settings.Default.mount)
                    {
                        slave.ThirdParty.SendString("/mount " + Properties.Settings.Default.mountname);
                        continue;
                    }
                    if (master.Player.Status != 85 && slave.Player.Status == 85 && Properties.Settings.Default.mount)
                    {
                        slave.ThirdParty.SendString("/dismount");
                        continue;
                    }
                    followqueue.Enqueue(new point(master.Player.X, master.Player.Y, master.Player.Z, master.Player.ZoneId));

                    if (Properties.Settings.Default.follow)
                    {
                        if (followqueue.Count > 15)
                        {
                            point approach = followqueue.Dequeue();
                            float dX       = approach.x - slave.Player.X;
                            float dY       = approach.y - slave.Player.Y;
                            float dZ       = approach.z - slave.Player.Z;
                            float distance = (float)Math.Abs(Math.Sqrt(dX * dX + dY * dY + dZ * dZ));
                            if (distance > .3 &&
                                approach.zoneID == slave.Player.ZoneId &&
                                !PlayerInfo.Casting)
                            {
                                slave.AutoFollow.SetAutoFollowCoords(dX, dY, dZ);
                                slave.AutoFollow.IsAutoFollowing = true;
                            }
                            else
                            {
                                if (approach.zoneID == slave.Player.ZoneId)
                                {
                                    slave.AutoFollow.IsAutoFollowing = false;
                                }
                            }
                        }
                        else
                        {
                            slave.AutoFollow.IsAutoFollowing = false;
                        }
                    }
                    else
                    {
                        if (followqueue.Count > 15)
                        {
                            followqueue.Dequeue();
                        }
                    }

                    if (!PlayerInfo.HasBuff(71) && new PlayerInfo(master).HasBuff(71))
                    {
                        if (Properties.Settings.Default.spectral)
                        {
                            slave.ThirdParty.SendString("/ja \"Spectral Jig\" <me>");
                            Thread.Sleep(1000);
                        }
                        if (Properties.Settings.Default.whm)
                        {
                            slave.ThirdParty.SendString("/ma \"Sneak\" <me>");
                            Thread.Sleep(6000);
                        }
                    }

                    if (!PlayerInfo.HasBuff(69) && new PlayerInfo(master).HasBuff(69))
                    {
                        if (Properties.Settings.Default.spectral)
                        {
                            slave.ThirdParty.SendString("/ja \"Spectral Jig\" <me>");
                            Thread.Sleep(1000);
                        }
                        if (Properties.Settings.Default.whm)
                        {
                            slave.ThirdParty.SendString("/ma \"Invisible\" <me>");
                            Thread.Sleep(6000);
                        }
                    }
                    if (!new PlayerInfo(master).HasBuff(69) && PlayerInfo.HasBuff(69) && Properties.Settings.Default.cancel)
                    {
                        if (Windower(slave) == "Windower")
                        {
                            slave.ThirdParty.SendString("//cancel 69");
                        }
                        if (Windower(slave) == "Ashita")
                        {
                            slave.ThirdParty.SendString("/cancel Invisible");
                        }
                    }
                    if (!new PlayerInfo(master).HasBuff(71) && PlayerInfo.HasBuff(71) && Properties.Settings.Default.cancel)
                    {
                        if (Windower(slave) == "Windower")
                        {
                            slave.ThirdParty.SendString("//cancel 71");
                        }
                        if (Windower(slave) == "Ashita")
                        {
                            slave.ThirdParty.SendString("/cancel Sneak");
                        }
                    }

                    break;

                case 1:
                    if (slave.Target.GetTargetInfo().TargetIndex != master.Target.GetTargetInfo().TargetIndex&& Properties.Settings.Default.attack)
                    {
                        slave.Target.SetTarget((int)master.Target.GetTargetInfo().TargetIndex);
                        continue;
                    }
                    if (slave.Player.Status == 0 && Properties.Settings.Default.attack)
                    {
                        slave.ThirdParty.SendString("/attack <t>");
                        continue;
                    }
                    List <EliteAPI.XiEntity> Entity = new List <EliteAPI.XiEntity>();
                    for (var x = 0; x < 2048; x++)
                    {
                        EliteAPI.XiEntity entity = slave.Entity.GetEntity(x);
                        if (entity.HealthPercent == 0 || entity.TargetID <= 0)
                        {
                            continue;
                        }
                        var vertdiff = Math.Abs((PlayerInfo.Y - entity.Y));
                        if (vertdiff >= 2)
                        {
                            continue;
                        }

                        if (entity.Distance < 5)
                        {
                            Entity.Add(entity);
                        }
                    }

                    EliteAPI.XiEntity target = slave.Entity.GetEntity((int)master.Target.GetTargetInfo().TargetIndex);

                    float tX = target.X - slave.Player.X;
                    float tY = target.Y - slave.Player.Y;
                    float tZ = target.Z - slave.Player.Z;
                    if (Properties.Settings.Default.attack)
                    {
                        if (target.Distance > 2 && !PlayerInfo.Casting && !Entity.Any(a => a.Name == "Moogle"))
                        {
                            slave.AutoFollow.SetAutoFollowCoords(tX, tY, tZ);
                            slave.AutoFollow.IsAutoFollowing = true;
                            continue;
                        }
                        else
                        {
                            slave.AutoFollow.IsAutoFollowing = false;
                        }

                        if (!TargetInfo.IsFacingTarget(PlayerInfo.X, PlayerInfo.Z, PlayerInfo.H, TargetInfo.X, TargetInfo.Z) &&
                            TargetInfo.HPP > 1 &&
                            !PlayerInfo.Casting)
                        {
                            TargetInfo.FaceTarget(TargetInfo.X, TargetInfo.Z);
                        }
                    }
                    break;
                }
            }
        }
Beispiel #10
0
 /// <summary>
 /// キャラクターの方向を指定したNPCに設定する
 /// </summary>
 /// <param name="iNpcIndex">NpcIndex</param>
 private void faceTo(int iNpcIndex)
 {
     EliteAPI.XiEntity ent = api.Entity.GetEntity(iNpcIndex);
     faceTo(ent.X, ent.Z);
 }
Beispiel #11
0
        /// <summary>
        /// メイン処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void mainThread()
        {
            try
            {
                setMessage("開始しました", MessageKind.Execute);
                //開始前チェック処理
                if (api.Player.HasKeyItem(2214) ||  //ケイザックFB設営物資
                    api.Player.HasKeyItem(2215) ||  //エヌティエルFB設営物資
                    api.Player.HasKeyItem(2216) ||  //モリマーFB設営物資
                    api.Player.HasKeyItem(2403) ||  //マリアミFB設営物資
                    api.Player.HasKeyItem(2404) ||  //ヨルシアFB設営物資
                    api.Player.HasKeyItem(2463))    //カミールFB設営物資
                {
                    stop(false, "FB設営物資を持っている", MessageKind.Critical);
                    return;
                }

                for (int l = 0; l < Constants.MAX_LOOP_COUNT; l++)
                {
                    //COU NPCチェック
                    EliteAPI.XiEntity entCouNpc = api.Entity.GetEntity(Constants.NPC_INDEX_COU);
                    if (entCouNpc.Distance > 5.0f)
                    {
                        stop(false, "COUのカウンター近くで実行してください", MessageKind.Critical);
                        return;
                    }
                    //メニューを閉じる
                    closeMenu();

                    //COUカウンター ワークスコール受領
                    setMessage("ワークスコール受領中", MessageKind.Execute);
                    faceTo(Constants.NPC_INDEX_COU);
                    talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU1); //どうしますか?(チケット:([0-9]*)枚)
                    if (remainTicket <= settings.LimitTicket)
                    {
                        stop(false, string.Format("チケットが{0}枚以下になったので停止", settings.LimitTicket), MessageKind.Normal);
                        return;
                    }
                    setDialogIndex(0, 3);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU2); //種類を選んでください。
                    setDialogIndex(2, 3);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU3); //どのワークスコールを受けますか?
                    if (settings.MenuIndexWorksCall >= 0)
                    {
                        setDialogIndex((ushort)settings.MenuIndexWorksCall, 3);
                    }
                    else
                    {
                        setMessage("行き先を選択", MessageKind.Warning);
                        SystemSounds.Asterisk.Play();
                        settings.MenuIndexWorksCall = getSelectedDialogIndex();
                        setNumericUpDown(txtMenuIndexWorksCall, settings.MenuIndexWorksCall);
                        setMessage("ワークスコール受領中", MessageKind.Execute);
                    }
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU4); //何枚使用しますか?(チケット:([0-9]*)枚)
                    ushort indexTicket = 0;
                    if (remainTicket >= settings.TicketUseEach)
                    {
                        indexTicket = (ushort)(settings.TicketUseEach - 1);
                    }
                    else
                    {
                        indexTicket = (ushort)(remainTicket - 1);
                    }
                    setDialogIndex(indexTicket, 3);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU5); //([0-9]*)枚でよろしいですね?
                    setDialogIndex(0, 3);

                    //COUからWaypointまで移動
                    setMessage("Waypointまで移動中", MessageKind.Execute);
                    moveCouToWaypoint(WayDirectionKind.CouToWaypoint);

                    //Waypoint
                    setMessage("ワープ先選択中", MessageKind.Execute);
                    faceTo(Constants.NPC_INDEX_COU_WAYPOINT);
                    talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU_WAYPOINT);
                    //エリア
                    waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp)
                    if (remainCp <= settings.LimitCp)
                    {
                        stop(false, string.Format("Cpが{0}以下になったので停止", settings.LimitCp), MessageKind.Normal);
                        return;
                    }
                    if (settings.MenuIndexArea >= 0)
                    {
                        setDialogIndex((ushort)settings.MenuIndexArea, 3);
                    }
                    else
                    {
                        setMessage("エリアを選択してください", MessageKind.Warning);
                        SystemSounds.Asterisk.Play();
                        settings.MenuIndexArea = getSelectedDialogIndex();
                        setNumericUpDown(txtMenuIndexArea, settings.MenuIndexArea);
                        setMessage("ワープ先選択中", MessageKind.Execute);
                        Thread.Sleep(settings.BaseWait);
                    }
                    //ビバック
                    waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp)
                    if (settings.MenuIndexBivouac >= 0)
                    {
                        setDialogIndex((ushort)settings.MenuIndexBivouac, 3);
                    }
                    else
                    {
                        setMessage("ビバックを選択してください", MessageKind.Warning);
                        SystemSounds.Asterisk.Play();
                        settings.MenuIndexBivouac = getSelectedDialogIndex();
                        setNumericUpDown(txtMenuIndexBivouac, settings.MenuIndexBivouac);
                        setMessage("ワープ先選択中", MessageKind.Execute);
                    }
                    //ワープ中
                    setMessage("ワープ待機中", MessageKind.Execute);
                    waitZoneing();

                    //Administratorへ物資を渡す
                    setMessage("近くのAdministratorを検索", MessageKind.Execute);
                    int adminIndex = findNpcIndexFromName("Bivouac#([0-9]*) Administrator");
                    if (adminIndex >= 0)
                    {
                        EliteAPI.XiEntity adminEntity = api.Entity.GetEntity(adminIndex);
                        setMessage("Waypointまで移動中", MessageKind.Execute);
                        //moveTo(adminEntity.X, adminEntity.Z, (float)(0.5f + (1.5f * rnd.NextDouble())));
                        //moveTo(adminEntity.X, adminEntity.Z, (float)(4.0f + (1.0f * rnd.NextDouble())));
                        moveTo(adminEntity.X, adminEntity.Z, 5.5f);
                        setMessage("Administratorへ物資を渡し中", MessageKind.Execute);
                        if (!settings.Kamihr3)
                        {
                            faceTo(adminEntity.X, adminEntity.Z);
                        }
                        talkToNpcWaitTalkFinish(adminIndex);
                    }
                    else
                    {
                        stop(false, "Administratorが見つからない", MessageKind.Critical);
                        return;
                    }

                    //AdministratorからWaypointまで移動
                    setMessage("近くのWaypointを検索", MessageKind.Execute);
                    int waypointIndex = findNpcIndexFromName("Waypoint");
                    if (waypointIndex >= 0)
                    {
                        EliteAPI.XiEntity waypointEntity = api.Entity.GetEntity(waypointIndex);
                        setMessage("Waypointまで移動中", MessageKind.Execute);
                        //moveTo(waypointEntity.X, waypointEntity.Z, (float)(0.5f + (1.5f * rnd.NextDouble())));
                        moveTo(waypointEntity.X, waypointEntity.Z, (float)(4.0f + (1.0f * rnd.NextDouble())));
                        Thread.Sleep(500);
                        if (!settings.Kamihr3)
                        {
                            faceTo(waypointEntity.X, waypointEntity.Z);
                        }
                    }
                    else
                    {
                        stop(false, "Waypointが見つからない", MessageKind.Critical);
                        return;
                    }

                    //Waypoint
                    setMessage("ワープ先選択中", MessageKind.Execute);
                    talkToNpcWaitDialogOpen(waypointIndex);
                    //エリア
                    waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp)
                    setDialogIndex(2, 3);
                    //ビバック
                    waitDialogTitle(Constants.DIALOG_QUESTION_WAYPOINT1); //ワープ先を選択(所有ポイント:([0-9]*)cp)
                    setDialogIndex(1, 3);
                    //ワープ中
                    setMessage("ワープ待機中", MessageKind.Execute);
                    waitZoneing();

                    //WaypointからCOUまで移動
                    setMessage("COUカウンターまで移動中", MessageKind.Execute);
                    moveCouToWaypoint(WayDirectionKind.WaypointToCou);

                    //COUカウンター ワークスコール報告
                    setMessage("ワークスコール報告中", MessageKind.Execute);
                    faceTo(Constants.NPC_INDEX_COU);
                    talkToNpcWaitDialogOpen(Constants.NPC_INDEX_COU);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU1); //どうしますか?(チケット:([0-9]*)枚)
                    setDialogIndex(0, 3);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU2); //種類を選んでください。
                    setDialogIndex(0, 3);
                    waitDialogTitle(Constants.DIALOG_QUESTION_COU6); //どのワークスコールを報告しますか?
                    setDialogIndex(0, 3);
                    while (api.Menu.IsMenuOpen)
                    {
                        Thread.Sleep(settings.BaseWait);
                    }
                }
            }
            catch (ThreadAbortException e)
            {
                Console.WriteLine("スレッド停止");
            }
            finally
            {
                //暴走防止
                api.ThirdParty.KeyUp((byte)KeyCode.NP_Number8);
            }
        }
Beispiel #12
0
 public static bool IsInSpellCastingRange(this EliteAPI.XiEntity entity)
 {
     return(entity.Distance is < 21 and > 0);
 }
Beispiel #13
0
        /// <summary>
        /// Make the player face the given target.
        /// </summary>
        /// <param name="target"></param>
        /// <param name="player"></param>
        /// <param name="eliteApi"></param>
        private static void FaceHeading(KeyValuePair <int, EliteAPI.EntityEntry> target, EliteAPI.XiEntity player, EliteAPI eliteApi)
        {
            byte angle = (byte)(Math.Atan((target.Value.Z - player.Z) / (target.Value.X - player.X)) * -(128.0f / Math.PI));

            if (player.X > target.Value.X)
            {
                angle += 128;
            }
            double radian = (float)angle / 255 * 2 * Math.PI;

            eliteApi.Entity.SetEntityHPosition(eliteApi.Entity.LocalPlayerIndex, (float)radian);
        }