PDA

Просмотр полной версии : [Вопрос] Не работают динамические чекпоинты



koberman
17.06.2018, 12:47
Ни с того, ни с сего перестали работать два динамических чекпоинта. Стример последней версии.
1.
При загрузке сервера
musor_info[m][mCP] = CreateDynamicCP(musor_info[m][mX], musor_info[m][mY], musor_info[m][mZ], 8.0, -1, -1, -1, 20);
При определённом условии показываю чекпоинт
for(new i; i < MAX_MUSORS; i ++) TogglePlayerDynamicCP(playerid, musor_info[i][mCP], true);
Условное действие, которое не происходит, но чекпоинт показывается
public OnPlayerEnterDynamicCP(playerid,checkpointid)
{
if(checkpointid >= musor_info[0][mCP] && checkpointid <= musor_info[MAX_MUSORS-1][mCP])
{
SendClientMessage(playerid, -1, "a");
}
}
2.
Создаю fabstock[0][playerid] = CreateDynamicCP(2479.8374,-1307.4606,1030.9, 1, 1, 1, playerid, 2);
fabstock[1][playerid] = CreateDynamicCP(2482.7444,-1307.0693,1030.9, 1, 1, 1, playerid, 2);
Условное действие, которое не происходитpublic OnPlayerEnterDynamicCP(playerid,checkpointid)
{
else if(checkpointid == fabstock[0][playerid] || checkpointid == fabstock[1][playerid])
{
SendClientMessage(playerid, -1, "a");
}
}
Другие динамические чекпоинты работают исправно

DeimoS
17.06.2018, 20:18
public OnPlayerEnterDynamicCP(playerid,checkpointid)
{
printf("\n\n%d (%d|%d)\n\n",checkpointid, musor_info[0][mCP], musor_info[MAX_MUSORS-1][mCP]);
if(checkpointid >= musor_info[0][mCP] && checkpointid <= musor_info[MAX_MUSORS-1][mCP])
{
SendClientMessage(playerid, -1, "a");
}
}
И скинь строку из логов при взятии неработающих чекпоинтов

P.S. Перенёс тему в раздел с вопросами

koberman
18.06.2018, 04:56
[07:50:17]

41 (1|0)

[07:50:19]

42 (1|0)

[07:50:23]

43 (1|0)
Наступал по разу на три чекпоинта

DeimoS
18.06.2018, 17:27
Эмм, у тебя musor_info[MAX_MUSORS-1][mCP] хранит нуль.
Сейчас у тебя условие выглядит так:

if(42 >= 1 && 42 <= 0)
И ни одно значение никогда не попадёт под это условие.

Либо ты не создаёшь достаточно чекпоинтов, оставляя последнюю ячейку пустой, либо какая-то ошибка при создании есть.

koberman
18.06.2018, 17:59
Эмм, у тебя musor_info[MAX_MUSORS-1][mCP] хранит нуль.
Сейчас у тебя условие выглядит так:

if(42 >= 1 && 42 <= 0)
И ни одно значение никогда не попадёт под это условие.

Либо ты не создаёшь достаточно чекпоинтов, оставляя последнюю ячейку пустой, либо какая-то ошибка при создании есть.

Даже не думал, что это может быть проблемой. Но разве это логично? Математически, чекпоинты попадали под это условие...

DeimoS
18.06.2018, 18:09
Даже не думал, что это может быть проблемой. Но разве это логично? Математически, чекпоинты попадали под это условие...

Эмм, каким образом математически чекпоинты попадали под условие-то? Какое это число может быть одновременно больше единицы, но меньше нуля?

koberman
19.06.2018, 04:36
Эмм, каким образом математически чекпоинты попадали под условие-то? Какое это число может быть одновременно больше единицы, но меньше нуля?

А почему получался 0? Значение MAX_MUSORS не хранило в себе 1

DeimoS
19.06.2018, 08:40
А почему получался 0? Значение MAX_MUSORS не хранило в себе 1

А причём тут значение MAX_MUSORS? Через "MAX_MUSORS-1" ты обращался к ячейке массива и использовал в условии именно значение ячейки, а не значение "MAX_MUSORS".
Чтоб всё работало как нужно, следует целиком заполнять массив данными или хотя бы последний чекпоинт заносить в последнюю ячейку (но это будет нелогично и глупо).
А если тебе нужно оставить свободные ячейки для последующего создания новых чекпоинтов, при этом, ты так же хочешь их и удалять прямо из игры, то надёжнее всего создать итератор с MAX_MUSORS ячеек и записывать в него номера занятых ячеек. Тогда условие будет выглядеть так:
if(checkpointid >= musor_info[0][mCP] && checkpointid <= musor_info[Iter_Last(/*имя итератора*/)][mCP])
Ну а если удалять из игры не собираешься, то можно просто создать переменную, которая будет хранить в себе индекс последней занятой ячейки и уже в условии вызывать эту переменную вместо "MAX_MUSORS-1"