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

Поиск длинны поражения


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

Эм... А конкретнее можно? Что за игра?

Я конечно таким вопросом никогда не задавался, но... можно попробовать менять оружие и в СЕ использовать поиск по типу "Изменилось/Не изменилось",

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

Эм... А конкретнее можно? Что за игра?

Я конечно таким вопросом никогда не задавался, но... можно попробовать менять оружие и в СЕ использовать поиск по типу "Изменилось/Не изменилось",

The Elder Scrolls Oblivion - пытаюсь найти длинну меча.

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

/*---------------------------------------------------------------------------*/

Привет!

Скорее всего, это свойство самого оружия, т.е. искать надо в структуре,

которая его описывает. Скажем, если у персонажа в руках лук, то для него

задаётся количество стрел, скорострельность, дальность полёта стрелы и так

далее. Для оружия ближнего боя должна задаваться "длина" оружия, то есть

расстояние между тобой и противником, на котором это оружие противника

достанет. Искать это можно несколькими способами:

1. Найти оружие, используя структуру самого персонажа. Скажем, найти здоровье,

а дальше смотреть, какие инструкции пишут и читают это значение, обнаружится

инструкция вроде этой:

MOV EAX, [EBX+0x456]

Здесь в EBX будет храниться указатель на структуру персонажа, а 0x456 -

смещение в этой структуруре до его здоровья. Где-то в ней же может быть и

структура, описывающая текущее выбранное персонажем оружие, а уже в ней можно

и "длину" поискать.

/*---------------------------------------------------------------------------*/

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

Привет!

Скорее всего, это свойство самого оружия, т.е. искать надо в структуре, которая его описывает. Скажем, если у персонажа в руках лук, то для него задаётся количество стрел, скорострельность, дальность полёта стрелы и так далее. Для оружия ближнего боя должна задаваться "длина" оружия, то есть расстояние между тобой и противником, на котором это оружие противника достанет. Искать это можно несколькими способами:

1. Найти оружие, используя структуру самого персонажа. Скажем, найти здоровье, а дальше смотреть, какие инструкции пишут и читают это значение, обнаружится инструкция вроде этой:

MOV EAX, [EBX+0x456]

Здесь в EBX будет храниться указатель на структуру персонажа, а 0x456 - смещение в этой структуруре до его здоровья. Где-то в ней же может быть и структура, описывающая текущее выбранное персонажем оружие, а уже в ней можно и "длину" поискать.

Спасибо попробую!

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

Привет!

Скорее всего, это свойство самого оружия, т.е. искать надо в структуре, которая его описывает. Скажем, если у персонажа в руках лук, то для него задаётся количество стрел, скорострельность, дальность полёта стрелы и так далее. Для оружия ближнего боя должна задаваться "длина" оружия, то есть расстояние между тобой и противником, на котором это оружие противника достанет. Искать это можно несколькими способами:

1. Найти оружие, используя структуру самого персонажа. Скажем, найти здоровье, а дальше смотреть, какие инструкции пишут и читают это значение, обнаружится инструкция вроде этой:

MOV EAX, [EBX+0x456]

Здесь в EBX будет храниться указатель на структуру персонажа, а 0x456 - смещение в этой структуруре до его здоровья. Где-то в ней же может быть и структура, описывающая текущее выбранное персонажем оружие, а уже в ней можно и "длину" поискать.

Значение "длинны" может быть float или по стандарту 4 байта?

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

/*---------------------------------------------------------------------------*/

Каким угодно, на самом деле. Скорее всего, оно будет ещё и не в пикселях

каких-нибудь или метрах, а в игровой мере длины, скажем, в юнитах.

PS: 1024-е сообщение на форуме!

/*---------------------------------------------------------------------------*/

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

/*---------------------------------------------------------------------------*/

Каким угодно, на самом деле. Скорее всего, оно будет ещё и не в пикселях

каких-нибудь или метрах, а в игровой мере длины, скажем, в юнитах.

PS: 1024-е сообщение на форуме!

/*---------------------------------------------------------------------------*/

Запутался :-D

Нашел скорость меча, а дальности даже близко не вижу.

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

/*---------------------------------------------------------------------------*/

Ну, по идее, логика там должна быть примерно следующая (в руках меч):

1. Нажали левую кнопку мыши

2. Начинаем анимацию замаха мечом.

3. Проверяем, что на некотором расстоянии от нас (заданном в свойствах меча)

есть нечто, а не просто пустое место.

4. Если есть, то играем звук удара по соответствующему предмету.

5. Наносим предмету урон (пытаемся, как минимум).

Вот тебе, собственно, надо в отладчике (или в долгом созерцании структуры

меча) надо найти пункт три, а точнее - расстояние из этого пункта. Выглядеть

это должно как-то так:

MOV  EBX,[ECX+0x456] ; В EBX кладём "длину меча", ECX - его структура
CMP EBX,EDI ; Сравниваем длину меча с расстоянием до противника в EDI
JNE 0x3475869 ; Если не равны - то переходим в другое место
PUSH EBX ; Иначе - берём всякие аргументы
PUSH EDX ; всякие аргументы
CALL 0x7685757 ; и вызываем функцию нанесения урона

/*---------------------------------------------------------------------------*/

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

/*---------------------------------------------------------------------------*/

Ну, по идее, логика там должна быть примерно следующая (в руках меч):

1. Нажали левую кнопку мыши

2. Начинаем анимацию замаха мечом.

3. Проверяем, что на некотором расстоянии от нас (заданном в свойствах меча)

есть нечто, а не просто пустое место.

4. Если есть, то играем звук удара по соответствующему предмету.

5. Наносим предмету урон (пытаемся, как минимум).

Вот тебе, собственно, надо в отладчике (или в долгом созерцании структуры

меча) надо найти пункт три, а точнее - расстояние из этого пункта. Выглядеть

это должно как-то так:

MOV  EBX,[ECX+0x456] ; В EBX кладём "длину меча", ECX - его структура
CMP EBX,EDI ; Сравниваем длину меча с расстоянием до противника в EDI
JNE 0x3475869 ; Если не равны - то переходим в другое место
PUSH EBX ; Иначе - берём всякие аргументы
PUSH EDX ; всякие аргументы
CALL 0x7685757 ; и вызываем функцию нанесения урона

/*---------------------------------------------------------------------------*/

Вот это уже интересней) Продолжаю поиск

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

Предположительно есть множество способов выяснить дистанцию. Первый способ для нуба, второй для не нуба.

Способ 1. Когда дистанция поражения постоянная или постоянная для определенного оружия

1. Находим адрес координат противника

2. Находит адрес координат героя

3. Находим адрес здоровья противника

4. Вычисляем по формуле дистанцию от точки а до точки b


public static float Distance (Vector3 a, Vector3 b )
{
Vector3 vector = new Vector3 (a.x - b.x, a.y - b.y, a.z - b.z);
return Mathf.Sqrt (vector.x * vector.x + vector.y * vector.y + vector.z * vector.z);
}

5. Далее смотрим на здоровье противника, отходим, подходим, пытаемся поразить противника по метру меняя положение. Надеюсь противник сразу не умрет. Если умрет, то поставить ему заморозку на адрес здоровья.

6. Так для каждого оружия дистанцию и запоминаем.

Способ 2. Когда дистанция определяется через Отладчик

1. Ставим в Олли бряк на функцию выстрела

2. Ставим бряк на функцию уменьшения здоровья

3. Стреляем. Прерываемся на функции выстрела.

4. Ставим трейс по ретам.

5. Отпускаем процесс по F5

6. Попадем в противника, прерываемся на его адресе здоровья.

7. Отпускаем по F5 и должны оказаться на развилке условия, которое ведет в рутину нанесения урона.

Скорее всего ты будешь в цикле, в котором сравниваются позиции по дистанции, ну или где-то выше при выходе из call-ов

В случае со стрельбой, то массивы коллизий собираются лучом через рейкаст.Пример. (на основе PhysX Nvidia встроенного в Unity3d)

Один из них будет адресом координат героя, второй вектор направления, а третий дистанция луча. Вот эта дистанция и будет искомой.


using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update() {
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F); //100.0F - дистанция
int i = 0;
while (i < hits.Length) {
RaycastHit hit = hits[i];
Renderer renderer = hit.collider.renderer;
if (renderer) {
renderer.material.shader = Shader.Find("Transparent/Diffuse");
renderer.material.color.a = 0.3F;
}
i++;
}
}

В дизассемблерном представлении будет, конечно, иначе. Если какие-то трудности, то пиши примеры на С++ DirectX с либами от PhysX Nvidia и исследуй их в отладке студии. Там все будет и код высокого уровня и код низкого уровня. Это будет подсказкой в исследовании своего же примера по дистанции для обучения с Олли.

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

Вот ведь фантазия у людей - длина меча... я даже в теории не могу себе представить как это работает, но наверняка цифрового значения длины меча в игре просто нет. Хотя, например, в Сталкере вроде бы был чит на супер нож (он у меня так и не заработал), но там всё сделано через внутриигровые lua скрипты правкой соответствующего значения. Скучно и неинтересно... Как вариант можно скачать исходные коды на C++ какой-нибудь RPG, например, Arx Fatalis, и поковыряться в них. Но это место в коде ещё найти надо умудриться.... и если что-то в получится в AF пробовать экспериментировать с Oblivion. Для Обливиона кстати тоже есть редактор игры, может быть там что-то есть? Если там есть длина меча, значит можно попытаться найти её.

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

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

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

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