// 콤보박스 메뉴 중에 어떤 항목을 클릭했을 때 동작할 내용 // 프로세스를 선택했을 때 어떤 행동을 할지 정하는 애 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); } }
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); }
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)); }
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]); } }
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 각도 }
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(); // 페인트 초기화 } }