Чтожжж отключилии
Вид для печати
При выходе наблюдаемого игрока должна вызываться OnPlayerStreamOut? На этот случай тестили?
У меня не вызывается, пришлось добавить код на OnPlayerDisconnect
У меня вызывалась, только я на всякий пожарный ещё добавлял проверку игрока на INVALID_PLAYER_ID
OnPlayerStreamOut не вызывается при смене интерьера и виртуального мира. Система требует доработок, причем довольно значительных.
OnPlayerSpawn + OnPlayerInteriorChange + хук SetPlayerVirtualWorld
Spawn отслеживается в OnPlayerStateChange,...
Меняя интерьер игрок летает иногда где то в воздухе,
меняя виртуальный мир без интерьера он ходит по объектам,
следовательно берём только OnPlayerInteriorChange(ну глядя какой там у Вас мод ещё)
и вставляем тот же код что и в смене OnPlayerStateChange,
всё остальное должно работать...
А ещё лучше просто рядом со сменой вирта задавать ещё раз тоже значение интерьера или новое и не какой хук не нужен:aggressive:
Тобишь:
PHP код:
SetPlayerVirtualWorld(playerid, 1); //сперва вирт
SetPlayerInterior(playerid, 0); //сработал OnPlayerInteriorChange и обновил всё что нужно
//и если вирт выше меняется, обязательно меняем интерьер даже если он тот же остаётся
//вуаля без всяких хуков и итерацеподобных вжиков мы исполнили скрипт в OnPlayerInteriorChange
Эту функцию это какую? OnPlayerInteriorChange или UpdateSpectatingStatus?
Хотя всё равно суть одна: важно обновлять данные тогда, когда они изменяются, а если обновлять виртуальный мир только при смене интерьера, то что мешает мне сменять виртуальный мир без смены интерьера?
Что ещё не ясного тут?
PHP код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
PlayerChange(playerid);
return 1;
}
//изменяя интерьер мы обновляем уже существующим перебором
//для этого я и говорю юзать смену интерьера вместе с вирт миром
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
PlayerChange(playerid);
return 1;
}
stock PlayerChange(playerid)
{
for(new i = 0; i != MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(spectating[i] == playerid)//Проверяем действительно ли следит следящий игрок именно за этим игроком
{
//Колбэк указанный ниже, поможет нам быстро обновить режим слежки
UpdateSpectatingStatus(i, playerid);
break;
}
}
}
return 1;
}
Тоже самое делал и я (конечно не с этом системой, а конкретно с методом с OnPlayerStreamOut), при этом на рабочем сервере с онлайном от 100 человек. И совершенно точно он не срабатывает при смене виртуального мира и интерьера (может конечно только при виртуальном мире или интерьере, поскольку везде у меня менялось и то, и то, но факта это не меняет и код системы требует значительных доработок, да и видно, что код устарел.).
То, что при смене только лишь виртуального мира без смены интерьера (т.к. к примеру смена инта не будет надобна), такой способ не обновит этот самый виртуальный мир.
Тоже самое. Придумал такой же метод со StreamOut'ом ещё до посещения этой темы - он не работал.