Грамотно переписать плагин

Тема в разделе "Программирование / Скриптинг", создана пользователем Xendox, 10 фев 2012.

  1. Xendox

    Xendox

    Сообщения:
    19
    Симпатии:
    0
    Добрый день , я только начинаю изучать загадочный SP и боюсь сделать что-то лишнее, хочу переделать плагин sm_cash , добавить пару функций !
    НЕМНОГО ИЗМЕНЮ ПОСТ

    Имееется исходник:
    /**
    * smcash.sp
    * Implements sm_cash command
    */

    #include <sourcemod>

    #pragma semicolon 1

    #define PLUGIN_VERSION "1.2"

    public Plugin:myinfo =
    {
    name = "Sm_Cash",
    author = "ferret",
    description = "Basic Chat Commands",
    version = PLUGIN_VERSION,
    url = "http://www.sourcemod.net/"
    };

    new g_iAccount = -1;

    public OnPluginStart()
    {
    g_iAccount = FindSendPropOffs("CCSPlayer", "m_iAccount");

    if (g_iAccount == -1)
    {
    PrintToServer("[smcash] - Unable to start, cannot find necessary send prop offsets.");
    return;
    }

    LoadTranslations("common.phrases");
    LoadTranslations("plugin.smcash");

    CreateConVar("sm_smcash_version", PLUGIN_VERSION, "SmCash Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);

    RegAdminCmd("sm_cash", Command_SmCash, ADMFLAG_CUSTOM1, "sm_cash <name or #userid or all/t/ct> <amount> - Set target's cash to amount.");
    }

    public Action:Command_SmCash(client, args)
    {
    if (args < 2)
    {
    ReplyToCommand(client, "[SM] Usage: sm_cash <name or #userid or all/t/ct> <amount>");
    return Plugin_Handled;
    }

    new String:szArg[65];
    GetCmdArg(1, szArg, sizeof(szArg));

    new iAmount;
    decl String:szAmount[64];
    GetCmdArg(2, szAmount, 64);
    iAmount = StringToInt(szAmount);

    if(iAmount == 0 && szAmount[0] != '0')
    {
    ReplyToCommand(client, "[SM] %t", "Invalid Amount");
    return Plugin_Handled;
    }

    if(strcmp(szArg, "all", false) == 0)
    {
    new iMaxClients = GetMaxClients();

    for (new i = 1; i <= iMaxClients; i++)
    {
    if (IsClientInGame(i))
    SetMoney(i, iAmount);
    }

    ShowActivity(client, "%T", "Set All Cash", LANG_SERVER, iAmount);
    }
    else if(strcmp(szArg, "t", false) == 0 || strcmp(szArg, "ct", false) == 0)
    {
    new iMaxClients = GetMaxClients();

    for (new i = 1; i <= iMaxClients; i++)
    {
    if (IsClientInGame(i))
    {
    if(GetClientTeam(i) == (strcmp(szArg, "t", false) == 0 ? 2 : 3))
    SetMoney(i, iAmount);
    }
    }

    ShowActivity(client, "%T", "Set Team Cash", LANG_SERVER, (strcmp(szArg, "t", false) == 0 ? "Terrorist" : "Counter-Terrorist"), iAmount);
    }
    else
    {
    new iClients[2];
    new iNumClients = SearchForClients(szArg, iClients, 2);

    if (iNumClients == 0)
    {
    ReplyToCommand(client, "[SM] %t", "No matching client");
    return Plugin_Handled;
    }
    else if (iNumClients > 1)
    {
    ReplyToCommand(client, "[SM] %t", "More than one client matches", szArg);
    return Plugin_Handled;
    }
    else if (!CanUserTarget(client, iClients[0]))
    {
    ReplyToCommand(client, "[SM] %t", "Unable to target");
    return Plugin_Handled;
    }

    decl String:szName[64];
    GetClientName(iClients[0], szName, 64);

    SetMoney(iClients[0], iAmount);

    ShowActivity(client, "%T", "Set Player Cash", LANG_SERVER, szName, iAmount);
    }

    return Plugin_Handled;
    }

    public SetMoney(client, amount)
    {
    if (g_iAccount != -1)
    SetEntData(client, g_iAccount, amount);
    }

    public GetMoney(client)
    {
    if (g_iAccount != -1)
    return GetEntData(client, g_iAccount);

    return 0;
    }

    Имеется файл plugin.smcash.txt (translations)
    "Phrases"

    {

    "Invalid Amount"

    {

    "en" "The amount specified is not valid."

    "de" "Der angegebene Betrag ist ungültig"

    "fr" "Le montant specifie est invalide."

    }


    "Set All Cash"

    {

    "#format" "{1:d}"

    "en" "has set everyone's cash to {1}."

    "de" "setzt den Kontostand von allen auf {1}."

    "fr" "a donne {1}$ a tout le monde."

    }


    "Set Team Cash"

    {

    "#format" "{1:s},{2:d}"

    "en" "has set the {1} Team's cash to {2}."

    "de" "setzte den Kontostand des {1} Team's auf {2}."

    "fr" "a donne {2}$ a toute la team {1}."

    }


    "Set Player Cash"

    {

    "#format" "{1:s},{2:d}"

    "en" "has set {1}'s cash to {2}."

    "de" "setze {1}'s Kontostand auf {2}."

    "fr" "a donne {2}$ a {1}."

    }

    }

    Но в игре , при выдачи денег , в чате ничего не пишет!

    Вопрос: как правильно привязать этот текстовый файл к плагину? (функция "Set All Cash")
     
    Последнее редактирование: 10 фев 2012
  2. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Судя по первому посту, должны последовать вопросы, или хотя бы результат вашего эксперемента.

    Вот функция регистации админских команд.

    Вот нужная вам команда. Оставьте коллбек и все дела.
    PHP:
    RegAdminCmd("sm_cash"SetCashADMFLAG_SLAY"sm_cash <target> <value> - Sets <target>'s cash to <value>");
    Поскольку плагин простой как щепка, слово "грамотно" должно отсутствовать)
     
    n1keL и Xendox нравится это.
  3. Xendox

    Xendox

    Сообщения:
    19
    Симпатии:
    0
    есть еще предложения?
     
  4. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    А как насчёт документацию полистать?
     
    n1keL нравится это.
  5. Xendox

    Xendox

    Сообщения:
    19
    Симпатии:
    0
    перерыл hlmod, понажимал все ссылки про сп, там обобщение функции и я не знаю как написать именно для этого плагина.давайте я буду примерно писать , как я думаю, а вы мне поможете , скажете что так /не так

    Вот допустим такой пример
    Заготовка*
     
    Последнее редактирование: 11 фев 2012
  6. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Прочитайте книжку по Си например, выучите язык для начала. Чтобы там кто не говорил, а павн это Си-подобный язык, вернее у него Си-подобный синтаксис.
    Павн - процедурно-ориентированный язык, всё что вам требуется знать можно прочитать на вики.

    PrintToChatAll является формат-классовой функцией, символы %t обозначают место, куда будет вставлятся ваша фраза "Set All Cash" из вашего файлика фраз.
    Файлик фраз же подключается функцией LoadTranslations("plugin.smcash");

    Вобщем, вот вам материал http://wiki.amxmodx.org/Ru:Translations_(SourceMod_Scripting)
    И все остальные азы http://wiki.amxmodx.org/Category:Ru:SourceMod_Scripting
     
    n1keL, Серый™ и Xendox нравится это.
  7. Xendox

    Xendox

    Сообщения:
    19
    Симпатии:
    0
    Щас посмотрел , в исходнике есть такие строчки! (посмотрите первый пост)
    А на сервере все равно не пишет в чат при выдачи денег

    извините , подскажите пожалуйста в каком месте вставить
    чтоб писало при использовании команды sm_cash

    /**
    * smcash.sp
    * Implements sm_cash command
    */

    #include <sourcemod>

    #pragma semicolon 1

    #define PLUGIN_VERSION "1.2"

    public Plugin:myinfo =
    {
    name = "Sm_Cash",
    author = "ferret",
    description = "Basic Chat Commands",
    version = PLUGIN_VERSION,
    url = "http://www.sourcemod.net/"
    };

    new g_iAccount = -1;

    public OnPluginStart()
    {
    g_iAccount = FindSendPropOffs("CCSPlayer", "m_iAccount");

    if (g_iAccount == -1)
    {
    PrintToServer("[smcash] - Unable to start, cannot find necessary send prop offsets.");
    return;
    }

    LoadTranslations("common.phrases");
    LoadTranslations("plugin.smcash");

    CreateConVar("sm_smcash_version", PLUGIN_VERSION, "SmCash Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);

    RegAdminCmd("sm_cash", Command_SmCash, ADMFLAG_CUSTOM1, "sm_cash <name or #userid or all/t/ct> <amount> - Set target's cash to amount.");
    }

    public Action:Command_SmCash(client, args)
    {
    if (args < 2)
    {
    ReplyToCommand(client, "[SM] Usage: sm_cash <name or #userid or all/t/ct> <amount>");
    return Plugin_Handled;
    }

    new String:szArg[65];
    GetCmdArg(1, szArg, sizeof(szArg));

    new iAmount;
    decl String:szAmount[64];
    GetCmdArg(2, szAmount, 64);
    iAmount = StringToInt(szAmount);

    if(iAmount == 0 && szAmount[0] != '0')
    {
    ReplyToCommand(client, "[SM] %t", "Invalid Amount");
    return Plugin_Handled;
    }

    if(strcmp(szArg, "all", false) == 0)
    {
    new iMaxClients = GetMaxClients();

    for (new i = 1; i <= iMaxClients; i++)
    {
    if (IsClientInGame(i))
    SetMoney(i, iAmount);
    }

    ShowActivity(client, "%T", "Set All Cash", LANG_SERVER, iAmount);
    }
    else if(strcmp(szArg, "t", false) == 0 || strcmp(szArg, "ct", false) == 0)
    {
    new iMaxClients = GetMaxClients();

    for (new i = 1; i <= iMaxClients; i++)
    {
    if (IsClientInGame(i))
    {
    if(GetClientTeam(i) == (strcmp(szArg, "t", false) == 0 ? 2 : 3))
    SetMoney(i, iAmount);
    }
    }

    ShowActivity(client, "%T", "Set Team Cash", LANG_SERVER, (strcmp(szArg, "t", false) == 0 ? "Terrorist" : "Counter-Terrorist"), iAmount);
    }
    else
    {
    new iClients[2];
    new iNumClients = SearchForClients(szArg, iClients, 2);

    if (iNumClients == 0)
    {
    ReplyToCommand(client, "[SM] %t", "No matching client");
    return Plugin_Handled;
    }
    else if (iNumClients > 1)
    {
    ReplyToCommand(client, "[SM] %t", "More than one client matches", szArg);
    return Plugin_Handled;
    }
    else if (!CanUserTarget(client, iClients[0]))
    {
    ReplyToCommand(client, "[SM] %t", "Unable to target");
    return Plugin_Handled;
    }

    decl String:szName[64];
    GetClientName(iClients[0], szName, 64);

    SetMoney(iClients[0], iAmount);

    ShowActivity(client, "%T", "Set Player Cash", LANG_SERVER, szName, iAmount);
    }

    return Plugin_Handled;
    }

    public SetMoney(client, amount)
    {
    if (g_iAccount != -1)
    SetEntData(client, g_iAccount, amount);
    }

    public GetMoney(client)
    {
    if (g_iAccount != -1)
    return GetEntData(client, g_iAccount);

    return 0;
    }
     
    Последнее редактирование: 11 фев 2012
  8. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Вы вики по переподу не читали, верно? У вас в функции лишние пробелы в ковычках " Set All Cash ", а должно быть "Set All Cash". Плюс там где в переводе стоит {1} должно быть целое число, как написано в формате. По плану это колличество начисляемых денег. Чтоб правильно отображалось следует написать
    PHP:
    PrintToChatAll"\x01[SM] %t" "Set All Cash"money) ;
    Где money - число целово типа, символизирующее сумму. "\x01" - указывает в каком цвете выводить сообщение (данный цвет указан жёлтый (дефолтный)).
    Не ленитесь и почитайте документацию. Ваши посты из себя представляют то, что принято называть "тупыми вопросами".
     
    n1keL нравится это.
  9. Xendox

    Xendox

    Сообщения:
    19
    Симпатии:
    0
    1. эти пробелы обьясню тем , что код , который я сначало написал , отображался на форуме криво , из за этого я и поставил пробелы!
    2. Я в переводе не указал {1} , т.к хочу чтобы писало просто что "Вам начислены деньги"
    3. О "тупом вопросе" котором я задал, нет ничего в вики! Я не совсем понимаю куда подставить эту функцию , поэтому и спрашиваю.

    Добавлено через 21 минуту
    вот нашел коечто в другом плагине

    ShowActivity2(client, "\x04[\x03Give Cash\x04] "," \x01Set \x05%s's\x01 cash to \x04%i\x01!", target_name, iCash);
    for (new i = 0; i < target_count; i ++)
    {
    //get Cash using GetEntData(client, g_iAccount); if we wanted to add
    //Set Cash
    SetEntData(target_list, g_iAccount, iCash);
    if (GetConVarBool(v_TextEnabled))
    {
    PrintToChat(target_list, "\x04[\x03Give Cash\x04]:\x01 An admin set your cash to \x05%i\x01!", iCash);
    }
    }

    return Plugin_Handled;
    }
    x
    что это означает?
     
    Последнее редактирование: 12 фев 2012