Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 17 из 17
  1. #11
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    А gl_common'овская реализация как вам?

  2. #12
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от TheMallard Посмотреть сообщение
    А gl_common'овская реализация как вам?
    Если ты про gl_message.inc и функцию TalkMessage, то она отправляет сообщение только в оттенках серого.

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

    Статус
    Оффлайн
    Регистрация
    06.03.2016
    Адрес
    Moscow
    Сообщений
    167
    Репутация:
    44 ±
    Круто, Сергей. Видна рука мастера, как всегда.
    Член сообщества Green Square.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Исправлена проблема с const-корректностью в заголовке функции (приводило к выдаче варнингов на версии компилятора 3.10.9).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #15
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
      Открыть/закрыть
    Цитата Сообщение от ziggi Посмотреть сообщение
    Описание:
    Функция отправляет сообщение ближайшим игрокам вычисляя цвет, интенсивность которого завит от расстояния.

    Параметры:
    playerid - игрок, от которого идёт сообщение
    Float:max_range - максимальное расстояние, на котором будет отправлено сообщение
    color - базовый цвет
    string[] - сообщение
    Float:max_ratio = 1.6 (не обязательный) - коэффициент уменьшения интенсивности цвета

    Возвращаемое значение:
    Функция возвращает 0, если playerid не подключен, в остальных случаях возвращается 1.

    Код:
    1. stock ProxDetector(playerid, Float:max_range, color, const string[], Float:max_ratio = 1.6)
    2. {
    3. new
    4. Float:pos_x,
    5. Float:pos_y,
    6. Float:pos_z,
    7. Float:range,
    8. Float:range_ratio,
    9. Float:range_with_ratio,
    10. clr_r, clr_g, clr_b,
    11. Float:color_r, Float:color_g, Float:color_b;
    12.  
    13. if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
    14. return 0;
    15. }
    16.  
    17. color_r = float(color >> 24 & 0xFF);
    18. color_g = float(color >> 16 & 0xFF);
    19. color_b = float(color >> 8 & 0xFF);
    20. range_with_ratio = max_range * max_ratio;
    21.  
    22. #if defined foreach
    23. foreach (new i : Player) {
    24. #else
    25. for (new i = GetPlayerPoolSize(); i != -1; i--) {
    26. #endif
    27. if (!IsPlayerStreamedIn(playerid, i)) {
    28. continue;
    29. }
    30.  
    31. range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
    32. if (range > max_range) {
    33. continue;
    34. }
    35.  
    36. range_ratio = (range_with_ratio - range) / range_with_ratio;
    37. clr_r = floatround(range_ratio * color_r);
    38. clr_g = floatround(range_ratio * color_g);
    39. clr_b = floatround(range_ratio * color_b);
    40.  
    41. SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
    42. }
    43.  
    44. SendClientMessage(playerid, color, string);
    45. return 1;
    46. }


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

    Пример использования:
    1. CMD:say(playerid, params[])
    2. {
    3. ProxDetector(playerid, 20.0, 0xFFAA99FF, params);
    4. return 1;
    5. }


    Автор: ziggi


    Решение отличное, но есть способ который на чуть чуть быстрее работает, но приходится вписывать цвета самому.

    Код функции:
      Открыть/закрыть
    1. stock ProxDetector(Float:radi, playerid, const string[], color1, color2, color3, color4, color5)
    2. {
    3. if(IsPlayerConnected(playerid))
    4. {
    5. static Float:posx, Float:posy, Float:posz, Float:oldposx, Float:oldposy, Float:oldposz, Float:tempposx, Float:tempposy, Float:tempposz;
    6. GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    7. foreach(new i: Player)
    8. {
    9. {
    10. {
    11. GetPlayerPos(i, posx, posy, posz);
    12. tempposx = (oldposx -posx);
    13. tempposy = (oldposy -posy);
    14. tempposz = (oldposz -posz);
    15. if(((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16))) {
    16. SendClientMessage(i, color1, string);
    17. }
    18. else if(((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8))) {
    19. SendClientMessage(i, color2, string);
    20. }
    21. else if(((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4))) {
    22. SendClientMessage(i, color3, string);
    23. }
    24. else if(((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2))) {
    25. SendClientMessage(i, color4, string);
    26. }
    27. else if(((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi))) {
    28. SendClientMessage(i, color5, string);
    29. }
    30. }
    31. }
    32. }
    33. }
    34. return 1;
    35. }


    Пример использования:
    1. CMD:shout(playerid, params[])
    2. {
    3. if(sscanf(params, "s[137]", params[0])) return SCM(playerid, COLOR_WHITE, "Введите: /s(hout) [текст]");
    4. new string[19+(-2+MAX_PLAYER_NAME)+(-2+3)+(-2+96)+1];
    5. format(string, sizeof(string), "Крик: %s!", params[0]);
    6. ProxDetector(60.0, playerid, string, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xE6E6E6E6, 0xC8C8C8C8);
    7. return 1;
    8. }


    Тесты скорости.

    Код сравнения:
      Открыть/закрыть
    1. // Кол-во итераций в циклах.
    2. const PROFILER_ITERATIONS_MAJOR = 10_000;
    3. const PROFILER_ITERATIONS_MINOR = 1_000;
    4.  
    5. // Названия отрывков кода.
    6. new const code_snippets_names[2][] =
    7. {
    8. {"ProxDetector by ziggy"},
    9. {"ProxDetector"}
    10. };
    11.  
    12. // Здесь вы можете объявить переменные, используемые в профилируемых отрывках кода
    13. // и выполнить некоторые действия непосредственно перед профилированием.
    14. #define Prerequisites();\
    15. /*
    16.   Собственно, сами отрывки кода, которые нужно тестировать.
    17.   Если код состоит из нескольких строк, переносите их обратным слэшем.
    18.   Пример:
    19.   #define CodeSnippet1();\
    20.   DoSomething();\
    21.   DoSomethingElse();
    22. */
    23.  
    24. #include <a_samp>
    25. #include "../sources/include/foreach.inc"
    26.  
    27. #define COLOR_WHITE 0xFFFFFFFF
    28.  
    29. #define CodeSnippet0();\
    30.   ProxDetector(0, 20.0, COLOR_WHITE, "params");
    31.  
    32. #define CodeSnippet1();\
    33.   ProxDetector_2(60.0, 0, "string", COLOR_WHITE,COLOR_WHITE,COLOR_WHITE,COLOR_WHITE,COLOR_WHITE);
    34.  
    35. stock ProxDetector(playerid, Float:max_range, color, const string[], Float:max_ratio = 1.6)
    36. {
    37. new Float:pos_x, Float:pos_y, Float:pos_z, Float:range, Float:range_ratio, Float:range_with_ratio,
    38. clr_r, clr_g, clr_b, Float:color_r, Float:color_g, Float:color_b;
    39.  
    40. if (!GetPlayerPos(playerid, pos_x, pos_y, pos_z)) {
    41. return 0;
    42. }
    43.  
    44. color_r = float(color >> 24 & 0xFF);
    45. color_g = float(color >> 16 & 0xFF);
    46. color_b = float(color >> 8 & 0xFF);
    47. range_with_ratio = max_range * max_ratio;
    48.  
    49. foreach (new i:Player) {
    50. if (!IsPlayerStreamedIn(playerid, i)) {
    51. continue;
    52. }
    53.  
    54. range = GetPlayerDistanceFromPoint(i, pos_x, pos_y, pos_z);
    55. if (range > max_range) {
    56. continue;
    57. }
    58.  
    59. range_ratio = (range_with_ratio - range) / range_with_ratio;
    60. clr_r = floatround(range_ratio * color_r);
    61. clr_g = floatround(range_ratio * color_g);
    62. clr_b = floatround(range_ratio * color_b);
    63.  
    64. SendClientMessage(i, (color & 0xFF) | (clr_b << 8) | (clr_g << 16) | (clr_r << 24), string);
    65. }
    66.  
    67. SendClientMessage(playerid, color, string);
    68. return 1;
    69. }
    70.  
    71. stock ProxDetector_2(Float:radi, playerid, const string[], color1, color2, color3, color4, color5)
    72. {
    73. if(IsPlayerConnected(playerid))
    74. {
    75. static Float:posx, Float:posy, Float:posz, Float:oldposx, Float:oldposy, Float:oldposz, Float:tempposx, Float:tempposy, Float:tempposz;
    76. GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    77. foreach(new i: Player)
    78. {
    79. {
    80. {
    81. GetPlayerPos(i, posx, posy, posz);
    82. tempposx = (oldposx -posx);
    83. tempposy = (oldposy -posy);
    84. tempposz = (oldposz -posz);
    85. if(((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16))) SendClientMessage(i, color1, string);
    86. else if(((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8))) SendClientMessage(i, color2, string);
    87. else if(((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4))) SendClientMessage(i, color3, string);
    88. else if(((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2))) SendClientMessage(i, color4, string);
    89. else if(((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi))) SendClientMessage(i, color5, string);
    90. }
    91. }
    92. }
    93. }
    94. return 1;
    95. }


    Результат теста:
    Код:
    Тестирование: <ProxDetector by ziggy> vs <ProxDetector>
    Режим: интерпретируемый, 10000x1000 итераций.
    ProxDetector by ziggy: 4755
    ProxDetector: 3313


    Автор функции: неизвестен
    Последний раз редактировалось punkochel; 29.05.2020 в 23:43.

  6. #16
    Аватар для Kovshevoy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.07.2015
    Сообщений
    190
    Репутация:
    25 ±
    Цитата Сообщение от punkochel Посмотреть сообщение

    Решение отличное, но есть способ который на чуть чуть быстрее работает, но приходится вписывать цвета самому.
    Зато читабельность кода хромает.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Решение отличное, но есть способ который на чуть чуть быстрее работает, но приходится вписывать цвета самому.
    Цитата Сообщение от Kovshevoy Посмотреть сообщение
    Зато читабельность кода хромает.
    Исполнение тоже такое себе. Очень сомневаюсь, что такой код может быть производительнее варианта из 1-го поста. Каким образом проводилось тестирование? Сколько игроков/ботов было подключено? В каком радиусе они были от контрольного игрока, на котором тестировалась функция?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    whale (01.06.2020)
 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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