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

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


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

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

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

 

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

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

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

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

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

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

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

×
×
  • Создать...

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

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