[INC] ROG - A better random origin generator

Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
ROG - "Лучший генератор случайных точек"

Автор: HamletEagle
Автор благодарит: edon за тестирование и идеи
Оригинальная тема: https://forums.alliedmods.net/showthread.php?t=309495
Доработка: Nordic Warrior

Данная версия содержит в себе ряд улучшений от меня, таких как:
  • Убраны неиспользуемые переменные и инклуд
  • Убраны предупреждения при компиляции
  • Кол-во итераций при поиске позиций увеличено с 10000 до 100000, что дало прирост в среднем в два раза по количеству найденных валидных случайных точек (при небольшом расстоянии между точками). Так же это число вынесено в начало инклуда, для быстрого редактирования
  • Выпилено использование Engine (Почему?)
  • Добавлены две новых функции, ROGGetRandomOrigin и ROGGetOriginsNum
  • Добавлено описание всех функций
  • Различные мелкие оптимизации производительности и кодстайла
Описание: позволяет случайным образом находить на карте случайные точки и получать их координаты. Координаты точек проверяются на валидность, т.е. выбираются места, где может стоять игрок в полный рост. Тем не менее, это не спасает от недобросовестных мапперов, оставляющих пустые области вне карт. Однако, при инициализации точек есть возможность указать свои условия для валидации координат. См. ниже в описании функций.

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

Примечание:
Так как rog работает быстро, вы можете генерировать точки в любое время без фризов на сервере, что означает, что в любой момент вы можете снова вызвать ROGInitialize() без каких-либо проблем.
Если вы не хотите снова вызывать ROGInitialize(), но также не хотите всегда получать одни и те же точки, вы можете использовать ROGShuffleOrigins, который будет рандомизировать точки в массиве (или использовать ROGGetRandomOrigin в моей версии - примечание от Nordic Warrior).

Функции:
Код:
/**
* Инициализирует генератор случайных точек и заполняет массив.
*
* @param MinDistance       Минимальное расстояние между точками
* @param CheckFunction     Позволяет установить пользовательские условия для проверки точек (необязательно)
*
* @noreturn
*/
stock ROGInitialize(Float:MinDistance, const CheckFunction[] = "")

/**
* Получает координаты случайной точки.
*
* @note После использования всех точек из массива, отсчёт пойдет заново по кругу,
*         что означает, что точки никогда не закончатся.
* @note Получает точки последовательно одну за другой из массива.
*
* @param Origin            Массив для записи координат
*
* @noreturn
*/
stock ROGGetOrigin(Float:Origin[3])

/**
* Получает координаты случайной точки.
*
* @note Получает точки из массива в случайном порядке.
*
* @param Origin            Массив исходных точек
*
* @noreturn
*/
stock ROGGetRandomOrigin(Float:Origin[3])

/**
* Случайным образом перемешивает точки в массиве.
*
* @noreturn
*/
stock ROGShuffleOrigins()

/**
* Выводит в консоль сервера все сгенерированные координаты точек и их количество.
*
* @noreturn
*/
stock ROGDumpOriginData()

/**
* Возвращает общее количество случайных точек в массиве.
*
* @return      Общее количество случайных точек в массиве
*/
stock ROGGetOriginsNum()
Примеры:
Простой пример, который так же позволит перемещаться между сгенерированными точками.
Код:
#include <amxmodx>
#include <rog>
#include <fakemeta>

public plugin_init()
{
    ROGInitialize(250.0)
    ROGDumpOriginData()

    register_clcmd("say /next", "ClientCommand_NextOrigin")
    register_clcmd("say /generate", "ClientCommand_GenerateOrigins")
    register_clcmd("say /shuffle", "ClientCommand_ShuffleOrigins")
}

public ClientCommand_NextOrigin(id)
{
    //get the next origin and spawn the player there
    new Float:Origin[3]
    ROGGetOrigin(Origin)
    engfunc(EngFunc_SetOrigin, id, Origin)
}

public ClientCommand_GenerateOrigins(id)
{
    //generate a new set of origins during runtime
    ROGInitialize(250.0)
}

public ClientCommand_ShuffleOrigins(id)
{
    //shuffle the existing set of origins
    ROGShuffleOrigins()
}
Пример кода с пользовательской проверкой валидности точек.
Код пропустит все точки, у которых origin[0] < -2000.0.
Чтобы пропустить точку, нужно вернуть 0.
Если вы не хотите использовать эту функцию, просто оставьте второй параметр пустым.
Код:
#include <amxmodx>
#include <rog>
#include <fakemeta>

public plugin_init()
{
    ROGInitialize(250.0, "CheckOrigin")
    ROGDumpOriginData()

    register_clcmd("say /next", "ClientCommand_NextOrigin")
}

public CheckOrigin(Float:origin[3])
{
    if(origin[0] < -2000.0)
    {
        return 0
    }
    return 1
}

public ClientCommand_NextOrigin(id)
{
    new Float:Origin[3]
    ROGGetOrigin(Origin)
    engfunc(EngFunc_SetOrigin, id, Origin)
}
 

Вложения

  • 8.8 KB Просмотры: 17
Последнее редактирование:
Сообщения
192
Реакции
148
Помог
1 раз(а)
Скрытое содержимое для пользователей: Nordic Warrior
 
Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
Скрытое содержимое для пользователей: Ruby
 

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу