Написание плагинов

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Не совсем понимаю
C-подобный:
bSoundStatus[clients[i]]

Мне клиентам делать?
C-подобный:
int bSoundStatus[MAXPLAYERS+1];

А в коде переключать

C-подобный:
bSoundStatus[client] = false;

bSoundStatus[client] = true;
Сообщения автоматически склеены:

Спасибо))
Только warning остался
C-подобный:
if(IsClientInGame(clients[i]) && !IsFakeClient(clients[i]) && !bSoundStatus[clients[i]]) volume = 0;
warning 213: tag mismatch (expected "float", got "int")
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Не совсем понимаю
C-подобный:
bSoundStatus[clients[i]]

Мне клиентам делать?
C-подобный:
int bSoundStatus[MAXPLAYERS+1];

А в коде переключать

C-подобный:
bSoundStatus[client] = false;

bSoundStatus[client] = true;
Сообщения автоматически склеены:

Спасибо))
Только warning остался
C-подобный:
if(IsClientInGame(clients[i]) && !IsFakeClient(clients[i]) && !bSoundStatus[clients[i]]) volume = 0;
warning 213: tag mismatch (expected "float", got "int")
C-подобный:
#include <sdktools_sound>

bool bSoundStatus[MAXPLAYERS+1];

static const char files[][] =         // без sound/
{
    "weapon/long/penis.mp3",
    "weapon/long/penis1.mp3",
    "weapon/long/penis2.mp3",
    "weapon/long/penis3.mp3",
    "weapon/long/penis4.mp3"
}

public void OnPluginStart(int client)
{
    AddNormalSoundHook(Hooker);
}

public void OnClientPostAdminCheck(int client)
{
    bSoundStatus[client] = false;
    CreateTimer(10.0, toggler, client);
}

public Action toggler(Handle hTimer, int client)
{
    bSoundStatus[client] = true;
    return Plugin_Continue;
}

public void OnClientDisconnect(int client)
{
    bSoundStatus[client] = false;
}

public Action Hooker(int clients[MAXPLAYERS], int& numClients, char sample[PLATFORM_MAX_PATH], int& entity, int& channel, float& volume, int& level, int& pitch, int& flags, char soundEntry[PLATFORM_MAX_PATH], int& seed)
{
    if(sample[0])
    {
        ArrayList NoListenPlayers = CreateArray(64);
        for(int i = 0; i < numClients; i++)
            if(IsClientInGame(clients[i]) && !IsFakeClient(clients[i]))
                if(bSoundStatus[clients[i]] == false)
                    NoListenPlayers.Push(clients[i]);
                  
        for(int i = 0; i < sizeof(files); i++)
        {
            if(StrContains(sample, files[i]) != -1)
            {
                delete NoListenPlayers;
                return Plugin_Continue;
            }       
        }
      
        int k = 0;
        for(int i = 1; i <= MaxClients; i++)
            if(IsClientInGame(i) && !IsFakeClient(i))
                k++;
        
        for(int i = 0; i < numClients; i++)
        {
            if(IsClientInGame(clients[i]) && !IsFakeClient(clients[i]) && !bSoundStatus[clients[i]]) volume = 0.0;
            else if(k > 1) clients[i] = NoListenPlayers.Get(GetRandomInt(0, NoListenPlayers.Length - 1));
        }
      
        delete NoListenPlayers;
        return Plugin_Changed;           
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
@Palonez
Решил заняться и все плагины свои доработать и в паблик выкладывать.
Во время действия:
Отключаю интерфейс SetEntProp(client, Prop_Send, "m_iHideHUD", (1 << 2));
Отключаю все звуки, благодаря тебе.
Даю бессмертие SetEntProp(client, Prop_Data, "m_takedamage", 0);

Должно получится вот так)
Сообщения автоматически склеены:

@Palonez
1680984282238.png
Звук остался
 
Последнее редактирование:

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Приветствую всех. Необходим плагин, в котором будут меняться команды местами, через определенное кол-во раундов, значение меняется в конфиге. Пример: map_round_swapteam "30" + сообщение в чат в последнем раунде, что произойдет смена, по окончанию раунда, и в начале 1 раунда, что смена произошла. CSS v34 SM 1.11 (myarena). Спасибо.
Ещё актуально, пожалуйста.)
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Palonez
Решил заняться и все плагины свои доработать и в паблик выкладывать.
Во время действия:
Отключаю интерфейс SetEntProp(client, Prop_Send, "m_iHideHUD", (1 << 2));
Отключаю все звуки, благодаря тебе.
Даю бессмертие SetEntProp(client, Prop_Data, "m_takedamage", 0);

Должно получится вот так)
Сообщения автоматически склеены:

@Palonez
Звук остался
C-подобный:
public void OnClientPostAdminCheck(int client)
{
    FadeClientVolume(client, 100.0, 0.1, 10.0, 0.1);
}
 

alexmy

Участник
Сообщения
284
Реакции
13
Как я могу узнать остаток обоймы перед перезарядкой. Я пробовал через событие weapon_reload, но оно поздно срабатывает и обойма уже на нуле.

PHP:
public void weapon_reload(Event event, const char [] name, bool Broadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client > 0 && IsClientInGame(client) && GetClientTeam(client) == 2)
    {
        if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1)
        {
            char class[128];
            int weapon = GetPlayerWeaponSlot(client, 0);
            {
                if(IsValidEdict(weapon) && GetEdictClassname(weapon, class, sizeof(class)))
                {
                    if(StrContains(class, "hunting_rifle", false) != -1 || StrContains(class, "sniper_awp", false) != -1)
                    {
                        ID_weapon[weapon] = GetEntProp(weapon, Prop_Data, "m_iClip1");
                        ClearPlayerAmmo(client);
                        CreateTimer(0.1, Update, weapon, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
                    }
                }
            }
        }
    }
}
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Как я могу узнать остаток обоймы перед перезарядкой. Я пробовал через событие weapon_reload, но оно поздно срабатывает и обойма уже на нуле.

PHP:
public void weapon_reload(Event event, const char [] name, bool Broadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client > 0 && IsClientInGame(client) && GetClientTeam(client) == 2)
    {
        if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1)
        {
            char class[128];
            int weapon = GetPlayerWeaponSlot(client, 0);
            {
                if(IsValidEdict(weapon) && GetEdictClassname(weapon, class, sizeof(class)))
                {
                    if(StrContains(class, "hunting_rifle", false) != -1 || StrContains(class, "sniper_awp", false) != -1)
                    {
                        ID_weapon[weapon] = GetEntProp(weapon, Prop_Data, "m_iClip1");
                        ClearPlayerAmmo(client);
                        CreateTimer(0.1, Update, weapon, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
                    }
                }
            }
        }
    }
}
А если использовать хук до события? Pre
 

Вложения

  • Screenshot_2023-04-12-09-02-33-415_com.android.chrome-edit.jpg
    Screenshot_2023-04-12-09-02-33-415_com.android.chrome-edit.jpg
    188.5 КБ · Просмотры: 33

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Как я могу узнать остаток обоймы перед перезарядкой. Я пробовал через событие weapon_reload, но оно поздно срабатывает и обойма уже на нуле.

PHP:
public void weapon_reload(Event event, const char [] name, bool Broadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client > 0 && IsClientInGame(client) && GetClientTeam(client) == 2)
    {
        if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1)
        {
            char class[128];
            int weapon = GetPlayerWeaponSlot(client, 0);
            {
                if(IsValidEdict(weapon) && GetEdictClassname(weapon, class, sizeof(class)))
                {
                    if(StrContains(class, "hunting_rifle", false) != -1 || StrContains(class, "sniper_awp", false) != -1)
                    {
                        ID_weapon[weapon] = GetEntProp(weapon, Prop_Data, "m_iClip1");
                        ClearPlayerAmmo(client);
                        CreateTimer(0.1, Update, weapon, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
                    }
                }
            }
        }
    }
}
получаешь всего кол-во патронов в магазине вычитаешь каждый выстрел из этой переменной и при перезарядке(хукнув ее) получаешь свою переменную
 

alexmy

Участник
Сообщения
284
Реакции
13
А если использовать хук до события? Pre
Да я его использую, что-то тупанул на счёт скобок. Единственны вариант остался, из-за запаса игрока высчитывать. При перезарядки остаток обоймы перемещается в запас .
Сообщения автоматически склеены:

получаешь всего кол-во патронов в магазине вычитаешь каждый выстрел из этой переменной и при перезарядке(хукнув ее) получаешь свою переменную
Это глупо и не рационально считать каждый выстрел.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Да я его использую, что-то тупанул на счёт скобок. Единственны вариант остался, из-за запаса игрока высчитывать. При перезарядки остаток обоймы перемещается в запас .
Сообщения автоматически склеены:


Это глупо и не рационально считать каждый выстрел.
В чем заключается глупость?
 

alexmy

Участник
Сообщения
284
Реакции
13
В чем заключается глупость?
В обойме, 250 патронов, в запасе 700. К примеру на сервере 10 игроков, пускай у каждого считает? У меня была такая мысль, но я от неё отказался. Сорян если грубо высказался.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
В обойме, 250 патронов, в запасе 700. К примеру на сервере 10 игроков, пускай у каждого считает? У меня была такая мысль, но я от неё отказался. Сорян если грубо высказался.
Ну, а что такого? Там не супер-пупер нагрузка будет. К тому же это все асинхронно будет происходить. А так придется каждый раз получать обойму, получать текущий запас, сравнивать с прошлыми, друг друга отнимать
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
@alexmy
Я сохранял кол-во патронов в обойме для каждого игрока, когда он подбирает оружие. (Primery and Secondory)
А перед выдачей - сравнивал.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Как я могу узнать остаток обоймы перед перезарядкой. Я пробовал через событие weapon_reload, но оно поздно срабатывает и обойма уже на нуле.

PHP:
public void weapon_reload(Event event, const char [] name, bool Broadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client > 0 && IsClientInGame(client) && GetClientTeam(client) == 2)
    {
        if(GetUserFlagBits(client) & ADMFLAG_CUSTOM1)
        {
            char class[128];
            int weapon = GetPlayerWeaponSlot(client, 0);
            {
                if(IsValidEdict(weapon) && GetEdictClassname(weapon, class, sizeof(class)))
                {
                    if(StrContains(class, "hunting_rifle", false) != -1 || StrContains(class, "sniper_awp", false) != -1)
                    {
                        ID_weapon[weapon] = GetEntProp(weapon, Prop_Data, "m_iClip1");
                        ClearPlayerAmmo(client);
                        CreateTimer(0.1, Update, weapon, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
                    }
                }
            }
        }
    }
}
Попробуй через SDKHook_Reload
Сообщения автоматически склеены:

Это глупо и не рационально считать каждый выстрел.
Забей на оптимизацию во время разработки, если недостаточно опытный.
Сначала сделай так чтобы работало, потом оптимизируй.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Как я могу узнать остаток обоймы перед перезарядкой. Я пробовал через событие weapon_reload, но оно поздно срабатывает и обойма уже на нуле.
Можно ловить событие player_shoot или weapon_fire и каждый раз считать патроны с помощью параметра m_iClip1. В первом случае событие передаёт weapon ID, во втором - ещё и имя оружия.

И ещё сократи размер char class[128]; до 16 символов (тебе всё равно 14 достаточно, судя по коду).
И if(StrContains(class, "hunting_rifle", false) != -1 || StrContains(class, "sniper_awp", false) != -1) наверное лучше заменить на if(!strcmp(class, "hunting_rifle", false) || !strcmp(class, "sniper_awp", false)) (меньше нагрузка будет).

В общем я бы сократил бы твой код хотя бы до вот такого:
C-подобный:
public void weapon_reload(Event event, const char [] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(!client || !IsClientInGame(client) || GetClientTeam(client) != 2 || !(GetUserFlagBits(client) & ADMFLAG_CUSTOM1))
        return;

    char class[16];
    int weapon = GetPlayerWeaponSlot(client, 0);
    if(weapon != -1 && GetEdictClassname(weapon, class, sizeof(class))
    && (!strcmp(class, "hunting_rifle", false) || !strcmp(class, "sniper_awp", false)))
    {
//        ID_weapon[weapon] = GetEntProp(weapon, Prop_Data, "m_iClip1");    // получаем патроны в событиях player_shoot или weapon_fire
        ClearPlayerAmmo(client);
        CreateTimer(0.1, Update, weapon, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    }
}
И у тебя что, размер int ID_weapon[] равен 2048?
 

sladerev

Участник
Сообщения
323
Реакции
29
Коллеги, кто может подправить ошибку периодически спамит.
Спасибо.
1681486966267.png
 

Вложения

  • OCslaylosers.sp
    6.4 КБ · Просмотры: 9

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@sladerev, весь текст ошибки, пожалуйста. И лучше текстом, а не скриншотом.
Текст ошибки начинается со слов Exeption reported
 

sladerev

Участник
Сообщения
323
Реакции
29
@sladerev, весь текст ошибки, пожалуйста. И лучше текстом, а не скриншотом.
Текст ошибки начинается со слов Exeption reported
C-подобный:
L 04/14/2023 - 22:31:25: SourceMod error session started
L 04/14/2023 - 22:31:25: Info (map "de_dust2") (file "/srv/cstrike/addons/sourcemod/logs/errors_20230414.log")
L 04/14/2023 - 22:31:25: [SM] Exception reported: Array index out-of-bounds (index 65, limit 65)
L 04/14/2023 - 22:31:25: [SM] Blaming: OCslaylosers.smx
L 04/14/2023 - 22:31:25: [SM] Call stack trace:
L 04/14/2023 - 22:31:25: [SM]   [1] Line 444, e:\Programming\SCRIPTINGSMX\include\colors.inc::CEvent_MapStart
L 04/14/2023 - 22:31:25: Error log file session closed.
 

Grey83

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

На строке 442 написано for (new i = 1; i <= MaxClients; i++), а на строке 36 - new bool:CSkipList[MAXPLAYERS+1] = {false,...};?
Сообщения автоматически склеены:

@sladerev, переписал плагин на новый синтаксис, оптимизировал и почистил код:
SM1.11:
//// OCslaylosers 1.3.sp
//
// Z:\OCslaylosers 1.3.sp(60) : warning 234: symbol "FCVAR_PLUGIN" is marked as deprecated: No logic using this flag ever existed in a released game. It only ever appeared in the first hl2sdk.
// Z:\OCslaylosers 1.3.sp(168) : warning 213: tag mismatch (expected "bool", got "int")
// Code size:         12372 bytes
// Data size:         4192 bytes
// Stack/heap size:      16968 bytes
// Total requirements:   33532 bytes
//
// 2 Warnings.
//
// Compilation Time: 0,34 sec
// ----------------------------------------

//// OCslaylosers 1.4.0.sp
//
// Code size:         12688 bytes
// Data size:         4164 bytes
// Stack/heap size:      16968 bytes
// Total requirements:   33820 bytes
//
// Compilation Time: 0,27 sec
// ----------------------------------------
 

Вложения

  • OCslaylosers 1.4.0.sp
    5.9 КБ · Просмотры: 16
Последнее редактирование:

Phrog

Участник
Сообщения
257
Реакции
98
Это глупо и не рационально считать каждый выстрел.
Стремление к оптимизации это хорошо, но такие операции потребляют абсолютно ничтожное кол-во процессорного времени.
 
Последнее редактирование:
Сверху Снизу