PDA

Просмотр полной версии : [Вопрос] Система личного транспорта.



Camelot
15.08.2014, 04:51
Всем привет. Пишу систему личного ТС с 0. (MqSql r34)
Я наслышан, что ТС лучше начинать от ID 1. Это так, к слову.
Всё было хорошо до того момента, когда игрок покупает транспорт.
Суть проблемы такова:
На сервере 3 машины (ID 1, ID 2, ID 3). Игрок покупает машину с ID 2, но после покупки, машина с ID 2 остается не проданной (3D-Text не меняется), а машина с ID 3 приобретает 3D-text купленной машины ID 2 (Владелец: Camelot\n ID: 2).
Не уверен, что вы меня поняли, но суть самой проблемы должна быть понятна. Я уже 3-й день не могу понять. Может вы мне поможете...



public OnGameModeInit()
{
mysql_function_query(cHandle,"SELECT * FROM `Cars`",true,"BuyCarsLoad","");
}

const MAX_BUYCARS = 3;
enum cInfo { veh,ID,Owner[20],Model,Level,Price,Clr1,Clr2,Float:X,Float:Y,Float:Z,Float:A,Float:Heal,Dmg1,Dmg2,Dmg3,Dmg4,PJob,Text3D:Text }
new carInfo[MAX_BUYCARS][cInfo], allCars;
publics: BuyCarsLoad()
{
new timewe = GetTickCount();
cache_get_data(rows, fields);
if(!rows) return print("Error: Личный транспорт - Таблица пуста");
for(new car; car != rows; car++)
{
carInfo[car][ID] = getint(car, "ID");
carInfo[car][Model] = getint(car, "Model");
carInfo[car][Level] = getint(car, "Level");
carInfo[car][Price] = getint(car, "Price");
carInfo[car][Clr1] = getint(car, "Clr1");
carInfo[car][Clr2] = getint(car, "Clr2");
carInfo[car][X] = getpos(car, "X");
carInfo[car][Y] = getpos(car, "Y");
carInfo[car][Z] = getpos(car, "Z");
carInfo[car][A] = getpos(car, "A");
carInfo[car][Heal] = getpos(car, "Heal");
carInfo[car][Dmg1] = getint(car, "Dmg1");
carInfo[car][Dmg2] = getint(car, "Dmg2");
carInfo[car][Dmg3] = getint(car, "Dmg3");
carInfo[car][Dmg4] = getint(car, "Dmg4");
carInfo[car][PJob] = getint(car, "PJob");
getstr(car, "Owner", carInfo[car][Owner], MAX_PLAYER_NAME);
BuyCarsCreate(car), allCars++;
}
return printf("Загружено личных машин: %i. Времени затрачено: (%i мс)",allCars,GetTickCount()-timewe);
}
stock BuyCarsCreate(car)
{
carInfo[car][veh] = CreateVehicle(carInfo[car][Model], carInfo[car][X], carInfo[car][Y], carInfo[car][Z], carInfo[car][A], carInfo[car][Clr1], carInfo[car][Clr2], 0);
UpdateVehicleDamageStatus(carInfo[car][veh], carInfo[car][Dmg1], carInfo[car][Dmg2], carInfo[car][Dmg3], carInfo[car][Dmg4]);
SetVehicleHealth(carInfo[car][veh], carInfo[car][Heal]);
static const
fmt1[] = "«Стоимость: %d$»\n«Уровень: %d»\nID: %d",
fmt2[] = "{ccff00}Владелец: {FFFFFF}%s\n{ccff00}ID: {FFFFFF}%d";
new msg[sizeof(fmt2) - 2 + MAX_PLAYER_NAME - 2 + 4];
if(carInfo[car][PJob] > 0) ChangeVehiclePaintjob(carInfo[car][veh], carInfo[car][PJob]-1);
else if(!strcmp(carInfo[car][Owner], "No Name")) format(msg, sizeof(msg), fmt1, carInfo[car][Price], carInfo[car][Level], carInfo[car][ID]);
else format(msg, sizeof(msg), fmt2, carInfo[car][Owner], carInfo[car][ID]);
carInfo[car][Text] = Create3DTextLabel(msg, 0xFF0000FF, 0, 0, 0.6, 15, 0,1);
return Attach3DTextLabelToVehicle(carInfo[car][Text], carInfo[car][veh], 0, 0, 0.6);
}


public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
for(new car; car != allCars; car++)
{
if(GetPlayerVehicleID(playerid) != carInfo[car][veh]) continue;
else if(!strcmp(carInfo[car][Owner], "No Name"))
SetPVarInt(playerid, "BuyCarID", carInfo[car][ID]), Dialog(playerid, 123, DIALOG_STYLE_MSGBOX, "Покупка", "Вы желаете приобрести данный транспорт?", "Да", "Нет");
else if(strcmp(carInfo[car][Owner], "No Name") && PInfo[playerid][pAdmin] < 4)
return RemovePlayerFromVehicle(playerid);
}
}
return true;
}
//OnDialogResponse
case 123:
{
if(!response) return RemovePlayerFromVehicle(playerid);
new car = GetPVarInt(playerid, "BuyCarID");
if(PInfo[playerid][pCarID] > 0)
return Message(playerid, -1,"(Ошибка): У вас уже есть свой автомобиль!"), RemovePlayerFromVehicle(playerid);
else if(sGetPlayerMoney(playerid) < carInfo[car][Price])
return Message(playerid, -1,"(Ошибка): У вас недостаточно денег для покупки автомобиля!"), RemovePlayerFromVehicle(playerid);
else if(PInfo[playerid][pLevel] < carInfo[car][Level])
return Message(playerid, -1,"(Ошибка): У вас слишком маленький уровень для покупки автомобиля!"), CarUnFreeze(playerid);
PInfo[playerid][pCarID] = car;
sGivePlayerMoney(playerid, -carInfo[car][Price]);
strcat(carInfo[car][Owner], Nick(playerid), MAX_PLAYER_NAME);
format(str, sizeof(str), "{ccff00}Владелец: {FFFFFF}%s\n{ccff00}ID: {FFFFFF}%d", carInfo[car][Owner], car);
Update3DTextLabelText(carInfo[car][Text], 0x0000FFFF, str);
mysql_format(cHandle, sql_playa, sizeof(sql_playa), "UPDATE `Cars` SET `Owner`='%s' WHERE `ID` = '%d'", carInfo[car][Owner], car);
mysql_function_query(cHandle, sql_playa, false, "","");
return DeletePVar(playerid, "BuyCarID");
}

- - - Добавлено - - -

Редактировать пост почему-то нельзя... Опечатка там. MySql r34.
Сонный я уже. Не подумал о том, что вам будет сложно читать. Сократил код для читабельности.


const MAX_BUYCARS = 3;
enum cInfo { veh,ID, Owner[20], Model, Price, Text3D:Text }
new carInfo[MAX_BUYCARS][cInfo], allCars;
publics: BuyCarsLoad()
{
cache_get_data(rows, fields);
if(!rows) return print("Error: Личный транспорт - Таблица пуста");
for(new car; car != rows; car++)
{
carInfo[car][ID] = getint(car, "ID");
carInfo[car][Model] = getint(car, "Model");
carInfo[car][Price] = getint(car, "Price");
getstr(car, "Owner", carInfo[car][Owner], MAX_PLAYER_NAME);
carInfo[car][veh] = CreateVehicle(carInfo[car][Model], 0, 0, 0, 0, 1, 1, 0);
static const
fmt1[] = "«Стоимость: %d$»\nID: %d",
fmt2[] = "{ccff00}Владелец: {FFFFFF}%s\n{ccff00}ID: {FFFFFF}%d";
new msg[sizeof(fmt2) - 2 + MAX_PLAYER_NAME - 2 + 4];
else if(!strcmp(carInfo[car][Owner], "No Name")) format(msg, sizeof(msg), fmt1, carInfo[car][Price], carInfo[car][ID]);
else format(msg, sizeof(msg), fmt2, carInfo[car][Owner], carInfo[car][ID]);
carInfo[car][Text] = Create3DTextLabel(msg, 0xFF0000FF, 0, 0, 0.6, 15, 0,1);
Attach3DTextLabelToVehicle(carInfo[car][Text], carInfo[car][veh], 0, 0, 0.6);
allCars++;
}
return printf("Загружено личных машин: %i. Времени затрачено: (%i мс)",allCars,GetTickCount()-timewe);
}
//Если игрок в машине, то...
for(new car; car != allCars; car++)
{
if(getcar == carInfo[car][veh])
{
if(!strcmp(carInfo[car][Owner], "No Name"))
SetPVarInt(playerid, "BuyCarID", carInfo[car][ID]), Dialog(playerid, 123, DIALOG_STYLE_MSGBOX, "Покупка", "Вы желаете приобрести данный транспорт?", "Да", "Нет");
else if(strcmp(carInfo[car][Owner], "No Name")) return RemovePlayerFromVehicle(playerid);
}
}
//Диалог покупки
case 123:
{
if(!response) return RemovePlayerFromVehicle(playerid);
new car = GetPVarInt(playerid, "BuyCarID");
if(PInfo[playerid][pCarID] > 0)
return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}У вас уже есть свой автомобиль!"), CarUnFreeze(playerid);
PInfo[playerid][pCarID] = car;
sGivePlayerMoney(playerid, -carInfo[car][Price]);
strcat(carInfo[car][Owner], Nick(playerid), MAX_PLAYER_NAME);
format(str, sizeof(str), "{ccff00}Владелец: {FFFFFF}%s\n{ccff00}ID: {FFFFFF}%d", carInfo[car][Owner], car);
Update3DTextLabelText(carInfo[car][Text], 0x0000FFFF, str);
mysql_format(cHandle, sql_playa, sizeof(sql_playa), "UPDATE `Cars` SET `Owner`='%s' WHERE `ID` = '%d'", carInfo[car][Owner], car);
mysql_function_query(cHandle, sql_playa, false, "","");
return DeletePVar(playerid, "BuyCarID");
}

L0ndl3m
15.08.2014, 18:03
При покупке транспорта вычитайте единицу от того ID'а транспорта, который выбрали, допустим вы покупаете второй, тогда купите первый.

Salvacore
16.08.2014, 13:52
Закрыто.