Выдача оружия игрокам

scre4moff

Участник
Сообщения
41
Реакции
3
Операционная система
Windows
Доброго времени суток, а есть вариант сделать примерно такое, погуглил, плагина похожего не нашел к сожалению
Начинается игра
1 раунд - рандомные пистолеты всем, на этом раунде нужны только (p2000, usp, glock, dual beretas, p250)
2 раунд - тоже пистолетный для всех (five seven, tec 9, deagle)
3 раунд - у всех дробавики(nova, mag 7,sawed off, xm2049)
4 раунд - у всех скауты
5,6,7,8,9,10,11,12,13,14,15 - у всех рандомные пушки, но без дробавиков. То-есть, у одного мка, у двух авики, у четвертого скаут, у пятого фамас как пример.
Меняются сторонами и все тоже самое
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Доброго времени суток, а есть вариант сделать примерно такое, погуглил, плагина похожего не нашел к сожалению
Начинается игра
1 раунд - рандомные пистолеты всем, на этом раунде нужны только (p2000, usp, glock, dual beretas, p250)
2 раунд - тоже пистолетный для всех (five seven, tec 9, deagle)
3 раунд - у всех дробавики(nova, mag 7,sawed off, xm2049)
4 раунд - у всех скауты
5,6,7,8,9,10,11,12,13,14,15 - у всех рандомные пушки, но без дробавиков. То-есть, у одного мка, у двух авики, у четвертого скаут, у пятого фамас как пример.
Меняются сторонами и все тоже самое
C++:
#include <sourcemod>
#include <sdktools_gamerules>
#include <sdktools_functions>

char g_WeaponClasses[][] = {"weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff","weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_elite", "weapon_p250","weapon_fiveseven", "weapon_tec9", "weapon_deagle","weapon_ssg08","weapon_awp", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer",  "weapon_m249", "weapon_negev", "weapon_mp9", "weapon_mac10", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg556", "weapon_scar20", "weapon_g3sg1"};

int iCounter = 0;
bool bCounting = false;

public void OnPluginStart()
{
    HookEvent("round_start", ERS, EventHookMode_Post);
}

public void OnMapStart()
{
    bCounting = false;
    iCounter = 0;
}

public Action ERS(Event event, const char[] sevent, bool bdb)
{
    if(bCounting) iCounter++;
    for(int i = 1; i <= MaxClients; i++)
    {
        if(IsPlayerAlive(i) && !IsFakeClient(i) && IsClientInGame(i))
        {
            for(int j = 0; j <= 1; j++)
                if(GetPlayerWeaponSlot(i, j) != -1) RemovePlayerItem(i, GetPlayerWeaponSlot(i, j));
   
            if(GameRules_GetProp("m_totalRoundsPlayed") == 0 || view_as<bool>(GameRules_GetProp("m_bSwitchedTeamsThisRound")) == true)
            {
                if(view_as<bool>(GameRules_GetProp("m_bSwitchedTeamsThisRound")) == false) bCounting = true;
                GivePlayerItem(i, g_WeaponClasses[GetRandomInt(4,8)]);
            }
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 1 || iCounter == 1) GivePlayerItem(i, g_WeaponClasses[GetRandomInt(9,11)]);
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 2 || iCounter == 2) GivePlayerItem(i, g_WeaponClasses[GetRandomInt(0,3)]);
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 3 || iCounter == 3) GivePlayerItem(i, g_WeaponClasses[12]);
            else GivePlayerItem(i, g_WeaponClasses[GetRandomInt(4,30)]);
        }
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

scre4moff

Участник
Сообщения
41
Реакции
3
C++:
#include <sourcemod>
#include <sdktools_gamerules>
#include <sdktools_functions>

char g_WeaponClasses[][] = {"weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff","weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_elite", "weapon_p250","weapon_fiveseven", "weapon_tec9", "weapon_deagle","weapon_ssg08","weapon_awp", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer",  "weapon_m249", "weapon_negev", "weapon_mp9", "weapon_mac10", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg556", "weapon_scar20", "weapon_g3sg1";};

int iCounter = 0;
bool bCounting = false;

public void OnPluginStart() HookEvent("round_start", ERS, EventHookMode_Post);

public void OnMapStart()
{
    bCounting = false;
    iCounter = 0;
}

public Action ERS(Event event, const char[] sevent, bool bdb)
{
    if(bCounting) iCounter++;
    for(int i = 1; i <= MaxClients; i++)
    {
        if(IsPlayerAlive(i) && !IsFakeClient(i) && IsClientInGame(i))
        {
            for(int j = 0; j <= 1; j++)
                if(GetPlayerWeaponSlot(i, j) != -1) RemovePlayerItem(i, GetPlayerWeaponSlot(i, j));
        
            if(GameRules_GetProp("m_totalRoundsPlayed") == 0 || GameRules_GetProp("m_bSwitchedTeamsThisRound") == true)
            {
                if(GameRules_GetProp("m_bSwitchedTeamsThisRound") == true) bCounting = true;
                GivePlayerItem(i, g_WeaponClasses[GetRandomInt(4,8)]);
            }
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 1 || iCounter == 1) GivePlayerItem(i, g_WeaponClasses[GetRandomInt(9,11)]);
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 2 || iCounter == 2) GivePlayerItem(i, g_WeaponClasses[GetRandomInt(0,3)]);
            else if(GameRules_GetProp("m_totalRoundsPlayed") == 3 || iCounter == 3) GivePlayerItem(i, g_WeaponClasses[12]);
            else GivePlayerItem(i, g_WeaponClasses[GetRandomInt(4,30)]);
        }
    }
}
1665058705635.png
 

scre4moff

Участник
Сообщения
41
Реакции
3
ничего страшного, но исправил
после последнего фикса что-то начало работать, в данный момент игра пытается выдать оружие но в итоге получается как-то так, на пистолетке было тоже самое, есть только сейчас нечто без патрон и нож и так же можно покупать через кнопку B, в некст раунде все оружия удаляются кроме гранат
1665060389571.png
 

Grey83

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

#include <sdktools_entinput>
#include <sdktools_functions>
#include <sdktools_gamerules>

static const char g_WeaponClasses[][] = {"weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_elite", "weapon_p250", "weapon_fiveseven", "weapon_tec9", "weapon_deagle", "weapon_ssg08", "weapon_awp", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_m249", "weapon_negev", "weapon_mp9", "weapon_mac10", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg556", "weapon_scar20", "weapon_g3sg1"};

static const int BOUNDS[][] = {{4, 8}, {9, 11}, {0, 3}, {12, 12}, {4, (sizeof(g_WeaponClasses) - 1)}};

bool bCounting;
int  iCounter;

public void OnPluginStart()
{
    if(GetEngineVersion() != Engine_CSGO) SetFailState("Plugin for CS:GO only!");

    HookEvent("round_start", ERS);
}

public void OnMapStart()
{
    bCounting = false;
    iCounter = 0;
}

public void ERS(Event event, const char[] name, bool bdb)
{
    if(bCounting) iCounter++;
    else iCounter = GameRules_GetProp("m_totalRoundsPlayed");

    if(!GameRules_GetProp("m_bSwitchedTeamsThisRound"))
    {
        iCounter = 0;
        bCounting = true;
    }

    for(int i = 1, type = iCounter > 4 ? 4 : iCounter; i <= MaxClients; i++)
        if(IsClientInGame(i) && (!IsFakeClient(i) || !IsClientReplay(i) && !IsClientSourceTV(i)) && IsPlayerAlive(i))
        {
            ClearSlot(i, 0);
            ClearSlot(i, 1);
            GivePlayerItem(i, g_WeaponClasses[GetRandomInt(BOUNDS[type][0], BOUNDS[type][1])]);
        }
}

stock bool ClearSlot(int client, int slot)
{
    int ent;
    return (ent = GetPlayerWeaponSlot(client, slot)) != -1 && RemovePlayerItem(client, ent)
        && AcceptEntityInput(ent, "KillHierarchy");
}
Сообщения автоматически склеены:

Кстати, через GivePlayerItem() в CS:GO не любое оружие можно выдать, емнип.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Я бы так сделал:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_entinput>
#include <sdktools_functions>
#include <sdktools_gamerules>

static const char g_WeaponClasses[][] = {"weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_elite", "weapon_p250", "weapon_fiveseven", "weapon_tec9", "weapon_deagle", "weapon_ssg08", "weapon_awp", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_m249", "weapon_negev", "weapon_mp9", "weapon_mac10", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg556", "weapon_scar20", "weapon_g3sg1"};

static const int BOUNDS[][] = {{4, 8}, {9, 11}, {0, 3}, {12, 12}, {4, (sizeof(g_WeaponClasses) - 1)}};

bool bCounting;
int  iCounter;

public void OnPluginStart()
{
    if(GetEngineVersion() != Engine_CSGO) SetFailState("Plugin for CS:GO only!");

    HookEvent("round_start", ERS);
}

public void OnMapStart()
{
    bCounting = false;
    iCounter = 0;
}

public void ERS(Event event, const char[] name, bool bdb)
{
    if(bCounting) iCounter++;
    else iCounter = GameRules_GetProp("m_totalRoundsPlayed");

    if(!GameRules_GetProp("m_bSwitchedTeamsThisRound"))
    {
        iCounter = 0;
        bCounting = true;
    }

    for(int i = 1, type = iCounter > 4 ? 4 : iCounter; i <= MaxClients; i++)
        if(IsClientInGame(i) && (!IsFakeClient(i) || !IsClientReplay(i) && !IsClientSourceTV(i)) && IsPlayerAlive(i))
        {
            ClearSlot(i, 0);
            ClearSlot(i, 1);
            GivePlayerItem(i, g_WeaponClasses[GetRandomInt(BOUNDS[type][0], BOUNDS[type][1])]);
        }
}

stock bool ClearSlot(int client, int slot)
{
    int ent;
    return (ent = GetPlayerWeaponSlot(client, slot)) != -1 && RemovePlayerItem(client, ent)
        && AcceptEntityInput(ent, "KillHierarchy");
}
На ксго у него проблема с этим свойством почему то пишет Property "m_bSwitchedTeamsThisRound" not found on the gamerules proxy.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Palonez, вот с этим не подскажу.
На старой версии игры не ругалось. Сейчас обновлю тестовый сервак и сделаю новые дампы.
 

Grey83

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

хм
SM1.10:
sm plugins reload wpn
L 10/06/2022 - 16:57:06: [SM] Exception reported: Property "m_bSwitchedTeamsThisRound" not found on the gamerules proxy
L 10/06/2022 - 16:57:06: [SM] Blaming: wpn.smx
L 10/06/2022 - 16:57:06: [SM] Call stack trace:
L 10/06/2022 - 16:57:06: [SM]   [0] GameRules_GetProp
L 10/06/2022 - 16:57:06: [SM]   [1] Line 21, Z:\2.sp::OnPluginStart
[SM] Plugin wpn.smx failed to reload: Error detected in plugin startup (see error logs).
[SM] Plugin wpn.smx reloaded successfully.
Ща попробую другой способ
Сообщения автоматически склеены:

В общем дампы сделал, но как смену команд проверить пока не понял.
Сообщения автоматически склеены:

В общем вот такое получилось (если не получится узнать значение параметра 'm_bSwitchedTeamsThisRound', то м/б событие 'round_announce_last_round_half' поймается):
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_entinput>
#include <sdktools_functions>
#include <sdktools_gamerules>

static const char g_WeaponClasses[][] = {"weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_usp_silencer", "weapon_hkp2000", "weapon_glock", "weapon_elite", "weapon_p250", "weapon_fiveseven", "weapon_tec9", "weapon_deagle", "weapon_ssg08", "weapon_awp", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_m249", "weapon_negev", "weapon_mp9", "weapon_mac10", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_bizon", "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg556", "weapon_scar20", "weapon_g3sg1"};

static const int BOUNDS[][] = {{4, 8}, {9, 11}, {0, 3}, {12, 12}, {4, (sizeof(g_WeaponClasses) - 1)}};

bool
    bCounting;
int
    iOffset,
    iCounter;

public void OnPluginStart()
{
    if(GetEngineVersion() != Engine_CSGO) SetFailState("Plugin for CS:GO only!");

    iOffset = FindSendPropInfo("CTeamplayRoundBasedRulesProxy", "m_bSwitchedTeamsThisRound");

    HookEvent("round_start", ERS);
    HookEvent("round_announce_last_round_half", Event_Half, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    bCounting = false;
    iCounter = 0;
}

public void ERS(Event event, const char[] name, bool bdb)
{
    if(bCounting) iCounter++;
    else iCounter = GameRules_GetProp("m_totalRoundsPlayed");

    if(IsSwitched())
    {
        iCounter = 0;
        bCounting = true;

        PrintToServer("\nTeams switched this round!\n");
    }

    for(int i = 1, type = iCounter > 4 ? 4 : iCounter; i <= MaxClients; i++)
        if(IsClientInGame(i) && (!IsFakeClient(i) || !IsClientReplay(i) && !IsClientSourceTV(i)) && IsPlayerAlive(i))
        {
            ClearSlot(i, 0);
            ClearSlot(i, 1);
            GivePlayerItem(i, g_WeaponClasses[GetRandomInt(BOUNDS[type][0], BOUNDS[type][1])]);
        }
}

public void Event_Half(Event event, const char[] name, bool bdb)
{
    iCounter = 0;
    bCounting = true;
    PrintToServer("\nLast round half!\n");
}

stock bool IsSwitched()
{
    if(iOffset < 1)
        return false;

    int ent = FindEntityByClassname(MaxClients+1, "cs_gamerules");
    if(ent == -1)
        return false;

    return !!GetEntData(ent, iOffset);
}

stock bool ClearSlot(int client, int slot)
{
    int ent;
    return (ent = GetPlayerWeaponSlot(client, slot)) != -1 && RemovePlayerItem(client, ent)
        && AcceptEntityInput(ent, "KillHierarchy");
}
Вот заодно конфиги из игры со всеми существующими событиями.
 

Вложения

  • CSGO_2022.10.06_dumps.zip
    510.6 КБ · Просмотры: 3
  • CSGO_2022.10.06_events.zip
    12.6 КБ · Просмотры: 4
Последнее редактирование:
Сверху Снизу