Jump to content
  • 0

pomoc Crash serveru po zadání formy příkazu


MR_FINE

Dotaz

Ahoj všichni,
Připadám si jako totální cvok,protože tuto funkci jsem uvedl nejméně 12X do svých filterscriptů a Gamemodů a vždy fungovala bez problému.Až do teď.Nechápu vůbec proč,ale v určité formě mi padne server po zadání příkazu.

Kód příkazu setlvl:

YCMD:setlvl(playerid,params[],help)
{
	if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "{FF0000}Nejsi RCON Admin,nemůžeš dávat lvl!");
	new id = strval(params[0]);
	new lvl = strval(params[1]);
	if(!strlen(params[0]) && !strlen(params[1])) return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [ID] [level]"); //toto je ten řádek,který mi crashuje hru (nejspíše)
	else if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "Zadané ID není připojeno");
	else if(strlen(params[1]) > 5 || strlen(params[1]) < 0) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");
	new str[1200],str1[1200];
	format(str,sizeof(str), "{00FF00}Administrátor %s ti udělil AdminLevel %d .Level ti byl automaticky uložen.Příkazy najdeš na /mas",PlayerName(playerid), lvl);
	format(str1,sizeof(str1), "{00FF00} Udělil si hráči %s AdminLevel %d .Level mu byl automaticky uložen",PlayerName(id), lvl);
	SendClientMessage(id, -1, str);
	SendClientMessage(playerid, -1, str1);
	Admin[playerid] = lvl;
	return 1;
}

Vše funguje jak má......přihlásím se k RCONu, zadám /setlvl 0 5 a vše funguje.Ale pokud zadám jen /setlvl tak..........server spadne.Prosím o radu, jak toto vyřešit,neboť fakt už nevím............ PS: vím že tam ještě není ukládání,ani tam není rozlišení mezi Udělením LVL a odebráním lvl :d
Děkuji za jakkoukoliv odpověď či snahu pomoct :)

Link to comment
Share on other sites

7 odpovědí na tuto otázku

Recommended Posts

  • 0

~> Při multiparametrech se spíše více hodí sscanf2 (doporučeno),

~> v knihovně můžeš nalézt include y_va, který má již zpracované některé funkce s par. včetně SCM a SCMTA, takže nemusíš je formatovat.

~> k těmhle podmínkám nemusíš ještě zbytečně přidávat else,

~> přidáváš level jen sám sobě (AdminLevel[playerid]),

~> díky y_utils můžeš na kontroluj, jestli-že nezadal žádné parametry, použít světoznámé isnull(po případě ten sscanf),

~> v poslední podmínce kontroluješ délku toho textu, tobě stačí kontrolovat, jaké číslo zadal (strval).

 

~> Lepší, nemyslíš? :

 

 

#include <YSI_Visual\y_commands> // <YSI\y_commands>
#include <YSI_Core\y_utils>	// <YSI\y_utils>
#include <YSI_Coding\y_va>	// <YSI\y_va>

YCMD:setlvl(playerid, params[], help) {

	if !IsPlayerAdmin(playerid) *then return SendClientMessage(playerid, -1, "{FF0000}Nejsi RCON Admin,nemůžeš dávat lvl!");
	new
		id,
		lvl;
	if (!sscanf(params, "ui", id, lvl)) {

		if (id == INVALID_PLAYER_ID) return SendClientMessage(playerid, -1, "Zadané ID není připojeno");
		if (lvl < 0 || lvl > 5) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");
		va_SendClientMessage(id, -1, "{00FF00}Administrátor %s ti udělil AdminLevel %d .Level ti byl automaticky uložen.Příkazy najdeš na /mas", PlayerName(playerid), lvl);
		va_SendClientMessage(playerid, -1, "{00FF00} Udělil si hráči %s AdminLevel %d .Level mu byl automaticky uložen", PlayerName(id), lvl);
		Admin[id] = lvl;
	} else return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [ID/nick hráče] [level]");
	return (true);
}

 

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

  • 0

jinak chybka je v této podmínce :

if(!strlen(params[0]) && !strlen(params[1])) return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [ID] [level]"); //toto je ten řádek,který mi crashuje hru (nejspíše)

mělo by podle mně být:
 

if(!strlen(params[0]) || !strlen(params[1])) return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [ID] [level]"); //toto je ten řádek,který mi crashuje hru (nejspíše)
Edited by jenkings
Link to comment
Share on other sites

  • 0

~> Při multiparametrech se spíše více hodí sscanf2 (doporučeno),

~> v knihovně můžeš nalézt inlcude y_va, který má již zpracované některé funkce s par. včetně SCM a SCMTA, takže nemusíš je formatovat.

~> nemusíš ještě zbytečně k podmínkám přidávat else,

~> přidáváš level jen sám sobě (AdminLevel[playerid]),

~> díky y_utils můžeš na kontroluj jestli nezadal žádné parametry použít světoznámé isnull(po případě ten sscanf),

~> v poslední podmínce kontroluješ délku toho textu, tobě stačí kontrolovat, jaké číslo zadal (strval).

 

1. ten sscanf2 zkusím,snad to už nebude crashovat :)

2. dík,to jsem nevěděl,YSI mám teprve chvíli,ale už teď vím,že usnadňuje dost práci když se s ním člověk naučí :)

3.To jsem jen zkoušel,zda-li to nepomůže....I když to je blbost

4. Dík,to jsem přehlédl tu moji chybku.

6.Ok

 

 

 

jinak chybka je v této podmínce :

if(!strlen(params[0]) && !strlen(params[1])) return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [iD] [level]"); //toto je ten řádek,který mi crashuje hru (nejspíše)

mělo by podle mně být:

 

if(!strlen(params[0]) || !strlen(params[1])) return SendClientMessage(playerid, -1, "[help] tento příkaz použijte takto: /setlvl [iD] [level]"); //toto je ten řádek,který mi crashuje hru (nejspíše)

No nwm,možná že ano,ale crashuje to pořád :(

 

Link to comment
Share on other sites

  • 0

3.To jsem jen zkoušel,zda-li to nepomůže....I když to je blbost

~> Ne není to blbost. Na druhou to není zase až tak extrémně hrozná chyba, spíše je to zbytečné, ale rozhodně tam rozdíl je. S tím else se spíše hodí, když porovnáváš jednu proměnnou vícekrát a potřebuješ pokud se rovná zrovna jedné z daných hodnot a ne například jediné z nich.

Link to comment
Share on other sites

  • 0

zkoušel jsem to se sscanfem a pořád to crashuje :(

EDIT: můj momentální kód na /setlvl vypadá takto:

if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "{FF0000}Nejsi RCON Admin,nemůžeš dávat lvl!");
    new id = strval(params[0]);
    new lvl = strval(params[1]);
    if (sscanf(params, "ud", id, lvl)) SendClientMessage(playerid, -1,"použijte: /setlvl [iD] [LVL]");
    if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "Zadané ID buď není připojeno nebo je zadáno číslo přes Maximální počet slotů");
    if(strval(params[1]) > 5 || strval(params[1]) < 0) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");
    va_SendClientMessageToAll(-1, "Administrátor %s nastavil hráči %s AdminLevel %d", PlayerName(playerid), PlayerName(id), lvl);
    Admin[id] = lvl;

 

Edited by MR_FINE
Link to comment
Share on other sites

  • 0

 

new id = strval(params[0]);
    new lvl = strval(params[1]);[/quote]

    if (sscanf(params, "ud", id, lvl)) SendClientMessage(playerid, -1,"použijte: /setlvl [ID] [LVL]");

 

 

 

	new
		id,
		lvl;
	if (!sscanf(params, "ui", id, lvl)) {

 

 

    if(strval(params[1]) > 5 || strval(params[1]) < 0) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");

 

 

    if (lvl < 0 || lvl > 5) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");

 

Link to comment
Share on other sites

  • 0

na konec jsem se dopracoval k tomuto kódu:

 

YCMD:setlvl(playerid,params[],help)
{
	if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "{FF0000}Nejsi RCON Admin,nemůžeš dávat lvl!");
    new id, lvl;
	if (!strlen(params)) return SendClientMessage(playerid, -1, "použij /setlvl ID LEVEL");
	id = strval(params[0]);
	lvl = strval(params[1]);
	if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "Zadané ID není připojeno");
 	if (lvl < 0 || lvl > 5) return SendClientMessage(playerid, -1, "Nesprávný level! Rozmezí levelu 0-5");
	va_SendClientMessageToAll(-1, "Administrátor %s nastavil hráči %s AdminLevel %d", PlayerName(playerid), PlayerName(id), lvl);
	Admin[id] = lvl;
	return 1;
}

A ku podivu už server nepadá :) Děkuju za pomoc a také za tipy k YSI (SkiBig18).
 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...