Игровой Портал State Texas RolePlay and Drift 4 You
Игровой Портал State Texas RolePlay and Drift 4 You
Игровой Портал State Texas RolePlay and Drift 4 You


 

Поделиться
 

 Пишем мод с 0.(урок 2)

Предыдущая тема Следующая тема Перейти вниз 
АвторСообщение
Felave
Пользователь
Пользователь
Felave

Сообщения : 125
Город : Нижний Новгород
Репутация : 44

Пишем мод с 0.(урок 2) Empty
СообщениеТема: Пишем мод с 0.(урок 2)   Пишем мод с 0.(урок 2) Empty2012-07-03, 08:12

В этом уроке мы создадим простую систему транспорта, создать, перекрасить, припарковать. Так же мы научимся сохранять, и загружать аккаунт игрока.
Действие первое. Сохранение данных аккаунта игрока:
В первом уроке, мы создавали enum, с массивами для игрока. Найти его можно, нажав Ctrl + f => pInfo.
Там мы видим массив:
Код:
pPass[64],
После него добавляем:
Код:
pAdmin,
Этот массив будет отвечать за Админ Уровень игрока.
Теперь его надо загрузить. Делаем в OnPlayerLogin.
Для этого ищем паблик OnPlayerLogin, и в нём ищем строку:
Код:
ini_setString(iniFile,"Pass",Player[playerid][pPass]);
Эта строка загружала наш пароль, после него вставляем:
Код:
ini_getInteger(iniFile,"Admin",Player[playerid][pAdmin]);
Тем самым мы загрузим админ уровень игрока, из файла.
Если внимательно посмотреть, можно заметить различие между загрузкой пароля, и загрузкой админ уровня.
Различие заключается в том, что пароль игрока может хранить буквенные, и числовые данные, а админ уровень, только числовые.

Теперь нам надо сделать сохранение админ уровня, для этого ищем SavePlayer.
В нём ищем строчку:
Код:
ini_setString(iniFile,"Pass",Player[playerid][pPass]);
После неё добавляем:
Код:
ini_setInteger(iniFile,"Admin",Player[playerid][pAdmin]);
Наш админ уровень будет сохранён, но вот что мы забыли..
Для сохранения аккаунта, функцию сохранения, надо запускать, что мы сейчас и сделаем.
Выгодней всего, сохранять аккаунт при изменении чего либо в аккаунте, но так же, можно сделать это и при выходе с сервера. Так мы и поступим.
Ищем паблик OnPlayerDisconnect.
В него вставляем:
Код:
SavePlayer(playerid);
Вот и готово. При выходе с сервера, аккаунт игрока будет автоматически сохранён.
Админ уровень готов. Так же вы можете добавить любой масив, аналогично с этим, пусть это будет возраст, или количество денег у вашего игрока.

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

Для начала, в конец мода, надо вставить необходимые функции, без которых не обходиться не один мод.
Код:
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, добавим:
Код:
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;// Максимальное колличество авто
С этими массивами, мы и будем работать. Каждый из них подписан, и думаю понятен.
Далее, для снижения нагрузки на сервер, в начало мода, после инклудов, добавить:
Код:
#undef MAX_VEHICLES// Отключаем стандартное максимальное колличество машин
#define MAX_VEHICLES 50// Задаём новое значение, 50 машин...
Думаю пояснение не нужно.
Теперь нам нужно загрузить машины из файла. Для этого, опускаемся в конец мода, и вставляем туда:
Код:
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, необходимо вставить:
Код:
LoadVeh();
Из файла в массив, загрузятся переменные, но надо их использовать, для этого,в паблик OnGameModeInit, ниже LoadVeh();, вставляем:
Код:
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]);
    }
Загрузка готова, машины загружены, теперь нужно сохранение..

Для этого, опускаемся в конец мода, и вставляем туда:
Код:
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, и в начало паблика, вставляем:
Код:
new veh = GetPlayerVehicleID(playerid);
    new string[256];
    new cmd[128], tmp[128], idx;
    cmd = strtok(cmdtext, idx);
Это всё нам пригодится. В дальнейшем. Дальше вставляем в этот же паблик команду:
Код:
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 помощью этой команды, можно создать машину на сервере. Увы разбирать команду нет времени, но я всё подписал, должно быть понятно.
Так же добавим команду, для смены цвета транспорта:
Код:
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;
    }
Ну и на последок, добавим команду для сохранения позиции транспорта:
Код:
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
Редактор и оформитель:Felave
vehicle.ini - закидывать в scripfiles.
Что должно получиться(new.pwn)
Первый урок
Вернуться к началу Перейти вниз
L1oN
Гость
Anonymous


Пишем мод с 0.(урок 2) Empty
СообщениеТема: Re: Пишем мод с 0.(урок 2)   Пишем мод с 0.(урок 2) Empty2013-02-22, 07:23

ждём продолжения
Вернуться к началу Перейти вниз
L1oN
Гость
Anonymous


Пишем мод с 0.(урок 2) Empty
СообщениеТема: Re: Пишем мод с 0.(урок 2)   Пишем мод с 0.(урок 2) Empty2013-02-22, 07:24

и кстати файл vehicle.ini в файлообменнике удалён , где ещё можно скачать? весь интернет облазил
Вернуться к началу Перейти вниз
 

Пишем мод с 0.(урок 2)

Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
Игровой Портал State Texas RolePlay and Drift 4 You :: Корзина :: Архив тем, которые разрешены для просмотра всем пользователям :: Уроки Pawno-
Игровой портал | www.portal-games.com
Рейтинг серверов mmotop
State Texas | YouTube