Способ добавления воды на карту Cs1.6 и не только. (BSP в BSP)

Сообщения
602
Реакции
121
Помог
10 раз(а)
@karaulov,не понял про модели. Я через bspguy добавляю модели на карты. Ну cycler_sprite, правда они "сквознопроходимые", но зато ошметков при стрельбе нет как при cycler. Мне в bspguy не хватает выбор нескольких энтити при зажатом ctrl))
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Всем привет, немного поигрался с тем что имеем, вот что вышло, добавил акулу в воду :))

Получился а-ля аквариум)) Прикольно было бы насоздавать разных рыбок, анимировать и пускать их так двигаться туда сюда, можете по экспериментировать, исходя из моей наработки) Еще можно что-бы рыбы могли атаковать игрока и тп.. (иначе просто плавать за игроком)



Принцип такой - ентити перемещается, и как только сталкивается с func_wall меняет свои координаты и скорость и перемещается уже в другую и обратно..
17 Мар 2021

Наработка + моделька:

Примечание: Акулу нужно создавать по команде в чат, когда игрок в воде. say shark!

C++:
#include <amxmodx>
#include <reapi>
#include <fakemeta_util>

new WaterEntity;

new const SHARK_MODEL[] = "models/shark/shark_new.mdl";
new SHARK_MODEL_INDEX;

new const BSP_RESOURCES[][] =
{
    "maps/water2.bsp",
    "maps/wall_new5.bsp",
    "maps/wall_new4.bsp",
    "maps/wall_new6.bsp"
};

new Float:vecTransformVelosity[2][3], bool:CheckShark[2], bool:CheckOrigin, SharkSpeed;

public plugin_precache()
{
    register_plugin("water_room_dd2", "1.0.0", "wellasgood");
    register_clcmd("say shark!", "@CreateShark");

    RegisterHookChain(RG_CSGameRules_CleanUpMap, "@CSGameRules_CleanUpMap_Post", true);

    new Float:Origin[3];

    precache_model(BSP_RESOURCES[0]);

    WaterEntity = fm_create_entity("func_water");

    fm_set_kvd(WaterEntity,"classname","func_water")
    fm_set_kvd(WaterEntity,"rendermode","2")
    fm_set_kvd(WaterEntity,"renderamt","130")
    fm_set_kvd(WaterEntity,"skin","-3")
    fm_set_kvd(WaterEntity,"WaveHeight","5")
    fm_entity_set_model(WaterEntity, BSP_RESOURCES[0]);
    fm_entity_set_origin(WaterEntity, Origin);
    fm_DispatchSpawn(WaterEntity);
    fm_drop_to_floor(WaterEntity);

    precache_model(BSP_RESOURCES[1]);

    new GlassEntities1 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities1,"classname","func_wall");
    fm_set_kvd(GlassEntities1,"rendermode","2");
    fm_set_kvd(GlassEntities1,"renderamt","100");
    fm_entity_set_model(GlassEntities1, BSP_RESOURCES[1]);
    fm_entity_set_origin(GlassEntities1, Origin);
    fm_DispatchSpawn(GlassEntities1);
    fm_drop_to_floor(GlassEntities1);

    precache_model(BSP_RESOURCES[2]);

    new GlassEntities2 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities2,"classname","func_wall");
    fm_set_kvd(GlassEntities2,"rendermode","2");
    fm_set_kvd(GlassEntities2,"renderamt","100");
    fm_entity_set_model(GlassEntities2, BSP_RESOURCES[2]);
    fm_entity_set_origin(GlassEntities2, Origin);
    fm_DispatchSpawn(GlassEntities2);
    fm_drop_to_floor(GlassEntities2);

    precache_model(BSP_RESOURCES[3]);

    new GlassEntities3 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities3,"classname","func_wall");
    fm_set_kvd(GlassEntities3,"rendermode","2");
    fm_set_kvd(GlassEntities3,"renderamt","100");
    fm_entity_set_model(GlassEntities3, BSP_RESOURCES[3]);
    fm_entity_set_origin(GlassEntities3, Origin);
    fm_DispatchSpawn(GlassEntities3);
    fm_drop_to_floor(GlassEntities3);

    SHARK_MODEL_INDEX = precache_model(SHARK_MODEL);
}

@CSGameRules_CleanUpMap_Post()
{
    CheckShark[0] = false;
    CheckShark[1] = false;
    CheckOrigin = false;
    SharkSpeed = 70;

    new ent = rg_find_ent_by_class(NULLENT, "ent_shark", false);

    while(ent > 0)
    {
        SetTouch(ent, "");
        SetThink(ent, "");

        set_entvar(ent, var_flags, FL_KILLME);
        set_entvar(ent, var_nextthink, get_gametime() + 0.01);

        ent = rg_find_ent_by_class(ent, "ent_shark", false);
    }
}

public plugin_init()
{
    register_clcmd("water+", "pWater");
    register_clcmd("water-", "mWater");

    SharkSpeed = 70;
}

public mWater(id)
{
    new Float:origin[3];
    pev(WaterEntity, pev_origin, origin);
    origin[2] -= 15.0;
    set_pev(WaterEntity, pev_origin, origin);
}

public pWater(id)
{
    new Float:origin[3];
    pev(WaterEntity, pev_origin, origin);
    origin[2] += 15.0;
    set_pev(WaterEntity, pev_origin, origin);
}

@CreateShark(id)
{
    new Entity = rg_create_entity("info_target");

    set_entvar(Entity, var_classname, "ent_shark");
    set_entvar(Entity, var_model, SHARK_MODEL);
    set_entvar(Entity, var_modelindex, SHARK_MODEL_INDEX);
    set_entvar(Entity, var_movetype, MOVETYPE_FLY);
    set_entvar(Entity, var_solid, SOLID_BBOX);

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);
    Origin[0] += 70.0;
    set_entvar(Entity, var_origin, Origin);

    set_entvar(Entity, var_framerate, 0.7);
    set_entvar(Entity, var_sequence, 0);
    set_entvar(Entity, var_animtime, get_gametime());

    CheckShark[0] = true;

    velocity_by_aim(Entity, SharkSpeed, vecTransformVelosity[0]);
    set_entvar(Entity, var_velocity, vecTransformVelosity[0]);

    SetTouch(Entity, "@SharkTouch");
    SetThink(Entity, "@SharkThink");
}

@SharkThink(Entity)
{
    if(is_nullent(Entity)) return;

    if(CheckShark[0]) set_entvar(Entity, var_velocity, vecTransformVelosity[0]);
    else if(CheckShark[1]) set_entvar(Entity, var_velocity, vecTransformVelosity[1]);
}

@SharkTouch(Entity, Other)
{
    if(is_nullent(Entity) || is_nullent(Other)) return;

    if(FClassnameIs(Other, "func_wall"))
    {
        CheckShark[0] = false;

        new Float:vecAngles[3];
        get_entvar(Entity, var_angles, vecAngles);

        vecAngles[1] -= 180.0;

        set_entvar(Entity, var_v_angle, vecAngles);
        set_entvar(Entity, var_angles, vecAngles);
        set_entvar(Entity, var_fixangle, 1);

        new Float:Origin[3];
        get_entvar(Entity, var_origin, Origin);

        if(!CheckOrigin) Origin[0] -= 170.0;
        else Origin[0] += 170.0;

        CheckOrigin = !CheckOrigin;

        set_entvar(Entity, var_origin, Origin);

        set_task(0.1, "@FixVel", Entity);
    }
}

@FixVel(Entity)
{
    if(is_nullent(Entity)) return;

    if(SharkSpeed > 140) SharkSpeed = 70;

    velocity_by_aim(Entity, SharkSpeed + 5, vecTransformVelosity[1]);
    set_entvar(Entity, var_velocity, vecTransformVelosity[1]);

    CheckShark[1] = true;
}

Скачать модельку можно тут: [1.0.0] Shark model
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
+ можно сделать так, что - бы поведение рыбы было не предсказуемым (перемещение в пределах аквариума), т.е, это означает, что запущенная туда рыба, будет сама РАНДОМНО перемещаться туда-сюда (не только вперед-назад, но и вообще в разные стороны). (как будет время реализую)
 
Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
wellasgood,
Скрытое содержимое могут видеть только пользователь группы: Web Dev, Администратор, Маппер, Моделлер, Модератор, Проверенный, Разработчик, Скриптер
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Pokemoshka, немного не то) без воды как минимум))) и эффект будто они в воздухе, а тут как-бы в воде. Хотя суть я уловил. Что такое уже делали)
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
И снова здравствуйте! Представляю другую наработку! :boast:

Что проделано:
  • Чуть уменьшен размер акулы (моделька);
  • сделана рандомная скорость акул между значениями;
  • сделана возможность создавать много акул (убраны SetTouch и SetThink, вместо них сделаны set_task);
  • сделано рандомное размещение акулы при создании по координате Z;
  • небольшой рефакторинг кода (поправлены маленькие косячки, некоторые моменты сделаны в пользу reapi, удалено не нужное).

Видео-обзор:



Исходный код:

C++:
#include <amxmodx>
#include <reapi>
#include <fakemeta_util>

const TASK_ACTION2 = 3592;

new const BSP_RESOURCES[][] =
{
    "maps/water2.bsp",
    "maps/wall_new5.bsp",
    "maps/wall_new4.bsp",
    "maps/wall_new6.bsp"
};

new const SHARK_MODEL[] = "models/shark/shark_new_v1.mdl";

new const SHARK_CLASSNAME[] = "ent_shark";

new WaterEntity, SHARK_MODEL_INDEX;

public plugin_precache()
{
    register_plugin("water_room_dd2", "1.0.0", "wellasgood");

    new Float:Origin[3];

    precache_model(BSP_RESOURCES[0]);

    WaterEntity = fm_create_entity("func_water");

    fm_set_kvd(WaterEntity,"classname","func_water")
    fm_set_kvd(WaterEntity,"rendermode","2")
    fm_set_kvd(WaterEntity,"renderamt","130")
    fm_set_kvd(WaterEntity,"skin","-3")
    fm_set_kvd(WaterEntity,"WaveHeight","5")
    fm_entity_set_model(WaterEntity, BSP_RESOURCES[0]);
    fm_entity_set_origin(WaterEntity, Origin);
    fm_DispatchSpawn(WaterEntity);
    fm_drop_to_floor(WaterEntity);

    precache_model(BSP_RESOURCES[1]);

    new GlassEntities1 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities1,"classname","func_wall");
    fm_set_kvd(GlassEntities1,"rendermode","2");
    fm_set_kvd(GlassEntities1,"renderamt","100");
    fm_entity_set_model(GlassEntities1, BSP_RESOURCES[1]);
    fm_entity_set_origin(GlassEntities1, Origin);
    fm_DispatchSpawn(GlassEntities1);
    fm_drop_to_floor(GlassEntities1);

    precache_model(BSP_RESOURCES[2]);

    new GlassEntities2 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities2,"classname","func_wall");
    fm_set_kvd(GlassEntities2,"rendermode","2");
    fm_set_kvd(GlassEntities2,"renderamt","100");
    fm_entity_set_model(GlassEntities2, BSP_RESOURCES[2]);
    fm_entity_set_origin(GlassEntities2, Origin);
    fm_DispatchSpawn(GlassEntities2);
    fm_drop_to_floor(GlassEntities2);

    precache_model(BSP_RESOURCES[3]);

    new GlassEntities3 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities3,"classname","func_wall");
    fm_set_kvd(GlassEntities3,"rendermode","2");
    fm_set_kvd(GlassEntities3,"renderamt","100");
    fm_entity_set_model(GlassEntities3, BSP_RESOURCES[3]);
    fm_entity_set_origin(GlassEntities3, Origin);
    fm_DispatchSpawn(GlassEntities3);
    fm_drop_to_floor(GlassEntities3);

    SHARK_MODEL_INDEX = precache_model(SHARK_MODEL);
}

public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_CleanUpMap, "@CleanUpMap_Post", true);

    register_clcmd("say shark!", "@CreateShark");

    register_clcmd("water+", "@pWater");
    register_clcmd("water-", "@mWater");
}

@CleanUpMap_Post()
{
    new ent = rg_find_ent_by_class(NULLENT, SHARK_CLASSNAME, false);

    while(ent > 0)
    {
        remove_task(ent);
        remove_task(ent + TASK_ACTION2);

        set_entvar(ent, var_flags, FL_KILLME);
        set_entvar(ent, var_nextthink, get_gametime() + 0.01);

        ent = rg_find_ent_by_class(ent, SHARK_CLASSNAME, false);
    }
}

@mWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] -= 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@pWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] += 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@CreateShark(id)
{
    new Entity = rg_create_entity("info_target", false);

    set_entvar(Entity, var_classname, SHARK_CLASSNAME);
    set_entvar(Entity, var_model, SHARK_MODEL);
    set_entvar(Entity, var_modelindex, SHARK_MODEL_INDEX);
    set_entvar(Entity, var_movetype, MOVETYPE_FLY);
    set_entvar(Entity, var_solid, SOLID_TRIGGER);

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);

    Origin[2] += random_float(0.0, 50.0);

    set_entvar(Entity, var_origin, Origin);

    set_entvar(Entity, var_framerate, 0.5);
    set_entvar(Entity, var_sequence, 0);
    set_entvar(Entity, var_animtime, get_gametime());

    new Float:vecTransformVelosity[3];
    velocity_by_aim(Entity, random_num(30, 60), vecTransformVelosity);
    set_entvar(Entity, var_velocity, vecTransformVelosity);

    new array[3];
    array[0] = floatround(vecTransformVelosity[0]);
    array[1] = floatround(vecTransformVelosity[1]);
    array[2] = floatround(vecTransformVelosity[2]);

    set_task(0.1, "@SharkAction2", Entity + TASK_ACTION2, array, sizeof array, "b");
    set_task(6.0, "@SharkAction", Entity, _, _, "b");
}

@SharkAction(Entity)
{
    if(is_nullent(Entity)) return;

    remove_task(Entity + TASK_ACTION2);

    new Float:vecAngles[3];
    get_entvar(Entity, var_angles, vecAngles);

    vecAngles[1] -= 180.0;

    set_entvar(Entity, var_v_angle, vecAngles);
    set_entvar(Entity, var_angles, vecAngles);
    set_entvar(Entity, var_fixangle, 1);

    new Float:vecTransformVelosity[3];
    velocity_by_aim(Entity, random_num(30, 60), vecTransformVelosity);
    set_entvar(Entity, var_velocity, vecTransformVelosity);

    new array[3];
    array[0] = floatround(vecTransformVelosity[0]);
    array[1] = floatround(vecTransformVelosity[1]);
    array[2] = floatround(vecTransformVelosity[2]);

    set_task(0.1, "@SharkAction2", Entity + TASK_ACTION2, array, sizeof array, "b");
}

@SharkAction2(array[], Entity)
{
    Entity -= TASK_ACTION2;

    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];
    vecTransformVelosity[0] = float(array[0]);
    vecTransformVelosity[1] = float(array[1]);
    vecTransformVelosity[2] = float(array[2]);

    set_entvar(Entity, var_velocity, vecTransformVelosity);
}

Пояснение моментов:

set_task(6.0, "@SharkAction", Entity, _, _, "b"); - время выполнения задачи '6.0' сделано с учётом примерный скорости акул, если хотите быстрее и тп, то нужно учитывать скорость передвижения и тогда менять это время.

velocity_by_aim(Entity, random_num(30, 60) - вместо рандомной скорости можно ставить просто целое значение, необходимо поменять везде, где это есть по коду. Это как раз скорость передвижения акулы. Учитывая эту скорость, нужно менять время для задачи 'SharkAction'.

Origin[2] += random_float(0.0, 50.0); - здесь устанавливается рандомное значение по координате Z (размещение акулы при создании), также можно указать и просто дробное значение, иначе уменьшить или увеличить в рандом режиме. (Учитывая землю и потолок карты, что-бы акула была в зоне видимости игрока).

Особенность данного способа в том, что нужно с точностью указывать настройки, для корректного функционирования (например, что-бы акулы не уплывали за пределы аквариума и тп)
 

Вложения

Последнее редактирование:
Сообщения
192
Реакции
148
Помог
1 раз(а)
  • сделана возможность создавать много акул (убраны SetTouch и SetThink, вместо них сделаны set_task);

Особенность данного способа в том, что нужно с точностью указывать настройки, для корректного функционирования (например, что-бы акулы не уплывали за пределы аквариума и тп)
земля пухом
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Ruby, с чего бы? Обоснуй.
18 Мар 2021
Я же не от балды юзаю в наработке set_task, просто того требует данная реализация.

Хотя. Мб можно обыграть хотя бы с SetThink 'ом
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
И так:

1. Вместо set_task (исполняющий обязанности SetThink) сделан SetThink
2. Выведены нужные настройки в define.
3. Изменена версия на 'test', так как, идет тестирование..
4. Сделана отдельная функция обработчик (задать направление и ускорение акулы), дабы избежать повторяющегося кода.

Исходный код:

C++:
#include <amxmodx>
#include <reapi>
#include <fakemeta_util>


// НАСТРОЙКИ (начало)

// Внимание! TASK_TIME должен быть с учетом SPEED_MODE (т.е если увеличиваем или уменьшаем скорость акулы, то и правим время)

//Интервал времени выполнения задачи для изменения направления движения акулы.
#define TASK_TIME 6.0

//Режимы скорости (1-радном [выбор между значениями], 2 (или другое кроме 1) - просто значние скорости)
#define SPEED_MODE 1

#if SPEED_MODE == 1
#define SHARK_SPEED_MIN 30
#define SHARK_SPEED_MAX 70
#else
#define SHARK_SPEED 70
#endif

//Размещение акул в рандом режиме при создании (по координате Z)
#define RANDOM_FLOAT_MIN 5.0
#define RANDOM_FLOAT_MAX 70.0

//Частота кадров анимации акулы (скорость анимации)
#define FRAME_RATE 0.6

// НАСТРОЙКИ (конец)


new const BSP_RESOURCES[][] =
{
    "maps/water2.bsp",
    "maps/wall_new5.bsp",
    "maps/wall_new4.bsp",
    "maps/wall_new6.bsp"
};

new const SHARK_MODEL[] = "models/shark/shark_new_v1.mdl";

new const SHARK_CLASSNAME[] = "ent_shark";

new WaterEntity, SHARK_MODEL_INDEX;

public plugin_precache()
{
    register_plugin("water_room_dd2", "test", "wellasgood");

    new Float:Origin[3];

    precache_model(BSP_RESOURCES[0]);

    WaterEntity = fm_create_entity("func_water");

    fm_set_kvd(WaterEntity,"classname","func_water")
    fm_set_kvd(WaterEntity,"rendermode","2")
    fm_set_kvd(WaterEntity,"renderamt","130")
    fm_set_kvd(WaterEntity,"skin","-3")
    fm_set_kvd(WaterEntity,"WaveHeight","5")
    fm_entity_set_model(WaterEntity, BSP_RESOURCES[0]);
    fm_entity_set_origin(WaterEntity, Origin);
    fm_DispatchSpawn(WaterEntity);
    fm_drop_to_floor(WaterEntity);

    precache_model(BSP_RESOURCES[1]);

    new GlassEntities1 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities1,"classname","func_wall");
    fm_set_kvd(GlassEntities1,"rendermode","2");
    fm_set_kvd(GlassEntities1,"renderamt","100");
    fm_entity_set_model(GlassEntities1, BSP_RESOURCES[1]);
    fm_entity_set_origin(GlassEntities1, Origin);
    fm_DispatchSpawn(GlassEntities1);
    fm_drop_to_floor(GlassEntities1);

    precache_model(BSP_RESOURCES[2]);

    new GlassEntities2 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities2,"classname","func_wall");
    fm_set_kvd(GlassEntities2,"rendermode","2");
    fm_set_kvd(GlassEntities2,"renderamt","100");
    fm_entity_set_model(GlassEntities2, BSP_RESOURCES[2]);
    fm_entity_set_origin(GlassEntities2, Origin);
    fm_DispatchSpawn(GlassEntities2);
    fm_drop_to_floor(GlassEntities2);

    precache_model(BSP_RESOURCES[3]);

    new GlassEntities3 = fm_create_entity("func_wall");

    fm_set_kvd(GlassEntities3,"classname","func_wall");
    fm_set_kvd(GlassEntities3,"rendermode","2");
    fm_set_kvd(GlassEntities3,"renderamt","100");
    fm_entity_set_model(GlassEntities3, BSP_RESOURCES[3]);
    fm_entity_set_origin(GlassEntities3, Origin);
    fm_DispatchSpawn(GlassEntities3);
    fm_drop_to_floor(GlassEntities3);

    SHARK_MODEL_INDEX = precache_model(SHARK_MODEL);
}

public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_CleanUpMap, "@CleanUpMap_Post", true);

    register_clcmd("say shark!", "@CreateShark");

    register_clcmd("water+", "@pWater");
    register_clcmd("water-", "@mWater");
}

@CleanUpMap_Post()
{
    new ent = rg_find_ent_by_class(NULLENT, SHARK_CLASSNAME, false);

    while(ent > 0)
    {
        remove_task(ent);
        SetThink(ent, "");

        set_entvar(ent, var_flags, FL_KILLME);
        set_entvar(ent, var_nextthink, get_gametime() + 0.01);

        ent = rg_find_ent_by_class(ent, SHARK_CLASSNAME, false);
    }
}

@mWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] -= 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@pWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] += 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@CreateShark(id)
{
    new Entity = rg_create_entity("info_target", false);

    set_entvar(Entity, var_classname, SHARK_CLASSNAME);
    set_entvar(Entity, var_model, SHARK_MODEL);
    set_entvar(Entity, var_modelindex, SHARK_MODEL_INDEX);
    set_entvar(Entity, var_movetype, MOVETYPE_FLY);
    set_entvar(Entity, var_solid, SOLID_TRIGGER);

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);

    Origin[2] += random_float(RANDOM_FLOAT_MIN, RANDOM_FLOAT_MAX);

    set_entvar(Entity, var_origin, Origin);

    set_entvar(Entity, var_framerate, FRAME_RATE);
    set_entvar(Entity, var_sequence, 0);
    set_entvar(Entity, var_animtime, get_gametime());

    set_task(TASK_TIME, "@SharkAction", Entity, _, _, "b");

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkAction(Entity)
{
    if(is_nullent(Entity)) return;

    SetThink(Entity, "");

    new Float:vecAngles[3];
    get_entvar(Entity, var_angles, vecAngles);

    vecAngles[1] -= 180.0;

    set_entvar(Entity, var_v_angle, vecAngles);
    set_entvar(Entity, var_angles, vecAngles);
    set_entvar(Entity, var_fixangle, 1);

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkThink(array[], Entity)
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];
    vecTransformVelosity[0] = float(array[0]);
    vecTransformVelosity[1] = float(array[1]);
    vecTransformVelosity[2] = float(array[2]);

    set_entvar(Entity, var_velocity, vecTransformVelosity);
}

VelocityHandler(Entity, save_array[])
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];

    #if SPEED_MODE == 1
    velocity_by_aim(Entity, random_num(SHARK_SPEED_MIN, SHARK_SPEED_MAX), vecTransformVelosity);
    #else
    velocity_by_aim(Entity, SHARK_SPEED, vecTransformVelosity);
    #endif

    set_entvar(Entity, var_velocity, vecTransformVelosity);

    save_array[0] = floatround(vecTransformVelosity[0]);
    save_array[1] = floatround(vecTransformVelosity[1]);
    save_array[2] = floatround(vecTransformVelosity[2]);
}

UPD:

Сделана модель акулы еще меньше. (кто хочет с этой моделькой, ищем и меняем в коде на: new const SHARK_MODEL[] = "models/shark/small_shark.mdl";

Видео-обзор -_- :)

 

Вложения

Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
UPD:

Убран лишний хард-код.

C++:
#include <amxmodx>
#include <reapi>
#include <fakemeta_util>


// НАСТРОЙКИ (начало)

// Внимание! TASK_TIME должен быть с учетом SPEED_MODE (т.е если увеличиваем или уменьшаем скорость акулы, то и правим время)

//Интервал времени выполнения задачи для изменения направления движения акулы.
#define TASK_TIME 6.0

//Режимы скорости (1-радном [выбор между значениями], 2 (или другое кроме 1) - просто значние скорости)
#define SPEED_MODE 1

#if SPEED_MODE == 1
#define SHARK_SPEED_MIN 30
#define SHARK_SPEED_MAX 70
#else
#define SHARK_SPEED 70
#endif

//Размещение акул в рандом режиме при создании (по координате Z)
#define RANDOM_FLOAT_MIN 5.0
#define RANDOM_FLOAT_MAX 70.0

//Частота кадров анимации акулы (скорость анимации)
#define FRAME_RATE 0.6

// НАСТРОЙКИ (конец)


new const BSP_RESOURCES[][] =
{
    "maps/water2.bsp",
    "maps/wall_new5.bsp",
    "maps/wall_new4.bsp",
    "maps/wall_new6.bsp"
};

new const SHARK_MODEL[] = "models/shark/shark_new_v1.mdl";

new const SHARK_CLASSNAME[] = "ent_shark";

new WaterEntity, SHARK_MODEL_INDEX;

public plugin_precache()
{
    register_plugin("water_room_dd2", "test", "wellasgood");

    new GlassEnt[3];

    ResourcesHandler(0, WaterEntity);
    ResourcesHandler(1, GlassEnt[0]);
    ResourcesHandler(2, GlassEnt[1]);
    ResourcesHandler(3, GlassEnt[2]);

    SHARK_MODEL_INDEX = precache_model(SHARK_MODEL);
}

public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_CleanUpMap, "@CleanUpMap_Post", true);

    register_clcmd("say shark!", "@CreateShark");

    register_clcmd("water+", "@pWater");
    register_clcmd("water-", "@mWater");
}

@CleanUpMap_Post()
{
    new ent = rg_find_ent_by_class(NULLENT, SHARK_CLASSNAME, false);

    while(ent > 0)
    {
        remove_task(ent);
        SetThink(ent, "");

        set_entvar(ent, var_flags, FL_KILLME);
        set_entvar(ent, var_nextthink, get_gametime() + 0.01);

        ent = rg_find_ent_by_class(ent, SHARK_CLASSNAME, false);
    }
}

@mWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] -= 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@pWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] += 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@CreateShark(id)
{
    new Entity = rg_create_entity("info_target", false);

    set_entvar(Entity, var_classname, SHARK_CLASSNAME);
    set_entvar(Entity, var_model, SHARK_MODEL);
    set_entvar(Entity, var_modelindex, SHARK_MODEL_INDEX);
    set_entvar(Entity, var_movetype, MOVETYPE_FLY);
    set_entvar(Entity, var_solid, SOLID_TRIGGER);

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);

    Origin[2] += random_float(RANDOM_FLOAT_MIN, RANDOM_FLOAT_MAX);

    set_entvar(Entity, var_origin, Origin);

    set_entvar(Entity, var_framerate, FRAME_RATE);
    set_entvar(Entity, var_sequence, 0);
    set_entvar(Entity, var_animtime, get_gametime());

    set_task(TASK_TIME, "@SharkAction", Entity, _, _, "b");

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkAction(Entity)
{
    if(is_nullent(Entity)) return;

    SetThink(Entity, "");

    new Float:vecAngles[3];
    get_entvar(Entity, var_angles, vecAngles);

    vecAngles[1] -= 180.0;

    set_entvar(Entity, var_v_angle, vecAngles);
    set_entvar(Entity, var_angles, vecAngles);
    set_entvar(Entity, var_fixangle, 1);

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkThink(array[], Entity)
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];
    vecTransformVelosity[0] = float(array[0]);
    vecTransformVelosity[1] = float(array[1]);
    vecTransformVelosity[2] = float(array[2]);

    set_entvar(Entity, var_velocity, vecTransformVelosity);
}

VelocityHandler(Entity, save_array[])
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];

    #if SPEED_MODE == 1
    velocity_by_aim(Entity, random_num(SHARK_SPEED_MIN, SHARK_SPEED_MAX), vecTransformVelosity);
    #else
    velocity_by_aim(Entity, SHARK_SPEED, vecTransformVelosity);
    #endif

    set_entvar(Entity, var_velocity, vecTransformVelosity);

    save_array[0] = floatround(vecTransformVelosity[0]);
    save_array[1] = floatround(vecTransformVelosity[1]);
    save_array[2] = floatround(vecTransformVelosity[2]);
}

ResourcesHandler(value, ent)
{
    new Float:Origin[3];

    precache_model(BSP_RESOURCES[value]);

    ent = fm_create_entity(value == 0 ? "func_water" : "func_wall");

    fm_set_kvd(ent, "classname", value == 0 ? "func_water" : "func_wall");
    fm_set_kvd(ent, "rendermode", "2");
    fm_set_kvd(ent, "renderamt", value == 0 ? "130" : "100");

    if(value == 0)
    {
        fm_set_kvd(ent, "skin", "-3");
        fm_set_kvd(ent, "WaveHeight", "5");
    }

    fm_entity_set_model(ent, BSP_RESOURCES[value]);
    fm_entity_set_origin(ent, Origin);
    fm_DispatchSpawn(ent);
    fm_drop_to_floor(ent);
}
18 Мар 2021
Внимание! Не рекомендуется создавать очень много рыб! Будет очень сильная просадка FPS.

Видео-обзор поведения при большом количестве рыб в аквариуме:



:crazy::crazy::dntknw:
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Кому интересно, хотел бы представить новую версию! Генерирую идеи на ходу! :thank_you:
  • Сделан рандом размер рыбок при создании. (большой, средний, маленький)

Исходный код + видео-обзор + модельки:

C++:
#include <amxmodx>
#include <reapi>
#include <fakemeta_util>


// НАСТРОЙКИ (начало)

// Внимание! TASK_TIME должен быть с учетом SPEED_MODE (т.е если увеличиваем или уменьшаем скорость акулы, то и правим время)

//Интервал времени выполнения задачи для изменения направления движения акулы.
#define TASK_TIME 6.0

//Режимы скорости (1-радном [выбор между значениями], 2 (или другое кроме 1) - просто значние скорости)
#define SPEED_MODE 1

#if SPEED_MODE == 1
#define SHARK_SPEED_MIN 30
#define SHARK_SPEED_MAX 70
#else
#define SHARK_SPEED 70
#endif

//Размещение акул в рандом режиме при создании (по координате Z)
#define RANDOM_FLOAT_MIN 5.0
#define RANDOM_FLOAT_MAX 70.0

//Частота кадров анимации акулы (скорость анимации)
#define FRAME_RATE 0.6

// НАСТРОЙКИ (конец)


new const BSP_RESOURCES[][] =
{
    "maps/water2.bsp",
    "maps/wall_new5.bsp",
    "maps/wall_new4.bsp",
    "maps/wall_new6.bsp"
};

new const SHARK_MODELS[][] =
{
    "models/shark/shark_new.mdl",
    "models/shark/shark_new_v1.mdl",
    "models/shark/small_shark.mdl"
};

new const SHARK_CLASSNAME[] = "ent_shark";

new WaterEntity, SHARK_MODEL_INDEX[3];

public plugin_precache()
{
    register_plugin("water_room_dd2", "test", "wellasgood");

    new GlassEnt[3];

    ResourcesHandler(0, WaterEntity);
    ResourcesHandler(1, GlassEnt[0]);
    ResourcesHandler(2, GlassEnt[1]);
    ResourcesHandler(3, GlassEnt[2]);

    SHARK_MODEL_INDEX[0] = precache_model(SHARK_MODELS[0]);
    SHARK_MODEL_INDEX[1] = precache_model(SHARK_MODELS[1]);
    SHARK_MODEL_INDEX[2] = precache_model(SHARK_MODELS[2]);
}

public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_CleanUpMap, "@CleanUpMap_Post", true);

    register_clcmd("say shark!", "@CreateShark");

    register_clcmd("water+", "@pWater");
    register_clcmd("water-", "@mWater");
}

@CleanUpMap_Post()
{
    new ent = rg_find_ent_by_class(NULLENT, SHARK_CLASSNAME, false);

    while(ent > 0)
    {
        remove_task(ent);
        SetThink(ent, "");

        set_entvar(ent, var_flags, FL_KILLME);
        set_entvar(ent, var_nextthink, get_gametime() + 0.01);

        ent = rg_find_ent_by_class(ent, SHARK_CLASSNAME, false);
    }
}

@mWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] -= 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@pWater(id)
{
    new Float:origin[3];
    get_entvar(WaterEntity, var_origin, origin);
    origin[2] += 15.0;
    set_entvar(WaterEntity, var_origin, origin);
}

@CreateShark(id)
{
    new Entity = rg_create_entity("info_target", false);

    set_entvar(Entity, var_classname, SHARK_CLASSNAME);

    new rnd_num = random_num(0, 2);

    set_entvar(Entity, var_model, SHARK_MODELS[rnd_num]);
    set_entvar(Entity, var_modelindex, SHARK_MODEL_INDEX[rnd_num]);

    set_entvar(Entity, var_movetype, MOVETYPE_FLY);
    set_entvar(Entity, var_solid, SOLID_TRIGGER);

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);

    Origin[2] += random_float(RANDOM_FLOAT_MIN, RANDOM_FLOAT_MAX);

    set_entvar(Entity, var_origin, Origin);

    set_entvar(Entity, var_framerate, FRAME_RATE);
    set_entvar(Entity, var_sequence, 0);
    set_entvar(Entity, var_animtime, get_gametime());

    set_task(TASK_TIME, "@SharkAction", Entity, _, _, "b");

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkAction(Entity)
{
    if(is_nullent(Entity)) return;

    SetThink(Entity, "");

    new Float:vecAngles[3];
    get_entvar(Entity, var_angles, vecAngles);

    vecAngles[1] -= 180.0;

    set_entvar(Entity, var_v_angle, vecAngles);
    set_entvar(Entity, var_angles, vecAngles);
    set_entvar(Entity, var_fixangle, 1);

    new save_array[3];
    VelocityHandler(Entity, save_array);

    SetThink(Entity, "@SharkThink", save_array, sizeof save_array);
}

@SharkThink(array[], Entity)
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];
    vecTransformVelosity[0] = float(array[0]);
    vecTransformVelosity[1] = float(array[1]);
    vecTransformVelosity[2] = float(array[2]);

    set_entvar(Entity, var_velocity, vecTransformVelosity);
}

VelocityHandler(Entity, save_array[])
{
    if(is_nullent(Entity)) return;

    new Float:vecTransformVelosity[3];

    #if SPEED_MODE == 1
    velocity_by_aim(Entity, random_num(SHARK_SPEED_MIN, SHARK_SPEED_MAX), vecTransformVelosity);
    #else
    velocity_by_aim(Entity, SHARK_SPEED, vecTransformVelosity);
    #endif

    set_entvar(Entity, var_velocity, vecTransformVelosity);

    save_array[0] = floatround(vecTransformVelosity[0]);
    save_array[1] = floatround(vecTransformVelosity[1]);
    save_array[2] = floatround(vecTransformVelosity[2]);
}

ResourcesHandler(value, ent)
{
    new Float:Origin[3];

    precache_model(BSP_RESOURCES[value]);

    ent = fm_create_entity(value == 0 ? "func_water" : "func_wall");

    fm_set_kvd(ent, "classname", value == 0 ? "func_water" : "func_wall");
    fm_set_kvd(ent, "rendermode", "2");
    fm_set_kvd(ent, "renderamt", value == 0 ? "130" : "100");

    if(value == 0)
    {
        fm_set_kvd(ent, "skin", "-3");
        fm_set_kvd(ent, "WaveHeight", "5");
    }

    fm_entity_set_model(ent, BSP_RESOURCES[value]);
    fm_entity_set_origin(ent, Origin);
    fm_DispatchSpawn(ent);
    fm_drop_to_floor(ent);
}

 

Вложения

Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
wellasgood, ты не видишь что у тебя рыбы за аквариум уплывают? + с некоторых сторон твою воду не видно
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Pokemoshka, просто нужно настроить настройки. Поставить другие значения и не будут уплывать за пределы. В предоставленных мной видео, настройки стоят просто такие. Ну и в исходнике я вывел эти настройки.

C++:
// Внимание! TASK_TIME должен быть с учетом SPEED_MODE (т.е если увеличиваем или уменьшаем скорость акулы, то и правим время)

//Интервал времени выполнения задачи для изменения направления движения акулы.
#define TASK_TIME 6.0

//Режимы скорости (1-радном [выбор между значениями], 2 (или другое кроме 1) - просто значние скорости)
#define SPEED_MODE 1

#if SPEED_MODE == 1
#define SHARK_SPEED_MIN 30
#define SHARK_SPEED_MAX 70
#else
#define SHARK_SPEED 70
#endif
Что-бы не уплывали, в данном случае, нужно уменьшить скорость или же уменьшить время поворота акулы на 180, короче нужно с точностью настроить. Под нужды.

А также, влияет откуда запущена акула, запускать над по центру или чуть дальше...
 
Последнее редактирование:
Сообщения
2,291
Реакции
1,737
Помог
31 раз(а)
Н
Pokemoshka, просто нужно настроить настройки. Поставить другие значения и не будут уплывать за пределы. В предоставленных мной видео, настройки стоят просто такие. Ну и в исходнике я вывел эти настройки.

C++:
// Внимание! TASK_TIME должен быть с учетом SPEED_MODE (т.е если увеличиваем или уменьшаем скорость акулы, то и правим время)

//Интервал времени выполнения задачи для изменения направления движения акулы.
#define TASK_TIME 6.0

//Режимы скорости (1-радном [выбор между значениями], 2 (или другое кроме 1) - просто значние скорости)
#define SPEED_MODE 1

#if SPEED_MODE == 1
#define SHARK_SPEED_MIN 30
#define SHARK_SPEED_MAX 70
#else
#define SHARK_SPEED 70
#endif
Что-бы не уплывали, в данном случае, нужно уменьшить скорость или же уменьшить время поворота акулы на 180, короче нужно с точностью настроить. Под нужды.

А также, влияет откуда запущена акула, запускать над по центру или чуть дальше...
Вот и настрой нормально, что б видно было качественную реализацию, а не вот это вот
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Pokemoshka, для каждого свои настройки. Я настроил как мне было нужно. (немного не валидно)

В любом случае, это всего лишь наработка..

Позже посмотрю еще что можно сделать..
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Обнаружил интересную вещь.

Можно загрузить одну BSP, и создавать с её помощью клоны сущностей.

Т.е допустим, есть стена func_wall, в прекеш идет только эта одна сущность, далее мы создаём ентити и вешаем им нашу сущность, получается, что с помощью одной BSP, можно создать разные ентити с этой сущностью.

Однако, при перемещении этих сущностей, бывает так, что какая-то из всех, теряет свои свойства и становится просто проходимой сквозь (а должна быть ощутимой стеной)

+ почему-то перемещение angles не делается должным образом.. хотел перемещать стены по оси Y, т.е менять углы и тп, в итоге такие тесты провалились, сущность просто уходит очень далеко что-бы развернуться.. что странное поведение (обычно когда крутишь модель, она не меняет место-положение, а крутиться на месте)

Перемещение Origin вроде работает хорошо.
 
Последнее редактирование:
Сообщения
192
Реакции
148
Помог
1 раз(а)
Чем вариант акулы с тачем не устроил?
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Ruby, можно и тачем, но, сет_таском, можно настроить когда именно разворачиваться рыбе (без тача), т.е это может быть через 2 сек и тп, в идеале сделать возможность задавать каждой созданной акулы время разворота и ускорения последующего.. ну и тп

С сет таском есть возможность настроить это дело.. без соприкосновения.
 

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

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