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

Slivkin-Sergey
Модераторы
16.06.14 20:12
Offline
Цитата )))DiMoN((( ()
а как сделать чтобы этот опкод сработал на педа после выстрела?

Пиши в тему "Заказ скриптов". Но вот опкод, который проверяет, получил ли пед повреждения от оружия:
Код
031D: actor $ACTOR_RYDER hit_by_weapon 51

Перед этим узнаёшь номер текущего оружия игрока.

)))DiMoN(((
Пользователи
16.06.14 20:37
Offline
Цитата Slivkin-Sergey ()
Перед этим узнаёшь номер текущего оружия игрока.
 спасибо, попробую что нить сделать

Добавлено (16.06.14, 19:20)
---------------------------------------------
51 означает тип оружия?

Добавлено (16.06.14, 19:37)
---------------------------------------------
Slivkin-Sergey, кажется я понял как сделать, но как педу назначить переменную?


Slivkin-Sergey
Модераторы
17.06.14 13:19
Offline
Цитата )))DiMoN((( ()
Slivkin-Sergey, кажется я понял как сделать, но как педу назначить переменную?

Поищи в Opcode Search Tool по слову targeted, там будет опкод, который заносит в переменную педа, в которого целится игрок.

)))DiMoN(((
Пользователи
18.06.14 17:39
Offline
Цитата Slivkin-Sergey ()
Поищи в Opcode Search Tool по слову targeted, там будет опкод, который заносит в переменную педа, в которого целится игрок.
Нашел, добавил в скрипт, но при компиляции выдаёт ошибку: "Неизвестный опкод 0AD2" как это можно исправить?

Добавлено (17.06.14, 12:58)
---------------------------------------------
Спасла переустановка Cleo

Добавлено (17.06.14, 13:07)
---------------------------------------------
Slivkin-Sergey, спасибо огромное!!! Всё получилось как и хотел!

Добавлено (18.06.14, 16:39)
---------------------------------------------
Slivkin-Sergey, а можно такое же провернуть и с транспортом?


Slivkin-Sergey
Модераторы
19.06.14 06:46
Offline
Цитата )))DiMoN((( ()
Slivkin-Sergey, а можно такое же провернуть и с транспортом?

Вот с транспортом врятли, опкода-то нет. Но, помнится, два два пак выкладывал где-то код на построение прямой от прицела и нахождения объекта, с которым она сталкивается. Кажется, где-то на vol-gta.

Sweeper
Проверенные
19.06.14 14:06
Offline
Как сделать анимацию, чтобы актеры пожали друг другу руки?
И ещё вопрос у меня через SB координаты и угол поворота игрока не вставляются, почему?
Отредактировал Sweeper - Четверг, 19.06.14, 14:13

wmysterio
Администраторы
Скриптер
19.06.14 14:26
Offline
Цитата Sweeper ()
И ещё вопрос у меня через SB координаты и угол поворота игрока не вставляются, почему?
Возможно Санник нужно запустить от имени администратора.
Цитата Sweeper ()
чтобы актеры пожали друг другу руки?
 Урок. Анимацию найти думаю не составит труда
Цитата
Как сделать анимацию
Точно не путём скриптинга smile

Slivkin-Sergey
Модераторы
19.06.14 15:23
Offline
Цитата wmysterio ()
Точно не путём скриптинга

Хм-м, а кости-то вращать можно smile .

wmysterio
Администраторы
Скриптер
19.06.14 20:24
Offline
Цитата Slivkin-Sergey ()
Хм-м, а кости-то вращать можно
Ну так это уже готовый "продукт" так сказать, а меня спрашивали о том, как создать анимацию путём скриптинга. Во всяком случаи я так понял слово "сделать" smile

BoPoH
Друзья
20.06.14 01:41
Offline
Чисто теоретически можно сделать свой формат анимаций прямо на CLEO. Я даже писал скрипт для создания отдельных поз прямо в игре, когда надо было сделать позы, где игрок смотрит назад из машины в разные стороны для вида от первого лица. Забавная вещица.

DK22Pac
Друзья
TOP Скриптер
20.06.14 07:17
Offline
Пул - это способ хранения и управления обьектами (а именно - их созданием и удалением). http://ru.wikipedia.org/wiki/Объектный_пул
Отличие структуры от класса в С++ - члены класса по умолчанию имеют private-доступ, структуры - public.
Цитата BoPoH ()
Это такая структура
Вот тут лучше все слова "структура" заменить на "обьект".

Slivkin-Sergey
Модераторы
20.06.14 10:13
Offline
Цитата wmysterio ()
Ну так это уже готовый "продукт" так сказать, а меня спрашивали о том, как создать анимацию путём скриптинга.

Я имел ввиду вращение костей путём записи соответствующих адресов в структуру актёра (помнится, на гтамоддинге читал что-то, называется либо CBone, либо СAnimFrame, или что-то такое).
Цитата DK22Pac ()
Пул - это способ хранения и управления обьектами (а именно - их созданием и удалением).

То есть в пуле и массиве педов всё-таки одинаковый размер - 140?
И под каким видом хранятся педы в пуле, чтобы потом быстро переводится в массив? Я так понимаю, это просто CPed-пустышки - например, все значения по нулям - и при создании быстренько проставляются до нужных (модель, координаты...)?
Потом-с, что обозначает эта операция (взял с той же страницы):
Код
virtual ~ObjectPool()
{
// теперь уже "по-настоящему" удаляем объекты
for (size_t i = 0; i < m_pool.size(); ++i)
delete m_pool[i].instance;
}

Означает ли она, что объект удаляется даже из пула? И бывает ли это нужно?
И к слову: m_pool[i].instance - инстенс это, видимо, одна из характеристик вектора?..

Добавлено (20.06.14, 09:13)
---------------------------------------------
Кстати, я, кажется, нашёл способ сменить походку игрока через SCM. Надо бы проверить.


Sweeper
Проверенные
20.06.14 13:22
Offline
Цитата wmysterio ()
Возможно Санник нужно запустить от имени администратора
Спасибо, помогло.
Теперь ещё: 036A: put_actor 93@ in_car 70@ это сажает актёра 93 в машину 70, а как мне в эту же машину посадить ещё одного актера только на другое место?

Slivkin-Sergey
Модераторы
20.06.14 13:28
Offline
Когда люди научатся пользоваться Opcode Search Tool...
Код
072B: put_actor $ACTOR_OG_LOC into_car 36@ passengerseat 1

0 - место около водителя
1 - заднее левое
2 - заднее правое
---
Кстати, ещё небольшой вопрос, скорее больше по асму:
Код
hex
        68 B0 01 00 00         // push 1B0h
        B8 B0 A0 43 00         // mov  eax, 0x43A0B0 (_spawnCarAtPlayerLocation)
        FF D0                  // call eax
        59                     // pop ecx
        C3                     // retn
end

Скорее, вопросы...
1) Зачем здесь нужен pop ecx?
2) Как этот pop определяет, что положить значение нужно в есх? Или всё, что снимается со стека, кладётся туда по умолчанию?
3) Как инструкция mov определяет, что 0x43A0B0 нужно поместить в eax?
4) Почему здесь call - не Е8?
5) И ещё: почему в некоторых hex-кодах инструкций в конце есть ничем не занятое пространство (нули), а в других нет?..
Вроде всё.
Отредактировал Slivkin-Sergey - Пятница, 20.06.14, 13:30

BoPoH
Друзья
20.06.14 13:34
Offline
Цитата Slivkin-Sergey ()
Кстати, я, кажется, нашёл способ сменить походку игрока через SCM. Надо бы проверить.

Это делается легко, при помощи опкода 0245. Единственная проблема, которая там возникает - в коде игры походка игрока всегда возвращается обратно. Если занопить это место, то опкод будет работать как положено.
Код
0A8C: write_memory 0x609A4E size 4 value 0x90909090 virtual_protect 1
0A8C: write_memory 0x609A52 size 2 value 0x9090 virtual_protect 1


Цитата Slivkin-Sergey ()
То есть в пуле и массиве педов всё-таки одинаковый размер - 140?

Не путай пул и массив. Пул - это некая структура (ну вообще-то класс, но это не столь важно сейчас), которая содержит некоторую информацию.
Фактически, можно сказать, что размер пула - 140. Но это будет не совсем верно, т.к. пул имеет размер, равный размеру своей структуры. И эта структура содержит набор данных об этом пуле. Т.е. указатель на массив объектов, размер этого массива, информация о том, какие элементы массива проинициализированы. "Фишка" пула в том, что память под объекты выделяется один раз и используется в течение всей игры, вместо того, чтобы выделять память под каждый объект каждый раз, как он понадобится. Это улучшает быстродействие игры и облегчает способ хранения и идентификации каждого объекта.

Цитата Slivkin-Sergey ()
И под каким видом хранятся педы в пуле, чтобы потом быстро переводится в массив? Я так понимаю, это просто CPed-пустышки - например, все значения по нулям - и при создании быстренько проставляются до нужных (модель, координаты...)?

Да, именно так.

Цитата Slivkin-Sergey ()
Потом-с, что обозначает эта операция (взял с той же страницы):

Насколько я понял, там использована немного другая организация пула - там есть возможность расширения пула в случае необходимости. Там выделена область памяти не под массив объектов, а под массив мини-структур, содержащих две переменные - указатель на объект и булевая переменная, свидетельствующая о том, используется ли объект. В данном случае объекты создаются по-отдельности, а не целым массивом, но так же при инициализации, а не при необходимости использования. Поэтому и при удалении пула нужно удалить все объекты по-отдельности.

Цитата Slivkin-Sergey ()
И к слову: m_pool[i].instance - инстенс это, видимо, одна из характеристик вектора?..

m_pool - это массив структур PoolRecord типа vector. Насколько я понял, это особый массив, способный расширяться.

Slivkin-Sergey
Модераторы
20.06.14 13:50
Offline
Цитата BoPoH ()
m_pool - это массив структур PoolRecord типа vector. Насколько я понял, это особый массив, способный расширяться.

Так и есть, я это имел ввиду. Я сначала думал, что это размер вектора, но потом увидел характеристику size и передумал.
А вот насчёт пула - меня совершенно запутал этот булин in_use. Ещё раз по порядку:
Структура CPool содержит данные о CPedArray. Функция CPedPool::Initialise (кстати, чем отличается . от ::?) создаёт объекты-пустышки в пуле (ведь так?).
Получается, что в структуре всех педов есть этот булин in_use?
Получается №2: пул (CPed-пустышки) - обыкновенный массив?

Добавлено (20.06.14, 12:50)
---------------------------------------------
А, не, instance - это название переменной Object. Только я теперь не понимаю, каким боком она в m_pool[i].instance, ну да ладно.
И что по поводу ассемблера?
---
Что-то многовато я вопросов задаю.


BoPoH
Друзья
20.06.14 15:19
Offline
Цитата Slivkin-Sergey ()
Что-то многовато я вопросов задаю.

Я думаю, нужно это куда-то в другую тему перенести, а то тематика пошла уже немного другая.

Не пытайся сравнивать пул из википедии с пулом, который используется в игре. Они устроены по-разному.
Давай на минутку забудем о том, что написано в википедии, там всё устроено немного сложнее.
Цитата Slivkin-Sergey ()
Структура CPool содержит данные о CPedArray. Функция CPedPool::Initialise (кстати, чем отличается . от ::?) создаёт объекты-пустышки в пуле (ведь так?).

Не путай названия структур и названия переменных типа этих структур. В структуре CPedPool есть указатель на массив объектов типа CPed. Вообще, стоит запомнить, что указатель на объект и указатель на массив объектов по сути - одно и то же. И объявляются так же.
Точка в вызове функции используется, когда у тебя есть элемент какого-то класса и ты вызываешь функцию класса конкретно для этого объекта. Например:
Код
CPedPool pool;
pool.Initialise();

Использовать функцию так CPedPool::Initialise - ты не сможешь. Но так выглядит её определение так, как описал ниже DK22Pac.

Теперь об ассемблере.
Здесь есть очень много нюансов. Нельзя сказать, что call - это обязательно байт 0xE8. Нельзя также сказать, что mov обязательно будет B8.
В большинстве случаев используются комбинации. Т.е.
Код
mov eax, 0x43A0B0

Будет иметь один байт в начале, а
Код
mov eсx, 0x43A0B0

уже другой. Т.е. различным комбинациям соответствуют различные байты. Это сделано для того, чтобы сократить размер файла, содержащего код (будь то exe или dll-файл)

pop ecx там нужен для того, чтобы вернуть первоначальное значение ecx. Если ты посмотришь в самое начало этой функции, то найдёшь там push ecx. Такая комбинация push и pop используется для сохранения значения регистра после выполнения функции. Так обычно делается со всеми регистрами, которые используются в коде функции. Т.е. их значение хранится в стеке на время выполнения функции. Стоит понимать, что push не обязательно передаёт параметр в функцию, он просто ложит значение на верхушку стека. Естественно, если следом идёт вызов функции, то она будет использовать определённые параметры взятые со стека.

Насчёт call. Обычно используется вызов по смещению - т.е. после E8 идёт разница между адресом вызова и адресом вызываемой функции. Но можно использовать прямой вызов, т.е. по конкретному адресу. В таких случаях, обычно адрес функции записывается в eax и потом функция вызывается через call eax. Естественно, если поставить E8, то процессор решит, что дальше идёт смещение для попадания в нужную функцию. Но у нас тут вместо смещения - регистр, который содержит адрес функции. Естественно, для этого нужно использовать какой-то другой байт, чтобы процессор понимал, что мы от него хотим.
В одном байте может содержаться до 256 комбинаций. А некоторые команды используют 2 байта для определения комбинации. Тогда комбинаций может быть ещё больше.
Проще говоря, здесь используются однобайтовые комбинации для наиболее распространённых случаев, типа mov регистр, значение.
По сути, выбор нужной комбинации байтов делается компилятором в зависимости от действий, которые ты производишь на более высокоуровневом языке. Но даже когда ты пишешь на ассемблере, то пишешь команды словами, а компилятор подбирает нужные значения для соответствующих операций.
Это в CLEO, где нет компилятора, способного преобразовать названия команд в их байтовые эквиваленты, нужно узнавать и подбирать всё вручную. Так мы, по сути, пишем практически на машинном языке. Ниже только язык нулей и единиц smile
Отредактировал BoPoH - Пятница, 20.06.14, 15:26

DK22Pac
Друзья
TOP Скриптер
20.06.14 15:20
Offline
Slivkin-Sergey, CPool хранит указатель на массив обьектов (будь то педы, транспорт, здания, и т.д).
https://github.com/DK22Pac....CPool.h
Глянь в конструктор 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;
}
Отредактировал DK22Pac - Пятница, 20.06.14, 15:35

)))DiMoN(((
Пользователи
20.06.14 18:24
Offline
Здравствуйте! Помогите найти ошибку:

Код
{$CLEO}
0000: NOP

:ANTI_1
wait 0
if and
Player.Defined($PLAYER_ACTOR)
not actor.Dead($PLAYER_ACTOR)
actor.Driving($PLAYER_ACTOR)
0AB0:   key_pressed 79
jf @ANTI_1
model.Load(#KMB_CONTAINER_RED)

:ANTI_2
wait 1000
if and
04C4: store_coords_to $X $Y $Z from_actor $PLAYER_ACTOR with_offset 0.0 -8.0 -0.3
model.Available(#KMB_CONTAINER_RED)
then
Object.Create(0@, #KMB_CONTAINER_RED, $X, $Y, $Z)
object.Angle(0@) = 90.0
end

:ANTI_3
wait 0
if or
actor.Dead($PLAYER_ACTOR)
0AB0:   key_pressed 80
then
model.Destroy(#KMB_CONTAINER_RED)
end
jump @ANTI_1

Этот скрипт должен при нажатии "О" создавать контейнер позади машины, а при нажатии на "Р" удалять этот объект. Но игра вылетает и я не знаю в чем причина

Добавлено (20.06.14, 17:24)
---------------------------------------------
А всё исправил ошибку, но удалять объект отказывается.... Как исправить?

wmysterio
Администраторы
Скриптер
20.06.14 18:32
Offline
Цитата )))DiMoN((( ()
Помогите найти ошибку
Код
Player.Defined($PLAYER_ACTOR)
Нужно $PLAYER_CHAR вместо $PLAYER_ACTOR.
Код
model.Load(#KMB_CONTAINER_RED)
Дальше нужно загрузить модель с помощью опкода 038B.

Исправленный код:
Код
{$CLEO}
0000: NOP

:ANTI_1
wait 0
if and
Player.Defined($PLAYER_CHAR)
not actor.Dead($PLAYER_ACTOR)
actor.Driving($PLAYER_ACTOR)
0AB0:   key_pressed 79
jf @ANTI_1
model.Load(#KMB_CONTAINER_RED)
038B: load_requested_models

:ANTI_2
04C4: store_coords_to $X $Y $Z from_actor $PLAYER_ACTOR with_offset 0.0 -8.0 -0.3
Object.Create(0@, #KMB_CONTAINER_RED, $X, $Y, $Z)
object.Angle(0@) = 90.0
model.Destroy(#KMB_CONTAINER_RED)

:ANTI_3
wait 0
if or
actor.Dead($PLAYER_ACTOR)
0AB0:   key_pressed 80
then
object.Destroy(0@)    // удаляем объект
jump @ANTI_1
end
jump @ANTI_3

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