[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 108 из 127«12106107108109110126127»
Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder и заказы (Вы можете получить ответы на вопросы по SB и сделать заказ)
Вопросы по скриптингу Sanny Builder и заказы
wmysterio
Администраторы
Скриптер
22.11.11 21:52
Offline
Если у вас возник вопрос по скриптингу Sanny Builder, обращайтесь! Мы постараемся решить вашу проблему wink Это ещё не значит, что все прям бросятся решать во чтобы то не стало, но ответ вы сможете вы получить как вариант решения или как невозможность или сложность решения.
УВАЖАЕМЫЕ ПОЛЬЗОВАТЕЛИ! ПРОСЬБА КОД СКРИПТОВ ПОМЕЩАТЬ В КОНСТРУКЦИЮ КОДА:

или

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

Внимание! От этого момента тема предназначена ещё и для заказов скриптов и миссий. Я это сделал по одной причине - пользователи постоянно путают/или не ищут темы и приводят заказ здесь. Теперь этой путаницы не будет. Здесь можно проводить заказы, но Вы должны указать в начале поста текст "НА ЗАКАЗ". Постарайтесь как можно детальнее объяснить суть скрипта.
Прикрепления: 0248203.png(1Kb) · 9085525.png(0Kb)

BoPoH
Друзья
24.10.14 00:07
Offline
Смещение 0xB9 - явно не количество субъектов, соприкасаемых с данным субъектом. Больше похоже на тип поверхности, с которой соприкасается субъект (ID типа коллизии).
0xBC - вроде как и правда субъекты, с которыми соприкасается данный субъект.
0xD8 - не совсем величина урона. Скорее сила, прикладываемая к субъекту каким-либо из других субъектов (либо сумма всех сил, действующих на субъект). Лично я взял за основу структуру педа игрока и начал бежать в стену. Это значение поднялось с нуля до ~5-10 единиц, т.е. примерно совпадает со скоростью игрока. Получается, что стена действует на игрока с этой силой (хотя тут наверное всё-таки скорость а не сила, ну да хер знает, мы не физики, вдаваться в подробности не будем), чтобы он оставался на месте).
В структурах конечно бывают пустоты. Всё зависит от того, по какому правилу было установлено выравнивание структуры. В SA вроде 4-байтное выравнивание. Следовательно, если мы объявим такую структуру:
Код
struct myStruct    
{
       BYTE a1;
       WORD a2;
       int a3;
};
И при этом будем использовать выравнивание в 4 байта, то между вордом и интом появится ещё один пустой байт - так формируются блоки по 4 байта, ведь того требует выравнивание.
Код
struct myStruct
{
       BYTE a1;
       WORD a2;
       BYTE pad;
       int a3;
};
Отсюда и появляются иногда поля-пустышки в структурах. С другой стороны - не факт, что там пустышка. Возможно, там есть какое-то используемое игрой значение длиной в байт. Просто те, кто писал статью с оффсетами, не смогли разобрать, что это за значение, поэтому не указали его в статье. Но это вовсе не значит, что там нет ничего или ворд вдруг начинает занимать 3 байта xD
Отредактировал BoPoH - Пятница, 24.10.14, 00:09

wmysterio
Администраторы
Скриптер
24.10.14 01:13
Offline
BoPoHСпасибо за ответ, друг. Теперь мне многое прояснилось! Кстати, может ты встречал похожие статьи с адресами?

BoPoH
Друзья
24.10.14 23:37
Offline
Цитата wmysterio ()
Кстати, может ты встречал похожие статьи с адресами?
Кроме той - нет. Обычно использую непосредственно структуры, описанные в базе IDA, разбираю функции, по ним дополняю и правлю структуры.
Всегда рад помочь)

Slivkin-Sergey
Модераторы
06.11.14 17:37
Offline
Вопрос немного, наверное, не по теме - а зачем вообще нужно это 4-байтное выравнивание?

Кстати, я пробовал в поле-пустышку в структуре актёра записать какое-то значение (не помню, какое, давно дело было) интовское, и потом считать его (пустышка занимала 4 байта). Но игра вела себя так, будто никакого числа там нет и в помине. Т.е., я так понимаю, не всё так просто, и без объявления элемента структуры в экзешнике ничего туда записываться не будет?

И вот ещё. Хотелось бы узнать, эта функция узнаёт позицию кости в матрице? Вынул из одного скрипта.

Код
:BONEPOS
0A96: 0@ = actor 0@ struct
0AA8: call_function_method 0x532B20 struct 0@ num_params 0 pop 0 33@
0@ += 0x18
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0AA7: call_function 0x734A40 num_params 1 pop 1 clump 0@ hier 10@
0AA7: call_function 0x7C51A0 num_params 2 pop 2 bone 1@ clump 10@ get_id 11@
10@ += 8
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
11@ *= 0x40
005A: 10@ += 11@  // (int)
0AC7: 12@ = var 2@ offset
0AC7: 13@ = var 20@ offset
0AA7: call_function 0x54EEF0 num_params 4 pop 4 offset 12@ matrix 10@ someint 1 out 13@ nop 14@   
0AB2: ret 3 20@ 21@ 22@


И если да, то в каком месте указывается номер кости?
Отредактировал Slivkin-Sergey - Четверг, 06.11.14, 18:00

wmysterio
Администраторы
Скриптер
07.11.14 01:20
Offline
Цитата Slivkin-Sergey ()
Вопрос немного, наверное, не по теме - а зачем вообще нужно это 4-байтное выравнивание?
для оптимизации работы процессора, имхо

BoPoH
Друзья
07.11.14 01:59
Offline
Цитата Slivkin-Sergey ()
И вот ещё. Хотелось бы узнать, эта функция узнаёт позицию кости в матрице? Вынул из одного скрипта.
Уточни, кто автор скрипта? Если я не ошибаюсь, эту функцию писал я для alexey1999.
Да, эта функция возвращает позицию кости.
Вызов её происходит следующим образом (если память мне не изменяет):

Код
0AB1: call_scm_func @BONEPOS 2 actor $PLAYER_ACTOR bone_id 5 get_pos 1@ 2@ 3@
Первый параметр - актёр. Второй - ид кости (не такой же, как для опкодов, которые крепят объект к кости).
Соответственно, в переменные 1@ 2@ 3@ мы получим позицию кости.
У этой функции есть один минус (точнее это минус scm-движка) - мы получаем позицию кости из предыдущего кадра.

Цитата Slivkin-Sergey ()
Кстати, я пробовал в поле-пустышку в структуре актёра записать какое-то значение (не помню, какое, давно дело было) интовское, и потом считать его (пустышка занимала 4 байта).
Пустышек в 4 байта не бывает. Если поле никак не названо/описано где-либо (в IDA или на каких-нибудь сайтах), это не значит, что это поле ни за что не отвечает. Возможно, то поле, которое ты проверял, используется игрой в редких особых случаях, поэтому ничего внешне не изменилось.
Цитата Slivkin-Sergey ()
Т.е., я так понимаю, не всё так просто, и без объявления элемента структуры в экзешнике ничего туда записываться не будет?
Не путай исходники и скомплированный екзешник.
Структура существует в исходниках. В машинном коде структур, как таковых, нет. Там есть чтение и запись в определённый адрес памяти. Структуры там выражаются в виде смещения от адреса объекта, которому соответствует данная структура. Т.е. в процессе компиляции программы, структура как-бы преобразуется в оффсеты. Каждому полю соответствует свой оффсет. Приведу пример. У нас есть структура на C++:

Код
struct MyStruct
{
      int a;
      int b;
      float c;
};

В данном случае у "a" будет оффет 0, у "b" будет оффсет 4, а у "c" - 8.
Приведу пример на SB, чтобы было яснее. К примеру у нас есть адрес объекта, структура которого - MyStruct. Его адрес записан в переменную 1@. Если мы захотим записать число 5 в поле "b", то нам нужно сделать следующее:

Код
1@ += 4 // помним, что у поля b оффсет 4
0A8C: write_memory 1@ size 4 value 5 virtual_protect 0

А если нам, например, захочется совершить сразу две операции? Записать число 1.5 в поле "c" и прочесть значение поля "b"?
Если не брать во внимание оптимизацию кода и сделать код более наглядным, то:
Код
0A8E: 2@ = 1@ + 8 // int
0A8E: 3@ = 1@ + 4 // int
0A8C: write_memory 2@ size 4 value 1.5 virtual_protect 0 // запишем 1.5 в поле c
0A8D: 4@ = read_memory 3@ size 4 virtual_protect 0 // прочтём значение поля b в переменную 4@

Но иногда использовать кучу дополнительных переменных нельзя. Тогда можно оптимизировать код:

Код
1@ += 8
0A8C: write_memory 2@ size 4 value 1.5 virtual_protect 0 // запишем 1.5 в поле c
1@ -= 4
0A8D: 4@ = read_memory 3@ size 4 virtual_protect 0 // прочтём значение поля b в переменную 4@

Так мы сэкономили переменные, хотя код стал менее читаемым. В таких случаях, чтобы не забыть, можно оставить комментарий к коду (ваш кэп).

Цитата Slivkin-Sergey ()
Вопрос немного, наверное, не по теме - а зачем вообще нужно это 4-байтное выравнивание?
Это своего рода оптимизация. Судя по тому, что я откопал в гугле, невыровненные структуры занимают больше процессорного времени и больше обращений к оперативной памяти. Впрочем, речь идёт о наносекундах, так что если обращений не миллионы в секунду, то отсутствие выравнивания не критично.
Отредактировал BoPoH - Пятница, 07.11.14, 02:07

Slivkin-Sergey
Модераторы
07.11.14 06:25
Offline
Цитата BoPoH ()
Возможно, то поле, которое ты проверял, используется игрой в редких особых случаях, поэтому ничего внешне не изменилось.

А почему я не могу использовать поле в своих целях, пока оно не используется игрой?
Цитата BoPoH ()
Не путай исходники и скомплированный екзешник.

Я как раз имел ввиду исходники. Но вот про организацию структур в машинном коде не знал. Если это происходит примерно так (синтаксис плохой, но суть такая):
Код
mov EAX,[var+02C] // var - структура, 02C - смещение элемента (цифра с потолка) относительно начала структуры

то, получается, можно и в ассемблере создавать некие подобия структур.
Цитата BoPoH ()
Уточни, кто автор скрипта? Если я не ошибаюсь, эту функцию писал я для alexey1999.

Так точно.
А выравнивание - это #pragma pack, верно?
Отредактировал Slivkin-Sergey - Пятница, 07.11.14, 06:26

BoPoH
Друзья
08.11.14 00:04
Offline
Цитата Slivkin-Sergey ()
А почему я не могу использовать поле в своих целях, пока оно не используется игрой?
Ты ж не знаешь, когда оно используется, а когда нет. Если знаешь - тогда можно. И можно только тогда, когда не используется игрой.

Цитата Slivkin-Sergey ()
Если это происходит примерно так (синтаксис плохой, но суть такая) то, получается, можно и в ассемблере создавать некие подобия структур.
 Если писать программы на ассемблере, там есть возможность объявления структур. И выглядит это, кажется, примерно так:

Код
mov EAX, [var+MyStruct.field_1]
В процессе компиляции выражение MyStruct.field_1 будет преобразовано в соответствующий оффсет.
Когда же мы используем средства реверс-инжиниринга (например IDA), то у нас нет данных о структурах. Поэтому там пишется непосредственно сам оффсет (как ты и показал).
Цитата Slivkin-Sergey ()
А выравнивание - это #pragma pack, верно?
Да, это выравнивание для конкретной структуры, которая заключена в эту прагму. Выравнивание для всех остальных структур проекта определяется настройками проекта. В Visual Studio их можно найти так:
Проект -> Свойства -> Свойства конфигурации -> C/C++ -> Создание кода -> Выравнивание членов структур
Отредактировал BoPoH - Суббота, 08.11.14, 00:05

Slivkin-Sergey
Модераторы
10.11.14 19:49
Offline
2Рас недавно выкладывал конструктор CPool:
Цитата DK22Pac ()
void CPool{
this -> m_Objects = new B[maxCount]; // Выделяем память под массив обьектов
this -> m_ByteMap = new tPoolObjectFlags[maxCount]; // выделяем память под массив флагов для обьектов
this -> m_bInitialized = true;
this -> m_Size = maxCount;
this -> m_Top = -1;
for(int i = 0; i < maxCount; i++)
this -> m_ByteMap[i].bIsFreeSlot = true;
}


Меня интересует, как можно выделить один массив под флаги объектов и жить спокойно, если у объекта их явно >1 (взрывоустойчивость, физика...)? Сомневаюсь, что флаги хранятся в битах элементов, т.к. не припомню такого в БД адресов памяти.

BoPoH
Друзья
11.11.14 02:13
Offline
Цитата Slivkin-Sergey ()
Меня интересует, как можно выделить один массив под флаги объектов и жить спокойно, если у объекта их явно >1 (взрывоустойчивость, физика...)? Сомневаюсь, что флаги хранятся в битах элементов, т.к. не припомню такого в БД адресов памяти.
Во-первых, обычно флаги в битах и хранятся. Во-вторых, в данном случае речь идёт не о флагах объектов, как о физических объектах, а как об объектах структуры.
Рассмотрим структуру tPoolObjectFlags:

Код
struct tPoolObjectFlags
{
         char seed : 7;                  // used to validate SCM handles
         char bIsFreeSlot : 1;
};
Она занимает один байт, т.к. первые 7 битов используются под поле seed, а последний - под флаг, из которого можно узнать, используется ли слот.
Отредактировал BoPoH - Вторник, 11.11.14, 02:16

Slivkin-Sergey
Модераторы
12.11.14 20:45
Offline
Ладно-с, потом на досуге поразмыслю над этим. Сейчас возник другой вопрос. Когда я ставлю актёру анимацию, а в опред. момент анимации даю ему оружие/объект, то он не воспроизводит анимацию вообще. Делает, только если сразу дать что-то. А сразу - вообще никак нельзя, в анимации персонаж берёт оружие со стола, если ему сразу дать ствол - глупо будет смотреться. Есть ли какая-то лазейка? Тактику давания невидимого объекта с последующим деланьем его видимым пробовал. Итог тот же - нет анимации, и всё тут.
Отредактировал Slivkin-Sergey - Среда, 12.11.14, 20:51

BoPoH
Друзья
13.11.14 02:22
Offline
Цитата Slivkin-Sergey ()
Когда я ставлю актёру анимацию, а в опред. момент анимации даю ему оружие/объект
Как ты даёшь ему объект? Опкодом 070A? Он же сам по себе как-бы воспроизводит актёру анимацию, не удивительно, что твоя анимация сбрасывается.
А вот насчёт оружия - довольно странно.
Можно попробовать дать оружие в самом начале, но "скрыть" его:

Код
01B9: set_actor 2@ armed_weapon_to 0
А в нужный момент тем же опкодом вернуть ему оружие в руки.
Отредактировал BoPoH - Четверг, 13.11.14, 02:22

Slivkin-Sergey
Модераторы
21.11.14 18:55
Offline
Отбой. Выгрузка и загрузка файла анимаций повторно всё решила 0_о.

Добавлено (21.11.14, 17:55)
---------------------------------------------
Ещё один вопросец возник. Возможно ли сделать так, чтоб игрок не мог двигаться, но при этом можно было вращать мышкой и оглядываться?

Отредактировал Slivkin-Sergey - Четверг, 13.11.14, 11:09

BoPoH
Друзья
22.11.14 13:34
Offline
Цитата Slivkin-Sergey ()
Возможно ли сделать так, чтоб игрок не мог двигаться, но при этом можно было вращать мышкой и оглядываться?
Можно, но только занопив процесс обработки эвентов клавиатуры и мыши. Т.е. нопим так:

Код
0A8C: write_memory 0x541DF5 size 0x90 value 5 virtual_protect 1
0A8C: write_memory 0x541DFF size 0x90 value 5 virtual_protect 1

А восстанавливаем так:

Код
0A8C: write_memory 0x541DF5 size 0xFEF346E8 value 4 virtual_protect 1
0A8C: write_memory 0x541DF9 size 0xFF value 1 virtual_protect 1
0A8C: write_memory 0x541DFF size 0xFEF69CE8 value 4 virtual_protect 1
0A8C: write_memory 0x541E03 size 0xFF value 1 virtual_protect 1

Slivkin-Sergey
Модераторы
22.11.14 14:02
Offline
Спасибо, полезно. Пригодится для всяких небольших сценок.
Кстати, ещё такой вопрос: LockInCurrentPosition замораживает текущий кадр анимации актёра, или только координаты и угол разворота? Просто интересно, как ты так нашаманил, что в том зимнем моде актёры застывают.
И ещё довольно интересно, как сделать проверку, выстрелил ли игрок в актёра, которая будет работать даже без прицела (!).

Блин, BoPoH, откуда ты знаешь столько адресов и функций?! Это же нереально столько всего держать в голове!
Отредактировал Slivkin-Sergey - Суббота, 22.11.14, 14:03

BoPoH
Друзья
22.11.14 17:29
Offline
Цитата Slivkin-Sergey ()
Кстати, ещё такой вопрос: LockInCurrentPosition замораживает текущий кадр анимации актёра, или только координаты и угол разворота?
Нет, LockInCurrentPosition никак не влияет на анимацию актёра, точнее даже наоборот - сбрасывает её.
Цитата Slivkin-Sergey ()
И ещё довольно интересно, как сделать проверку, выстрелил ли игрок в актёра, которая будет работать даже без прицела (!).
Можно так:

Код
051A:   actor 1@ damaged_by_actor $PLAYER_ACTOR

Хотя, это будет работать не только для выстрелов, а для любого урона, который актёр нанесёт другому актёру.

Цитата Slivkin-Sergey ()
Просто интересно, как ты так нашаманил, что в том зимнем моде актёры застывают.
О каком зимнем моде идёт речь?

Цитата Slivkin-Sergey ()
Блин, BoPoH, откуда ты знаешь столько адресов и функций?! Это же нереально столько всего держать в голове!
Я же не запоминаю адреса функций. Адреса я беру из базы в IDA. А помню я только примерное имя и расположение некоторых основных функций.

Slivkin-Sergey
Модераторы
22.11.14 22:17
Offline
Цитата BoPoH ()
О каком зимнем моде идёт речь?

Который ты делал для Alexey1999.

Добавлено (22.11.14, 19:19)
---------------------------------------------

Цитата BoPoH ()
051A:   actor 1@ damaged_by_actor $PLAYER_ACTOR

o_0 Это новый опкод CLEO 4? Первый раз его вижу.

Добавлено (22.11.14, 21:17)
---------------------------------------------
Кстати, ещё вопросец. Я когда хочу, чтобы актёр выполнял анимацию во время ходьбы, вызываю 0605 (в остальных случаях - 0812). Но он останавливается и отказывается идти дальше по окончанию анимации. Это так и задумано, или мою ГТАшку опять клинит?

Цитата BoPoH ()
0A8C: write_memory 0x541DF9 size 0xFF value 1 virtual_protect 1

Цитата BoPoH ()
0A8C: write_memory 0x541E03 size 0xFF value 1 virtual_protect 1

А это что за адреса, их же не нопили? Они как-то связаны с обработкой эвентов?

BoPoH
Друзья
23.11.14 06:58
Offline
Цитата Slivkin-Sergey ()
Который ты делал для Alexey1999.
Я ему лишь помог по части хранения данных в памяти. Основную часть скрипта он писал сам.
Кстати, там используется просто несколько рандомных анимаций "заморозки" для актёров.

Цитата Slivkin-Sergey ()
o_0 Это новый опкод CLEO 4? Первый раз его вижу.
Вовсе нет. Стандартный, игровой.

Цитата Slivkin-Sergey ()
Кстати, ещё вопросец. Я когда хочу, чтобы актёр выполнял анимацию во время ходьбы, вызываю 0605 (в остальных случаях - 0812). Но он останавливается и отказывается идти дальше по окончанию анимации. Это так и задумано, или мою ГТАшку опять клинит?
Попробуй 0A1A.

Цитата Slivkin-Sergey ()
А это что за адреса, их же не нопили? Они как-то связаны с обработкой эвентов?
Нопили. Смотри внимательно. Мы нопили 5 байтов, соответственно восстановить должны тоже 5.

Slivkin-Sergey
Модераторы
25.11.14 16:39
Offline
Цитата BoPoH ()
Кстати, там используется просто несколько рандомных анимаций "заморозки" для актёров.

Это как, анимация заморозки?
Цитата BoPoH ()
Я ему лишь помог по части хранения данных в памяти.

В смысле массив замороженных педов?
Цитата BoPoH ()
0A8C: write_memory 0x541E03 size 0xFF value 1 virtual_protect 1

Вот тут кстати точно не надо size и value менять местами?

BoPoH
Друзья
25.11.14 20:52
Offline
Цитата Slivkin-Sergey ()
Вот тут кстати точно не надо size и value менять местами?
Ох лооол :DD
Везде поменяй size и value местами biggrin
Эпик фэйл biggrin
Цитата Slivkin-Sergey ()
В смысле массив замороженных педов?
Да.
Цитата Slivkin-Sergey ()
Это как, анимация заморозки?
Ну он сделал несколько своих анимаций, где педы стоят в одной позе.

Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder и заказы (Вы можете получить ответы на вопросы по SB и сделать заказ)
Страница 108 из 127«12106107108109110126127»
Поиск: