PDA

Просмотр полной версии : [Вопрос] Как избежать путаницы с ID транспорта?



Edwin
16.02.2014, 23:44
Написал в моде систему личного автомобиля и один автосалон с покупкой.
В OnGameModeInit стоит n-ное количество загружаемых на сервер машин (и личных, и фракционных, и любых других) со своими ID, выданными им сервером в порядке загрузки.
Если купить авто, ей выдастся первый свободный ID (типа, если на сервере 50, скажем, фракционных тачек, то ID новой купленной, соответственно, будет 51).
Но вызов функции LoadVehicles у меня стоит до загрузки всех остальных фракционных, рабочих, выставочных и т.д. машин, и таким образом после рестарта ID той купленной машины будет назначаться уже перед всеми остальными тачками (будет не 51 а уже 1).
Это сильно усложняет работу, к тому же на остальных серверах я видел, что такой путаницы нет, и купленные машины создаются сразу со своим постоянным и никогда не меняющимся ID.
Подскажите, как это сделать? Уже устал придумывать функции и решения...

DeimoS
17.02.2014, 05:09
Повлиять на серверный ID можно только путём создания транспорта (то бишь заполнения пустых ID, как я знаю. Так что легче всего перестроить свою систему, а не сервер. Например, создай столбец-идентификатор в таблице и с машинами. А после у игрока сделай такой же. И, соответственно, переменную для хранения этого ID и для игрока, и для загрузки. Он и будет являться постоянным ID, связывающим игрока и сервер. На его основе и строй все проверки.
Теперь при загрузке авто узнавай ID, под которым она создаётся, и грузи именно в эту переменную информацию. Узнать ID можно с помощью цикла в цикле, который и будет искать несозданное авто. Что-то типа такого:

new carid;
for(new i; i < x3; i++)
{
while(carid < MAX_VEHICLES)
{
carid ++;
if(IsValidVehicle(carid)) continue;
break
}
\\загрузка авто в переменные, где номерами ячейка будет значение нашей переменной
\\создание транспорта (получится тот же ID, что и выше
}

Ну и провурки будут выглядеть, примерно, так:

if(CarInfo[GetPlayerVehicleID(playerid)][CarID] != pInfo[playerid][pCarId]) return SendClientMessage(playerid, -1, "Вы не владелец этого авто");

Edwin
17.02.2014, 08:41
Столбец-идентификатор?
Ты имеешь в виду AUTO_INCREMENT?
И как загрузить пустой слот на сервер?..

DeimoS
17.02.2014, 10:51
Столбец-идентификатор?
Ты имеешь в виду AUTO_INCREMENT?
И как загрузить пустой слот на сервер?..

Можно AUTO_INCREMENT, а можно самостоятельно подсчитывать и устанавливать идентификатор. Просто стоит учитывать, что AUTO_INCREMENT идёт в порядке возрастания и если, например, AUTO_INCREMENT равен 15 (то есть 16 строк создано) и удаляется 10-ая строка, следующая строка будет создана не с 9-ым AUTO_INCREMENT, а с 16. А вот если самостоятельно делать столбец-идентификатор, это можно учесть.

Про пустой слот не понял.

Edwin
18.02.2014, 15:23
Не понял... какая "личность" посмела тебе нажать минус на репутации? Сейчас исправим.
Я имею в виду, пустой слот авто. То есть, id загружаются в порядке возрастания. Как сделать свободными первые, скажем, 700 id, чтобы загружаемые рабочие тачки начинались с id 701?
Вчера на работе мне пришёл в голову такой вариант: создать переменную в стоке загрузки, приравнять её к параметру id авто (AutoInfo[carid][aID]), а потом прописать "переменная" = CreateVehicle и т.д.
Это поможет, как думаешь, Влади?

DeimoS
18.02.2014, 15:45
Не понял... какая "личность" посмела тебе нажать минус на репутации? Сейчас исправим.
Я имею в виду, пустой слот авто. То есть, id загружаются в порядке возрастания. Как сделать свободными первые, скажем, 700 id, чтобы загружаемые рабочие тачки начинались с id 701?
Вчера на работе мне пришёл в голову такой вариант: создать переменную в стоке загрузки, приравнять её к параметру id авто (AutoInfo[carid][aID]), а потом прописать "переменная" = CreateVehicle и т.д.
Это поможет, как думаешь, Влади?

Да, вроде, не ставил никто минусов мне :) С кем-то перепутал, наверное :)
Автомобили автоматически занимают первый попавшийся свободный ID. Со стороны сервера ты никак не сможешь управлять этими самыми ID (ну или придётся заполнять первые 700 ID автомобилями, потом создавать нужное авто и потом удалять те 700 автомобилей).
Зачем обязательно основывать систему на ID авто? Они нужны будут только для того, чтоб определить какую авто вызвал игрок и не более. А так можешь самостоятельно сделать систему ID авто (не серверную, а скриптовую).
То бишь в БД создай столбец и туда уже пиши хоть 700, хоть 500, хоть 1000000. В общем, любую информацию. А уже транспорт грузи в свободные ID на сервере, как я показал выше

//Это всё в сток загрузки авто с БД
new carid;//В этой переменной будет храниться ID свободной авто
for(new i; i < x3; i++)//А это цикл на весь транспорт, который грузим
{
while(carid < MAX_VEHICLES)//Второй цикл, который и ищет свободный ID
{
carid ++;//Просматриваем каждый ID
if(IsValidVehicle(carid)) continue;//Если авто создано - новый такт
break;//Иначе останавливаем цикл и дальше уже используем переменную carid как номер ячейки, в который будем грузить инфо об авто
}
//То есть типа:
new bufer[30];
mysql_fetch_field_row(bufer,"PosX");
CarInfo[carid][PosX] = bufer;
//...
CreateVehicle(модель, CarInfo[carid][PosX], ...);//ID созданной авто как-раз будет совпадать с ID, записанной в carid
}

Edwin
18.02.2014, 17:57
Вчера ещё была 90 репутация, сегодня уже 89)
А что такое "х3"?
Так подожди, грузится у меня итак с самого начала
При покупке машина создаётся с чёрт знает каким id, а после рестарта отсчёт начинается уже с первого
Мне нужно, чтобы машина всегда имела один и тот же id
Ради хотя бы одной такой функции:

GetVehiclePos(PlayerInfo[playerid][pCarKey1], X, Y, Z);

DeimoS
18.02.2014, 18:04
Вчера ещё была 90 репутация, сегодня уже 89)
А что такое "х3"?

Условие, которое я не знаю как устроено у тебя :)
В общем, скинь сток загрузки авто + enum для транспорта и покажу как сделать

Edwin
18.02.2014, 18:19
enum aInfo
{
aKey,
aModel,
Float:aCar_x,
Float:aCar_y,
Float:aCar_z,
Float:aCar_a,
aColor1,
aColor2,
aOwner[24],
aLock,
aTun0,
aTun1,
aTun2,
aTun3,
aTun4,
aTun5,
aTun6,
aTun7,
aTun8,
aTun9,
aTun10,
aTun11,
aTun12,
aTun13,
aPaintJob,
};
new AutoInfo[MAX_VEHICLES][aInfo];

stock LoadVehicles()
{
new query[512];
mysql_query("SELECT * FROM `vehicles`");
mysql_store_result();
new rows = mysql_num_rows(), carid, text[12];
if(rows > 0)
{
for(new idx; idx < rows; idx++)
{
for(carid = 1; carid < MAX_VEHICLES; carid++)
{
if(IsValidVehicle(carid)) continue;
break;
}
mysql_fetch_row_format(query, "|");
sscanf(query, "p<|>iiffffiis[24]iiiiiiiiiiiiiiii",
AutoInfo[carid][aKey],
AutoInfo[carid][aModel],
AutoInfo[carid][aCar_x],
AutoInfo[carid][aCar_y],
AutoInfo[carid][aCar_z],
AutoInfo[carid][aCar_a],
AutoInfo[carid][aColor1],
AutoInfo[carid][aColor2],
AutoInfo[carid][aOwner],
AutoInfo[carid][aLock],
AutoInfo[carid][aTun0],
AutoInfo[carid][aTun1],
AutoInfo[carid][aTun2],
AutoInfo[carid][aTun3],
AutoInfo[carid][aTun4],
AutoInfo[carid][aTun5],
AutoInfo[carid][aTun6],
AutoInfo[carid][aTun7],
AutoInfo[carid][aTun8],
AutoInfo[carid][aTun9],
AutoInfo[carid][aTun10],
AutoInfo[carid][aTun11],
AutoInfo[carid][aTun12],
AutoInfo[carid][aTun13],
AutoInfo[carid][aPaintJob]);
CreateVehicle(AutoInfo[carid][aModel], AutoInfo[carid][aCar_x], AutoInfo[carid][aCar_y], AutoInfo[carid][aCar_z]+1, AutoInfo[carid][aCar_a], AutoInfo[carid][aColor1], AutoInfo[carid][aColor2], 6000);
format(text,sizeof(text),"LS %d-%d",AutoInfo[carid][aKey],carid);
SetVehicleNumberPlate(carid,text);
SetVehicleParamsEx(carid,VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,alarm,AutoInfo[carid][aLock],VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,objective);
Engine[carid] = 0;
Lights[carid] = 0;
VehicleFuel[carid] = 100;
vehicles++;
}
}
mysql_free_result();
return 1;
}

DeimoS
18.02.2014, 18:24
Ну, собстно, всё верно, кроме некоторых моментов

stock LoadVehicles()
{
new query[512];
mysql_query("SELECT * FROM `vehicles`");
mysql_store_result();
new rows = mysql_num_rows(),text[12], carid;
if(rows <= 0) return;
for(new idx; idx < rows; idx++)
{
for(carid; carid < MAX_VEHICLES; carid++)
{
if(IsValidVehicle(carid)) continue;
break;
}
mysql_fetch_row_format(query, "|");
sscanf(query, "p<|>iiffffiis[24]iiiiiiiiiiiiiiii",
AutoInfo[carid][aKey],
AutoInfo[carid][aModel],
AutoInfo[carid][aCar_x],
AutoInfo[carid][aCar_y],
AutoInfo[carid][aCar_z],
AutoInfo[carid][aCar_a],
AutoInfo[carid][aColor1],
AutoInfo[carid][aColor2],
AutoInfo[carid][aOwner],
AutoInfo[carid][aLock],
AutoInfo[carid][aTun0],
AutoInfo[carid][aTun1],
AutoInfo[carid][aTun2],
AutoInfo[carid][aTun3],
AutoInfo[carid][aTun4],
AutoInfo[carid][aTun5],
AutoInfo[carid][aTun6],
AutoInfo[carid][aTun7],
AutoInfo[carid][aTun8],
AutoInfo[carid][aTun9],
AutoInfo[carid][aTun10],
AutoInfo[carid][aTun11],
AutoInfo[carid][aTun12],
AutoInfo[carid][aTun13],
AutoInfo[carid][aPaintJob]);
CreateVehicle(AutoInfo[carid][aModel], AutoInfo[carid][aCar_x], AutoInfo[carid][aCar_y], AutoInfo[carid][aCar_z]+1, AutoInfo[carid][aCar_a], AutoInfo[carid][aColor1], AutoInfo[carid][aColor2], 6000);
format(text,sizeof(text),"LS %d-%d",AutoInfo[carid][aKey],carid);
SetVehicleNumberPlate(carid,text);
SetVehicleParamsEx(carid,VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,alarm,AutoInfo[carid][aLock],VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,objective);
Engine[carid] = 0;
Lights[carid] = 0;
VehicleFuel[carid] = 100;
vehicles++;
}
mysql_free_result();
return 1;
}
Например, carid не нужно каждый раз ровнять 1, ибо смысл? Пусть лучше цикл стартует с последнего найденного свободного ID :) Вряд ли во время создания освободятся предыдущие ID.
Если всё таки очень нужны определённые ID, можешь в таблице создать новый столбец и туда записывать нужные, а после выгружать их в отдельную переменную и использовать :)

Edwin
18.02.2014, 18:40
Например, carid не нужно каждый раз ровнять 1, ибо смысл? Пусть лучше цикл стартует с последнего найденного свободного ID :) Вряд ли во время создания освободятся предыдущие ID.

Сам же мне это писал)

Но я всё равно не понимаю.
Допустим, я запишу ид машины при создании в aKey, игроку приравняю этот ключ.
Но после рестарта ключ машины изменится, а игрока - нет.
Да и не нужно чтобы любой из них менялся.

DeimoS
18.02.2014, 21:32
Сам же мне это писал)
Уже забыл :( Мне человек по 5 каждый день пишет в скайп с просьбами помочь, если сижу там онлайн. Всех не упомнить :)

Но я всё равно не понимаю.
Допустим, я запишу ид машины при создании в aKey, игроку приравняю этот ключ.
Но после рестарта ключ машины изменится, а игрока - нет.
Да и не нужно чтобы любой из них менялся.

Зачем ID машины записывать? Ты же MySQL используешь! Что мешает записывать в аккаунт игрока идентификатор строки в БД с авто? Или в БД с авто имя хозяина? Огромное количество возможностей есть! А ты используешь методы файлов сейчас :)
P.S. Если очень надо номера сделать постоянными, сделай их "особенными" для личного авто. Например, у служебного транспорта в конце не будет букв, а у личного будет (ибо личного транспорта может быть больше). И номер записывай в БД при создании.
Либо определись с числом служебного транспорта (не личного) и подгони под это значение ID авто. Например, служебных авто на сервере создаётся 500. Значит к ID авто при покупке прибавь 500 и запиши этот номер в БД. А после выгружай. Множество есть способов, MySQL же. У меня сейчас голова не особо варит из-за температуры, поэтому ничего путнуго сказать не получается, но на верную мысь я тебя навёл. Дальше смотри как у тебя устроена система транспорта на сервере и думай как лучше будет всё провернуть

Edwin
19.02.2014, 09:21
В общем, спасибо, Влад, ты как всегда помогаешь. Но я всё сделал сам, совсем по-другому.
Закрыто.