pev_groupinfo двум объектам

Сообщения
673
Реакции
242
Помог
11 раз(а)
Неверный раздел форума. Перенесено
Добрый день!
Не получается выдать двум объектам два разным pev_groupinfo

Есть Энтити-объект, выставляю так (если правильно)

Код:
#define MaskEnt(%0)    ( 1<<(%0 & 31) )

public SolidON(pId)
{
    set_entvar(pId, var_groupinfo, MaskEnt(1));

}
public SolilOFF(pId)
{
    set_entvar(pId, var_groupinfo, MaskEnt(2));
}

public test(id)
{
    g_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
    
    if (!pev_valid(g_ent)) return
    
    set_pev(g_ent, pev_classname, "BM_Block")
    set_pev(g_ent, pev_solid, SOLID_BBOX)
    
    engfunc(EngFunc_SetModel, g_ent, "models/Ancestral-Games/Bhop.mdl")
    engfunc(EngFunc_SetSize, g_ent, Float:{-32.0, -32.0, -4.0}, Float:{ 32.0, 32.0, 4.0 })
    
    new Float:fOrigin[3]; pev(id, pev_origin, fOrigin)
    fOrigin[1] -= 60.0
    
    engfunc(EngFunc_SetOrigin, g_ent, fOrigin)
    
    set_pev(g_ent, pev_groupinfo, MaskEnt(1))
}
тут все гуд, я могу переключить и не видеть объекта для себя

но тут встает второй вопрос косательно игрока

Выставляю ему
Код:
enum _:(+= 1)

{
    SOLID_NONE = 255,
    GHOST_ON
}


public PlayerSolidON(pId)
{
    set_entvar(pId, var_groupinfo, GHOST_ON);
}
public PlayerSolidOFF(pId)
{
    set_entvar(pId, var_groupinfo, GHOST_NONE);
}
игрок также становится не видимым, но при этом срабатывается и на энтити-объект
другими словами одна команда срабатывает на две pev_groupinfo
Вопрос такой, как можно выставить два разных set_groupinfo, чтобы они были не зависимы друг от друга?
23 Апр 2019
из инклуда
Код:
/*
    * Description:      -
    * Member type:      int
    * Get params:       get_entvar(index, EntVars:var);
    * Set params:       set_entvar(index, EntVars:var, value);
    */
    var_groupinfo,
чему равен value?
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
Value равен битсумме
т.е.
Если у игрока и у объекта при сравнивании битсумм присутствуют конкретно заданные биты, тогда для игрока отрисуется данный объект.
Код:
if (get_entvar(id, var_groupinfo) & MaskEnt(1) == get_entvar(iEnt, var_groupinfo) & MaskEnt(1))
Насчет коллизии - ничего не скажу, потому что не знаю

пример
Код:
#define MaskEnt(%0)    ( 1<<(%0 & 31) ) // для отображения отдельным игрокам
#define MaskEnt2(%0)    ( 1<<((%0+33) & 31)) // доп значения для отображения игрокам с конкретными масками

public fw_PlayerSpawn_Post(id)
{
   set_entvar(id, var_groupinfo, MaskEnt(id) | MaskEnt(0)); // Маска для игрока с индексом == id && Маска с глобальным значением == 0, 
                                                                                             // т.е. то самое значение по дефолту pev_groupinfo == 0;
                                                                                             // В моем случае получалось так, что если не задавать данное значение, игрок не видит
                                                                                             // другие объекты, если я не прав - поправьте
}

public SolidON(pId) // для игрока
{
    set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) | MaskEnt2(1)); // Допустим для какой-то конкретной группы игроков с флагом 1 + 33
}

public test(id)
{
g_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))

if (!pev_valid(g_ent)) return

set_pev(g_ent, pev_classname, "BM_Block")
set_pev(g_ent, pev_solid, SOLID_BBOX)

engfunc(EngFunc_SetModel, g_ent, "models/Ancestral-Games/Bhop.mdl")
engfunc(EngFunc_SetSize, g_ent, Float:{-32.0, -32.0, -4.0}, Float:{ 32.0, 32.0, 4.0 })

new Float:fOrigin[3]; pev(id, pev_origin, fOrigin)
fOrigin[1] -= 60.0

engfunc(EngFunc_SetOrigin, g_ent, fOrigin)

set_entvar(g_ent, var_groupinfo, MaskEnt(id)) // для конкретного игрока с index'ом == id
//set_entvar(g_ent, var_groupinfo, MaskEnt2(1)) // для группы игроков с маской 1 + 33
}
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
BalbuR, спасибо,вроде заработало

Для Энтити- объекта
Код:
#define MaskEnt2(%0)   ( 1<<((%0+33) & 31))

register_clcmd("say /solidon", "SolidON");
register_clcmd("say /solidoff", "SolidOFF");

public SolidON(pId)
{
    set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) | MaskEnt2(1));

}
public SolilOFF(pId)
{
    set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) & ~MaskEnt2(1));
}

public test(id)
{
    g_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
    
    if (!pev_valid(g_ent)) return
    
    set_pev(g_ent, pev_classname, "BM_Block")
    set_pev(g_ent, pev_solid, SOLID_BBOX)
    
    engfunc(EngFunc_SetModel, g_ent, "models/Ancestral-Games/Bhop.mdl")
    engfunc(EngFunc_SetSize, g_ent, Float:{-32.0, -32.0, -4.0}, Float:{ 32.0, 32.0, 4.0 })
    
    new Float:fOrigin[3]; pev(id, pev_origin, fOrigin)
    fOrigin[1] -= 60.0
    
    engfunc(EngFunc_SetOrigin, g_ent, fOrigin)
    
    set_pev(g_ent, pev_groupinfo, MaskEnt2(1))
}
для игрока:
Код:
#define MaskEnt(%0)    ( 1<<(%0 & 31) )

register_clcmd("say /on", "PlayerSolidON");
register_clcmd("say /off", "PlayerSolidOFF");

public PlayerSolidON(pId)
{
    set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) | MaskEnt(1));
}
public PlayerSolidOFF(pId)
{
    set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) & ~MaskEnt(1));
}

public HC_CBasePlayer_PlayerSpawn_Post(pId)
{
    set_entvar(pId, var_groupinfo, MaskEnt(1));
}
но все же, логики кода правильный?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
BalbuR, хз, чекнул вроде не пропадает, а к нему есть решение?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
заметил интересную баг
в первом случая работает так:

для энтити
say /solidon
say /solidoff

для игроков
say /on
say /off

и при определенном действие команды меняются( спавн, выставление значение groupinfo)
то команды меняются местами т.е. /solidon становится для игроков а /on становиться для энтити, такое возможно?
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
Xelson, да, вижу
спасибо

Limbooc, скорее всего ты ставишь биты не Entity, а игроку вот тут
register_clcmd("say /solidon", "SolidON");
register_clcmd("say /solidoff", "SolidOFF");

public SolidON(pId) {
set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) | MaskEnt2(1));
}

public SolilOFF(pId) {
set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) & ~MaskEnt2(1));
}
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
BalbuR, такс по логике правильно же, я делаю так чтоб игрок при вводе не видел данную энтити-объект

присваиваемым энтити в группу MaskEnt2(1):
set_pev(g_ent, pev_groupinfo, MaskEnt2(1))

дальше игрок фильтруется
Код:
register_clcmd("say /solidon", "SolidON");
register_clcmd("say /solidoff", "SolidOFF");

public SolidON(pId) {
set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) | MaskEnt2(1));
}

public SolilOFF(pId) {
set_entvar(pId, var_groupinfo, get_entvar(pId, var_groupinfo) & ~MaskEnt2(1));
}
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
Limbooc, Mask и Mask2 - разные битсуммы
 

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

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