Показать entity определенному клиенту

Reidenshi

Участник
Сообщения
42
Реакции
14
Можно ли показать объект(entity) определенному клиенту или нескольким?
Вот код (не мой), он вроде должен работать, но почему-то объекты видят все.

C-подобный:
public int CreateIcon(int iClient)
{
    float fPos[3], fAng[3]; int iRisk;
    GetClientEyePosition(iClient, fPos);        //Позиция
    GetClientEyeAngles(iClient, fAng);        //Угол положения
    TR_TraceRayFilter(fPos, fAng, MASK_SOLID, RayType_Infinite, TRDontHitSelf, iClient);    //Запускает новый луч трассировки, используя результат глобальной трассировки и настроенный фильтр лучей трассировки.
    
    if(TR_DidHit(INVALID_HANDLE))
    {
        TR_GetEndPosition(fPos, INVALID_HANDLE);        //Возвращает положение столкновения результата трассировки.
        if(Engine_Version == GAME_CSS_34)
        {
            iRisk = CreateEntityByName("env_sprite");    //создания
            DispatchKeyValue(iRisk, "classname", "env_sprite");        //класс сущности
        }
        else
        {
            iRisk = CreateEntityByName("env_sprite_oriented");    //создания
            DispatchKeyValue(iRisk, "classname", "env_sprite_oriented");        //класс сущности
        }
        fPos[2] += fPos2;
        DispatchKeyValue(iRisk, "spawnflags", "1");        //флаги
        DispatchKeyValue(iRisk, "scale", "0.3");    //масштаб
        DispatchKeyValue(iRisk, "rendermode", "1");        //
        DispatchKeyValue(iRisk, "rendercolor", "255 255 255");        //цвет
        DispatchKeyValue(iRisk, "model", sModel);        //Отправляет KeyValue в заданную сущность, используя строковое значение.
        DispatchKeyValueVector(iRisk, "origin", fPos);        //Отправляет KeyValue в заданную сущность, используя значение вектора.
        DispatchSpawn(iRisk);        //Создает сущность в игре.

        TeleportEntity(iRisk, fPos, NULL_VECTOR, NULL_VECTOR);

        if(DispatchSpawn(iRisk))   
        {
            SetEntPropEnt(iRisk, Prop_Send, "m_hOwnerEntity", iClient);
            SDKHookEx(iRisk, SDKHook_SetTransmit, OnTransmit);
        }

        if (bESoundType == 0) {
            EmitSoundToClient(iClient, sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
        } else if (bESoundType == 1) {
            EmitSoundToAll(sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
        } else if (bESoundType == 2) {
            int cTeam = GetClientTeam(iClient);

            if (cTeam == CS_TEAM_SPECTATOR || cTeam == CS_TEAM_NONE) {
                CPrint(iClient, _, "{geen}[Метка] {red}Вы не находитесь в команде!");
            } else {
                int iClients[MAXPLAYERS+1];
                int iClientCount = GetClientsByTeam(cTeam, iClients, sizeof(iClients));

                for(int i = 0; i < iClientCount; i++) {
                    EmitSoundToClient(iClients[i], sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
                }
            }
        }
        CreateTimer(fKillRisk, TimerKillRisk, iRisk);
    }
}

stock int GetClientsByTeam(int iTeam, int[] iClients, int iSize)
{
    int iCount;
    for(int i = 1; i <= MaxClients; i++)
    {
        if (iCount == iSize)
        {
            break;
        }
        if (IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == iTeam)
        {
            iClients[iCount++] = i;
        }
    }
    return iCount;
}

public Action OnTransmit(int iEntity, int iClient)
{
    if(iClient == iEntity) return Plugin_Continue;
    static int iOwner, iTeam;
    iTeam = GetClientTeam(iClient);
    PrintToChat(iClient, "team: %d", iTeam);
    if(iTeam < 2) return Plugin_Continue;
    if((iOwner = GetEntPropEnt(iEntity, Prop_Send, "m_hOwnerEntity")) > 0 && GetClientTeam(iOwner) != iTeam) return Plugin_Handled;
    
    return Plugin_Continue;
}
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Можно ли показать объект(entity) определенному клиенту или нескольким?
Вот код (не мой), он вроде должен работать, но почему-то объекты видят все.

C-подобный:
public int CreateIcon(int iClient)
{
    float fPos[3], fAng[3]; int iRisk;
    GetClientEyePosition(iClient, fPos);        //Позиция
    GetClientEyeAngles(iClient, fAng);        //Угол положения
    TR_TraceRayFilter(fPos, fAng, MASK_SOLID, RayType_Infinite, TRDontHitSelf, iClient);    //Запускает новый луч трассировки, используя результат глобальной трассировки и настроенный фильтр лучей трассировки.
   
    if(TR_DidHit(INVALID_HANDLE))
    {
        TR_GetEndPosition(fPos, INVALID_HANDLE);        //Возвращает положение столкновения результата трассировки.
        if(Engine_Version == GAME_CSS_34)
        {
            iRisk = CreateEntityByName("env_sprite");    //создания
            DispatchKeyValue(iRisk, "classname", "env_sprite");        //класс сущности
        }
        else
        {
            iRisk = CreateEntityByName("env_sprite_oriented");    //создания
            DispatchKeyValue(iRisk, "classname", "env_sprite_oriented");        //класс сущности
        }
        fPos[2] += fPos2;
        DispatchKeyValue(iRisk, "spawnflags", "1");        //флаги
        DispatchKeyValue(iRisk, "scale", "0.3");    //масштаб
        DispatchKeyValue(iRisk, "rendermode", "1");        //
        DispatchKeyValue(iRisk, "rendercolor", "255 255 255");        //цвет
        DispatchKeyValue(iRisk, "model", sModel);        //Отправляет KeyValue в заданную сущность, используя строковое значение.
        DispatchKeyValueVector(iRisk, "origin", fPos);        //Отправляет KeyValue в заданную сущность, используя значение вектора.
        DispatchSpawn(iRisk);        //Создает сущность в игре.

        TeleportEntity(iRisk, fPos, NULL_VECTOR, NULL_VECTOR);

        if(DispatchSpawn(iRisk))  
        {
            SetEntPropEnt(iRisk, Prop_Send, "m_hOwnerEntity", iClient);
            SDKHookEx(iRisk, SDKHook_SetTransmit, OnTransmit);
        }

        if (bESoundType == 0) {
            EmitSoundToClient(iClient, sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
        } else if (bESoundType == 1) {
            EmitSoundToAll(sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
        } else if (bESoundType == 2) {
            int cTeam = GetClientTeam(iClient);

            if (cTeam == CS_TEAM_SPECTATOR || cTeam == CS_TEAM_NONE) {
                CPrint(iClient, _, "{geen}[Метка] {red}Вы не находитесь в команде!");
            } else {
                int iClients[MAXPLAYERS+1];
                int iClientCount = GetClientsByTeam(cTeam, iClients, sizeof(iClients));

                for(int i = 0; i < iClientCount; i++) {
                    EmitSoundToClient(iClients[i], sSound, iRisk, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.8);
                }
            }
        }
        CreateTimer(fKillRisk, TimerKillRisk, iRisk);
    }
}

stock int GetClientsByTeam(int iTeam, int[] iClients, int iSize)
{
    int iCount;
    for(int i = 1; i <= MaxClients; i++)
    {
        if (iCount == iSize)
        {
            break;
        }
        if (IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == iTeam)
        {
            iClients[iCount++] = i;
        }
    }
    return iCount;
}

public Action OnTransmit(int iEntity, int iClient)
{
    if(iClient == iEntity) return Plugin_Continue;
    static int iOwner, iTeam;
    iTeam = GetClientTeam(iClient);
    PrintToChat(iClient, "team: %d", iTeam);
    if(iTeam < 2) return Plugin_Continue;
    if((iOwner = GetEntPropEnt(iEntity, Prop_Send, "m_hOwnerEntity")) > 0 && GetClientTeam(iOwner) != iTeam) return Plugin_Handled;
   
    return Plugin_Continue;
}
Может на сервера просто несколько человек, получается несколько это все. Значит всё так как нужно
 
Сверху Снизу