Jump to content
  • 0

pomoc Po napsání příkazu: Tento příkaz neexistuje?


snake3321

Dotaz

Zdravím,

jsem tu s dalším problémem, tentokrát se jedná o to, že si dělám admin příkazy, no a kolikrát když napíšu nějáký z těch příkazů, (nevím jak to popsat)mi po jakýmkoliv napsání jiného příkazu pořád zobrazuje text s tím, že tento příkaz neexistuje přitom se vykonal správně, jen mi to tam stále píše... Nechápu proč a kde dělám chybu, zkoušel jsem všechny různé možnosti takže je z toho nyní patlanice, ale není těžké to rozeznat, pouze jsem jen měnil return a nevím ani co mě to napadlo.. :d. Každopádně používám ZCMD...

 

Kód zde:

 

 

CMD:ac(playerid, params[])
{
new INI:File = INI_Open(UserPath(playerid));
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
if(PlayerInfo[playerid][pAdminlvl] > 5)
{
   if(exist == 0)
   {
   GetPlayerPos(playerid, X, Y, Z);
   GetVehiclePos(adminauto, Xc, Yc, Zc);
   adminauto = CreateVehicle(411, X, Y, Z, 0, 137, 137, 9999);
   objekt1 = CreateObject(359, 0, 0, 0, 0, 0, 0, 0);
   objekt2 = CreateObject(359, 0, 0, 0, 0, 0, 0, 0);
   objekt3 = CreateObject(18646, 0, 0, 0, 0, 0, 0, 0);
   objekt4 = CreateObject(19329, 0, 0, 0, 0, 0, 0, 0);
   objekt5 = CreateObject(19329, 0, 0, 0, 0, 0, 0, 0);
   AttachObjectToVehicle(objekt1, adminauto, -0.55940, -0.07410, 0.64250, 0, 0, 90);
   AttachObjectToVehicle(objekt2, adminauto, 0.58290, -0.07410, 0.64250, 0, 0, 90);
   AttachObjectToVehicle(objekt3, adminauto, -0.01020, 0.10570, 0.75720, 0, 0, 0);
   AttachObjectToVehicle(objekt4, adminauto, -1.11060, 0.05780, -0.14380, 0, 0, 90);
   AttachObjectToVehicle(objekt5, adminauto, 1.10040, 0.05780, -0.14380, 0, 0, 90);
SetObjectMaterialText(objekt4, "Admin Auto", 0, OBJECT_MATERIAL_SIZE_256x128,"Impact", 47, 1, 0xFF00B7FF, 0, OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
SetObjectMaterialText(objekt5, "Admin Auto", 0, OBJECT_MATERIAL_SIZE_256x128,"Impact", 47, 1, 0xFF00B7FF, 0, OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
   vehicle3Dtext[ adminauto ] = Create3DTextLabel("Admin Auto", 0xFF9900AA, Xc, Yc, Zc, 50, -1, 0);
   Attach3DTextLabelToVehicle(vehicle3Dtext[ adminauto ], adminauto, Xc, Yc, Zc+1);
   PutPlayerInVehicle(playerid, adminauto, 0);
exist = 1;
INI_Close(File);
return 1;
}
else SCM(playerid, 0xFF0000AA, "Jedno Admin Auto již existuje! Nelze spawnout více jak 1 vozidlo!"), INI_Close(File);
}
else
{
   SCM(playerid, 0xFF0000AA, "[ ! ] {FFFFFF}Nemáš dostatečný admin level!");
   INI_Close(File);
   return 1;
}
return 1;
}
 
CMD:dac(playerid, params[])
{
new INI:File = INI_Open(UserPath(playerid));
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
if(PlayerInfo[playerid][pAdminlvl] > 5)
{
DestroyVehicle(adminauto);
DestroyObject(objekt1);
DestroyObject(objekt2);
DestroyObject(objekt3);
DestroyObject(objekt4);
DestroyObject(objekt5);
Delete3DTextLabel(vehicle3Dtext[ adminauto ]);
exist = 0;
INI_Close(File);
return 1;
}
else
{
   SCM(playerid, 0xFF0000AA, "[ ! ] {FFFFFF}Nemáš dostatečný admin level!");
   INI_Close(File);
   return 1;
}
}
 
CMD:kill(playerid, params[])
{
new INI:File = INI_Open(UserPath(playerid));
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
if(PlayerInfo[playerid][pAdminlvl] > 0)
{
SetPlayerHealth(playerid, 0);
INI_Close(File);
return 1;
}
else
{
new string[256];
new sebevrazdy = PlayerInfo[playerid][pSuicides];
format(string, sizeof(string), "{FF9900}Opravdu chceš spáchat sebevraždu?\n{00FFFF}Počet tvých sebevražd: %d", sebevrazdy);
ShowPlayerDialog(playerid, DIALOG_Sebevrazda, DIALOG_STYLE_MSGBOX, "{00FF00}Sebevražda", string, "Ano", "Ne");
SendClientMessage(playerid, 0xFF9900AA, "Opravdu chceš spáchat sebevraždu? Můžeš být uvězněn do léčebny za pokus o sebevraždu!");
}
INI_Close(File);
return 1;
}

 

 

Link to comment
Share on other sites

24 odpovědí na tuto otázku

Recommended Posts

  • 0

~> Proč otevíráš soubor pro ukládání, pak ho načítáš, a pak ho zavíráš pro ukládání?

Ano, to je dobrá otázka, na tohle jsem prakticky chtěl založit téma už před tím, ale bylo to prkotina tak jsem to nechal být. Popravdě nevím, že by se takhle dělo, nebo jsem nepochopil to co tou větou myslíš, ale vždy jsem to INI_Close dával před return, aby se to uzavřelo ta složka, je to chybné?

Zkoušel, ale asi špatně, protože Hip má pravdu.

Na poprvé mě to také napadlo, udělal jsem to tak... Dokonce jsem i koukal jsem do jiných sekcí když jsem to googlil, aby jsem téma nezakládal zbytečně, bylo tam to samé a bohužel nefunguje.... Přišel jsem na to, kde to buguje, vždy se to takhle bugne, když napíšu /kill. Přidám sem kód i s tím callbackem...

 

Kód:

 

 

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}
 
CMD:kill(playerid, params[])
{
new INI:File = INI_Open(UserPath(playerid));
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
if(PlayerInfo[playerid][pAdminlvl] > 0)
{
SetPlayerHealth(playerid, 0);
}
else
{
new string[256];
new sebevrazdy = PlayerInfo[playerid][pSuicides];
format(string, sizeof(string), "{FF9900}Opravdu chceš spáchat sebevraždu?\n{00FFFF}Počet tvých sebevražd: %d", sebevrazdy);
ShowPlayerDialog(playerid, DIALOG_Sebevrazda, DIALOG_STYLE_MSGBOX, "{00FF00}Sebevražda", string, "Ano", "Ne");
SendClientMessage(playerid, 0xFF9900AA, "Opravdu chceš spáchat sebevraždu? Můžeš být uvězněn do léčebny za pokus o sebevraždu!");
}
INI_Close(File);
return 1;
}

 

 

Link to comment
Share on other sites

  • 0

Ano, to je dobrá otázka, na tohle jsem prakticky chtěl založit téma už před tím, ale bylo to prkotina tak jsem to nechal být. Popravdě nevím, že by se takhle dělo, nebo jsem nepochopil to co tou větou myslíš, ale vždy jsem to INI_Close dával před return, aby se to uzavřelo ta složka, je to chybné?

~> ... Ne, ty mícháš funkce na ukládání a načítání... INI_Close a INI_Open je pro ukládání, INI_ParseFile je funkce, která ti spustí obsah callbacku, který TEN načítá údaje...

Link to comment
Share on other sites

  • 0

~> ... Ne, ty mícháš funkce na ukládání a načítání... INI_Close a INI_Open je pro ukládání, INI_ParseFile je funkce, která ti spustí obsah callbacku, který TEN načítá údaje...

To mi ale jinak nepůjde uzavřít ten soubor ne? Nebo je to potřebné ho uzavírat pomocí INI_Close?

Link to comment
Share on other sites

  • 0

To mi ale jinak nepůjde uzavřít ten soubor ne? Nebo je to potřebné ho uzavírat pomocí INI_Close?

~> Při ukládání určitě(i když najdou se případy, kdy když to tam nedáš, tak se nic nestane, ale stejně to raději neriskuj), při načítání nemusíš. S načítáním dokonce můžeš kontrolovat existenci souboru...

Link to comment
Share on other sites

  • 0

~> Při ukládání určitě(i když najdou se případy, kdy když to tam nedáš, tak se nic nestane, ale stejně to raději neriskuj), při načítání nemusíš. S načítáním dokonce můžeš kontrolovat existenci souboru...

Výborně, díky za vysvětlení, tak jsem zas o něco chytřejší :d. Každopádně už dlouhou dobu mi vrtá hlavou jedná věc, dokonce jsem to jednou i řešili v jednom topicu tak to zatáhnu sem ať se nevracím tam. Konkrétně se jedná o to, že mi callback OnPlayerDeath nechce ukládat umrtí, kde je problém?

 

Kód:

 

 

public OnPlayerDeath(playerid, killerid, reason)
{
new INI:File = INI_Open(UserPath(playerid));
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
INI_WriteInt(File, "Zabiti", PlayerInfo[killerid][pKills]);
INI_WriteInt(File, "Umrel", PlayerInfo[playerid][pDeaths]);
INI_Close(File);
return 1;
}

 

 

Link to comment
Share on other sites

  • 0
  • Globální moderátor

S INI neporadím, každopádně zpět k příkazům. 

jak vypadá public OnPlayerCommandText? Jestli má nějakou rozumnou délku tak ho sem klidně hoď. Každopádně musí to být dělané stylem 
 

public OPCT
{
Command return 1;
Command return 1;
Command return 1;
return 0;
}
Link to comment
Share on other sites

  • 0

 

S INI neporadím, každopádně zpět k příkazům. 

 

jak vypadá public OnPlayerCommandText? Jestli má nějakou rozumnou délku tak ho sem klidně hoď. Každopádně musí to být dělané stylem 

 

public OPCT
{
Command return 1;
Command return 1;
Command return 1;
return 0;
}

Dobrá tedy, očividně to vypadá, že to funguje, měl jsem tam jen

OPCT
{
return 0;
}
Link to comment
Share on other sites

  • 0

Výborně, díky za vysvětlení, tak jsem zas o něco chytřejší :d. Každopádně už dlouhou dobu mi vrtá hlavou jedná věc, dokonce jsem to jednou i řešili v jednom topicu tak to zatáhnu sem ať se nevracím tam. Konkrétně se jedná o to, že mi callback OnPlayerDeath nechce ukládat umrtí, kde je problém?

 

Kód:

 

 

public OnPlayerDeath(playerid, killerid, reason)
{
new INI:File = INI_Open(UserPath(playerid));
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
INI_WriteInt(File, "Zabiti", PlayerInfo[killerid][pKills]);
INI_WriteInt(File, "Umrel", PlayerInfo[playerid][pDeaths]);
INI_Close(File);
return 1;
}

 

 

Nejsem sice žádnej přeborník na YSI, ale proč tam máš write? Proč to ukládáš? Ukládat to stačí jen při odchodu ze serveru, né jakmile dá kill nebo umře...

Zkus toto:

 

 

public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
return 1;
}

 

 

Podle mého, je to tak. Ten Write dej do publicu OnPlayerDisconnected...

Edited by PetrPaulik
Link to comment
Share on other sites

  • 0

Nejsem sice žádnej přeborník na YSI, ale proč tam máš write? Proč to ukládáš? Ukládat to stačí jen při odchodu ze serveru, né jakmile dá kill nebo umře...

Zkus toto:

 

 

public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
return 1;
}

 

 

Podle mého, je to tak. Ten Write dej do publicu OnPlayerDisconnected...

Tak blbej zase nejsem, to fakt ne :d Tohle jsem zkoušel na poprvé, nefungovalo, tak jsem tam potom přidal i to ukládání taky nešlo tak jsem to potom už neřešil nějáký přepisování a nechal to tam... Každopádně je fakt divný, že to nejde... Docela mě to štve a nevím co s tím  :think:  :(

Link to comment
Share on other sites

  • 0

Tak blbej zase nejsem, to fakt ne :d Tohle jsem zkoušel na poprvé, nefungovalo, tak jsem tam potom přidal i to ukládání taky nešlo tak jsem to potom už neřešil nějáký přepisování a nechal to tam... Každopádně je fakt divný, že to nejde... Docela mě to štve a nevím co s tím  :think:  :(

Já si myslím, že to mé je správné. K čemu to chceš ukládat po každém úmrtí/fragů? Takhle stačí jen když to přičteš. A když se hráč odpojí tak to uložíš do souboru. Zkus to ;).

Link to comment
Share on other sites

  • 0

Nejsem sice žádnej přeborník na YSI, ale proč tam máš write? Proč to ukládáš? Ukládat to stačí jen při odchodu ze serveru, né jakmile dá kill nebo umře...

~> YSI je dostatečně rychlé a propracované. Nebude tolik zatěžovat server, i když to bude ukládat jednu smrt po druhé... pravda, není to moc praktické, ale nikdo mu za to trhat hlavu nebude.

 

 

~> 1) Vymaž všude, kde ukládáš, fce které slouží k ukládání.

~> 2) Nahraj si z knihovny y_commands a používej ten. Nepoužívej zbytečně zcmd.

~> 3) Doporučuji podmínky, kde kontroluješ adminlevel dělat ve stylu: if(level < číslo) return zpráva a určitě bych to neřešil uzavřením souboru, kde nic neukládáš a ještě návratovou hodnotou 1.

~> 4) V některých případech INI_Close vrací false, když se třeba něco pokazí... možná proto ti píše, že ten příkaz nezná. A ty tam ten soubor otevíráš, pak zavíráš a ještě znovu zavíráš.

~> 5) Při tom načítání zbytečně přidáváš specifikátor do callbacku.

~> To pro začátek to nejdůležitější...

Link to comment
Share on other sites

  • 0

~> YSI je dostatečně rychlé a propracované. Nebude tolik zatěžovat server, i když to bude ukládat jednu smrt po druhé... pravda, není to moc praktické, ale nikdo mu za to trhat hlavu nebude.

 

 

~> 1) Vymaž všude, kde ukládáš, fce které slouží k ukládání.

~> 2) Nahraj si z knihovny y_commands a používej ten. Nepoužívej zbytečně zcmd.

~> 3) Doporučuji podmínky, kde kontroluješ adminlevel dělat ve stylu: if(level < číslo) return zpráva a určitě bych to neřešil uzavřením souboru, kde nic neukládáš a ještě návratovou hodnotou 1.

~> 4) V některých případech INI_Close vrací false, když se třeba něco pokazí... možná proto ti píše, že ten příkaz nezná. A ty tam ten soubor otevíráš, pak zavíráš a ještě znovu zavíráš.

~> 5) Při tom načítání zbytečně přidáváš specifikátor do callbacku.

~> To pro začátek to nejdůležitější...

Dobrá, takže problém s tím, že mi to píše, že příkaz neexistuje je nejspíše vyřešen...

 

Vyřešen tímto způsobem:

public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "psoeidut", true))
{
   SCM(playerid, -1, "Testovací příkaz");
   return 1;
}
return 0;
}

měl jsem tam jen

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}

Ale opět trochu nechápu cos mi tu vypsal... :/ Jak zabraním například tomu, aby mi INI_Close nevracelo false? Respektive, dá se tedy něják řešit celý problém s tím, že se mi neukládá, když hráč umře? Nezáleží například na pozici toho callbacku?

Link to comment
Share on other sites

  • 0

Co se týče ZCMD tak OnPlayerCommandText by měl vypadat takto jestli používáš klasický .inc

public OnPlayerCommandText(playerid, cmdtext[]){
	return zcmd_OnPlayerCommandText(playerid, cmdtext);
}

Pro případ že to máš a i tak ti to píše tak máš chybu nejpravděpodobněji přímo v tom určitém příkazu.

Link to comment
Share on other sites

  • 0

Pokud ma ZCMD tak se vola OnPlayerCommandText uvnitr includu, nikoliv ve scriptu jako takovem.

 

Refova rada je hloupost (nezacykli se to?)

 

K ukladani v OnPlayerDeath. Ukladas spatne zabiti (ukladas je do souboru hrace s id playerid a ne killerid), ale melo by ti to fungovat. Vytvaris nekde soubory? Vraci ti userpath spravnou cestu?

Edited by Lukasz
Link to comment
Share on other sites

  • 0

Ale opět trochu nechápu cos mi tu vypsal... :/ Jak zabraním například tomu, aby mi INI_Close nevracelo false?

~> Ty otevíráš soubor, pak ho načítáš a pak ho zavíráš pro ukládání a pak opět zavíráš pro ukládání... To je jako, kdybys položil krabici, otevřel jí, zavřel a chtěl jí zavřít znova... úplná hloupost... INI_Close slouží k ukládání, INI_ParseFile slouží k načítání:

/* -----------------------------------------------*/
OnPlayerConnect(...) {

	INI_ParseFile(..., "NahratDATA", .bExtra = true, .extra = playerid);
	return ...;
}

forward NahratDATA(...);
public NahratDATA(...) {

	INI_Int(...);
	return ...;
}

/* -----------------------------------------------*/
OnPlayerDisconnect(...){

	new INI: Soubor = INI_Open(...);
	INI_WriteInt(Soubor, ...);
	INI_Close(Soubor);
	return ...;
}
/* -----------------------------------------------*/
~> Netuším, jak ti to ještě lépe vysvětlit...
Link to comment
Share on other sites

  • 0

~> Ty otevíráš soubor, pak ho načítáš a pak ho zavíráš pro ukládání a pak opět zavíráš pro ukládání... To je jako, kdybys položil krabici, otevřel jí, zavřel a chtěl jí zavřít znova... úplná hloupost... INI_Close slouží k ukládání, INI_ParseFile slouží k načítání:

/* -----------------------------------------------*/
OnPlayerConnect(...) {

	INI_ParseFile(..., "NahratDATA", .bExtra = true, .extra = playerid);
	return ...;
}

forward NahratDATA(...);
public NahratDATA(...) {

	INI_Int(...);
	return ...;
}

/* -----------------------------------------------*/
OnPlayerDisconnect(...){

	new INI: Soubor = INI_Open(...);
	INI_WriteInt(Soubor, ...);
	INI_Close(Soubor);
	return ...;
}
/* -----------------------------------------------*/
~> Netuším, jak ti to ještě lépe vysvětlit...

 

Jo tákhle, takže Close pouze jednou?

Link to comment
Share on other sites

  • 0

Jo tákhle, takže Close pouze jednou?

Kámo, jestli nepochopíš ani toto, tak se radši na pawn vykašli. Sakra tak trochu logicky přemýšlím né?! Když otevřeš okno a pak ho zavřeš tak ho přeci nebudeš zavírat znova když je už zavřené né? Sakra hochu trochu přemýšlej. Chápu, že nikdo není dokonalý a že se to snažíš pochopit, ale toto je už moc...

Link to comment
Share on other sites

  • 0

Když otevřeš okno a pak ho zavřeš tak ho přeci nebudeš zavírat znova když je už zavřené né?

 

~> To je jako, kdybys položil krabici, otevřel jí, zavřel a chtěl jí zavřít znova... úplná hloupost...

Link to comment
Share on other sites

  • 0
  • Globální moderátor

Zkráceně, už to asi chápe a když se to tak vezme, tak defacto z ini udělal dini :d

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