Jump to content
  • 0

pomoc DOF2 Vyčítanie banu


TeRoR

Dotaz

Dobrý deň,

chcel by som sa opýtať ohľadom dof2.

Spravil som si jednoduchý príkaz, že overí, či existuje file a ak áno, nepustí hráča na server, ak nie, hráč prejde, no narazil som na chybu a nenapadá ma iný spôsob ako to spraviť ...

Tu je kód: 

if(DOF2_FileExists(TimeBanList(PlayerIP(playerid))))
{
    new Duvod[30],AdminS[20],Cas,strin55[500];
    sscanf(DOF2_GetString(TimeBanList(PlayerIP(playerid)),PlayerIP(playerid)),"ssi",Duvod,AdminS,Cas);
    if(Cas > gettime())
......

Pri 1 aj 4 riadku mi píše "error 035: argument type mismatch (argument 1)".

Spravil som vlastne to, že ak hráč dostane ban, spraví mu to súbor, s názvom jeho IP a následne v tom sú ostatné údaje ... Skúšal som to aj tak, že na meno, no bohužiaľ, dá sa to obísť, a keby som mal čítať z každého súboru IPčky, tak hráč sa na server tak skoro nedostane ...

Neviem či sa to dá spraviť, ale ak nie, tak aspoň poprosím nápady :). Ďakujem.

Link to comment
Share on other sites

18 odpovědí na tuto otázku

Recommended Posts

  • 0

Za prvé určitě nemůžou v 1 zápisu být 3 údaje a za druhé sscanf2 se používá na rozdělení většího řetězce(parametry, inputtext), při načítaní nemáš co rozdělovat(kromě "věty údajů", ale jelikož používáš dof2, tak to není možné). Takže takové ty podřadné údaje budeš muset načíst normálně:

 

	Cas = DOF2_GetInt(Soubor, "Cas");
	strcat(AdminS, DOF2_GetString(Soubor, "AdminNick"));
	strcat(Duvod, DOF2_GetString(Soubor, "Duvod"));
Link to comment
Share on other sites

  • 0

Spravil som si príkaz definicie na BanList a PBanlist .. vpohode zapisuje.

Teraz už tam sú len warningy .. takže to viem aj sám.

Troška som to prerobil:

Keď sa hráč pripojí...

 

 

	if(DOF2_IsSet(BanList,PlayerIP(playerid)))
	{
		new Duvod[30],AdminS[20],Cas,MenoHraca[20];
		sscanf(DOF2_GetString(BanList,PlayerIP(playerid)),"sssi",Duvod,MenoHraca,AdminS,Cas);
		if(Cas > gettime())
		{
			new str2[500];
			strcat(str2,"{F0320C}Administrátor %s vás zabanoval\n");
			strcat(str2,"\n{F0A40C}[Dôvod: %s]\n");
			strcat(str2,"Ban vyprší %s !\n");
			strcat(str2,"\n{C2B291}Pokial si myslíte že ban je udelený neprávnom Stlaète F8");
			strcat(str2,"\nA zašlete nám fotografiu banu na \nemail {FF0000}%s\n{C2B291}Skype {FF0000}%s\n{C2B291}Web {FF0000}%s");
			format(str2,sizeof(str2),str2,AdminS,Duvod,date(Cas));
			ShowPlayerDialog(playerid,0, DIALOG_STYLE_MSGBOX,"Bol ste zabanovaní!",str2,"Ok","Zruši");
			SetTimerEx("Tkick2",100,0,"1",playerid);
		}
		else
		{
             SendClientMessageToAll(COLOR_BRIGHTRED, "teeeest");
             SetTimerEx("Tkick2",100,0,"1",playerid);
		}
			return 0;

	}
	else if(DOF2_IsSet(PBanList,PlayerIP(playerid)))
	{
		new reason[64],AdminOd[25],MenoHracaP[20];
		sscanf(DOF2_GetString(PBanList,PlayerIP(playerid)),"sss",reason,MenoHracaP,AdminOd);
		new str[350];
		strcat(str,"{F0320C} Bol ste zabanovai!\n");
		strcat(str,"{F0A40C}[Dùvod]:%s Od Admina %s\n");
		strcat(str,"{C2B291}Pokial si myslíte že ban je udelený neprávnom Stlaète F8\n");
		strcat(str,"A zašlete nám foto banu na \nemail {FF0000}%s {C2B291}\nSkype {FF0000}%s {C2B291}\n{C2B291}Alebo požiadajte o unban na našich stránkách {FF0000}%s");
		format(str,sizeof(str),str,reason,AdminOd);
		ShowPlayerDialog(playerid,0, DIALOG_STYLE_MSGBOX,"Bol ste zabanovani!",str,"Bye!:)","Bye!:)");
		SetTimerEx("Tkick2",100,0,"1",playerid);
	}

 

 

Ban a unban prikaz:

 

 

CMD:ban (playerid,params[])
{
	 new ID,Cas,Time,Time2;
	 if(PlayerData[playerid][pAdmin] < 2) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemáte administrátorke práva!");
	 else if(sscanf(params,"uds", ID,Cas,params)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /ban [ID] [Cas] [Duvod]");
	 else if(PlayerData[ID][pAdmin] == 5) return SendClientMessage(playerid,COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemôžeš zabanova administrátora!");
	 else if(!IsPlayerConnected(ID)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Hráè nieje pripojený!");
	 else
     Time = gettime();
	 Time2 += 3600*Cas;
	 Time += Time2;
	 new str[144];
	 format(str,144,"%s %s %s %i",params,GetName(ID),GetName(playerid),Time);
	 DOF2_SetString(BanList,(PlayerIP(ID)),str);
	 new KickMessage[256];
	 format(KickMessage, sizeof(KickMessage), "Administrátor %s zabanoval hráèa %s na %i hodin [Dôvod: %s]",GetName(playerid),GetName(ID),Cas,params);
	 SendClientMessageToAll(COLOR_BRIGHTRED, KickMessage);
	 Tkick[ID] = SetTimerEx("Tkick2",1000, false, "i", ID);
	 return 1;
}

CMD:unban (playerid)
{
	new meno[50];
    if(PlayerData[playerid][pAdmin] < 2) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemáte administrátorke práva!");
    else if(sscanf("s", meno)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /unban [MENO]");
    else if(!DOF2_IsSet(BanList,meno)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Tento hráè nemá žiaden ban!");
SendClientMessageToAll(COLOR_BRIGHTRED,"TEST");
	new ubmsg[50];
	format(ubmsg,sizeof(ubmsg),"[ ! ] {FFFFFF}Odbanoval ste banového hráèa: %s",meno);
	SendClientMessage(playerid, COLOR_BRIGHTRED, ubmsg);
    DOF2_Unset(BanList,meno);
	return 1;
} 

 

 

Pban a unpban prikaz:

 

 

CMD:pban (playerid,params[])
{
	 new ID,KickMessage[128],Name[MAX_PLAYER_NAME],Name2[MAX_PLAYER_NAME],MaxDuvod;
	 if(PlayerData[playerid][pAdmin] < 2) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemáte administrátorke práva!");
	 else if(sscanf(params,"us", ID, params)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /pban [ID] [Dùvod]");
	 else if(MaxDuvod < 0 || MaxDuvod > 20) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Maximum znákov ktore ide napísa je 20!");
	 else if(PlayerData[ID][pAdmin] == 5) return SendClientMessage(playerid,COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemôžeš zabanova administrátora!");
	 else if(!IsPlayerConnected(ID)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Hráè nieje pripojený!");
	 else if(!params[0]) return SendClientMessage(playerid, COLOR_BRIGHTRED, "[ ! ]{FFFFFF} Nenapísal si dôvod!");
	 GetPlayerName(playerid, Name, sizeof(Name));
	 GetPlayerName(ID, Name2, sizeof(Name2));
	 format(KickMessage, sizeof(KickMessage), "Administrátor %s permanentne zabanoval hráèa %s [Dôvod: %s]",Name,Name2,params);
	 SendClientMessageToAll(COLOR_BRIGHTRED, KickMessage);
	 new strBan2[256];
	 format(strBan2,sizeof(strBan2),"%s %s %s",params,GetName(ID),GetName(playerid));
	 DOF2_SetString(PBanList,PlayerIP(playerid),strBan2);
	 Tkick[ID] = SetTimerEx("Tkick2",1000, false, "i", ID);
	 return 1;
}

CMD:punban (playerid)
{
	new meno[50];
    if(PlayerData[playerid][pAdmin] < 4) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemáte administrátorke práva!");
    else if(sscanf("s", meno)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /punban [MENO]");
    else if(!DOF2_IsSet(PBanList,meno)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Tento hráè nemá žiaden ban!");
    SendClientMessageToAll(COLOR_BRIGHTRED,"TEST");
    new ubmsg[50];
    format(ubmsg,sizeof(ubmsg),"[ ! ] {FFFFFF}banového hráèa: %s",meno);
    DOF2_Unset(BanList,meno);
	return 1;
} 

 

 

Problémy:

1.dam /unban a napíše, že hrač nema ban,

2.ak dám správne /unban nick, nič to nespraví

3.Hráča to nekickne a môže si dalej hrat ..

Ten 3. nemusíš riešiť ... ak bude fungovať unban, poriešim si to niako sám. Ak by si vedel vylepšiť, tak by som ta o to poprosil. Diky

Edited by TeRoR
Link to comment
Share on other sites

  • 0

Samotné sscanf je nesmysl... fce ti vrátí údaje z daného klíče, a ty z něj ho rozdělí do těch proměnných. Pokud je údaj ip adressa, tak se ti čísla a tečky rozdělí mezi ty proměnné(přesněji se ti to všechno narve do Důvodu), a to ti nemůže fungovat už vůbec.

Link to comment
Share on other sites

  • 0

Samotné sscanf je nesmysl... fce ti vrátí údaje z daného klíče, a ty z něj ho rozdělí do těch proměnných. Pokud je údaj ip adressa, tak se ti čísla a tečky rozdělí mezi ty proměnné(přesněji se ti to všechno narve do Důvodu), a to ti nemůže fungovat už vůbec.

 

Nechcem byť hajzel, ale zrejme si si tie kódy neprečítal ... Tak láskavo ak si si nevšimol, tak mi tu pomáha niekto, kto namiesto kecania blbostí mi to povedia ..

Pre teba je sscanf blbosť, ale mne to úplne stačí. Pýtal som sa, že čo je tam zle, nie na to tvoj názor .. Na oboje témy si mi odpovedal tak, že som to nepochopil ...

Link to comment
Share on other sites

  • 0

Do prikazu si pridej parametr params, ve kterem (pokud uzivatel zada) budes mit jmeno. Neni proto vubec potreba neco provadet sscanf, ale pokud to tak chces.. tak si pridej na pozici prvniho parametru params

 

//EDIT: nevím, jaký cmd systém používáš, ale budiž

CMD:punban(playerid, params[])
{
    if(PlayerData[playerid][pAdmin] < 4) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Nemáte administrátorke práva!");
    else if(isnull(params) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /punban [MENO]");

    ....
    Dále používáš params místo meno

Pokud tam chceš mít sscanf tak

else if(sscanf(params, "s", meno)) return SendClientMessage(playerid, COLOR_BRIGHTRED,"[ ! ]{FFFFFF} Použi: /punban [MENO]");
Edited by Lukasz
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Dobre, užo funguje´.

Ale mám dotaz .. keď dám unban, pokial sa znova nepripojím na test. účte ..

Nedá sa to spraviť na príkaz /reloadbans ?

Link to comment
Share on other sites

  • 0

Že keď odbanujem hráča, musí sa ten hráč pripojiť, a až potom má UB(stale je v text. subore).

Tak či nieje prikaz na reloadnutie toho.

Link to comment
Share on other sites

  • 0

Nechcem byť hajzel, ale zrejme si si tie kódy neprečítal ... Tak láskavo ak si si nevšimol, tak mi tu pomáha niekto, kto namiesto kecania blbostí mi to povedia ..

Pre teba je sscanf blbosť, ale mne to úplne stačí. Pýtal som sa, že čo je tam zle, nie na to tvoj názor .. Na oboje témy si mi odpovedal tak, že som to nepochopil ...

Ten kód jsem si přečetl několikrát. Dokonce jsem udělal návod na sscanf2, a nechci být egoistický, ale vím o něm víc, než ty. Takže, když ti říkám, že tohle je kravina:

 

sscanf(DOF2_GetString(BanList,PlayerIP(playerid)),"sssi",Duvod,MenoHraca,AdminS,Cas);
Tak je to kravina, a klidně ti hned povím proč. fce sscanf pracuje s 2 návratovými hodnotami a s úspěchem+rozdělením a neúspěchem+vrátí 0. Argumenty fce jsou řetězec, specifikátory dat. typů, a nakonec údaje, do kterých to má rozdělit(kdyby jsi to nepochopil, tak tady máš ukázku):

 

sscanf(řetězec[], specifikátory[], údaj1, údaj2, údaj3...)
ty to možná můžeš z originálu jako:

 

stock sscanf(string[], format[], {Float,_}:...)
(to jsem ti chtěl říct jen pro zajímavost, aby sis zjistil, že ty údaje (údaj1, údaj2...) je vlastně stejný parametr jako u format fce).

 

Takže, jak to bude fungovat u tebe? V klíči máš ip adresu, nebo nějaký jiný řetězec, tudíž ti fce vrátí string(vezmeme si tu ip), takže sscanf dostane následující řetězec na rozdělení:

 

sscanf("11.22.33.44","sssi",Duvod,MenoHraca,AdminS,Cas);
sscanf ze specifikátorů zjistí, že to chceš rozdělit do stringu, ale problém je, že řetězec nemá žádné mezery, tudíž, to všechno narve do prvního(Duvod) a u zbytku vrátí 0(nebo EOS), jelikož tam nemáš defaultní hodnoty, v případě, že je nenajde(printi si ty další proměnné, jestli mi nevěříš). Furt si myslíš, že o tom nic nevím a jen píšu blbosti?

 

btw, já jsem nepsal, že sscanf je blbost... psal jsem, že tvoje použití sscanf je blbost...

Link to comment
Share on other sites

  • 0

Dobre pre info toto už mám dávno za sebou ... chcel som nieco ako reloadbans ale newa...

A otázka: Keď tam dám sscanf("11.22.33.44","sssi",Duvod,MenoHraca,AdminS,Cas); ako mi zistí tu IP ? atd bez DOF2 ?

Link to comment
Share on other sites

  • 0

Scydo, on to má ale dobře.

Do stringu s klíčem, který odpovídá nějaké IP zabanovaného hráče, ukládá údaje (jméno zabanovaného, jméno admina, důvod a případně čas). Následně si za první parametr v sscanf dosadí tento string s údaji a pomocí sscanf ho rozdělí na 4 (někde tuším 3) části. 

Takže toto použití až taková blbost nebude.

 

 

Jak můžeš odbanovat připojeného hráče? Připojený hráč nemá ban ne? Při práci s DOF2 nezapomínej ukládat soubor (DOF2_WriteFile).

Edited by Lukasz
Link to comment
Share on other sites

  • 0

 

Jak můžeš odbanovat připojeného hráče? Připojený hráč nemá ban ne? Při práci s DOF2 nezapomínej ukládat soubor (DOF2_WriteFile).

 

Dopsal jsem edit, ale nestihl jsem to dřív ups.

Link to comment
Share on other sites

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