Скриптер
Проверенный
Пользователь
- Сообщения
- 3,579
- Реакции
- 1,569
- Помог
- 137 раз(а)
ROG - "Лучший генератор случайных точек"
Автор: HamletEagle
Автор благодарит: edon за тестирование и идеи
Оригинальная тема: https://forums.alliedmods.net/showthread.php?t=309495
Доработка: Nordic Warrior
Данная версия содержит в себе ряд улучшений от меня, таких как:
Использование: подключить инклуд в свой плагин, вызвать инициализацию и поиск точек. Валидные точки попадут в кеш плагина (Array), откуда вы сможете получать их для своих нужд без потерь производительности.
Примечание:
Так как 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.
Если вы не хотите использовать эту функцию, просто оставьте второй параметр пустым.
Код пропустит все точки, у которых 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
Последнее редактирование: