Написание плагинов

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, подскажите пожалуйста, почему плагин работает некорректно. Должно вывоводить текст только тогда, когда в команде 1 игрок убил всю вражескую команду, а оно выводит даже если кто-то другой убил 1 игрока.
Пример: Играем 5 на 5, Вася убил 1 игрока, а Петя убил 4, в конце раунда плагин выведет сообщение о том, что Петя сделал Эйс, убив 4 игроков, хотя он убил не всю вражескую команду.
Тоже самое и с "Террористы победили без потерь." и "Спецназ победил без потерь."
Если кто-то 1 из команды умер, то все-равно пишет что Команда победила без потерь
Плагин:
#include <colors>
#include <cstrike>

int iClient_Ace,
    iAttacker_Ace,
    g_iKills[MAXPLAYERS + 1],
    g_iCountCT,
    g_iCountT;
    
public void Round_Start(Event hEvent, const char[] name, bool dontBroadcast)
{
    g_iCountCT = 0;
    g_iCountT = 0;

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (GetClientTeam(i) == CS_TEAM_CT) g_iCountCT++;
        else if (GetClientTeam(i) == CS_TEAM_T) g_iCountT++;
        
        g_iKills[i] = 0;
    }
}

public void Death(Event hEvent, const char[] name, bool dontBroadcast)
{
    iClient_Ace = GetClientOfUserId(GetEventInt(hEvent, "userid"));
    iAttacker_Ace = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    
    if (iClient_Ace == iAttacker_Ace)
    {
        if (GetClientTeam(iAttacker_Ace) == CS_TEAM_CT) g_iCountCT--;
        else if (GetClientTeam(iAttacker_Ace) == CS_TEAM_T) g_iCountT--;
    }
}

public Action Round_End(Event hEvent, const char[] name, bool dontBroadcast)
{
    char szKills[16];
    int winner_team = GetEventInt(hEvent, "winner");
    
    for (int i = 1; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
    }

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (g_iKills[i] >= 0 && g_iKills[i]) //тут проверка нужна для маленького онлайна
            {
                Format(szKills, sizeof(szKills), "игрок%s", (g_iKills[i] > 1) ? "ов" : "а");
                
                if (winner_team == 3 && g_iKills[i] == g_iCountT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iKills[i] == g_iCountCT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iCountT == g_iCountT)
                {
                    CPrintToChatAll("Террористы победили без потерь.");
                }
                
                else if (winner_team == 3 && g_iCountCT == g_iCountCT)
                {
                    CPrintToChatAll("Спецназ победил без потерь.");
                }
            }
        }
    }
}

stock bool IsValidClient(int iClient)
{
    return (0 < iClient && iClient <= MaxClients && IsClientInGame(iClient) && IsFakeClient(iClient) == false);
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всем добрый день, подскажите пожалуйста, почему плагин работает некорректно. Должно вывоводить текст только тогда, когда в команде 1 игрок убил всю вражескую команду, а оно выводит даже если кто-то другой убил 1 игрока.
Пример: Играем 5 на 5, Вася убил 1 игрока, а Петя убил 4, в конце раунда плагин выведет сообщение о том, что Петя сделал Эйс, убив 4 игроков, хотя он убил не всю вражескую команду.
Тоже самое и с "Террористы победили без потерь." и "Спецназ победил без потерь."
Если кто-то 1 из команды умер, то все-равно пишет что Команда победила без потерь
Плагин:
#include <colors>
#include <cstrike>

int iClient_Ace,
    iAttacker_Ace,
    g_iKills[MAXPLAYERS + 1],
    g_iCountCT,
    g_iCountT;
    
public void Round_Start(Event hEvent, const char[] name, bool dontBroadcast)
{
    g_iCountCT = 0;
    g_iCountT = 0;

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (GetClientTeam(i) == CS_TEAM_CT) g_iCountCT++;
        else if (GetClientTeam(i) == CS_TEAM_T) g_iCountT++;
        
        g_iKills[i] = 0;
    }
}

public void Death(Event hEvent, const char[] name, bool dontBroadcast)
{
    iClient_Ace = GetClientOfUserId(GetEventInt(hEvent, "userid"));
    iAttacker_Ace = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    
    if (iClient_Ace == iAttacker_Ace)
    {
        if (GetClientTeam(iAttacker_Ace) == CS_TEAM_CT) g_iCountCT--;
        else if (GetClientTeam(iAttacker_Ace) == CS_TEAM_T) g_iCountT--;
    }
}

public Action Round_End(Event hEvent, const char[] name, bool dontBroadcast)
{
    char szKills[16];
    int winner_team = GetEventInt(hEvent, "winner");
    
    for (int i = 1; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
    }

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (g_iKills[i] >= 0 && g_iKills[i]) //тут проверка нужна для маленького онлайна
            {
                Format(szKills, sizeof(szKills), "игрок%s", (g_iKills[i] > 1) ? "ов" : "а");
                
                if (winner_team == 3 && g_iKills[i] == g_iCountT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iKills[i] == g_iCountCT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iCountT == g_iCountT)
                {
                    CPrintToChatAll("Террористы победили без потерь.");
                }
                
                else if (winner_team == 3 && g_iCountCT == g_iCountCT)
                {
                    CPrintToChatAll("Спецназ победил без потерь.");
                }
            }
        }
    }
}

stock bool IsValidClient(int iClient)
{
    return (0 < iClient && iClient <= MaxClients && IsClientInGame(iClient) && IsFakeClient(iClient) == false);
}
На 57 строке стоит тернарка на > 1, а если игроков будет 2/3/4?
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
На 57 строке стоит тернарка на > 1, а если игроков б
На 57 строке стоит тернарка на > 1, а если игроков будет 2/3/4?

удет 2/3/4?
Если > 1 то в чате будет окончание ов, если 1, то выведится а
Пример, если > 1: Игрок сделал Эйс убив 2 игрокОВ
Если меньше то: Игрок сделал эйс убив 1 игрокА
2 (двух) игрокОВ
3 (трех) игрокОВ
4 (четверых) игрокОВ
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Если > 1 то в чате будет окончание ов, если 1, то выведится а
Пример, если > 1: Игрок сделал Эйс убив 2 игрокОВ
Если меньше то: Игрок сделал эйс убив 1 игрокА
2 (двух) игрокОВ
3 (трех) игрокОВ
4 (четверых) игрокОВ
А не проще хукнуть событие cs_win_panel_round и получить содержимое причины оттуда по:
  • funfact_ace
  • funfact_t_win_no_casualties
  • funfact_ct_win_no_casualties
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
подскажите пожалуйста, почему плагин работает некорректно
хз почему он должен работать корректно

Вот этот должен работать:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <colors>
#include <cstrike>

int iTeamSize[2],
    iKills[MAXPLAYERS+1],
    iDead[2];

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_Death);
    HookEvent("round_end", Event_End);
}

public void OnMapStart(int client)
{
    for (int i; i <= MaxClients; i++) iKills[i] = 0;
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;
}

public void OnClientDisconnect(int client)
{
    iKills[client] = 0;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;

    for (int i = 1, t; i <= MaxClients; i++)
    {
        iKills[i] = 0;
        if (IsValidClient(i) && (t = GetClientTeam(i)) > 1 && IsPlayerAlive(i))
            iTeamSize[view_as<int>(t == CS_TEAM_CT)]++;
    }
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int victim = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!victim)
        return;

    int team = GetClientTeam(victim);
    if(team < 2)
        return;

    iDead[team - 2]++;

    int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if (attacker && victim != attacker && team != GetClientTeam(attacker))
        iKills[attacker]++;
}

public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    int winner = GetEventInt(event, "winner");
    if(winner < 2)
        return;

    if(iTeamSize[winner-2] > 0 && iDead[winner-2] < 1)
        CPrintToChatAll("%s без потерь.", winner == 3 ? "Спецназ победил" : "Террористы победили");
    if(iTeamSize[3-winner] < 1 || iDead[3-winner] < 1)
        return;

    for (int i = 1; i <= MaxClients; i++) if (iKills[i] && IsValidClient(i) && GetClientTeam(i) == winner && iKills[i] == iDead[3-winner])
    {
        CPrintToChatAll("Игрок %N сделал ACE убив %d игрок%s!", i, iKills[i], iKills[i] > 1 ? "ов" : "а");
        break;
    }
}

stock bool IsValidClient(int iClient)
{
    return IsClientInGame(iClient) && !IsFakeClient(iClient);
}
UPD добавил проверки на размер команд
UPD2 пофиксил циклы
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
А не проще хукнуть событие cs_win_panel_round и получить содержимое причины оттуда по:
  • funfact_ace
  • funfact_t_win_no_casualties
  • funfact_ct_win_no_casualties
Css v 34, там нет этого события
Сообщения автоматически склеены:

хз почему он должен работать корректно

Вот этот должен работать:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <colors>
#include <cstrike>

int iTeamSize[2],
    iKills[MAXPLAYERS+1],
    iDead[2];

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_Death);
    HookEvent("round_end", Event_End);
}

public void OnMapStart(int client)
{
    for (int i; i <= MaxClients; i++) iKills[i] = 0;
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;
}

public void OnClientDisconnect(int client)
{
    iKills[client] = 0;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;

    for (int i = 1, t; i <= MaxClients; i++)
    {
        iKills[i] = 0;
        if (IsValidClient(i) && (t = GetClientTeam(i)) > 1 && IsPlayerAlive(i))
            iTeamSize[view_as<int>(t == CS_TEAM_CT)]++;
    }
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int victim = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!victim)
        return;

    int team = GetClientTeam(victim);
    if(team < 2)
        return;

    iDead[team - 2]++;

    int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if (attacker && victim != attacker && team != GetClientTeam(attacker))
        iKills[attacker]++;
}

public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    int winner = GetEventInt(event, "winner");
    if(winner < 2)
        return;

    if(iTeamSize[winner-2] > 0 && iDead[winner-2] < 1)
        CPrintToChatAll("%s без потерь.", winner == 3 ? "Спецназ победил" : "Террористы победили");
    if(iTeamSize[3-winner] < 1 || iDead[3-winner] < 1)
        return;

    for (int i = 1; i <= MaxClients; i++) if (iKills[i] && IsValidClient(i) && GetClientTeam(i) == winner && iKills[i] == iDead[3-winner])
    {
        CPrintToChatAll("Игрок %N сделал ACE убив %d игрок%s!", i, iKills[i], iKills[i] > 1 ? "ов" : "а");
        break;
    }
}

stock bool IsValidClient(int iClient)
{
    return IsClientInGame(iClient) && !IsFakeClient(iClient);
}
UPD добавил проверки на размер команд
UPD2 пофиксил циклы
L 08/30/2023 - 20:05:55: [SM] Exception reported: Array index out-of-bounds (index 3, limit 2)
L 08/30/2023 - 20:05:55: [SM] Blaming: no_deaths.smx
L 08/30/2023 - 20:05:55: [SM] Call stack trace:
L 08/30/2023 - 20:05:55: [SM] [1] Line 65, D:\Desktop\^\1.11 scripting\no_deaths.sp::Event_End
L 08/30/2023 - 20:05:55: [SM] [3] CS_TerminateRound
L 08/30/2023 - 20:05:55: [SM] [4] Line 81, C:\Users\Admin\Desktop\kac_new\delayroundend.sp::CS_OnTerminateRound
 
Последнее редактирование:

Туник

Участник
Сообщения
1,281
Реакции
263
Подскажите как исправить момент один, игра ксго, если выкинуть авп и выиграть раунд с диглом, то в следующем раунде в руках только дигл а авп пропадает.
 

Вложения

  • spirt_deaglehs.sp
    1.1 КБ · Просмотры: 3

Nekro

Терра инкогнита
Сообщения
4,026
Реакции
2,260
Здраствуйте исправьте пожалуйста ошибку DLL_MessageEnd: Refusing to send user message KeyHintText of 256 bytes to client, user message size limit is 255 bytes, И бывает такое когда наблюдаешь за каким то другим юзером (за одним бывает пропадает а так норм вроде все)
Код:
Action Timer_Updater(Handle timer)
{
    char sBuffer[255];
    for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && !IsPlayerAlive(i))
    {
        //Клиент наблюдает за каким-то одним человеком
        int m_iObserverMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
        if(m_iObserverMode < 4 || 6 < m_iObserverMode)
            continue;

        int iTarget = GetEntPropEnt(i, Prop_Send, "m_hObserverTarget");
        if(iTarget < 1 || MaxClients < iTarget)
            continue;

        if((iRANK[iTarget] = LR_GetClientInfo(iTarget, ST_RANK)) < 1 || 18 < iRANK[iTarget])
            continue;

        int next = iRANK[iTarget] < 18 ? g_hEXP.Get(iRANK[iTarget]) : 0;
        char sRANK[128];
        FormatEx(sRANK, sizeof(sRANK), "rank_%i", iRANK[iTarget]);
        FormatEx(sBuffer, sizeof(sBuffer), " [%N Ранг: [%T] [%i из %i] [%i]\n║ Здоровье: [%i] [%i]", iTarget, sRANK, iTarget, LR_GetClientInfo(iTarget, ST_EXP), next, Shop_GetClientCredits(iTarget), GetClientHealth(iTarget), GetClientArmor(iTarget));

        hShowStats[i] = StartMessageOne("KeyHintText", i);
        {
            BfWriteByte(hShowStats[i], 1);
            BfWriteString(hShowStats[i], sBuffer);
        }
        EndMessage();
    }
    return Plugin_Continue;
}
Так текст уменьшите и все. Например вот так
 

google>

oldgamers
Сообщения
373
Реакции
210
мне не нужно его уменшать мне нужно как выше в предоставленном коде
char sBuffer[255]; на 25**
___

не обратил внимание на
NGINX:
        hShowStats[i] = StartMessageOne("KeyHintText", i);
        {
            BfWriteByte(hShowStats[i], 1);
            BfWriteString(hShowStats[i], sBuffer);
        }
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
при компиляции размер округлится всё равно до числа кратного 4, т.е. станет равен 256.
Ограничить размер ты можешь только в FormatEx(sBuffer, sizeof(sBuffer), заменив sizeof(sBuffer) на 255.
Ну или не пихать рамочку из псевдографики.
Ещё можно кириллические символы заменить на похожие латиницей, но на этом ты много не выиграешь: 1 символ кириллицы равен 2 символам латиницы. Вот только шрифты в CS:S ущербные и замена будет заметна: кириллические буквы отличаются толщиной линий от латиницы.
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
хз почему он должен работать корректно

Вот этот должен работать:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <colors>
#include <cstrike>

int iTeamSize[2],
    iKills[MAXPLAYERS+1],
    iDead[2];

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_Death);
    HookEvent("round_end", Event_End);
}

public void OnMapStart(int client)
{
    for (int i; i <= MaxClients; i++) iKills[i] = 0;
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;
}

public void OnClientDisconnect(int client)
{
    iKills[client] = 0;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    iTeamSize[0] = iTeamSize[1] = iDead[0] = iDead[1] = 0;

    for (int i = 1, t; i <= MaxClients; i++)
    {
        iKills[i] = 0;
        if (IsValidClient(i) && (t = GetClientTeam(i)) > 1 && IsPlayerAlive(i))
            iTeamSize[view_as<int>(t == CS_TEAM_CT)]++;
    }
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int victim = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!victim)
        return;

    int team = GetClientTeam(victim);
    if(team < 2)
        return;

    iDead[team - 2]++;

    int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if (attacker && victim != attacker && team != GetClientTeam(attacker))
        iKills[attacker]++;
}

public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    int winner = GetEventInt(event, "winner");
    if(winner < 2)
        return;

    if(iTeamSize[winner-2] > 0 && iDead[winner-2] < 1)
        CPrintToChatAll("%s без потерь.", winner == 3 ? "Спецназ победил" : "Террористы победили");
    if(iTeamSize[3-winner] < 1 || iDead[3-winner] < 1)
        return;

    for (int i = 1; i <= MaxClients; i++) if (iKills[i] && IsValidClient(i) && GetClientTeam(i) == winner && iKills[i] == iDead[3-winner])
    {
        CPrintToChatAll("Игрок %N сделал ACE убив %d игрок%s!", i, iKills[i], iKills[i] > 1 ? "ов" : "а");
        break;
    }
}

stock bool IsValidClient(int iClient)
{
    return IsClientInGame(iClient) && !IsFakeClient(iClient);
}
UPD добавил проверки на размер команд
UPD2 пофиксил циклы
Плагин работает отлично, большое спасибо. Подскажите пожалуйста, как в него добавить командные цвета. Подключил библиотеку <colors>, прописываю {teamcolors} там где это нужно, но цвет выводится желтый ({default}).
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@7pElllHuK, вообще ошибки есть в логах?
Емнип, нельзя одновременно использовать зелёный и командный цвета в одном сообщении (потому что зелёный - командный для сервера).
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, вообще ошибки есть в логах?
Емнип, нельзя одновременно использовать зелёный и командный цвета в одном сообщении (потому что зелёный - командный для сервера).
Ошибок нет
Убрал для проверки зеленый цвет с сообщения и оставил {teamcolor} в итоге все сообщение желтое
Я так понимаю проблема в том что в плагине используется функция CPrintToChatAll, и она не понимает с какой команды игрок, вот и выводит стандартный цвет
 
Последнее редактирование:

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Привет всем!
Кто может подсказать, какой установить SolidFlags для пропа, чтобы он мог получать урон, и также чтобы игроки не могли проходить сквозь него?
Сейчас стоит значение 13, и оно позволяет получать урон, но при этом игроки могут проходить сквозь проп
code:
public Action CreateVisibleProp(Handle timer, int client){
    if(IsValidClient(client) && IsPlayerAlive(client) && GetClientTeam(client) == 2){
        SetEntityRenderMode(client, RENDER_NONE);
        // SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", 0);
        SetEntProp(client, Prop_Send, "m_iObserverMode", 1);
        SetEntProp(client, Prop_Send, "m_iFOV", 100);
        SetEntProp(client, Prop_Data, "m_CollisionGroup", 2);
        SetEntProp(client, Prop_Data, "m_nSolidType", 0, 1);

        DelModel(client);
        SDKUnhook(iModel[client], SDKHook_OnTakeDamage, TakeDamageClient);

        iModel[client] = CreateEntityByName("prop_dynamic_override");
        if(iModel[client] < 1)
            return Plugin_Handled;

        for(int x; x<3; x++){
            PPos[x][client] = 0.0;
            bERROR[client] = false;
        }

        char cModelName[64]; GetEntPropString(client, Prop_Data, "m_ModelName", cModelName, 128);
        DispatchKeyValue(iModel[client], "model", cModelName);
        // SetEntityModel(client, cModelName);
        SetEntPropEnt(iModel[client], Prop_Send, "m_hOwnerEntity", client);
        SetEntProp(iModel[client], Prop_Data, "m_usSolidFlags", 13);
        // SetEntProp(iModel[client], Prop_Data, "m_CollisionGroup", 1);
        SetEntProp(iModel[client], Prop_Data, "m_nSolidType", 6, 1);

        float pos[3]; GetClientAbsOrigin(client, pos);
        TeleportEntity(iModel[client], pos, NULL_VECTOR, NULL_VECTOR);

        DispatchSpawn(iModel[client]);
       
        SDKHook(iModel[client], SDKHook_OnTakeDamage, TakeDamageClient);
        HealthSet(client, 100);
        fHealth[client] = 100.0;

        FreezeClient(client, false);
    }
    return Plugin_Continue;
}
Я уже пробовал некоторые значения, но почему-то у меня выходило что проп или только "твердый", или только получает урон
 

khood

Участник
Сообщения
214
Реакции
51
Привет всем!
Кто может подсказать, какой установить SolidFlags для пропа, чтобы он мог получать урон, и также чтобы игроки не могли проходить сквозь него?
Сейчас стоит значение 13, и оно позволяет получать урон, но при этом игроки могут проходить сквозь проп
code:
public Action CreateVisibleProp(Handle timer, int client){
    if(IsValidClient(client) && IsPlayerAlive(client) && GetClientTeam(client) == 2){
        SetEntityRenderMode(client, RENDER_NONE);
        // SetEntPropEnt(client, Prop_Send, "m_hObserverTarget", 0);
        SetEntProp(client, Prop_Send, "m_iObserverMode", 1);
        SetEntProp(client, Prop_Send, "m_iFOV", 100);
        SetEntProp(client, Prop_Data, "m_CollisionGroup", 2);
        SetEntProp(client, Prop_Data, "m_nSolidType", 0, 1);

        DelModel(client);
        SDKUnhook(iModel[client], SDKHook_OnTakeDamage, TakeDamageClient);

        iModel[client] = CreateEntityByName("prop_dynamic_override");
        if(iModel[client] < 1)
            return Plugin_Handled;

        for(int x; x<3; x++){
            PPos[x][client] = 0.0;
            bERROR[client] = false;
        }

        char cModelName[64]; GetEntPropString(client, Prop_Data, "m_ModelName", cModelName, 128);
        DispatchKeyValue(iModel[client], "model", cModelName);
        // SetEntityModel(client, cModelName);
        SetEntPropEnt(iModel[client], Prop_Send, "m_hOwnerEntity", client);
        SetEntProp(iModel[client], Prop_Data, "m_usSolidFlags", 13);
        // SetEntProp(iModel[client], Prop_Data, "m_CollisionGroup", 1);
        SetEntProp(iModel[client], Prop_Data, "m_nSolidType", 6, 1);

        float pos[3]; GetClientAbsOrigin(client, pos);
        TeleportEntity(iModel[client], pos, NULL_VECTOR, NULL_VECTOR);

        DispatchSpawn(iModel[client]);
      
        SDKHook(iModel[client], SDKHook_OnTakeDamage, TakeDamageClient);
        HealthSet(client, 100);
        fHealth[client] = 100.0;

        FreezeClient(client, false);
    }
    return Plugin_Continue;
}
Я уже пробовал некоторые значения, но почему-то у меня выходило что проп или только "твердый", или только получает урон
Для того чтобы проп мог получать урон и игроки не могли проходить сквозь него, вам нужно установить следующие значения для m_usSolidFlags и m_nSolidType
.:
SetEntProp(iModel[client], Prop_Data, "m_usSolidFlags", 1 << 0 | 1 << 1 | 1 << 6, 1);
SetEntProp(iModel[client], Prop_Data, "m_nSolidType", 6, 1);
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Для того чтобы проп мог получать урон и игроки не могли проходить сквозь него, вам нужно установить следующие значения для m_usSolidFlags и m_nSolidType
.:
SetEntProp(iModel[client], Prop_Data, "m_usSolidFlags", 1 << 0 | 1 << 1 | 1 << 6, 1);
SetEntProp(iModel[client], Prop_Data, "m_nSolidType", 6, 1);
Тогда проп только твердый, и урон не получает
 
Сверху Снизу