Неконтролируемый рост entities

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
После старта карты некоторое время количество оружия стоит на отметке 60-70. Через какое-то время число у каждого резко возрастает и продолжает расти:
report_entities:
Class: weapon_awp (397)
Class: weapon_deagle (397)
Class: weapon_knife (398)
Как следствие - краш (ED_Alloc: no free edicts)

Может ли такой эффект давать этот код?
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include sdktools

public Plugin myinfo    =
{
    name                = "Del Deagle on awp_ maps",
    author                = "GoTT && Paranoiiik",
    version                = "1.1",
    url                    = "hlmod.ru/resources/no-deagle-on-awp-maps.858 / vk.com/oldfreelance"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", eventPlayerSpawn);
}

public Action eventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    char szMap[128];
    GetCurrentMap(szMap, sizeof szMap);
   
    if(szMap[0] == 'a' && szMap[1] == 'w' && szMap[2] == 'p' && szMap[3] == '_')
    {
        int client = GetClientOfUserId(event.GetInt("userid"));

        if(IsPlayerAlive(client))
        {
            int iItems;
            for(int i = 0; i < 6; i++) if(i < 6 && (iItems = GetPlayerWeaponSlot(client, i)) != -1) RemovePlayerItem(client, iItems);
           
            GivePlayerItem(client, "weapon_knife");
            GivePlayerItem(client, "weapon_awp");
        }
    }
}
Подозреваю, что в нём дело и есть, но не знаю, как побороть это ввиду отсутствия должных знаний и опыта.
На этой карте, если что, работает DM. Краши строго на этой карте строго по такому сценарию. Один и тот же краш.

SM 1.10, CS:S v34
 
Решение
исправил
код обновил
Удаляет всё оружие вообще и не выдаёт

Удалось добиться, в общем, желаемого результата так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include sdktools_functions
#include sdktools_entinput

public Plugin myinfo    =
{
    name                = "Delete Deagle on AWP maps",
    author                = "Grey83",
    version                = "1.0",
    url                    = "hlmod.ru/threads/nekontroliruemyj-rost-entities.59625"
};

public void OnMapStart()
{
    static bool bHooked;
    char sMap[128];
   
    GetCurrentMap(sMap, sizeof sMap);
    GetMapDisplayName(sMap, sMap, sizeof sMap);
   
    if((!strncmp(sMap, "awp_", 4, false)) == bHooked) return;

    if(!(bHooked = !bHooked))...

Kotya

Участник
Сообщения
15
Реакции
9
На сервере есть плагин, который чистит оружие на полу после смерти игрока?
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
На сервере есть плагин, который чистит оружие на полу после смерти игрока?
Да
Сообщения автоматически склеены:

Вот этим чищу:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iWeaponParent;

public Plugin myinfo    =
{
    name                = "SM Weapon Cleanup [Light + New Syntax]",
    author                = "TechKnow",
    description            = "Removes loose weapons droped",
    version                = "1.3.1",
    url                    = "http://www.sourcemod.net"
};

public void OnPluginStart()
{
    iWeaponParent = FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity");
    
    HookEvent("player_death", eventCleanUp, EventHookMode_Post);
    HookEvent("round_start", eventCleanUp, EventHookMode_Post);
}

Action eventCleanUp(Event event, const char[] name, bool dontBroadcast)
{
    int        iMaxEntities = GetMaxEntities();
    char    sWeapon[64];
    
    for(int i = MaxClients; i < iMaxEntities; i++)
    {
        if(IsValidEdict(i) && IsValidEntity(i))
        {
            GetEdictClassname(i, sWeapon, sizeof sWeapon);
            if((StrContains(sWeapon,  "weapon_") != -1 || StrContains(sWeapon, "item_") != -1) && GetEntDataEnt2(i, iWeaponParent) == -1) RemoveEdict(i);
        }
    }
    
    return Plugin_Continue;
}
 

Kotya

Участник
Сообщения
15
Реакции
9
Оружие чиститься когда кто-то умирает, плагином выше вы, когда игрок спавнится, забираете все оружие и выдаете только нож и авп, на логах видно, что там есть еще диглы, как могут диглы появится в теории(может есть какая-то не учтенная возможность получения оружия)?
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Оружие чиститься когда кто-то умирает, плагином выше вы, когда игрок спавнится, забираете все оружие и выдаете только нож и авп, на логах видно, что там есть еще диглы, как могут диглы появится в теории(может есть какая-то не учтенная возможность получения оружия)?
Оружие выдаёт лишь сама карта: авп, дигл и нож. Плагином стараюсь избавиться от дигла. Никакие другие плагины не выдают оружие ни при каких обстоятельствах
 

Kotya

Участник
Сообщения
15
Реакции
9
В теории, если игроки не будут убивать друг-друга и оружие будет постоянно спавнится, то может случится краш
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
В теории, если игроки не будут убивать друг-друга и оружие будет постоянно спавнится, то может случится краш
Представляю, как на DM игроки просто стоят и смотрят друг на друга.
Нет, там мясо, постоянно кто-то кого-то убивает.
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Потому что удаляется неправильным образом. В итоге накапливается раунд за раундом. Не дочитал до части с DM. но суть та же, при каждом спавне создается новая а старая остается.

RemovePlayerItem удаляет у игрока, но само энтити остается. Надо еще добавить AcceptEntityInput(entity, "kill");
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Потому что удаляется неправильным образом. В итоге накапливается раунд за раундом. Не дочитал до части с DM. но суть та же, при каждом спавне создается новая а старая остается.

RemovePlayerItem удаляет у игрока, но само энтити остается. Надо еще добавить AcceptEntityInput(entity, "kill");
То есть как-то так?
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include sdktools

public Plugin myinfo    =
{
    name                = "Del Deagle on awp_ maps",
    author                = "GoTT && Paranoiiik",
    version                = "1.1",
    url                    = "hlmod.ru/resources/no-deagle-on-awp-maps.858 / vk.com/oldfreelance"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", eventPlayerSpawn);
}

public Action eventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    char szMap[128];
    GetCurrentMap(szMap, sizeof szMap);
    
    if(szMap[0] == 'a' && szMap[1] == 'w' && szMap[2] == 'p' && szMap[3] == '_')
    {
        int client = GetClientOfUserId(event.GetInt("userid"));

        if(IsPlayerAlive(client))
        {
            int iItems;
            
            for(int i = 0; i < 6; i++)
            {
                if(i < 6 && (iItems = GetPlayerWeaponSlot(client, i)) != -1)
                {
                    RemovePlayerItem(client, iItems);
                    
                    int iEntity = -1;
                    
                    if((iEntity = FindEntityByClassname(iEntity, "weapon_knife")) > 0
                    || (iEntity = FindEntityByClassname(iEntity, "weapon_deagle")) > 0
                    || (iEntity = FindEntityByClassname(iEntity, "weapon_awp")) > 0)
                        AcceptEntityInput(iEntity, "kill");
                }
            }
            
            GivePlayerItem(client, "weapon_knife");
            GivePlayerItem(client, "weapon_awp");
        }
    }
}
Сообщения автоматически склеены:

Нет, ничего не работает. Перепробовал кучу способов. С какими-то рост всё равно продолжается и ещё нож.. почему-то удаляется рандомно, с какими-то удаляется всё оружие из рук живых игроков.
Может, кто-то знает, как сделать так, чтобы удалить нахрен всё, но не трогать оружие, которое в руках.. было бы классно
Сообщения автоматически склеены:

Если что, Weapon Restrict почему-то выставляет значение на 0, но оружие не отбирает всё равно, потому его не использую
 
Последнее редактирование:

Rolzzandik

Участник
Сообщения
492
Реакции
234
C-подобный:
RemovePlayerItem(iClient, iEnt);
AcceptEntityInput(iEnt, "KillHierarchy");

И вот этот ужас
for(int i = 0; i < 6; i++) if(i < 6 && (iItems = GetPlayerWeaponSlot(client, i)) != -1)
правильней заменить на
C-подобный:
int iSize = GetEntPropArraySize(iClient, Prop_Send, "m_hMyWeapons");
for (int i = 0; i < iSize; i++){
int iEnt = GetEntPropEnt(iClient, Prop_Send, "m_hMyWeapons", i);
//Код где работаем с iEnt - наша пушка)

Ну если прям так хочется сделать говнокод(я про себя), то попробуй так:
дааа:
int iSize = GetEntPropArraySize(iClient, Prop_Send, "m_hMyWeapons");
for (int i = 0; i < iSize; i++){
    int iEnt = GetEntPropEnt(iClient, Prop_Send, "m_hMyWeapons", i);
    if(iEnt == -1)
        return; //Тут стоит учитывать, что если  используешь хук, то тут Plugin_continue
    char szTemp[32];
    GetEntityClassname(iEnt, szTemp, sizeof szTemp);
    if(StrContains(szTemp, "deagle", false) != -1) {
        RemovePlayerItem(iClient, iEnt);
        AcceptEntityInput(iEnt, "KillHierarchy");
    }
но не трогать оружие, которое в руках
Работать с
int iActive = GetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon"); - Это то оружие, которое у нас непосредственно в руках
 
Последнее редактирование:

Deluks

Верховное DNO|
Сообщения
1,853
Реакции
812
После старта карты некоторое время количество оружия стоит на отметке 60-70. Через какое-то время число у каждого резко возрастает и продолжает расти:

Как следствие - краш (ED_Alloc: no free edicts)

У меня на го такая выскакивала. запретил просто оружке выпадать с рук, все норм.

Может и тебе так селать?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Deluks, а такой квар в этом говне мамонта, CSS v34, имеется?
Сообщения автоматически склеены:

@Paranoiiik,попробуй так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

bool bAWP;

public void OnMapStart()
{
    static bool hooked;
    char map[128];
    GetCurrentMap(map, sizeof(map));
    GetMapDisplayName(map, map, sizeof(map));
    if((bAWP = !strncmp(map, "awp_", 4, false)) == hooked) return;

    if(!(hooked = !hooked))
        UnhookEvent("player_spawn", Event_Spawn);
    else HookEvent("player_spawn", Event_Spawn);
}

public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    RemoveWeaponBySlot(client, 0);
    RemoveWeaponBySlot(client, 1);
    while(RemoveWeaponBySlot(client, 3)) {}
    GivePlayerItem(client, "weapon_awp");
}

stock bool RemoveWeaponBySlot(int client, int slot)
{
    int ent = GetPlayerWeaponSlot(client, slot);
    return ent > MaxClients && RemovePlayerItem(client, ent) && AcceptEntityInput(ent, "Kill");
}

public void OnEntityCreated(int entity, const char[] classname)
{
    if(bAWP && entity > MaxClients && !strncmp(classname, "weapon_", 7, false)
    && (strcmp(classname[7], "awp", false) || strcmp(classname[7], "knife", false)))
        AcceptEntityInput(entity, "Kill");
}
При спавне у игрока будет отбираться всё оружие, кроме ножа и будет выдана AWP. Также с карты будет удаляться всё вновь созданное оружие, кроме ножей и AWP.
Сообщения автоматически склеены:

Скрипт совместим с мастерской (так что должен работать на CS:S OB и CS:GO).
 
Последнее редактирование:

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
@Deluks, а такой квар в этом говне мамонта, CSS v34, имеется?
Сообщения автоматически склеены:

@Paranoiiik,попробуй так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

bool bAWP;

public void OnMapStart()
{
    static bool hooked;
    char map[128];
    GetCurrentMap(map, sizeof(map));
    GetMapDisplayName(map, map, sizeof(map));
    if((bAWP = !strncmp(map, "awp_", 4, false)) == hooked) return;

    if(!(hooked = !hooked))
        UnhookEvent("player_spawn", Event_Spawn);
    else HookEvent("player_spawn", Event_Spawn);
}

public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    RemoveWeaponBySlot(client, 0);
    RemoveWeaponBySlot(client, 1);
    while(RemoveWeaponBySlot(client, 3)) {}
    GivePlayerItem(client, "weapon_awp");
}

stock bool RemoveWeaponBySlot(int client, int slot)
{
    int ent = GetPlayerWeaponSlot(client, slot);
    return ent > MaxClients && RemovePlayerItem(client, ent) && AcceptEntityInput(ent, "Kill");
}

public void OnEntityCreated(int entity, const char[] classname)
{
    if(bAWP && entity > MaxClients && !strncmp(classname, "weapon_", 7, false) && strcmp(classname[7], "awp", false))
        AcceptEntityInput(entity, "Kill");
}
При спавне у игрока будет отбираться всё оружие, кроме ножа и будет выдана AWP. Также с карты будет удаляться всё вновь созданное оружие, кроме ножей и AWP.
Сообщения автоматически склеены:

Скрипт совместим с мастерской (так что должен работать на CS:S OB и CS:GO).
Удаляет нож
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
исправил
код обновил
Удаляет всё оружие вообще и не выдаёт

Удалось добиться, в общем, желаемого результата так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include sdktools_functions
#include sdktools_entinput

public Plugin myinfo    =
{
    name                = "Delete Deagle on AWP maps",
    author                = "Grey83",
    version                = "1.0",
    url                    = "hlmod.ru/threads/nekontroliruemyj-rost-entities.59625"
};

public void OnMapStart()
{
    static bool bHooked;
    char sMap[128];
   
    GetCurrentMap(sMap, sizeof sMap);
    GetMapDisplayName(sMap, sMap, sizeof sMap);
   
    if((!strncmp(sMap, "awp_", 4, false)) == bHooked) return;

    if(!(bHooked = !bHooked))    UnhookEvent("player_spawn",    eventPlayerSpawn);
    else                        HookEvent("player_spawn",    eventPlayerSpawn);
}

public void eventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    static int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid")))) return;

    RemoveWeaponBySlot(client, 0);
    RemoveWeaponBySlot(client, 1);
    RemoveWeaponBySlot(client, 2);
   
    GivePlayerItem(client, "weapon_knife");
    GivePlayerItem(client, "weapon_awp");
}

stock bool RemoveWeaponBySlot(int client, int slot)
{
    int iEntity = GetPlayerWeaponSlot(client, slot);
    return iEntity > MaxClients && RemovePlayerItem(client, iEntity) && AcceptEntityInput(iEntity, "Kill");
}
На всякий случай напишу, что проблема решена, если за ближайший день не увижу крашей. Я почти уверен, что их не будет, но хочу перестраховаться

UPD: Спасибо @Grey83!
 
Последнее редактирование:
Решение

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
@Paranoiiik, слот #2 - это нож, кстати
#3 - гранаты
В том и суть, что лично мне гранаты не нужны в данном решении, д и не видел я lego-карт с гранатами вроде. Решил удалять всё оружие в общем и выдавать нужное
 
Сверху Снизу