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

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
через HookSingleEntityOutput(ent, "OnStartTouch", EntOut_OnStartTouch); (узнаёшь когда началось прикосновение) и HookSingleEntityOutput(ent, "OnStartTouch", EntOut_OnEndTouch); (узнаёшь когда прикосновение закончилось)
C++:
public void EntOut_OnStartTouch(const char[] output, int caller, int activator, float delay)
{
    if(activator > MaxClients)
        return;
    // твой код
}

public void EntOut_OnEndTouch(const char[] output, int caller, int activator, float delay)
{
    if(activator > MaxClients)
        return;
    // твой код
}
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Всем доброй ночи. Может кто-нибудь переписать данный плагин от SemJeF & Drumanid? Пытался сам, но ничего не выходит, только добавил дату подключения админа (не факт, что работает). Хотелось бы иметь логирование всех сообщений от админов. В нем только логирование времени. Возможно ли разбить логи по папкам? К примеру logs/adminchat и admintime, чтобы в них создавался документ к каждому админу admin_SteamID.txt
 

Вложения

  • Admtime.sp
    1.5 КБ · Просмотры: 6

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Всем доброй ночи. Может кто-нибудь переписать данный плагин от SemJeF & Drumanid? Пытался сам, но ничего не выходит, только добавил дату подключения админа (не факт, что работает). Хотелось бы иметь логирование всех сообщений от админов. В нем только логирование времени. Возможно ли разбить логи по папкам? К примеру logs/adminchat и admintime, чтобы в них создавался документ к каждому админу admin_SteamID.txt
При использовании Simple Chat Processor (Redux)

Пример лога сообщения админа:
PHP:
public Action OnChatMessage(int &iClient, Handle hRecipients, char[] sName, char[] sMessage)
{
    char buffer[250], SteamID[32];
    if (GetAdminFlag(iClient, Admin_Generic))  
    {
        GetClientAuthId(iClient, AuthId_Steam2, SteamID, sizeof(SteamID));
        Format(buffer, sizeof(buffer), "addons/sourcemod/logs/adminchat/%s.txt", SteamID)
        LogToFile(buffer, "%s: %s", sName, sMessage);
    }
}
 

Truyn

King of clowns
Сообщения
1,591
Реакции
749
Приветствую товарищи,кто может подправить этот плагин что в архиве чтобы работал под csgo
C-подобный:
/*
    Minimalism for smart © Zhelnov Vladimir
    Coded by Zhelnov Vladimir aka Neatek
    ! Please dont delete my copyright
*/

#include <sourcemod>
#include <sdktools>

new KnifeNum, HeadsNum;
new Handle:KeyValues;
new String:KeyValuesPath[PLATFORM_MAX_PATH];
new String:SoundFiles[2][102][PLATFORM_MAX_PATH];

public Plugin:myinfo = {
    name = "Quake:Knihead(Neatek)",
    author = "Neatek",
    version = "1.0"
};

public OnPluginStart()
{
    LoadTranslations("plugin.knihead");
    HookEvent("player_death", Event_Death, EventHookMode_Pre);
}

public OnMapStart()
{
    if(KeyValues != INVALID_HANDLE)
        KeyValues = INVALID_HANDLE;

    BuildPath(Path_SM, KeyValuesPath, sizeof(KeyValuesPath), "configs/QuakeKnihead/soundlist.cfg");
    KeyValues = CreateKeyValues("SoundList");
    FileToKeyValues(KeyValues, KeyValuesPath);
    
    LoadSounds();
    //PrecacheSounds();
}

public Action:Event_Death(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client, attacker, bool:headshot, String:nickname[32];
    client = GetClientOfUserId(GetEventInt(event,"userid"));
    attacker = GetClientOfUserId(GetEventInt(event,"attacker"));
    headshot = GetEventBool(event, "headshot");
    if(client != attacker && client != 0)
    {
        if(!IsFakeClient(client))
        {
            GetClientName(client, nickname, sizeof(nickname));
        }
        else
        {
            nickname = "#bot";
        }

        if(headshot == false)
        {
            new String:weapon[64];
            GetEventString(event, "weapon", weapon, sizeof(weapon));
            if(StrEqual(weapon, "knife", true))
            {
                PrintCenterTextAll("%t", "knife", nickname);
                PlayRandomSound("knife");
            }
        }
        else
        {
            PrintCenterTextAll("%t", "headshot", nickname);
            PlayRandomSound("headshot");
        }
    }
}

LoadSounds()
{
    if(KeyValues != INVALID_HANDLE)
    {
        FillArray("knifesounds");
        FillArray("headsounds");
    }
}

stock PlayRandomSound(String:Category[82])
{
    new randsound, String:Sound[PLATFORM_MAX_PATH];
    if(StrEqual(Category, "knife", true))
    {
        randsound = GetRandomInt(0, KnifeNum);
        Sound = SoundFiles[0][randsound];
    }
    else if(StrEqual(Category, "headshot", true))
    {
        randsound = GetRandomInt(0, HeadsNum);
        Sound = SoundFiles[1][randsound];
    }

    //PrintToChatAll("sound: %s", Sound);
    
    if(IsSoundPrecached(Sound))
    {
        EmitSoundToAll(Sound);
    }
}

stock DownloadFile(String:File[PLATFORM_MAX_PATH])
{
    new String:dlFile[PLATFORM_MAX_PATH]               
    Format(dlFile, PLATFORM_MAX_PATH, "sound/%s", File);   

    if(FileExists(dlFile))
    {
        AddFileToDownloadsTable(dlFile);
        PrintToServer("[Quake:Knihead] File added to downloads - %s.", dlFile);
        return true;
    }
    else
    {
        PrintToServer("[Quake:Knihead] File don't added to downloads - %s.", dlFile);
    }
    
    return false;
}

stock FillArray(String:FirstKey[82])
{
    if(KvJumpToKey(KeyValues, FirstKey, false))
    {
        new Amount,String:num[32], String:Buffer[PLATFORM_MAX_PATH];
        Amount = KvGetNum(KeyValues, "amount");
        if(Amount > 0)
        {
            for (new i = 0; i < Amount; i++)
            {
                IntToString(i, num, sizeof(num));
                if(KvJumpToKey(KeyValues, num, false))
                {
                    KvGetString(KeyValues, "sound", Buffer, PLATFORM_MAX_PATH);
                    if(DownloadFile(Buffer))
                    {
                        PrecacheSound(Buffer, true);
                        if(StrEqual(FirstKey, "knifesounds", false))
                        {
                            SoundFiles[0][i] = Buffer;
                            KnifeNum += 1;
                        }
                        else
                        {
                            SoundFiles[1][i] = Buffer;
                            HeadsNum += 1;
                        }
                    }

                    KvGoBack(KeyValues);
                }
                else
                {
                    PrintToServer("[Quake:Knihead] Can't jump to key: %s [%s]", num, FirstKey);
                }
            }

            KvGoBack(KeyValues);
        }
    }
    else
    {
        PrintToServer("[Quake:Knihead] Can't jump to key: %s", FirstKey);
    }
    
    if(StrEqual(FirstKey, "knifesounds", false))
        KnifeNum -= 1;
    else
        HeadsNum -= 1;
}
 

Туник

Участник
Сообщения
1,281
Реакции
263
Ну а можно пожалуйста :)

Чисто для ножа надо как в ксс,со свиньей звуки хотелось добавить)))))
PHP:
static const char SND[][] =    // в этот массив добавляем звуки
{
    "misc/1.mp3",
    "misc/2.mp3",
    "misc/3.mp3"
};
Укажите своё название звуков в исходнике, ну или используйте как есть.
 

Вложения

  • Knifezvuk.sp
    1.5 КБ · Просмотры: 4

Truyn

King of clowns
Сообщения
1,591
Реакции
749
PHP:
static const char SND[][] =    // в этот массив добавляем звуки
{
    "misc/1.mp3",
    "misc/2.mp3",
    "misc/3.mp3"
};
Укажите своё название звуков в исходнике, ну или используйте как есть.
А как он их воспроизводить будет? Наугад?
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как наложить два оверлея одновременно через r_screenoverlay? Или есть ещё какой-то способ наложить оверлей помимо r_screenoverlay?
 

Truyn

King of clowns
Сообщения
1,591
Реакции
749
PHP:
static const char SND[][] =    // в этот массив добавляем звуки
{
    "misc/1.mp3",
    "misc/2.mp3",
    "misc/3.mp3"
};
Укажите своё название звуков в исходнике, ну или используйте как есть.

Ау А как он их воспроизводить будет? Наугад?
Сообщения автоматически склеены:

Никто что то и не ответил...
 

iLoco

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

Deff

Участник
Сообщения
350
Реакции
137
Здравствуйте,помогите подправить код (не подсчитывается наносимый урон определенным игроком за раунд)
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>
#include <csgo_colors>

float g_fDamage[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd);
}

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iVictim, int &iAttacker, int &iInflictor, float &fDamage, int &iDamageType)
{
    if (iAttacker && iVictim && GetClientTeam(iVictim) != GetClientTeam(iAttacker))
    {
        g_fDamage[iAttacker] + fDamage;
    }
    return Plugin_Continue;
}

public Action Event_RoundEnd(Event hEvent, const char[] name, bool dontBroadcast)
{
    for(int i = 0; i <= MaxClients; ++i)
    {
        if(i > 0 && IsClientInGame(i) && !IsFakeClient(i))
        {
            CGOPrintToChat(i, "{green}Урон, нанесенный вами в этом раунде: {red}%d", RoundToNearest(g_fDamage[i]));
        }
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
g_fDamage[iAttacker] + fDamage; ==> g_fDamage[iAttacker] += fDamage;
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
Проверяй
C++:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>
#include <csgo_colors>

float g_fDamage[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
    g_fDamage[client] = 0.0;
}

public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
    if(attacker > 0 && attacker <= MaxClients && IsClientInGame(attacker) && !IsFakeClient(attacker) && victim != attacker
    && GetClientTeam(victim) != GetClientTeam(attacker))
        g_fDamage[attacker] += damage;
    return Plugin_Continue;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; ++i)
    {
        if(IsClientInGame(i) && !IsFakeClient(i))
            CGOPrintToChat(i, "{green}Урон, нанесенный вами в этом раунде: {red}%d", RoundToNearest(g_fDamage[i]));
        g_fDamage[i] = 0.0;
    }
}
 

Вложения

  • 2.sp
    1 КБ · Просмотры: 4
  • Мне нравится
Реакции: Deff

Deff

Участник
Сообщения
350
Реакции
137
Проверяй
C++:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>
#include <csgo_colors>

float g_fDamage[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
    g_fDamage[client] = 0.0;
}

public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
    if(attacker > 0 && attacker <= MaxClients && IsClientInGame(attacker) && !IsFakeClient(attacker) && victim != attacker
    && GetClientTeam(victim) != GetClientTeam(attacker))
        g_fDamage[attacker] += damage;
    return Plugin_Continue;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; ++i)
    {
        if(IsClientInGame(i) && !IsFakeClient(i))
            CGOPrintToChat(i, "{green}Урон, нанесенный вами в этом раунде: {red}%d", RoundToNearest(g_fDamage[i]));
        g_fDamage[i] = 0.0;
    }
}
Не работает (не подсчитывается наносимый урон определенным игроком за раунд)
 

Grey83

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

Deff

Участник
Сообщения
350
Реакции
137
ну и каким же игрокам не считает?
сервер перезапускал для проверки плагина (без этого урон, нанесённый игрокам, которые зашли до старта плагина, учитываться не будет, т.к. нужно ещё немного изменять плагин)
У каждого игрока должен подсчитывается его суммарный урон который он нанес за раунд
Сервер не перезапускал,использовал sm plugins refresh
 
Сверху Снизу