1) Система номеров - как покупаешь машину дается номер. 2) Пробег авто - при продаже учитывается пробег авто, и тем самым снижается цена 3) Авто можно продать государству или игроку (/sellmycar) 4) Состояние авто - при продаже тоже учитывается + чем меньше состояние, тем больше требуется бензина 5) Посторонний человек в авто не сядет, только владелец 6) Если машина взорвалась, она остается там где взорвал 7) Система тюннинга - тюннинг сохраняется, при продаже машины, тюннинг исчезает 8) Команды: /sellmycar или /sellmycar id сумма(продать авто), /carpass или /carpass id(документы на транспорт), /park(вернуть авто на место парковки), /fixcar(возвратить авто к бизнессу FixCar), /editmodelcar(изменить модель авто), /editlevelcar(изменить лвл машины), /editpricecar(изменить цену авто), /asellcar(продать авто админам)
Итак сначало создадим переменную в аккаунте игрока. Для этого в конец pInfo ставим:
pNomerCar,
В public OnPlayerConnect:
ClearCarInfo(playerid);
Теперь сделаем чтобы когда другой пользователь регистрировался, номер у него был "None". Для этого делаем stock:
stock ClearCarInfo(playerid)
{
if(IsPlayerConnected(playerid))
{
new string[MAX_PLAYER_NAME];
format(string, sizeof(string), "None");
strmid(PlayerInfo[playerid][pNomerCar], string, 0, strlen(string), 255);
}
return 1;
}
Теперь сохранение и загрузка номера игрока. Для этого в public OnPlayerRegister:
format(var, 32, "NomerCar=%s\n",PlayerInfo[playerid][pNomerCar]);fwrite(hFile, var);
В public OnPlayerRename:
format(var, 32, "NomerCar=%s\n",PlayerInfo[playerid][pNomerCar]);fwrite(hFile, var);
Потом в public SavePlayer:
format(var, 32, "NomerCar=%s\n",PlayerInfo[playerid][pNomerCar]);fwrite(hFile, var);
Ну и в public OnPlayerLogin добавляем это:
if( strcmp( key , "NomerCar" , true ) == 0 ) { val = ini_GetValue( Data ); strmid(PlayerInfo[playerid][pNomerCar], val, 0, strlen(val)-1, 255); }
Так, теперь сам авторынок. Вообщем перед или после pInfo, вообщем все равно, добавляем это:
#define MAX_BUYABLE_CARS 1 // максимально машин на сервере
#define SELLCARDIALOG 9541
#define CHECKPOINT_CAR 11
new prodmoney[MAX_PLAYERS];
new prodcarid[MAX_PLAYERS];
new prodcar[MAX_PLAYERS];
new prodcarinfo[MAX_PLAYERS];
new prodcarmoney[MAX_PLAYERS];
#define MAX_COMPONENTS 16 // максимально компонентов тюннинга
enum vInfo
{
vOwned,
vOwner[MAX_PLAYER_NAME],
vModel,
Float:vPos[4],
vColor[2],
vPrice,
vLevel,
vNomer[40],
Float:vProbeg,
vPercent,
vDate,
Components[MAX_COMPONENTS],
};
new CarsInfo[MAX_BUYABLE_CARS][vInfo];
new BuyableCar[MAX_BUYABLE_CARS];
forward CreateVehicles();
forward SaveVehicleData(vehicleid,playerid);
stock IsOwnableCar(carid)
{
if(carid <= MAX_BUYABLE_CARS) {return 1;}
else {return 0;}
}
Теперь сделаем создание авто, загрузку, сохранение, ну и сохранение позиции авто. Делаем Stock'и:
stock LoadBuyableCars()
{
new arrCoords[31][64];
new strFromFile2[256];
new File: file = fopen("cars.cfg", io_read);
new idx;
if (file)
{
while (idx < sizeof(CarsInfo))
{
fread(file, strFromFile2);
split(strFromFile2, arrCoords, ',');
CarsInfo[idx][vOwned] = strval(arrCoords[0]);
strmid(CarsInfo[idx][vOwner], arrCoords[1], 0, strlen(arrCoords[1]), 255);
CarsInfo[idx][vModel] = strval(arrCoords[2]);
CarsInfo[idx][vPos][0] = floatstr(arrCoords[3]);
CarsInfo[idx][vPos][1] = floatstr(arrCoords[4]);
CarsInfo[idx][vPos][2] = floatstr(arrCoords[5]);
CarsInfo[idx][vPos][3] = floatstr(arrCoords[6]);
CarsInfo[idx][vColor][0] = strval(arrCoords[7]);
CarsInfo[idx][vColor][1] = strval(arrCoords[8]);
CarsInfo[idx][vPrice] = strval(arrCoords[9]);
CarsInfo[idx][vLevel] = strval(arrCoords[10]);
strmid(CarsInfo[idx][vNomer], arrCoords[11], 0, strlen(arrCoords[11]), 255);
CarsInfo[idx][vProbeg] = floatstr(arrCoords[12]);
CarsInfo[idx][vPercent] = strval(arrCoords[13]);
CarsInfo[idx][vDate] = strval(arrCoords[14]);
CarsInfo[idx][Components][0] = strval(arrCoords[15]);
for(new i = 1; i < 14; i++)
{
CarsInfo[idx][Components][i] = strval(arrCoords[16+i]);
}
idx++;
}
fclose(file);
}
print("Система машин успешно загружена!");
printf("Загружено машин: %d",idx);
return 1;
}
stock CreateVehicles()
{
for(new c = 0; c < sizeof(CarsInfo); c++)
{
new stringi[24];
BuyableCar[c] = CreateVehicle(CarsInfo[c][vModel], CarsInfo[c][vPos][0], CarsInfo[c][vPos][1], CarsInfo[c][vPos][2], CarsInfo[c][vPos][3], CarsInfo[c][vColor][0], CarsInfo[c][vColor][1], -1);
if(CarsInfo[c][vOwned] == 0)
{
format(stringi,sizeof(stringi)," ");
}
else
{
format(stringi,sizeof(stringi),"%s",CarsInfo[c][vNomer]);
}
ChangeVehiclePaintjob(BuyableCar[c], CarsInfo[c][Components][0]);
ChangeVehicleColor(BuyableCar[c], CarsInfo[c][vColor][0],CarsInfo[c][vColor][1]);
for(new i = 1; i < 14; i++)
{
AddVehicleComponent(BuyableCar[c], CarsInfo[c][Components][i]);
}
SetVehicleNumberPlate(BuyableCar[c],stringi);
}
return 1;
}
stock SaveVehicleData(vehicleid,playerid)
{
new Float:x,Float:y,Float:z,Float:a;
if(!IsPlayerInAnyVehicle(playerid)) return 1;
if(!IsOwnableCar(vehicleid)) return 1;
GetVehiclePos(vehicleid,x,y,z);
GetVehicleZAngle(vehicleid,a);
CarsInfo[vehicleid-1][vPos][0] = x;
CarsInfo[vehicleid-1][vPos][1] = y;
CarsInfo[vehicleid-1][vPos][2] = z;
CarsInfo[vehicleid-1][vPos][3] = a;
CarsInfo[vehicleid-1][Components][0] = getVehiclePaintJob(vehicleid);
for(new i = 1; i <= 14; i++)
{
CarsInfo[vehicleid-1][Components][i] = GetVehicleComponentInSlot(vehicleid, i - 1);
}
new color[2];
getVehicleColor(vehicleid, color[0], color[1]);
CarsInfo[vehicleid-1][vColor][0] = color[0];
CarsInfo[vehicleid-1][vColor][1] = color[1];
OnPropUpdate();
return 1;
}
forward Float:GetVehicleSpeed(vehid);
public Float:GetVehicleSpeed(vehid)
{
new
Float:X,
Float:Y,
Float:Z,
Float:PlayerToPoints;
GetVehicleVelocity(vehid, X, Y, Z);
PlayerToPoints = floatsqroot(floatpower(X, 2) + floatpower(Y, 2) + floatpower(Z, 2))*100;
return PlayerToPoints;
}
forward Probeg();
public Probeg()
{
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i))
{
if(IsPlayerInAnyVehicle(i))
{
if(IsOwnableCar(GetPlayerVehicleID(i)))
{
new Float:sp = GetPlayerSpeed(i);
new string[256];
new Float:ms;
ms = (sp/1.4)/1000;
CarsInfo[GetPlayerVehicleID(i)-1][vProbeg] += ms;
format(string,256,"%f km",CarsInfo[GetPlayerVehicleID(i)-1][vProbeg]);
TextDrawSetString(probeg[i],string);
}
}
}
}
return 1;
}
В public OnPropUpdate суем:
idx = 0;
while (idx < sizeof(CarsInfo))
{
new coordsstring[256];
format(coordsstring, sizeof(coordsstring), "%d,%s,%d,%f,%f,%f,%f,%d,%d,%d,%d,%s,%f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
CarsInfo[idx][vOwned],
CarsInfo[idx][vOwner],
CarsInfo[idx][vModel],
CarsInfo[idx][vPos][0],
CarsInfo[idx][vPos][1],
CarsInfo[idx][vPos][2],
CarsInfo[idx][vPos][3],
CarsInfo[idx][vColor][0],
CarsInfo[idx][vColor][1],
CarsInfo[idx][vPrice],
CarsInfo[idx][vLevel],
CarsInfo[idx][vNomer],
CarsInfo[idx][vProbeg],
CarsInfo[idx][vPercent],
CarsInfo[idx][vDate],
CarsInfo[idx][Components][0],
CarsInfo[idx][Components][1],
CarsInfo[idx][Components][2],
CarsInfo[idx][Components][3],
CarsInfo[idx][Components][4],
CarsInfo[idx][Components][5],
CarsInfo[idx][Components][6],
CarsInfo[idx][Components][7],
CarsInfo[idx][Components][8],
CarsInfo[idx][Components][9],
CarsInfo[idx][Components][10],
CarsInfo[idx][Components][11],
CarsInfo[idx][Components][12],
CarsInfo[idx][Components][13],
CarsInfo[idx][Components][14]);
if(idx == 0)
{
file2 = fopen("cars.cfg", io_write);
}
else
{
file2 = fopen("cars.cfg", io_append);
}
fwrite(file2, coordsstring);
idx++;
fclose(file2);
}
Потом суем в OnPlayerDisconnect:
SaveVehicleData(GetPlayerVehicleID(playerid),playerid);
И в OnPlayerExitVehicle:
SaveVehicleData(vehicleid,playerid);
Теперь в OnGameModeInit:
LoadBuyableCars();
CreateVehicles();
SetTimer("Probeg",500,1);
Теперь займемся пробегом, добавим ко всем new:
new Text:probeg[MAX_PLAYERS];
В public OnPlayerConnect(playerid):
probeg[playerid] = TextDrawCreate(610.0000, 135.0000, "loading");
TextDrawAlignment(probeg[playerid], 3);
TextDrawFont(probeg[playerid], 1);
TextDrawLetterSize(probeg[playerid], 0.4, 2.0);
TextDrawColor(probeg[playerid], 0xFFFFFFFF);
TextDrawBackgroundColor(probeg[playerid],0x8B00FDAA);
TextDrawSetShadow(probeg[playerid], 1);
TextDrawAlignment(probeg[playerid], 3);
В OnPlayerDisconnect:
TextDrawHideForPlayer(playerid,probeg[playerid]); TextDrawDestroy(probeg[playerid]);
В public OnPlayerStateChange(playerid, newstate, oldstate) после if(newstate == PLAYER_STATE_ONFOOT) вставляем:
TextDrawHideForPlayer(playerid,probeg[playerid]);
В тот же паблик но уже после if(newstate == PLAYER_STATE_DRIVER) вставляем:
if(IsOwnableCar(newcar))
{
format(string,256,"%f km",CarsInfo[newcar-1][vProbeg]);
TextDrawSetString(probeg[playerid],string);
TextDrawShowForPlayer(playerid,probeg[playerid]);
}
Найдите switch (gPlayerCheckpointStatus[playerid]) и после вставьте:
case CHECKPOINT_CAR:
{
PlayerPlaySound(playerid, 1058, 0.0, 0.0, 0.0);
DisablePlayerCheckpoint(playerid);
gPlayerCheckpointStatus[playerid] = CHECKPOINT_NONE;
}
Следующее, мы впишем что осталось. Диалог на покупку авто:
else if(dialogid == 558)
{
new vid = GetPlayerVehicleID(playerid);
new buycar = vid-1;
if(response)
{
if(strcmp(PlayerInfo[playerid][pNomerCar],"None", true ) == 0 )
{
if(CarsInfo[buycar][vOwned] == 0)
{
if(GetPlayerMoney(playerid) >= CarsInfo[buycar][vPrice])
{
if(PlayerInfo[playerid][pLevel] >= CarsInfo[buycar][vLevel])
{
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
CarsInfo[buycar][vOwned] = 1;
strmid(PlayerInfo[playerid][pNomerCar],CarsInfo[buycar][vNomer],0,40,255);
new sendername[MAX_PLAYER_NAME];
GetPlayerName(playerid, sendername, sizeof(sendername));
strmid(CarsInfo[buycar][vOwner], sendername, 0, strlen(sendername), 255);
GivePlayerMoney(playerid,-CarsInfo[buycar][vPrice]);
TogglePlayerControllable(playerid, 1);
SendClientMessage(playerid, COLOR_GREY, "Поздравляем! Вы купили это авто!");
DateProp(playerid);
OnPropUpdate();
SavePlayer(playerid);
}
}
else
{
SendClientMessage(playerid, COLOR_RED, "Слишком маленький лвл для покупки машины!");
TogglePlayerControllable(playerid, 1);
RemovePlayerFromVehicle(playerid);
return 1;
}
}
else
{
SendClientMessage(playerid, COLOR_RED, "У вас нет столько денег!");
TogglePlayerControllable(playerid, 1);
RemovePlayerFromVehicle(playerid);
return 1;
}
}
}
else
{
SendClientMessage(playerid, COLOR_RED, "У вас уже есть транспорт!");
TogglePlayerControllable(playerid, 1); RemovePlayerFromVehicle(playerid);
return 1;
}
}
else
{
TogglePlayerControllable(playerid, 1); RemovePlayerFromVehicle(playerid);
return 1;
}
}
else if(dialogid == SELLCARDIALOG)
{
if(response)
{
new Float:x,Float:y,Float:z,Float:a;
new car = GetPlayerVehicleID(playerid);
CarsInfo[car-1][vProbeg] = 0.000000;
CarsInfo[car-1][vPercent] = 100;
CarsInfo[car-1][vOwned] = 0;
Engine(car,false);
Lights(car,false);
GetVehiclePos(car,x,y,z);
GetVehicleZAngle(car,a);
CarsInfo[car-1][vPos][0] = x;
CarsInfo[car-1][vPos][1] = y;
CarsInfo[car-1][vPos][2] = z;
CarsInfo[car-1][vPos][3] = a;
RemovePlayerFromVehicle(playerid);
DestroyVehicle(car);
for(new c;c < sizeof(CarsInfo); c++)
{
BuyableCar[c] = CreateVehicle(CarsInfo[c][vModel], x, y, z, a, CarsInfo[c][vColor][0], CarsInfo[c][vColor][1], -1);
SetVehicleNumberPlate(BuyableCar[c]," ");
}
new babki;
babki=CarsInfo[car-1][vPrice]/100*CarsInfo[car-1][vPercent] - floatround(CarsInfo[car-1][vProbeg],floatround_round)*100;
GivePlayerMoney(playerid,babki);
strmid(PlayerInfo[playerid][pNomerCar], "None", 0, strlen("None"), 255);
strmid(CarsInfo[car-1][vOwner], "The State", 0, strlen("The State"), 255);
PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0);
OnPropUpdate();
SavePlayer(playerid);
}
return 1;
}
Команда где у вас заводиться двигатель вставляем:
if(IsOwnableCar(GetPlayerVehicleID(playerid)) && CarsInfo[GetPlayerVehicleID(playerid)-1][vPercent] < 1)
{
SendClientMessage(playerid,COLOR_RED,"Ваша машина разбита, придется ее продать!");
return 1;
}
В паблик OnPlayerStateChange после if(newstate == PLAYER_STATE_DRIVER) вставляем:
if(newcar <= MAX_BUYABLE_CARS)
{
if(CarsInfo[newcar-1][vOwned] == 0)
{
format(string, sizeof string, "{ffffff}<< Этот транспорт продаётся >>\n\nМодель: {34c924}%s {ffffff}(%d)\nСтоимость: {34c924}$%d {ffffff}| Левел: {34c924}%d\n\n{ffffff}Номер: {34c924}%s", PlayerVehicle[GetVehicleModel(newcar)-400],GetVehicleModel(newcar), CarsInfo[newcar-1][vPrice], CarsInfo[newcar-1][vLevel], CarsInfo[newcar-1][vNomer]);
ShowPlayerDialog(playerid,558,DIALOG_STYLE_MSGBOX,"Транспорт продаётся", string,"Купить","Отмена");
}
}
if(IsOwnableCar(newcar) && CarsInfo[newcar-1][vOwned] != 0)
{
if(strcmp(PlayerInfo[playerid][pNomerCar],CarsInfo[newcar-1][vNomer], true ) != 0 )
{
SendClientMessage(playerid,COLOR_RED, "Это не ваша машина!");
RemovePlayerFromVehicle(playerid);
return 1;
}
}
Команды:
if(strcmp(cmd, "/carpass", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(!IsPlayerInAnyVehicle(playerid))
{
SendClientMessage(playerid, COLOR_GREY, "Вы не в машине!");
return 1;
}
new textcar[64];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
if(!IsOwnableCar(GetPlayerVehicleID(playerid))) return SendClientMessage(giveplayerid,COLOR_GREY,"В этой машине нет документов!");
format(string, sizeof(string), "%s достал(а) из бардачка документы.", Name(playerid));
ProxDetector(10.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
SendClientMessage(playerid,0x0AA8DAFF,"-------========[ VEHICLE PASSPORT ]========-------");
format(textcar,sizeof(textcar),"Модель: %s",PlayerVehicle[GetVehicleModel(GetPlayerVehicleID(playerid))-400]);
SendClientMessage(playerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Владелец: %s",CarsInfo[GetPlayerVehicleID(playerid)-1][vOwner]);
SendClientMessage(playerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Состояние: %d",CarsInfo[GetPlayerVehicleID(playerid)-1][vPercent]);
SendClientMessage(playerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Номер: %s",CarsInfo[GetPlayerVehicleID(playerid)-1][vNomer]);
SendClientMessage(playerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Пробег: %f км",CarsInfo[GetPlayerVehicleID(playerid)-1][vProbeg]);
SendClientMessage(playerid,0xC0E1EEFF, textcar);
SendClientMessage(playerid,0x0AA8DAFF,"==============================================");
return 1;
}
giveplayerid = ReturnUser(tmp);
if(IsPlayerConnected(giveplayerid))
{
if(giveplayerid != INVALID_PLAYER_ID)
{
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(giveplayerid == playerid) return SendClientMessage(giveplayerid,COLOR_GREY,"Самому себе документы нельзя показать!");
if(!ProxDetectorS(3.0, playerid, giveplayerid)) return SendClientMessage(giveplayerid,COLOR_GREY,"Вы слишком далеко!");
if(!IsOwnableCar(GetPlayerVehicleID(playerid))) return SendClientMessage(giveplayerid,COLOR_GREY,"В этой машине нет документов!");
format(string, sizeof(string), "%s достал(а) из бардачка документы и показал их %s.", Name(playerid),Name(giveplayerid));
ProxDetector(10.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
SendClientMessage(giveplayerid,0x0AA8DAFF,"-------========[ VEHICLE PASSPORT ]========-------");
format(textcar,sizeof(textcar),"Модель: %s",PlayerVehicle[GetVehicleModel(GetPlayerVehicleID(playerid))-400]);
SendClientMessage(giveplayerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Владелец: %s",CarsInfo[GetPlayerVehicleID(playerid)-1][vOwner]);
SendClientMessage(giveplayerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Состояние: %d",CarsInfo[GetPlayerVehicleID(playerid)-1][vPercent]);
SendClientMessage(giveplayerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Номер: %s",CarsInfo[GetPlayerVehicleID(playerid)-1][vNomer]);
SendClientMessage(giveplayerid,0xC0E1EEFF, textcar);
format(textcar,sizeof(textcar),"Пробег: %f км",CarsInfo[GetPlayerVehicleID(playerid)-1][vProbeg]);
SendClientMessage(giveplayerid,0xC0E1EEFF, textcar);
SendClientMessage(giveplayerid,0x0AA8DAFF,"==============================================");
return 1;
}
return 1;
}
}
}
return 1;
}
if(strcmp(cmd, "/sellmycar", true) == 0)
{
if(IsPlayerConnected(playerid))
{
GetPlayerName(playerid, playername, sizeof(playername));
if(strcmp(PlayerInfo[playerid][pNomerCar],"None", true ) == 0 )
{
SendClientMessage(playerid, COLOR_WHITE, "У вас нет машины!");
return 1;
}
new car = GetPlayerVehicleID(playerid);
if(PlayerInfo[playerid][pMarried] > 0)
{
SendClientMessage(playerid, COLOR_GREY, "Вы женаты и поэтому не можете продать свою машину!");
return 1;
}
if(strcmp(PlayerInfo[playerid][pNomerCar],"None", true ) != 0 && strcmp(playername, CarsInfo[car-1][vOwner], true) == 0)
{
tmp = strtok(cmdtext,idx);
if(!strlen(tmp))
{
format(string,sizeof(string),"{ffffff}Продать машину государству за {34c924}$%d{ffffff}?",((CarsInfo[car-1][vPrice]/100)*CarsInfo[car-1][vPercent]) - (floatround(CarsInfo[car-1][vProbeg],floatround_round)*100));
ShowPlayerDialog(playerid,SELLCARDIALOG,DIALOG_STYLE_MSGBOX,"Продажа автомобиля",string,"Да","Отменить");
SendClientMessage(playerid,COLOR_ISPOLZUY,"* Используйте: /sellmycar [id] [сумма]");
return 1;
}
giveplayerid = strval(tmp);
tmp = strtok(cmdtext,idx);
if(!strlen(tmp))
{
SendClientMessage(playerid,COLOR_ISPOLZUY,"* Используйте: /sellmycar [id] [сумма]");
return 1;
}
new money = strval(tmp);
if(!IsPlayerConnected(giveplayerid))
{
SendClientMessage(playerid,COLOR_GREY,"Нет такого игрока");
return 1;
}
if(money < 1)
{
SendClientMessage(playerid,COLOR_GREY,"Стоимость должна быть от 1$!");
return 1;
}
if(GetPlayerMoney(giveplayerid) < money)
{
SendClientMessage(playerid,COLOR_GREY,"У него нет столько денег!");
return 1;
}
if(playerid == giveplayerid)
{
SendClientMessage(playerid, COLOR_GREY, "Вы не можете продать машину самому себе!");
return 1;
}
if(strcmp(PlayerInfo[giveplayerid][pNomerCar],"None", true ) != 0 )
{
SendClientMessage(playerid,COLOR_GREY,"У этого игрока уже есть машина!");
return 1;
}
if(PlayerInfo[giveplayerid][pLevel] < CarsInfo[car-1][vLevel])
{
SendClientMessage(playerid, COLOR_GREY, "У этого игрока малый лвл!");
return 1;
}
if(ProxDetectorS(8.0, playerid, giveplayerid))
{
GetPlayerName(playerid,sendername,sizeof(sendername));
GetPlayerName(giveplayerid,giveplayer,sizeof(giveplayer));
prodcarid[giveplayerid] = playerid;
prodcarinfo[giveplayerid] = car;
strmid(prodcar[giveplayerid], CarsInfo[car-1][vNomer], 0, strlen(CarsInfo[car-1][vNomer]), 255);
prodcarmoney[giveplayerid] = money;
format(string,sizeof(string),"Вы предложили %s купить машину %s, с пробегом %f км, состоянием %d за $%d",giveplayer,PlayerVehicle[GetVehicleModel(car)-400],CarsInfo[car-1][vProbeg],CarsInfo[car-1][vPercent]
,money);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
format(string,sizeof(string),"%s предложил вам купить его машину %s, с пробегом %f км, состоянием %d за $%d (введите /accept sellcar чтобы купить)",sendername,PlayerVehicle[GetVehicleModel(car)-400],CarsInfo[car-1][vProbeg],CarsInfo[car-1][vPercent]
,money);
SendClientMessage(giveplayerid,COLOR_LIGHTBLUE,string);
return 1;
}
else
{
SendClientMessage(playerid, COLOR_GREY, "Игрок которому вы хотите продать машину не рядом с вами!");
}
}
else
{
SendClientMessage(playerid, COLOR_GREY, "У вас нет машины!");
}
}
return 1;
}
if(strcmp(cmd, "/park", true) == 0)
{
for(new car = 0; car < sizeof(CarsInfo); car++)
{
if(strcmp(Name(playerid),CarsInfo[car][vOwner],true) == 0)
{
SetVehiclePos(BuyableCar[car],CarsInfo[car][vPos][0],CarsInfo[car][vPos][1], CarsInfo[car][vPos][2]);
SetVehicleZAngle(BuyableCar[car],CarsInfo[car][vPos][3]);
SetPlayerCheckpoint(playerid, CarsInfo[car][vPos][0], CarsInfo[car][vPos][1], CarsInfo[car][vPos][2], 10.0);
SendClientMessage(playerid,COLOR_GREY,"* Автомобиль был возвращен к месту парковки!");
gPlayerCheckpointStatus[playerid] = CHECKPOINT_CAR;
}
else
{
SendClientMessage(playerid,COLOR_GREY,"У вас нет машины!");
return 1;
}
}
return 1;
}
if(strcmp(cmd, "/fixcar", true) == 0)
{
if(PlayerToPoint(2.0, playerid, SBizzInfo[4][sbEntranceX], SBizzInfo[4][sbEntranceY], SBizzInfo[4][sbEntranceZ]))
{
if(SBizzInfo[4][sbProducts] == 0)
{
GameTextForPlayer(playerid, "~r~Out Of Stock", 5000, 1);
return 1;
}
for(new car = 0; car < sizeof(CarsInfo); car++)
{
if(strcmp(Name(playerid),CarsInfo[car][vOwner],true) == 0)
{
SetVehiclePos(BuyableCar[car],2524.4014,-1466.1853,23.6246);
SetVehicleZAngle(BuyableCar[car],272.6978);
PlayerPlaySound(playerid, 1058, 0.0, 0.0, 0.0);
format(string,sizeof(string),"~g~FixCar service~n~~r~-$%d",SBizzInfo[4][sbEntranceCost]);
GameTextForPlayer(playerid, string, 5000, 1);
GivePlayerMoney(playerid,-SBizzInfo[4][sbEntranceCost]);
SBizzInfo[4][sbTill] += SBizzInfo[4][sbEntranceCost];
SBizzInfo[4][sbProducts]--;
OnPropUpdate();
}
else
{
SendClientMessage(playerid,COLOR_GREY,"У вас нет машины!");
return 1;
}
}
}
else
{
SendClientMessage(playerid,COLOR_GREY,"Вы не у бизнеса Fix Car!");
return 1;
}
return 1;
}
if(strcmp(cmd, "/editmodelcar", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] < 6) return SendClientMessage(playerid, COLOR_LIGHTRED, "* Вам недоступна эта команда!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_ISPOLZUY, "* Используй: /editmodelcar [Модель]");
return 1;
}
new model;
model = strval(tmp);
if(model < 400 || model > 611) return SendClientMessage(playerid, COLOR_GREY, "Модель авто должна быть не менее 400 и не более 611!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы должны быть в машине!");
new car = GetPlayerVehicleID(playerid);
if(!IsOwnableCar(car)) return SendClientMessage(playerid, COLOR_GREY, "Нельзя изменить модель данной машине!");
new str[512];
format(str,512,"Вы успешно изменили модель данного авто на %d модель!",model);
SendClientMessage(playerid, COLOR_GREY, str);
new Float:x,Float:y,Float:z,Float:a;
GetVehiclePos(car,x,y,z);
GetVehicleZAngle(car,a);
CarsInfo[car-1][vPos][0] = x;
CarsInfo[car-1][vPos][1] = y;
CarsInfo[car-1][vPos][2] = z;
CarsInfo[car-1][vPos][3] = a;
CarsInfo[car-1][vModel] = model;
RemovePlayerFromVehicle(playerid);
DestroyVehicle(car);
for(new c;c < sizeof(CarsInfo); c++)
{
BuyableCar[c] = CreateVehicle(CarsInfo[c][vModel], x, y, z, a, CarsInfo[c][vColor][0], CarsInfo[c][vColor][1], -1);
SetVehicleNumberPlate(BuyableCar[c],CarsInfo[c][vNomer]);
ChangeVehiclePaintjob(BuyableCar[c], CarsInfo[c][Components][0]);
PutPlayerInVehicle(playerid,BuyableCar[c],0);
}
OnPropUpdate();
return 1;
}
if(strcmp(cmd, "/asellcar", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] < 6) return SendClientMessage(playerid, COLOR_LIGHTRED, "* Вам недоступна эта команда!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы должны быть в машине!");
new car = GetPlayerVehicleID(playerid);
if(!IsOwnableCar(car)) return SendClientMessage(playerid, COLOR_GREY, "Эту машину нельзя продать!");
SendClientMessage(playerid, COLOR_GREY, "Вы успешно продали эту машину!");
new Float:x,Float:y,Float:z,Float:a;
GetVehiclePos(car,x,y,z);
GetVehicleZAngle(car,a);
CarsInfo[car-1][vPos][0] = x;
CarsInfo[car-1][vPos][1] = y;
CarsInfo[car-1][vPos][2] = z;
CarsInfo[car-1][vPos][3] = a;
CarsInfo[car-1][vOwned] = 0;
CarsInfo[car-1][vProbeg] = 0.000000;
CarsInfo[car-1][vPercent] = 100;
new vladelec[256];
strmid(vladelec, CarsInfo[car-1][vOwner], 0, strlen(CarsInfo[car-1][vOwner]), 255);
new str[64];
format(str, sizeof(str), "%s.ini",vladelec);
new File = iniOpen(str);
iniSet(File,"NomerCar","None");
iniClose(File);
strmid(CarsInfo[car-1][vOwner], "The State", 0, strlen("The State"), 255);
RemovePlayerFromVehicle(playerid);
DestroyVehicle(car);
for(new c;c < sizeof(CarsInfo); c++)
{
BuyableCar[c] = CreateVehicle(CarsInfo[c][vModel], x, y, z, a, CarsInfo[c][vColor][0], CarsInfo[c][vColor][1], -1);
SetVehicleNumberPlate(BuyableCar[c]," ");
}
OnPropUpdate();
return 1;
}
if(strcmp(cmd, "/editlevelcar", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] < 6) return SendClientMessage(playerid, COLOR_LIGHTRED, "* Вам недоступна эта команда!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_ISPOLZUY, "* Используй: /editlevelcar [Левел]");
return 1;
}
new model;
model = strval(tmp);
if(model < 1) return SendClientMessage(playerid, COLOR_GREY, "Лвл авто должен быть не менее 1!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы должны быть в машине!");
new car = GetPlayerVehicleID(playerid);
if(!IsOwnableCar(car)) return SendClientMessage(playerid, COLOR_GREY, "Нельзя изменить левел данной машине!");
new str[512];
format(str,512,"Вы успешно изменили лвл данного авто на %d лвл!",model);
SendClientMessage(playerid, COLOR_GREY, str);
CarsInfo[car-1][vLevel] = model;
OnPropUpdate();
return 1;
}
if(strcmp(cmd, "/editpricecar", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] < 6) return SendClientMessage(playerid, COLOR_LIGHTRED, "* Вам недоступна эта команда!");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_ISPOLZUY, "* Используй: /editpricecar [Цена]");
return 1;
}
new model;
model = strval(tmp);
if(model < 1) return SendClientMessage(playerid, COLOR_GREY, "Цена авто должна быть не менее $1!");
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы должны быть в машине!");
new car = GetPlayerVehicleID(playerid);
if(!IsOwnableCar(car)) return SendClientMessage(playerid, COLOR_GREY, "Нельзя изменить цену данной машине!");
new str[512];
format(str,512,"Вы успешно изменили цену данного авто на $%d!",model);
SendClientMessage(playerid, COLOR_GREY, str);
CarsInfo[car-1][vPrice] = model;
OnPropUpdate();
return 1;
}
Найдите команду /accept и добавьте:
else if(strcmp(x_job,"sellcar",true) == 0)
{
new ididpl = prodcarid[playerid];
new moneyy = prodcarmoney[playerid];
new car = prodcarinfo[playerid];
if(ididpl == -1)
{
SendClientMessage(playerid,COLOR_GREY,"Вам никто не предлагал купить машину!");
return 1;
}
if(!IsPlayerConnected(ididpl))
{
SendClientMessage(playerid,COLOR_GREY,"Вам никто не предлогал купить машину, или этот человек вышел!");
return 1;
}
if(GetPlayerMoney(playerid) < moneyy)
{
SendClientMessage(playerid,COLOR_GREY,"У вас нехватает денег!");
return 1;
}
GetPlayerName(playerid, sendername, sizeof(sendername));
GetPlayerName(ididpl, giveplayer, sizeof(giveplayer));
strmid(CarsInfo[car-1][vOwner], sendername, 0, strlen(sendername), 255);
ConsumingMoney[ididpl] = 1;
GivePlayerMoney(ididpl,moneyy);
RemovePlayerFromVehicle(ididpl);
ConsumingMoney[playerid] = 1;
GivePlayerMoney(playerid,-moneyy);
PlayerPlaySound(ididpl, 1052, 0.0, 0.0, 0.0);
PlayerPlayMusic(playerid);
strmid(PlayerInfo[playerid][pNomerCar], prodcar[playerid], 0, strlen(prodcar[playerid]), 255);
format(string,sizeof(string),"None");
strmid(PlayerInfo[ididpl][pNomerCar], string, 0, strlen(string), 255);
OnPropUpdate();
SavePlayer(playerid);
SavePlayer(ididpl);
format(string,sizeof(string),"Вы продали свою машину %s %s, с пробегом %f км, состоянием %d за $%d",sendername,PlayerVehicle[GetVehicleModel(car)-400],CarsInfo[car-1][vProbeg],CarsInfo[car-1][vPercent]
,moneyy);
SendClientMessage(ididpl,COLOR_LIGHTBLUE,string);
format(string,sizeof(string),"Вы купили машину %s у %s, с пробегом %f км, состоянием %d за $%d",PlayerVehicle[GetVehicleModel(car)-400],giveplayer,CarsInfo[car-1][vProbeg],CarsInfo[car-1][vPercent]
,moneyy);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
prodcar[playerid] = -1;
prodcarid[playerid] = -1;
prodcarmoney[playerid] = -1;
prodcarinfo[playerid] = -1;
}
Потом в public OnVehicleSpawn(vehicleid):
if(vehicleid <= MAX_BUYABLE_CARS)
{
if(CarsInfo[vehicleid-1][vOwned] == 1)
{
ChangeVehiclePaintjob(vehicleid, CarsInfo[vehicleid-1][Components][0]);
ChangeVehicleColor(vehicleid, CarsInfo[vehicleid-1][vColor][0], CarsInfo[vehicleid-1][vColor][1]);
for(new i = 1; i < 14; i++)
{
AddVehicleComponent(vehicleid, CarsInfo[vehicleid-1][Components][i]);
}
}
}
Вот 3 паблика если есть хотябы 1 из них, то просто замените, а так просто добавте:
public OnVehicleDeath(vehicleid, killerid)
{
new Float:pos[4];
GetVehiclePos(vehicleid, pos[0], pos[1], pos[2]);
GetVehicleZAngle(vehicleid, pos[3]);
CarsInfo[vehicleid-1][vPos][0] = pos[0];
CarsInfo[vehicleid-1][vPos][1] = pos[1];
CarsInfo[vehicleid-1][vPos][2] = pos[2];
CarsInfo[vehicleid-1][vPos][3] = pos[3];
new componn[14];
for(new i; i < 14; i++)
{
componn[i] = GetVehicleComponentInSlot(vehicleid, i);
}
DestroyVehicle(vehicleid);
new string[64];
for(new c; c< sizeof(CarsInfo); c++)
{
BuyableCar[c] = CreateVehicle(CarsInfo[vehicleid-1][vModel],pos[0],pos[1],pos[2],pos[3],CarsInfo[vehicleid-1][
vColor][0],CarsInfo[vehicleid-1][vColor][1],-1);
if(CarsInfo[c][vOwned] == 0)
{
format(string,sizeof(string)," ");
}
else
{
format(string,sizeof(string),"%s",CarsInfo[c][vNomer]);
}
ChangeVehiclePaintjob(BuyableCar[c], CarsInfo[c][Components][0]);
ChangeVehicleColor(BuyableCar[c], CarsInfo[c][vColor][0], CarsInfo[c][vColor][1]);
for(new i = 0; i < 14; i++)
{
AddVehicleComponent(BuyableCar[c], componn[i]);
}
SetVehicleNumberPlate(BuyableCar[c],string);
SetVehicleHealthAC(BuyableCar[c],1000.0);
}
return 1;
}
public OnVehicleDamageStatusUpdate(vehicleid, playerid)
{
if(CarsInfo[vehicleid-1][vPercent] < 1)
{
SendClientMessage(playerid,COLOR_RED,"Ваша машина разбита, придется ее продать!");
Engine(vehicleid,false);
Lights(vehicleid,false);
RemovePlayerFromVehicle(playerid);
}
if(CarsInfo[vehicleid-1][vPercent] < 0)
{
CarsInfo[vehicleid-1][vPercent] = 0;
}
new Float: carhp;
GetVehicleHealth(vehicleid, carhp);
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsOwnableCar(vehicleid))
{
if(carhp > 700 && carhp < 850)
{
CarsInfo[vehicleid-1][vPercent] -= 1;
return 1;
}
else if(carhp > 500 && carhp < 700)
{
CarsInfo[vehicleid-1][vPercent] -= 1;
return 1;
}
else if(carhp > 350 && carhp < 500)
{
CarsInfo[vehicleid-1][vPercent] -= 1;
return 1;
}
OnPropUpdate();
}
}
return 1;
}
new carsColors[MAX_VEHICLES];
stock getVehicleColor(vid, &c1, &c2)
{
c1 = (carsColors[vid] >> 8) & 0xFF;
c2 = carsColors[vid] & 0xFF;
}
public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
carsColors[vehicleid] = (color1 << 8) | (color2);
}
new car_paintjob[MAX_VEHICLES] = {-1, ...};
public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
car_paintjob[vehicleid] = paintjobid;
return 1;
}
stock getVehiclePaintJob(vehicleid)
{
return car_paintjob[vehicleid];
}
Вот и все.
Автор: PaHaNjkee
P.S. SetVehicleHealthAC заменить на SetVehicleHealth (просто у меня стоит античит)
Пока что там 1 машина (для теста), вот сам файл:
cars.rar
[177байт]Вот вроде и все.
Вход
Регистрация
Помощь














