shape1
shape2
shape3
shape4
shape7
shape8

Решаем проблему с системой авто(mxINI)


Basis

chto tut doljno bit`!?
Пользователь
24.06.2014
824
1
271
0
25
Всем привет,на форуме много тем насчёт продажи авто государству,мол что после рестарта сервер начинает неисправно работать.Когда-то и меня данный вопрос волновал и я решил в этом разобраться. Данная тема поможет для тех кто использует моды Gamer(и разные моды на его основе) короче говоря где данные о машине записываются в отдельный файл как порядковый номер(1.2.3.4.5....).
У каждого эта система выглядит по разному и подстраивать под каждую систему я не буду,но покажу на примере:
Я создал в начале enum и переменную отвечающие за хранение значений


enum cInfo
{
cID,//ид машины
cModel,//модель машины
Float:cX,//координаты по оси Х
Float:cY,//координаты по оси Y
Float:cZ,//координаты по оси Z
Float:cA,//координаты по оси A
cOwner[24],//владелец
}
new CarInfo[MAX_VEHICLES][cInfo];
new AllCars;//подсчёт машин
добавил в OnGameModeInit

LoadCars();//загрузка машин
Именно в загрузке,сохранении код чуть-чуть поменяется,в моём случае это выглядит так,что именно добавил я подчеркнул красным

stock LoadCars()
{
    new ids[18],str[64];
    new iniOpens = ini_openFile("vehicle.cfg");
    ini_getInteger(iniOpens, "AllCars", AllCars);//узнаем кол-во личных машин
    ini_closeFile(iniOpens);//закрываем файл
    if(AllCars != 0)//если есть машины
    {
    for(new c = 1; c <= AllCars; c++)//цикл
{
    format(ids,sizeof(ids),"vehicle/%d.ini",c);//задаём путь к файлу
    if(!fexist(ids))continue;//пропускаем если файла нет
  new inicOpen = ini_openFile(ids);//открываем файл
  ini_getInteger(inicOpen, "model", CarInfo[c][cModel]);
  ini_getFloat(inicOpen, "x", CarInfo[c][cX]);
  ini_getFloat(inicOpen, "y", CarInfo[c][cY]);
  ini_getFloat(inicOpen, "z", CarInfo[c][cZ]);
  ini_getFloat(inicOpen, "a", CarInfo[c][cA]);
  ini_getString(inicOpen, "owner", str);
  format(CarInfo[c][cOwner],24,"%s",str);
  ini_closeFile(inicOpen);//закрываем файл
CarInfo[c][cID] = CreateVehicle(CarInfo[c][cModel],CarInfo[c][cX],CarInfo[c][cY],CarInfo[c][cZ],CarInfo[c][cA],0,0,-1);//создаем машину
}
}
return 1;
}

далее я заменил SaveCars дабы избежать багов

stock SaveCars(c)
{
    new ids[18];
format(ids,sizeof(ids),"vehicle/%d.ini",c);//путь к файлу
if(!fexist(ids))return 1;//если данного файла нет возвращаем
new inicOpen = ini_openFile(ids);//открываем
ini_setInteger(inicOpen, "model", CarInfo[c][cModel]);
ini_setFloat(inicOpen, "x", CarInfo[c][cX]);
ini_setFloat(inicOpen, "y", CarInfo[c][cY]);
ini_setFloat(inicOpen, "z", CarInfo[c][cZ]);
ini_setFloat(inicOpen, "a", CarInfo[c][cA]);
ini_setString(iniccOpen, "owner", CarInfo[c][cOwner]);
ini_closeFile(inicOpen);//закрываем
return 1;
}
Теперь покажу как примерно должна выглядеть команда продажи машины(осталось сделать проверку на ник и вернуть деньги)


if(strcmp(string, "/dcar", true) == 0)
{
if(!IsPlayerInAnyVehicle(playerid))return 1;
if(GetRealID(GetPlayerVehicleID(playerid)) == -1)return 1;
new ids[18];
format(ids,sizeof(ids),"vehicle/%d.ini",GetRealID(GetPlayerVehicleID(playerid)));//путь к файлу
fremove(ids);//удаляем файл
format(CarInfo[GetRealID(GetPlayerVehicleID(playerid))][cOwner],24,"Nones");//присваиваем владельца
CarInfo[GetRealID(GetPlayerVehicleID(playerid))][cID] = INVALID_VEHICLE_ID;//-1
DestroyVehicle(GetPlayerVehicleID(playerid));//удаляем машину
    return 1;
}
Пример как это выглядит в файлах:

У на есть файлы 1,2,3,4,5,6,7 мы берём и удаляем машину под номером 4 и у нас остаётся уже 6 машин(1,2,3,5,6,7) и при загрузке мы откидываем файл с этим номером так как он отсутствует.
+ никаких дополнительных нагрузок вы не получаете
+ вы получаете продажу машин государству без каких либо проблем,по крайней мере я не встречал проблем пока тестил 
- место под номером 4 остаётся пустовать.Т.е. если потом еще создавать машины то порядковый номер будет не 4,а 8

Автор: Basis

 
Последнее редактирование модератором: