[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 96 из 128«129495969798127128»
Форум » Игры серии 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
Друзья
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-код.

Slivkin-Sergey
Модераторы
23.05.14 18:33
Offline
Цитата BoPoH ()
Этот буфер по сути - часть скрипта, поэтому он выгружается и загружается вместе со скриптом.

Это значит?..
Цитата BoPoH ()
ставить хук в игровой процесс

Из всего многообразия софта для моддинга ГТАшки в данном случае могу вспомнить лишь RedirectCall из паковского PluginSDK.
Код
inline static void RedirectCall(int address, void *func)
{
int temp = 0xE8;
Patch((void *)address, &temp, 1);
temp = (int)func - ((int)address + 5);
Patch((void *)((int)address + 1), &temp, 4);
}

Или есть какие-то иные способы?

Добавлено (23.05.14, 17:33)
---------------------------------------------
Хотя, даже если и... Постойте. А не проще ли скомплировать dll'ку с асм-вставкой? Из Сишного кода вроде...
*спустя 30 минут*
В общем, я не представляю, как можно внедрить хук в игру из скрипта. А если из библиотеки, то фиг потом вернёшь управление хекс-вставке.
Отредактировал Slivkin-Sergey - Пятница, 23.05.14, 18:35

BoPoH
Друзья
23.05.14 18:48
Offline
Цитата Slivkin-Sergey ()
Это значит?..
Ты спросил, очищается ли эта память. Что означает слово "очищается" в твоём понятии? Память нужно выгружать, а не очищать при завершении приложения. В данном случае, это происходит само, при выгрузке скрипта (т.е. при начале новой игры или загрузке сохранения или же при выходе из игры).

Цитата Slivkin-Sergey ()
В общем, я не представляю, как можно внедрить хук в игру из скрипта. А если из библиотеки, то фиг потом вернёшь управление хекс-вставке.
Ты для начала определись, для чего тебе это нужно, что ты хочешь сделать с ассемблером? Использовать ассемблер не так уж практично в данном случае. Проще выучить C++ и писать плагины.

Добавлено (23.05.14, 17:48)
---------------------------------------------

Цитата Slivkin-Sergey ()
Из всего многообразия софта для моддинга ГТАшки в данном случае могу вспомнить лишь RedirectCall из паковского PluginSDK.
Именно это и есть установка хука - подмена вызова какой-либо функции в игре на вызов своей функции. В своей функции ты самостоятельно вызываешь функцию, которую подменил (чтобы не нарушать работу игры), а затем выполняешь нужные тебе действия.

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

Разве я бы употреблял термин, не осведомившись о его значении?
Цитата BoPoH ()
Ты спросил, очищается ли эта память. Что означает слово "очищается" в твоём понятии?

Я не спрашивал про память, я спрашивал за хекс буфер. Пишется ли значение в сам буфер в файле или исключительно в памяти игры, которая при завершении стирается?
Цитата BoPoH ()
Использовать ассемблер не так уж практично в данном случае. Проще выучить C++ и писать плагины.

Может и проще, но мне плагин не нужен, мне нужен именно ассемблерный код внутри scm, а точнее - внутри внешнего скрипта.
Отредактировал Slivkin-Sergey - Суббота, 24.05.14, 08:54

BoPoH
Друзья
24.05.14 12:12
Offline
Цитата Slivkin-Sergey ()
Я не спрашивал про память, я спрашивал за хекс буфер. Пишется ли значение в сам буфер в файле или исключительно в памяти игры, которая при завершении стирается?
Хекс буфер и память равносильны по своему значению. Игра загружает скрипты в память, а следовательно, хекс буфер тоже, ведь он находится внутри скрипта. Весь скрипт можно считать участком памяти. Когда ты записываешь значение в хекс буфер, ты записываешь его в тот участок памяти, где находится этот хекс буфер. Файл на жёстком диске не изменяется.
Цитата Slivkin-Sergey ()
Разве я бы употреблял термин, не осведомившись о его значении?
Ну, мне показалось, что ты решил уточнить назначение функции redirectCall.

Nikkei
Пользователи
28.05.14 23:14
Offline
Доброго вечера. Вот решил заняться скриптами cleo. И захотелось мне сделать вот что в SAMP`e:
Нажимаешь кнопку, допустим F5 и мне ставятся чекпоинты, как на гонке. Мне нужно так: Сделайте пожалуйста что-то типо гонки, т.е. ты наезжаешь\находишь на чекпоинт, он пропадает и появляется следующий, и так 3-4 чекпоинта. а там я разберуусь,  и сделаю что и куда направить. И чуть описания, что за что отвечает.

wmysterio
Администраторы
Скриптер
29.05.14 01:01
Offline
Цитата Nikkei ()
Доброго вечера. Вот решил заняться скриптами cleo. И захотелось мне сделать вот что в SAMP`e:Нажимаешь кнопку, допустим F5 и мне ставятся чекпоинты, как на гонке. Мне нужно так: Сделайте пожалуйста что-то типо гонки, т.е. ты наезжаешь\находишь на чекпоинт, он пропадает и появляется следующий, и так 3-4 чекпоинта. а там я разберуусь, и сделаю что и куда направить. И чуть описания, что за что отвечает.
Приветствую. Если ставить чекпонты во время игры на сервере SAMP, то чекпоинты будут появляться только на клиентской машине, то есть они будут видны только у вашей ГТА. Если нужно чтобы видили все, то cleo не подходит для такой разработки.

По-поводу "наезжать/находиться на чекпоинте", то в этом уроке написан алгоритм такой такой возможности.

Nikkei
Пользователи
29.05.14 13:48
Offline
Крч мне нужны такие опкоды (с примером если можно)
Что-бы при входе в один чекпоинт создавался другой (дальше я скопирую на сколько мне надо)
Конечный чекпоинт (при входе в него, он пропадает. а на экран выводится (если возможно)  - complete)

Slivkin-Sergey
Модераторы
29.05.14 19:31
Offline
Возможно ли сделать так, чтобы при перезапуске Vice City данные о созданных мной объектах НЕ терялись? Ну или если бы их можно было бы сохранить где-нибудь, а потом достать.

Михан500
Пользователи
29.05.14 21:17
Offline
Как сделать чтобы игрок отлетел в какую-то сторону?

BoPoH
Друзья
29.05.14 21:32
Offline
Цитата Михан500 ()
Как сделать чтобы игрок отлетел в какую-то сторону?

Код
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 0.0 0.0 0.0

Михан500
Пользователи
29.05.14 22:20
Offline
Спасибо, а вот еще два вопроса:
1)Как сделать что бы бочка летела в сторону игрока.
2)Как сделать что бы игрок отлетал с помощью 083с летел назад всегда
(083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ -20.0 0.0 9.0
пойдет?).

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