You are not logged in.
Подскажите, пожалуйста, уважаемые..
Как правильно пользоваться scm функцией с возвратом параметров? Ее использую, что сделать более компактным код. Делаю, скрипт меняющий оружия одного типа, по нажатию клавиши 1. В vc выбор оружия неудобный, нельзя нажать 6 и взять снайперку, как в других играх.
Решил исправить, для удобства использую SCM функция с возвратом параметров, но она не работает.
Не пойму в чем причина? Подскажите, пожалуйста.
Вот сделать часть для холодного оружия без SCM функции, она выглядит тогда слишком громоздкий код получится.
Приклепаю исходник скрипта с полным кодом, он содержит 119 строк, что очень много.
{$CLEO .cs} 0000: 0006: 1@ = 7 :1 wait 0 if 0AB0: key_pressed 0x31 jf @1 if 0039: 1@ == 7 jf @2 0006: 0@ = #cleaver // integer values 0006: 1@ = 8 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :2 if 0039: 1@ == 8 jf @3 0006: 0@ = #machete // integer values 0006: 1@ = 9 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :3 if 0039: 1@ == 9 jf @4 0006: 0@ = #katana // integer values 0006: 1@ = 10 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :4 if 0039: 1@ == 10 jf @5 0006: 0@ = #bat // integer values 0006: 1@ = 6 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :5 if 0039: 1@ == 6 jf @6 0006: 0@ = #chnsaw // integer values 0006: 1@ = 11 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :6 if 0039: 1@ == 11 jf @7 0006: 0@ = #brassknuckle // integer values 0006: 1@ = 1 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :7 if 0039: 1@ == 1 jf @8 0006: 0@ = #screwdriver // integer values 0006: 1@ = 2 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :8 if 0039: 1@ == 2 jf @9 0006: 0@ = #golfclub // integer values 0006: 1@ = 3 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :9 if 0039: 1@ == 3 jf @10 0006: 0@ = #nitestick // integer values 0006: 1@ = 4 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :10 if 0039: 1@ == 4 jf @11 0006: 0@ = #knifecur// integer values 0006: 1@ = 5 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :11 if 0039: 1@ == 5 jf @1 0006: 0@ = #hammer// integer values 0006: 1@ = 7 // integer values 0006: 2@ = 0 // integer values gosub @sab jump @1 :sab 0AB1: call_scm_func @fun 3 0@ 1@ 2@ var_ret 0 wait 900 // задержка между переключениями оружия return :fun repeat wait 0 Model.Load(0@) until Model.Available(0@) 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@ Model.Destroy(0@) 0AB2: ret 0
С помощью SCM функции хочу сделать более удобный и читаемый код скрипта. Помогите, пожалуйста, мне.
Как правильно пользоваться scm функции с возвратом параметров? Ее использую, что сделать более компактным.
Мы передаем в call_scm_func @fun params_count 3 параметра модель оружия, его тип, кол-во патронов, чтобы они записались в переменные 0@ 1@ 2@ и в дальнейшим их использовать в другой функции, где создается и выдается оружия игроку. Но я получаю вылет.
{$CLEO .cs} 0000: 0006: 1@ = 7 :1 wait 0 if 0AB0: key_pressed 0x31 jf @1 if 0039: 1@ == 7 jf @2 05F6: call_scm_func @fun params_count 3 #cleaver 8 0 0@ 1@ 2@ gosub @sab jump @1 :2 if 0039: 1@ == 8 jf @1 05F6: call_scm_func @fun params_count 3 #machete 9 0 0@ 1@ 2@ gosub @sab jump @1 :fun repeat wait 0 Model.Load(0@) until Model.Available(0@) 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@ Model.Destroy(0@) 0AB2: ret 3 0@ 1@ 2@ :sab wait 900 // задержка между переключениями оружия return
Offline
В SA так:
:sab 0AB1: call_scm_func @fun 3 0@ 1@ 2@ // var_ret 0 wait 900 // задержка между переключениями оружия return :fun Model.Load(0@) repeat wait 0 until Model.Available(0@) 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@ Model.Destroy(0@) 0AB2: ret 0
В VC не помню поддерживает ли она вообще SCM-функции
Offline
Спасибо, уважаемый wmysterio, что уделили время моего вопросу.
Вы очень много сделали для скриптинга, здесь выложен Ваш учебник http://ru-script.3dn.ru/forum/7-98-1#3399
К сожалению, не мог скачать ссылка не рабочая.
Если написать 0AB1: call_scm_func @fun 3 0@ 1@ 2@ // var_ret 0 то переключения оружия не происходит, нужно вернуть значения переменной @1, чтобы переключить на следующее оружие.
Offline
Вы очень много сделали для скриптинга
Это очень скромный вклад )
К сожалению, не мог скачать ссылка не рабочая.
На форуме ссылки нужно поменять. Скачать учебник по скриптингу Sanny Builder Вы сможете с архива. Но они уже устарели. Я более двух месяцев обновлял все статьи + были добавлены новые уроки, так что лучше с сайта читать.
то переключения оружия не происходит
Я бы сделал так:
{$CLEO .cs} 0000: NOP while true wait 0 for 0@ = 48 to 57 if 0AB0: key_pressed 0@ then 0A8F: 1@ = 0@ - 48// int 04B8: get_weapon_data_from_actor $PLAYER_ACTOR slot 1@ weapon 2@ ammo 3@ model 4@ if 0491: actor $PLAYER_ACTOR has_weapon 2@ then 01B9: set_actor $PLAYER_ACTOR armed_weapon_to 2@ end end end end
В SA будет работать, а в Вайсе без понятия, не работал с ней.
Last edited by wmysterio (13-09-2017 18:26)
Offline
Здравствуйте, wmysterio.
Спасибо за Ваш ответ уважаемый wmysterio.
Все прекрасно понимаю, Вы очень занятой человек.
Скачал Вашу программу, хотел посмотреть уроки, она не запустила, очень жаль.
Вы мне очень помогли Вашим советом.
Решил проблему, сделав скрипт путем увеличения порядкового номера модели ход. оружия (они расположены последовательно начиная 258 и закачивая 269). Старался сделать скрипт компактным высокоуровневым кодом. Все работает! По нажатию клавиши 1 идет переключения оружия ближнего боя. Хотел, чтобы по нажатию клавиши 2 переключались пистолеты (colt45 и python), но почему-то не работает. Никак не могу понять причину! Если у Вас будет свободное время, подскажите, пожалуйста, очень Вашего ответа.
{$CLEO .cs} 0000: 0006: 0@ = 258 // начало диапазона ход. оружия 0006: 1@ = 0 // начало диапазона типа ход. оружия 0006: 3@ = 273 // начало диапазона пистолета 0006: 4@ = 16 // начало диапазона типа пистолета :1 while true wait 0 if // (1 ветка) 0256: player $PLAYER_CHAR defined // игрок жив then if // (2 ветка) 0AB0: key_pressed 0x31 // клавиши 1 нажата then gosub @sab // сдвиг модели ход. оружия на 1 перед if // (3 ветка) 8039: not 0@ == 270 //проверка это конец диапазона ход. оружия then gosub @sab1 // функция загр. модели ход. оружия else gosub @sab2 // возврат начала диапазона ход. оружия if // (4 ветка) 0AB0: key_pressed 0x32 // клавиши 1 нажата then gosub @sab11 // сдвиг модели пистолетов на 1 перед if // (4 ветка) 8039: not 3@ == 276 // проверка это конец диапазона ход. оружия then gosub @sab22 // функция загр. пистолетов else gosub @sab33 // возврат начала диапазона пистолетов end end end end end end jump @1 :sab11 000A: 3@ += 1 000A: 4@ += 1 0006: 5@ = 200 return :sab22 // функция загр. пистолетов 0AB1: call_scm_func @fun 3 3@ 4@ 5@ wait 900 // задержка между переключениями оружия return :sab33 0006: 3@ = 273 0006: 4@ = 16 return :sab 000A: 0@ += 1 000A: 1@ += 1 0006: 2@ = 0 return :sab1 // функция загр. модели ход. оружия 0AB1: call_scm_func @fun 3 0@ 1@ 2@ wait 900 // задержка между переключениями оружия return :fun repeat wait 0 Model.Load(0@) until Model.Available(0@) 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@ Model.Destroy(0@) 0AB2: ret 0 :sab2 0006: 0@ = 258 0006: 1@ = 0 return
Offline
Здравствуйте.
Появился вопрос насчёт адресов памяти:
Если адрес памяти на максимальное количество здоровья = 0xB793E0
То какой адрес памяти отвечает за максимальное количество брони?
Offline
Здравствуйте.
Появился вопрос насчёт адресов памяти:
Если адрес памяти на максимальное количество здоровья = 0xB793E0
То какой адрес памяти отвечает за максимальное количество брони?
Это статистка. Если хочешь изменить максимальное значение брони или здоровья, есть для этого специальный адрес (оффсет) в структуре любого актера
Last edited by Goldfish (16-09-2017 09:48)
Offline
Вроде бы ввёл, но почему-то не работает. Может что-то не так написал?
0A8C: write_memory 0xB6F5F0 size 4 value 0@ virtual_protect 0 0A8C: write_memory 0@ += 0x544 size 4 value 1000 virtual_protect 0
По идее максимальное значение здоровья должно увеличиться, но вместо этого я получаю замедление времени.
И ещё, как работает данный адрес памяти? На сайте с адресами написано, что данный адрес закрепляет погоду, но у меня после смены погоды, погода начинает приходить в изначальное состояние.
0xC81318
Last edited by Dyabda (16-09-2017 14:48)
Offline
Вроде бы ввёл, но почему-то не работает. Может что-то не так написал?
0A8C: write_memory 0xB6F5F0 size 4 value 0@ virtual_protect 0 0A8C: write_memory 0@ += 0x544 size 4 value 1000 virtual_protect 0По идее максимальное значение здоровья должно увеличиться, но вместо этого я получаю замедление времени.
И ещё, как работает данный адрес памяти? На сайте с адресами написано, что данный адрес закрепляет погоду, но у меня после смены погоды, погода начинает приходить в изначальное состояние.
0xC81318
воттак примерно можно изменить значения здоровья.
0A96: 0@ = actor $PLAYER_ACTOR struct 0@ += 0x544 0A8C: write_memory 0xB793E0 size 4 value 700.0 virtual_protect 0
Но я не помню точно как правильно настроить ГГ максимальные параметры. Вродебы через стату опкодами устанавливаются. Надо прост майн прошарить и глянуть.
Last edited by Goldfish (16-09-2017 20:32)
Offline
Почему-то если использовать первые 2 строки, работать не будет.
Макс. здоровье можно увеличить, использовав лишь последнюю строку,.
Я хотел, использовав 2 первые строки, увеличить максимальную броню, но ничего не вышло.
Offline
То какой адрес памяти отвечает за максимальное количество брони?
Какой адрес не знаю, но через обычный скрипт всё решается
// Для игрока: 055F: set_player $PLAYER_CHAR max_armour += 50 // задать 0945: get_player $PLAYER_CHAR max_armour_to $9595 // получить // Для актёров: 035F: actor 98@ armour += 100 // задать 04DD: $9594 = actor $PLAYER_ACTOR armour // получить
Offline
Всё же у меня получилось через Cped выставить значение брони на 160. ( За это большая благодарность Wmysterio за уроки)
0A96: 1@ = actor $PLAYER_ACTOR struct 0A8E: 2@ = 1@ + 0x548 0A8C: write_memory 2@ size 4 value 160.0 virtual_protect 0
Но к сожалению, данная функция всего лишь на один раз. Т.е. если у вас будет меньше 100 брони и вы возьмёте бронежелет, броня восполнится лишь до 100.
Либо адреса памяти на максимальное количество брони не существует, либо его ещё не нашли.
Last edited by Dyabda (18-09-2017 23:03)
Offline
Игроку можно как то поставить скин SWATа ? (SA, scm)
Offline
trashmas wrote:Игроку можно как то поставить скин SWATа ? (SA, scm)
Да:
Model.Load(#SWAT) 038B: load_requested_models 09C7: change_player $PLAYER_CHAR model_to #SWAT
А разве выгружать модель из памяти не надо?
model.Destroy (#SWAT)
Offline
А разве выгружать модель из памяти не надо?
model.Destroy (#SWAT)
Надо
<......> model.destroy(#SWAT)
Last edited by Asind (22-09-2017 04:16)
Offline
0078: $2647 += frame_delta_time * 0.017 // floating-point values
Как работает этот опкод?
Делаю так:
repeat wait 0 0078: $bbb += frame_delta_time * 100.0 // floating-point values 008C: $bbb = float_to_integer $bbb 0084: $aaa = $bbb // integer values and handles until false
При 30 fps выдает значение 165, (т.е.1.6 если ставить *= 1.0)
А если проверить таким образом:
repeat wait 0 01BD: $aaa = current_time_in_ms 0060: $aaa -= $bbb// integer values 01BD: $bbb = current_time_in_ms until false
То получается 33, что есть верно (1000ms/30fps=33ms между каждым кадром)
Так как работает 0078: ?
Offline
А так?
repeat wait 0 0078: $bbb += frame_delta_time * 20.0 // floating-point values 008C: $bbb = float_to_integer $bbb 0084: $aaa = $bbb // integer values and handles until false
А почему 20.0 ?
Offline
Не знаю) Спроси у Rockstar)
m_snTimeInMillisecondsNonClipped += step; ms_fTimeStepNonClipped = step / 20; int timeToAdd = step; if (step > 300) timeToAdd = 300; CTimer::m_snTimeInMilliseconds += timeToAdd;
Не совсем понимаю что тут, но судя по step / 20 переменная делится на 20)
Спасибо !
Offline
05A4: get_angle_between_2d_vectors 9@ 10@ and 0.0 -1.0 store_to 26@
Этот опкод не работает в VC?
никакого значения угла не выдает
Offline
Доброго времени суток, уважаемые скриптеры!
Позвольте задать вам несколько вопросов:
1) Кто-нибудь пробовал создавать миссии с переноской и погрузкой объектов (а-ля "Спереть ящики с боеприпасами из дома деда-ветерана" или просто воровские миссии с фургоном)? Допустим, я знаю, как создавать динамический объект типа "ящик/бочка", который можно толкать/уничтожать. В чем будет заключаться особенность "переносимых" объектов (кроме, собственно, скриптинга)?
2) Кто-нибудь разбирался в коде сцен в качалке и любовных утех СиДжея (с патчем Hot Coffee) - я так понимаю, там все реализовано через набор циклично повторяющихся анимаций, меняющихся в зависимости от нажатых игроком кнопок - интересно, можно ли реализовать на их основе сцену допроса недруга с применением силы - прямо как в игре "The Punisher" ("Каратель"):
Интересно так же, где находятся эти анимации, в основном файле ped.ifp я их не заметил - там только походка/вождение/бой/ранение.
3) Где прописывается оружие, которое может появляться у педов? Например, те же ножи и пистолеты у проституток, биты у негров всяких, лопаты у деревенщин. В exe? Если нет, то где, и можно ли скриптово вооружить определенных пешеходов?
4) Где прописаны реплики/крики, издаваемые ГГ и педами в различных ситуациях? Можно ли их поменять?
5) Есть ли простейший скрипт, который будет выводить на экран получаемые игроком/педом повреждения в текстовом виде? Как в каких-нибудь корейских РПГ. Это нужно для теста файла Melee.dat.
6) Где задано поведение ИИ при рукопашном бое? ЕМНИП, боксеры/каратисты/рестлеры бегут к игроку напрямик и в бою не используют обходов слева/справа, в то время как обычные педы "кружат" вокруг игрока, стараясь ударить его то слева, то справа. Известо ли, где задано подобное поведение, можно ли педов скриптово заставить себя вести как тех же боксеров в спортзале?
Заранее огромное спасибо за ЛЮБОЙ ответ!
Last edited by BalashovM (02-01-2018 23:32)
Offline
BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.
Offline
BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.
Спасибо большое за ответ!
2) Точняк - мой косяк, невнимательно посмотрел, потом в архивах anim.img и cut.img нашел такие файлы анимаций, как sex.ifp, blowjobz.ifp (там, как оказалось, была неиспользованная в игре подробная анима отсоса барышней у ГГ прямо в машине, не хуже, чем в GTA 5)
3) Среди текстовых файлов .DAT ничего такого не нашел, но продолжу искать. Просто кто-то уже упоминал, что вроде бы в EXE.
6) Аналогично 3-му пункту, ибо все педы вне помещений используют стандартный тип боя. Другие стили используют лишь бойцы в спортзалах.
Last edited by BalashovM (03-01-2018 00:34)
Offline
Goldfish wrote:BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.Спасибо большое за ответ!
2) Точняк - мой косяк, невнимательно посмотрел, потом в архивах anim.img и cut.img нашел такие файлы анимаций, как sex.ifp, blowjobz.ifp (там, как оказалось, была неиспользованная в игре подробная анима отсоса барышней у ГГ прямо в машине, не хуже, чем в GTA 5)
3) Среди текстовых файлов .DAT ничего такого не нашел, но продолжу искать. Просто кто-то уже упоминал, что вроде бы в EXE.
6) Аналогично 3-му пункту, ибо все педы вне помещений используют стандартный тип боя. Другие стили используют лишь бойцы в спортзалах.
Ну мжет конечно и так быть, покрайней мере копы через ексеешник устроены. А со стилем, то тут может какой-то флаг влиять на это или педтип
Offline