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

TrainMe на Телепорт c дорокжой


MasterGH

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

post-3-0-07051400-1428208830_thumb.png

WalkerTrainme.rar

Задача

Сделать телепорт так, чтобы дорожка, которая показывает путь располагалась правильно после нового хода. Что-то похоже есть в Героях VI.

Шифрования нет. Специальных сложностей не делал. Трейми 32-х разрядный. Сделан на Unity3D из стандартных ресурсов.

Внимание. Подсказка на коде C#

Строку

GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0}

заменить на

GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints);

using UnityEngine;using System.Collections;using UnityStandardAssets.Characters.ThirdPerson;public class Controller : MonoBehaviour{	#region Public variables	public Transform target;	public Transform[] arrayPoints;	public Camera mainCamera;	public AICharacterControl aiCharacterControl;	public NavMeshAgent navMeshAgent;	public float minDistance = 1f;	public Transform chracter;	public Rigidbody rigidbody;	public int closeCheckPoint;	public bool startAnimation;	#endregion		#region Monobehavior	void Start()	{		arrayPoints = new Transform[1];		arrayPoints[0] = Instantiate<Transform>(target);		var pos = chracter.position;		pos.y = 0;		arrayPoints[0].position = pos;	}	void Update()	{		if(startAnimation)		{			var distanceToEndPoint = Vector3.Distance(arrayPoints[closeCheckPoint].position, chracter.position); 						if(distanceToEndPoint < 0.1f)			{				closeCheckPoint++;				if(closeCheckPoint >= arrayPoints.Length)				{					startAnimation = false;					rigidbody.isKinematic = true;					navMeshAgent.Stop();					aiCharacterControl.target = null;				}				else				{					aiCharacterControl.target = arrayPoints[closeCheckPoint];					rigidbody.isKinematic = false;					navMeshAgent.Resume();				}			}		}		else		{			if(Input.GetMouseButtonUp(0))			{				var mousePos = Input.mousePosition;				var ray = mainCamera.ScreenPointToRay(mousePos);				RaycastHit hitInfo;				if(Physics.Raycast(ray, out hitInfo))				{					var pointHit = hitInfo.point;					//GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints);					GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0}					closeCheckPoint = 0;					aiCharacterControl.target = arrayPoints[0];					rigidbody.isKinematic = false;					navMeshAgent.Resume();					startAnimation = true;				}			}		}	}	#endregion	#region Private Functions	void GetPoints(Vector3 p1, Vector3 p2, float minDistance, Transform trPrefab, ref Transform[] arrayPoints)	{		if(arrayPoints != null)			DestroyObects(arrayPoints);		var dz = Vector3.Distance(p1, p2)/minDistance;		var countPoins = (int)dz + 1;		arrayPoints = new Transform[countPoins];		var direction = p2 - p1;		for (int i = 0; i < countPoins; i++)		{			arrayPoints[i] = Instantiate<Transform>(trPrefab);			Vector3 pos = p1 + direction * i/dz;			pos.y = 0f;			arrayPoints[i].position = pos;		}	}	void DestroyObects(Transform[] arrayPoints)	{		var max = arrayPoints.Length;		for (int i = max-1; i >= 0; i--)		{			Destroy(arrayPoints[i].gameObject);		}	}	#endregion}

Если нужно выложу пакадж проекта.

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

Решение проблемы с дорожкой

 

 

1. Ищем адрес координат

2. Ставим бряк и в часто обращаемую инструкцию делаем инъекцию кода для вывода поинтера pTransformComponent на структуру с координатами 

 

 

3. Пишем координаты героя в таблицу по адресам

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

 

 

4. Ищем адрес счетчика желтых кружков в пути и ставим бряк на доступ

5. Идем в игру, совершаем ход несколько раз. Та инструкция, которая обращалась к счетчику один раз за один ход

 

На высоком уровне счетчик назывался closeCheckPoint и находится здесь

 

 

Мы должны записать в стек не arrayPoints[arrayPoints.Length - 1].position, а координаты игрока. Исследуем немного стек и пишем скрипт

 

 

Теперь дорожка начинается с позиции персонажа где бы он не был. 

 

 

Осталось написать скрипт телепорта и + еще два новых задания, которое появились.

Задание 1. Сделать телепорт

Задание 2. После телепортации разрушать дорожку

Задание 3. После телепортации не разрушать дорожку, а строить дорожку от старой позиции к новой

[ENABLE]alloc(newmem,2048)label(returnhere)label(pTransformComponent)registersymbol(pTransformComponent)newmem:mov [pTransformComponent],esifstp dword ptr [esi+000001E0]jmp returnherepTransformComponent:dd 0"WalkerTrainme.exe"+3B2024:jmp newmemnopreturnhere: [DISABLE]"WalkerTrainme.exe"+3B2024:fstp dword ptr [esi+000001E0]//Alt: db D9 9E E0 01 00 00dealloc(newmem)
[pTransformComponent]+1e0 + 0 = X[pTransformComponent]+1e0 + 4 = Y[pTransformComponent]+1e0 + 8 = Z
04A1AB0B - E8 88C00000 - call 04A26B9804A1AB10 - 83 C4 30 - add esp,3004A1AB13 - C7 47 30 00000000 - mov [edi+30],00000000 <<04A1AB1A - 8B 47 1C  - mov eax,[edi+1C]04A1AB1D - 8B 4F 14  - mov ecx,[edi+14]EAX=00000000EBX=04A0E530ECX=04682AA8EDX=04682B00ESI=09B80FD0EDI=00965A10ESP=0026F1C0EBP=0026F298EIP=04A1AB1A
///...	var pointHit = hitInfo.point;	//GetPoints(chracter.position, pointHit, minDistance, target, ref arrayPoints);	GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints); //{0}	closeCheckPoint = 0;///.../*--------------------------*/04A1AAD4 - 51                    - push ecx04A1AAD5 - 50                    - push eax04A1AAD6 - 83 EC 04              - sub esp,0404A1AAD9 - D9 1C 24              - fstp dword ptr [esp]04A1AADC - 83 EC 0C              - sub esp,0C04A1AADF - 8B 45 80              - mov eax,[ebp-80]04A1AAE2 - 89 04 24              - mov [esp],eax04A1AAE5 - 8B 45 84              - mov eax,[ebp-7C]04A1AAE8 - 89 44 24 04           - mov [esp+04],eax04A1AAEC - 8B 45 88              - mov eax,[ebp-78]04A1AAEF - 89 44 24 08           - mov [esp+08],eax04A1AAF3 - 83 EC 0C              - sub esp,0C04A1AAF6 - 8B 45 BC              - mov eax,[ebp-44]04A1AAF9 - 89 04 24              - mov [esp],eax04A1AAFC - 8B 45 C0              - mov eax,[ebp-40]04A1AAFF - 89 44 24 04           - mov [esp+04],eax04A1AB03 - 8B 45 C4              - mov eax,[ebp-3C]04A1AB06 - 89 44 24 08           - mov [esp+08],eax04A1AB0A - 57                    - push edi04A1AB0B - E8 88C00000           - call 04A26B98 ; GetPoints(arrayPoints[arrayPoints.Length - 1].position, pointHit, minDistance, target, ref arrayPoints)04A1AB10 - 83 C4 30              - add esp,3004A1AB13 - C7 47 30 00000000     - mov [edi+30],00000000 ; closeCheckPoint = 0/*--------------------------*/
[ENABLE]alloc(newmem,2048)label(returnhere)newmem:push ecxpush eaxmov ecx, [pTransformComponent]mov eax,[ecx]mov [esp+C], eax //pTransformComponent.Xmov eax,[ecx+4]mov [esp+10],eax //pTransformComponent.Ymov eax,[ecx+8]mov [esp+14],eax //pTransformComponent.Zpop eaxpop ecxcall 04A26B98 // в стек передаются уже координаты игрока, а не координаты первого желктого GameObject в дорожкеjmp returnhere04A1AB0B:jmp newmemreturnhere: [DISABLE]04A1AB0B:call 04A26B98//Alt: db E8 88 C0 00 00dealloc(newmem)
Ссылка на комментарий
Поделиться на другие сайты

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

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

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