Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 6 из 6 ПерваяПервая ... 4 5 6
Показано с 51 по 53 из 53
  1. #51
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Может в помощь автору или же мне совет, использую чуть доработанный способ.

    1. stock ServerSetPlayerPos(playerid, Float:x, Float:y, Float:z, toggled = 0)
    2. {
    3. if(toggled != 0)
    4. {
    5. new
    6. itemsCount[1],
    7. streamer_count = Streamer_GetNearbyItems(x, y, z, STREAMER_TYPE_OBJECT, itemsCount, sizeof(itemsCount), 300.0),
    8. SPP__FREEZE_TIME = (GetPlayerPing(playerid) * 4) + (streamer_count * 2) + 1550;//850
    9.  
    10.  
    11. if (0 == Streamer_UpdateEx(playerid, x, y, z, _, _))
    12. return 0;
    13.  
    14.  
    15. //Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 0);
    16. TogglePlayerControllableEx(playerid, false);
    17. SetTimerEx(!"@__spp__untoggleupdate", SPP__FREEZE_TIME, 0, !"d", playerid);
    18.  
    19.  
    20.  
    21. //Streamer_ToggleCameraUpdate(playerid, 1);
    22. //Streamer_ToggleIdleUpdate(playerid, 1);
    23. //Streamer_UpdateEx(playerid, x, y, z, _, _, _, SPP__FREEZE_TIME, 1);
    24. //TogglePlayerControllableEx(playerid, false);
    25.  
    26. //SetTimerEx("@__spp__untoggleupdate", SPP__FREEZE_TIME, 0, "d", playerid);
    27.  
    28. SetPlayerPos(playerid, x, y, z + 0.3);
    29. return true;
    30. }
    31. SetPlayerPos(playerid, x, y, z);
    32.  
    33. return true;
    34. }
    35.  
    36. @__spp__untoggleupdate(playerid);
    37. @__spp__untoggleupdate(playerid)
    38. {
    39. //Streamer_ToggleCameraUpdate(playerid, 0);
    40. //if (GetPVarInt(playerid, dc_spp__pvar_name) == 0)
    41. TogglePlayerControllableEx(playerid, true);
    42. return true;//Streamer_ToggleItemUpdate(playerid, STREAMER_TYPE_OBJECT, 1);
    43. //return Streamer_ToggleIdleUpdate(playerid, 1);
    44. }


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

  2. #52
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    ...
    Т.е. это ваш код и вы согласны на его перелицензирование под zlib License? (Для включения в новый релиз мне нужно явное согласие.)

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

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

  3. #53
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Даю согласие на изменение, внесения поправок и всего что душе угодно с данным кодом. Отвечу на ваши вопросы следующим постом, но пока у меня было сообщение которое не отправилось в связи отключением моего интернета, хотел бы опубликовать для помощи и его вам.

    Пост:

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

    1. if(streamPlayerObjects[playerid] == prv_streamPlayerObject[player])
    2. {
    3. //Если верно то останавливаем таймер
    4. KillTimer(timerid);
    5.  
    6. //Размораживаем игрока
    7. TogglePlayerControllable(playerid, true);
    8.  
    9. //При необходимости можем проинформировать игрока сколько объектов было загружено
    10.  
    11. // static const
    12. // preload_objects_msg[] = "При телепортации было загружено %d объектов!";
    13. //
    14. // new
    15. // preload_objects_string[ sizeof(preload_objects_msg) - 2 + 11 ];
    16. // format(preload_objects_string, sizeof(preload_objects_string), preload_objects_msg, streamPlayerObjects[playerid]);
    17. // SendClientMessage(playerid, -1, preload_objects_string);
    18.  
    19. //Обнуляем переменные
    20. streamPlayerObjects[playerid] = 0;
    21. prv_streamPlayerObject[player] = 0;
    22.  
    23. }
    24. else
    25. {
    26. //если же условие не верно то присваиваем переменной prv_streamPlayerObject[player] значение streamPlayerObjects[playerid]
    27. prv_streamPlayerObject[player] = streamPlayerObjects[playerid];
    28. }


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

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

    Но даже без этого есть вызывающие нарекания моменты. Например, не совсем понятно, как вычислялась эта формула:
    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, опять же код нужно довести до идеала, в чем я могу помочь тестированием и опять же внесением каких либо улучшений в поправки кода, но остальное права как писал выше выдаю вам.

 

 
Страница 6 из 6 ПерваяПервая ... 4 5 6

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •