Иконка ресурса

Weapon Cleanup 1.2

Сообщения
2,587
Реакции
1,344
Re: Weapon Cleanup v.1.2

Ирина Спирина, ну прописать в конфиг карты 2000 квар removeweapons_on - 1\0 Вкл.\Выкл. удаление оружий
в конфигах например de_dust2 прописать removeweapons_on 0
 

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет, помогите решить проблему. Взял исходник из 15 поста, вырезал все по максимум. Прописал свое для очистки с карты это molotov и pipe_bomb. Но вот беда плагин все очищает с карты оружия, аптечки и тд.
 

Вложения

  • weaponcleanup.sp
    1.8 КБ · Просмотры: 17

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Исправлено.
 

Вложения

  • l4d_item_cleanup.sp
    1.4 КБ · Просмотры: 49

hirowatch

Живет ХЛмод`ом
Сообщения
2,722
Реакции
1,634
Последнее редактирование:

Rimmer

Помогаю новичкам / Переводчик / Тестер / Заказчик
Сообщения
1,368
Реакции
753
Хотелось бы видеть таймер, например удалять оружия раз в n-кол.во секунд.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Хотелось бы видеть таймер, например удалять оружия раз в n-кол.во секунд.
C++:
#include <sourcemod>
#include <sdktools>

public Plugin myinfo =
{
    name = "SM Weapon Cleanup",
    author = "TechKnow & Palonez",
    description = "Removes loose weapons droped",
    version = "1.2.1",
    url = "http://www.sourcemod.net/"
};

ConVar cvRW, cvTimerDelete;
int g_WeaponParent;

public OnPluginStart()
{
    cvTimerDelete = CreateConVar("Removeweapons_Time", "10.0", "Cleanup every X seconds", 0|FCVAR_REPLICATED|FCVAR_NOTIFY);
    CreateConVar("sm_Weaponcleanup_version", "1.2.1", "WeaponCleanup version", 0|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
    cvRW = CreateConVar("Removeweapons_on", "1", "1 Removeweapons on 0 is off", 0|FCVAR_REPLICATED|FCVAR_NOTIFY);
    g_WeaponParent = FindSendPropOffs("CBaseCombatWeapon", "m_hOwnerEntity");
    RegAdminCmd("sm_cleanup", Command_Manual, ADMFLAG_SLAY);
    HookEventEx("player_death", Cleanup, EventHookMode_Post);
    HookEventEx("round_start", Cleanup, EventHookMode_Post);
    if(GetConVarFloat(cvTimerDelete) > 0.0) CreateTimer(GetConVarFloat(cvTimerDelete), CleanUpTimer, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public Action Cleanup(Event event,const char[] name,bool dontBroadcast)
{
    // By Kigen (c) 2008 - Please give me credit. :)
    if(!GetConVarBool(cvRW)) return Plugin_Continue;
    GlobalAction();
    return Plugin_Continue;
}

public Action Command_Manual(int client, int args)
{
    GlobalAction();
    return Plugin_Continue;
}

public Action CleanUpTimer(Handle hTimer)
{
    GlobalAction();
    return Plugin_Continue;
}

stock void GlobalAction()
{
    int i = MaxClients, max = GetMaxEntities();
    while(++i < max)
    {
        if(IsValidEntity(i) && GetEdictClassname(i, weapon, sizeof(weapon))
        && (!strncmp(weapon, "weapon_", 7, false) || !strncmp(weapon, "item_", 5, false))
        && GetEntDataEnt2(i, g_WeaponParent) == -1)
            AcceptEntityInput(i, "KillHierarchy");
    }
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Кмк, так будет работать несколько лучше (и быстрее, ну и с убийством энтити будет меньше проблем):
C-подобный:
stock void GlobalAction()
{
    int i = MaxClients, max = GetMaxEntities();
    while(++i < max)
    {
        if(IsValidEntity(i) && GetEdictClassname(i, weapon, sizeof(weapon))
        && (!strncmp(weapon, "weapon_", 7, false) || !strncmp(weapon, "item_", 5, false))
        && GetEntDataEnt2(i, g_WeaponParent) == -1)
            AcceptEntityInput(i, "KillHierarchy");
    }
}
Сообщения автоматически склеены:

Ну и первый индекс должен быть больше, чем MaxClients (так как это индекс последнего клиента и он не может быть оружием или предметом). 😏
 

Rimmer

Помогаю новичкам / Переводчик / Тестер / Заказчик
Сообщения
1,368
Реакции
753
@Palonez @Grey83
Не компилируется
C-подобный:
d:\Hentai\scripting\WeaponClean.sp(21) : warning 234: symbol "FindSendPropOffs" is marked as deprecated: Use FindSendPropInfo instead, or HasEntProp if you just want to check for existence.
d:\Hentai\scripting\WeaponClean.sp(53) : error 017: undefined symbol "weapon"
d:\Hentai\scripting\WeaponClean.sp(53) : error 072: "sizeof" operator is invalid on "function" symbols
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Rimmer, вот так компилируется:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_entinput>

Handle
    hTimer;
int
    iOffset;
float
    fTimer;

public Plugin myinfo =
{
    name = "SM Weapon Cleanup",
    author = "TechKnow & Palonez",
    description = "Removes loose weapons droped",
    version = "1.3.0 (rewritten by Grey83)",
    url = "http://www.sourcemod.net/"
}

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    if((iOffset = FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity")) < 1)
    {
        FormatEx(error, err_max, "Can't find offset 'CBaseCombatWeapon::m_hOwnerEntity'!");
        return APLRes_Failure;
    }

    return APLRes_Success;
}

public void OnPluginStart()
{
    CreateConVar("sm_Weaponcleanup_version", "1.2.1", "WeaponCleanup version", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);

    ConVar cvar;
    cvar = CreateConVar("Removeweapons_on", "1", "1 Removeweapons on 0 is off", _, true, _, true, 1.0);
    cvar.AddChangeHook(CVarChange_Enable);
    CVarChange_Enable(cvar, NULL_STRING, NULL_STRING);

    cvar = CreateConVar("Removeweapons_Time", "10.0", "Cleanup every X seconds", _, true);
    cvar.AddChangeHook(CVarChange_Timer);
    CVarChange_Timer(cvar, NULL_STRING, NULL_STRING);

    RegAdminCmd("sm_cleanup", Cmd_CleanUp, ADMFLAG_SLAY);
}

public void CVarChange_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    static bool hooked;
    if(cvar.BoolValue == hooked) return;

    if((hooked = !hooked))
    {
        HookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        HookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
    else
    {
        UnhookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        UnhookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
}

public void CVarChange_Timer(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue;

    OnMapEnd();
    OnMapStart();
}

public void OnMapStart()
{
    if(!hTimer && fTimer > 0.0) hTimer = CreateTimer(fTimer, Timer_CleanUp, TIMER_REPEAT);
}

public void OnMapEnd()
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
}

public Action Cmd_CleanUp(int client, int args)
{
    RemoveWeapons();
    return Plugin_Handled;
}

public void Event_CleanUp(Event event, const char[] name, bool dontBroadcast)
{
    RemoveWeapons();
}

public Action Timer_CleanUp(Handle timer)
{
    RemoveWeapons();
    return Plugin_Continue;
}

stock void RemoveWeapons()
{
    int ent = MaxClients, max = GetMaxEntities();
    char cls[8];
    while(++ent < max)
    {
        if(IsValidEntity(ent) && GetEdictClassname(ent, cls, sizeof(cls))
        && (!strncmp(cls, "weapon_", 7, false) || !strncmp(cls, "item_", 5, false))
        && GetEntDataEnt2(ent, iOffset) == -1)
            AcceptEntityInput(ent, "KillHierarchy");
    }
}
 
Последнее редактирование:

Zeit

Участник
Сообщения
180
Реакции
34
@Rimmer, вот так компилируется:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_entinput>

Handle
    hTimer;
int
    iOffset;
float
    fTimer;

public Plugin myinfo =
{
    name = "SM Weapon Cleanup",
    author = "TechKnow & Palonez",
    description = "Removes loose weapons droped",
    version = "1.3.0 (rewritten by Grey83)",
    url = "http://www.sourcemod.net/"
}

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    if((iOffset = FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity")) < 1)
    {
        FormatEx(error, err_max, "Can't find offset 'CBaseCombatWeapon::m_hOwnerEntity'!");
        return APLRes_Failure;
    }

    return APLRes_Success;
}

public void OnPluginStart()
{
    CreateConVar("sm_Weaponcleanup_version", "1.2.1", "WeaponCleanup version", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);

    ConVar cvar;
    cvar = CreateConVar("Removeweapons_on", "1", "1 Removeweapons on 0 is off", _, true, _, true, 1.0);
    cvar.AddChangeHook(CVarChange_Enable);
    CVarChange_Enable(cvar, NULL_STRING, NULL_STRING);

    cvar = CreateConVar("Removeweapons_Time", "10.0", "Cleanup every X seconds", _, true);
    cvar.AddChangeHook(CVarChange_Timer);
    CVarChange_Timer(cvar, NULL_STRING, NULL_STRING);

    RegAdminCmd("sm_cleanup", Cmd_CleanUp, ADMFLAG_SLAY);
}

public void CVarChange_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    static bool hooked;
    if(cvar.BoolValue == hooked) return;

    if((hooked = !hooked))
    {
        HookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        HookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
    else
    {
        UnhookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        UnhookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
}

public void CVarChange_Timer(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue;

    OnMapEnd();
    OnMapStart();
}

public void OnMapStart()
{
    if(!hTimer && fTimer > 0.0) hTimer = CreateTimer(fTimer, Timer_CleanUp, TIMER_REPEAT);
}

public void OnMapEnd()
{
    if(hTimer)
    {
        CloneHandle(hTimer);
        hTimer = null;
    }
}

public Action Cmd_CleanUp(int client, int args)
{
    RemoveWeapons();
    return Plugin_Handled;
}

public void Event_CleanUp(Event event, const char[] name, bool dontBroadcast)
{
    RemoveWeapons();
}

public Action Timer_CleanUp(Handle timer)
{
    RemoveWeapons();
    return Plugin_Continue;
}

stock void RemoveWeapons()
{
    int ent = MaxClients, max = GetMaxEntities();
    char cls[8];
    while(++ent < max)
    {
        if(IsValidEntity(ent) && GetEdictClassname(ent, cls, sizeof(cls))
        && (!strncmp(cls, "weapon_", 7, false) || !strncmp(cls, "item_", 5, false))
        && GetEntDataEnt2(ent, iOffset) == -1)
            AcceptEntityInput(ent, "KillHierarchy");
    }
}
Exception reported: Handle 67d0036b cannot be cloned because it is invalid (error 1)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Zeit, в строке 83 замени CloneHandle(hTimer); на CloseHandle(hTimer);
 
  • Мне нравится
Реакции: Zeit

Zeit

Участник
Сообщения
180
Реакции
34
@Zeit, в строке 83 замени CloneHandle(hTimer); на CloseHandle(hTimer);
L 02/16/2023 - 14:46:14: [SM] Exception reported: Handle 63700463 is invalid (error 3)
L 02/16/2023 - 14:46:14: [SM] Blaming: WeaponClean.smx
L 02/16/2023 - 14:46:14: [SM] Call stack trace:
L 02/16/2023 - 14:46:14: [SM] [0] CloseHandle
L 02/16/2023 - 14:46:14: [SM] [1] Line 83, C:\Users\User\Desktop\comp\scripting\WeaponClean.sp::OnMapEnd
L 02/16/2023 - 14:46:14: Error log file session closed.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Exception reported: Handle 63700463 is invalid (error 3)
Странно. Как это у тебя получается ты точно мой код больше никак не менял?
Просто не может у хэндла быть такое значение, если в коде не менялось ничего в создании и взаимодействии с таймером.
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Пофиксил баг, когда помимо оружий удалялась и C4
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_entinput>

Handle
    hTimer;
int
    iOffset;
float
    fTimer;

public Plugin myinfo =
{
    name = "SM Weapon Cleanup",
    author = "TechKnow & Palonez",
    description = "Removes loose weapons droped",
    version = "1.3.0 (rewritten by Grey83)",
    url = "http://www.sourcemod.net/"
}

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    if((iOffset = FindSendPropInfo("CBaseCombatWeapon", "m_hOwnerEntity")) < 1)
    {
        FormatEx(error, err_max, "Can't find offset 'CBaseCombatWeapon::m_hOwnerEntity'!");
        return APLRes_Failure;
    }

    return APLRes_Success;
}

public void OnPluginStart()
{
    CreateConVar("sm_Weaponcleanup_version", "1.2.1", "WeaponCleanup version", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);

    ConVar cvar;
    cvar = CreateConVar("Removeweapons_on", "1", "1 Removeweapons on 0 is off", _, true, _, true, 1.0);
    cvar.AddChangeHook(CVarChange_Enable);
    CVarChange_Enable(cvar, NULL_STRING, NULL_STRING);

    cvar = CreateConVar("Removeweapons_Time", "10.0", "Cleanup every X seconds", _, true);
    cvar.AddChangeHook(CVarChange_Timer);
    CVarChange_Timer(cvar, NULL_STRING, NULL_STRING);

    RegAdminCmd("sm_cleanup", Cmd_CleanUp, ADMFLAG_SLAY);
}

public void CVarChange_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    static bool hooked;
    if(cvar.BoolValue == hooked) return;

    if((hooked = !hooked))
    {
        HookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        HookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
    else
    {
        UnhookEvent("player_death", Event_CleanUp, EventHookMode_PostNoCopy);
        UnhookEvent("round_start", Event_CleanUp, EventHookMode_PostNoCopy);
    }
}

public void CVarChange_Timer(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    fTimer = cvar.FloatValue;

    OnMapEnd();
    OnMapStart();
}

public void OnMapStart()
{
    if(!hTimer && fTimer > 0.0) hTimer = CreateTimer(fTimer, Timer_CleanUp, TIMER_REPEAT);
}

public void OnMapEnd()
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }
}

public Action Cmd_CleanUp(int client, int args)
{
    RemoveWeapons();
    return Plugin_Handled;
}

public void Event_CleanUp(Event event, const char[] name, bool dontBroadcast)
{
    RemoveWeapons();
}

public Action Timer_CleanUp(Handle timer)
{
    RemoveWeapons();
    return Plugin_Continue;
}

stock void RemoveWeapons()
{
    int ent = MaxClients, max = GetMaxEntities();
    char cls[10];
    while(++ent < max)
    {
        if(IsValidEntity(ent) && GetEdictClassname(ent, cls, sizeof(cls)) && ((!strncmp(cls, "weapon_", 7, false) && strncmp(cls, "weapon_c4", 9, false)) || !strncmp(cls, "item_", 5, false)) && GetEntDataEnt2(ent, iOffset) == -1)

            AcceptEntityInput(ent, "KillHierarchy");
    }
}

Компилится без проблем, SM 11
 

Вложения

  • weaponcleanup.sp
    3 КБ · Просмотры: 17
  • weaponcleanup.smx
    4.6 КБ · Просмотры: 8

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Пофиксил баг, когда помимо оружий удалялась и C4
Тогда уж лучше так, кмк.

Добавил автоматическое создание конфига и переделал поиск оружия (вроде должен чуток шустрее работать).
 

Вложения

  • sm_weaponcleanup 1.3.1.sp
    3.1 КБ · Просмотры: 58

SteelSeries

Участник
Сообщения
44
Реакции
2
Re: Weapon Cleanup v.1.2

Если нужно вот моя версия :-D
/ 1 Removeweapons c4 on 0 is off
// - удаление бомбы
// Default: "0"
Removeweapons_c4_on "0"

// 1 Removeweapons grenade on 0 is off
// - удаление гранат
// Default: "0"
Removeweapons_grenade_on "0"

// 1 Removeweapons on 0 is off
// - удаление оружия
// Default: "1"
Removeweapons_on "0"
Могу сделать отдельно грены для удаление, если нужно пишите сюда :)
Привет, можешь сделать так, чтобы все гранаты оставались на месте (я использую стриппер), а все оружия удалялись:
1)При убийстве
2)При спавне игроков
И если возможно таймер сделать чтобы можно было удалить оружие в течении "N" секунд.
 
Сверху Снизу