#4901 13-09-2017 08:35

egor230
Registered: 13-07-2017
Posts: 7

Re: Один вопрос

Подскажите, пожалуйста, уважаемые..
Как правильно пользоваться 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

#4902 13-09-2017 10:24

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Один вопрос

В 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

#4903 13-09-2017 14:43

egor230
Registered: 13-07-2017
Posts: 7

Re: Один вопрос

Спасибо, уважаемый 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

#4904 13-09-2017 18:03

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Один вопрос

egor230 wrote:

Вы очень много сделали для скриптинга

Это очень скромный вклад )

egor230 wrote:

К сожалению, не мог скачать ссылка не рабочая.

На форуме ссылки нужно поменять. Скачать учебник по скриптингу Sanny Builder Вы сможете с архива. Но они уже устарели. Я более двух месяцев обновлял все статьи + были добавлены новые уроки, так что лучше с сайта читать.

egor230 wrote:

то переключения оружия не происходит

Я бы сделал так:

{$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

#4905 15-09-2017 10:00

egor230
Registered: 13-07-2017
Posts: 7

Re: Один вопрос

Здравствуйте, 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

#4906 16-09-2017 06:57

Dyabda
Registered: 14-07-2017
Posts: 32

Re: Один вопрос

Здравствуйте.

Появился вопрос насчёт адресов памяти:

Если адрес памяти на максимальное количество здоровья = 0xB793E0
То какой адрес памяти отвечает за максимальное количество брони?

Offline

#4907 16-09-2017 09:44

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

Dyabda wrote:

Здравствуйте.

Появился вопрос насчёт адресов памяти:

Если адрес памяти на максимальное количество здоровья = 0xB793E0
То какой адрес памяти отвечает за максимальное количество брони?

Это статистка. Если хочешь изменить максимальное значение брони или здоровья, есть для этого специальный адрес (оффсет) в структуре любого актера 
2xo5C.png

Last edited by Goldfish (16-09-2017 09:48)

Offline

#4908 16-09-2017 13:22

Dyabda
Registered: 14-07-2017
Posts: 32

Re: Один вопрос

Вроде бы ввёл, но почему-то не работает. Может что-то не так написал?

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

#4909 16-09-2017 20:31

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

Dyabda wrote:

Вроде бы ввёл, но почему-то не работает. Может что-то не так написал?

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

#4910 16-09-2017 23:55

Dyabda
Registered: 14-07-2017
Posts: 32

Re: Один вопрос

Почему-то если использовать первые 2 строки, работать не будет.

Макс. здоровье можно увеличить, использовав лишь последнюю строку,.

Я хотел, использовав 2 первые строки, увеличить максимальную броню, но ничего не вышло.

Offline

#4911 17-09-2017 07:19

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Один вопрос

Dyabda wrote:

То какой адрес памяти отвечает за максимальное количество брони?

Какой адрес не знаю, но через обычный скрипт всё решается

// Для игрока:
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

#4912 17-09-2017 09:06

Dyabda
Registered: 14-07-2017
Posts: 32

Re: Один вопрос

Всё же у меня получилось через 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

#4913 20-09-2017 10:53

trashmas
Registered: 12-04-2016
Posts: 41

Re: Один вопрос

Игроку можно как то поставить скин SWATа ? (SA, scm)

Offline

#4914 20-09-2017 13:23

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Один вопрос

trashmas wrote:

Игроку можно как то поставить скин SWATа ? (SA, scm)

Да:

Model.Load(#SWAT)
038B: load_requested_models
09C7: change_player $PLAYER_CHAR model_to #SWAT

Offline

#4915 21-09-2017 10:16

Dyabda
Registered: 14-07-2017
Posts: 32

Re: Один вопрос

wmysterio wrote:
trashmas wrote:

Игроку можно как то поставить скин SWATа ? (SA, scm)

Да:

Model.Load(#SWAT)
038B: load_requested_models
09C7: change_player $PLAYER_CHAR model_to #SWAT

А разве выгружать модель из памяти не надо?
model.Destroy (#SWAT)

Offline

#4916 22-09-2017 04:15

Asind
Registered: 16-07-2017
Posts: 64

Re: Один вопрос

Dyabda wrote:

А разве выгружать модель из памяти не надо?
model.Destroy (#SWAT)

Надо

<......>
model.destroy(#SWAT)

Last edited by Asind (22-09-2017 04:16)

Offline

#4917 22-09-2017 17:59

wmysterio
Registered: 04-03-2011
Posts: 215
Website

Re: Один вопрос

Dyabda wrote:

А разве выгружать модель из памяти не надо?

Я привёл только минимум того, чтобы смена успешно осуществилась. Удалять или нет уже зависит от кода. Если модель не будет использоваться в дальнейшем, тогда нужно.

Offline

#4918 28-10-2017 17:28

trashmas
Registered: 12-04-2016
Posts: 41

Re: Один вопрос

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

#4919 28-10-2017 20:06

trashmas
Registered: 12-04-2016
Posts: 41

Re: Один вопрос

DK22Pac wrote:

А так?

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

#4920 28-10-2017 20:39

trashmas
Registered: 12-04-2016
Posts: 41

Re: Один вопрос

DK22Pac wrote:

Не знаю) Спроси у Rockstar)

m_snTimeInMillisecondsNonClipped += step;
ms_fTimeStepNonClipped = step / 20;
int timeToAdd = step;
if (step > 300)
    timeToAdd = 300;
CTimer::m_snTimeInMilliseconds += timeToAdd;

Не совсем понимаю что тут, но судя по step / 20 переменная делится на 20)

Спасибо !

Offline

#4921 28-11-2017 08:40

trashmas
Registered: 12-04-2016
Posts: 41

Re: Один вопрос

05A4: get_angle_between_2d_vectors 9@ 10@ and 0.0 -1.0 store_to 26@

Этот опкод не работает в VC?

никакого значения угла не выдает

Offline

#4922 02-01-2018 22:35

BalashovM
Registered: 05-12-2015
Posts: 3

Re: Один вопрос

Доброго времени суток, уважаемые скриптеры!
Позвольте задать вам несколько вопросов:
1) Кто-нибудь пробовал создавать миссии с переноской и погрузкой объектов (а-ля "Спереть ящики с боеприпасами из дома деда-ветерана" или просто воровские миссии с фургоном)? Допустим, я знаю, как создавать динамический объект типа "ящик/бочка", который можно толкать/уничтожать. В чем будет заключаться особенность "переносимых" объектов (кроме, собственно, скриптинга)?
2) Кто-нибудь разбирался в коде сцен в качалке и любовных утех СиДжея (с патчем Hot Coffee) - я так понимаю, там все реализовано через набор циклично повторяющихся анимаций, меняющихся в зависимости от нажатых игроком кнопок - интересно, можно ли реализовать на их основе сцену допроса недруга с применением силы - прямо как в игре "The Punisher" ("Каратель"):
15-6.jpg
Интересно так же, где находятся эти анимации, в основном файле ped.ifp я их не заметил - там только походка/вождение/бой/ранение.
3) Где прописывается оружие, которое может появляться у педов? Например, те же ножи и пистолеты у проституток, биты у негров всяких, лопаты у деревенщин. В exe? Если нет, то где, и можно ли скриптово вооружить определенных пешеходов?
4) Где прописаны реплики/крики, издаваемые ГГ и педами в различных ситуациях? Можно ли их поменять?
5) Есть ли простейший скрипт, который будет выводить на экран получаемые игроком/педом повреждения в текстовом виде? Как в каких-нибудь корейских РПГ. Это нужно для теста файла Melee.dat.
6) Где задано поведение ИИ при рукопашном бое? ЕМНИП, боксеры/каратисты/рестлеры бегут к игроку напрямик и в бою не используют обходов слева/справа, в то время как обычные педы "кружат" вокруг игрока, стараясь ударить его то слева, то справа. Известо ли, где задано подобное поведение, можно ли педов скриптово заставить себя вести как тех же боксеров в спортзале?
Заранее огромное спасибо за ЛЮБОЙ ответ!

Last edited by BalashovM (02-01-2018 23:32)

Offline

#4923 03-01-2018 00:12

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.

Offline

#4924 03-01-2018 00:21

BalashovM
Registered: 05-12-2015
Posts: 3

Re: Один вопрос

Goldfish wrote:

BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.

Спасибо большое за ответ!
2) Точняк  - мой косяк, невнимательно посмотрел, потом в архивах anim.img и cut.img нашел такие файлы анимаций, как sex.ifp, blowjobz.ifp (там, как оказалось, была неиспользованная в игре подробная анима отсоса барышней у ГГ прямо в машине, не хуже, чем в GTA 5) grin
3) Среди текстовых файлов .DAT ничего такого не нашел, но продолжу искать. Просто кто-то уже упоминал, что вроде бы в EXE.
6) Аналогично 3-му пункту, ибо все педы вне помещений используют стандартный тип боя. Другие стили используют лишь бойцы в спортзалах.

Last edited by BalashovM (03-01-2018 00:34)

Offline

#4925 03-01-2018 00:48

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Один вопрос

BalashovM wrote:
Goldfish wrote:

BalashovM,
1) перенос объектов скриптуется и вроде наруки положить можно любой объект, который прописан в IDE.
2) да, серия анимации, проще реализовать AS Pack опкодами.
Анимы из кат сцен могут находится в архиве с моделями катсцен.
3) точно должно настраиваться через файлы.
4) можно, путем подмены своим аудию в архивах музыки с помощью соответственной проги, которые все находятся в папке audio.
5) хз, но написать не так сложно.
6) тоже должно настраиваться через файлы. Это вроде называется стилем боя.

Спасибо большое за ответ!
2) Точняк  - мой косяк, невнимательно посмотрел, потом в архивах anim.img и cut.img нашел такие файлы анимаций, как sex.ifp, blowjobz.ifp (там, как оказалось, была неиспользованная в игре подробная анима отсоса барышней у ГГ прямо в машине, не хуже, чем в GTA 5) grin
3) Среди текстовых файлов .DAT ничего такого не нашел, но продолжу искать. Просто кто-то уже упоминал, что вроде бы в EXE.
6) Аналогично 3-му пункту, ибо все педы вне помещений используют стандартный тип боя. Другие стили используют лишь бойцы в спортзалах.

Ну мжет конечно и так быть, покрайней мере копы через ексеешник устроены. А со стилем, то тут может какой-то флаг влиять на это или педтип

Offline

Board footer

Powered by FluxBB