Перейти к содержанию
pachela

[С#] Телепорт по координатам

Рекомендуемые сообщения

Есть у меня телепорт-бот, он телепортируется по координатам взятым с лист бокса. Работает отлично, без нареканий.

Но появилась нужна сделать бота, который будет тупо лететь с точки А в точку Б, которые находятся на огромном расстоянии друг от друга и за 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);
			}
		}
	}
}

 

Вроде бы и расписано, но пока кто то не разжует, могу сидеть долго тупить.

Можно даже просто вставить в каждой строчке комментарий, может мне этого и хватит. А можно и предложение с оптимизацией, что бы в шарпе выглядело аккуратнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы сам разобрался. В коде еще не реализовал, но концепцию понял.

Утро вечера мудренее.

Но предложения по теме приветствуются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.