SetEntityRenderMode and SetEntityRenderColor

Тема в разделе "Программирование / Скриптинг", создана пользователем TheRunningMan, 19 мар 2012.

  1. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Здравствуйте!
    В общем, мне как-то нафоруме аллиед написали плагин невидимости людей, там использовались эти функции SetEntityRenderMode and SetEntityRenderColor, так вот проблема в том что если человек стал невидимым то любое поврждение делает его видимым снова, скажите это можно исправить или надо использовать другие функции?

    По поводу других функций, я нашел в одном плагине который тоже делает невидимым чела

    PHP:
    SDKHook(clientSDKHook_SetTransmitHook_SetTransmit);

    public 
    Action:Hook_SetTransmit(cliententity)
    {
        if( 
    client == entity )
            return 
    Plugin_Continue;
        return 
    Plugin_Handled;
    }
    так вот используя ее невидно вообще ничего кроме метки на радаре, но есть две проблемы если наблюдать за этим человеком, то кажется что он лагает и где то за картой ходит и вторая, т.к. у меня сервер зомби мод (Zombie Reloaded), есть несколько карт, например, ze_FFVII_Mako_Reactor_v3_1, на которой тоже инвиз не срабатывает при каких то условиях, пока не понял...

    Можете объяснить в чем проблема по первому вопросу и что делает вторая функция SDKHook ?
     
  2. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    SDKHook_SetTransmit - это такой хук, который как бы перехватывает передаваемость объекта. Можно даже сказать "его видимость". Если для определённых входящих индексов возвращать Plugin_Handled, то это значит, что сервер не будет отправлять информацию о клиенте другому объекту. В случае, если оба входящих параметра совпадают, то объект должен получать информацию о своём местоположении, иначе как-то прям неправильно будет, и в таком случае возвращается Plugin_Continue, вернее Plugin_Continue возвращается если вы хотите, чтобы объект видел клиента. То-есть формально данная функция не делает объект невидимым, а просто не передаёт информацию о нём другим клиентам.

    Ну а с первым случаем, то возможно где-то при хуке евента player_hurt какой-нибудь плагин изменяет альфу клиента, или вы может намутили чтото не то. Выложите образец своего "кода".
     
    TheRunningMan и Andrey нравится это.
  3. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    м.. образец в первом случае?

    Добавлено через 1 час 24 минуты
    Короче вот, это когда пользователь ввел команду
    PHP:
    public Action:admcmd_inv(clientargs)
    {
        if(
    client == 0)
        {
            
    ReplyToCommand(client"[SM] Can't use this command from server input!");
            
            return 
    Plugin_Handled;
        }

        if(
    GetClientTeam(client) < 2)
        {
            
    //ReplyToCommand(client, "[SM] Spectators can't use this command!");
            
    PrintToChat(client,"\x01\x04[SM]\x01Вы не можете использовать невидимость!");
            return 
    Plugin_Handled;
        }

        if(!
    IsPlayerAlive(client))
        {
            
    //ReplyToCommand(client, "[SM] Dead players can't use this command!");
            
    PrintToChat(client,"\x01\x04[SM]\x01Только живые могут использовать невидимость!");
            return 
    Plugin_Handled;
        }

        
    // zombie
        
    if(ZR_IsClientZombie(client))
        {
            
    //ReplyToCommand(client, "[SM] Zombie's can't use this command!");
            
    PrintCenterText(client,"Зомби не могут использовать невидимость!");
            return 
    Plugin_Handled;
        }
        
        if(
    inv_time == 0.0)
        {
            
    PrintToChat(client,"Уже нет!");
            return 
    Plugin_Handled;
        }
        
        if(
    used[client] == true)
        {
            
    //ReplyToCommand(client, "[SM] You already used this!");
            
    PrintCenterText(client,"Больше нет!");
            return 
    Plugin_Handled;
        }

        
    // If some reason timer still exist, kill it before continue
        
    if(players_timer[client] != INVALID_HANDLE)
        {
            
    KillTimer(players_timer[client]);
            
    players_timer[client] = INVALID_HANDLE;
        }
        if(
    Seconds[client] != INVALID_HANDLE)
        {
            
    KillTimer(Seconds[client]);
            
    Seconds[client] = INVALID_HANDLE;
        }
        
        
    used[client] = true;
        
        
    damageplayer[client] = false;

        
    players_timer[client] = CreateTimer(inv_timemake_visibleclient);

        
    // make invisible
        
    SetEntityRenderMode(clientRenderMode:RENDER_NONE);
        
    disapear[client] = true;
        new 
    activeweapon GetEntPropEnt(clientProp_Send"m_hActiveWeapon");

        if(
    IsValidEntity(activeweapon))
        {
            
    SetEntityRenderMode(activeweaponRenderMode:RENDER_TRANSCOLOR);
            
    SetEntityRenderColor(activeweapon2552552550);
        }
        
        
    PrintCenterText (client"Маскировка включена!");
        
        
    count[client] = 9;
        
    Seconds[client] = CreateTimer(1.0PrintMsgclientTIMER_REPEAT)
        
        return 
    Plugin_Handled;
    }

    дамаг я сделал чтобы исключить некоторые повреждение дабы инвиз не отключался, тогда еще не знал о второй функции...
     
    Последнее редактирование: 20 мар 2012
  4. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    PHP:
    SetEntityRenderMode(clientRenderMode:RENDER_NONE);
    Попробуй с клиетом проделать тоже самое, что и с активным оружием
    PHP:
    SetEntityRenderMode(clientRenderMode:RENDER_TRANSCOLOR); 
    SetEntityRenderColor(client2552552550);
    А в коллбеке таймера make_visible просто установи альфу 255
    PHP:
    SetEntityRenderColor(client255255255255);
     
  5. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Сделал

    PHP:
    public Action:admcmd_inv(clientargs)
    {
        if(
    client == 0)
        {
            
    ReplyToCommand(client"[SM] Can't use this command from server input!");
            
            return 
    Plugin_Handled;
        }

        if(
    GetClientTeam(client) < 2)
        {
            
    //ReplyToCommand(client, "[SM] Spectators can't use this command!");
            
    PrintToChat(client,"\x01\x04[SM]\x01Вы не можете использовать невидимость!");
            return 
    Plugin_Handled;
        }

        if(!
    IsPlayerAlive(client))
        {
            
    //ReplyToCommand(client, "[SM] Dead players can't use this command!");
            
    PrintToChat(client,"\x01\x04[SM]\x01Только живые могут использовать невидимость!");
            return 
    Plugin_Handled;
        }

        
    // zombie
        
    if(ZR_IsClientZombie(client))
        {
            
    //ReplyToCommand(client, "[SM] Zombie's can't use this command!");
            
    PrintCenterText(client,"Зомби не могут использовать невидимость!");
            return 
    Plugin_Handled;
        }
        
        if(
    inv_time == 0.0)
        {
            
    PrintToChat(client,"Уже нет!");
            return 
    Plugin_Handled;
        }
        
        if(
    used[client] == true)
        {
            
    //ReplyToCommand(client, "[SM] You already used this!");
            
    PrintCenterText(client,"Больше нет!");
            return 
    Plugin_Handled;
        }

        
    // If some reason timer still exist, kill it before continue
        
    if(players_timer[client] != INVALID_HANDLE)
        {
            
    KillTimer(players_timer[client]);
            
    players_timer[client] = INVALID_HANDLE;
        }
        if(
    Seconds[client] != INVALID_HANDLE)
        {
            
    KillTimer(Seconds[client]);
            
    Seconds[client] = INVALID_HANDLE;
        }
        
        
    used[client] = true;
        
        
    //damageplayer[client] = false;

        
    players_timer[client] = CreateTimer(inv_timemake_visibleclient);

        
    // make invisible
        //SetEntityRenderMode(client, RenderMode:RENDER_NONE);
        
    SetEntityRenderMode(clientRenderMode:RENDER_TRANSCOLOR);
        
    SetEntityRenderColor(client2552552550);
        
    disapear[client] = true;
        new 
    activeweapon GetEntPropEnt(clientProp_Send"m_hActiveWeapon");

        if(
    IsValidEntity(activeweapon))
        {
            
    SetEntityRenderMode(activeweaponRenderMode:RENDER_TRANSCOLOR);
            
    SetEntityRenderColor(activeweapon2552552550);
        }
        
        
    PrintCenterText (client"Маскировка включена!");
        
        
    count[client] = 9;
        
    Seconds[client] = CreateTimer(1.0PrintMsgclientTIMER_REPEAT)
        
        return 
    Plugin_Handled;
    }

    Но просто при падении сразу виден становишься...

    Так то я не помню плагинов которые используют player_hurt ....
    может они и есть но есть такой же плагин на другом сервер и там все норм...
     
  6. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Я через трансколор и альфу выставляю прозрачность и обычно нормально работает)
     
  7. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Дак вот проблема(((
    А что эта часть кода делает?
    PHP:
    public OnClientPutInServer(client)
    {
        
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
        
    SDKHook(clientSDKHook_WeaponSwitchPostWeaponSwitchPost);
        
    //SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
    }

    public 
    OnPostThinkPost(client)
    {
        
    disapear[client] ? SetEntProp(clientProp_Send"m_iAddonBits"0):0;
    }

    public 
    WeaponSwitchPost(clientweapon)
    {
        if(
    disapear[client])
        {
            
    SetEntityRenderMode(weaponRenderMode:RENDER_TRANSCOLOR);
            
    SetEntityRenderColor(weapon2552552550);
        }
        else
        {
            
    SetEntityRenderMode(weaponRenderMode:RENDER_NORMAL);
        }
    }
     
  8. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Тут подробно описано о нет_пропе m_iAddonBits. Этот нет_проп отвечает за создание ентитей и прикриплении их на модельке клиента. С4 на спине, гранаты на поясе, пистолет на бедре и т.д.. При заходе клиента на сервер клиент хукается через SDK Hooks двумя хуками.
    WeaponSwitchPost, если disapear[client] = true, то делает прозрачным текущее оружие в руках игрока.
    Ну а на счёт m_iAddonBits
    PHP:
    m_iAddonBits gets reset on every PostThink so the PostThinkPost hook in SDK Hooks is needed.
    Если disapear[client] = true, то убирает эти прикреплённые оружия к модельке игрока.
     
    TheRunningMan нравится это.
  9. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Блин..тогда не понятно в чем проблема...........................
    получается все правильно написано...
    может можно как-то сделать, может есть какое-нибудь решение)))
     
  10. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Этот метод ещё ниразу не подводил. И ещё раз повторюсь, если при получении повреждений игрок становится видимым, то в каком-то из плагинов на сервере в колбеке хука евента "player_hurt" изменяется его альфа или РендерМод. Ну или поищи хуки через SDK Hooks такие как SDKHook_OnTakeDamage или SDKHook_OnTakeDamagePost. Больше вариантов нет.
     
  11. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Нашел в чем проблема....
    проблема в зомби моде...
    его убрал, в плагине отключил инклуд и все норм....
    но чорт побери мне же надо сделать его на зомби мод)))
     
  12. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    А в чём проблема? У зомби мода нет исходников?)

    Я тебе даже немного помогу)

    В файлике addons\sourcemod\scripting\zr\tools_functions.inc есть функция
    PHP:
    stock ToolsSetClientAlpha(clientalpha)
    Удали тело, оставь пустую функцию.
    PHP:
    stock ToolsSetClientAlpha(clientalpha)
    {
        
    // Turn rendermode on, on the client.
        //SetEntityRenderMode(client, RENDER_TRANSALPHA);
        
        // Set alpha value on the client.
        //SetEntityRenderColor(client, _, _, _, alpha);
        
        // Forward event to modules.
        //WeaponAlphaOnClientAlphaChanged(client, alpha);
    }
    И откомпиль зомби мод заново. Вроде изменяет альфу только эта функция.

    Хотя нет, ещё есть функция, которая изменяет альфу оружия, что тоже может сделать игрока в некотором смысле видимым
    PHP:
    WeaponAlphaApplyWeaponAlpha(entityalpha)
    которая находится в addons\sourcemod\scripting\zr\weapons\weaponalpha.inc
     
    TheRunningMan нравится это.
  13. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Так там же жесть коды тем более несколько исходников связаны между собой, как компилировать то, а если баги, то вообще...

    Добавлено через 12 минут
    вот че пишет

    // zr/volfeatures/volclassedit.inc(38) : error 006: must be assigned to an array

    // css\cstrike\addons\sourcemod\scripting\zombiereloaded.sp(328) war
    ning 203: symbol is never used: "WeaponAlphaOnClientAlphaChanged"

    ну вторая ошибка еще ладно, а из-за первой не хочет компилировать, с масивом там чето...
     
    Последнее редактирование: 20 мар 2012
  14. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Ошибка глупая, если честно. Автор пытается в массив целых чисел загнать строку.
     

    Вложения:

    TheRunningMan нравится это.
  15. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    так вообще не пашет зомби мод...точнее он пашет но заразить нельзя никого и через админку тоже....бида....
    а нет сори это я тупанул)))


    Воо теперь хорошо))
    По-моему я уже спрашивал здесь, как сделать чтобы не было видно фонаря, огня от стрельбы, метки на радаре для врагов, ну хотя бы ник сделать чтоб не было видно)
     
  16. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Для имён стандартный серверный квар
    PHP:
    "mp_playerid" "1" def"0" min0.000000 max2.000000
     game replicated
     
    Controls what information player see in the status bar0 all names1 team names2 no names
    Вобщем, если выставить mp_playerid "2" в server.cfg, то при наведении прицела на игроков имена не будут отображатся вообще.
    А над остальным уже надо подумать)
     
  17. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    но мне так то имя нужно чтоб показывались, но вот именно чела в инвизе нет, ладно надо поэкспериментировать....
     
  18. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    В таком случае легче всего это организовать через SetTransmit, просто возвращай Plugin_Continue если ентити это индекс клиента, клиент в игре и клиент спектатор к примеру.
     
  19. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    т.е. использовать
    SDKHook(client, SDKHook_SetTransmit, Hook_SetTransmit)

    но я же говорю что на некоторых картах не срабатывает....
    а если использовать одновременно две функции?
     
  20. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Так две и используй. Сделай его не полностью прозрачным, чтоб его видели свои и отправляй Plugin_Handled только для зомби. А в таймере ещё добавь
    PHP:
    SDKUnhook(clientSDKHook_SetTransmitHook_SetTransmit);