PDA

Просмотр полной версии : [Вопрос] Проблема с загрузкой авто (mysql r41-3)



Kucklovod00
20.12.2017, 16:36
Доброго времени суток, господа.

В общем, столкнулся с проблемой загрузки автомобилей с базы данных.
Если насильно (дебаг) узнать ID в базе этого автомобиля, то один из автомобилей будет иметь ID 0. С чем это связано - неизвестно для меня, поэтому я решил обратиться к вам.

Скриншот: https://imgur.com/a/cWIDh

Лог загрузки авто
[14:42:23] Загружен транспорт: vID: 1, ID: 1, Fraction: 7
[14:42:23] Загружен транспорт: vID: 3, ID: 2, Fraction: 7
[14:42:23] Загружен транспорт: vID: 4, ID: 3, Fraction: 7

Колбэк загрузки авто

@LoadFractionVehicle();
@LoadFractionVehicle()
{
new time = GetTickCount();
new rows;
new id = VEHS;
cache_get_row_count(rows);
if(!rows) return print("- Динамические авто не найдены");
for(new i; i < rows; i++)
{
cache_get_value_name_int(i, "f_v_id", VehicleInfo[id][vID]);
cache_get_value_name_int(i, "f_v_model", VehicleInfo[id][vModel]);
cache_get_value_name_int(i, "f_v_fraction", VehicleInfo[id][vFraction]);
cache_get_value_name_int(i, "f_v_color1", VehicleInfo[id][vColor1]);
cache_get_value_name_int(i, "f_v_color2", VehicleInfo[id][vColor2]);
cache_get_value_name_float(i, "f_v_posX", VehicleInfo[id][vX]);
cache_get_value_name_float(i, "f_v_posY", VehicleInfo[id][vY]);
cache_get_value_name_float(i, "f_v_posZ", VehicleInfo[id][vZ]);
cache_get_value_name_float(i, "f_v_posA", VehicleInfo[id][vA]);
VehicleInfo[id][vVehicle] = AddTeamVehicle(VehicleInfo[id][vFraction], VehicleInfo[id][vModel], VehicleInfo[id][vX], VehicleInfo[id][vY], VehicleInfo[id][vZ], VehicleInfo[id][vA], VehicleInfo[id][vColor1], VehicleInfo[id][vColor2]);
printf("Загружен транспорт: vID: %d, ID: %d, Fraction: %d", VehicleInfo[id][vID], VehicleInfo[id][vVehicle], VehicleInfo[id][vFraction]);
VEHS++;
}
printf("[Загружено динамических автомобилей]: <%i>. Потрачено: <%i ms>.", rows, GetTickCount() - time);
return 1;
}

Функция создания авто

stock AddTeamVehicle(fraction, modelid, Float: X, Float: Y, Float: Z, Float: A, Color1, Color2)
{
new vehicleid = CreateVehicle(modelid, X, Y, Z, A, Color1, Color2, 300);
if(vehicleid == INVALID_VEHICLE_ID) return 0;

VehicleInfo[vehicleid][vFuel] = 100.0;
VehicleInfo[vehicleid][vFraction] = fraction;
printf("Создан транспорт vID: %i, ID: %d", VehicleInfo[vehicleid][vID], vehicleid);

SetVehicleNumberPlate(vehicleid, "San Andreas");
SetVehicleParamsEx(vehicleid, false, false, false, false, false, false, false);
ToggleLock(vehicleid, 0);

if(fraction == TEAM_FBI)
{
SignalTick[vehicleid][1] = -1;
LightsObject[vehicleid][0] = -1;
LightsObject[vehicleid][1] = -1;
LightsObject[vehicleid][2] = -1;
LightsObject[vehicleid][3] = -1;
}
switch(modelid)
{
case 430, 446, 452, 453, 454, 472, 473, 484, 493: VehicleState[vehicleid] = VEHICLE_STATE_BOAT;
case 417, 425, 447, 460, 469, 476, 487, 488, 497, 511, 512, 513, 519, 520, 548, 553,
563, 577, 592, 593: VehicleState[vehicleid] = VEHICLE_STATE_PLANE;
case 581, 522, 461, 521, 523, 463, 468, 471, 586: VehicleState[vehicleid] = VEHICLE_STATE_BIKE;
case 509, 481, 510: VehicleState[vehicleid] = VEHICLE_STATE_VELIK;
case 462, 448: VehicleState[vehicleid] = VEHICLE_STATE_MOPED;
case 538, 537: VehicleState[vehicleid] = VEHICLE_STATE_TRAIN;
default: VehicleState[vehicleid] = VEHICLE_STATE_CAR;
}
return vehicleid;
}

Также при редактировании координат этого авто, естественно они не редактируются, поскольку транспорта с ID 0 в базе нет.

DeimoS
20.12.2017, 17:49
Эмм, может я чего не углядел, но у тебя в загрузке авто сначала создаётся переменная id, которой присваивается значение VEHS, при загрузке данных используется значение переменной id, но в конце цикла уже изменяется значение VEHS. То бишь, все данные грузятся в одну ячейку, как я понимаю.
Тебе нужно было логировать именно значения i, id и VEHS после того, как проверил значение массива. А лучше сразу проверять стоило.

В общем, если я правильно понял логику кода, удаляй "new id..." и все id заменяй на VEHS. Хотя если значение VEHS совпадает с i, то и VEHS не нужна. Ну или i... В общем, нужно логировать и смотреть, если ответ хочешь получить

Kucklovod00
20.12.2017, 18:50
Эмм, может я чего не углядел, но у тебя в загрузке авто сначала создаётся переменная id, которой присваивается значение VEHS, при загрузке данных используется значение переменной id, но в конце цикла уже изменяется значение VEHS. То бишь, все данные грузятся в одну ячейку, как я понимаю.
Тебе нужно было логировать именно значения i, id и VEHS после того, как проверил значение массива. А лучше сразу проверять стоило.

В общем, если я правильно понял логику кода, удаляй "new id..." и все id заменяй на VEHS. Хотя если значение VEHS совпадает с i, то и VEHS не нужна. Ну или i... В общем, нужно логировать и смотреть, если ответ хочешь получить

Спасибо, на самом деле написал чушь какую-то. Убрал VEHS, в качестве ИДа использую i. Проблема не решена.

DeimoS
20.12.2017, 18:50
Так код покажи новый

Kucklovod00
21.12.2017, 11:16
Так код покажи новый

https://i.imgur.com/KQuVq6a.png

@LoadFractionVehicle();
@LoadFractionVehicle()
{
new time = GetTickCount();
new rows;
cache_get_row_count(rows);
if(!rows) return print("- Динамические авто не найдены");
for(new i; i < rows; i++)
{
cache_get_value_name_int(i, "f_v_id", VehicleInfo[i][vID]);
cache_get_value_name_int(i, "f_v_model", VehicleInfo[i][vModel]);
cache_get_value_name_int(i, "f_v_fraction", VehicleInfo[i][vFraction]);
cache_get_value_name_int(i, "f_v_color1", VehicleInfo[i][vColor1]);
cache_get_value_name_int(i, "f_v_color2", VehicleInfo[i][vColor2]);
cache_get_value_name_float(i, "f_v_posX", VehicleInfo[i][vX]);
cache_get_value_name_float(i, "f_v_posY", VehicleInfo[i][vY]);
cache_get_value_name_float(i, "f_v_posZ", VehicleInfo[i][vZ]);
cache_get_value_name_float(i, "f_v_posA", VehicleInfo[i][vA]);
printf("Загружен транспорт: vID: %d, vVehicle: %d, ID: %d", VehicleInfo[i][vID], VehicleInfo[i][vVehicle], i);
VehicleInfo[i][vVehicle] = AddTeamVehicle(VehicleInfo[i][vFraction], VehicleInfo[i][vModel], VehicleInfo[i][vX], VehicleInfo[i][vY], VehicleInfo[i][vZ], VehicleInfo[i][vA], VehicleInfo[i][vColor1], VehicleInfo[i][vColor2]);
}
printf("[Загружено динамических автомобилей]: <%i>. Потрачено: <%i ms>.", rows, GetTickCount() - time);
return 1;
}

stock AddTeamVehicle(fraction, modelid, Float: X, Float: Y, Float: Z, Float: A, Color1, Color2)
{
new vehicleid = CreateVehicle(modelid, X, Y, Z, A, Color1, Color2, 300);
if(vehicleid == INVALID_VEHICLE_ID) return 0;

VehicleInfo[vehicleid][vFuel] = 100.0;
VehicleInfo[vehicleid][vFraction] = fraction;
printf("- // - Создан транспорт vID: %i, ID в игре: %d", VehicleInfo[vehicleid][vID], vehicleid);

SetVehicleNumberPlate(vehicleid, "San Andreas");
SetVehicleParamsEx(vehicleid, false, false, false, false, false, false, false);
ToggleLock(vehicleid, 0);

if(fraction == TEAM_FBI)
{
SignalTick[vehicleid][1] = -1;
LightsObject[vehicleid][0] = -1;
LightsObject[vehicleid][1] = -1;
LightsObject[vehicleid][2] = -1;
LightsObject[vehicleid][3] = -1;
}
switch(modelid)
{
case 430, 446, 452, 453, 454, 472, 473, 484, 493: VehicleState[vehicleid] = VEHICLE_STATE_BOAT;
case 417, 425, 447, 460, 469, 476, 487, 488, 497, 511, 512, 513, 519, 520, 548, 553,
563, 577, 592, 593: VehicleState[vehicleid] = VEHICLE_STATE_PLANE;
case 581, 522, 461, 521, 523, 463, 468, 471, 586: VehicleState[vehicleid] = VEHICLE_STATE_BIKE;
case 509, 481, 510: VehicleState[vehicleid] = VEHICLE_STATE_VELIK;
case 462, 448: VehicleState[vehicleid] = VEHICLE_STATE_MOPED;
case 538, 537: VehicleState[vehicleid] = VEHICLE_STATE_TRAIN;
default: VehicleState[vehicleid] = VEHICLE_STATE_CAR;
}
return vehicleid;
}

[10:09:26] Загружен транспорт: vID: 1, vVehicle: 0, ID: 0
[10:09:26] - // - Создан транспорт vID: 0, ID в игре: 1
[10:09:26] Загружен транспорт: vID: 3, vVehicle: 0, ID: 1
[10:09:26] - // - Создан транспорт vID: 0, ID в игре: 2
[10:09:26] Загружен транспорт: vID: 4, vVehicle: 0, ID: 2
[10:09:26] - // - Создан транспорт vID: 0, ID в игре: 3

#teredokot
21.12.2017, 13:07
Приравняй переменную vID к единице.

Kucklovod00
21.12.2017, 13:09
Приравняй переменную vID к единице.

Разверните ответ более подробно. Что мне это даст? В каком месте ее приравнять?

#teredokot
21.12.2017, 13:14
https://i.imgur.com/KQuVq6a.png
Кинь код этого места.

Kucklovod00
21.12.2017, 13:32
https://i.imgur.com/KQuVq6a.png
Кинь код этого места.


CMD:debug_v(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Вы должны находиться в транспорте!");
new vehicleid = GetPlayerVehicleID(playerid);
new str[30];
format(str, sizeof(str), "vID: %i, ID: %i, Fraction: %i", VehicleInfo[vehicleid][vID], vehicleid, VehicleInfo[vehicleid][vFraction]);
SendClientMessage(playerid, -1, str);
return 1;
}

DeimoS
21.12.2017, 13:37
А может просто стоит вникнуть в код, а не делать абы как?
У тебя при загрузке авто данные сохраняются в ячейки согласно порядковому номеру строки в результате SQL запроса, а уже дальше ты обращаешься к данным через vehicleid с чего-то.
Вся проблема в загрузке. Точнее, в том, что загрузка у тебя никак не связана с дальнейшим форматом работы с массивом

Kucklovod00
21.12.2017, 13:39
А может просто стоит вникнуть в код, а не делать абы как?
У тебя при загрузке авто данные сохраняются в ячейки согласно порядковому номеру строки в результате SQL запроса, а уже дальше ты обращаешься к данным через vehicleid с чего-то.
Вся проблема в загрузке. Точнее, в том, что загрузка у тебя никак не связана с дальнейшим форматом работы с массивом

Что же делать?

DeimoS
21.12.2017, 13:50
Понять как вообще устроена вся система (как идёт взаимодействие с транспортом при создании/удалении).
И vVehicle из перечисления вообще удали. Зачем тебе хранить ID транспорта в массиве, к которому ты изначально обращаешься через ID транспорта? Или он где-то используется?

Kucklovod00
21.12.2017, 13:54
Понять как вообще устроена вся система (как идёт взаимодействие с транспортом при создании/удалении).
И vVehicle из перечисления вообще удали. Зачем тебе хранить ID транспорта в массиве, к которому ты изначально обращаешься через ID транспорта? Или он где-то используется?

Вроде как в него него сохраняется ИД транспорта на сервере, а уже в этот ИД присваиваются параметры (типа фракции и т.д).
На самом деле, я впервые пытаюсь использовать динамические авто на своем сервере. Буду признателен за помощь в исправлении моих ошибок.

DeimoS
21.12.2017, 13:58
Вот так можно попробовать

@LoadFractionVehicle();
@LoadFractionVehicle()
{
new rows;
cache_get_row_count(rows);
if(!rows)
return print("- Динамические авто не найдены");


new time = GetTickCount(),
buff_VehicleInfo[/*тут имя перечисления, в котором записаны все константы, типа vID, vModel и т.п.*/],
veh_id;
for(new i; i < rows; i++)
{
cache_get_value_name_int(i, "f_v_id", buff_VehicleInfo[vID]);
cache_get_value_name_int(i, "f_v_model", buff_VehicleInfo[vModel]);
cache_get_value_name_int(i, "f_v_fraction", buff_VehicleInfo[vFraction]);
cache_get_value_name_int(i, "f_v_color1", buff_VehicleInfo[vColor1]);
cache_get_value_name_int(i, "f_v_color2", buff_VehicleInfo[vColor2]);
cache_get_value_name_float(i, "f_v_posX", buff_VehicleInfo[vX]);
cache_get_value_name_float(i, "f_v_posY", buff_VehicleInfo[vY]);
cache_get_value_name_float(i, "f_v_posZ", buff_VehicleInfo[vZ]);
cache_get_value_name_float(i, "f_v_posA", buff_VehicleInfo[vA]);
veh_id = AddTeamVehicle(buff_VehicleInfo[vFraction], buff_VehicleInfo[vModel], buff_VehicleInfo[vX], buff_VehicleInfo[vY], buff_VehicleInfo[vZ], buff_VehicleInfo[vA], buff_VehicleInfo[vColor1], buff_VehicleInfo[vColor2]);

VehicleInfo[veh_id][vID] = buff_VehicleInfo[vID];
VehicleInfo[veh_id][vModel] = buff_VehicleInfo[vModel];
VehicleInfo[veh_id][vFraction] = buff_VehicleInfo[vFraction];
VehicleInfo[veh_id][vColor1] = buff_VehicleInfo[vColor1];
VehicleInfo[veh_id][vColor2] = buff_VehicleInfo[vColor2];
VehicleInfo[veh_id][vX] = buff_VehicleInfo[vX];
VehicleInfo[veh_id][vY] = buff_VehicleInfo[vY];
VehicleInfo[veh_id][vZ] = buff_VehicleInfo[vZ];
VehicleInfo[veh_id][vA] = buff_VehicleInfo[vA];
printf(
"\
Загружен транспорт: vID: %d, veh_id: %d, ID: %d\
",
VehicleInfo[veh_id][vID],
veh_id,
i);
}
printf("[Загружено динамических автомобилей]: <%i>. Потрачено: <%i ms>.", rows, GetTickCount() - time);
return 1;
}

Хотя это вряд ли правильный вариант для твоей системы. Ну можно и лучше

Kucklovod00
21.12.2017, 14:08
Вот так можно попробовать

@LoadFractionVehicle();
@LoadFractionVehicle()
{
new rows;
cache_get_row_count(rows);
if(!rows)
return print("- Динамические авто не найдены");


new time = GetTickCount(),
buff_VehicleInfo[/*тут имя перечисления, в котором записаны все константы, типа vID, vModel и т.п.*/],
veh_id;
for(new i; i < rows; i++)
{
cache_get_value_name_int(i, "f_v_id", buff_VehicleInfo[vID]);
cache_get_value_name_int(i, "f_v_model", buff_VehicleInfo[vModel]);
cache_get_value_name_int(i, "f_v_fraction", buff_VehicleInfo[vFraction]);
cache_get_value_name_int(i, "f_v_color1", buff_VehicleInfo[vColor1]);
cache_get_value_name_int(i, "f_v_color2", buff_VehicleInfo[vColor2]);
cache_get_value_name_float(i, "f_v_posX", buff_VehicleInfo[vX]);
cache_get_value_name_float(i, "f_v_posY", buff_VehicleInfo[vY]);
cache_get_value_name_float(i, "f_v_posZ", buff_VehicleInfo[vZ]);
cache_get_value_name_float(i, "f_v_posA", buff_VehicleInfo[vA]);
veh_id = AddTeamVehicle(buff_VehicleInfo[vFraction], buff_VehicleInfo[vModel], buff_VehicleInfo[vX], buff_VehicleInfo[vY], buff_VehicleInfo[vZ], buff_VehicleInfo[vA], buff_VehicleInfo[vColor1], buff_VehicleInfo[vColor2]);

VehicleInfo[veh_id][vID] = buff_VehicleInfo[vID];
VehicleInfo[veh_id][vModel] = buff_VehicleInfo[vModel];
VehicleInfo[veh_id][vFraction] = buff_VehicleInfo[vFraction];
VehicleInfo[veh_id][vColor1] = buff_VehicleInfo[vColor1];
VehicleInfo[veh_id][vColor2] = buff_VehicleInfo[vColor2];
VehicleInfo[veh_id][vX] = buff_VehicleInfo[vX];
VehicleInfo[veh_id][vY] = buff_VehicleInfo[vY];
VehicleInfo[veh_id][vZ] = buff_VehicleInfo[vZ];
VehicleInfo[veh_id][vA] = buff_VehicleInfo[vA];
printf(
"\
Загружен транспорт: vID: %d, veh_id: %d, ID: %d\
",
VehicleInfo[veh_id][vID],
veh_id,
i);
}
printf("[Загружено динамических автомобилей]: <%i>. Потрачено: <%i ms>.", rows, GetTickCount() - time);
return 1;
}

Хотя это вряд ли правильный вариант для твоей системы. Ну можно и лучше

Сейчас проверю.
upd: Да, действительно, все работает. Скажите, это окончательный вариант, или можно лучше?

Kucklovod00
21.12.2017, 14:54
/* delete */

DeimoS
22.12.2017, 12:28
Сейчас проверю.
upd: Да, действительно, все работает. Скажите, это окончательный вариант, или можно лучше?

Естественно можно лучше. Как минимум, избавиться от этой записи в переменную и последующей перезаписи в массив

Kucklovod00
22.12.2017, 15:53
Естественно можно лучше. Как минимум, избавиться от этой записи в переменную и последующей перезаписи в массив

Как это сделать?

DeimoS
22.12.2017, 19:05
Эмм, как и писал, разобраться в системе, понять как она работает и понять как можно организовать загрузку данных без лишней перезаписи. Нет какой-то общей для всего формулы