[Урок 2]Пишем мод с Vovan228 - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Phoenixxx_Czar, Getbackthere, [CM]OlegEhtler  
[Урок 2]Пишем мод с Vovan228
Lineage Дата: Вторник, 26.06.2012, 11:06 | Сообщение # 1
Боец
Сообщений: 123
Статус: Offline
В этом уроке мы создадим простую систему транспорта, создать, перекрасить, припарковать. Так же мы научимся сохранять, и загружать аккаунт игрока.
Ну начнём.

Действие первое. Сохранение данных аккаунта игрока:

В первом уроке, мы создавали enum, с массивами для игрока. Найти его можно, нажав Ctrl + f => pInfo.
Там мы видим массив:

Code
pPass[64],


После него добавляем:

Code
pAdmin,


Этот массив будет отвечать за Админ Уровень игрока.
Теперь его надо загрузить. Делаем в OnPlayerLogin.
Для этого ищем паблик OnPlayerLogin, и в нём ищем строку:

Code
ini_setString(iniFile,"Pass",Player[playerid][pPass]);


Эта строка загружала наш пароль, после него вставляем:

Code
ini_getInteger(iniFile,"Admin",Player[playerid][pAdmin]);


Тем самым мы загрузим админ уровень игрока, из файла.
Если внимательно посмотреть, можно заметить различие между загрузкой пароля, и загрузкой админ уровня.
Различие заключается в том, что пароль игрока может хранить буквенные, и числовые данные, а админ уровень, только числовые.

Теперь нам надо сделать сохранение админ уровня, для этого ищем SavePlayer.
В нём ищем строчку:

Code
ini_setString(iniFile,"Pass",Player[playerid][pPass]);


После неё добавляем:

Code
ini_setInteger(iniFile,"Admin",Player[playerid][pAdmin]);


Наш админ уровень будет сохранён, но вот что мы забыли..
Для сохранения аккаунта, функцию сохранения, надо запускать, что мы сейчас и сделаем.
Выгодней всего, сохранять аккаунт при изменении чего либо в аккаунте, но так же, можно сделать это и при выходе с сервера. Так мы и поступим.
Ищем паблик OnPlayerDisconnect.
В него вставляем:

Code
SavePlayer(playerid);


Вот и готово. При выходе с сервера, аккаунт игрока будет автоматически сохранён.
Админ уровень готов. Так же вы можете добавить любой масив, аналогично с этим, пусть это будет возраст, или количество денег у вашего игрока.

Действие второе. Создание основы системы транспорта:

В этом действии, нам предстоит средняя по сложности работа, вникнув в которую, после, вы сможете самостоятельно, проявив свою фантазию украсить систему транспорта.

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

Code
strtok(const string[], &index)
{
     new length = strlen(string);
     while ((index < length) && (string[index] <= ' '))
     {
         index++;
     }
   
     new offset = index;
     new result[20];
     while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
     {
         result[index - offset] = string[index];
         index++;
     }
     result[index - offset] = EOS;
     return result;
}
   
stock split(const strsrc[], strdest[][], delimiter)
{
     new i, li;
     new aNum;
     new len;
     while(i <= strlen(strsrc)){
         if(strsrc[i]==delimiter || i==strlen(strsrc)){
             len = strmid(strdest[aNum], strsrc, li, i, 128);
             strdest[aNum][len] = 0;
             li = i+1;
             aNum++;
         }
         i++;
     }
     return 1;
}


Разбирать их мы не будем, но будем разбирать работу с ними.

Начнём создавать систему авто, с enum.

Перед enum pInfo, добавим:

Code
enum vInfo
{
     vAdd,// Проверка на созданную машину
     vID,// Ид Машины
     vModel,// Модель Машины
     Float:vVx,// Позиция X
     Float:vVy,// Позиция Y
     Float:vVz,// Позиция Z
     Float:vVa,// Угол поворота A
     vColor,// Цвет 1
     vColor2,// Цвет 2
}
new Veh[MAX_VEHICLES][vInfo];
new LastCar;// Максимальное колличество авто


С этими массивами, мы и будем работать. Каждый из них подписан, и думаю понятен.
Далее, для снижения нагрузки на сервер, в начало мода, после инклудов, добавить:

Code
#undef MAX_VEHICLES// Отключаем стандартное максимальное колличество машин
#define MAX_VEHICLES 50// Задаём новое значение, 50 машин...


Думаю пояснение не нужно.
Теперь нам нужно загрузить машины из файла. Для этого, опускаемся в конец мода, и вставляем туда:

Code
stock LoadVeh()
{
     new string[256],str[16],arrCoords[8][128];// Необходимые массивы
     new iniFile = ini_openFile("vehicle.ini");// Выбираем файл для загрузки, и открываем
     {
         for(new v = 1; v < MAX_VEHICLES; v++)// Цикл Авто
         {
             format(str,sizeof(str),"vID %d",v);// Выбираем какой ид загружать
             ini_getString(iniFile,str,string);// Загружаем ид
             split(string,arrCoords,',');// Разделяем загруженные числа запятой
             Veh[v][vAdd] = strval(arrCoords[0]);// Загружаем проверку на созданую машину
             if(Veh[v][vAdd] != 0)// Если машина создана, то..
             {
                 Veh[v][vModel] = strval(arrCoords[1]);// Загружаем модель
                 Veh[v][vVx] = floatstr(arrCoords[2]);// Загружаем позицию
                 Veh[v][vVy] = floatstr(arrCoords[3]);// Загружаем позицию
                 Veh[v][vVz] = floatstr(arrCoords[4]);// Загружаем позицию
                 Veh[v][vVa] = floatstr(arrCoords[5]);// Загружаем угол поворота
                 Veh[v][vColor] = strval(arrCoords[6]);// Загружаем цвет
                 Veh[v][vColor2] = strval(arrCoords[7]);// Загружаем второй цвет
                 LastCar++;// Прибавляем машину к общему колличеству
             }
         }
         ini_closeFile(iniFile);// Закрываем файл
     }
}


Всё подписано, и я думаю что понятно. Для запуска загрузки, в начало паблика OnGameModeInit, необходимо вставить:

Code
LoadVeh();


Из файла в массив, загрузятся переменные, но надо их использовать, для этого,в паблик OnGameModeInit, ниже LoadVeh();, вставляем:

Code
for(new v; v < MAX_VEHICLES; v++)// цикл машин
     {
         // Создаём машину, по загруженным координатам
         AddStaticVehicle(Veh[v][vModel],Veh[v][vVx],Veh[v][vVy],Veh[v][vVz],Veh[v][vVa],Veh[v][vColor],Veh[v][vColor2]);
     }


Загрузка готова, машины загружены, теперь нужно сохранение..

Для этого, опускаемся в конец мода, и вставляем туда:

Code
stock SaveVeh()
{
     new string[256],str[16];// Необходимые массивы
     new iniFile = ini_openFile("vehicle.ini");// Выбираем файл для записи, и открываем
     for(new v = 1; v < MAX_VEHICLES; v++)// Цикл авто
     {
         format(string,sizeof(string),"%d,%d,%f,%f,%f,%f,%d,%d",// Выбираем что записывать..
         Veh[v][vAdd],// Проверка на созданную машину
         Veh[v][vModel],// Модель машины
         Veh[v][vVx],// Позиция x
         Veh[v][vVy],// Позиция y
         Veh[v][vVz],// Позиция z
         Veh[v][vVa],// Угол поворота
         Veh[v][vColor],// Цвет 1
         Veh[v][vColor2]// Цвет 2
         );
         format(str,sizeof(str),"vID %d",v);// записываем ид машины
         ini_setString(iniFile,str,string);// записываем ид машины
     }
     ini_closeFile(iniFile);// Закрываем файл
}


Все пояснения оставлены в комметарии к коду.
Отлично, теперь наши машины будут сохраняться.
Теперь создадим пару команд для действий с транспортом. И начнём с команды создания транспорта.

Для этого, идём в паблик OnPlayerCommandText, и в начало паблика, вставляем:

Code
new veh = GetPlayerVehicleID(playerid);
     new string[256];
     new cmd[128], tmp[128], idx;
     cmd = strtok(cmdtext, idx);


Это всё нам пригодится. В дальнейшем. Дальше вставляем в этот же паблик команду:

Code
if(strcmp(cmd,"/addveh",true) == 0)
     {
         if(Player[playerid][pAdmin] > 0)// Если игрок админ..
         {
             tmp = strtok(cmdtext,idx);
             if(!strlen(tmp))// Если вы не ввели ид машины
             {
                 SendClientMessage(playerid,0xB4B5B7FF, "ПОМОЩЬ: /addveh [Модель Машины]");
                 return 1;
             }
             new addveh = strval(tmp);// Узнаём введёный ID машины
             if(addveh < 400 || addveh > 610)// Делаем ограничение на доступные машины
             {
                 SendClientMessage(playerid,0xB4B5B7FF, "ПОМОЩЬ: /addveh [Модель Машины]");
                 SendClientMessage(playerid,0xB4B5B7FF, "ПОМОЩЬ: Ид должен быть больше 400, и меньше 610");
                 return 1;
             }
             new Float:x,Float:y,Float:z,Float:a;// Массив для позиции
             GetPlayerPos(playerid,x,y,z);// Узнаём позицию игрока
             GetPlayerFacingAngle(playerid,a);// Узнаём угол поворота игрока
             LastCar++;// Прибавляем к последней добавленной машине одну
             Veh[LastCar][vAdd] = 1;// Устанавливаем проверку на созданную машину
             Veh[LastCar][vModel] = addveh;// Устанавливаем модель машине
             Veh[LastCar][vVx] = x;// Устанавливаем позицию
             Veh[LastCar][vVy] = y;// Устанавливаем позицию
             Veh[LastCar][vVz] = z;// Устанавливаем позицию
             Veh[LastCar][vVa] = a;// Устанавливаем позицию
             CreateVehicle(Veh[LastCar][vModel],Veh[LastCar][vVx],Veh[LastCar][vVy],Veh[LastCar][vVz],Veh[LastCar][vVa],1,1,6000000000);// Создаём машину на координатах
             SaveVeh();// Сохраняем
             format(string,sizeof(string),"* Вы создали машину %d, ид на сервере %d",addveh,LastCar);// Вывод
             SendClientMessage(playerid,0xB4B5B7FF,string);// Выводим Текст
         }
         else// Если игрок не админ..
         {
             SendClientMessage(playerid,0xB4B5B7FF,"* Вы не администратор");
         }
         return 1;
     }


C помощью этой команды, можно создать машину на сервере. Увы разбирать команду нет времени, но я всё подписал, должно быть понятно.
Так же добавим команду, для смены цвета транспорта:

Code
if(strcmp(cmd, "/avehcolor", true) == 0)
     {
         if(IsPlayerInAnyVehicle(playerid))
         {
             if(Player[playerid][pAdmin] > 0)// Если Игрок админ, то..
             {
                 tmp = strtok(cmdtext, idx);
                 if(!strlen(tmp))// Если не указали ид цвета
                 {
                     SendClientMessage(playerid,0xB4B5B7FF,"ПОМОЩЬ: /avehcolor [Цвет 1] [Цвет 2]");
                     return 1;
                 }
                 new color1;// Массив с цветом
                 color1 = strval(tmp);// Читаем введёный цвет
                 if(color1 < 0 && color1 > 126)// Если ид цвета недоступен
                 {
                     SendClientMessage(playerid,0xB4B5B7FF,"* Неверный ID Цвета!");
                     return 1;
                 }
                 tmp = strtok(cmdtext, idx);
                 if(!strlen(tmp))// Если введён один цвет
                 {
                     SendClientMessage(playerid,0xB4B5B7FF,"ПОМОЩЬ: /vehcolor [Цвет 1] [Цвет 2]");
                     return 1;
                 }
                 new color2;// Массив со вторым цветом
                 color2 = strval(tmp);// Читаем второй цвет
                 if(color2 < 0 && color2 > 126)// Если ид цвета недоступен
                 {
                     SendClientMessage(playerid,0xB4B5B7FF,"* Неверный ID Цвета");
                     return 1;
                 }
                 Veh[veh][vColor] = color1;// Устанавливаем машине цвет
                 Veh[veh][vColor2] = color2;// Устанавливаем машине второй цвет
                 ChangeVehicleColor(veh,color1, color2);// Красим машину
                 SaveVeh();// Сохраняем
                 return 1;
             }
             else// Если не админ..
             {
                 SendClientMessage(playerid,0xB4B5B7FF,"* Вы не админ");//Выводим сообщение
             }
         }
         return 1;
     }


Ну и на последок, добавим команду для сохранения позиции транспорта:

Code
if(strcmp(cmd,"/parkveh",true) == 0)
     {
         new Float:x,Float:y,Float:z;// Массив для позиции
         new Float:a;// Массив для позиции
         if(IsPlayerInVehicle(playerid, veh))// Если игрок в машине
         {
             GetVehiclePos(veh,x,y,z);// Узнаём позицию
             GetVehicleZAngle(veh,a);// Узнаём угол поворота
         }
         else// Если нет
         {
             SendClientMessage(playerid,0xB4B5B7FF,"* Вы не в транспортном средстве.");
             return 1;
         }
         Veh[veh][vVx] = x;// Устанавливаем позицию
         Veh[veh][vVy] = y;// Устанавливаем позицию
         Veh[veh][vVz] = z;// Устанавливаем позицию
         Veh[veh][vVa] = a;// Устанавливаем позицию
         SaveVeh();// Сохраненяем машину
         return 1;
     }


Вот и всё. Основа системы транспорта готова.

Автор:Vovan228


ZFS
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Лучшие пользователи
Admin [39113]

GеNius [7210]

[CM]Russel [5557]

kenlo763 [4952]

[CM]AGRESSOR [4639]

Snake_Firm [4452]

Сэс [4416]

Artem_Buero [4223]

[CM]Durman [3204]

[CM]Рафаэль [3080]

iMaddy [2855]

sky_Woker [2854]

getrekt [2745]

Новые пользователи
cheatjopa2 [11:58]

gabitovismaismaisma [09:18]

Gotham_ws [03:45]

раре [02:58]

Epiphonexmr [02:38]

ksuexe [01:35]

petrusenko_t [23:29]

shanepk60 [21:19]

chadaevvo18 [19:34]

zazik965mb [17:41]

AndreSR [16:49]

funovv [20:46]

Dizelmotnik [11:22]