예제 #1
0
        // 콤보박스 메뉴 중에 어떤 항목을 클릭했을 때 동작할 내용
        // 프로세스를 선택했을 때 어떤 행동을 할지 정하는 애
        private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                // 해당 프로세스에 대한 권한을 가져야한다
                if (Combobox1.SelectedIndex != -1) // 목록을 선택했다면
                {
                    string selectedItem = Combobox1.SelectedItem.ToString();
                    int    pid          = int.Parse(selectedItem.Split('-')[selectedItem.Split('-').Length - 1]);
                    // 문자열을 -로 나눈 후 가장 마지막 문자열을 가져온다, pid는 문자열 근데 안에서 찾는건 string 그래서 int를 string으로 바꿔주기 위해 int.Parse를 쓴다
                    attachProc = Process.GetProcessById(pid);

                    // 이제 프로세스를 열어야 한다 (권한을 주자)

                    mem.ReadProcess = attachProc; // 프로세스를 연다
                    mem.OpenProcess();


                    MessageBox.Show("프로세스 열기 성공 " + attachProc.ProcessName);
                    int base_ptr    = attachProc.MainModule.BaseAddress.ToInt32() + 0x00168A28;
                    int player_base = mem.ReadInt(base_ptr);
                    mainPlayer = new Playerdata(player_base);
                    attach     = true;
                }
            }
            catch (Exception ex) // 시도했을 때 예외 처리
            {
                attach = false;
                MessageBox.Show("프로세스 열기 실패" + ex.Message);
            }
        }
예제 #2
0
        private double GetDistance(Playerdata mainPlayer, Playerdata enemyPlayer)
        {
            // 피타고라스의 정리를 사용해 xz_distance를 먼저 구한다 (2D 상태)
            double xz_distance = Math.Sqrt(Math.Pow(mainPlayer.x_pos - enemyPlayer.x_pos, 2) + Math.Pow(mainPlayer.z_pos - enemyPlayer.z_pos, 2)); // Pow 제곱 Sqrt 루트
            // 피타고라스의 정리를 사용해 distance 를 구한다 (3D)
            double distance = Math.Sqrt(Math.Pow(xz_distance, 2) + Math.Pow(mainPlayer.y_pos - enemyPlayer.y_pos, 2));

            return(distance);
        }
예제 #3
0
        private double GetYDegree(Playerdata mainPlayer, Playerdata enemyPlayer)
        {
            double xz_distance = Math.Sqrt(Math.Pow(mainPlayer.x_pos - enemyPlayer.x_pos, 2) + Math.Pow(mainPlayer.z_pos - enemyPlayer.z_pos, 2));
            double y           = mainPlayer.y_pos - enemyPlayer.y_pos;
            double correction  = 1;

            if (y > 0)
            {
                correction = -1;
            }

            return(correction * Math.Abs(Math.Atan(y / xz_distance) * 180 / Math.PI));
        }
예제 #4
0
        private void GetEnemyState(ProcessMemoryReader mem)
        {
            int base_ptr = attachProc.MainModule.BaseAddress.ToInt32() + 0x00175BC4;

            for (int i = 0; i < 30; i++)
            {
                int[] offsetArray = { i * 4, 0 };  // 0, 4, 8, 12 총 30명의 플레이어 데이터를 불러온다
                int   player_base = mem.ReadMultiLevelPointer(base_ptr, 4, offsetArray);
                enemyPlayer[i] = new Playerdata(player_base);
                enemyPlayer[i].SetPlayerData(mem);
                enemyPlayer[i].distance     = GetDistance(mainPlayer, enemyPlayer[i]);
                enemyPlayer[i].head_x_angle = Get2DDegree(mainPlayer, enemyPlayer[i]);
                enemyPlayer[i].head_y_angle = GetYDegree(mainPlayer, enemyPlayer[i]);
            }
        }
예제 #5
0
        private double Get2DDegree(Playerdata mainPlayer, Playerdata enemyPlayer)
        {
            double x          = mainPlayer.x_pos - enemyPlayer.x_pos;
            double z          = mainPlayer.z_pos - enemyPlayer.z_pos;
            double correction = 270;

            if (x < 0)
            {
                correction = 90;
            }

            return(correction + Math.Atan(z / x) * 180 / Math.PI);

            //Abs 절대값, Atan 탄젠트 역함수, PI 각도
        }
예제 #6
0
        internal void hackWall(Playerdata mainPlayer, Playerdata[] enemyPlayer)
        {
            for (int i = 0; i < 10; i++) // 10명의 플레이어를 검사
            {
                float x_angle_pos = mainPlayer.x_angle - Double2Float(enemyPlayer[i].head_x_angle);
                float y_angle_pos = mainPlayer.y_angle - Double2Float(enemyPlayer[i].head_y_angle);

                // 실제 각도와 다르게 측정되는 경어, 실제 각도로 보정
                if (360 - 45 <= Math.Abs(x_angle_pos) && Math.Abs(x_angle_pos) <= 360)
                {
                    if (x_angle_pos > 0)    // 360 - 0
                    {
                        x_angle_pos -= 360; // ex) 359 - 1 = 358-- > 2도
                    }
                    else
                    {
                        x_angle_pos += 360; // ex) 1 -359 = -358 --> 2도
                    }
                }

                if ((Math.Abs(x_angle_pos) <= 45) && enemyPlayer[i].health > 0) // 길이가 총 90도
                {
                    float x_corr = (rect.Right - rect.Left) / 90 * x_angle_pos;
                    float y_corr = (rect.Bottom - rect.Top) / 60 * y_angle_pos;

                    posEnemy[i].x    = (((rect.Right - rect.Left) / 2) - x_corr);    // 더하고 나눠야되나.. 아닌가.. ----> 뺀 게 맞다
                    posEnemy[i].y    = (((rect.Bottom - rect.Top) / 2) + y_corr);
                    posEnemy[i].size = Double2Float(1800 / enemyPlayer[i].distance); // 적의 거리가 멀 수록 적을 표시하는 네모의 크기가 작아진다
                }

                else
                {
                    posEnemy[i].x = -1234;
                    posEnemy[i].y = -1234;
                }

                this.Invalidate(); // 페인트 초기화
            }
        }