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

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Если сделать для
C++:
void OnThinkPost(int iEnt)
{   
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && GetClientTeam(i) > 1)
    {
        SetEntData(iEnt, m_iCompetitiveRanking + i*4, iMyId[i]);
    }
}
несколько копий, типо режим послойно, это уберёт заддержку для отображения в fakeranks?

C++:
void OnThinkPost(int iEnt)
{   
    for(int i = 1; i <= 5; i++) if(IsClientInGame(i) && GetClientTeam(i) > 1)
    {
        SetEntData(iEnt, m_iCompetitiveRanking + i*4, iMyId[i]);
    }
    if(MaxClients > 5)
    {
        for(int q = 6; q <= 10; q++) if(IsClientInGame(q) && GetClientTeam(q) > 1)
        {
            SetEntData(iEnt, m_iCompetitiveRanking + q*4, iMyId[q]);
        }
    }
    if(MaxClients > 10)
    {
        for(int w = 11; w <= 15; w++) if(IsClientInGame(w) && GetClientTeam(w) > 1)
        {
            SetEntData(iEnt, m_iCompetitiveRanking + w*4, iMyId[w]);
        }
    }
    if(MaxClients > 15)
    {
        for(int e = 16; e <= 20; e++) if(IsClientInGame(e) && GetClientTeam(e) > 1)
        {
            SetEntData(iEnt, m_iCompetitiveRanking + e*4, iMyId[e]);
        }
    }
    if(MaxClients > 20)
    {
        for(int r = 21; r <= 25; r++) if(IsClientInGame(r) && GetClientTeam(r) > 1)
        {
            SetEntData(iEnt, m_iCompetitiveRanking + r*4, iMyId[r]);
        }
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
как бы MaxClients - константа
и смысла разбивать 1 цикл на несколько смысла нет: это только увеличит нагрузку и время выполнения
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
как бы MaxClients - константа
и смысла разбивать 1 цикл на несколько смысла нет: это только увеличит нагрузку и время выполнения
Уже обще нету идей как убрать эту заддержку... только костыли делаю к этой заддержке и всё...
 
Последнее редактирование:

StrAnn1k

Участник
Сообщения
237
Реакции
23
Loco, тебе для вывода куда-то в виде текста?
Сообщения автоматически склеены:

Запрашивал StrAnn1k, но, пока я писал плагин, тему потёрли. Так что выложу здесь.
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <sdktools_entinput>

int iReplaces;
char sReplace[32];

public void OnPluginStart()
{
    ConVar cvar;
    (cvar = CreateConVar("sm_awp_replace", "weapon_ssg08", "The item that will replace the AWP. Leave blank if you want to disable the plugin", FCVAR_NOTIFY|FCVAR_PRINTABLEONLY)).AddChangeHook(CVarChanged);
    CVarChanged(cvar, NULL_STRING, NULL_STRING);

    AutoExecConfig(true, "awp_replace");
}

public void CVarChanged(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    cvar.GetString(sReplace, sizeof(sReplace));
    TrimString(sReplace);
    int num = FindCharInString(sReplace, ' ');
    if(num > 8) sReplace[num] = 0;
    else if(num != -1) sReplace[0] = 0;
}

public void OnMapStart()
{
    char map[8];
    GetCurrentMap(map, sizeof(map));
    bool hooked;
    if(hooked == !StrContains(map, "awp_", false)) return;

    if((hooked = !hooked))
        HookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
    else UnhookEvent("round_freeze_end", Event_FreezeEnd, EventHookMode_PostNoCopy);
}

public void Event_FreezeEnd(Event event, const char[] name, bool dontBroadcast)
{
    if(!sReplace[0]) return;

    iReplaces = 0;
    int ent = MaxClients + 1, wpn;
    float pos[3], ang[3];
    while((ent = FindEntityByClassname(ent, "weapon_awp")) > MaxClients + 1)
    {
        if(IsHaveOwner(ent)) continue;

        GetEntPropVector(ent, Prop_Send, "m_vecOrigin", pos);
        GetEntPropVector(ent, Prop_Data, "m_angRotation", ang);
        AcceptEntityInput(ent, "Kill");
        if((wpn = CreateEntityByName(sReplace)) == -1) continue;

        if(!DispatchSpawn(wpn)) continue;

        TeleportEntity(wpn, pos, ang, NULL_VECTOR);
        iReplaces++;
    }
    PrintToServer("\n%i entities 'weapon_awp' changed by '%s'\n", iReplaces, sReplace);
}

stock bool IsHaveOwner(int ent)
{
    static int owner;
    owner = GetEntPropEnt(ent, Prop_Data, "m_hOwnerEntity");
    if(owner > MaxClients || owner < 1 || !IsClientInGame(owner)) return false;

    RemovePlayerItem(owner, ent);
    AcceptEntityInput(ent, "Kill");
    if(GivePlayerItem(owner, sReplace) > MaxClients) iReplaces++;
    return true;
}
В начале раунда по завершению фризтайма заменяет все weapon_awp на твою энтити, которую ты пропишешь в квар sm_awp_replace (плагин автоматически создаёт файл конфига с именем awp_replace) на картах, имя которых начинается на awp_
По завершении замен плагин в консоль сервера сообщит о количестве удачных замен.
Если в кваре прописан несуществующий класс, то АВП просто удалятся, если имя класса для замены короче 8 символов, то плагин не будет удалять АВП
кстати плагин не правильно почему то работает он на awp_lego_2 выдает скаут
а должен выдавать только по тегу scout ну я заменил за место awp_ на scout_ теперь он все ровно выдает и на awp и на scout что я не так сделал ?
Сообщения автоматически склеены:

Плагин работает норм но не так как надо (
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Это называется "префикс карты".
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как передать массиву iId[client] число с другого массива iIdBuff[client] без цикла?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
Loco, если массивы равны и нужно скопировать весь массив, то можешь попробовать сделать так: iId = iIdBuff;
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как сделать цикл на тех игроков, которые щас на сервере, а не с 1 до MaxClients и после отсеивать их через if().
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
Думаешь сильно на этом сэкономить?
Сомневаюсь, что овчинка выделки стоит

После авторизации игрока записываешь его в динамический массив, после выхода - удаляешь его из массива, а цикл делаешь по массиву
Сообщения автоматически склеены:

думаю, намек ясен.
C++:
static cell_t sm_GetClientCount(IPluginContext *pCtx, const cell_t *params)
{
    if (params[1])
    {
        return playerhelpers->GetNumPlayers();
    }

    int maxplayers = playerhelpers->GetMaxClients();
    int count = 0;
    for (int i = 1; i <= maxplayers; ++i)
    {
        IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(i);
        if ((pPlayer->IsConnected()) && !(pPlayer->IsInGame()))
        {
            count++;
        }
    }

    return (playerhelpers->GetNumPlayers() + count);
}
 

StrAnn1k

Участник
Сообщения
237
Реакции
23
Кто может сделать в этом плагине когда нажимаешь на провод на красный то в чате пишет вы выбрали красный провод то слово должно быт красным если синий выбрали значить в переводе должен синий цвет и т.д
 

Вложения

  • QuickDefuse.sp
    6.5 КБ · Просмотры: 4

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Думаешь сильно на этом сэкономить?
Сомневаюсь, что овчинка выделки стоит

После авторизации игрока записываешь его в динамический массив, после выхода - удаляешь его из массива, а цикл делаешь по массиву

Типо так?
C++:
#include <sourcemod>
ArrayList hArray;

public void OnPluginStart()
{
    hArray = new ArrayList(ByteCountToCells(64));

    HookEvent("round_start", RStart)
}

public void RStart(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 0; i <= hArray.Length; i++)
        PrintToChat(i, "Hello");
}

public void OnClientPostAdminCheck(int client)
{
    hArray.Push(client);
}  

public void OnClientDisconnect(int client)
{
    hArray.Erase(client);
}
Сообщения автоматически склеены:

Ага, интересно что будет с игроком с 20 Auch идом, и всего 10 игроков на сервере, его цикл даже не заденет.
Сообщения автоматически склеены:

Кто может сделать в этом плагине когда нажимаешь на провод на красный то в чате пишет вы выбрали красный провод то слово должно быт красным если синий выбрали значить в переводе должен синий цвет и т.д

Требует [INC] CS:GO Colors для компиляции.
 

Вложения

  • QuickDefuse.sp
    6.6 КБ · Просмотры: 5
  • QuickDefuse.smx
    7.9 КБ · Просмотры: 1
Последнее редактирование:

StrAnn1k

Участник
Сообщения
237
Реакции
23
возможно в Simple Chat Processor (Redux) привязать [INC] CS:GO Colors ? Если да сделайте пажалуста
Сообщения автоматически склеены:

Кто может добавить в этот код что бы авп покупка было доступно с 6 игроков


#pragma semicolon 1
#include <sourcemod>
#include <sdktools_functions>
#include <csgo_colors>

#define PLUGIN_VERSION "2.1 dev"

public Plugin:myinfo =
{
name = "[Blocker] Weapons",
author = "StrAnn1k",
version = PLUGIN_VERSION,
url = "auquel.ru"
}

public Action:CS_OnBuyCommand(client, const String:item[])
{
else (strcmp(item, "g3sg1") == 0 || strcmp(item, "scar20") == 0)
{
CGOPrintToChat(client, "[{BLUE}Blocker{DEFAULT}] На нашем сервере «{RED}скорострелки запрещены{DEFAULT}»", client);
return Plugin_Handled;
}
else return Plugin_Continue;
}
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Привет всем
Есть люди которые смогут переписать немного
weapon_restrict?
По цене договоримся)
Всю суть сюда писать не буду,напишу все что нужно тому,кто возьмется переделывать его.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
45032
Вы лучше всё же напишите здесь ТЗ. Кто сможет - оценит и сам Вам напишет.
Ну и для этого вообще раздел есть:
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Посмотреть вложение 45032Вы лучше всё же напишите здесь ТЗ. Кто сможет - оценит и сам Вам напишет.
Ну и для этого вообще раздел есть:
Прошу прошения) про раздел ваше не знал,по этому и написал сюда.
Суть плагина в том,что его нужно переделать,ну или пофиксить нормально,чтоб он работал на 100 процентов,а не как эти все,которые есть тут на сайте,или же который есть в на самой майарене.
Они все работают не стабильно,то есть ограничения работает не так как надо,может ограничить через 5 раундов,когда игроков всего 5-4,хотя авп и выкидывают,а покупать серавно можно.
Ну вот как то так)
У парня стоит weapon_restrict,он его сам переделывал,у него работает он стабильно,без каких либо косяков.
Ну он его не хочет продавать)

Вот мне нужно подобный ему,ну тут надо смотреть самому заходить на сервер,и смотреть работу этого плагина,там все будет понятно сразу,кто в этом шарит)

Нужно переделать его так же,как у этого паренька на серваке)
То-есть сменить флаг нужно,так как стоит там по стандарту(а) если я не ошибаюсь,сделать чтоб в чате показывало,когда ограничилось оружия,на сколько оно ограничилось,ну и чтоб работал он нормально,а не как эти все)ну тут надо самому смотреть на серваке где он стоит,который я хочу,либо подобный ему)

Спасибо за внимания,сильно не ругайте) если что то не так написал)
Всем добра
 
Сверху Снизу