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

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")
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Судя по первому посту, должны последовать вопросы, или хотя бы результат вашего эксперемента.

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

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

Xendox

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

Вот допустим такой пример
PrintToChatAll( " \ x01[SM] %t " , " Set All Cash " ) ;
Заготовка*
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
перерыл hlmod, понажимал все ссылки про сп, там обобщение функции и я не знаю как написать именно для этого плагина.давайте я буду примерно писать , как я думаю, а вы мне поможете , скажете что так /не так

Вот допустим такой пример

Заготовка*

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

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

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

Xendox

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

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

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

Щас посмотрел , в исходнике есть такие строчки! (посмотрите первый пост)
А на сервере все равно не пишет в чат при выдачи денег

извините , подскажите пожалуйста в каком месте вставить
PrintToChatAll( " \ x01[SM] %t " , " Set All Cash " ) ;
чтоб писало при использовании команды 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;
}
 
Последнее редактирование:

Игорь Охремчук

Админ uaplayer.com
Сообщения
240
Реакции
340
Щас посмотрел , в исходнике есть такие строчки! (посмотрите первый пост)
А на сервере все равно не пишет в чат при выдачи денег

извините , подскажите пожалуйста в каком месте вставить

чтоб писало при использовании команды 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;
}

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

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
что это означает?
 
Последнее редактирование:
Сверху Снизу