Jump to content
  • 0

pomoc /ann a ukládání


DeF

Dotaz

Popis problému:

Čau, mám problém s /ANN a ukládání pozice a peněz.

Nezobrazuje se mi text když zadám /ann

Chtěl bych poradit jak nastavit aby se mi uložila pozice a peníze aby mi zůstali stejné.

 

Chyby/varování kompilátoru a při běhu:

K pozici a penězům nemám kod, nevím jak to udělat.

Proto bych vás chtěl poprosit o pomoc.

 

Kód:

 

CMD:ann(playerid, params[]){
if(Admin[playerid] < 2)
{
return SendClientMessage(playerid, 0xEFEFF7AA, "[ ! ] Nemáte dostatečná admin práva !");
}
else if(sscanf(params, "us", playerid))SendClientMessage(playerid, GP, "Použij: /ann [TEXT]");
new string[256];
if(IsPlayerConnected(playerid)){
if(ann_aktivace==1){
KillTimer(timer_ann);
for(new i=0;i<= GetMaxPlayers();i++) TextDrawHideForPlayer(i,Ann);
}
format(string,sizeof(string),"~w~%s",params);
timer_ann = SetTimer("Ann_end",60000,0);
TextDrawSetString(Ann,string);
for(new i=0;i<= GetMaxPlayers();i++) TextDrawShowForPlayer(i,Ann);
ann_aktivace=1;
}
return 1;
}

 

 

 

Dodatečné poznámky:

Díky všem za pomoc.

Link to comment
Share on other sites

10 odpovědí na tuto otázku

Recommended Posts

  • 0

nebylo by lepší použít

 

http://wiki.sa-mp.com/wiki/GameTextForAll

 

kód by byl pak jednoduše jen takle..

CMD:ann(playerid, params[])
{
if(Admin[playerid] < 2) return SendClientMessage(playerid, 0xEFEFF7AA, "[ ! ] Nemáte dostatečná admin práva !");
if(sscanf(params, "u", params)) return SendClientMessage(playerid, GP, "Použij: /ann [TEXT]");
for(new i=0;i<= GetMaxPlayers();i++)
{
GameTextForAll(params, 5000, 3);
}
return 1;
}

Někdo mě opravte pokud se pletu... :d

Link to comment
Share on other sites

  • 0
  • Globální moderátor

nebylo by lepší použít

 

http://wiki.sa-mp.com/wiki/GameTextForAll

 

kód by byl pak jednoduše jen takle..

CMD:ann(playerid, params[])
{
if(Admin[playerid] < 2) return SendClientMessage(playerid, 0xEFEFF7AA, "[ ! ] Nemáte dostatečná admin práva !");
if(sscanf(params, "u", params)) return SendClientMessage(playerid, GP, "Použij: /ann [TEXT]");
for(new i=0;i<= GetMaxPlayers();i++)
{
GameTextForAll(params, 5000, 3);
}
return 1;
}

Někdo mě opravte pokud se pletu... icon_e_biggrin.gif

 

jo, bez toho cyklu, gametextforALL proto není potřeba přeci cyklus :d

Link to comment
Share on other sites

  • 0

aha :d no ja pracujem na tom móde s ním ale my sme chceli niečo také ako, že keď admin použije ten príkaz tak sa vytvorí textdraw a napr. príkazom /annoff by sa ten textdraw vypol no.

Myslím si že je to lepšie ako GameText :d Ale tak keď tak použijeme toto no.

Díky.

Link to comment
Share on other sites

  • 0
cmd(ann, playerid, params[])
{
   new string[size];
   if(Ak je admin)
   {
      if(!params[0]) return TextDrawHideForAll(AnnText);
      format(string, sizeof string, "~w~%s", params);
      TextDrawSetString(AnnText, string);
      TextDrawShowForAll(AnnText);
   }else{SendClientMessage(playerid, COLOR_RED, "Nie ste admin");} //ak nie je admin
   return 1;
}

Čo je tam viac treba?

Link to comment
Share on other sites

  • 0

new string[256]; - načo toľko znakov??
if(IsPlayerConnected(playerid)){ - čo je sakra toto? ako môže hráč ktorý nie je pripojený zadať príkaz /ann?

 

Ukladanie si sprav cez registráciu, je tu mnoho návodov, stačí pohladať

Link to comment
Share on other sites

  • 0

else if(sscanf(params, "us", playerid))SendClientMessage(playerid, GP, "Použij: /ann [TEXT]");
 
Nejak som sa stratil v tomto riadku... 
1. else tam vôbec nemusíš použiť (o 2 riadky vyššie používaš return)
2. Používaš "us", kde 'u' načítava hráčov nick / ID do premennej playerid (k čomu to využiješ?) a 's' načítava string bez definovanej dĺžky a dokonca ho nikam neukladáš. 
Ako napísal Matthew_Bennet, plugin sscanf vôbec nepotrebuješ využívať, stačí ti nastaviť text textdrawu na params.
 
Čo som si všimol ďalej... 
Používanie GetMaxPlayers() vo for cykle väčšinou nebýva dobrý nápad.
Navyše for cyklus vôbec nepotrebuješ, ako napísal Hip, existujú funkcie GameTextForAll, TextDrawShowForAll, TextDrawHideForAll.
 
Ďalej vidím, že si chcel spraviť automatické vypnutie annu po 60 sekundách a držíš si kvôli tomu informáciu, či je momentálne zobrazený nejaký ann.
Mám dojem, že túto informáciu si nepotrebuješ ukladať, pretože ak zavoláš KillTimer na timer, ktorý nebeží, alebo TextDrawHideForAll na textdraw, ktorý nie je zobrazený, nebude to mať žiadne nežiadúce účinky (dúfam).
 
Takže riešenie by mohlo možno vyzerať nejak takto:

 

#define MSG_COLOR   0xEFEFF7AA

new Text:AnnText;
new AnnTimer;

CMD:ann(playerid, params[])
{
	if (Admin[playerid] < 2)
	    return SendClientMessage(playerid, MSG_COLOR, "[ ! ] Nemáte dostatečná admin práva !");

	if (isnull(params))
	    return SendClientMessage(playerid, MSG_COLOR, "Použij: /ann <TEXT>");
	    
	AnnEnd();
	TextDrawSetString(AnnText, params);
	TextDrawShowForAll(AnnText);
	SetTimer("AnnEnd", 60000, false);
	return 1;
}

forward AnnEnd();
public AnnEnd()
{
    KillTimer(AnnTimer);
    TextDrawHideForAll(AnnText);
} 

Ann budeš zapínať pomocou /ann <TEXT>, sám sa vypne po 60 sekundách a ak ho budeš chcieť vypnúť predčasne, napíšeš napríklad "/ann _", prípadne za _ použiješ iný znak, ktorý sa v textdrawoch nezobrazuje. 

 

 

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

  • 0

else if(sscanf(params, "us", playerid))SendClientMessage(playerid, GP, "Použij: /ann [TEXT]");

 

Nejak som sa stratil v tomto riadku... 

1. else tam vôbec nemusíš použiť (o 2 riadky vyššie používaš return)

2. Používaš "us", kde 'u' načítava hráčov nick / ID do premennej playerid (k čomu to využiješ?) a 's' načítava string bez nedefinovanej dĺžky a dokonca ho nikam neukladáš. 

Ako napísal Matthew_Bennet, plugin sscanf vôbec nepotrebuješ využívať, stačí ti nastaviť text textdrawu na params.

 

Čo som si všimol ďalej... 

Používanie GetMaxPlayers() vo for cykle väčšinou nebýva dobrý nápad.

Navyše for cyklus vôbec nepotrebuješ, ako napísal Hip, existujú funkcie GameTextForAll, TextDrawShowForAll, TextDrawHideForAll.

 

Ďalej vidím, že si chcel spraviť automatické vypnutie annu po 60 sekundách a držíš si kvôli tomu informáciu, či je momentálne zobrazený nejaký ann.

Mám dojem, že túto informáciu si nepotrebuješ ukladať, pretože ak zavoláš KillTimer na timer, ktorý nebeží, alebo TextDrawHideForAll na textdraw, ktorý nie je zobrazený, nebude to mať žiadne nežiadúce účinky (dúfam).

 

Takže riešenie by mohlo možno vyzerať nejak takto:

 

 

#define MSG_COLOR   0xEFEFF7AA

new Text:AnnText;
new AnnTimer;

CMD:ann(playerid, params[])
{
	if (Admin[playerid] < 2)
	    return SendClientMessage(playerid, MSG_COLOR, "[ ! ] Nemáte dostatečná admin práva !");

	if (isnull(params))
	    return SendClientMessage(playerid, MSG_COLOR, "Použij: /ann <TEXT>");
	    
	AnnEnd();
	TextDrawSetString(AnnText, params);
	TextDrawShowForAll(AnnText);
	SetTimer("AnnEnd", 60000, false);
	return 1;
}

forward AnnEnd();
public AnnEnd()
{
    KillTimer(AnnTimer);
    TextDrawHideForAll(AnnText);
} 

Ann budeš zapínať pomocou /ann <TEXT>, sám sa vypne po 60 sekundách a ak ho budeš chcieť vypnúť predčasne, napíšeš napríklad "/ann _", prípadne za _ použiješ iný znak, ktorý sa v textdrawoch nezobrazuje. 

 

 

 

Díky za radu.

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...