Jump to content

pomoc VIP


Mivčo

Recommended Posts

Čaute mám problem ked zadam napr: "/setvip 0 3 99" čo znamená ID level a dni tak mi padne server??? jak to je možné a chybu nevidím :o alebo som slepí :unsure:

CMD:setvip(playerid, params[])
{
	if(IsPlayerConnected(playerid))
	{
		new id = strval(params);
		new tarif = chrfind(' ',params)+1;
		new days = tarif+2;

		if(PlayerInfo[playerid][Admin] < 6) return SendClientMessage(playerid,-1,"{FF0000}[VIP] {FFFFFF}Nemas AdminLevel 6");
		if(sscanf(params, "uii", id,tarif,days)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Použi: /setvip [ ID ] [ 0-3 ] [ 0-99 ]");
		if(tarif < 0 || tarif > 3) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Musiš použiť rozmetie medzi 0 až 3.");
		if(days < 0 || days > 99) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Musiš použit dni medzi 0 až 99.");
		if(!IsPlayerConnected(id)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Hráč zo zadaným ID nieje na serveri !");
		if(IsPlayerNPC(id)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ]{ffffff} Toto je NPC !");
		if(tarif > 0)
		{
			new viptarif[16];
			if(strval(params[tarif])==1) viptarif="Bronze";
			else if(strval(params[tarif])==2) viptarif="Silver";
			else if(strval(params[tarif])==3) viptarif="Gold";
			else viptarif=" ";

			new string[256];
			format(string, 256, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id),viptarif,strval(params[days]));
			SendClientMessageToAll(COLOR_ADMIN, string);

			DOF2_SetInt(UserPath(id),"VIP_Tarif", strval(params[tarif]));
			DOF2_SetInt(UserPath(id),"VIP_Days", strval(params[days]));

		}
		else if(tarif == 0)
		{
			new string[128];
			format(string, 128, "is %s odobral hráčovi %s VIP !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id));
			SendClientMessageToAll(COLOR_ADMIN, string);

			DOF2_SetInt(UserPath(id),"VIP_Tarif",0);
			DOF2_SetInt(UserPath(id),"VIP_Days",0);
			DOF2_SetInt(UserPath(id),"VIP",0);
			DOF2_SetInt(UserPath(id),"VIP_Time",0);
			PlayerInfo[playerid][VIP]=0;

			SendClientMessage(id,COLOR_GOLD,"[  VIP  ] Bol ti odobrán VIP Účet !");
		}
	}
	return 1;
}

 

Link to comment
Share on other sites

Prečo kombinuješ chrfind a strval so sscanf? Keď parametre načítaš pomocou sscanf, žiadne chrfind a strval nemusíš ďalej riešiť a môžeš pracovať priamo s premennými, do ktorých ti sscanf uložil nájdené hodnoty parametrov.

Link to comment
Share on other sites

Ty vole, kde jsi tohle vyhrabal? :d
Už to tu padlo, ale kombinovat sscanf a jiné metody práce s parametry je skutečně nesmysl.

První co, tak se vykašli na to, jestliže je hráč připojený při psaní příkazu, a celý příkaz si logicky přerovnej. Začneš tím, jestliže na to má vůbec oprávnění a až pak deklaruješ proměnné(nic k nim nepřidávej):

if (PlayerInfo[playerid][Admin] < 6) return SendClientMessage(playerid,-1,"{FF0000}[VIP] {FFFFFF}Nemas AdminLevel 6");
new 
	id, tarif, days;

Dál rozdělení sscanfem a zjištění jestliže sedí parametry(specifikátor u v rozdělení ti umožní, že hráč nemusí psát pouze id ale může i nick hráče):

if (sscanf(params, "uii", id,tarif,days)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Použi: /setvip [ ID/JMÉNO ] [ 0-3 ] [ 0-99 ]");

Teď máš jistotu, že hráč zadal 3 parametry, 3(nebo 2 a nick) čísla. Takže začneš logicky od prvního a to, jestliže ten hráč je vůbec online:

if (!IsPlayerConnected(id)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Hráč zo zadaným ID nieje na serveri !");

Když to musí být, tak jestliže je NPC:

if(IsPlayerNPC(id)) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ]{ffffff} Toto je NPC !");

Rozmezí u tarifu a dní.

if (tarif < 0 || tarif > 3) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Musiš použiť rozmetie medzi 0 až 3.");
if (days < 0 || days > 99) return SendClientMessage(playerid,COLOR_WARNING,"[  !  ] {FFFFFF}Musiš použit dni medzi 0 až 99.");

Teď, jestliže chceš mít místo čísel jména těch tarifů, tak bych si určitě deklarovat ty jména globálně, a ne pokaždé přidával řetězec k řetězci.

new viptarif[] = { "", "Bronze", "Silver", "Gold"};

Protože v rozmezí máš i nulu, tak nemusíš přidávat žádné další podmínky na čísla/přepínat, rovnou s tím pracuješ:
(na ty jména můžeš použít rovnou podmíněný operátor[viz dole] a nebo jestliže to chceš mít přehlednější tak podmínku[tu použiju já]):

tarif != 0 ? viptarif[tarif] : viptarif[0]

sscanf už dává jistotu, že tarif a days jsou čísla, takže nemusíš nic konvertovat:

new 
	string[144 + 1]; // <--- stačí
if (tarif != 0) 
	format(string, sizeof string, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id), viptarif[tarif], days);
else 
	format(string, sizeof string, "%s %s odebral hráčovi %s VIP!", GetAdminRank(playerid), PlayerName(playerid), PlayerName(id));
SendClientMessageToAll(COLOR_ADMIN, string);

A jak jsem říkal, protože jsi započítal i nulu, můžeš u všeho přidat rovnou jeho nastavení. A taky jediné speciální co je, tak jestliže teda dostane VIP a na jak dlouho, ostatní je zbytečné ukládat:

// To ti jen uloží již definované jméno(číslo/id), 
// takže je to zbytečné abys to ukládal:
// DOF2_SetInt(UserPath(id),"VIP_Tarif", tarif);
DOF2_SetInt(UserPath(id), "VIP_Days", days);
// Nebo PlayerInfo[playerid][VIP] je level?
if (days > 0) PlayerInfo[playerid][VIP] = 0;
else PlayerInfo[playerid][VIP] = 1;
DOF2_SetInt(UserPath(id), "VIP", PlayerInfo[playerid][VIP]);

 

Edited by Scydo
Link to comment
Share on other sites

No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení.

Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných)

Link to comment
Share on other sites

před 4hodinami, mxco said:

No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení.

Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných)

Nebo pouzit crashdetect, na test server idealni nastroj :)

  • Děkuji (+1) 1
Link to comment
Share on other sites

před 6hodinami, mxco said:

No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení.

A taky jsem nepsal, že znám jeho odpověď. Ten problém pádu ani nemusí být v tom kódě. Sázím na problém, jak píše @DeLeTeCZ a nebo, spíše, protože ten soubor nezavírá pomocí DOF2_SaveFile();
Nicméně určitě neuškodí zkrášlit ten kód a zlepšit jeho všeobecnou přehlednost ale hlavně funkčnost. Nebo snad ano?

Link to comment
Share on other sites

před 11hodinami, mxco said:

No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení.

Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných)

Momentálne tam má viditeľný array index out of bounds na riadkoch:

format(string, 256, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id),viptarif,strval(params[days]));
DOF2_SetInt(UserPath(id),"VIP_Days", strval(params[days]));

(napríklad ak zadám príkaz /setvip 0 3 99, strval(params[99]) určite nespraví nič dobré)

Ak by sa držal doporučenia pracovať iba so sscanf, tento problém by odstránil a vedeli by sme, či pády spôsobovalo toto, alebo niečo iné.

Edited by DuFF
  • Děkuji (+1) 1
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...