PDA

Просмотр полной версии : [Вопрос] Загрузка координат спавна фракций[MYSQL]



BadPawn
18.02.2016, 19:36
Всем привет, ребят. У меня проблема, не понятного рода.

Вначале в двух словах, затем код. Записал в БД координаты спавна, интерьера и виртуального мира для банды Grove Street Gang. Переписал сам код спавна, ибо он был очень огромен.

Далее, думаю зайду проверю, захожу и спавнюсь по координатам 0.000 0.000 0.000. При включении сервера вывожу координаты через printf, все окей, координаты ровные, но как доходит до OnPlayerSpawn координаты по неизвестным причинам обнуляются. Проверял с помощью printf.

Собственно код спавна:

if(pInfo[playerid][pMember] != 0)
{
new fracid = pInfo[playerid][pMember];
SetPlayerSkin(playerid, pInfo[playerid][pSkin]);
SetPlayerPos(playerid, fInfo[fracid][fSpawnX], fInfo[fracid][fSpawnY], fInfo[fracid][fSpawnZ]);
SetPlayerFacingAngle(playerid, fInfo[fracid][fSpawnA]);
SetPlayerInterior(playerid, fInfo[fracid][fSpawnInt]);
SetPlayerVirtualWorld(playerid, fInfo[fracid][fVirtWorld]);
printf("%f %f %f", fInfo[fracid][fSpawnX], fInfo[fracid][fSpawnY], fInfo[fracid][fSpawnZ]);
}

Код загрузки и сохранения:

fpublic LoadFraction()
{
Max_Frac = 0;

new
rows,
fields,
time = GetTickCount();
cache_get_data(rows, fields);

if(!rows) return printf("[ERROR LOADING FRACTION]: Не удалось загрузить.");

for(new f = 0; f < rows; f++)
{
fInfo[f][fID] = cache_get_field_content_int(f, "ID", mysql_connBD);
cache_get_field_content(f, "LEADER", fInfo[f][fLeader], mysql_connBD, 24);
cache_get_field_content(f, "NAME", fInfo[f][fName], mysql_connBD, 36);
fInfo[f][fSpawnX] = cache_get_field_content_float(f, "SPAWNX", mysql_connBD);
fInfo[f][fSpawnY] = cache_get_field_content_float(f, "SPAWNY", mysql_connBD);
fInfo[f][fSpawnZ] = cache_get_field_content_float(f, "SPAWNZ", mysql_connBD);
fInfo[f][fSpawnA] = cache_get_field_content_float(f, "SPAWNA", mysql_connBD);
fInfo[f][fSpawnInt] = cache_get_field_content_int(f, "SPAWNINT", mysql_connBD);
fInfo[f][fVirtWorld] = cache_get_field_content_int(f, "VIRTWORLD", mysql_connBD);
Max_Frac++;
}
printf("[Фракций загружено]: <%d>. [Время загрузки]: <%d>", Max_Frac, GetTickCount()-time);
return true;
}

stock SaveFraction()
{
static const
mysql_f[] = "UPDATE `fraction` SET\
`LEADER` = '%s',\
`NAME` = '%s' WHERE `ID` = '%d'";
new mysql_f_size[sizeof(mysql_f) + ((MAX_PLAYER_NAME-2) + (36-2) + (2-2))];
format(mysql_f_size, sizeof mysql_f_size, mysql_f, fInfo[Max_Frac][fLeader], fInfo[Max_Frac][fName], fInfo[Max_Frac][fID]);
mysql_function_query(mysql_connBD, mysql_f_size, false, "", "");
}

И все. В моде ни черта нет связанное с координатами спавна.

Забыл упомянуть, если изменить на циферки, то спавнит на указанное место.

BadPawn
18.02.2016, 21:31
SetPlayerPos(playerid, fInfo[fracid][fSpawnX], fInfo[fracid][fSpawnY], fInfo[fracid][fSpawnZ]);

Судя по дебагу, он мне говорит: выход за пределы массива.


[04:04:32] [debug] Run time error 4: "Array index out of bounds"
[04:04:32] [debug] Accessing element at index 1 past array upper bound 0
[04:04:32] [debug] AMX backtrace:
[04:04:32] [debug] #0 0000d39c in public OnPlayerSpawn (playerid=0) at D:\new.pwn:476

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

Дебаг исправил, но координаты все-равно обнуляются. о-о

к максимальному кол-ву фракций забыл +1(гражданские) добавить.

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

Кхм.... Странная фигня происходит в загрузке фракций.

В цикле с помощью printf выводит координаты точно, как в бд, но за пределом массива по нолям.

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

http://s017.radikal.ru/i443/1602/2a/ef0f2eb693ff.gif

Первые координаты внутри цикла, а следующие после.

BadPawn
19.02.2016, 07:03
Понял в чем проблема.

переменная Max_Frac криво работает почему-то, странно. Если Max_Frac изменить на единицу, все нормально.

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

Проверяю через printf оба варинта:

Вывод общего кол-ва загруженных фракций:

printf("%d", Max_Frac);
И вывод загруженного интерьера у фракции 0(которой не существует):

printf("%d", fInfo[0][fSpawnInt]);


Фракция под номером 1 хранится в 0. Кхм.... Ваще срастить не могу.

BadPawn
19.02.2016, 15:26
Меняю в цикле загрузку с единицы — вообще не загружает.

BadPawn
19.02.2016, 19:33
как я понял, нужно разбираться самому. закройте топ плз

BadPawn
20.02.2016, 10:15
исправил короче, может кому интересно. ))) :yahoo: :good2:


fpublic LoadFraction()
{
Max_Frac = 0;

new
frac,
fields,
time = GetTickCount();
cache_get_data(frac, fields, mysql_connBD);

if(!frac) return printf("[ERROR LOADING FRACTION]");


new
f = 1;
while(Max_Frac < frac)
{
fInfo[f][fID] = cache_get_field_content_int(Max_Frac, "ID", mysql_connBD);
cache_get_field_content(Max_Frac, "LEADER", fInfo[f][fLeader], mysql_connBD, 24);
cache_get_field_content(Max_Frac, "NAME", fInfo[f][fName], mysql_connBD, 36);
fInfo[f][fSpawnX] = cache_get_field_content_float(Max_Frac, "SPAWNX", mysql_connBD);
fInfo[f][fSpawnY] = cache_get_field_content_float(Max_Frac, "SPAWNY", mysql_connBD);
fInfo[f][fSpawnZ] = cache_get_field_content_float(Max_Frac, "SPAWNZ", mysql_connBD);
fInfo[f][fSpawnA] = cache_get_field_content_float(Max_Frac, "SPAWNA", mysql_connBD);
fInfo[f][fSpawnInt] = cache_get_field_content_int(Max_Frac, "SPAWNINT", mysql_connBD);
fInfo[f][fVirtWorld] = cache_get_field_content_int(Max_Frac, "VIRTWORLD", mysql_connBD);
f++, Max_Frac++;
}
printf("[Фракций загружено]: <%d>. [Время загрузки]: <%d>", Max_Frac, GetTickCount()-time);
return true;
}

проблема заключалась в том, что загрузка начиналась с 0(new f = 0;), а только в конце цикла плюсуется переменная, но дальше загружать нечего, ибо в бд одна фракция, поэтому цикл и останавливался.