PDA

Просмотр полной версии : [Include] dc_spp (телепортация в интерьеры с 0)



Daniel_Cortez
16.01.2014, 00:25
Всем привет.
Многие из вас наверняка знают о проблеме телепортации игрока в интерьеры с 0: объекты стримера могут не успеть загрузиться и игрок рискует провалиться под них.
Поэтому я сделал инклуд, который позволяет решить эту проблему.

Использование:
Скопировать файл "dc_spp.inc" в папку "pawno/include".

В моде подключить инклуд "dc_spp" сразу же после "a_samp". Результат должен выглядеть примерно так:


#include <a_samp>
#include <dc_spp>

Для телепортации игрока использовать функцию SetPlayerPosEx:

SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, interior, world, bool:tpcar, bool:nopassengers, time)
playerid - ID игрока
x, y, z - координаты телепортации
interior, world - ID интерьрера и вирт.мира, в которые будет перемещён игрок. Необязательные параметры (если пропустить, интерьер и вирт. мир не будут изменены).
bool: tpcar - если игрок управляет транспортным средством, телепортировать транспорт вместе с ним (true/false). Необязательный параметр (по умолчанию транспорт переносится вместе с игроком).
bool: nopassengers - при установке в true, если телепортируемый игрок находится за рулём транспортного средства, он телепортируется без пассажиров. Необязательный параметр (по умолчанию пассажиры переносятся вместе с транспортом).
time - время заморозки в миллисекундах. Необязательный параметр (по умолчанию равен значению в DC_SPP__FREEZE_TIME).

По умолчанию при телепортации игроки замораживаются на полсекунды (500 мс).
Если у них слишком большой пинг и объекты не успевают появиться, можно указать инклуду своё время заморозки.
Для этого перед подключением dc_spp нужно объявить макрос DC_SPP__FREEZE_TIME с новым временем (например, 1000 мс):


#include <a_samp>

#define DC_SPP__FREEZE_TIME 1000
#include <dc_spp>



Скачать: https://www.dropbox.com/s/uyi0tsnlb2eeu0n/dc_spp.inc?dl=0
Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)

Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

^_^
16.01.2014, 00:40
Супер! Спасибо что выложил!

TWIX
16.01.2014, 10:52
Как всегда отлично Den )!

Nurick
07.05.2014, 22:22
Получаеться если я буду использовать данный инклуид вместо этого:

SetPlayerInterior(playerid,2);
SetPlayerPos(playerid,2467.1338,-1698.1519,1013.5078);
SetPlayerVirtualWorld(playerid,1);
Я буду писать эти параметры в одну строку? Пример:

SetPlayerPosEx(playerid, 2467.1338, -1698.1519, 1013.5078, 2, 1, 0)

Exclusive
08.05.2014, 18:26
Во, вот это самое то):smile:

Snoop_Dog
19.05.2014, 20:29
О спасибо можно всю команду /tp таким образом сократит

Spectrum
20.05.2014, 07:21
спасибо)

Caypen
20.05.2014, 13:49
Пастебин бы...

Pe4en9
26.09.2014, 02:03
Отличная вещь.

reAL
04.10.2014, 16:05
Проверил на 60+ сервере. Большие интерьеры загружаются после опять пропадают текстуры и опять загружаются.
Связано это с Streamer_UpdateEx. Решение проблемы не нашел, использую старый способ.

Daniel_Cortez
06.11.2014, 17:27
Обновил инклуд.

Добавлен макрос DC_SPP__FREEZE_TIME, с помощью которого можно указать время заморозки игрока.
Теперь, если у игроков слишком большой пинг и объекты не успевают под ними прогрузиться, можно просто задать инклуду большее время заморозки.
Пример:


#include <a_samp>

#define DC_SPP__FREEZE_TIME 1000
#include <dc_spp>


1-й пост обновлён.

Maranzalla
13.01.2015, 21:44
А что если время заморозки как то связать с текущим пингом игрока?

Иван Бубнов
21.04.2016, 17:14
А что если время заморозки как то связать с текущим пингом игрока?

Поддерживаю. GetPlayerPing * 10 что ли или хз :3

Daniel_Cortez
07.03.2018, 13:03
Инклуд обновлён до версии 1.1. Добавлена возможность телепортации пассажиров в транспортном средстве, заодно немного изменил предзагрузку объектов с помощью стримера.

Если будут какие-то проблемы с инклудом, просьба не молчать и отписываться в этой теме, постараюсь помочь.

#iDanny
07.03.2018, 20:30
Хорошо бы добавить опцию для DC_SPP__FREEZE_TIME, возможно пользователю понадобится разное время заморозки.

$continue$
07.03.2018, 21:07
Так, что мешает 1000 мс сменить на другое время?

Хорошо бы добавить опцию для DC_SPP__FREEZE_TIME, возможно пользователю понадобится разное время заморозки.

#iDanny
07.03.2018, 21:39
Так, что мешает 1000 мс сменить на другое время?
Ничего не мешает, разве что моя религия.

Я считаю это правильным решением. Ибо: допустим если нужно чтобы в разных телепортах на разное время замораживала, можно будет избежать создания дополнительного таймера на фриз/унфриз игрока. Пример использования: Допустим на мероприятие, в которой игроки будут разморожены по истечению n кол-ва секунд. А DC_SPP__FREEZE_TIME можно оставить как дефолт опции.

Daniel_Cortez
07.03.2018, 23:58
Инклуд обновлён до версии 1.2.

В SetPlayerPosEx() добавлены параметры nopassengers и time для телепортации без пассажиров и задания времени заморозки соответственно. Оба параметра необязательные, подробности в 1-м посте.
Также статус заморозки игрока перед телепортацией теперь учитывается с помощью PVar'ов - такая схема должна работать из нескольких скриптов сразу (отдельное спасибо #iDanny за то, что натолкнул на мысль).

Кроме того, исправлена ошибка компиляции в случае если не используется foreach.

#iDanny
08.03.2018, 01:55
А что если заморозить до подключения инклюда?

Daniel_Cortez
08.03.2018, 02:36
А что если заморозить до подключения инклюда?
Во время компиляции скрипта, что ли?

SliM
08.03.2018, 10:03
Во время компиляции скрипта, что ли?

во время запуска Виндоус

Kovshevoy
08.03.2018, 11:52
Для телепортации игрока использовать функцию SetPlayerPosEx:

SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, interior, world, tpcar)
playerid - ID игрока
x, y, z - координаты телепортации
interior, world - ID интерьрера и вирт.мира, в которые будет перемещён игрок. Необязательные параметры (если пропустить, интерьер и вирт. мир не будут изменены).
bool: tpcar - если игрок управляет транспортным средством, телепортировать транспорт вместе с ним (true/false). Необязательный параметр (по умолчанию транспорт переносится вместе с игроком).
bool: nopassengers - при установке в true, если телепортируемый игрок находится за рулём транспортного средства, он телепортируется без пассажиров. Необязательный параметр (по умолчанию пассажиры переносятся вместе с транспортом).
time - время заморозки в миллисекундах. Необязательный параметр (по умолчанию равен значению в DC_SPP__FREEZE_TIME).


Там где идет SetPlayerPosEx, добавь в конец аргумент :)

Nexius_Tailer
08.03.2018, 16:34
Хорошо бы ссылку на пастебин

#iDanny
09.03.2018, 19:55
Во время компиляции скрипта, что ли?

нет, если во время выполнения скрипта вызвать TogglePlayerControllable до подключения инклюда

VVWVV
09.03.2018, 20:06
нет, если во время выполнения скрипта вызвать TogglePlayerControllable до подключения инклюда

А зачем? Вряд ли так кто-то будет делать.

DeimoS
09.03.2018, 22:32
А что если заморозить до подключения инклюда?

нет, если во время выполнения скрипта вызвать TogglePlayerControllable до подключения инклюда


Крайне странный вопрос. Это как сказать: "Зачем нужны перила, ограждающие обрыв со скалы, если через них можно перепрыгнуть и упасть в этот обрыв?".
Естественно ничего работать не будет, если инклуд подключить неверно. Логично как-бы :pardon:

whale
11.03.2018, 01:28
Daniel_Cortez, в ссылке на dropbox вместо 3-х букв "w" ( www. ) написано 4-е.

whale
28.08.2018, 20:48
Есть проблема в работе инклуда (думал, что она возникла только у меня, но нет). В общем, при телепортации в интерьер объекты прорисовываются/загружаются на последней секунде указанной задержки. То есть, если указать задержку в 3 секунды - они загрузятся на 3-ей секунде, указать 10 - на 10-ой. Кстати, с данной функцией такого нет (http://pro-pawn.ru/showthread.php?16019-SetPlayerPosEx).

Daniel_Cortez
29.08.2018, 17:25
Да, так и было задумано. Дело в том, что при использовании SetPlayerPos() сервер (а вместе с ним и стример) узнаёт о новых координатах не сразу после вызова функции, а только после того как клиент сам "отчитается" о перемещении игрока на новые координаты. Поэтому я использовал функцию Streamer_UpdateEx(), чтобы форсировать прогрузку объектов на новых координатах, и временно отключал обновление объектов с помощью Streamer_ToggleItemUpdate(), чтобы за время заморозки игрока стример не прогрузил автоматически объекты на старых координатах (т.е. чтобы не было "мелькания" из-за прогрузки сначала на новых координатах, затем на старых, затем опять на новых).

Впрочем, сейчас, после некоторого изучения исходников стримера, я всё же склоняюсь к мнению, что правильней было бы сначала форсить прогрузку, затем отключать автоматические обновления (а не наоборот, как в 1.2 - тогда я думал, что Streamer_ToggleItemUpdate() отключает только автоматические обновления и порядок не так важен). Спасибо, что сообщили о проблеме.

Пока что предлагаю проверить тестовый вариант с исправлением. Если с ним проблем не будет - переведу его в релиз.
https://www.dropbox.com/s/bl9c2m6g0uur5ib/dc_spp.inc?dl=0

Daniel_Cortez
14.09.2018, 20:27
Убедительная просьба тем, кто использует тестовую версию инклуда (см. пост выше) сообщить о работоспособности - нужно знать, стоит ли отмечать ту тестовую версию как стабильный релиз или нет. Я проверял инклуд на localhost, но по-хорошему следует тестировать и на удалённом сервере (на хостинге), которого у меня нет.

#Djuga
28.09.2018, 23:52
Сейчас проверим на хостинге

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

UPD: Сначала телепортирует на координаты выставленные SetSpawnInfo/AddPlayerClass и через пару сек на нужные координаты

Daniel_Cortez
29.09.2018, 14:06
Сначала телепортирует на координаты выставленные SetSpawnInfo/AddPlayerClass и через пару сек на нужные координаты
Понятия не имею, о чём вы. В dc_spp телепортация происходит без задержки и только на указанную позицию. Скорее всего, что-то ещё в вашем моде перехватывает SetPlayerPos и подменяет координаты.

#Djuga
30.09.2018, 13:57
проверял на new.pwn

Kucklovod00
16.10.2018, 17:32
Чем этот метод (назовём его так) лучше статических объектов полов (можно только те, куда телепортируется игрок)? Кто-то говорит о том, что этот инклуд сокращает код, но вам никто раньше не мешал создать функцию (например setplayerposex), в которой будут указаны все параметры (корды, угол, интерьер, виртуальный мир) для телепорта. Зря заморочился, мне кажется. На этом портале есть статья в которой описаны все способы фикса подобных проблем, поэтому лучше ссылаться на неё и конкретно на этот способ, который я описал.

Daniel_Cortez
17.10.2018, 12:07
Чем этот метод (назовём его так) лучше статических объектов полов (можно только те, куда телепортируется игрок)?
Во-первых, я не говорил, что используемый в dc_spp метод непременно лучше. У него есть свои плюсы и свои минусы: он хорош тем, что игроку при телепортации не виден процесс прогрузки объектов (+ к реалистичности; при этом не требуется делать все объекты статическими, расходуя ограниченное число слотов под объекты), но взамен приходится делать небольшую задержку, чтобы объекты успели прогрузиться перед телепортацией игрока.
Во-вторых, этот метод вполне можно комбинировать со статическим полом для подстраховки (если не хотите заставлять игроков ждать и выставили совсем небольшое время задержки, но не уверены, что его хватит для всех игроков).


Кто-то говорит о том, что этот инклуд сокращает код, но вам никто раньше не мешал создать функцию (например setplayerposex), в которой будут указаны все параметры (корды, угол, интерьер, виртуальный мир) для телепорта.
Т.е. вы предлагаете пользователям изобретать свои велосипеды вместо того, чтобы пользоваться готовым решением? Ясно.


На этом портале есть статья в которой описаны все способы фикса подобных проблем, поэтому лучше ссылаться на неё и конкретно на этот способ, который я описал.
Тогда может быть поделитесь ссылкой на эту статью? Впрочем, я сомневаюсь, что она описывает, как сделать прогрузку объектов незаметной для игрока, как в этом инклуде.

Kucklovod00
21.10.2018, 18:45
Во-первых, я не говорил, что используемый в dc_spp метод непременно лучше. У него есть свои плюсы и свои минусы: он хорош тем, что игроку при телепортации не виден процесс прогрузки объектов (+ к реалистичности; при этом не требуется делать все объекты статическими, расходуя ограниченное число слотов под объекты), но взамен приходится делать небольшую задержку, чтобы объекты успели прогрузиться перед телепортацией игрока.
Во-вторых, этот метод вполне можно комбинировать со статическим полом для подстраховки (если не хотите заставлять игроков ждать и выставили совсем небольшое время задержки, но не уверены, что его хватит для всех игроков).


Т.е. вы предлагаете пользователям изобретать свои велосипеды вместо того, чтобы пользоваться готовым решением? Ясно.


Тогда может быть поделитесь ссылкой на эту статью? Впрочем, я сомневаюсь, что она описывает, как сделать прогрузку объектов незаметной для игрока, как в этом инклуде.

Зачем делать какую-то прогрузку, если можно ОДИН объект, на котором стоит игрок после телепорта, сделать статическим? Это готовое решение и есть велосипед, в ответ на это я говорю: зачем?

DeimoS
21.10.2018, 21:29
Зачем делать какую-то прогрузку, если можно ОДИН объект, на котором стоит игрок после телепорта, сделать статическим? Это готовое решение и есть велосипед, в ответ на это я говорю: зачем?

Чтоб не мучиться с выискиванием этого самого объекта среди кучи других, например? Или чтоб не урезать лимиты объектов в зоне стрима?
Не говоря уже о том, что у игроков с плохим пк/медленным интернетом, после телепортации в интерьер, часть объектов может не успеть прогнузиться до того, как игрок начнёт бегать, из-за чего этот самый игрок может, в итоге, оказаться за текстурой стены, например.

Kucklovod00
01.11.2018, 01:10
Чтоб не мучиться с выискиванием этого самого объекта среди кучи других, например? Или чтоб не урезать лимиты объектов в зоне стрима?
Не говоря уже о том, что у игроков с плохим пк/медленным интернетом, после телепортации в интерьер, часть объектов может не успеть прогнузиться до того, как игрок начнёт бегать, из-за чего этот самый игрок может, в итоге, оказаться за текстурой стены, например.

Чтоб не мучиться, достаточно при разработке интерьера "отметить" этот объект. Если у игрока проблемы с интернетом, то зачем вообще играть в САМП? Как правило, при плохом соединении, у игрока высокий пинг. Было бы правильным его кикнуть.

DeimoS
01.11.2018, 18:51
Чтоб не мучиться, достаточно при разработке интерьера "отметить" этот объект.

А что делать тем, у кого уже написан мод и есть куча интерьеров? -_- Заниматься поиском нужного объекта? Да и "отмечать" объект - тоже лишняя работа. Проще поставить этот инклуд и получить тот же самый результат, только не тратя дополнительно время и без того смехотворный лимит на объекты.


Если у игрока проблемы с интернетом, то зачем вообще играть в САМП?

Ну в твоём прекрасном мире, в котором у всех топовые компьютеры, возможно, незачем, но у нас, в реальности, очень многие играют на таком железе, которое и 20 FPS не выдаёт стабильно. Именно поэтому люди, собственно, играют в SA-MP, а не в ту же GTA 5 с её пиратскими мультиплеерами.


Как правило, при плохом соединении, у игрока высокий пинг. Было бы правильным его кикнуть.

Проблемы с прогрузкой не только из-за пинга бывают. На это влияет как FPS, так и общая загруженность сервера в момент телепортации игрока. Тогда даже с пингом под 100 (который для SA-MP является нормой) могут быть проблемы (сам с таким сталкивался, когда работал с одним не самым оптимизированным модом).


Вообще очень забавно смотреть, как ты пытаешься доказать, что одна реализация лучше другой. Тебя же никто не заставляет ставить инклуд. И никто не просит написать такой же. Хочешь вручную выискивать объекты и тратить лимит - пожалуйста, флаг в руки. Твоё время не пострадает от того, что этот инклуд существует.

execution
09.08.2019, 22:42
С первого раза не прорисовываются объекты (будь-то задержка на 2к или же 5к, при том, что пинг до 35).
Когда устанавливал задержку на 2к, то объекты прорисовывались быстро и едва ли падал под пол. Но поставив на 5к - медленно прогружались и практически падал. Что может быть не так?

MAXI-BENZ
30.12.2019, 01:42
Очень понравилось описание инклуда, лумаю хоть код укоротить. Когда подключаю инклуд то получаю

http://ihost.pro-pawn.ru/image.php?di=UR1E

MassonNN
30.12.2019, 10:54
Очень понравилось описание инклуда, лумаю хоть код укоротить. Когда подключаю инклуд то получаю

http://ihost.pro-pawn.ru/image.php?di=UR1E

В моде подключить инклуд "dc_spp" сразу же после "a_samp".

MAXI-BENZ
30.12.2019, 13:01
В моде подключить инклуд "dc_spp" сразу же после "a_samp".

Все также. стример ругается

DeimoS
30.12.2019, 14:00
Все также. стример ругается

А если после стримера подключить?
Скинь список подключаемых инклудов

MAXI-BENZ
30.12.2019, 15:01
А если после стримера подключить?
Скинь список подключаемых инклудов

http://ihost.pro-pawn.ru/image.php?dm=1KFU

DeimoS
30.12.2019, 15:05
streamer и foreach поставь сразу после a_samp и после них уже пропиши dc_spp
Чтоб было:
a_samp
foreach
streamer
dc_spp

MAXI-BENZ
30.12.2019, 15:55
streamer и foreach поставь сразу после a_samp и после них уже пропиши dc_spp
Чтоб было:
a_samp
foreach
streamer
dc_spp

Бесполезно, инклуд конфликтует со стримером

Daniel_Cortez
30.12.2019, 20:43
1. Вполне возможно, что стример устаревшей версии. В нескольких старых версиях streamer.inc не было защиты от повторного подключения (include guard), из-за чего возникали ошибки на новых версиях компилятора, как в 1-м посте. В этом случае, стоит обновить и инклуд, и плагин. Последняя версия: https://github.com/samp-incognito/samp-streamer-plugin/releases/download/v2.9.4/samp-streamer-plugin-2.9.4.zip

2. В некоторых поделиях (печально известного) Рустама Рича (и вполне возможно, что не только его, ибо дурной пример заразителен) содержимое нескольких инклудов запихнуто в один "для оптимизации". Если так, то из такого мода ничему хорошему вы не научитесь, лучше сразу бросайте его.

MAXI-BENZ
30.12.2019, 21:21
Обновление плагинов и инклудов помогло но теперь ругается на сток


error 021: symbol already defined: "SetPlayerPosEx"


stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z)
{
PlayerEnterTime[playerid] += 221;
Air_Get_Pos(playerid);
Air_Gettime(playerid, 4);
SetPVarInt(playerid, "AntiBreik", 3);
PI[playerid][pPos][0] = x;
PI[playerid][pPos][1] = y;
PI[playerid][pPos][2] = z;
return SetPlayerPos(playerid, PI[playerid][pPos][0], PI[playerid][pPos][1], PI[playerid][pPos][2]);
}
#if defined _ALS_SetPlayerPos
#undef SetPlayerPos
#else
#define _ALS_SetPlayerPos
#endif
#define SetPlayerPos SetPlayerPosEx

execution
31.12.2019, 00:10
Обновление плагинов и инклудов помогло но теперь ругается на сток


error 021: symbol already defined: "SetPlayerPosEx"


stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z)
{
PlayerEnterTime[playerid] += 221;
Air_Get_Pos(playerid);
Air_Gettime(playerid, 4);
SetPVarInt(playerid, "AntiBreik", 3);
PI[playerid][pPos][0] = x;
PI[playerid][pPos][1] = y;
PI[playerid][pPos][2] = z;
return SetPlayerPos(playerid, PI[playerid][pPos][0], PI[playerid][pPos][1], PI[playerid][pPos][2]);
}
#if defined _ALS_SetPlayerPos
#undef SetPlayerPos
#else
#define _ALS_SetPlayerPos
#endif
#define SetPlayerPos SetPlayerPosEx

Ну так банально переведи ошибку и поймёшь. Либо свою функцию переименуй, либо которая в инклюде

Salik_Davince
03.09.2020, 00:15
Может в помощь автору или же мне совет, использую чуть доработанный способ.

stock ServerSetPlayerPos(playerid, Float:x, Float:y, Float:z, toggled = 0)
{
if(toggled != 0)
{
new
itemsCount[1],
streamer_count = Streamer_GetNearbyItems(x, y, z, STREAMER_TYPE_OBJECT, itemsCount, sizeof(itemsCount), 300.0),
SPP__FREEZE_TIME = (GetPlayerPing(playerid) * 4) + (streamer_count * 2) + 1550;//850


if (0 == Streamer_UpdateEx(playerid, x, y, z, _, _))
return 0;


//Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 0);
TogglePlayerControllableEx(playerid, false);
SetTimerEx(!"@__spp__untoggleupdate", SPP__FREEZE_TIME, 0, !"d", playerid);



//Streamer_ToggleCameraUpdate(playerid, 1);
//Streamer_ToggleIdleUpdate(playerid, 1);
//Streamer_UpdateEx(playerid, x, y, z, _, _, _, SPP__FREEZE_TIME, 1);
//TogglePlayerControllableEx(playerid, false);

//SetTimerEx("@__spp__untoggleupdate", SPP__FREEZE_TIME, 0, "d", playerid);

SetPlayerPos(playerid, x, y, z + 0.3);
return true;
}
SetPlayerPos(playerid, x, y, z);

return true;
}

@__spp__untoggleupdate(playerid);
@__spp__untoggleupdate(playerid)
{
//Streamer_ToggleCameraUpdate(playerid, 0);
//if (GetPVarInt(playerid, dc_spp__pvar_name) == 0)
TogglePlayerControllableEx(playerid, true);
return true;//Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 1);
//return Streamer_ToggleIdleUpdate(playerid, 1);
}


P.S что было закомментировано то это было испытано в действии, лучшим вариантом остаётся что не осталось в комментариях, т.e узнать количество объектов в телепортируемой местности, узнать пинг игрока, увеличить их для времени фриза игрока (это не магические числа, просто не комментировал ситуацию, по сути все было испытано на большом количестве игроков), а после разморозить при загрузке объектов.

Daniel_Cortez
03.09.2020, 19:27
...
Т.е. это ваш код и вы согласны на его перелицензирование под zlib License? (Для включения в новый релиз мне нужно явное согласие.)

Но даже без этого есть вызывающие нарекания моменты. Например, не совсем понятно, как вычислялась эта формула:
SPP__FREEZE_TIME = (GetPlayerPing(playerid) * 4) + (streamer_count * 2) + 1550;
Почему пинг умножается на 4, а кол-во объектов в зоне стрима только на 2? Откуда получено "магическое число" 1550? И если я правильно понял и это базовое значение задержки, то наверняка логичнее было бы вынести его в именованную константу и использовать его в самом начале формулы, а не в конце?

Salik_Davince
03.09.2020, 21:05
Даю согласие на изменение, внесения поправок и всего что душе угодно с данным кодом. Отвечу на ваши вопросы следующим постом, но пока у меня было сообщение которое не отправилось в связи отключением моего интернета, хотел бы опубликовать для помощи и его вам.

Пост:

Да и есть более лучший способ, это поставить проверку на Pawn.Raknet, при телепорте функцией SetPlayerPos выдавать игроку переменную которая отвечает "телепортирован ли игрок где имеются объекты", streamPlayerObjects[playerid], если условие верно присваивать ему 1, создать цикл таймер (200мс) и переменную отвечающий за сверку загруженного объекта, при входящих RPC_CreateObject прибавлять к переменной streamPlayerObjects[playerid]++, при этом проверяется в таймере(200мс) последний загруженный объект, идет проверка по типу

if(streamPlayerObjects[playerid] == prv_streamPlayerObject[player])
{
//Если верно то останавливаем таймер
KillTimer(timerid);

//Размораживаем игрока
TogglePlayerControllable(playerid, true);

//При необходимости можем проинформировать игрока сколько объектов было загружено

// static const
// preload_objects_msg[] = "При телепортации было загружено %d объектов!";
//
// new
// preload_objects_string[ sizeof(preload_objects_msg) - 2 + 11 ];
// format(preload_objects_string, sizeof(preload_objects_string), preload_objects_msg, streamPlayerObjects[playerid]);
// SendClientMessage(playerid, -1, preload_objects_string);

//Обнуляем переменные
streamPlayerObjects[playerid] = 0;
prv_streamPlayerObject[player] = 0;

}
else
{
//если же условие не верно то присваиваем переменной prv_streamPlayerObject[player] значение streamPlayerObjects[playerid]
prv_streamPlayerObject[player] = streamPlayerObjects[playerid];
}


Писал текст ночью, может будут замечания, если будет нужен готовый код, то могу вполне выдать его.

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


Но даже без этого есть вызывающие нарекания моменты. Например, не совсем понятно, как вычислялась эта формула:
SPP__FREEZE_TIME = (GetPlayerPing(playerid) * 4) + (streamer_count * 2) + 1550;

Почему пинг умножается на 4, а кол-во объектов в зоне стрима только на 2? Откуда получено "магическое число" 1550? И если я правильно понял и это базовое значение задержки, то наверняка логичнее было бы вынести его в именованную константу и использовать его в самом начале формулы, а не в конце?

Конечно разумным способом будет выставить все значения умножения константами, это просто мой чистый проработанный метод который я проверял на большом количестве игроков, к чему и была написана первые слова про "помощь автору или же мне совет", на счёт вычислительных формул при разморозке -

Проверял на игроках у кого пинг ниже 40 = 40 умножал на 4 = 160мс / и у тех у кого был пинг выше 400 т.e 1.6секунда, что приравнивалось получениям логированием при большом пинге 40-100 объектов, при нормальном(40) - 120-300 объектов.

Количество объектов в зоне телепортируемой местности - Учитывалось опять же логированием при большом количестве объектов 800-900, на каждые 100-200 объектов уходило в среднем 0.2-0.4 секунд, 800 объектов = 1.2-1.8секунд, значение умножение x2 отсюда же.

Но и на данном этапе все было не замечательно, было бы лучшим вариантом опять же проверить все на большом количестве игроков, есть замечания по "магическому числу которое делалось в основном на базовой основе", ставил значение 1550 = у игроков у кого пинг выше 60-80 грузились объекты идеально и фризило так же, но у тех у кого пинг ниже 40 - был чуть фриз больше чем загруженность объектов, поставил значение на 850 - идеально для них но не для тех у кого пинг выше 60-80, опять же код нужно довести до идеала, в чем я могу помочь тестированием и опять же внесением каких либо улучшений в поправки кода, но остальное права как писал выше выдаю вам.