Взаимодействие entity с игроком

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Здравствуйте. Как мне реализовать событие получения удара по entity ножом?


Код:
new const ENTITY_CLASSNAME[] = "myent";

public EntityCreate(id)
{
    if(!is_user_connected(id))
    {
        return;
    }

    new iOrigin[3];

    #define TYPE_ORIGIN 3
    get_user_origin(id, iOrigin, TYPE_ORIGIN);
    IVecFVec(iOrigin, vecOrigin)
    
    new iEntity = rg_create_entity("info_target", false);

    if(is_nullent(iEntity))
    {
        return;
    }

    engfunc(EngFunc_SetModel, iEntity, ENTITY_MODEL);
    engfunc(EngFunc_SetSize, iEntity, {-0.1,-0.1, -1.0}, {0.1, 0.1, 64.0});
    set_entvar(iEntity, var_movetype, MOVETYPE_NONE);
    set_entvar(iEntity, var_classname, ENTITY_CLASSNAME);
    set_entvar(iEntity, var_solid, SOLID_BBOX);

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
    
}
Я регистрирую хук

RegisterHookChain(RG_CBasePlayer_TakeDamage, "@CPlayer_TakeDamage", .post = true);

Код:
@CPlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
// ???
}
this = iEntity ? При этом, вынеся iEntity, как глобальную переменную?! А если я создам еще один такой же объект, то в переменной будет храниться индекс второго объекта?

Что означает @ перед CPlayer_TakeDamage?

Код:
    if(is_nullent(iEntity))

    {

        return;

    }
Это проверка валидности entity на reapi?

Что-то вроде этого, но как на reapi сделать проверку, что удар был нанесен ножом?

Код:
@CPlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)

{

    this = iEntity;
    
    if(is_nullent(iEntity)) return;

client_print(pevAttacker, print_chat, "Вы попали по %d", this);

    // Немного не могу понять, как дальше... 
}
Как мне определить, что я нанес урон по 1 созданной entity или по 2 созданной entity и получил соответсвующее сообщение?
23 Июл 2020
Объявил iEntity глобальной переменной, при создании объекта вывожу ее индекс - они разные.

Функция получения урона не работает.

Код:
@CPlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
    new this = iEntity;
    
    client_print(pevAttacker, print_chat, "Entity: %d", this);
}
Из-за того, что мой объект не имеет класс func_breakable? Но мне не нужно устанавливать ему жизни.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Последнее редактирование:
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Код:
public CPlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
    new this = iEntity;
    new sClassname[32]
    get_entvar(this, var_classname, charsmax(sClassname));
    
    if(equal(sClassname, ENTITY_CLASSNAME)) {
        new iOwner = get_entvar(this, var_iuser1);
        
        if(pevAttacker != iOwner)
        {
            client_print(pevAttacker, print_chat, "Entity: %d owner: %d", this, iOwner);
        }
    }
}
Не выводит сообщение. Что я не так делаю?)
23 Июл 2020
twisterniq, спасибо, с @ понял)
Проверка на валидность is_entity должна каждый раз объявляться при работе с entity или только в определенных моментах? Если в определенных, то в каких?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Код:
const this
this = iEntity
Такое невозможно.

Не выводит сообщение. Что я не так делаю?)
1 параметр - id игрока которому наносится урон;
* Тут не может быть ID других энтити, так как этот хук учитывает только игроков;​
2 параметр - что наносит урон;
* ID аттакера или энтити -> граната;​
3 параметр - что/кто наносит урон;
* граната не может быть аттакером; но игроком что кинул её, если правильно помню;​
4 параметр - урон;
5 параметр - тип урона.

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

Проверка на валидность is_entity должна каждый раз объявляться при работе с entity или только в определенных моментах? Если в определенных, то в каких?
Когда требует того случай. После создания, она может быть невалидна, поэтому и делается проверка, таким образом не будет установки свойств и прочего. Если она уже создана и валидна тогда делается что угодно.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
twisterniq, id игрока?! А id игрока может быть entity в этой функции?
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
Никого не смущает часть "CBasePlayer" в названии хука?
RegisterHookChain(RG_CBasePlayer_TakeDamage, "@CPlayer_TakeDamage", .post = true);
Удар по func_breakable лови через Hamsandwich (Ham_TakeDamage) и класс "func_breakable".
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Ayk, у меня entity не имеет этого класса и мне не нужно ей добавлять это свойство.
CBasePlayer только для игроков что-ли?)
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
CBasePlayer только для игроков что-ли?)
"Да, нет, наверное" (с)
Название намекает.

у меня entity не имеет этого класса и мне не нужно ей добавлять это свойство.
Поставь класс своего энтити или измени класс энтити.
func_breakable может быть и неразрушимым, не обязательно ставить ему жизнь.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Ayk, удар по entity только через Ham можно отловить получается?))
23 Июл 2020
Как мне через reapi задать для entity func_breakable?))

iEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_breakable"))
23 Июл 2020
iEntity = rg_create_entity("info_target", false);
=>
iEntity = rg_create_entity("func_breakable", false);

???
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Код:
public plugint_init()
{
    RegisterHam(Ham_TakeDamage, "func_breakable", "HamTakeDamage_Post", true);
}

public HamTakeDamage_Post(iVictim, iWeapon, iAttacker, Float:fDamage, iBits)
{
    new sClassname[32]
    get_entvar(iVictim, var_classname, charsmax(sClassname));
    
    if(equal(sClassname, ENTITY_CLASSNAME)) {
            client_print(iAttacker, print_chat, "Entity: %d owner: %d", iEntity, iOwner);
    }
}
iEntity = rg_create_entity("func_breakable", false);

Все равно не выводит сообщение)
23 Июл 2020
get_entvar(iVictim, var_classname, charsmax(sClassname));
Пропустил)) =>
get_entvar(iVictim, var_classname, sClassname, charsmax(sClassname));

Сообщение все равно не выводит)))
 
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
CLUQA, предоставь полный код а не огрызки
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
@Ayk, удар по entity только через Ham можно отловить получается?))
Через ReAPI нельзя (если в этом суть вопроса).
Как мне через reapi задать для entity func_breakable?))
rg_create_entity("func_breakable", true);

Хам не делает хук для одной конкретной энтити. Поэтому, в хуке TakeDamage нужно будет фильтровать другие func_breakable энтити.
Для этого, обычно при создании энтити устанавливают "уникальный идентификатор" по которому можно будет определить нужную энтити (вместо сравнивания стринг класснейма сравнивать число (идентификатор)).
Идентификатор можно поместить например в var_impulse:
set_entvar(entity, var_impulse, 123456);

Так же для func_breakable нужно задать количество HP:
set_entvar(entity, var_health, 100.0);
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
steelzzz,
Код:
#include <amxmodx>
#include <fakemeta>
#include <reapi>
#include <hamsandwich>

new const PLUGIN_NAME[] = "[ReAPI] Ghost after death";
new const PLUGIN_VERSION[] = "0.0.2";

new const ENTITY_CLASSNAME[] = "myent123";
new const ENTITY_MODEL[] = "models/myent/model.mdl";

new iEntity

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "steelzzz");
    register_clcmd("say /create", "CreateEntity");

    RegisterHam(Ham_TakeDamage, "func_breakable", "HamTakeDamage_Post", true);
}

public HamTakeDamage_Post(iVictim, iWeapon, iAttacker, Float:fDamage, iBits)
{
    new sClassname[32]
    get_entvar(iVictim, var_classname, sClassname, charsmax(sClassname));

    if(equal(sClassname, ENTITY_CLASSNAME))
    {
        client_print(iAttacker, print_chat, "++++++++++");
    }
}

public plugin_precache()
{
    engfunc(EngFunc_PrecacheModel, ENTITY_MODEL);
}

public CreateEntity(id)
{
    if(!is_user_connected(id))
    {
        return;
    }

    new iOrigin[3];
    new Float: vecOrigin[3];
    
    #define TYPE_ORIGIN 3
    get_user_origin(id, iOrigin, TYPE_ORIGIN);
    
    IVecFVec(iOrigin, vecOrigin)

    
    iEntity = rg_create_entity("func_breakable", true);

    if(is_nullent(iEntity))
    {
        return;
    }

    engfunc(EngFunc_SetModel, iEntity, ENTITY_MODEL);
    engfunc(EngFunc_SetSize, iEntity, {-0.1,-0.1, -1.0}, {0.1, 0.1, 64.0});
    set_entvar(iEntity, var_movetype, MOVETYPE_NONE);
    set_entvar(iEntity, var_classname, ENTITY_CLASSNAME);
    set_entvar(iEntity, var_solid, SOLID_BBOX)
    
    set_entvar(iEntity, var_takedamage, 1.0)
    set_entvar(iEntity, var_health, 10.0);
    set_entvar(iEntity, var_impulse, 111222333)
    
    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
    
    client_print(0, print_chat, "Create EntId: %d", iEntity)
}
the_hunter,

rg_create_entity("func_breakable", true); Заменил
set_entvar(iEntity, var_health, 10.0); Выставил еще когда func_breakable поставил.

С этим немного не понял set_entvar(entity, var_impulse, 123456)

Я прописал подобную строку, а сравнить как - немного затрудняюсь, попробовал так, но не получилось и оставил equal

Код:
    new iKey = get_entvar(iEntity, var_impulse)
    
    if(iKey == 111222333) {

        client_print(iAttacker, print_chat, "++++++++++");
    }
23 Июл 2020
P.S. не получилось в плане, что сообщение мне все равно не выводит)
23 Июл 2020
UPDATE
В общем, сейчас в HamTakeDamage_Post

Код:
 new iKey = get_entvar(iEntity, var_impulse)
    
    if(iKey == 111222333) {

        client_print(iAttacker, print_chat, "++++++++++");
    }
Пострелял по entity раз 15 - она взорвалась и убила меня, и вывело сообщение)
Странно) В чем может быть трабл?)
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
CLUQA, проверил, код вышел работает. Во всяком случае, если заменить модельку на "models/w_ak47.mdl" Проверьте хитбоксы вашей модели.
И var_impulse в func_breakable задает ExplosionSetMagnitude нужно юзать что-то другое вместо этого. Например, var_iuser*
set var_user при создании энтити и get var_user в функции HamTakeDamage_Post
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, значит возвращаюсь к equal?

set_entvar(iEntity, var_iuser1, id)

Ham:

Код:
    new sClassname[32]
    get_entvar(iVictim, var_classname, sClassname, charsmax(sClassname));


    // ???
    
    new iOwner = get_entvar(iVictim, var_iuser1) ; xD
    
    if(equal(sClassname, ENTITY_CLASSNAME))
    {
        client_print(iAttacker, print_chat, "++++++++++");
    }
   
    }
Я не пойму, как мне с var_iuser реализовать)
Третьим аргументом array должен быть, как я понимаю, где можно хранить какие-то данные, но я даже не знаю, какие мне нужны))
Без аргумента у меня сервер лег хД
Я еще добавил проверку if(iAttacker != iOwner) //
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
CLUQA,
C++:
#include <amxmodx>
#include <fakemeta>
#include <reapi>
#include <hamsandwich>

new const PLUGIN_NAME[] = "[ReAPI] Ghost after death";
new const PLUGIN_VERSION[] = "0.0.2";

new const ENTITY_CLASSNAME[] = "myent123";
new const ENTITY_MODEL[] = "models/myent/model.mdl";


new iEntity
const ENTITY_ID = 123321;

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "steelzzz");
    register_clcmd("say /create", "CreateEntity");

    RegisterHam(Ham_TakeDamage, "func_breakable", "HamTakeDamage_Post", true);
}

public HamTakeDamage_Post(iVictim, iWeapon, iAttacker, Float:fDamage, iBits)
{
    if (!is_nullent(iVictim) && get_entvar(iVictim, var_iuser1) == ENTITY_ID)
    {
        client_print(iAttacker, print_chat, "++++++++++");
    }
}

public plugin_precache()
{
    engfunc(EngFunc_PrecacheModel, ENTITY_MODEL);
}

public CreateEntity(id)
{
    if(!is_user_connected(id))
    {
        return;
    }

    new iOrigin[3];
    new Float: vecOrigin[3];

    #define TYPE_ORIGIN 3
    get_user_origin(id, iOrigin, TYPE_ORIGIN);

    IVecFVec(iOrigin, vecOrigin)


    iEntity = rg_create_entity("func_breakable", true);

    if(is_nullent(iEntity))
    {
        return;
    }

    engfunc(EngFunc_SetModel, iEntity, ENTITY_MODEL);
    engfunc(EngFunc_SetSize, iEntity, {-0.1,-0.1, -1.0}, {0.1, 0.1, 64.0});
    set_entvar(iEntity, var_movetype, MOVETYPE_NONE);
    set_entvar(iEntity, var_classname, ENTITY_CLASSNAME);
    set_entvar(iEntity, var_solid, SOLID_BBOX)

    set_entvar(iEntity, var_takedamage, 1.0)
    set_entvar(iEntity, var_health, 10.0);
    set_entvar(iEntity, var_iuser1, ENTITY_ID);

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);

    client_print(0, print_chat, "Create EntId: %d", iEntity)
}
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
the_hunter, благодарю, теперь понял) Правда, спасибо за разъяснения)
И всем остальным)
 
Статус
В этой теме нельзя размещать новые ответы.

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

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