Русское сообщество по скриптингу

Генератор случайных позиций

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Генератор случайных позиций

Сообщение DJ_WEST » 23 июл 2010, 23:23

Автор: joropito
Перевод: 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

superspawns.inc
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12