Неконтролируемый рост 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))...

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
@Paranoiiik, в строке 42 моего кода поменяй || на &&.
Возможно в этом проблема была.
Это очень странно.. всё работает отлично, если так сделать. Но в целом с этим кодом почему-то именно после awp карту нельзя сменить на $2000$, просто зависает сервер в попытке сменить.

Пофек крч, я задолбался проверять. Код выше, что я скинул, без OnEntityCreated, работает отлично, меня всё устраивает.
Всем большое спасибо за помощь!
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@Paranoiiik
C-подобный:
#pragma newdecls required

#include <sdkhooks>
#include <sdktools>
#include <cstrike>

bool isAWP;

static const char w_deagle[] = "deagle";

public void OnPluginStart() {
    for(int i = 1; i <= MaxClients ; i++)
        if(IsClientInGame(i) && !IsClientSourceTV(i))
            OnClientPutInServer(i);
}

public void OnMapStart() {

    char map[PLATFORM_MAX_PATH];
    GetCurrentMap(map, sizeof(map));
    GetMapDisplayName(map, map, 4);

    isAWP = strcmp(map, "awp_") == 0;
}

public void OnClientPutInServer(int iClient)
{
    if(!isAWP)
        return;

    SDKHook(iClient, SDKHook_WeaponEquipPost, OnEquipPost);
    SDKHook(iClient, SDKHook_WeaponDropPost, OnDropPost);
}

public void OnEntityCreated(int ent)
{
    if(!isAWP)
        return;
  
    if(!strcmp((GetEntityClassname_custom(ent))[7], w_deagle))
        SDKHook(ent, SDKHook_SpawnPost, OnSpawnPost);
}

public void OnEquipPost(int iClient, int weapon)
{
    if(!strcmp((GetEntityClassname_custom(weapon))[7], w_deagle))
        CS_DropWeapon(iClient, weapon, true, false);
}

public void OnDropPost(int iClient, int weapon)
{
    if(!strcmp((GetEntityClassname_custom(weapon))[7], w_deagle))
        OnSpawnPost(weapon);
}

public void OnSpawnPost(int ent)
{
    if(IsValidEntity(ent)) {
        RemoveEntity(ent);
        // AcceptEntityInput(ent, "kill");
   }
}

char[] GetEntityClassname_custom(int ent) {
    char className[MAX_NAME_LENGTH];
    GetEntityClassname(ent, className, sizeof(className));

    return className;
}
 
Последнее редактирование:

Lappland_Saluzzo

Мимо пробегал
Сообщения
128
Реакции
57
Удаляет всё оружие вообще и не выдаёт

Удалось добиться, в общем, желаемого результата так:
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!
Хочу дополнить, что если бы были две переменных, то была бы смена карты, а не вылеты движка.
sv_lowedict_action "3"
sv_lowedict_threshold "128"

Прописать в Autoexec.cfg для защиты от вылета Allow Free Edicts. Будут перезагружать карту при переполнении Edict-ов.
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
sv_lowedict_action "3"
sv_lowedict_threshold "128"
В этой игре нет таких переменных. Ну, может, кому-то для CS:GO в будущем пригодится.
Будут перезагружать карту при переполнении Edict-ов.
Конкретно в данной ситуации это совсем не выход. Карта перезапускалась бы слишком часто.
 
Сверху Снизу