Создание мини-скрипта

m4prof

Участник
Сообщения
19
Реакции
3
Нужна помощь в создании скрипта, для работы с плагином "Weapons & Knives". При вызове скрипта, он должен получать передаваемый steam_id, искать игрока по нему, и если нашел, - вызывать функцию GetPlayerData() из "weapons&knives", передавая туда steam_id.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Плагин-то от кого? Этих плагинов на ножи и скины - многовато.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #4
Одному человеку писал подобное именно под этот плагин. Одно из ключевых условий было "не редактировать сам плагин".
Родилось вот такое в тот вечер:
C-подобный:
#include <sourcemod>

Handle g_hWS;
Function g_ptrReloadPlayerMeta;

public void OnPluginStart()
{
    RegServerCmd("sm_reload_ws_player", CmdReloadWsPlayer);
}

public void OnAllPluginsLoaded()
{
    // Сканируем плагин-лист в поисках WS.
    Handle hIter = GetPluginIterator();
    Handle hPlugin = null;

    char szTitle[64];

    do
    {
        hPlugin = ReadPlugin(hIter);
        if (!GetPluginInfo(hPlugin, PlInfo_Name, szTitle, sizeof(szTitle)) || strcmp("Weapons & Knives", szTitle, false))
        {
            continue;
        }

        g_hWS = hPlugin;
        break;
    }
    while (MorePlugins(hIter) && g_hWS == null);
    CloseHandle(hIter);

    if (!g_hWS)
    {
        SetFailState("Weapons & Knifes not found, nothing to do.");
        return;
    }

    g_ptrReloadPlayerMeta = GetFunctionByName(g_hWS, "OnClientPostAdminCheck");
}

public Action CmdReloadWsPlayer(int iArgC)
{
    if (g_hWS == null || g_ptrReloadPlayerMeta == INVALID_FUNCTION)
    {
        return Plugin_Continue;
    }

    char szAccountId[16];
    GetCmdArg(1, szAccountId, sizeof(szAccountId));
    int iAccountId = StringToInt(szAccountId);
    
    for (int iClient = MaxClients; iClient != 0; --iClient)
    {
        if (!IsClientInGame(iClient) || !IsClientAuthorized(iClient))
        {
            continue;
        }

        if (iAccountId == GetSteamAccountID(iClient))
        {
            Call_StartFunction(g_hWS, g_ptrReloadPlayerMeta);
            Call_PushCell(iClient);
            Call_Finish();

            PrintToServer("OK");
            return Plugin_Handled;
        }
    }

    PrintToServer("No player");
    return Plugin_Handled;
}
Плагин на вход в команду берёт Account ID, ищет указанного игрока и выполняет переполучение данных через вызов форварда OnClientPostAdminCheck только для данного игрока, и только для данного плагина.
 

m4prof

Участник
Сообщения
19
Реакции
3
Одному человеку писал подобное именно под этот плагин. Одно из ключевых условий было "не редактировать сам плагин".
Родилось вот такое в тот вечер:
C-подобный:
#include <sourcemod>

Handle g_hWS;
Function g_ptrReloadPlayerMeta;

public void OnPluginStart()
{
    RegServerCmd("sm_reload_ws_player", CmdReloadWsPlayer);
}

public void OnAllPluginsLoaded()
{
    // Сканируем плагин-лист в поисках WS.
    Handle hIter = GetPluginIterator();
    Handle hPlugin = null;

    char szTitle[64];

    do
    {
        hPlugin = ReadPlugin(hIter);
        if (!GetPluginInfo(hPlugin, PlInfo_Name, szTitle, sizeof(szTitle)) || strcmp("Weapons & Knives", szTitle, false))
        {
            continue;
        }

        g_hWS = hPlugin;
        break;
    }
    while (MorePlugins(hIter) && g_hWS == null);
    CloseHandle(hIter);

    if (!g_hWS)
    {
        SetFailState("Weapons & Knifes not found, nothing to do.");
        return;
    }

    g_ptrReloadPlayerMeta = GetFunctionByName(g_hWS, "OnClientPostAdminCheck");
}

public Action CmdReloadWsPlayer(int iArgC)
{
    if (g_hWS == null || g_ptrReloadPlayerMeta == INVALID_FUNCTION)
    {
        return Plugin_Continue;
    }

    char szAccountId[16];
    GetCmdArg(1, szAccountId, sizeof(szAccountId));
    int iAccountId = StringToInt(szAccountId);
   
    for (int iClient = MaxClients; iClient != 0; --iClient)
    {
        if (!IsClientInGame(iClient) || !IsClientAuthorized(iClient))
        {
            continue;
        }

        if (iAccountId == GetSteamAccountID(iClient))
        {
            Call_StartFunction(g_hWS, g_ptrReloadPlayerMeta);
            Call_PushCell(iClient);
            Call_Finish();

            PrintToServer("OK");
            return Plugin_Handled;
        }
    }

    PrintToServer("No player");
    return Plugin_Handled;
}
Плагин на вход в команду берёт Account ID, ищет указанного игрока и выполняет переполучение данных через вызов форварда OnClientPostAdminCheck только для данного игрока, и только для данного плагина.
Большое спасибо. А как можно адаптировать этот код к плагину [CSGO] Gloves - AlliedModders ?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #6
@m4prof, достаточно поменять имя плагина. Автор там точно так же "зависит" от этой же функции.
 
Сверху Снизу