[CS:S] Add New Weapons (Fixing)

ehsank5465

Участник
Сообщения
10
Реакции
0
bump
 

Вложения

  • Compiler1.8.rar
    573.2 КБ · Просмотры: 78
  • Codes and plugins.rar
    21.9 КБ · Просмотры: 126
  • models materials sounds.rar
    17.2 МБ · Просмотры: 116
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Вы решили, что если плагин пропадал зря, то при публикации его здесь - он не пропадет? Если вам нужно его исправить, есть несколько путей:
  1. Создавайте тему в разделе услуг/ищите того, кто исправит
  2. Исправляйте сами
  3. Пишите в раздел написание плагинов
В противном случае, он будет также "Пропадать"
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Пролистал код плагина:
  1. нужно исправлять отступы (много где вперемешку в одной строке табуляция и пробелы)
  2. намешан старый и новый синтаксис
  3. у кваров присутствует флаг FCVAR_PLUGIN, на который будет ругаться компилятор новых версий SM
  4. создание переменных внутри цикла (иногда можно вообще без них обойтись)
В общем переписывать там много только для того чтобы привести в пристойный вид.

Если не забуду и будут время и настроение, то возможно завтра почищу код. Но это не точно.
Сообщения автоматически склеены:

И да, текст в переводе гугла как всегда понятен не в каждом предложении. =)
Оригинал текста не помешал бы.
 

ehsank5465

Участник
Сообщения
10
Реакции
0
Вы решили, что если плагин пропадал зря, то при публикации его здесь - он не пропадет? Если вам нужно его исправить, есть несколько путей:
  1. Создавайте тему в разделе услуг/ищите того, кто исправит
  2. Исправляйте сами
  3. Пишите в раздел написание плагинов
В противном случае, он будет также "Пропадать"
извините первый раз на этом сайте
Сообщения автоматически склеены:

Пролистал код плагина:
  1. нужно исправлять отступы (много где вперемешку в одной строке табуляция и пробелы)
  2. намешан старый и новый синтаксис
  3. у кваров присутствует флаг FCVAR_PLUGIN, на который будет ругаться компилятор новых версий SM
  4. создание переменных внутри цикла (иногда можно вообще без них обойтись)
В общем переписывать там много только для того чтобы привести в пристойный вид.

Если не забуду и будут время и настроение, то возможно завтра почищу код. Но это не точно.
Сообщения автоматически склеены:

И да, текст в переводе гугла как всегда понятен не в каждом предложении. =)
Оригинал текста не помешал бы.


извините мой родной язык не английский или русский
 

Вложения

  • eng.txt
    3 КБ · Просмотры: 29
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Почистил немного этот говнокод и сделал целиком на новом синтаксисе (теперь компилится начиная с 1.8 и до 1.12 без предупреждений и ошибок).
Но там ещё исправлять и исправлять.
Сообщения автоматически склеены:

Изменения в 2.0.0:
  • Почистил и пооптимизировал до чего руки дошли.
  • Добавил меню оружия (команда sm_new_weapons). В меню указывается цена покупки. Оно доступно только живым игрокам и пока не истекло время установленное кваром sm_allow_buytime. Как и команда sm_%имя оружия%.
  • Перевёл хранение настроек оружия со статичных массивов на StringMap (экономия памяти).
  • О неправильно заполненных строках в файле настроек configs/NewWeaponsInfo.txt плагин будет писать в лог ошибок с указанием номера строки (номер начинается с 1).
  • Добавил проверки на дубли (если будет одно и то же имя у оружия, то об этом будет записано в лог ошибок).
  • Также будет проверять существование команды на сервере, прежде чем пытаться её добавить (если уже существует, то напишет об этом в лог ошибок). И будет удалять отлов несуществующих команд плагина (при смене карты будет чистить и добавлять новые).
  • Добавляемые модельки и звуки будут не только кешироваться, но и добавляться в загрузку (надо бы ещё придумать как организовать добавление в загрузку текстур и остальных файлов моделей, с расширением отличным от mdl).
  • Добавил проверки индекса игрока в таймерах на всякий случай.
 

Вложения

  • sm_new_weapons 1.1.0 .sp
    14.3 КБ · Просмотры: 56
  • sm_new_weapons 2.0.0_05.08.2023.sp
    13.4 КБ · Просмотры: 89
Последнее редактирование:

ehsank5465

Участник
Сообщения
10
Реакции
0
поэтому я протестировал вашу версию плагина (sm_new_weapons 1.1.0 .sp)
плагин работает отлично, в логах компилятора нет ошибок, и проблема с боеприпасами решена, однако есть некоторые проблемы, если вы могли бы улучшить
1. Прекращение оригинального звука выстрелов (это был метод FrozDark для звуковой версии custom_weapons)
2. То же мерцание оружия и проблема со вспышкой
3. я заметил, что вы каким-то образом отключили исходный звук перезарядки, поэтому вы можете добавить код для пользовательских звуков перезарядки оружия (звук воспроизводится, когда кто-то перезаряжает оружие)
 

ehsank5465

Участник
Сообщения
10
Реакции
0
я кусок кода отвечающий за метод блокировки/замену звуков не менял
ну, я думаю, его не существовало с самого начала, но плагин был в беспорядке и не работал должным образом, когда я его тестировал.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@ehsank5465, а что на счёт версии 2.0.0?
Почти весь день на переписывание потратил.
 

ehsank5465

Участник
Сообщения
10
Реакции
0

ehsank5465

Участник
Сообщения
10
Реакции
0
Публикация больших блоков текста/изображений
@ehsank5465, what about version 2.0.0?
I spent almost the whole day rewriting.
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 1: "<at4rpg><ump45><1><zst_v2/at4/at4-1.wav><10>
<2.47><0.01><15000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 2: "<balrog7><galil><1><zst_v2/balrog7/balrog7-1.wav><500><2.37><0.01><9100>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 3: "<balrog11><xm1014><1><zst_v2/balrog11/balrog11-1.wav><180><3.47><0.01><8700>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 4: "<barlog47><ak47><1><weapons/ak47/ak47-1.wav><540><1.97><0.01><4200>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 5: "<blaster><p90><1><zst_v2/blaster/fire.wav><600><1.75><0.01><5000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 6: "<blasterpistol><p228><10><zst_v2/blasterpistol/sfpistol_shoot5.wav><300><0.80><0.01><5000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 7: "<csoknifefemale><knife><0><><><1.35><0.01><1000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 8: "<cv47long><sg552><1><zst_v2/cv47/cv47_shoot1.wav><750><2.00><0.01><6800>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 9: "<dualdeagle><elite><1><zst_v2/dualdeagle/dde-1.wav><240><2.50><0.01><4800>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 10: "<dualmp7><tmp><1><zst_v2/dualuzi/dual_uzi_fire1.wav><680><2.10><0.01><7200>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 11: "<dualslinger><elite><0><><500><2.00><0.01><6800>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 12: "<dualuzi><tmp><1><zst_v2/dualuzi/dual_uzi_fire1.wav><800><2.25><0.01><6900>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 13: "<flamethrower><mac10><0><><500><1.07><0.01><9000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 14: "<janusmk5><famas><1><zst_v2/janusmk5/janusmk5-12.wav><950><1.90><0.01><4100>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 15: "<m4a1gold><m4a1><1><weapons/m4a1/m4a1-1.wav><750><1.7><0.01><6200>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 16: "<m79grenadelauncher><fiveseven><0><><0><2.00><0.01><4000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 17: "<m134><m249><1><zst_v2/m134/m134_shoot1.wav><1600><2.15><0.01><12000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 18: "<m1887xmas><m3><1><zst_v2/m1887/m1887xmas-2.wav><180><1.8><0.01><3500>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 19: "<frostbomb><flashbang><0><><><1.00><0.01><2500>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 20: "<flamebomb><hegrenade><0><><><1.00><0.01><2000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 21: "<poisonbomb><flashbang><0><><><1.00><0.01><3000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 22: "<skull5><sg550><1><zst_v2/skull5/skull5.wav><375><1.6><0.01><6500>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 23: "<skullsniper><g3sg1><1><zst_v2/skull3/m14-1.wav><400><1.8><0.01><8000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 24: "<starchasersnip><scout><1><zst_v2/starchaser/starchaserar-1.wav><200><2.77><0.01><5000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 25: "<thunderboltultra><awp><1><zst_v2/thunderbolt/sfsniper-1.wav><0><4.50><0.01><10000>
".
L 08/17/2023 - 15:51:08: [sm_new_weapons2.smx] Invalid parameters at line 26: "<xtracker><aug><1><zst_v2/xlaser/lockongun_shoot1.wav><800><1.37><0.01><7200>".
Added new weapons: 0 (with sound: 0)
Added commands: 0

did you also change how the code must be written in the NewWeapons.txt? cause now i got all of this
 
Последнее редактирование модератором:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

Вложения

  • sm_new_weapons 2.0.1_18.08.2023.sp
    13.4 КБ · Просмотры: 52
Последнее редактирование:

Vanooo123

Участник
Сообщения
206
Реакции
64
1713290247428.png
wwhy?
 

Vanooo123

Участник
Сообщения
206
Реакции
64
версия плагина и содержимое конфига?
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>
#include <sdktools_entinput>
#include <sdktools_functions>
#include <sdktools_sound>
#include <sdktools_stringtables>

static const char
    PL_NAME[]    = "New Weapons",
    PL_VER[]    = "2.0.1_18.08.2023";

bool
    bEnable;
int
    iTime;

ArrayList
    hCmds;
StringMap
    hParent,
    hPlay,
    hSound,
    hAmmo,
    hDmgMult,
    hAccuracy,
    hPrice;
Menu
    hMenu;
float
    fStart;

public Plugin myinfo =
{
    name        = PL_NAME,
    version        = PL_VER,
    description    = "<- Add New Weapons ->",
    author        = "cjsrk, Grey83"
}

public void OnPluginStart()
{
    CreateConVar("sm_new_weapons_version", PL_NAME, PL_VER, FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);

    ConVar cvar;
    cvar = CreateConVar("sm_new_weapons_enable", "1", "Whether to enable the plugin (1: enabled; 0: disabled)", _, true, _, true, 1.0);
    HookConVarChange(cvar, CVarChange_Enable);
    bEnable = GetConVarBool(cvar);

    cvar = CreateConVar("sm_allow_buytime", "30", "Set the time limit for acquiring new weapons after the start of the round, unit: seconds (range: 5-300 seconds)", _, true, 5.0, true, 300.0);
    HookConVarChange(cvar, CVarChange_Time);
    iTime = GetConVarInt(cvar);

    AutoExecConfig(true, "plugin.new_weapons");

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("weapon_fire", Event_WeaponOldSound);

    RegConsoleCmd("sm_new_weapons", Cmd_Menu, "Menu for buying new weapons");

    hCmds = new ArrayList(ByteCountToCells(36));
    hParent = new StringMap();
    hPlay = new StringMap();
    hSound = new StringMap();
    hAmmo = new StringMap();
    hDmgMult = new StringMap();
    hAccuracy = new StringMap();
    hPrice = new StringMap();
}

public void CVarChange_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    bEnable = cvar.BoolValue;
}

public void CVarChange_Time(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iTime = cvar.IntValue;
}

public void OnMapStart()
{
    fStart = 0.0;
    delete hMenu;

    char buffer[PLATFORM_MAX_PATH];
    char data[8][64];
    while(hCmds.Length)
    {
        hCmds.GetString(0, buffer, sizeof(data[]) + 4);
        hCmds.Erase(0);
        RemoveCommandListener(Cmd_GetWeapon, buffer);
    }

    if(hParent.Size)
    {
        hParent.Clear();
        hPlay.Clear();
        hSound.Clear();
        hAmmo.Clear();
        hDmgMult.Clear();
        hAccuracy.Clear();
        hPrice.Clear();
    }

    BuildPath(Path_SM, buffer, PLATFORM_MAX_PATH, "configs/NewWeaponsInfo.txt");
    File file = OpenFile(buffer, "r");
    if(!file)
    {
        LogError("Can't open config \"%s\".", buffer);
        return;
    }

    int i_buffer, num;
    float f_buffer;
    while(ReadFileLine(file, buffer, sizeof(buffer)))
    {
        num++;
        if(strlen(buffer) < 21 || buffer[0] != '<'
        || ExplodeString(buffer[1], "><", data, sizeof(data), sizeof(data[])) < 8
        || !TrimString(data[0]) || !TrimString(data[1]))
        {
            LogError("Invalid parameters at line %i: \"%s\".", num, buffer);
            continue;
        }

        if(hParent.GetString(data[0], buffer, 32))
        {
            LogError("Weapon \"%s\" (at line %i) already exists.", data[0], num);
            continue;
        }

        hParent.SetString(data[0], data[1]);

        FormatEx(buffer, sizeof(buffer), "models/weapons/v_%s.mdl", data[0]);
        PrecacheModel(buffer);
        AddFileToDownloadsTable(buffer);
        buffer[15] = 'w';
        PrecacheModel(buffer);
        AddFileToDownloadsTable(buffer);

        static const char postfix[][] = {"_silencer", "_dropped", "_thrown"};
        int type = -1;
        if(!strcmp(data[0], "usp") || !strcmp(data[0], "m4a1"))
            type = 0;
        else if(!strcmp(data[0], "elite"))
            type = 1;
        else if(!strcmp(data[0], "hegrenade"))
            type = 2;

        if(type != -1)
        {
            FormatEx(buffer, sizeof(buffer), "models/weapons/w_%s%s.mdl", data[0], postfix[type]);
            if(FileExists(buffer, true))
            {
                PrecacheModel(buffer);
                AddFileToDownloadsTable(buffer);
            }
        }

        FormatEx(buffer, sizeof(data[]) + 4, "sm_%s", data[0]);
        if(!CommandExists(buffer))
        {
            hCmds.PushString(buffer);
            AddCommandListener(Cmd_GetWeapon, buffer);
        }
        else LogError("Command \"%s\" already exists.", buffer);

        if(!TrimString(data[2]) || (i_buffer = StringToInt(data[2])) < 0 || i_buffer > 2) i_buffer = 0;
        hPlay.SetValue(data[0], i_buffer);

        if(i_buffer)
        {
            if((i_buffer = TrimString(data[3]) - 4) > 0
            && (!strcmp(data[3][i_buffer], ".wav", false) || !strcmp(data[3][i_buffer], ".mp3", false)))
            {
                hSound.SetString(data[0], data[3]);
                PrecacheSound(data[3]);
                FormatEx(buffer, sizeof(buffer), "sound/%s", data[3]);
                AddFileToDownloadsTable(buffer);
            }
            else
            {
                hPlay.SetValue(data[0], 0);
                LogError("Invalid sound for weapon \"%s\": \"%s\".", data[0], data[3]);
            }
        }

        if(TrimString(data[4]) && (i_buffer = StringToInt(data[4])) > 0)
            hAmmo.SetValue(data[0], i_buffer);

        if(TrimString(data[5]) && (f_buffer = StringToFloat(data[5])) > 0.0)
            hDmgMult.SetValue(data[0], f_buffer);

        if(TrimString(data[6]) && (f_buffer = StringToFloat(data[6])) > 0.0 && f_buffer <= 1.0)
            hAccuracy.SetValue(data[0], f_buffer);

        if((i_buffer = strlen(data[7]) - 1) > 0)
        {
            data[7][i_buffer] = 0;
            if(TrimString(data[7]) && (i_buffer = StringToInt(data[7])) > 0)
                hPrice.SetValue(data[0], i_buffer);
        }

        if(!hMenu) hMenu = new Menu(Handler_Menu);
        FormatEx(buffer, sizeof(buffer), "%s • $%i", data[0], i_buffer);
        data[0][0] = CharToUpper(data[0][0]);
        hMenu.AddItem(data[0], buffer);
    }
    file.Close();

    PrintToServer("Added new weapons: %i (with sound: %i)\nAdded commands: %i", hParent.Size, hSound.Size, hCmds.Length);
    if(!hParent.Size)
        return;

    hMenu.SetTitle("New weapons (%i pcs):", hMenu.ItemCount);
    hMenu.ExitButton = true;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    fStart = GetGameTime();
}

public Action Cmd_GetWeapon(int client, const char[] command, int argc)
{
    if(client) GiveWeapon(client, command[3]);

    return Plugin_Handled;
}

public Action Cmd_Menu(int client, int args)
{
    if(!client)
        return Plugin_Handled;

    if(!bEnable || !hMenu)
        PrintToChat(client, "No weapons available.");
    else if(GetClientTeam(client) < 2 || !IsPlayerAlive(client))
        PrintToChat(client, "Only alive players can buy weapons.");
    else if(fStart + iTime < GetGameTime())
        PrintToChat(client, "You can no longer get weapons in this round!.");
    else hMenu.Display(client, MENU_TIME_FOREVER);

    return Plugin_Handled;
}

public int Handler_Menu(Menu menu, MenuAction action, int client, int param)
{
    if(action == MenuAction_Select)
    {
        char buffer[32];
        hMenu.GetItem(param, buffer, sizeof(buffer));
        GiveWeapon(client, buffer, true);
    }
    return 0;
}

void GiveWeapon(int client, const char[] weapon, const bool menu = false)
{
    if(!bEnable)
    {
        PrintToChat(client, "No weapons available.");
        return;
    }

    if(GetClientTeam(client) < 2 || !IsPlayerAlive(client))
    {
        PrintToChat(client, "Only alive players can buy weapons.");
        return;
    }

    if(fStart + iTime < GetGameTime())
    {
        PrintToChat(client, "You can no longer get weapons in this round!.");
        return;
    }

    char parent[32];
    if(!hParent.GetString(weapon, parent, sizeof(parent)))
    {
        PrintToChat(client, "Weapon \"%s\" is not available.", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    int price, money = GetEntProp(client, Prop_Send, "m_iAccount");
    if(hPrice.GetValue(weapon, money) && (money -= price) >= 0)
    {
        PrintToChat(client, "Not enough money to buy.");
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    static const char prefix[] = "weapon_%s";
    char buffer[40];

    hParent.GetString(weapon, parent, sizeof(parent));
    FormatEx(buffer, sizeof(buffer), prefix, parent);
    int ent = CreateEntityByName(buffer);
    if(ent == -1)
    {
        LogError("Can't create entity \"%s\"", buffer);
        PrintToChat(client, "Can't create weapon \"%s\".", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    FormatEx(buffer, sizeof(buffer), prefix, weapon);
    DispatchKeyValue(ent, "classname", buffer);

    bool have_ammo, knife = !strcmp(parent, "knife");
    int ammo;
    if(hAmmo.GetValue(weapon, ammo) && (have_ammo = ammo && !knife && strcmp(parent, "hegrenade")))
    {
        FormatEx(buffer, sizeof(buffer), "%i", ammo);
        DispatchKeyValue(ent,"ammo", buffer);
    }

    if(!DispatchSpawn(ent))
    {
        LogError("Can't spawn entity \"%s\" (%s)", weapon, buffer);
        PrintToChat(client, "Can't spawn weapon \"%s\".", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    ActivateEntity(ent);

    int i_buffer;
    if(knife && (i_buffer = GetPlayerWeaponSlot(client, 2)) != -1)
    {
        SDKHooks_DropWeapon(client, i_buffer);
        AcceptEntityInput(i_buffer, "Kill");
    }

    EquipPlayerWeapon(client, ent);
    if(price) SetEntProp(client, Prop_Send, "m_iAccount", money);

    if(have_ammo && (i_buffer = GetEntProp(ent, Prop_Data, "m_iPrimaryAmmoType")) > -1
    && GetEntProp(client, Prop_Data, "m_iAmmo", 4, i_buffer) < 1)
        SetEntProp(client, Prop_Data, "m_iAmmo", ammo, 4, i_buffer);
}

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
    SDKHook(client, SDKHook_PostThink, OnPostThink);
}

//Modify the new weapon damage value function
public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)
{
    if(attacker != inflictor || inflictor > MaxClients)
        return Plugin_Continue;

    if(!IsValidEntity(attacker))
        return Plugin_Continue;

    if(HasEntProp(attacker, Prop_Send, "m_hActiveWeapon") == false)
        return Plugin_Continue;

    int weapon = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
    if(!IsValidEdict(weapon) || (weapon == -1))
        return Plugin_Continue;

    static char sWeapon[40];
    GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    char parent[32];
    if(!hParent.GetString(sWeapon, parent, sizeof(parent))
    //This function has no effect on grenades
    || !strcmp(parent, "hegrenade"))
        return Plugin_Continue;

    float mult;
    if(!hDmgMult.GetValue(sWeapon, mult))
        return Plugin_Continue;

    //New weapon damage multiplier, the initial damage value of the new weapon is equal to the damage value of the parent weapon. 1.0 means unchanged, 2.0 means change the damage value of the new weapon to twice the initial damage value
    damage *= mult;
    return Plugin_Changed;
}

//Modified new weapon accuracy difference function
public void OnPostThink(int client)
{
    if(!(GetClientButtons(client) & IN_ATTACK))
            return;

    int weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");
    if(!IsValidEdict(weapon) || (weapon == -1))
        return;

    static char sWeapon[40];
    GetClientWeapon(client, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    char parent[32];
    if(!hParent.GetString(sWeapon, parent, sizeof(parent))
    || !strcmp(parent, "hegrenade") || !strcmp(parent, "knife"))
        return;

    float mult;
    if(hAccuracy.GetValue(sWeapon, mult)) SetEntPropFloat(weapon, Prop_Send, "m_fAccuracyPenalty", mult);
}

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

    FadeClientVolume(client, 100.0, 0.0, 0.04, 0.0);
    CreateTimer(0.04, Timer_PlayNewSound, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_PlayNewSound(Handle timer, int client)
{
    if(!(client = GetClientOfUserId(client)))
        return Plugin_Stop;

    int weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");
    if(weapon == -1)
        return Plugin_Stop;

    char sWeapon[40];
    GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    int play;
    hPlay.GetValue(sWeapon, play);
    char buffer[32];
    if(play)
    {
        hSound.GetString(sWeapon, buffer, sizeof(buffer));
        if(play == 1)
            ClientCommand(client, "play %s", buffer);
        else EmitSoundToClient(client, buffer, weapon, 1);
        return Plugin_Stop;
    }

    if(hParent.GetString(sWeapon, buffer, sizeof(buffer)) && !strcmp(buffer, "hegrenade"))
    {
        DataPack dp = new DataPack();
        dp.WriteCell(GetClientUserId(client));
        dp.WriteString(sWeapon);
        CreateTimer(0.01, Hegrenade_Throw, dp, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE);
    }

    return Plugin_Stop;
}

//Change the function of the grenade throwing model to fix the problem that the old version of the gun add-on cannot load the grenade throwing model (bug)
public Action Hegrenade_Throw(Handle timer, DataPack dp)
{
    dp.Reset();
    int client = dp.ReadCell();
    if(!(client = GetClientOfUserId(client)))
    {
        CloseHandle(dp);
        return Plugin_Stop;
    }

    char weapon[32];
    dp.ReadString(weapon, sizeof(weapon));
    CloseHandle(dp);

    int ent = -1, lastent;
    while((ent = FindEntityByClassname(ent, "hegrenade_projectile")) != -1)
    {
        if(IsValidEntity(ent) && GetEntPropEnt(ent, Prop_Send, "m_hThrower") == client)
            break;

        if((ent = FindEntityByClassname(ent, "hegrenade_projectile")) == lastent)
        {
            ent = -1;
            break;
        }

        lastent = ent;
    }

    if(ent != -1)
    {
        char path[64];
        FormatEx(path, sizeof(path), "models/weapons/w_%s_thrown.mdl", weapon);
        //If the new grenade comes with a throw model, loads the new grenade's throw model
        if(FileExists(path, true)) SetEntityModel(ent, path);
    }

    return Plugin_Stop;
}

C-подобный:
// This file was auto-generated by SourceMod (v1.11.0.6805)
// ConVars for plugin "newpwapons.smx"


// Set the time limit for acquiring new weapons after the start of the round, unit: seconds (range: 5-300 seconds)
// -
// Default: "30"
// Minimum: "5.000000"
// Maximum: "300.000000"
sm_allow_buytime "99"

// Whether to enable the plugin (1: enabled; 0: disabled)
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
sm_new_weapons_enable "1"
Сообщения автоматически склеены:

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>
#include <sdktools_entinput>
#include <sdktools_functions>
#include <sdktools_sound>
#include <sdktools_stringtables>

static const char
    PL_NAME[]    = "New Weapons",
    PL_VER[]    = "2.0.1_18.08.2023";

bool
    bEnable;
int
    iTime;

ArrayList
    hCmds;
StringMap
    hParent,
    hPlay,
    hSound,
    hAmmo,
    hDmgMult,
    hAccuracy,
    hPrice;
Menu
    hMenu;
float
    fStart;

public Plugin myinfo =
{
    name        = PL_NAME,
    version        = PL_VER,
    description    = "<- Add New Weapons ->",
    author        = "cjsrk, Grey83"
}

public void OnPluginStart()
{
    CreateConVar("sm_new_weapons_version", PL_NAME, PL_VER, FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_SPONLY);

    ConVar cvar;
    cvar = CreateConVar("sm_new_weapons_enable", "1", "Whether to enable the plugin (1: enabled; 0: disabled)", _, true, _, true, 1.0);
    HookConVarChange(cvar, CVarChange_Enable);
    bEnable = GetConVarBool(cvar);

    cvar = CreateConVar("sm_allow_buytime", "30", "Set the time limit for acquiring new weapons after the start of the round, unit: seconds (range: 5-300 seconds)", _, true, 5.0, true, 300.0);
    HookConVarChange(cvar, CVarChange_Time);
    iTime = GetConVarInt(cvar);

    AutoExecConfig(true, "plugin.new_weapons");

    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("weapon_fire", Event_WeaponOldSound);

    RegConsoleCmd("sm_new_weapons", Cmd_Menu, "Menu for buying new weapons");

    hCmds = new ArrayList(ByteCountToCells(36));
    hParent = new StringMap();
    hPlay = new StringMap();
    hSound = new StringMap();
    hAmmo = new StringMap();
    hDmgMult = new StringMap();
    hAccuracy = new StringMap();
    hPrice = new StringMap();
}

public void CVarChange_Enable(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    bEnable = cvar.BoolValue;
}

public void CVarChange_Time(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    iTime = cvar.IntValue;
}

public void OnMapStart()
{
    fStart = 0.0;
    delete hMenu;

    char buffer[PLATFORM_MAX_PATH];
    char data[8][64];
    while(hCmds.Length)
    {
        hCmds.GetString(0, buffer, sizeof(data[]) + 4);
        hCmds.Erase(0);
        RemoveCommandListener(Cmd_GetWeapon, buffer);
    }

    if(hParent.Size)
    {
        hParent.Clear();
        hPlay.Clear();
        hSound.Clear();
        hAmmo.Clear();
        hDmgMult.Clear();
        hAccuracy.Clear();
        hPrice.Clear();
    }

    BuildPath(Path_SM, buffer, PLATFORM_MAX_PATH, "configs/NewWeaponsInfo.txt");
    File file = OpenFile(buffer, "r");
    if(!file)
    {
        LogError("Can't open config \"%s\".", buffer);
        return;
    }

    int i_buffer, num;
    float f_buffer;
    while(ReadFileLine(file, buffer, sizeof(buffer)))
    {
        num++;
        if(strlen(buffer) < 21 || buffer[0] != '<'
        || ExplodeString(buffer[1], "><", data, sizeof(data), sizeof(data[])) < 8
        || !TrimString(data[0]) || !TrimString(data[1]))
        {
            LogError("Invalid parameters at line %i: \"%s\".", num, buffer);
            continue;
        }

        if(hParent.GetString(data[0], buffer, 32))
        {
            LogError("Weapon \"%s\" (at line %i) already exists.", data[0], num);
            continue;
        }

        hParent.SetString(data[0], data[1]);

        FormatEx(buffer, sizeof(buffer), "models/weapons/v_%s.mdl", data[0]);
        PrecacheModel(buffer);
        AddFileToDownloadsTable(buffer);
        buffer[15] = 'w';
        PrecacheModel(buffer);
        AddFileToDownloadsTable(buffer);

        static const char postfix[][] = {"_silencer", "_dropped", "_thrown"};
        int type = -1;
        if(!strcmp(data[0], "usp") || !strcmp(data[0], "m4a1"))
            type = 0;
        else if(!strcmp(data[0], "elite"))
            type = 1;
        else if(!strcmp(data[0], "hegrenade"))
            type = 2;

        if(type != -1)
        {
            FormatEx(buffer, sizeof(buffer), "models/weapons/w_%s%s.mdl", data[0], postfix[type]);
            if(FileExists(buffer, true))
            {
                PrecacheModel(buffer);
                AddFileToDownloadsTable(buffer);
            }
        }

        FormatEx(buffer, sizeof(data[]) + 4, "sm_%s", data[0]);
        if(!CommandExists(buffer))
        {
            hCmds.PushString(buffer);
            AddCommandListener(Cmd_GetWeapon, buffer);
        }
        else LogError("Command \"%s\" already exists.", buffer);

        if(!TrimString(data[2]) || (i_buffer = StringToInt(data[2])) < 0 || i_buffer > 2) i_buffer = 0;
        hPlay.SetValue(data[0], i_buffer);

        if(i_buffer)
        {
            if((i_buffer = TrimString(data[3]) - 4) > 0
            && (!strcmp(data[3][i_buffer], ".wav", false) || !strcmp(data[3][i_buffer], ".mp3", false)))
            {
                hSound.SetString(data[0], data[3]);
                PrecacheSound(data[3]);
                FormatEx(buffer, sizeof(buffer), "sound/%s", data[3]);
                AddFileToDownloadsTable(buffer);
            }
            else
            {
                hPlay.SetValue(data[0], 0);
                LogError("Invalid sound for weapon \"%s\": \"%s\".", data[0], data[3]);
            }
        }

        if(TrimString(data[4]) && (i_buffer = StringToInt(data[4])) > 0)
            hAmmo.SetValue(data[0], i_buffer);

        if(TrimString(data[5]) && (f_buffer = StringToFloat(data[5])) > 0.0)
            hDmgMult.SetValue(data[0], f_buffer);

        if(TrimString(data[6]) && (f_buffer = StringToFloat(data[6])) > 0.0 && f_buffer <= 1.0)
            hAccuracy.SetValue(data[0], f_buffer);

        if((i_buffer = strlen(data[7]) - 1) > 0)
        {
            data[7][i_buffer] = 0;
            if(TrimString(data[7]) && (i_buffer = StringToInt(data[7])) > 0)
                hPrice.SetValue(data[0], i_buffer);
        }

        if(!hMenu) hMenu = new Menu(Handler_Menu);
        FormatEx(buffer, sizeof(buffer), "%s • $%i", data[0], i_buffer);
        data[0][0] = CharToUpper(data[0][0]);
        hMenu.AddItem(data[0], buffer);
    }
    file.Close();

    PrintToServer("Added new weapons: %i (with sound: %i)\nAdded commands: %i", hParent.Size, hSound.Size, hCmds.Length);
    if(!hParent.Size)
        return;

    hMenu.SetTitle("New weapons (%i pcs):", hMenu.ItemCount);
    hMenu.ExitButton = true;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    fStart = GetGameTime();
}

public Action Cmd_GetWeapon(int client, const char[] command, int argc)
{
    if(client) GiveWeapon(client, command[3]);

    return Plugin_Handled;
}

public Action Cmd_Menu(int client, int args)
{
    if(!client)
        return Plugin_Handled;

    if(!bEnable || !hMenu)
        PrintToChat(client, "No weapons available.");
    else if(GetClientTeam(client) < 2 || !IsPlayerAlive(client))
        PrintToChat(client, "Only alive players can buy weapons.");
    else if(fStart + iTime < GetGameTime())
        PrintToChat(client, "You can no longer get weapons in this round!.");
    else hMenu.Display(client, MENU_TIME_FOREVER);

    return Plugin_Handled;
}

public int Handler_Menu(Menu menu, MenuAction action, int client, int param)
{
    if(action == MenuAction_Select)
    {
        char buffer[32];
        hMenu.GetItem(param, buffer, sizeof(buffer));
        GiveWeapon(client, buffer, true);
    }
    return 0;
}

void GiveWeapon(int client, const char[] weapon, const bool menu = false)
{
    if(!bEnable)
    {
        PrintToChat(client, "No weapons available.");
        return;
    }

    if(GetClientTeam(client) < 2 || !IsPlayerAlive(client))
    {
        PrintToChat(client, "Only alive players can buy weapons.");
        return;
    }

    if(fStart + iTime < GetGameTime())
    {
        PrintToChat(client, "You can no longer get weapons in this round!.");
        return;
    }

    char parent[32];
    if(!hParent.GetString(weapon, parent, sizeof(parent)))
    {
        PrintToChat(client, "Weapon \"%s\" is not available.", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    int price, money = GetEntProp(client, Prop_Send, "m_iAccount");
    if(hPrice.GetValue(weapon, money) && (money -= price) >= 0)
    {
        PrintToChat(client, "Not enough money to buy.");
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    static const char prefix[] = "weapon_%s";
    char buffer[40];

    hParent.GetString(weapon, parent, sizeof(parent));
    FormatEx(buffer, sizeof(buffer), prefix, parent);
    int ent = CreateEntityByName(buffer);
    if(ent == -1)
    {
        LogError("Can't create entity \"%s\"", buffer);
        PrintToChat(client, "Can't create weapon \"%s\".", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    FormatEx(buffer, sizeof(buffer), prefix, weapon);
    DispatchKeyValue(ent, "classname", buffer);

    bool have_ammo, knife = !strcmp(parent, "knife");
    int ammo;
    if(hAmmo.GetValue(weapon, ammo) && (have_ammo = ammo && !knife && strcmp(parent, "hegrenade")))
    {
        FormatEx(buffer, sizeof(buffer), "%i", ammo);
        DispatchKeyValue(ent,"ammo", buffer);
    }

    if(!DispatchSpawn(ent))
    {
        LogError("Can't spawn entity \"%s\" (%s)", weapon, buffer);
        PrintToChat(client, "Can't spawn weapon \"%s\".", weapon);
        if(menu) hMenu.Display(client, MENU_TIME_FOREVER);
        return;
    }

    ActivateEntity(ent);

    int i_buffer;
    if(knife && (i_buffer = GetPlayerWeaponSlot(client, 2)) != -1)
    {
        SDKHooks_DropWeapon(client, i_buffer);
        AcceptEntityInput(i_buffer, "Kill");
    }

    EquipPlayerWeapon(client, ent);
    if(price) SetEntProp(client, Prop_Send, "m_iAccount", money);

    if(have_ammo && (i_buffer = GetEntProp(ent, Prop_Data, "m_iPrimaryAmmoType")) > -1
    && GetEntProp(client, Prop_Data, "m_iAmmo", 4, i_buffer) < 1)
        SetEntProp(client, Prop_Data, "m_iAmmo", ammo, 4, i_buffer);
}

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
    SDKHook(client, SDKHook_PostThink, OnPostThink);
}

//Modify the new weapon damage value function
public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, int &damagetype)
{
    if(attacker != inflictor || inflictor > MaxClients)
        return Plugin_Continue;

    if(!IsValidEntity(attacker))
        return Plugin_Continue;

    if(HasEntProp(attacker, Prop_Send, "m_hActiveWeapon") == false)
        return Plugin_Continue;

    int weapon = GetEntPropEnt(attacker, Prop_Send, "m_hActiveWeapon");
    if(!IsValidEdict(weapon) || (weapon == -1))
        return Plugin_Continue;

    static char sWeapon[40];
    GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    char parent[32];
    if(!hParent.GetString(sWeapon, parent, sizeof(parent))
    //This function has no effect on grenades
    || !strcmp(parent, "hegrenade"))
        return Plugin_Continue;

    float mult;
    if(!hDmgMult.GetValue(sWeapon, mult))
        return Plugin_Continue;

    //New weapon damage multiplier, the initial damage value of the new weapon is equal to the damage value of the parent weapon. 1.0 means unchanged, 2.0 means change the damage value of the new weapon to twice the initial damage value
    damage *= mult;
    return Plugin_Changed;
}

//Modified new weapon accuracy difference function
public void OnPostThink(int client)
{
    if(!(GetClientButtons(client) & IN_ATTACK))
            return;

    int weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");
    if(!IsValidEdict(weapon) || (weapon == -1))
        return;

    static char sWeapon[40];
    GetClientWeapon(client, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    char parent[32];
    if(!hParent.GetString(sWeapon, parent, sizeof(parent))
    || !strcmp(parent, "hegrenade") || !strcmp(parent, "knife"))
        return;

    float mult;
    if(hAccuracy.GetValue(sWeapon, mult)) SetEntPropFloat(weapon, Prop_Send, "m_fAccuracyPenalty", mult);
}

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

    FadeClientVolume(client, 100.0, 0.0, 0.04, 0.0);
    CreateTimer(0.04, Timer_PlayNewSound, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_PlayNewSound(Handle timer, int client)
{
    if(!(client = GetClientOfUserId(client)))
        return Plugin_Stop;

    int weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon");
    if(weapon == -1)
        return Plugin_Stop;

    char sWeapon[40];
    GetEdictClassname(weapon, sWeapon, sizeof(sWeapon));
    int start = FindCharInString(sWeapon, '_') + 1;
    Format(sWeapon, sizeof(sWeapon), sWeapon[start]);

    int play;
    hPlay.GetValue(sWeapon, play);
    char buffer[32];
    if(play)
    {
        hSound.GetString(sWeapon, buffer, sizeof(buffer));
        if(play == 1)
            ClientCommand(client, "play %s", buffer);
        else EmitSoundToClient(client, buffer, weapon, 1);
        return Plugin_Stop;
    }

    if(hParent.GetString(sWeapon, buffer, sizeof(buffer)) && !strcmp(buffer, "hegrenade"))
    {
        DataPack dp = new DataPack();
        dp.WriteCell(GetClientUserId(client));
        dp.WriteString(sWeapon);
        CreateTimer(0.01, Hegrenade_Throw, dp, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE);
    }

    return Plugin_Stop;
}

//Change the function of the grenade throwing model to fix the problem that the old version of the gun add-on cannot load the grenade throwing model (bug)
public Action Hegrenade_Throw(Handle timer, DataPack dp)
{
    dp.Reset();
    int client = dp.ReadCell();
    if(!(client = GetClientOfUserId(client)))
    {
        CloseHandle(dp);
        return Plugin_Stop;
    }

    char weapon[32];
    dp.ReadString(weapon, sizeof(weapon));
    CloseHandle(dp);

    int ent = -1, lastent;
    while((ent = FindEntityByClassname(ent, "hegrenade_projectile")) != -1)
    {
        if(IsValidEntity(ent) && GetEntPropEnt(ent, Prop_Send, "m_hThrower") == client)
            break;

        if((ent = FindEntityByClassname(ent, "hegrenade_projectile")) == lastent)
        {
            ent = -1;
            break;
        }

        lastent = ent;
    }

    if(ent != -1)
    {
        char path[64];
        FormatEx(path, sizeof(path), "models/weapons/w_%s_thrown.mdl", weapon);
        //If the new grenade comes with a throw model, loads the new grenade's throw model
        if(FileExists(path, true)) SetEntityModel(ent, path);
    }

    return Plugin_Stop;
}

C-подобный:
// This file was auto-generated by SourceMod (v1.11.0.6805)
// ConVars for plugin "newpwapons.smx"


// Set the time limit for acquiring new weapons after the start of the round, unit: seconds (range: 5-300 seconds)
// -
// Default: "30"
// Minimum: "5.000000"
// Maximum: "300.000000"
sm_allow_buytime "9999999"

// Whether to enable the plugin (1: enabled; 0: disabled)
// -
// Default: "1"
// Minimum: "0.000000"
// Maximum: "1.000000"
sm_new_weapons_enable "1"
всё свежее, закинул, добавил моледи на загрузку, выполняю команду но вот, нету доступа..
смотрю код и вроде там если включено или как но включено же вроде а оно
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Хм, я кажется нашёл в чём проблема.
Сообщения автоматически склеены:

Я изменял регистр первого символа не там.
В меню все названия с маленькой, а должны с большой быть.
А ищет и не находит оружие с маленькой буквы.
 
Сверху Снизу