Lineage |
Дата: Вторник, 26.06.2012, 11:06 | Сообщение # 1
|
Боец
Сообщений: 123
Статус: Offline
|
В этом уроке мы создадим простую систему транспорта, создать, перекрасить, припарковать. Так же мы научимся сохранять, и загружать аккаунт игрока. Ну начнём.
Действие первое. Сохранение данных аккаунта игрока:
В первом уроке, мы создавали enum, с массивами для игрока. Найти его можно, нажав Ctrl + f => pInfo. Там мы видим массив:
После него добавляем:
Этот массив будет отвечать за Админ Уровень игрока. Теперь его надо загрузить. Делаем в 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, необходимо вставить:
Из файла в массив, загрузятся переменные, но надо их использовать, для этого,в паблик 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
|
|
|
|