Перевод: DJ_WEST
В данной статье рассматривает метод генерации случайных позиций, к примеру, для появления игрока или для любых других нужных вам вещей. То есть это полностью автоматизирует процесс, который раньше заключался в создании админов точек появления игрока на карте и сохранением их в конфиг для дальнейщего чтения плагином. С помощью рассматриваемого метода вы сможете получать случайные позиции с минимальной дистанцией друг от друга.
Метод использует несколько проверок перед тем, как удостовериться, что данная позиция свободна для появления игрока или объекта:
- Минимальное расстояние между точками при первом проходе
- Проверка позиции на пустое содержимое
- Проверка на площадь (HULL_LARGE)
- Избежание места, расположенного вблизи неба
- Избежание воды и других поверхностей
- Видимость между соседними точками
Примерный плагин, как использовать метод автора (.inc файл):
- Код: Выделить всё
#include <amxmodx>
#include <superspawns>
public plugin_init()
{
// Прежде всего делаем инициализацию массива
// 3500.0 - минимальное расстояние между точками
// Будут находиться ближайщие позиции, но GetOrigin будет вырезать места
// с расстоянием, которое меньше значения 3500.0
SsInit(3500.0)
// Начать сканирование карты
SsScan()
// Функция для записи найденных мест в лог-файл
SsDump()
// Данная команда вызывает GetOrigin() для получения новой позиции
// Для того чтобы разместить в ней определенную модель (для примера)
register_concmd("spawnent", "spawnent")
}
public spawnent(id)
{
// Создаем переменную для хранения координаты позиции
new Float:f_Origin[3]
// SsGetOrigin() вернет true, если найдена удачная позиция
// или вернет false, если такой позиции не найдено
if (SsGetOrigin(f_Origin))
{
// Создаем объект класса info_target и сохраняем его номер в i_Ent
new i_Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
// Проверяем успешность создания объекта
if(pev_valid(i_Ent))
{
// Устанавливаем объекту указанную модель
engfunc(EngFunc_SetModel, i_Ent, "models/player/sas/sas.mdl")
// Перемещаем объект в найденную позицию по координатам f_Origin
engfunc(EngFunc_SetOrigin, i_Ent, f_Origin)
}
}
else
// Выводим в консоль сервера сообщение об ошибке
server_print("No more locations")
return PLUGIN_HANDLED
}