Dacă ai lucrat în cleo vreodată, atunci știi că poți afla parametrii în felul următor:
SAMP.IsCommandTyped(0@)
0AD4: 4@ = scan_string 0@ format "%s %d %s" 1@v 5@ 6@v
și unde 4@ returnează numărul de parametrii (evident, în cazul nostru sunt 3, dar nu am pus-o ca și o condiție, deci nu-i obligatoriu să fie 3).
În C++, pentru un mod SF, ce mi-a venit în cap, pentru a afla numărul de parametrii, putem verifica numărul de spații.
De exemplu, se află un spațiu? Atunci avem 2 parametrii, nu se află nici un spațiu? Atunci avem unul singur.
Funcția următoare ne dă numărul de parametrii:
int params_count = 0;
for (unsigned int contor = 0; contor < params.length(); contor++)
if (params[contor] == ' ')
params_count++;
Cu funcția următoare putem verifica dacă jucătorul a trimis cel puțin un parametru:
if (!params.empty())
std::cout << "Avem cel putin un parametru";
else
std::cout << "Nu avem nici un parametru";
Putem să verificăm dacă a trimis într-adevăr parametrii de care noi avem nevoie:
if (!sscanf_s(params.c_str(), "%d %d", Player_ID, Licence_ID))
{
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}Usage: /gl(givelicense) [Player ID] [License ID]");
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}ID Licenses: Flying (1), Sailing (2), Fishing (3), Weapon (4), Materials (5)");
return;
}
Un exemplu de utilizare (am început eu să traduc un mod CLEO în C++):
void __stdcall Announcements::GiveLicense(std::string params)
{
unsigned int params_count = 0;
for (unsigned int contor = 0; contor < params.length(); contor++)
if (params[contor] == ' ')
params_count++;
if (params.empty() || params_count == 0)
{
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}Usage: /gl(givelicense) [Player ID] [License ID]");
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}ID Licenses: Flying (1), Sailing (2), Fishing (3), Weapon (4), Materials (5)");
return;
}
int* Player_ID = new int;
int* Licence_ID = new int;
if (!sscanf_s(params.c_str(), "%d %d", Player_ID, Licence_ID))
{
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}Usage: /gl(givelicense) [Player ID] [License ID]");
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}ID Licenses: Flying (1), Sailing (2), Fishing (3), Weapon (4), Materials (5)");
free(Player_ID);
free(Licence_ID);
return;
}
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(*Player_ID))
{
if (*Licence_ID >= 1 && *Licence_ID <= 5)
{
if (*Licence_ID == 1)
{
char* Event = new char[256];
snprintf(Event, 256, "/givelicense %d Flying", *Player_ID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(Event);
free(Event);
}
if (*Licence_ID == 2)
{
char* Event = new char[256];
snprintf(Event, 256, "/givelicense %d Sailing", *Player_ID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(Event);
free(Event);
}
if (*Licence_ID == 3)
{
char* Event = new char[256];
snprintf(Event, 256, "/givelicense %d Fishing", *Player_ID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(Event);
free(Event);
}
if (*Licence_ID == 4)
{
char* Event = new char[256];
snprintf(Event, 256, "/givelicense %d Weapon", *Player_ID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(Event);
free(Event);
}
if (*Licence_ID == 5)
{
char* Event = new char[256];
snprintf(Event, 256, "/givelicense %d Materials", *Player_ID);
SF->getSAMP()->getPlayers()->pLocalPlayer->Say(Event);
free(Event);
}
}
else
{
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}Wrong License ID.");
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), "{00d12d}[School Instructors]: {a1aba2}ID Licenses: Flying (1), Sailing (2), Fishing (3), Weapon (4), Materials (5)");
}
}
else
{
char Message[256];
_snprintf_s(Message, sizeof(Message), "{00d12d}[School Instructors]: {a1aba2}Player with ID %d is not connected.", *Player_ID);
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xFF, 0), Message);
}
free(Player_ID);
free(Licence_ID);
}
Singura problemă, care încă nu i-am dat de furcă, funcția say ne cere pointerul unui string, însă _snprintf_s nu poate implementa un pointer (noi ca să citim parametrii pe rând, folosim sscanf, iar aici trebuie să creem pointeri din nou). Eu am folosit în schimb snprintf, dar o să primim warning cum că funcția este unsecure. Bine înțeles, se poate dezactiva acest warning. Revin cu edit când o să găsesc o soluție.