[DOD:S] Подстраивание плагина замены [SM] и рекламы

Статус
В этой теме нельзя размещать новые ответы.

Dreizehnt

Доминик
Сообщения
1,160
Реакции
798
Поддержите скриптингом пожалуйста :tomato:Есть нужда в замене префикса [SM] на свой префикс, в DOD:S версия для CS:S не отзывается, блокирует вообще появление сообщения с префиксом, "конфиг" включения создаёт, ошибка такая:
C-подобный:
L 01/01/2017 - 08:37:05: [SM]   [1] Line 136, D:\gmode.ru\addons\sourcemod\scripting\dod_Sourcemod_Prefix_Changer.sp::timer_strip
L 01/01/2017 - 08:37:07: [SM] Exception reported: Invalid message name: "SayText2"
L 01/01/2017 - 08:37:07: [SM] Blaming: dod_Sourcemod_Prefix_Changer.smx

[Any] "[SM]" Prefix changer! UPDATE: March 22, 2013 - AlliedModders

PHP:
#include <sourcemod>
#pragma semicolon 1

#define MAXTEXTCOLORS 100

// Plugin definitions
#define PLUGIN_VERSION "0.32"

public Plugin:myinfo =
{
    name = "Default SM Text Replacer",
    author = "Mitch/Bacardi",
    description = "Replaces the '[SM]' text with more color!",
    version = PLUGIN_VERSION,
    url = ""
};
new Handle:cvar_randomcolor = INVALID_HANDLE;
new UseRandomColors = 0;
new CountColors = 0;

new String:TextColors[MAXTEXTCOLORS][256];

public OnPluginStart()
{
    cvar_randomcolor    =    CreateConVar( "sm_textcol_random", "1", "Uses random colors that you defined. 1- random 0-Default" );
    AutoExecConfig(true, "sm_textreplacer");
    HookConVarChange(cvar_randomcolor, Event_CvarChange);
    CreateConVar("sm_textreplacer_version", PLUGIN_VERSION, "text replacer version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
    RegAdminCmd("sm_reloadstc", Command_ReloadConfig, ADMFLAG_CONFIG, "Reloads Text color's config file");
    HookUserMessage(GetUserMessageId("TextMsg"), TextMsg, true);
}
public Action:Command_ReloadConfig(client, args) {
   
    RefreshConfig();
    LogAction(client, -1, "Reloaded [SM] Text replacer config file");
    ReplyToCommand(client, "[STC] Reloaded config file.");
    return Plugin_Handled;
}
public OnConfigsExecuted()
{
    RefreshConfig();
}

public Event_CvarChange(Handle:convar, const String:oldValue[], const String:newValue[])
{
    RefreshConfig();
}

stock RefreshConfig()
{
    UseRandomColors = GetConVarInt(cvar_randomcolor);
    for (new X = 0; X < MAXTEXTCOLORS; X++)
    {
        //Format(TextColors[X], sizeof(TextColors), "");
        TextColors[X] = "";
    }
    decl String:sPaths[PLATFORM_MAX_PATH];
    BuildPath(Path_SM, sPaths, sizeof(sPaths),"configs/sm_textcolors.cfg");
    new Handle:hFile = OpenFile(sPaths, "r");
    new String:sBuffer[256];
    //new len;
    CountColors = -1;
    while (ReadFileLine(hFile, sBuffer, sizeof(sBuffer)))
    {
        /*len = strlen(sBuffer);
        if (sBuffer[len-1] == '\n')
            sBuffer[--len] = '\0';*/

        TrimString(sBuffer);

        if(!StrEqual(sBuffer,"",false)){
           
            ReplaceString(sBuffer, sizeof(sBuffer), "*", "\x08");
            ReplaceString(sBuffer, sizeof(sBuffer), "&", "\x07");
            CountColors++;
            Format(TextColors[CountColors], sizeof(TextColors), "%s", sBuffer);
            PrintToChatAll("\x01%s", sBuffer);
        }
    }
    CloseHandle(hFile);
}
public Action:TextMsg(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    if(CountColors != -1)
    {
        if(reliable)
        {
            new String:buffer[256];
            BfReadString(bf, buffer, sizeof(buffer));
            if(StrContains(buffer, "\x03[SM]") == 0)
            {
                new Handle:pack;
                CreateDataTimer(0.0, timer_strip, pack);

                WritePackCell(pack, playersNum);
                for(new i = 0; i < playersNum; i++)
                {
                    WritePackCell(pack, players[i]);
                }
                WritePackString(pack, buffer);
                ResetPack(pack);
                return Plugin_Handled;
            }
        }
    }
    return Plugin_Continue;
}

public Action:timer_strip(Handle:timer, Handle:pack)
{
    new playersNum = ReadPackCell(pack);
    new players[playersNum];
    new client, count;

    for(new i = 0; i < playersNum; i++)
    {
        client = ReadPackCell(pack);
        if(IsClientInGame(client))
        {
            players[count++] = client;
        }
    }

    if(count < 1) return;
   
    playersNum = count;
   
    new String:buffer[255];
    ReadPackString(pack, buffer, sizeof(buffer));
    new String:QuickFormat[255];
    new ColorChoose = 0;
    if(UseRandomColors == 1) ColorChoose = GetRandomInt(0, CountColors);
    Format(QuickFormat, sizeof(QuickFormat), "%s", TextColors[ColorChoose]);
    ReplaceStringEx(buffer, sizeof(buffer), "[SM]", QuickFormat);
   
    new Handle:bf = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS);
    //BfWriteString(bf, buffer);
    BfWriteByte(bf, -1);
    BfWriteByte(bf, true);
    BfWriteString(bf, buffer);
    EndMessage();
}


И ещё нужен был плагин для рекламы, но цвета отличаются между DOD:S и CS:S, использовал этот:
Adverts - Форум и он работает, но цвет светло-зелёного в плагине {DARKGREEN}... Возможно как-то узнать все цвета чата для DOD:S& - тёмно-красный и тёмно-зелёный по идее должны быть ещё...

PHP:
#include <sourcemod>

public Plugin:myinfo =
{
    name = "Adverts",
    author = "wS / Schmidt",
    description = "Показ рекламы",
    version = "1.1",
    url = "http://world-source.ru/"
};

new Handle:KV,
    Handle:adverts_delay,
    Handle:adverts_timer,
    Handle:mp_friendlyfire;

public OnPluginStart()
{
    adverts_delay = CreateConVar("adverts_delay", "60");
    mp_friendlyfire = FindConVar("mp_friendlyfire");
    RegServerCmd("adverts_reload", adverts_reload);
    LoadAdverts();
}

public Action:ShowAdvert_Timer(Handle:timer)
{
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            ShowAdvert();
            adverts_timer = CreateTimer(GetConVarFloat(adverts_delay), ShowAdvert_Timer);
            return;
        }
    }
    adverts_timer = INVALID_HANDLE;
}

ShowAdvert()
{
    decl String:text[250];
    KvGetString(KV, "text", text, 250);
    if (StrContains(text, "{FRAGPLAYER}") != -1)
    {
        new FRAGPLAYER = FindFRAGPLAYER();
        if (FRAGPLAYER > 0)
        {
            decl String:x_str[65];
            Format(x_str, 65, "%N (фрагов: %d)", FRAGPLAYER, GetClientFrags(FRAGPLAYER));
            ReplaceString(text, 250, "{FRAGPLAYER}", x_str);
        }
        else
        {
            SetNextKey();
            return;
        }
    }
    if (StrContains(text, "{CASHPLAYER}") != -1)
    {
        new CASHPLAYER = FindCASHPLAYER();
        if (CASHPLAYER > 0)
        {
            decl String:x_str[65];
            Format(x_str, 65, "%N ($%d)", CASHPLAYER, GetEntProp(CASHPLAYER, Prop_Send, "m_iAccount"));
            ReplaceString(text, 250, "{CASHPLAYER}", x_str);
        }
        else
        {
            SetNextKey();
            return;
        }
    }
    if (StrContains(text, "{HURTPLAYER}") != -1)
    {
        new HURTPLAYER = FindHURTPLAYER();
        if (HURTPLAYER > 0)
        {
            decl String:x_str[65];
            Format(x_str, 65, "%N (%d hp)", HURTPLAYER, GetClientHealth(HURTPLAYER));
            ReplaceString(text, 250, "{HURTPLAYER}", x_str);
        }
        else
        {
            SetNextKey();
            return;
        }
    }
    if (StrContains(text, "{FF}") != -1)
    {
        if (GetConVarInt(mp_friendlyfire) == 1) ReplaceString(text, 250, "{FF}", "ДА");
        else ReplaceString(text, 250, "{FF}", "НЕТ");
    }
    if (StrContains(text, "{CURRENTMAP}") != -1)
    {
        decl String:map[75];
        GetCurrentMap(map, 75);
        ReplaceString(text, 250, "{CURRENTMAP}", map);
    }
    if (StrContains(text, "{PLAYERS}") != -1)
    {
        decl String:str_players[5];
        IntToString(GetClientCount(), str_players, 5);
        ReplaceString(text, 250, "{PLAYERS}", str_players);
    }
    if (StrContains(text, "{TIMELEFT}") != -1)
    {
        new timeleft;
        if (GetMapTimeLeft(timeleft) && timeleft > 0)
        {
            decl String:x_str[20];
            Format(x_str, 20, "%d:%02d", timeleft / 60, timeleft % 60);
            ReplaceString(text, 250, "{TIMELEFT}", x_str);
        }
        else ReplaceString(text, 250, "{TIMELEFT}", "0");
    }
    new type = KvGetNum(KV, "type");
    if (type == 2) PrintHintTextToAll(text);
    else if (type == 3) PrintCenterTextAll(text);
    else
    {
        ReplaceString(text, 250, "{DEFAULT}", "\x01");
        ReplaceString(text, 250, "{GREEN}", "\x04");
        ReplaceString(text, 250, "{LIGHTGREEN}", "\x03");
        ReplaceString(text, 250, "{DARKGREEN}", "\x05");
        PrintToChatAll(text);
    }
    SetNextKey(false);
}

SetNextKey(bool:show_advert = true)
{
    if (!KvGotoNextKey(KV))
    {
        KvRewind(KV);
        KvGotoFirstSubKey(KV);
    }
    if (show_advert) ShowAdvert();
}

FindFRAGPLAYER()
{
    new x = 0, best_client = 0, best_value;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && (best_value = GetClientFrags(i)) > x)
        {
            x = best_value;
            best_client = i;
        }
    }
    return best_client;
}

FindCASHPLAYER()
{
    new x = 800, best_client = 0, best_value;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && (best_value = GetEntProp(i, Prop_Send, "m_iAccount")) > x)
        {
            x = best_value;
            best_client = i;
        }
    }
    return best_client;
}

FindHURTPLAYER()
{
    new x = 100, best_client = 0, best_value;
    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && IsPlayerAlive(i) && (best_value = GetClientHealth(i)) < x)
        {
            x = best_value;
            best_client = i;
        }
    }
    return best_client;
}

public OnClientPutInServer(client)
{
    if (adverts_timer == INVALID_HANDLE) adverts_timer = CreateTimer(GetConVarFloat(adverts_delay), ShowAdvert_Timer);
}

public Action:adverts_reload(args)
{
    if (args == 0)
    {
        if (LoadAdverts()) PrintToServer("Реклама успешно перезагружена");
        else PrintToServer("Ошибка");
    }
    return Plugin_Handled;
}

bool:LoadAdverts()
{
    if (adverts_timer != INVALID_HANDLE)
    {
        KillTimer(adverts_timer);
        adverts_timer = INVALID_HANDLE;
    }
    if (KV != INVALID_HANDLE) CloseHandle(KV);
    KV = CreateKeyValues("adverts");
    if (!FileToKeyValues(KV, "cfg/adverts.txt") || !KvGotoFirstSubKey(KV))
    {
        CloseHandle(KV);
        SetFailState("Проблема в cfg/adverts.txt");
        return false;
    }
    adverts_timer = CreateTimer(3.0, ShowAdvert_Timer);
    return true;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу