Игры

Пишем скрипт для смены скина игрока (свой мини SkinSelector) для GTA San Andreas

Много времени прошло с момента написания моей первой статьи для быстрого старта в программировании под библиотеку CLEO4. Кому-то из вас она стала полезной, кому-то не очень, но все же если вы желаете изучить это не простое дело и не знаете с чего начать, то вам следует прочитать эту статью - Пишем свой первый CLEO скрипт, она даст вам первое представление о скриптинге и работе с программой Sanny Builder.
Эта статья предназначена для тех, кто немного разобрался в построении скриптов и возможно уже что-то попробовал написать. И так, ближе к делу!

Для начала давайте разберемся что будет делать наш скрипт, перечисляю по пунктам:
1) Должен уметь менять скин
2) Должен уметь возвращать скин Карла по умолчанию.
3) Сохранять в настройках текущий скин
4) При старте игры загружать тип скина из настроек


В данном примере я разбил весь код скрипта на 3 функции - загрузка при старте, сканирование клавиатуры и смена скина, обо всем по порядку:

В начале скрипта объявляем переменную (назовем ее - Флаг) которая будет указывать нам какой в данный момент установлен скин, если значение равно 1, то это стандартный скин Карла иначе какой либо ID скина(я выбрал Army или 287), далее сразу переходим к функции загрузки, вот так это выглядит в коде:

{$CLEO .cs}  
2@ = 1 
gosub @Load


Загрузка при старте игры(Load):
Здесь мы воспользуемся опкодом для чтения числа в формате INI файла.
Но для начала немного о формате, ini файлы - это удобный способ хранения настроек для программ, он может хранить в себе числа, текст, числа с плавающей точкой и многое другое.
Простейший INI файл состоит из секции, название которой определяется в квадратных скобках,
в секции могут находится ключи у каждого из которых есть свое значение, значения отделяются знаком =. В одном ini файле могут находится несколько секций.
Например:


[секция1]
ключ1 = значение
ключ2 = значение
[секция2]
ключ1 = значение
ключ2 = значение


С форматом разобрались теперь рассмотрим нашу функцию Load.
Здесь мы должны сначала проверить существование нашего ini файла, делается это следующим опкодом: 0AAB: file_exists "cleo\skin.ini", если файл существует, то читаем значение которое хранится в нашем файле в переменную 2@, далее переходим к смене скина и после этого передаем управление функции сканирования клавиатуры.
Смотрим код:

:Load
wait 0
 if 0AAB:   file_exists "cleo\\skin.ini" 
 then      
     0AF0: 2@ = get_int_from_ini_file "cleo\\skin.ini" section "settings" key "skin"
     gosub @SkinChange  
 end
jump @Scan    


Смена скина! Вот и добрались наконец! Сразу смотрим код:

:SkinChange
 wait 0
 if and  // проверяем если
    player.Defined(0)  // игрок создан и
    not actor.Dead($PLAYER_ACTOR)  // не умер
 jf @SkinChange                                                                        
// меняем скин 
  if 2@ == 1  // если флаг равен 1 то 
  then   // возвращаем скин CJ-я
       09C7: change_player $PLAYER_CHAR model_to 0  
       0AF1: write_int 2@ to_ini_file "cleo\\skin.ini" section "settings" key "skin"    // сохраняем настройку
       2@ = #ARMY // переключаем флаг
  else
   // если флаг не равен 1 то
      Model.Load(2@) // загружаем модель нашего скина
      038B: load_requested_models   // используйте всегда эту функцию после загрузки моделей
      if Model.Available(2@)    // если наша модель доступна то
      then
          09C7: change_player $PLAYER_CHAR model_to 2@  // меняем скин
          Model.Destroy(2@)  // освобождаем память
          0AF1: write_int 2@ to_ini_file "cleo\\skin.ini" section "settings" key "skin"  // сохраняем настройки
          2@ = 1  // переключаем флаг
      end
  end
return   // возвращаемся туда откуда была вызвана функция

С виду функция выглядит страшно заметите вы, но поверьте это вам только кажется <!--smile:smile-->smile<!--/smile-->, здесь я специально прокомментировал каждую строку кода, что-бы вам легче было ориентироваться. В двух словах: Проверяем все ли нормально с игроком, если да то проверяем флаг. Если наш флаг равен 1 то возвращаем истинный облик Карла, иначе в моем случае перевоплощаем в army. Сохраняем настройки и переключаем флаг, указывая тем самым какой скин загрузить в следующий раз при нажатии кнопки.
Меняем скин опкодом - 09C7: change_player $PLAYER_CHAR model_to 0, где 0 - ID скина. Но перед использованием обязательно загружаем модель и проверяем доступность.

Сканирование клавиатуры:
Здесь все довольно просто, при нажатии клавиши P(англ) или З(рус.) переходим к функции смены скина:

:Scan
wait 0
if 
0AB0: key_pressed 0x50
jf @Scan
  gosub @SkinChange
  wait 100
jump @Scan


Вот и всё, осталось посмотреть полный код скрипта и скомпилировать:


{$CLEO .cs}  
2@ = 1 
gosub @Load

:Load
wait 0
 if 0AAB:   file_exists "cleo\\skin.ini" 
 then      
     0AF0: 2@ = get_int_from_ini_file "cleo\\skin.ini" section "settings" key "skin"
     gosub @SkinChange
 end
jump @Scan 
:SkinChange
 wait 0
 if and        
    player.Defined(0)  
    not actor.Dead($PLAYER_ACTOR)  
    jf @SkinChange
  if 2@ == 1 
  then
       09C7: change_player $PLAYER_CHAR model_to 0 
       0AF1: write_int 2@ to_ini_file "cleo\\skin.ini" section "settings" key "skin" 
       2@ = #ARMY  
  else
      Model.Load(2@)  
      038B: load_requested_models 
      if Model.Available(2@) 
      then
          09C7: change_player $PLAYER_CHAR model_to 2@
          Model.Destroy(2@)                            
          0AF1: write_int 2@ to_ini_file "cleo\\skin.ini" section "settings" key "skin"
          2@ = 1 
      end
  end
return
:Scan
wait 0
if 
0AB0: key_pressed 0x50 
jf @Scan  
  gosub @SkinChange 
  wait 100   
jump @Scan


Ini файл вам создавать не нужно, он создастся при первом нажатии на клавишу P, и срабатывании опкода записи значения в ini.
Вам же хочу пожелать удачи в скриптинге, комментируйте, задавайте вопросы если что непонятно и предлагайте идеи по поводу будущих статей. Скачать готовый скрипт можно здесь - ссылка

Для копирования материала следует указать ссылку на Gamemodding.net!
7
18
Нравится:  18
smalloff
smalloff

Опубликовано 3 апреля 2014

В избранное
Поделиться
Поделиться:

Комментарии (7)

Информация
Для того, чтобы оставлять комментарии к данной публикации необходимо зарегистрироваться .

Правила сайта и политика конфиденциальности

© 2012-2024 GameModding.com Все права защищены.