Автор Тема: Dubstep-пушка  (Прочитано 7562 раз)

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Dubstep-пушка
« : Апрель 28, 2017, 04:22:25 pm »
Всем привет. Написал тут скрипт на дабстеп-пушку, но работает он как-то не стабильно. Помогите разобраться, в чём проблема? Закомментировал всё, что вспомнил (что-то может быть не совсем верно :) ). Всем заранее спасибо.
{$CLEO}
0000:
thread 'DubGun'
    wait 0
        :start
        wait 0
       
        if or
            Player.Defined($PLAYER_CHAR)
            Player.Wasted($PLAYER_CHAR)
            Model.Available(#RUGER)
        jf @start
       
        Model.Load(#RUGER)
        038B: load_requested_models
        :check
            wait 0
            3@ = 0x0 // отступ от нулевого элемента в массиве указателей на педов
            if and
                02D7: player $PLAYER_CHAR currentweapon == 27           // 27 - Ruger
                05EE: key_pressed 0x1                                   // 0x1 - левый клик
                02E0: actor $PLAYER_ACTOR firing_weapon
            then
                03CF: load_wav 'bust_07' as 1
                04ED: load_animation 'STRIP'
               
                repeat
                    wait 0
                until 04EE: has_animation_loaded 'STRIP'
               
                repeat
                    wait 0
                until 03D0: wav 1 loaded
                       
                03D1: play_wav 1
               
                /* * * ЛОГИКА * * */
                /*
                    1. Получаем структуру игрока и кладём в 1@
                    2. Преобразуем 1@ в массив указателей на 10 педов (0x56С)
                    3. Прибавляем размер указателей, которые уже обработали
                    4. Получаем структуру из адреса на педа
                    5. Применяем ему анимацию
                    6. Прибавляем к 3@ размер текущего указателя на педа
                */
               
                for 2@ = 0 to 5                                         // применяем анимацию к пяти педам
               
                    05E6: 1@ = actor $PLAYER_ACTOR struct               // структура игрока
                    1@ += 0x56C                                         // адрес нулевого элемента в массиве указателей на ближайших десяти педов
                   
                    005A: 1@ += 3@
                    05E0: 1@ = read_memory 1@ size 4 virtual_protect 0  // 1@ - адрес n-го педа
                   
                    05E9: 1@ = ped_struct 1@ handle                     // переводим структуру в дискриптор, чтобы применить анимацию
                    0372: set_actor 1@ anim 32 wait_state_time 3000 ms  // применяем анимацию
                    3@ += 0x4                                           // 0x4 - размерность указателя на педа
                   
                end
               
                2@ = 0                                                  // обнуляем счётчик
                01E3: text_1number_styled 'REWARD' number 1@ time 6000 style 6
               
                while 05EE: key_pressed 0x1                             // левый клик мыши (стрельба)
                    wait 0
                    0419: 0@ = player $PLAYER_CHAR weapon 27 ammo
                    if
                        0@ == 0
                    then
                        01C2: remove_references_to_actor 1@
                        040D: unload_wav 1
                        //04EF: release_animation 'STRIP'
                    end
                end
               
                01C2: remove_references_to_actor 1@
                040D: unload_wav 1
                3@ = 0x0
            end
        //04EF: release_animation 'STRIP'   
        jump @check
end_thread
« Последнее редактирование: Апрель 28, 2017, 08:07:16 pm от Prographer »

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Dubstep-пушка
« Ответ #1 : Апрель 29, 2017, 10:03:42 am »
Забыл дополнительные файлы: модель дабстеп-пушки и аудиофайл.
https://yadi.sk/d/tLYWg6D_3HU87R

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #2 : Апрель 29, 2017, 10:24:54 pm »
Блин. Помог бы, но терпеть не могу такой вид кода, так что "на глазок" хз в чем проблема. Если будет время на след. неделе - протестирую, передекомпилирую код в привычный для меня вид и поковыряюсь

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #3 : Май 17, 2017, 02:30:34 pm »
Черт. Наконец появилось время на гташку, решил глянуть этот скрипт, потеребонькал опкоды да параметры, понял, что такой вид кода - не моё и решил переписать с нуля, т.к. вроде понял, как это должно работать (посмотрел, как это сделано в Saints Row 4).
Но вот беда: пока этим занимался - пришла пара идей, и вот уже часа 2 не могу оторваться....беда.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Dubstep-пушка
« Ответ #4 : Май 18, 2017, 01:53:35 pm »
Player.wasted проверка никчему, и желательно циклов поменьше, я обычно делаю один цикл на весь скрипт и один wait 0 и прогоняю все возможные проверки в нем, если нужно например выполнять последовательные действия, то использую одну из переменных как этапы. Скажем если 0@ == 0 (это первый этап: выполняем его и присваиваем 0@ = 1) далее второй этап 0@ == 1 и так далее. В этом случае можно делать какие то глобальные проверки а какие то внутри этапов.
I know everything and nothing...

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #5 : Май 18, 2017, 06:53:17 pm »
использую одну из переменных как этапы.

В Вайсе мало локальных переменных, поэтому тут не разгуляешься. Вообще, CLEO-скриптинг очень ограничен, поэтому-то я на него и подзабил(scm only), но в случае с этим скриптом я вспомнил старые добрые времена и слегка увлекся, так что свой вариант скрипта выложу чуть позже(как реализую задуманное)

UPD:
Пофиг, это опять может затянуться на неопределенное время(времени нет), так что вот то, что имеется сейчас(пока сам эффект выглядит сыро и "блекло", плюс одного варианта мелодии явно мало, но "ядро" скрипта готово и работает стабильно):
{$CLEO .cs}

//-------------MAIN---------------
thread 'DUBGUN'
05F7: 13@ = label @DUBGUN_BUFFER offset // тут резервируем 13@ переменную под указатель на буфер
000A: 13@ += 4

// Блок инициализации, если у игрока в руках пушка
:DUBGUN_INITIAL
wait 0

:DUBGUN_INITIAL_2
if and
   Player.Defined($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 27
jf @DUBGUN_INITIAL
3@ = 0
load_wav 'BUST_07' 1

// Блок ожидания, пока игрок не начнет палить из пушки
:DUBGUN_1
wait 0
03D0:   wav 1 loaded
jf @DUBGUN_1
02D7:   player $PLAYER_CHAR currentweapon == 27
jf @DUBGUN_UNLOADWAV
00E1:   key_pressed 0 17 // Fire
jf @DUBGUN_1
0419: 15@ = player $PLAYER_CHAR weapon 27 ammo
017A: set_player $PLAYER_CHAR weapon 27 ammo_to 0
16@ = 0  // таймер времени работы пушки

:DUBGUN_2
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0
if
0019:   16@ > 200
jf @DUBGUN_2
if and
02D7:   player $PLAYER_CHAR currentweapon == 27
00E1:   key_pressed 0 17 // Fire
jf @DUBGUN_UNLOADALL
play_wav 1
17@ = 0  // таймер для задержки поиска педов и авто, а также проигрывания на них анимаций(100ms - оптимально: меньше - педы будут слишком быстро "дергаться", больше - "танец" будет унылым)
0007: 7@ = 1.0  // множитель размера внешней короны
0007: 8@ = 1.0  // слагаемое ко множителю размера внешней короны
05E0: 9@ = read_memory 0x978810 size 4 virtual_protect 1 
0039:   9@ == 0  // проверка на активный интерьер
jf @DUBGUN_3
04F9: set_extracolors 2 fade 0  // Активация цветовой гаммы Стрип-клуба

// Основной блок
:DUBGUN_3
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0 // задержка для отображения короны(желательно - не больше 0)
if and
02D7:   player $PLAYER_CHAR currentweapon == 27
00E1:   key_pressed 0 17 // Fire
83D2:   NOT wav 1 ended
jf @DUBGUN_UNLOADALL

// Начинается охота на педов
:DUBGUN_5
05F5: call_scm_func @DUBGUN_INEEDCOORDS params_count 1 13@ 4@ 5@ 6@  // GET X, Y and Z
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN params_count 6 4@ 5@ 6@ 7@ 8@ 16@ 7@ 8@ // SEND X, Y, Z, Corona2 multiplayer, Corona2 multiplayer addition and Timer. Return new Corona2 multiplayer addition.
0019:   17@ > 100 // задержка для проигрывания анимаций(если сделать реже или чаще - будет не айс)
jf @DUBGUN_3
17@ = 0
05EF: 1@ = random_actor_near_point 4@ 5@ 6@ in_radius 10.0 find_next 0 pass_deads 1 //IF and SET  // Ищем педов в радиусе 10м(1)
jf @DUBGUN_7

:DUBGUN_6
05F5: call_scm_func @DUBGUN_EVERYBODYDANCE params_count 2 1@ 16@  // send Actor Handle and Timer
05EF: 1@ = random_actor_near_point 4@ 5@ 6@ in_radius 10.0 find_next 1 pass_deads 1 //IF and SET  // Ищем педов в радиусе 10м(2)
jf @DUBGUN_7
jump @DUBGUN_6

// Начинается охота на авто
:DUBGUN_7
05F0: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 10.0 find_next 0 pass_wrecked 1 //IF and SET  // Ищем авто в радиусе 10м(1)
jf @DUBGUN_3

:DUBGUN_8
05F5: call_scm_func @DUBGUN_FUCKINGROCKINGCARS params_count 1 2@  // send Car Handle
05F0: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 10.0 find_next 1 pass_wrecked 1 //IF and SET  // Ищем авто в радиусе 10м(2)
jf @DUBGUN_3
jump @DUBGUN_8

// Блок выгрузки
:DUBGUN_UNLOADALL
17@ = 0
05E0: 9@ = read_memory 0x978810 size 4 virtual_protect 1
0039:   9@ == 0  // проверка на активный интерьер
jf @DUBGUN_UNLOADALL_2
04FA: reset_sky_colors_with_fade 100  // Возвращение обычной цветовой гаммы

:DUBGUN_UNLOADALL_2
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0
if
0019:   17@ > 400
jf @DUBGUN_UNLOADALL_2
017A: set_player $PLAYER_CHAR weapon 27 ammo_to 0
01B1: give_player $PLAYER_CHAR weapon 27 ammo 15@

:DUBGUN_UNLOADWAV
unload_wav 1
jump @DUBGUN_INITIAL_2

// SCM функции для экономии переменных в основном коде
:DUBGUN_INEEDCOORDS
// в SCM-функции переменная 13@ стала 0@, поэтому далее можно спокойно юзать 13@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0007: 13@ = 0.0 // поиск начинается с расстояния 0.0 юнита от игрока с шагом 0.5 расстояния от камеры до игрока

:DUBGUN_INEEDCOORDS_2
0023:   100.0 > 13@
jf @DUBGUN_INEEDCOORDS_3
000B: 13@ += 0.5
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.18 0.0 1.2  // Camera Point(approximately)
0087: 4@ = 1@
0087: 5@ = 2@
0087: 6@ = 3@
0A8D: 7@ = read_memory 0x7E46B8 size 4 virtual_protect 0  // camera X position
0A8D: 8@ = read_memory 0x7E46BC size 4 virtual_protect 0  // camera Y position
0A8D: 9@ = read_memory 0x7E46C0 size 4 virtual_protect 0  // camera Z position
0063: 4@ -= 7@
0063: 5@ -= 8@
0063: 6@ -= 9@
006B: 4@ *= 13@
006B: 5@ *= 13@
006B: 6@ *= 13@
005B: 1@ += 4@
005B: 2@ += 5@
005B: 3@ += 6@
04C4: create_coordinate 4@ 5@ 6@ from_actor $PLAYER_ACTOR offset 0.18 0.0 1.2  // Camera Point(approximately) again
0085: 15@ = 0@
0085: 7@ = 15@  // Camera Point(approximately) Matrix
0A8C: write_memory 15@ size 4 value 4@ virtual_protect 1
000A: 15@ += 0x04
0A8C: write_memory 15@ size 4 value 5@ virtual_protect 1
000A: 15@ += 0x04
0A8C: write_memory 15@ size 4 value 6@ virtual_protect 1
0085: 15@ = 0@
000A: 15@ += 0x10 
0085: 8@ = 15@  // Target Matrix
0A8C: write_memory 15@ size 4 value 1@ virtual_protect 1
000A: 15@ += 0x04  // integer values
0A8C: write_memory 15@ size 4 value 2@ virtual_protect 1
000A: 15@ += 0x04  // integer values
0A8C: write_memory 15@ size 4 value 3@ virtual_protect 1
0085: 15@ = 0@
000A: 15@ += 0x1C
0085: 9@ = 15@ // ColPoint?
0A8C: write_memory 15@ size 4 value 80 virtual_protect 1
000A: 15@ += 0x20
0085: 10@ = 15@ // ColEntity?
0A8C: write_memory 15@ size 4 value 0 virtual_protect 1
//Далее - наглядный пример использования функции CWorld::ProcessLineOfSight
//эта функция даст понять, находится ли что-то между двумя координатами(все значения в CLEO указываются задом наперед):
//четыре нуля - это shootThrough(объекты без кола), cameraObjects(камеры), seeThrough(невидимые объекты) и dummies(дамми): они нам не нужны, поэтому тут нули
//четыре единицы - это objects, peds, vehicles и buildings: они-то нам и нужны, поэтому тут единицы
//10@ - ColEntity?(хз, вроде нужно отправлять всегда 0)
//9@ - ColPoint?(хз, вроде нужно отправлять всегда 80)
//8@ - Target Matrix: матрица целевых координат
//9@ - Camera Point(approximately) Matrix: матрица начальных координат(в нашем случае - Camera Point)
//если что-то обнаружилось - функция вернет в 11@ bool 1, если нет - bool 0, однако в CLEO почему-то возвращается в виде Integer, поэтому ниже будет преобразование значения
0AA7: call_function 0x4D92D0 num_params 12 pop 12 0 0 0 0 1 1 1 1 10@ 9@ 8@ 7@ 11@  // ProcessLineOfSight(CVector  const& origin, CVector  const& target, CColPoint &colPoint, CEntity *&colEntity, bool buildings, bool vehicles, bool peds, bool objects, bool dummies, bool seeThrough, bool cameraObjects, bool shootThrough)
//Далее идет конверт в привычный вид для SCM вид INT
0AC7: 14@ = var 11@ offset
05E0: 11@ = read_memory 14@ size 1 virtual_protect 1
0039:   11@ == 1 // если что-то найдено
jf @DUBGUN_INEEDCOORDS_2

:DUBGUN_INEEDCOORDS_3
//050A: 14@ = distance_between_XYZ 1@ 2@ 3@ and_XYZ 4@ 5@ 6@
//0092: 14@ = float 14@ to_integer
//036D: text_2numbers_styled 'COORDS2' numbers 14@ 0 time 10 style 5
05F6: ret 3 1@ 2@ 3@

:DUBGUN_GOGOGATGETDUBGUN
// в SCM-функции переменные 4@ 5@ 6@ 7@ 8@ 16@ стали 0@ 1@ 2@ 3@ 4@ 5@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0208: 10@ = random_float 0.5 3.0  // random Radius
0209: 11@ = random_int_in_ranges 0 6  // random Corona Type
0209: 12@ = random_int_in_ranges 0 3  // random Lens Flare
0209: 13@ = random_int_in_ranges 0 127  // random R
0209: 14@ = random_int_in_ranges 0 127  // random G
0209: 15@ = random_int_in_ranges 0 127  // random B
024F: create_corona_with_radius 10@ type 11@ lensflares 12@ with_color 13@ 14@ 15@ at 0@ 1@ 2@
0021:   3@ > 15.0
jf @DUBGUN_GOGOGATGETDUBGUN_2
0007: 3@ = 1.0
jump @DUBGUN_GOGOGATGETDUBGUN_3

:DUBGUN_GOGOGATGETDUBGUN_2
0023:   -15.0 > 3@
jf @DUBGUN_GOGOGATGETDUBGUN_3
0007: 3@ = 14.9

:DUBGUN_GOGOGATGETDUBGUN_3
0093: 5@ = integer 5@ to_float
0013: 5@ *= 0.04
02F6: 4@ = sine 5@
0013: 4@ *= 3.0
005B: 3@ += 4@  // (float)
0209: 11@ = random_int_in_ranges 6 8  // random Corona2 Type
//0209: 12@ = random_int_in_ranges 0 2  // random Lens Flare
0209: 13@ = random_int_in_ranges 50 200  // random R
0209: 14@ = random_int_in_ranges 50 200  // random G
0209: 15@ = random_int_in_ranges 50 200  // random B
024F: create_corona_with_radius 3@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 0@ 1@ 2@
05F6: ret 2 3@ 4@

:DUBGUN_EVERYBODYDANCE
// в SCM-функции наш пед 1@ стал 0@, а таймер 16@ - 1@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0372: set_actor 0@ anim 12 wait_state_time 0 ms // сперва применяем анимацию "отдышки", чтобы наш пед заранее "устал"
0209: 2@ = random_int_in_ranges 29 67  // Some Random anims from ped.ifp
if or
0039:   2@ == 37
0039:   2@ == 43
jf @DUBGUN_EVERYBODYDANCE_2
0AB1: call_scm_func @COMPLETELY_RANDOM_NATURAL_NUMBER 1 8 2@ // 8 - means "random number 1 to 8
000A: 2@ += 28

:DUBGUN_EVERYBODYDANCE_2
05E6: 1@ = actor 0@ struct
000A: 1@ += 0x4C
05E0: 1@ = read_memory 1@ size 4 virtual_protect 0
05E1: call 0x405640 4 pop 4 4.0 2@ 0 1@
05F6: ret 0

:DUBGUN_FUCKINGROCKINGCARS
// в SCM-функции наша тачка 2@ стала 0@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0A97: 1@ = car 0@ struct // получаем поинтер(адрес) тачки в памяти игры
0085: 2@ = 1@
0085: 7@ = 1@
000A: 1@ += 0x7C  // оффсет X turn speed (множитель поворота X)
000A: 2@ += 0x80  // оффсет Y turn speed (множитель поворота Y)
000A: 7@ += 0x78  // оффсет Z push (множитель толчка Z)
// Чтобы тачка качалась не абы куда, а именно параллельно углу поворота - херачим синусы и косинусы:
0174: 3@ = car 0@ z_angle
02F7: 4@ = cosine 3@
02F6: 5@ = sine 3@
// Тут расположен множитель силы поворота. Оптимальные значения - от 0.02 до 0.04. Тут всё зависит от подвески авто - экспериментируй. Но значения для X и Y должны быть одинаковыми.
0208: 6@ = random_float -0.05 0.05  // берем рандомный множитель поворота
006B: 4@ *= 6@
006B: 5@ *= 6@
// Тут расположен множитель силы толчка по оси Z.
0208: 8@ = random_float -0.02 0.02  // берем рандомный множитель толчка
03A2: set_car_status 0@ to 3  // "Активация физики" автомобиля(на случай, если это транспорт трафика)
// Качаем и толкаем тачку
0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0  // Записываем множитель поворота X
0A8C: write_memory 2@ size 4 value 5@ virtual_protect 0  // Записываем множитель поворота Y
0A8C: write_memory 7@ size 4 value 8@ virtual_protect 0  // Записываем множитель толчка Z
0AB2: ret 0

:COMPLETELY_RANDOM_NATURAL_NUMBER
//Да - это функция в функции, правила с переменными те же
0AA7: call_function 0x4D0DF0 num_params 0 pop 0 1@
0093: 0@ = integer 0@ to_float
0085: 2@ = 1@
0016: 2@ /= 10
0012: 2@ *= 10
0093: 1@ = integer 1@ to_float
0093: 2@ = integer 2@ to_float
0063: 1@ -= 2@
0007: 2@ = 10.0
0073: 2@ /= 0@
0073: 1@ /= 2@
0092: 1@ = float 1@ to_integer
000A: 1@ += 1
05F6: ret 1 1@

:DUBGUN_BUFFER // Буфер памяти для значений
hex
    FF FF FF FF  00 00 00 00 // первые 4 байта идут под хендл по умолчанию это = -1
    FF FF FF FF  00 00 00 00 // +0x04 - [float] - Camera Point(approximately) X  - offset 7@
    FF FF FF FF  00 00 00 00 // +0x08 - [float] - Camera Point(approximately) Y
    FF FF FF FF  00 00 00 00 // +0x0C - [float] - Camera Point(approximately) Z
    FF FF FF FF  00 00 00 00 // +0x10 - [float] - Target X  - offset 8@
    FF FF FF FF  00 00 00 00 // +0x14 - [float] - Target Y
    FF FF FF FF  00 00 00 00 // +0x18 - [float] - Target Z
    FF FF FF FF  00 00 00 00 // +0x1С - offset 9@
    FF FF FF FF  00 00 00 00 // +0x20 - offset 10@
end
« Последнее редактирование: Май 18, 2017, 11:25:47 pm от Shagg_E »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Dubstep-пушка
« Ответ #6 : Май 19, 2017, 05:05:35 am »
В клео переменные не важны, тем более в вайсе и тройке, где нет сохранений. Можно использовать буфер вместо них, scm функции. клео скриптинг нисколько не ограничен. Глобальные переменные вообще нужны лишь в мейне, как я уже писал ранее можно обойтись и без них. Сохранение спокойно можно организовать и в клео, если кому нужно. клео, вообще, нужно как что-то, что можно добавить к оригиналу, т.е. расширить его.
I know everything and nothing...

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #7 : Май 19, 2017, 12:18:27 pm »
В клео переменные не важны, тем более в вайсе и тройке, где нет сохранений. Можно использовать буфер вместо них, scm функции. клео скриптинг нисколько не ограничен. Глобальные переменные вообще нужны лишь в мейне, как я уже писал ранее можно обойтись и без них. Сохранение спокойно можно организовать и в клео, если кому нужно. клео, вообще, нужно как что-то, что можно добавить к оригиналу, т.е. расширить его.

Ты прав, но помимо геморроя с переменными, я имел в виду проблему CLEO, как концепции вообще, т.е. именно как инструмента, благодаря которому каждый может собрать солянку из кучи скриптов. По этой причине, при написании очередного скрипта, приходится держать в голове не только все возможные действия игрока, которые могут привести к багам, но и ситуации, при которых другие скрипты могут запороть выполнение самых банальных действий.
Например, Prographer использовал подгрузку спец. анимации, которую нельзя выгрузить, пока все педы, использующие её, не перестанут это делать. Но это мелочь. Проблема в том, что за это время игрок может забрести в клуб, в котором опять же - используется эта анимация, что может привести к конфликтам при выгрузке анимации. И это только мэйн. Кто знает, сколько еще скриптов установит себе пользователь и как они будут работать друг с другом? И вот теперь уже стоит прибавить гемор с переменными и в итоге получается, что если хочешь сделать сколь-нибудь большой скриптовый мод, то придется либо сильно его урезать, чтобы сделать на CLEO, либо работать с мэйном. Про нормальные миссии в CLEO(в Вайсе, по крайней мере) можно вообще забыть(тетриса на CLEO не напишешь). Конечно, можно очень-очень-очень-оченьоченьочень заморочиться, и всё же как-то попытаться запихнуть тот же тетрис в CLEO скрипт, но стоит ли оно того, ведь всё может запороться из-за какого-нибудь чужого скрипта?
Это я и подразумевал под ограниченностью CLEO-скриптинга в сравнении с scm.
« Последнее редактирование: Май 19, 2017, 12:21:10 pm от Shagg_E »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Dubstep-пушка
« Ответ #8 : Май 19, 2017, 02:55:21 pm »
На самом деле не только CLEO вызывает такие проблемы, если где-то используются дополнительные скрипты для игры, например, в том же Skyrim, то неизбежно возникнут баги, так как один скрипт может перекрыть другой, или занять какие-то необходимые ресурсы. Поэтому универсального способа нет. Тут скорей просто надо выбирать моды на свой вкус. Кто-то захочет оригинальный мейн + чей-то скрипт, кто-то захочет что-то новое увидеть в старой игрушке. Главное, что клео хотя бы расширяет способы скриптинга, хотя бы за счет двух опкодов: чтения и запись в память, а там дофига всяких приблуд. И вот уже мейн станет лучше и человеку не придется ломать голову как добиться того или сего. Короче говоря польза есть... ;)
I know everything and nothing...

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Dubstep-пушка
« Ответ #9 : Май 19, 2017, 10:31:07 pm »
Если надо работать с памятью - просто откладываете "скриптинг" и начинаете программировать.
Не надо себя мучать.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #10 : Май 20, 2017, 05:20:55 am »
Если надо работать с памятью - просто откладываете "скриптинг" и начинаете программировать.
Не надо себя мучать.
Ну это только если работа с памятью занимает бОльшую часть работы. А крупные скриптовые моды(что сюжетные, что просто "скриптовый комплекс") как раз вызовут мучения, если пытаться написать их на c++
« Последнее редактирование: Май 20, 2017, 05:58:35 am от Shagg_E »

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 102
  • Репутация: +9/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Dubstep-пушка
« Ответ #11 : Май 20, 2017, 12:14:59 pm »
Если надо работать с памятью - просто откладываете "скриптинг" и начинаете программировать.
Не надо себя мучать.
Ну это только если работа с памятью занимает бОльшую часть работы. А крупные скриптовые моды(что сюжетные, что просто "скриптовый комплекс") как раз вызовут мучения, если пытаться написать их на c++
Мне кажется, что на этом форуме уже столько всего разобрали, что проще все наработки перенести на OpenRW ;D

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #12 : Май 20, 2017, 01:36:26 pm »
Prographer>
Я не знаю, на кой черт я это делаю, но не могу остановиться... уже совсем в какие-то бредовые дебри зашел... 700 строк... ???

{$CLEO .cs}

//-------------MAIN---------------
thread 'DUBGUN'
05F7: 13@ = label @DUBGUN_BUFFER offset // тут резервируем 13@ переменную под указатель на буфер
000A: 13@ += 4

// Блок инициализации, если у игрока в руках пушка
:DUBGUN_INITIAL
wait 0

:DUBGUN_INITIAL_2
if and
   Player.Defined($PLAYER_CHAR)
02D7:   player $PLAYER_CHAR currentweapon == 27
jf @DUBGUN_INITIAL
3@ = 0
load_wav 'BUST_07' 1

// Блок ожидания, пока игрок не начнет палить из пушки
:DUBGUN_1
wait 0
03D0:   wav 1 loaded
jf @DUBGUN_1
02D7:   player $PLAYER_CHAR currentweapon == 27
jf @DUBGUN_UNLOADWAV
00E1:   key_pressed 0 17 // Fire
jf @DUBGUN_1
0419: 15@ = player $PLAYER_CHAR weapon 27 ammo
017A: set_player $PLAYER_CHAR weapon 27 ammo_to 0
0209: 7@ = random_int_in_ranges 0 10000
0085: 16@ = 7@ // таймер времени работы пушки(таймер рандома)

:DUBGUN_2
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0
0085: 8@ = 16@
0062: 8@ -= 7@
if
0019:   8@ > 200
jf @DUBGUN_2
if and
02D7:   player $PLAYER_CHAR currentweapon == 27
00E1:   key_pressed 0 17 // Fire
jf @DUBGUN_UNLOADALL
play_wav 1
17@ = 0  // таймер для задержки поиска педов и авто, а также проигрывания на них анимаций(200ms - оптимально: меньше - педы будут слишком быстро "дергаться", больше - "танец" будет унылым)
0007: 7@ = 1.0  // множитель размера внешней короны
0007: 8@ = 1.0  // слагаемое ко множителю размера внешней короны
05E0: 9@ = read_memory 0x978810 size 4 virtual_protect 1 
0039:   9@ == 0  // проверка на активный интерьер
jf @DUBGUN_3
04F9: set_extracolors 2 fade 0  // Активация цветовой гаммы Стрип-клуба

// Основной блок
:DUBGUN_3
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0 // задержка для отображения короны(желательно - не больше 0)
if and
02D7:   player $PLAYER_CHAR currentweapon == 27
00E1:   key_pressed 0 17 // Fire
83D2:   NOT wav 1 ended
jf @DUBGUN_UNLOADALL

// Начинается охота на педов
:DUBGUN_5
05F5: call_scm_func @DUBGUN_INEEDCOORDS params_count 1 13@ 4@ 5@ 6@  // GET X, Y and Z
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN params_count 6 4@ 5@ 6@ 7@ 8@ 16@ 7@ 8@ // SEND X, Y, Z, Corona2 multiplayer, Corona2 multiplayer addition and Timer. Return new Corona2 multiplayer addition.
0019:   17@ > 200 // задержка для проигрывания анимаций(если сделать реже или чаще - будет не айс)
jf @DUBGUN_3
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN2 params_count 3 4@ 5@ 6@ // SEND X, Y, Z
17@ = 0
05EF: 1@ = random_actor_near_point 4@ 5@ 6@ in_radius 25.0 find_next 0 pass_deads 1 //IF and SET  // Ищем педов в радиусе 25м(1)
jf @DUBGUN_7

:DUBGUN_6
05F5: call_scm_func @DUBGUN_EVERYBODYDANCE params_count 5 1@ 16@ 4@ 5@ 6@  // send Actor Handle, Timer, X, Y, Z
05EF: 1@ = random_actor_near_point 4@ 5@ 6@ in_radius 25.0 find_next 1 pass_deads 1 //IF and SET  // Ищем педов в радиусе 25м(2)
jf @DUBGUN_7
jump @DUBGUN_6

// Начинается охота на авто
:DUBGUN_7
05F0: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET  // Ищем авто в радиусе 20м(1)
jf @DUBGUN_3

:DUBGUN_8
05F5: call_scm_func @DUBGUN_FUCKINGROCKINGCARS params_count 5 2@ 16@ 4@ 5@ 6@  // send Car Handle, Timer, X, Y, Z
05F0: 2@ = random_vehicle_near_point 4@ 5@ 6@ in_radius 20.0 find_next 1 pass_wrecked 1 //IF and SET  // Ищем авто в радиусе 20м(2)
jf @DUBGUN_3
jump @DUBGUN_8

// Блок выгрузки
:DUBGUN_UNLOADALL
17@ = 0
05E0: 9@ = read_memory 0x978810 size 4 virtual_protect 1
0039:   9@ == 0  // проверка на активный интерьер
jf @DUBGUN_UNLOADALL_2
04FA: reset_sky_colors_with_fade 100  // Возвращение обычной цветовой гаммы

:DUBGUN_UNLOADALL_2
01B1: give_player $PLAYER_CHAR weapon 27 ammo 0
wait 0
if
0019:   17@ > 400
jf @DUBGUN_UNLOADALL_2
017A: set_player $PLAYER_CHAR weapon 27 ammo_to 0
01B1: give_player $PLAYER_CHAR weapon 27 ammo 15@

:DUBGUN_UNLOADWAV
unload_wav 1
jump @DUBGUN_INITIAL_2

// SCM функции для экономии переменных в основном коде
:DUBGUN_INEEDCOORDS
// в SCM-функции переменная 13@ стала 0@, поэтому далее можно спокойно юзать 13@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0007: 13@ = 0.0 // поиск начинается с расстояния 0.0 юнита от игрока с шагом 0.5 расстояния от камеры до игрока

:DUBGUN_INEEDCOORDS_2
0023:   100.0 > 13@
jf @DUBGUN_INEEDCOORDS_3
000B: 13@ += 0.5
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.18 0.0 1.2  // Camera Point(approximately)
0087: 4@ = 1@
0087: 5@ = 2@
0087: 6@ = 3@
0A8D: 7@ = read_memory 0x7E46B8 size 4 virtual_protect 0  // camera X position
0A8D: 8@ = read_memory 0x7E46BC size 4 virtual_protect 0  // camera Y position
0A8D: 9@ = read_memory 0x7E46C0 size 4 virtual_protect 0  // camera Z position
0063: 4@ -= 7@
0063: 5@ -= 8@
0063: 6@ -= 9@
006B: 4@ *= 13@
006B: 5@ *= 13@
006B: 6@ *= 13@
005B: 1@ += 4@
005B: 2@ += 5@
005B: 3@ += 6@
04C4: create_coordinate 4@ 5@ 6@ from_actor $PLAYER_ACTOR offset 0.18 0.0 1.2  // Camera Point(approximately) again
0085: 15@ = 0@
0085: 7@ = 15@  // Camera Point(approximately) Matrix
0A8C: write_memory 15@ size 4 value 4@ virtual_protect 1
000A: 15@ += 0x04
0A8C: write_memory 15@ size 4 value 5@ virtual_protect 1
000A: 15@ += 0x04
0A8C: write_memory 15@ size 4 value 6@ virtual_protect 1
0085: 15@ = 0@
000A: 15@ += 0x10 
0085: 8@ = 15@  // Target Matrix
0A8C: write_memory 15@ size 4 value 1@ virtual_protect 1
000A: 15@ += 0x04  // integer values
0A8C: write_memory 15@ size 4 value 2@ virtual_protect 1
000A: 15@ += 0x04  // integer values
0A8C: write_memory 15@ size 4 value 3@ virtual_protect 1
0085: 15@ = 0@
000A: 15@ += 0x1C
0085: 9@ = 15@ // ColPoint?
0A8C: write_memory 15@ size 4 value 80 virtual_protect 1
000A: 15@ += 0x20
0085: 10@ = 15@ // ColEntity?
0A8C: write_memory 15@ size 4 value 0 virtual_protect 1
//Далее - наглядный пример использования функции CWorld::ProcessLineOfSight
//эта функция даст понять, находится ли что-то между двумя координатами(все значения в CLEO указываются задом наперед):
//четыре нуля - это shootThrough(объекты без кола), cameraObjects(камеры), seeThrough(невидимые объекты) и dummies(дамми): они нам не нужны, поэтому тут нули
//четыре единицы - это objects, peds, vehicles и buildings: они-то нам и нужны, поэтому тут единицы
//10@ - ColEntity?(хз, вроде нужно отправлять всегда 0)
//9@ - ColPoint?(хз, вроде нужно отправлять всегда 80)
//8@ - Target Matrix: матрица целевых координат
//9@ - Camera Point(approximately) Matrix: матрица начальных координат(в нашем случае - Camera Point)
//если что-то обнаружилось - функция вернет в 11@ bool 1, если нет - bool 0, однако в CLEO почему-то возвращается в виде Integer, поэтому ниже будет преобразование значения
0AA7: call_function 0x4D92D0 num_params 12 pop 12 0 0 0 0 1 1 1 1 10@ 9@ 8@ 7@ 11@  // ProcessLineOfSight(CVector  const& origin, CVector  const& target, CColPoint &colPoint, CEntity *&colEntity, bool buildings, bool vehicles, bool peds, bool objects, bool dummies, bool seeThrough, bool cameraObjects, bool shootThrough)
//Далее идет конверт в привычный вид для SCM вид INT
0AC7: 14@ = var 11@ offset
05E0: 11@ = read_memory 14@ size 1 virtual_protect 1
0039:   11@ == 1 // если что-то найдено
jf @DUBGUN_INEEDCOORDS_2

:DUBGUN_INEEDCOORDS_3
05F6: ret 3 1@ 2@ 3@

:DUBGUN_GOGOGATGETDUBGUN
// в SCM-функции переменные 4@ 5@ 6@ 7@ 8@ 16@ стали 0@ 1@ 2@ 3@ 4@ 5@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0208: 10@ = random_float 0.3 0.5  // random Radius
0209: 11@ = random_int_in_ranges 0 6  // random Corona Type
0209: 12@ = random_int_in_ranges 1 3  // random Lens Flare
0209: 13@ = random_int_in_ranges 127 255  // random R
0209: 14@ = random_int_in_ranges 0 255  // random G
0209: 15@ = random_int_in_ranges 127 255  // random B
024F: create_corona_with_radius 10@ type 11@ lensflares 12@ with_color 13@ 14@ 15@ at 0@ 1@ 2@
0021:   3@ > 15.0
jf @DUBGUN_GOGOGATGETDUBGUN_2
0007: 3@ = 1.0
jump @DUBGUN_GOGOGATGETDUBGUN_3

:DUBGUN_GOGOGATGETDUBGUN_2
0023:   -15.0 > 3@
jf @DUBGUN_GOGOGATGETDUBGUN_3
0007: 3@ = 14.9

:DUBGUN_GOGOGATGETDUBGUN_3
0093: 6@ = integer 5@ to_float
0013: 6@ *= 0.04
02F6: 4@ = sine 6@
0013: 4@ *= 3.0
005B: 3@ += 4@  // (float)
0209: 11@ = random_int_in_ranges 6 8  // random Corona2 Type
0209: 13@ = random_int_in_ranges 50 200  // random R
0209: 14@ = random_int_in_ranges 50 200  // random G
0209: 15@ = random_int_in_ranges 50 200  // random B
024F: create_corona_with_radius 3@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 0@ 1@ 2@
0093: 6@ = integer 5@ to_float
0013: 6@ *= 0.04
02F7: 7@ = cosine 6@
000B: 7@ += 1.0
0087: 13@ = 7@
000B: 7@ += 1.0
006B: 6@ *= 7@
02F6: 7@ = sine 6@
000B: 7@ += 1.0 
0087: 14@ = 7@
000B: 7@ += 1.0
0093: 6@ = integer 5@ to_float
0013: 6@ *= 0.04
006B: 6@ *= 7@
02F7: 7@ = cosine 6@
000B: 7@ += 1.0
0087: 15@ = 7@
0013: 13@ *= 100.0
0092: 13@ = float 13@ to_integer
0013: 14@ *= 100.0
0092: 14@ = float 14@ to_integer
0013: 15@ *= 100.0
0092: 15@ = float 15@ to_integer
0085: 6@ = 5@
0085: 7@ = 5@
0016: 7@ /= 100
0012: 7@ *= 100
0062: 6@ -= 7@
0093: 6@ = integer 6@ to_float // "DubBullet" percentage at the moment
0017: 6@ /= 100.0
0007: 12@ = 0.05 // left bullet
0208: 10@ = random_float 0.1 0.12  // random Radius
0209: 11@ = random_int_in_ranges 0 8  // random Corona3 Type
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.14  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.17  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.15 0.2  // random Radius
0209: 11@ = random_int_in_ranges 0 6  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.17  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.14  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0093: 6@ = integer 5@ to_float
000B: 6@ += 3333.0
0013: 6@ *= 0.04
02F7: 7@ = cosine 6@
000B: 7@ += 1.0
0087: 13@ = 7@
000B: 7@ += 1.0
006B: 6@ *= 7@
02F6: 7@ = sine 6@
000B: 7@ += 1.0 
0087: 14@ = 7@
000B: 7@ += 1.0
0093: 6@ = integer 5@ to_float
0013: 6@ *= 0.04
006B: 6@ *= 7@
02F7: 7@ = cosine 6@
000B: 7@ += 1.0
0087: 15@ = 7@
0013: 13@ *= 100.0
0092: 13@ = float 13@ to_integer
0013: 14@ *= 100.0
0092: 14@ = float 14@ to_integer
0013: 15@ *= 100.0
0092: 15@ = float 15@ to_integer
0085: 6@ = 5@
0085: 7@ = 5@
0016: 7@ /= 100
0012: 7@ *= 100
0062: 6@ -= 7@
0093: 6@ = integer 6@ to_float // "DubBullet" percentage at the moment
0017: 6@ /= 100.0
0007: 12@ = 0.15 // right bullet
0208: 10@ = random_float 0.1 0.12  // random Radius
0209: 11@ = random_int_in_ranges 0 8  // random Corona3 Type
000B: 6@ += 0.33
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.14  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.17  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.15 0.2  // random Radius
0209: 11@ = random_int_in_ranges 0 6  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.17  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
0208: 10@ = random_float 0.1 0.14  // random Radius
0209: 11@ = random_int_in_ranges 0 5  // random Corona3 Type
000B: 6@ += 0.04
05F5: call_scm_func @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION params_count 5 0@ 1@ 2@ 6@ 12@ 7@ 8@ 9@ // SEND X, Y, Z, "DubBullet" percentage
024F: create_corona_with_radius 10@ type 11@ lensflares 0 with_color 13@ 14@ 15@ at 7@ 8@ 9@
05F6: ret 2 3@ 4@

:DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION
// в SCM-функции переменные 0@ 1@ 2@ 6@ 12@ стали 0@ 1@ 2@ 3@ 4@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0023:   0.05 > 3@
jf @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION_2
0007: 3@ = 0.05
jump @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION_3

:DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION_2
0021:   3@ > 0.95
jf @DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION_3
000F: 3@ -= 0.9

:DUBGUN_GOGOGATGETDUBGUN_DUBBULLETPOSITION_3
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 4@ 0.8 0.3
0063: 0@ -= 5@
0063: 1@ -= 6@
0063: 2@ -= 7@
006B: 0@ *= 3@
006B: 1@ *= 3@
006B: 2@ *= 3@
005B: 5@ += 0@
005B: 6@ += 1@
005B: 7@ += 2@
05F6: ret 3 5@ 6@ 7@

:DUBGUN_GOGOGATGETDUBGUN2
// в SCM-функции переменные 4@ 5@ 6@ стали 0@ 1@ 2@  (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0208: 10@ = random_float 0.5 5.0  // random Radius
0208: 11@ = random_float -0.3 0.3  // random X move
0208: 12@ = random_float -0.3 0.3  // random Y move
0209: 13@ = random_int_in_ranges 0 127  // random R
0209: 14@ = random_int_in_ranges 0 127  // random G
0209: 15@ = random_int_in_ranges 0 127  // random B
039D: scatter_particles 16 10@ 13@ 14@ 15@ 50 at 0@ 1@ 2@ 11@ 12@ 0.05
0208: 10@ = random_float 0.5 3.0  // random Radius
0208: 11@ = random_float -0.2 0.2  // random X move
0208: 12@ = random_float -0.2 0.2  // random Y move
039D: scatter_particles 16 10@ 13@ 14@ 15@ 1 at 0@ 1@ 2@ 11@ 12@ 0.05
0054: store_player $player_char position_to 4@ 5@ 6@
0509: 6@ = distance_between_point 4@ 5@ and_point 0@ 1@
0021:   6@ > 200.0
jf @DUBGUN_GOGOGATGETDUBGUN2_2
0007: 6@ = 199.0
jump @DUBGUN_GOGOGATGETDUBGUN2_3

:DUBGUN_GOGOGATGETDUBGUN2_2
0023:   1.0 > 6@
jf @DUBGUN_GOGOGATGETDUBGUN2_3
0007: 6@ = 1.0

:DUBGUN_GOGOGATGETDUBGUN2_3
0007: 7@ = 200.0
0063: 7@ -= 6@
0092: 7@ = float 7@ to_integer
0016: 7@ /= 3
000A: 7@ += 30
0003: shake_camera 7@
05F6: ret 0

:DUBGUN_EVERYBODYDANCE
// в SCM-функции наш пед 1@ стал 0@, таймер 16@ - 1@, координаты 4@ 5@ 6@ - 2@ 3@ 4@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
80DF:   NOT actor 0@ driving
jf @DUBGUN_EVERYBODYDANCE_RETURN
0209: 5@ = random_int_in_ranges 5 15  // Some Random anims from ped.ifp
gosub @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST
if
0118:   actor 0@ dead
jf @DUBGUN_EVERYBODYDANCE_3
//0372: set_actor 0@ anim 30 wait_state_time 1000 ms // сперва применяем анимацию "падения", чтобы мертвые педы вернулись к своему обычному мертвому состоянию после "танца"
//
/////////////////////////////////////////////////
//НЕДОДЕЛАНО
/////////////////////////////////////////////////
//
jump @DUBGUN_EVERYBODYDANCE_6//4

:DUBGUN_EVERYBODYDANCE_3
0193: set_actor 0@ objective_to_act_like_ped
0372: set_actor 0@ anim 12 wait_state_time 0 ms // сперва применяем анимацию "отдышки", чтобы наш пед заранее "устал"

:DUBGUN_EVERYBODYDANCE_6
05E6: 6@ = actor 0@ struct
000A: 6@ += 0x4C
05E0: 6@ = read_memory 6@ size 4 virtual_protect 0
05E1: call 0x405640 4 pop 4 4.0 5@ 0 6@
01BE: set_actor 0@ to_look_at_spot 2@ 3@ 4@

:DUBGUN_EVERYBODYDANCE_RETURN
05F6: ret 0

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST
if
8039:   NOT 5@ == 1
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_1
if
8039:   NOT 5@ == 2
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_2
if
8039:   NOT 5@ == 3
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_3
if
8039:   NOT 5@ == 4
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_4
if
8039:   NOT 5@ == 5
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_5
if
8039:   NOT 5@ == 6
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_6
if
8039:   NOT 5@ == 7
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_7
if
8039:   NOT 5@ == 8
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_8
if
8039:   NOT 5@ == 9
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_9
if
8039:   NOT 5@ == 10
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_10
if
8039:   NOT 5@ == 11
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_11
if
8039:   NOT 5@ == 12
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_12
if
8039:   NOT 5@ == 13
jf @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_13
0006: 5@ = 66

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN
return

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_1
0006: 5@ = 29
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_2
0006: 5@ = 30
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_3
0006: 5@ = 31
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_4
0006: 5@ = 32
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_5
0006: 5@ = 34
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_6
0006: 5@ = 35
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_7
0006: 5@ = 36
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_8
0006: 5@ = 38
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_9
0006: 5@ = 39
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_10
0006: 5@ = 44
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_11
0006: 5@ = 48
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_12
0006: 5@ = 49
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_13
0006: 5@ = 52
jump @DUBGUN_EVERYBODYDANCE_SETANIMFROMLIST_RETURN

:DUBGUN_FUCKINGROCKINGCARS
// в SCM-функции наша тачка 2@ стала 0@, таймер 16@ - 1@, координаты 4@ 5@ 6@ - 2@ 3@ 4@ (подробнее об SCM функциях - http://forum.gtabuilder.ru/index.php?topic=271.0 )
0A97: 5@ = car 0@ struct // получаем поинтер(адрес) тачки в памяти игры
0085: 6@ = 5@
0085: 7@ = 5@
000A: 5@ += 0x7C  // оффсет X turn speed (множитель поворота X)
000A: 6@ += 0x80  // оффсет Y turn speed (множитель поворота Y)
000A: 7@ += 0x78  // оффсет Z push (множитель толчка Z)
05F5: call_scm_func @DUBGUN_FUCKINGROCKINGCARS_TILT params_count 2 0@ 1@ 8@ 9@ // send Car Handle, Timer

// Тут расположен множитель силы толчка по оси Z.
03A2: set_car_status 0@ to 3  // "Активация физики" автомобиля(на случай, если это транспорт трафика)
// Качаем и толкаем тачку
if or // только в случае, если был произведен наклон авто в любую сторону ДОСТАТОЧНОЙ силы
8043:   NOT 5@ == 0.0
8043:   NOT 6@ == 0.0
jf @DUBGUN_FUCKINGROCKINGCARS_RETURN
0A8C: write_memory 5@ size 4 value 8@ virtual_protect 0  // Записываем множитель поворота X
0A8C: write_memory 6@ size 4 value 9@ virtual_protect 0  // Записываем множитель поворота Y

0208: 10@ = random_float -0.02 0.01  // берем рандомный множитель толчка
//0A8C: write_memory 7@ size 4 value 10@ virtual_protect 0  // Записываем множитель толчка Z

:DUBGUN_FUCKINGROCKINGCARS_RETURN
0AB2: ret 0

:DUBGUN_FUCKINGROCKINGCARS_TILT
// Чтобы тачка качалась не абы куда, а именно параллельно углу поворота - херачим синусы и косинусы:
0174: 3@ = car 0@ z_angle
000A: 1@ += 500  // integer values
0093: 1@ = integer 1@ to_float
0013: 1@ *= 0.08
02F7: 2@ = cosine 1@
000B: 2@ += 2.0
006B: 1@ *= 2@
02F6: 2@ = sine 1@
000B: 2@ += 1.0 
0092: 2@ = float 2@ to_integer
//01E5: text_1number_highpriority 'NUMBER' 2@ flag 100 time 1  // ~1~
0085: 9@ = 2@
0039:   9@ == 0
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_STABILIZER
000B: 3@ += 90.0

:DUBGUN_FUCKINGROCKINGCARS_TILT_STABILIZER
02F7: 4@ = cosine 3@
02F6: 5@ = sine 3@
// Тут расположен множитель силы поворота. Оптимальные значения - от 0.02 до 0.04. Тут всё зависит от подвески авто - экспериментируй. Но значения для X и Y должны быть одинаковыми.
0208: 6@ = random_float -0.03 0.03  // берем рандомный множитель наклона     // плюсы - наклон вправо и назад, минусы - влево и вперед
0013: 6@ *= 1.5 // увеличиваем его
if and // если рандомный множитель слишком маленький
0021:   6@ > -0.01
0023:   0.01 > 6@
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_CHECK
0013: 6@ *= 0.0 // то убираем его нафиг(обойдется авто без кача пару мгновений: лучше совсем ничего, чем скудное покачивание)

:DUBGUN_FUCKINGROCKINGCARS_TILT_CHECK
0039:   9@ == 0 // если будет произведен наклон авто влево или вправо
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_FORWARDCHECK
00AA: store_car 0@ position_to 10@ 11@ 12@
0407: create_coordinate 10@ 11@ 13@ from_car 0@ offset 1.0 0.0 0.0
0025:   13@ > 12@ // если авто наклонено влево
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_RIGHTCHECK
0023:   0.0 > 6@ // если при этом рандомный множитель тоже приведет к наклону влево
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
0013: 6@ *= -1.0  // "разворачиваем" множитель
0063: 13@ -= 12@
0021:   13@ > 0.2 // если авто сильно наклонено влево
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_MULTIPLY

:DUBGUN_FUCKINGROCKINGCARS_TILT_RIGHTCHECK
0021:   6@ > 0.0 // если при этом рандомный множитель тоже приведет к наклону вправо
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
0013: 6@ *= -1.0  // "разворачиваем" множитель
0063: 12@ -= 13@
0021:   12@ > 0.2 // если авто сильно наклонено вправо
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_MULTIPLY

:DUBGUN_FUCKINGROCKINGCARS_TILT_BACKWARDCHECK
00AA: store_car 0@ position_to 10@ 11@ 12@
0407: create_coordinate 10@ 11@ 13@ from_car 0@ offset 0.0 1.0 0.0
0025:   13@ > 12@ // если авто наклонено назад
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_FORWARDCHECK
0021:   6@ > 0.0 // если при этом рандомный множитель тоже приведет к наклону назад
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
0013: 6@ *= -1.0  // "разворачиваем" множитель
0063: 13@ -= 12@
0021:   13@ > 0.2 // если авто сильно наклонено назад
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_MULTIPLY

:DUBGUN_FUCKINGROCKINGCARS_TILT_FORWARDCHECK
0023:   0.0 > 6@ // если при этом рандомный множитель тоже приведет к наклону вперед
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
0013: 6@ *= -1.0  // "разворачиваем" множитель
0063: 12@ -= 13@
0021:   12@ > 0.2 // если авто сильно наклонено вперед
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY

:DUBGUN_FUCKINGROCKINGCARS_TILT_MULTIPLY
0013: 6@ *= 1.5  // увеличиваем множитель

:DUBGUN_FUCKINGROCKINGCARS_TILT_APPLY
006B: 4@ *= 6@
006B: 5@ *= 6@
if or // если был произведен наклон авто в любую сторону ДОСТАТОЧНОЙ силы
0021:   6@ > 0.02
0023:   -0.02 > 6@
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_RETURN
0039:   9@ == 0 // если произведен наклон авто влево или вправо
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSBACKWARD
0021:   6@ > 0.0 // если произведен наклон авто вправо
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSRIGHT
0006: 9@ = 32 // выбор анимации наклона налево
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSRIGHT
0006: 9@ = 30 // выбор анимации наклона направо
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSFORWARD
0021:   6@ > 0.0 // если произведен наклон авто назад
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSBACKWARD
0006: 9@ = 29 // выбор анимации наклона вперед
jump @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSBACKWARD
0006: 9@ = 31 // выбор анимации наклона назад(на самом деле 31 - копия анимации 29, но мне пофигу)

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS
046C: 14@ = car 0@ driver
8039:   NOT 14@ == -1
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_2
gosub @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEMOMENTUM

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_2
00AA: store_car 0@ position_to 10@ 11@ 12@
05EF: 14@ = random_actor_near_point 10@ 11@ 12@ in_radius 5.0 find_next 0 pass_deads 1 //IF and SET  // Ищем педов в радиусе 5м(1)
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_RETURN

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_3
00DB:   actor 14@ in_car 0@
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_4
gosub @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEMOMENTUM

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_4
85EF: NOT 14@ = random_actor_near_point 10@ 11@ 12@ in_radius 5.0 find_next 1 pass_deads 1 //IF and SET  // Ищем педов в радиусе 5м(2)
jf @DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_3

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEPASSENGERS_RETURN
0AB2: ret 2 4@ 5@

:DUBGUN_FUCKINGROCKINGCARS_TILT_ANIMATEMOMENTUM
05E6: 14@ = actor 14@ struct
000A: 14@ += 0x4C
05E0: 14@ = read_memory 14@ size 4 virtual_protect 0
05E1: call 0x405640 4 pop 4 4.0 9@ 0 14@
return

{
:COMPLETELY_RANDOM_NATURAL_NUMBER
0AA7: call_function 0x4D0DF0 num_params 0 pop 0 1@
0093: 0@ = integer 0@ to_float
0085: 2@ = 1@
0016: 2@ /= 10
0012: 2@ *= 10
0093: 1@ = integer 1@ to_float
0093: 2@ = integer 2@ to_float
0063: 1@ -= 2@
0007: 2@ = 10.0
0073: 2@ /= 0@
0073: 1@ /= 2@
0092: 1@ = float 1@ to_integer
000A: 1@ += 1
05F6: ret 1 1@
}

:DUBGUN_BUFFER // Буфер памяти для значений
hex
    FF FF FF FF  00 00 00 00 // первые 4 байта идут под хендл по умолчанию это = -1
    FF FF FF FF  00 00 00 00 // +0x04 - [float] - Camera Point(approximately) X  - offset 7@
    FF FF FF FF  00 00 00 00 // +0x08 - [float] - Camera Point(approximately) Y
    FF FF FF FF  00 00 00 00 // +0x0C - [float] - Camera Point(approximately) Z
    FF FF FF FF  00 00 00 00 // +0x10 - [float] - Target X  - offset 8@
    FF FF FF FF  00 00 00 00 // +0x14 - [float] - Target Y
    FF FF FF FF  00 00 00 00 // +0x18 - [float] - Target Z
    FF FF FF FF  00 00 00 00 // +0x1С - offset 9@
    FF FF FF FF  00 00 00 00 // +0x20 - offset 10@
end

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Dubstep-пушка
« Ответ #13 : Май 20, 2017, 01:46:16 pm »
Ну вот. А на C++ было бы максимум 200.

Например, вот это
0087: 4@ = 1@
0087: 5@ = 2@
0087: 6@ = 3@
0A8D: 7@ = read_memory 0x7E46B8 size 4 virtual_protect 0  // camera X position
0A8D: 8@ = read_memory 0x7E46BC size 4 virtual_protect 0  // camera Y position
0A8D: 9@ = read_memory 0x7E46C0 size 4 virtual_protect 0  // camera Z position
0063: 4@ -= 7@
0063: 5@ -= 8@
0063: 6@ -= 9@
006B: 4@ *= 13@
006B: 5@ *= 13@
006B: 6@ *= 13@
005B: 1@ += 4@
005B: 2@ += 5@
005B: 3@ += 6@
Можно в одну строчку записать.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 710
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Dubstep-пушка
« Ответ #14 : Май 20, 2017, 01:53:52 pm »
Ну вот. А на C++ было бы максимум 200.
Ну, этот скрипт действительно лучше было бы писать на C++, но тут дилемма:
-У меня недостаточно навыков, однако
-Активно учиться и получать эти навыки для меня сейчас смысла нет, поскольку те проекты, которыми занят я, практически не требуют этого, и то же самое время я предпочитаю тратить на прокачку скиллов в других сферах(моделирование, анимация и т.д.)

До сих пор не понимаю, чем меня зацепила идея этого скрипта(мб старые добрые времена решил вспомнить), но такими вещами я не занимаюсь уже пару лет..