Информация Switch() в SannyBuilder

Статус
В этой теме нельзя размещать новые ответы.

_DK

Новичок
Автор темы
7
20
Я не являюсь читером/игроком в мультиплеер, но решил создать эту тему здесь, т.к. один из пользователей даного сайта сообщил, что здесь обитает большое кол-во хорошо обознанных в скриптинге людей.
Конструкция switch в этом примере реализована через подключение дополнительных файлов перед компиляцией скрипта.
Как пример взят скрипт для изменения погоды в игре.
Код:
{$CLEO}
{$I switch}
 
//    0@ - Поточный ID погоды
//    1@ - Флаг текст-бокса. 1 - нужно показать текст бокс, 0 - не нужно
 
while true
    wait 0
    if
        0AB1: call_scm_func @KeyJustPressed 1 _vkey 219
    then
        0@--
        0AB1: call_scm_func @Limit 3 0@ _min 0 _max 22 _ret 0@
        1@ = 1
    else
        if
            0AB1: call_scm_func @KeyJustPressed 1 _vkey 221
        then
            0@++
            0AB1: call_scm_func @Limit 3 0@ _min 0 _max 22 _ret 0@
            1@ = 1
        end
    end
    if
        1@ == 1
    then
        1@ = 0
        set_weather 0@
        01B7: release_weather
 
        // Конструкция switch используется позволяет выбрать действие в зависимости от значения переменной.
        //
        //    {$I switch(<ПЕРЕМЕННАЯ>)} // Начало конструкции
        //   
        //        {$I case <ЗНАЧЕНИЕ1>}
        //            // Код, который выполнится, если ПЕРЕМЕННАЯ равна ЗНАЧЕНИЮ1.
        //            break - выход из конструкции.
        //       
        //        {$I case <ЗНАЧЕНИЕ2>}
        //            // Код, который выполнится, если ПЕРЕМЕННАЯ равна ЗНАЧЕНИЮ2.
        //            break - выход из конструкции.
        //             
        //        ...
        //       
        //        // Также в конструкции можно использовать специальный случай, именованный как default.
        //        {$I default}
        //            // Код, который выполнится, если переменная не равна ни одному из ЗНАЧЕНИЙ.
        //   
        //    {$I switch_end} // Завершение конструкции
 
        {$I switch(0@)}
            {$I case 0}
                0ACA: show_text_box "0 - Los Santos - Extra Sunny"
                break
            {$I case 1}
                0ACA: show_text_box "1 - Los Santos - Sunny"
                break
            {$I case 2}
                0ACA: show_text_box "2 - Los Santos - Extra Sunny Smog"
                break
            {$I case 3}
                0ACA: show_text_box "3 - Los Santos - Sunny Smog"
                break
            {$I case 4}
                0ACA: show_text_box "4 - Los Santos - Cloudy"
                break
            {$I case 5}
                0ACA: show_text_box "5 - San Fierro - Sunny"
                break
            {$I case 6}
                0ACA: show_text_box "6 - San Fierro - Extra Sunny"
                break
            {$I case 7}
                0ACA: show_text_box "7 - San Fierro - Cloudy"
                break
            {$I case 8}
                0ACA: show_text_box "8 - San Fierro - Rainy"
                break
            {$I case 9}
                0ACA: show_text_box "9 - San Fierro - Foggy"
                break
            {$I case 10}
                0ACA: show_text_box "10 - Las Venturas - Sunny"
                break
            {$I case 11}
                0ACA: show_text_box "11 - Las Venturas - Extra Sunny"
                break
            {$I case 12}
                0ACA: show_text_box "12 - Las Venturas - Cloudy"
                break
            {$I case 13}
                0ACA: show_text_box "13 - Countryside - Extra Sunny"
                break
            {$I case 14}
                0ACA: show_text_box "14 - Countryside - Sunny"
                break
            {$I case 15}
                0ACA: show_text_box "15 - Countryside - Cloudy"
                break
            {$I case 16}
                0ACA: show_text_box "16 - Countryside - Rainy"
                break
            {$I case 17}
                0ACA: show_text_box "17 - Desert - Extra Sunny"
                break
            {$I case 18}
                0ACA: show_text_box "18 - Desert - Sunny"
                break
            {$I case 19}
                0ACA: show_text_box "19 - Desert - Sandstorm"
                break
            {$I case 20}
                0ACA: show_text_box "20 - Underwater"
                break
            {$I case 21}
                0ACA: show_text_box "21 - Extracolours 1"
                break
            {$I case 22}
                0ACA: show_text_box "22 - Extracolours 2"
        {$I switch_end}
    end
end
 
// Функция сверяет, нажата ли клавиша, и в случае нажатия - ждёт, пока клавиша не будет отпущена.
:KeyJustPressed
 
//    0@ - ID клавиши
 
if
    0AB0: key_pressed 0@
then
    while 0AB0: key_pressed 0@
        wait 0
    end
    0485: return_true
    0AB2: ret 0
end
059A: return_false
0AB2: ret 0
 
// Функция ограничивает число в указанных рамках.
:Limit
 
//    0@ - число
//    1@ - нижняя граница ограничения
//    2@ - верхняя граница ограничения
 
//    Возвращаемое значение: число в указанных рамках
 
if
    802D: not 0@ >= 1@
then
    0085: 0@ = 2@
else
    if
        001D: 0@ > 2@
    then
        0085: 0@ = 1@
    end
end
0AB2: ret 1 0@
Скачать и ознакомиться подробнее можно здесь:
 

Вложения

  • weather_changer_src.rar
    294.7 KB · Просмотры: 52

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пригодится и переходи на сторону зла :devilish:и можно процедуру переводящую матрицу в кватернион, я нашел ее, но что-то с вызовом тогда не вышло.
 

Dark_Knight

Me, me and me.
Друг
4,082
2,104
Я думаю врятли он перейдет на сторону зла:devilish:. Я вот лично за светлую стороной сижу. O:-)
 

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
_DK, это очень круто, а ещё более круто - видеть таких людей здесь :) Подскажи нам, как текст рендерить через dx :-[
 

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Таблица есть только это не поможет, как я понял из за того что игра перестанет обрабатывать все остальные потоки и рендер если запускать рендер из игрового потока, это как запустить поток с бесконечным циклом без wait o. Может и ошибаюсь, хотя вот интересно те же таймеры находятся в ээ если через cleo создавать не игровые потоки с ассемблерным кодом
 

_DK

Новичок
Автор темы
7
20
и можно процедуру переводящую матрицу в кватернион, я нашел ее, но что-то с вызовом тогда не вышло.
Код:
 // 0x59C3E0 ; CQuaternion::Set(RwMatrixTag const&)
0AA6: call_method 0x59C3E0   struct $quat num_params 1 pop 0 $matrix
Подскажи нам, как текст рендерить через dx :-[
В cleo-скрипте - только через асм-вставку.
 

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Это точно матрицу в кватернион, а не наоборот, а понял в $quat выделить память 16 byte?
 

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В cleo-скрипте - только через асм-вставку.
Да хоть двоичными кодами :trollface:, как я понял из описания плагина того, ты писал что-то вроде о записи напрямую в буфер рендеринга.
 

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
В cleo-скрипте - только через асм-вставку.
А разве при помощи cleo-плагина не получится никак? Да и если не секрет, как это делал ты ?) (С samp, к сожалению, твой плагин конфликтует)
 

_DK

Новичок
Автор темы
7
20
Рисование в DX надо выполнять "между" BeginScene и EndScene. Скрипты выполняются до вызова BeginScene. Поэтому для рисования именно в скрипте, нужно делать асм-вставку - "инжект" между BS и ES.
Суть плагина Scm Direct Drawing - он позволяет выполнять код scm (т.е. опкоды) между BS и ES. Надо просто указать, какой участок кода нужно выполнить.
 

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Рисование в DX надо выполнять "между" BeginScene и EndScene. Скрипты выполняются до вызова BeginScene. Поэтому для рисования именно в скрипте, нужно делать асм-вставку - "инжект" между BS и ES.
Суть плагина Scm Direct Drawing - он позволяет выполнять код scm (т.е. опкоды) между BS и ES. Надо просто указать, какой участок кода нужно выполнить.
А как перехватить вызов BeginScene? Просто сдесь много толковых скриптеров, но мало тех которые пишут большие моды и больше направлены на мультиплеер, а присоединять к каждому маленькому CLEO скрипту кучу плагинов не очень круто, что для больших мультимодов вполне уместно. Pендеринг текста нормальным читабельным шрифтом был бы полезен, GTA шрифт в этом плане не годится никак, все пользуются выводом информации в чат, или можно конвертировать 2d to 3d screen и создавать sa:mp 3d текст, только отставания текста от камеры тоже не круто :/
 

alfazlo

Потрачен
128
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если я не туплю, мы можем раздабыть адрес beginscene() для стандартного dc игры, а потом прописать jump на оффсет в скрипте например, после этого будет выполняться только ассемблерный код? Ну ведь вызвать функцию CreateFont и DrawText на ассемблере не должно составлять труда, хотя я с ним не знаком :/​
 
Статус
В этой теме нельзя размещать новые ответы.