pachela Опубликовано 25 августа, 2019 Поделиться Опубликовано 25 августа, 2019 Есть у меня телепорт-бот, он телепортируется по координатам взятым с лист бокса. Работает отлично, без нареканий. Но появилась нужна сделать бота, который будет тупо лететь с точки А в точку Б, которые находятся на огромном расстоянии друг от друга и за 1 раз нельзя сделать такой прыжок. В игре есть некая "защита" от таких телепортов, максимальный шаг 10-15 метров. Координаты имеют вот такой вид: 4009,14; -34,06; -39,59; Могут быть как положительными, так и отрицательными. Сижу и думаю, как бы это реализовать. По идее тут можно вычислить 2 вектора, Х и У. А дальше перемещаться по этим векторам с шагом не превышающим 10 метров. но пока что на этой догадке и остановился. Видел приблизительное решение задачи, но оно на С++ и я не уверен, что в Шарпе так же будет реализоваться. Привожу функцию: Спойлер void AutoTP(float x, float y, float z) { if (ActivatedTP) { uintptr_t TPX = GetDMA(PlayerAddr, TeleportOffsetsX, 4); uintptr_t TPY = GetDMA(PlayerAddr, TeleportOffsetsY, 4); uintptr_t TPZ = GetDMA(PlayerAddr, TeleportOffsetsZ, 4); float Xposo = Read<float>(TPX); float Yposo = Read<float>(TPY); float start[] = { Xposo, Yposo }; float end[] = { x, y }; std::cout << "AutoPathing from (" << start[0] << "," << start[1] << ") to (" << end[0] << "," << end[1] << ")" << std::endl; float minDistance = 8; double distance = sqrt(powf(end[0] - start[0], 2) + powf(end[1] - start[1], 2)); int steps = distance / minDistance; float dVec[] = { 0 , 0 }; dVec[0] = (end[0] - start[0]) / steps; dVec[1] = (end[1] - start[1]) / steps; vector< vector<float> > stepVec(steps, vector<float>(2)); int i; float currPos[] = { start[0] , start[1] }; for (i = 0; i < steps; i++) { //Add each step with dist for new vector of points vector<float> tempVec(2); tempVec[0] = dVec[0] + currPos[0]; tempVec[1] = dVec[1] + currPos[1]; // Update theorytical current position player would be now for next increment // Since its a primary type ( float ) I don't think we need to clone currPos[0] = tempVec[0]; currPos[1] = tempVec[1]; // Push calculated step vector into our array of arrays stepVec[i] = tempVec; } // Our steps array is populated with coords // Simply for loop for TP for (i = 0; i < steps; i++) { if (ActivatedTP) { TP(stepVec[i][0], stepVec[i][1], tpheight); std::cout << stepVec[i][0] << ", " << stepVec[i][1] << ", " << tpheight << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(timedelay)); } } Sleep(500); Xposo = Read<float>(TPX); Yposo = Read<float>(TPY); Zposo = Read<float>(TPZ); double distanceleft = sqrt(powf(end[0] - Xposo, 2) + powf(end[1] - Yposo, 2)); if (distanceleft < 8 & ActivatedTP) { Zposo = Read<float>(TPZ); float swapheight = Zposo - z; std::cout << "Distance to ground." << swapheight << std::endl; while (swapheight > 40 & ActivatedTP) { std::cout << "Too far up, descending." << std::endl; Zposo = Read<float>(TPZ); swapheight = Zposo - z; Write(TPZ, Zposo - 10); Sleep(100); } RestoreTP(); Sleep(2000); while (Read<float>(TPZ) != z & ActivatedTP) { Write(TPZ, z); Sleep(2000); } std::cout << "Finished Teleport." << std::endl; //RestoreTP(); } else { if (ActivatedTP) { AutoTP(x, y, z); } } } } Вроде бы и расписано, но пока кто то не разжует, могу сидеть долго тупить. Можно даже просто вставить в каждой строчке комментарий, может мне этого и хватит. А можно и предложение с оптимизацией, что бы в шарпе выглядело аккуратнее. Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 25 августа, 2019 Автор Поделиться Опубликовано 25 августа, 2019 Вроде бы сам разобрался. В коде еще не реализовал, но концепцию понял. Утро вечера мудренее. Но предложения по теме приветствуются. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения