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

[API] Custom Entities

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

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

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

[API] Custom Entities

Сообщение Hedgehog Fog » 04 ноя 2016, 02:27

Custom Entities API


Описание

Это API поможет вам создавать пользовательские энтитии для вашего мода с некоторым предварительными настройками, такими как модели, размеры и т.д
Это может быть использовано для создания логических энтитий, подбираемых предметов, декораций.

Добавление на карту
Просто создать энтити с зарегистрированным классом на вашей карте.

Создание

Код: Выделить всё

new ceEnt 
= CE_Create(szClassname, vOrigin);
if (ceEnt) {
    dllfunc(DLLFunc_Spawn, ceEnt);
}
 



Корректное удаление

Код: Выделить всё
CE_Remove(ent); 



API

Код: Выделить всё
//Base classname for custom entities
#define CE_BASE_CLASSNAME "info_target"

enum CEPreset //Presets
{
    CEPreset_None = 0,
    CEPreset_Item, //For items
    CEPreset_NPC, //For NPC
    CEPreset_Prop //For props
};

enum CEFunction
{
    CEFunction_Spawn, //Called when entity spawned.
    CEFunction_Remove, //Called before entity will be removed.
    CEFunction_Picked, //Called when entity picked.
    CEFunction_Pickup, //Called when player touch item. Must return PLUGIN_HANDLED if picked.
    CEFunction_KVD //Called when new key value obtained
};

/*
 * Register entity.
 *
 * @param szName            Name of entity.
 * @param modelIndex        Precached model index.
 * @param vMins                Min size of entity.
 * @param vMaxs                Max size of entity.
 * @param fLifeTime            Life time of entity.
 * @param preset            Preset for entity.
 */
native CE_Register
(
    const szName[],
    modelIndex = 0,
    const Float:vMins[3] = {-8.0, -8.0, -8.0},
    const Float:vMaxs[3] = {8.0, 8.0, 8.0},
    Float:fLifeTime = 0.0,
    CEPreset:preset = CEPreset_None
);

/*
 * Create entity.
 *
 * @param szName            Name of entity.
 * @param vOrigin            Spawn origin.
 * @param temp                Remove entity in next round if true.
 * @return                    Entity index.
 */
native CE_Create(const szName[], const Float:vOrigin[3], bool:temp = true);

/*
 * Gets size of entity.
 *
 * @param szClassname        Classname of entity.
 * @param vSize                Output vector.
 */
native CE_GetSize(const szName[], Float:vMins[3], Float:vMaxs[3]);

/*
 * Gets modelindex of entity.
 *
 * @param szClassname        Classname of entity.
 * @return                    Modelindex of entity
 */
native CE_GetModelIndex(const szName[]);

/*
 * Remove entity correctly.
 *
 * @param ent                Index of entity.
 * @return                    Result true/false
 */
native bool:CE_Remove(ent);

/*
 * Check if entity is associated with current plugin.
 *
 * @param ent                Index of entity.
 * @return                    Result true/false
 */
native bool:CE_CheckAssociation(ent);

/*
 * Register new hook for entity.
 *
 * @param function            Function handler
 * @param szClassname        Classname of entity
 * @param szCallback        Callback
 */
native CE_RegisterHook(CEFunction:function, const szClassname[], const szCallback[]);

/*
 * Get entity handler.
 *
 * @param szClassname        Classname of entity
 * @return                    handle index
 */
native CE_GetHandler(const szClassname[]);
 



CE_SPAWNER

Спавнер пользовательских энтитий.

KVD для спавнера
  • ce_name (string) - Имя класса пользовательской энтитии
  • delay (float) - Задержка перед спавном (0.0 - спавнить 1 раз за раунд)
  • impulse (float) - Сила броска после спавна.

Примеры

Super Healthkit

Код: Выделить всё
#pragma semicolon 1

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#include <api_custom_entities>

#define ENTITY_NAME "item_super_healthkit"

#define MAX_HEALTH 100.0
#define HEAL_AMOUNT MAX_HEALTH

new g_szSndItemSpawn[] = "fvox/beep.wav";
new g_szSndItemPickup[] = "items/smallmedkit1.wav";
new g_szSndItemDisappeared[] = "fvox/buzz.wav";

public plugin_precache()
{
    precache_sound(g_szSndItemSpawn);
    precache_sound(g_szSndItemPickup);
    precache_sound(g_szSndItemDisappeared);

    //Регистрируем новую энтитию
    CE_Register(
        .szName = ENTITY_NAME, //имя класса
        .modelIndex = precache_model("models/w_medkit.mdl"), //индекс модели
        .vMins = Float:{-12.0, -12.0, 0.0}, //mins (стартовая точка куба)
        .vMaxs = Float:{12.0, 12.0, 24.0}, //maxs (конечная точка куба)
        .fLifeTime = 10.0, //время жизни(0.0 для того, чтоб не удалялась)
        .preset = CEPreset_Item //предварительные настройки
    );
    
    
//Регестрируем отлов события появления объекта
    CE_RegisterHook(CEFunction_Spawn, ENTITY_NAME, "OnSpawn");

    //Регестрируем отлов события подбора предмета
    CE_RegisterHook(CEFunction_Pickup, ENTITY_NAME, "OnPickup");

    //Регестрируем отлов события 'предмет подобран'
    CE_RegisterHook(CEFunction_Picked, ENTITY_NAME, "OnPicked");

    //Регестрируем отлов события 'предмет будет удален'
    CE_RegisterHook(CEFunction_Remove, ENTITY_NAME, "OnRemove");
    
}

public plugin_init()
{
    register_plugin("[Custom Entity] Item Super Health Kit", "1.0.0", "Hedgehog Fog");

    //Регистрируем отлов события Think
    RegisterHam(Ham_Think, CE_BASE_CLASSNAME, "OnThink");
}

public OnSpawn(ent)
{
    //Некоторые эффекты
    set_pev(ent, pev_rendermode, kRenderNormal);
    set_pev(ent, pev_renderfx, kRenderFxGlowShell);
    set_pev(ent, pev_renderamt, 4.0);
    set_pev(ent, pev_rendercolor, {255.0, 255.0, 255.0});
    
    
//Издаем звук появления
    emit_sound(ent, CHAN_BODY, g_szSndItemSpawn, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}

public OnPickup(ent, id)
{
    //Получаем здоровье игрока
    static Float:fHealth;
    pev(id, pev_health, fHealth);
    
    if 
(fHealth < MAX_HEALTH) {
        //Подобрано
        return PLUGIN_HANDLED;
    }

    //Не подобрано
    return PLUGIN_CONTINUE;
}

public OnPicked(ent, id)
{
    //Получаем здоровье игрока
    static Float:fHealth;
    pev(id, pev_health, fHealth);

    //Добавляем здоровье игроку
    fHealth += HEAL_AMOUNT;
    if (fHealth > MAX_HEALTH) {
        fHealth = MAX_HEALTH;
    } set_pev(id, pev_health, fHealth);

    //Издаем звук подбирания
    emit_sound(ent, CHAN_VOICE, g_szSndItemPickup, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}

public OnRemove(ent, bool:picked)
{
    if (!picked) {
        //Издаем звук исчезновения
        emit_sound(ent, CHAN_VOICE, g_szSndItemDisappeared, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    }
}

public OnThink(ent)
{
    //Проверяем ассоциацию энтитии с текущим плагином
    if (!CE_CheckAssociation(ent)) {
        return;
    }

    //Делаем что-то
}
 


Утверждено. //Leonidddd
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Hedgehog Fog 04 ноя 2016, 13:13, всего редактировалось 9 раз(а).
Аватара пользователя
Hedgehog Fog
 
Сообщения: 37
Зарегистрирован: 05 фев 2016, 18:15
Благодарил (а): 1 раз.
Поблагодарили: 48 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, С++, C#, JavaScript

Re: [API] Custom Entities

Сообщение Subb98 » 04 ноя 2016, 02:28

А где сам код?
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [API] Custom Entities

Сообщение Hedgehog Fog » 04 ноя 2016, 02:34

Subb98,
Шустрый ты. На месте все. :)
Аватара пользователя
Hedgehog Fog
 
Сообщения: 37
Зарегистрирован: 05 фев 2016, 18:15
Благодарил (а): 1 раз.
Поблагодарили: 48 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, С++, C#, JavaScript

Re: [API] Custom Entities

Сообщение Subb98 » 04 ноя 2016, 02:40

Hedgehog Fog, я верно понял, что данный инструмент умеет спавнить энтити в случайных позициях?
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [API] Custom Entities

Сообщение Hedgehog Fog » 04 ноя 2016, 02:43

Subb98,
Нет, он просто позволяет создавать пользовательские энтити и добавлять их на карту.
Так же представляет собой некий инсрумент для более удобной работы с возможность отлавливать события удаления и корректно очищать например созданные массивы, хэндлеры которых будут хранится например в iuser1.
По умолчанию движок не позволяет создавать энтитии с пользовательскими именами и не создает их при загрузки карты, в этом же случае API отлавливает обработку таких объектов и создает их копии, дабы после удаление энтитии движком на карте уже существовала валидная, со всеми прописными в ее начальной версии ключами.
Последний раз редактировалось Hedgehog Fog 04 ноя 2016, 02:46, всего редактировалось 2 раз(а).
Аватара пользователя
Hedgehog Fog
 
Сообщения: 37
Зарегистрирован: 05 фев 2016, 18:15
Благодарил (а): 1 раз.
Поблагодарили: 48 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, С++, C#, JavaScript

Re: [API] Custom Entities

Сообщение Subb98 » 04 ноя 2016, 02:45

Hedgehog Fog, жаль. Было бы здорово создать нормальный инструмент для поиска рандомных точек спауна. Те, что есть в сети, работают либо не корректно, либо ищут недостаточно интересные позиции.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [API] Custom Entities

Сообщение Hedgehog Fog » 04 ноя 2016, 02:47

Subb98,
Вроде кто-то делал такой инструмент, который специализировался на создание случайных точек для csdm.
Аватара пользователя
Hedgehog Fog
 
Сообщения: 37
Зарегистрирован: 05 фев 2016, 18:15
Благодарил (а): 1 раз.
Поблагодарили: 48 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, С++, C#, JavaScript

Re: [API] Custom Entities

Сообщение Subb98 » 04 ноя 2016, 02:49

Hedgehog Fog, делали двое: GHW_Chronic и joropito, у первого плагин крашит сервер, у второго цикл по умолчанию в 100000 итераций и позиции как по линейке. В общем, оба инструмента оставляют желать лучшего. Есть ещё в магазине Скальпеля от одного автора плагин, но он с закрытым кодом.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [API] Custom Entities

Сообщение Hedgehog Fog » 04 ноя 2016, 02:54

Subb98,
В Halloween Mod я нашел выход из этого положения.
Мод отслеживает позиции смерти игроков и в случае, если позиция достаточно далеко от спавна - записывает их в массив, далее данные из массива служат позициями для спавна в течении всей игры.
Аватара пользователя
Hedgehog Fog
 
Сообщения: 37
Зарегистрирован: 05 фев 2016, 18:15
Благодарил (а): 1 раз.
Поблагодарили: 48 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, С++, C#, JavaScript

Re: [API] Custom Entities

Сообщение Subb98 » 04 ноя 2016, 02:57

Hedgehog Fog, да, я использовал этот же метод для расстановки бонусов на карте. А вот как быть в случае разминки в начале раунда - это вопрос. Т.к. игрокам приходится бежать от спауна до спауна, а время разминки ограничено. В общем, актуальная тема. :-)
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

След.

Вернуться в Утвержденные плагины

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

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