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

или

Также указывайте полный код скрипта, иначе причина ошибок может быть и не выявлена.
Прикрепления: 0248203.png(0.9 Kb) · 9085525.png(0.2 Kb)

BoPoH
Друзья
05.05.14 20:43
Offline
Цитата Slivkin-Sergey ()
И нет, это не опкод, а команда Alloc().
Опс, и вправду, это я перепутал. Alloc присваивает указанной глобальной переменной определённый номер. Все глобальные переменные имеют определённый номер.
Скажем, Alloc($VAR, 40) будет всё равно, что ты будешь вместо $VAR использовать $40. В справке об этом подробнее написано.

Slivkin-Sergey
Модераторы
06.05.14 14:59
Offline
Как занопить адрес памяти?

Добавлено (06.05.14, 13:59)
---------------------------------------------
Отбой, записал обычный ноль.


BoPoH
Друзья
06.05.14 21:13
Offline
Цитата Slivkin-Sergey ()
Как занопить адрес памяти?
Ну, вообще-то понятия "занопить" и "записать ноль" сильно различаются. NOP - это инструкция, которую процессор игнорирует. Её код - 0x90. Вероятно, тебе нужно было просто очистить участок памяти, раз уж нули подошли  smile

HeKpAcoB
Пользователи
11.05.14 23:43
Offline
Каким опкодом можно заставить вернуться актера на заданные координаты?К примеру ввязался актер в перестрелку и убежал от своих координат и остался стоять на том месте куда бежал.

BoPoH
Друзья
11.05.14 23:58
Offline

Код
05D3: AS_actor $PLAYER_ACTOR goto_point 681.8004 -474.1063 15.5363 mode 4 time 3000 ms // versionA

Не подойдёт?

wmysterio
Администраторы
Скриптер
12.05.14 00:20
Offline
Цитата HeKpAcoB ()
Каким опкодом можно заставить вернуться актера на заданные координаты?
Есть много вариантов решения. Нужно смотреть по-ситуации.

К примеру эти:
Код
05DC: AS_actor 94@ run_away_from_point 2336.399 -18.3093 25.4766 stop_at_radius 30.0 timelimit 8000
07CD: AS_actor 80@ walk_to 362.2674 -2035.844 6.836 stop_with_angle 270.0 within_radius 4.0
0804: AS_actor 95@ walk_to 2351.97 -1170.26 27.013 angle 0.0 radius 0.2 animation "GRLFRD_KISS_03" IFP_file "BD_FIRE" rate 4.0 LA 0 LX 0 LY 0 LF 0 LT -1
00A1: put_actor $PLAYER_ACTOR at 345.5621 306.2212 998.4484
К примеру, если нужно, чтобы актёр всегда следовал за актёром, но возникают всякие усложнения, то проще использовать 00A1 а затем снова активировать следование.

HeKpAcoB
Пользователи
12.05.14 01:40
Offline
Спасибо за ответы.

Slivkin-Sergey
Модераторы
16.05.14 20:37
Offline
Меня интересует этот адрес:
Цитата
CPed +0x568 = [dword]Текущая машина, с которой вы находитесь в контакте

Как им воспользоваться, чтоб получить непосредственно хэндл авто? Чтение адреса в лоб ничего не дало (кроме, как я понял, структуры машины).
Отредактировал Slivkin-Sergey - Пятница, 16.05.14, 20:37

BoPoH
Друзья
16.05.14 22:32
Offline
Цитата Slivkin-Sergey ()
Как им воспользоваться, чтоб получить непосредственно хэндл авто?
Код
0AEB: $car = car_struct $vehicle_struct handle

Slivkin-Sergey
Модераторы
18.05.14 19:52
Offline
Спасибо. Ещё такой вопрос (довольно важный для меня).
Цитата
0xB7CD98 - Указатель на игрока, прямое смещение на начало пула пешеходов (педов) (CPed)

И при этом написано, что каждый пед - это объект размером 1988 (0x7C4) байт. Теперь ситуация:

Игрок появляется в интерьере дома Карла. Соответственно, ни одной души, кроме игрока. Я создал скриптом актёра 1. По логике вещей, он заполняет ячейку 1 в массиве (нулевую ячейку, как я понял, занимает игрок). Внимание, вопрос: получу ли я адрес структуры актёра 1, если к 0xB7CD98 прибавлю 0x7C4, т.е. размер одного педа? В данном случае по логике вещей я с начала пула сдвигаюсь на одну структуру вперёд.

Добавлено (18.05.14, 18:52)
---------------------------------------------
Или мне нужно оперировать с этим адресом:

Цитата
0xB74490 - Содержит указатель на указатель. Этот указатель:
+0 = Содержит указатель на первый элемент в пуле CPed

?
Отредактировал Slivkin-Sergey - Воскресенье, 18.05.14, 19:48

SHooZ
Друзья
19.05.14 00:05
Offline
Цитата Slivkin-Sergey ()
Соответственно, ни одной души, кроме игрока
это при условии, что у тебя чистый маин и нет никаких актёров созданных в других интерьерах.
По логике, да 0xB7CD98+0x7C4 должно содержать тот же указатель, что и 0xB74490+0x7C4, но только в твоем случае.
Отредактировал SHooZ - Понедельник, 19.05.14, 00:07

BoPoH
Друзья
19.05.14 17:19
Offline
Вы, ребята, ошибаетесь. Точнее, ошибка в описании адресов. Хотя и в рассуждениях тоже есть ошибки.
Чтобы получить указатель на игрока, нужно прочесть адрес 0xB7CD98. Это вовсе не пул педов, здесь содержится только указатель на игрока. Пул педов находится по адресу 0xB74490, но это лишь указатель на пул, не на массив педов. К тому же, у игрока нет чёткой привязанности к нулевой ячейке массива.
Если уж тебе нужно получить структуру конкретного педа, то лучше это делать опкодом 0A96. Нет никакой гарантии, что в пуле под индексом 1 будет находиться именно созданный тобой пед. Если заново загрузишь игру, к примеру, то индекс его будет, скорее всего, другим. Проще говоря, нельзя опираться на индексы в пуле. Нужно иметь либо скриптовый хендл, либо указатель на педа, чтобы работать с гарантированно конкретным педом.
Если же тебя интересует, как добраться до педа с определённым индексом в пуле, то тебе нужно прочесть значение по адресу 0xB74490, а затем прочесть значение по полученному адресу. Затем прибавить 0x7C4 умноженное на индекс педа. Это и будет указатель на педа. В коде это будет выглядеть так:
Код
0@ = 55 // индекс педа в массиве
0A8D: 1@ = read_memory 0xB74490 size 4 virtual_protect 0
0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0
0@ *= 0x7C4
005A: 2@ += 0@  // Теперь в 2@ содержится указатель на педа
Не стоит забывать, что указатель может вести на педа, который не был создан, или был удалён. Можно это проверить, прочитав значение по адресу 2@ + 0x18. Если прочитанное значение равно нулю, значит пед не существует. В любом случае, работа с пулом нужна обычно очень редко, когда нужно найти педа, подходящего под определённые параметры. В случае работы с конкретными педами, не стоит прибегать к использованию пула.

Slivkin-Sergey
Модераторы
19.05.14 20:51
Offline
BoPoH, я позже прикреплял к сообщению этот адрес. И что такое пул, если не что-то вроде массива?
А суть как раз в том, что ты упомянул: нужно просканировать весь массив пешеходов, применить к каждому найденному ряд проверок, и выловить подходящего.

Добавлено (19.05.14, 19:07)
---------------------------------------------
Цитата BoPoH ()
Нет никакой гарантии, что в пуле под индексом 1 будет находиться именно созданный тобой пед.

Никаких модов и т.п. не подразумевалось. ТОЛЬКО игрок и АКТЁР.

Добавлено (19.05.14, 19:51)
---------------------------------------------
А, стой, погоди, я сейчас, кажется, понял... Ты имеешь ввиду, что если в пуле нет ни одного актёра (кроме Карла), то следующий созданный актёр может занять ЛЮБОЙ свободный индекс, а не строго 1 и т.д. первый свободный?

Отредактировал Slivkin-Sergey - Понедельник, 19.05.14, 20:08

SHooZ
Друзья
20.05.14 00:04
Offline
Цитата Slivkin-Sergey ()
И что такое пул
пул - набор готовых к созданию объектов.
Цитата Slivkin-Sergey ()
нужно просканировать весь массив пешеходов, применить к каждому найденному ряд проверок, и выловить подходящего.
Можешь дать код, в котором появляется такая проблема?
Цитата BoPoH ()
Вы, ребята, ошибаетесь.
Можно ли заставить игру обрабатывать актёра как педа определенного типа, но при этом не затирая флага его уникальности(то бышь, чтоб он потом не выгрузился с памяти)?

Slivkin-Sergey
Модераторы
20.05.14 06:35
Offline
Цитата SHooZ ()
Можешь дать код, в котором появляется такая проблема?

Какая проблема? Мне просто нужно из существующих педов выбрать подходящего. Например, с определённой моделью.
Цитата SHooZ ()
пул - набор готовых к созданию объектов.

А поподробнее?

SHooZ
Друзья
20.05.14 16:21
Offline
Цитата Slivkin-Sergey ()
Какая проблема? Мне просто нужно из существующих педов выбрать подходящего. Например, с определённой моделью.
Так это легко делается и стандартными опкодами

Код
{$CLEO .cs}
0000:  
while true
   wait 0
   if
     0AE1: 0@ = random_actor_near_point 0.0 0.0 0.0 in_radius 100000.0 find_next 0 pass_deads 1 //IF and SET
   then
     repeat
         if
             02F2:   actor 0@ model == #BALLAS1
         then
             marker.CreateAboveActor(1@,0@)
         end  
     until  8AE1: not 0@ = random_actor_near_point 0.0 0.0 0.0 in_radius 100000.0 find_next 1 pass_deads 1 //IF and SET
   else
end
Цитата Slivkin-Sergey ()
А поподробнее?
Туда помещаются инициализированные объекты, но не факт, что на данный момент они есть в игре

Slivkin-Sergey
Модераторы
20.05.14 20:29
Offline
Цитата SHooZ ()
Так это легко делается и стандартными опкодами

По обстоятельством мне нужно применять именно массив педов.
Цитата SHooZ ()
Туда помещаются инициализированные объекты, но не факт, что на данный момент они есть в игре

А можно пример кода в SB, после выполнения которого актёр становится "инициализированным, но не факт, что на данный момент есть в игре"? Просто я не очень понимаю что именно имеется ввиду.
---
Погодите... То есть получается, что максимальное число одновременно существующих педов в массиве не 140?

Добавлено (20.05.14, 19:29)
---------------------------------------------
Кстати, это правда, что при помощи создания в потоке hex-буфера можно хранить в нём данные, экономя переменные? Тогда два вопроса: как высчитывать до него смещение от указателя на метку, и можно ли в этом буфере хранить, например, строки? Будут ли адекватно считываться интовские данные посредством обычного read_memory?
Отредактировал Slivkin-Sergey - Вторник, 20.05.14, 20:31

BoPoH
Друзья
21.05.14 20:11
Offline
Цитата Slivkin-Sergey ()
Погодите... То есть получается, что максимальное число одновременно существующих педов в массиве не 140?
Всё верно, 140.

Цитата Slivkin-Sergey ()
Мне просто нужно из существующих педов выбрать подходящего. Например, с определённой моделью.
Недавно писал такую scm-функцию. Вот она:

Код
:EnableActorsCollision // 0AB1: @EnableActorsCollision 0
actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@)
0A8D: 10@ = read_memory 0xB74490 size 4 virtual_protect 0 // CPed Pool
0A8D: 11@ = read_memory 10@ size 4 virtual_protect 0 // CPed Array
10@ += 8
0A8D: 12@ = read_memory 10@ size 4 virtual_protect 0 // CPed Number
12@ -= 1

for 4@ = 0 to 12@
      0085: 5@ = 4@
      5@ *= 0x7C4
      5@ += 0x18
      005A: 5@ += 11@
      0A8D: 6@ = read_memory 5@ size 4 virtual_protect 0 // RwObject
      if
      6@ > 0
      then
          5@ -= 0x18
          0AEA: 7@ = actor_struct 5@ handle // Получаем скриптовый хендл педа
          if and
          87D6: not 7@ == $PLAYER_ACTOR // ставим необходимые проверки
          80DF: not actor 7@ driving
          then
              0619: enable_actor 7@ collision_detection 1 // производим необходимое действие с педом
          end
      end
end
0AB2: ret 0

Она была предназначена для отключения коллизии всем педам не в машине, кроме игрока.

Цитата Slivkin-Sergey ()
Кстати, это правда, что при помощи создания в потоке hex-буфера можно хранить в нём данные, экономя переменные? Тогда два вопроса: как высчитывать до него смещение от указателя на метку, и можно ли в этом буфере хранить, например, строки? Будут ли адекватно считываться интовские данные посредством обычного read_memory?
Да, можно. Лично я в своё время делал специальные scm-функции для чтения и записи в буфер. Например такие:


Код
:ReadBuffer // 0AB1: @ReadBuffer 1 variable 10 get_to 0@
0AC6: 10@ = label @HexBuffer offset
0@ *= 4
005A: 0@ += 10@
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
0AB2: ret 1 value 1@

:WriteBuffer // 0AB1: @WriteBuffer 2 variable 10 value 0@
0AC6: 10@ = label @HexBuffer offset
0@ *= 4
005A: 0@ += 10@
0A8C: write_memory 0@ size 4 value 1@ virtual_protect 0
0AB2: ret 0

:HexBuffer
hex
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
end

Строки, в принципе тоже можно хранить. Но использовать придётся чуток по-другому, либо юзать для каждой строки отдельный буфер.
Отредактировал BoPoH - Среда, 21.05.14, 20:11

Slivkin-Sergey
Модераторы
22.05.14 12:17
Offline
А очищается ли этот буфер при выходе из игры или перезагрузке?..

Ещё такой вопрос. Хочу использовать hex...end в качестве asm'а. Но почему-то у меня не идут команды, продемонстрированные в соответствующей теме на SB форуме. Иными словами: например, если у Симэна call = E8, то у меня такое уже не идёт. С этим как-то сам ассоциируется факт, что "ассемблер зависит от архитектуры компьютера". Можно ли с этим что-то сделать, или надо компилировать __asm вставки в С и ворошить Хекс Редактором? Но ведь в таком случае скрипт может отказаться работать у некоторых.
Отредактировал Slivkin-Sergey - Четверг, 22.05.14, 12:17

BoPoH
Друзья
22.05.14 20:47
Offline
Цитата Slivkin-Sergey ()
А очищается ли этот буфер при выходе из игры или перезагрузке?..
Этот буфер по сути - часть скрипта, поэтому он выгружается и загружается вместе со скриптом.
Цитата Slivkin-Sergey ()
Хочу использовать hex...end в качестве asm'а. Но почему-то у меня не идут команды, продемонстрированные в соответствующей теме на SB форуме. Иными словами: например, если у Симэна call = E8, то у меня такое уже не идёт. С этим как-то сам ассоциируется факт, что "ассемблер зависит от архитектуры компьютера".
Что у Симэна, что у других - одно и то же. Все компьютеры, на которых нормально работают винда и все остальные программы, поддерживают один и тот же ассемблер. Асм вставку нужно не просто создать. Её нужно "запустить". Если ты используешь клео, то выход один - ставить хук в игровой процесс. Скриптовый язык не позволяет выполнять асм-вставки. Скриптовый язык сам по себе является "виртуальным", т.к. все команды (опкоды) обрабатываются на более низком уровне. Асм-вставки должен выполнять непосредственно процессор (образно, ибо напрямую всё равно к непосредственно процессору нет доступа).

Цитата Slivkin-Sergey ()
Можно ли с этим что-то сделать, или надо компилировать __asm вставки в С и ворошить Хекс Редактором? Но ведь в таком случае скрипт может отказаться работать у некоторых.
Можно. Работать должно у всех. Главное - использовать глобальные адреса. Если, к примеру, идёт вызов функции из екзешника, то нужно записать её адрес в eax, а затем call eax. Проще будет использовать IDA вместо HEX-редактора. Там можно быстро найти необходимую функцию (особенно если компилишь с созданием отладочной информации, все названия функций/переменных видны) и скопировать HEX-код.

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