Question about rg_remove_entity and SetThink/Touch

Сообщения
8
Реакции
0
Hi :3
I wanna just know, what's correct

When remove an entity, What's correct method:

C:
SetThink(entity, "") // Unset Think callback before remove entity.
SetTouch(entity, "")
rg_remove_entity(entity)
or remove that directly :

C:
rg_remove_entity(entity)
Thanks in advance 👍
 
Сообщения
53
Реакции
0
Помог
1 раз(а)
SetTouch
Purpose: The SetTouch function assigns a touch callback to an entity. This callback is triggered when another entity comes into contact with it.


rg_remove_entity
Purpose: This function is used to remove an entity from the game. It effectively deletes the specified entity, making it no longer part of the game world.
 
Сообщения
14
Реакции
2
Помог
1 раз(а)
I might be wrong, but as far as I know, deleting the entity via rg_remove_entity, removes the SetThink/Touch, so you dont have to do it beforehand.
 
Сообщения
723
Реакции
610
Предупреждения
8
Помог
13 раз(а)
Сообщения
1,367
Реакции
2,395
Помог
58 раз(а)
В большинстве случаев, достаточно rg_remove_entity()

Код:
#include amxmodx
#include fakemeta
#include reapi

public plugin_init() {
    register_srvcmd("MakeEnt", "srvcmd_MakeEnt")
}

public srvcmd_MakeEnt() {
    new pEnt = rg_create_entity("info_target")
    
    new iThink = get_ent_data(pEnt, "CBaseEntity", "m_pfnThink")
    new iTouch = get_ent_data(pEnt, "CBaseEntity", "m_pfnTouch")
    
    server_print("[1]: pEnt %i, m_pfnThink %i, m_pfnTouch %i", pEnt, iThink, iTouch)
    
    SetThink(pEnt, "OnThink")
    SetTouch(pEnt, "OnTouch")
    
    iThink = get_ent_data(pEnt, "CBaseEntity", "m_pfnThink")
    iTouch = get_ent_data(pEnt, "CBaseEntity", "m_pfnTouch")
    
    server_print("[1]: pEnt %i, m_pfnThink %i, m_pfnTouch %i", pEnt, iThink, iTouch)
    
    rg_remove_entity(pEnt)
    
    iThink = get_ent_data(pEnt, "CBaseEntity", "m_pfnThink")
    iTouch = get_ent_data(pEnt, "CBaseEntity", "m_pfnTouch")
    
    server_print("[2]: pEnt %i, m_pfnThink %i, m_pfnTouch %i", pEnt, iThink, iTouch)

    return PLUGIN_HANDLED
}

public OnThink(pEnt) { }
public OnTouch(pTouched, pToucher) { }

2025-04-27_18-24-18.png
 
Сообщения
1,711
Реакции
1,519
Помог
26 раз(а)
Удалять энтити через RemoveEntity не совсем небезопасно, так как если следующая в кадре энтити будет ссылаться на твою, то будет краш.
Альтернатива - FL_KILLME, удаляет энтити в конце кадра, но тут нюанс, что touch может блокировать удаление.

И как написал Vaqtincha rg_remove_entity удаляет безопасно, так как ставится FL_KILLME, и убирается солидность.
 

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

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