А причём тут компилятор вообще? И в каких ситуациях не работает?
Надеюсь не в OnPlayerRequestClass или OnPlayerDisconnect, о которых написано тут?
Вид для печати
А причём тут компилятор вообще? И в каких ситуациях не работает?
Надеюсь не в OnPlayerRequestClass или OnPlayerDisconnect, о которых написано тут?
Нет, не в этих. Я делаю перехват SetPlayerPos:
И пытаюсь получить предыдущую позицию игрока через GetPlayerPos(эту функцию я заранее не перехватывал, она нативная)PHP код:
new Float:plOldPos[MAX_PLAYERS][3];
new Float:plPrevPos[MAX_PLAYERS][3];
stock ac_SetPlayerPos(playerid, Float:x, Float:y, Float:z)
{
GetPlayerPos(playerid, plPrevPos[playerid][0], plPrevPos[playerid][1], plPrevPos[playerid][2]);
plOldPos[playerid][0] = x;
plOldPos[playerid][1] = y;
plOldPos[playerid][2] = z;
return SetPlayerPos(playerid,x,y,z);
}
#if defined _ALS_SetPlayerPos
#undef SetPlayerPos
#else
#define _ALS_SetPlayerPos
#endif
#define SetPlayerPos ac_SetPlayerPos
Но в переменных лежат 0.0000.
Сам SetPlayerPos я вызываю уже когда игрок заспавнен - телепортируюсь с помощью команды.
Насчет компилятора я спросил - потому что слышал что в стандартном есть некие баги)
Перехват находится точно раньше, после обьявления переменных сразу.
У меня тут происходит какая -то дичь. Я ничего не менял, вывод в консоль была, я добавил формат - и о чудо - все заработало. Данные стали приходить. Теперь у меня что то странное, из за формата - не успевали сохранятся новые координаты в переменные отвечающие за старую позицию.
Формат я закоментил и оставил только принтф - и вот что в консоле после телепорта. Опять не успели сохранится новые координаты
- - - Добавлено - - -
Тьфу блин, нафига я вывод делаю прямо в перехвате, я понял в чем тут прикол.
Только очень странно както заработало все, до того как я написал printf - гетпос возвращал тупо 0.
- - - Добавлено - - -
Очень странно, но даже вот так
Ну так а ты когда проверку делаешь? Не после самого первого спавна, надеюсь?
Тебе нужно заспавнится и телепортироваться в какое-либо другое место с другими координатами.
При первом спавне GetPlayerPos вернёт нули, ибо для сервера игрок ещё не находится где-либо (GetPlayerPos вызывается до SetPlayerPos => позиция не установлена, если не было SetSpawnInfo).
А уже при последующих будут нормальные данные
1-й спавн
Телепортируюсь на мэрию
Консоль
- - - Добавлено - - -
Во время телепорта - подвисает игра иногда чуть больше, иногда чуть меньше(там дохрена маппинга, спецом это место выбрал). Бывает проскакивает варнинг даже когда на глаз подвисания не видно, но при этом в переменных старые значения.
- - - Добавлено - - -
Я думаю может пихнуть проверку для таких вот зависающих игроков что бы если oldPos и prevPos одинаковые - не проверять.
- - - Добавлено - - -
И да, у меня игрока сначало спавнит на 0 а потом SetPlayerPos телепортирует в нужное место. Поэтому даже первый спавн у меня уже идет с координатами.
Зачем вообще проверять координаты при телепорте? Не проще ли указывать античиту на то, что несколько итераций подряд игрока трогать не нужно? Не думаю, что кто-то додумается в моменты подобных серверных перемещений телепортироваться с помощью чита. А если и додумается, то это не так просто будет.
Тогда можно будет 2 раза заспавнится и после телепортироваться куда угодно, не?
Ну или любым другим образом вызвать SetPlayerPos 2 раза на одних и тех же координатах.
Гораздо проще разгрузить игрока при телепорте, подгружая маппинг вручную после телепортации с помощью функционала стримера
- - - Добавлено - - -
То бишь, при телепорте
И там же таймер, в которомPHP код:
Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 0);
Это если я правильно помню назначение функции и имена макросовPHP код:
Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 1);
Насчет иммунитета на несколько иттераций - придется наверно делать, все равно у игроков компы разные, и при подгрузке даже в местах где маппинга нет - могут происходить зависания.