Skocz do zawartości

Rekomendowane odpowiedzi

W ogóle dla mnie jest to dosyć dziwne, ponieważ, skoro nie wpisałem argumentów komendy, to params powinno być puste i jest, chodź prawdę mówiąc jest to po prostu zbiór '\0', które można edytować. Jednak pozostaje kwestia - jaki rozmiar przybiera nasz params? Wydaje mi się, że:

128 - Długość komendy - 1 (Znak '/')

Dlaczego 128? Ponieważ taka jest maksymalna długość możliwej do wysłania wiadomości, czyli w 99% też dla komendy, a params jest wartością wydzieloną z cmd w Callbacku OnPlayerCommandText, czyli jest częścią cmd.

Idąc tym tropem jego edycja jest dosyć ryzykowna, chyba, że znamy dokładną długość komendy, wtedy można to obliczyć. Dla przykładu komenda /zw:

128 - 2 ("zw") - 1 (Znak '/') = 125

I w tym momencie wiemy, że możemy edytować params do 125 znaków.

Dzięki za poświęconą uwagę.

Pozdrawiam, NG!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W sumie nie rozumiem jaki związek ma twój wywód z tym tematem.Tak powinno nadawać się rozmiar tablicy 128, jeżeli dajemy możliwość wpisania tekstu jak dla komendy /me, ale po co tworzyć tablicę o takim rozmiarze jeżeli ilość znaków my ustalamy ? tylko musimy uważać, bo największy rozmiar nicku to 24 znaki. 

Ogólnie przy komendach, które nie używają params pisze się cmdtext[].

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Restorer: Wyjaśniałem to, o czym powiedziałem, że to wyjaśnię.

Ogólnie przy komendach, które nie używają params pisze się cmdtext[].

Kto tak powiedział? Mogę nawet napisać blehbleh[] i będzie dobrze.

P.S. Ja po prostu sugerowałem w optymalizacji komend zcmd, żeby zamiast tworzyć osobne tablice, które tylko marnują pamięć, skorzystać z istniejącej - params i ją modyfikować, a mój poprzedni post wyjaśniał, jak obliczyć maksymalną wielkość tej tablicy. Ogólnie trochę to zagmatwane, ale ktoś taki, jak Ty się połapie.

:)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Kto tak powiedział? Mogę nawet napisać blehbleh[] i będzie dobrze.

No tak, ale cmdtext[], wygląda profesjonalniej :), ogólnie mam w nawyku pisanie bez namysłu cmdtext[] i innych funkcji jestem wzrokowcem dlatego też mam nie raz faile(nigdy nie chce mi się zaglądać nigdzie).

 

Dobra koniec naszego gadania za pokutę może damy tutaj po jednej komendzie xD

Proste /kill + format.

CMD:kill(playerid, cmdtext[])
{
	new tekst[56];
	SetPlayerHealth(playerid,0);
	format(tekst,56,"Wiadomość:%s popełnił samobójstwo.", PlayerName(playerid));
	SendClientMessageToAll(0xFFFFFFFF,tekst);
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W ogóle dla mnie jest to dosyć dziwne, ponieważ, skoro nie wpisałem argumentów komendy, to params powinno być puste i jest, chodź prawdę mówiąc jest to po prostu zbiór '\0', które można edytować. Jednak pozostaje kwestia - jaki rozmiar przybiera nasz params? Wydaje mi się, że:

128 - Długość komendy - 1 (Znak '/')

Dlaczego 128? Ponieważ taka jest maksymalna długość możliwej do wysłania wiadomości, czyli w 99% też dla komendy, a params jest wartością wydzieloną z cmd w Callbacku OnPlayerCommandText, czyli jest częścią cmd.

Idąc tym tropem jego edycja jest dosyć ryzykowna, chyba, że znamy dokładną długość komendy, wtedy można to obliczyć. Dla przykładu komenda /zw:

128 - 2 ("zw") - 1 (Znak '/') = 125

I w tym momencie wiemy, że możemy edytować params do 125 znaków.

Dzięki za poświęconą uwagę.

Pozdrawiam, NG!

params[] ma wielkość tekst + 1 bo jest to tablica nieokreślona i przyjmuje rozmiar tekstu, jest to public wiec nie powinno się zmieniać niczego w tej tablicy tylko tworzyć nowe (szkoda że sizeof w pawn jest tak prymitywne, bo by się łatwo sprawdziło)

bo niby czemu 128 ? wywołanie komendy to CallLocalFunction gdzie tam masz określanie wielkości tablicy ?

@UP po to wymyślono nazwę params by się z cmdtext nie myliło bo cmdtext zawsze było rozumiane jako cała komenda a nie jakaś jej część

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

CMD na nowy nick gracza

dcmd_nick(playerid, params[])
{
	new nnick[MAX_PLAYER_NAME];
	if(sscanf(params, "s", nnick))
		return SendClientMessage(playerid, GREEN, "Wpisz /Nick [Nowy Nick]");
	SetPlayerName(playerid, nnick);
	format(String,sizeof(String),"Twoj Nowy Nick To: %s",nnick);
	SendClientMessage(playerid,-1, String);
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/pijany

Prosta komenda, która sprawdza czy  DrunkLevel gracza jest równy zeru, jeżeli tak to DrunkLevel wzrasta do 50000 jeżeli nie to ustawia DrunkLevel na 0 i wysyła wiadomość.

CMD:pijany(playerid, cmdtext[])
{
	if(GetPlayerDrunkLevel(playerid) == 0)
	{
	    SetPlayerDrunkLevel(playerid,50000);
	    SendClientMessage(playerid,BIALY,"Jesteś pijany, aby wytrzeźwieć wpisz tą komendę jeszcze raz.");
	}
	else
	{
	    SetPlayerDrunkLevel(playerid,0);
	    SendClientMessage(playerid,BIALY,"Nie pij więcej.");
	}
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

CMD:cos(playerid, params[])
{
	new player;
	if(sscanf(params, "d", player))
		return SendClientMessage(playerid, 1, "/cos id");

	player jest to id gracza ktoremu chcesz cos zrobic.
	return 1;
}

Pod zcmd i sscanf.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

CMD:cos(playerid, params[])
{
	new player;
	if(sscanf(params, "d", player))
		return SendClientMessage(playerid, 1, "/cos id");

	player jest to id gracza ktoremu chcesz cos zrobic.
	return 1;
}
Pod zcmd i sscanf.
Po co sscanf? albo
if (strlen (params) > 39)
    return SendClientMessage (kolor, playerid, "Złe id gracza!");

player = strval (params);
Jak już sscanf, to też do uwzględnienia podania nicku, więc zamiast "d" daj "u", czyli dla strval
CMD:cos(playerid, params[])
{
	if (strlen (params) > 39)
              return SendClientMessage (kolor, playerid, "Złe id gracza!");

        player = strval (params);
        if (!IsPlayerConnected (player))
             return SendClientMessage (kolor, playerid, "Nie odnaleziono gracza o podanym id!");
	player jest to id gracza ktoremu chcesz cos zrobic.
	return 1;
}
a dla sscanf
CMD:cos(playerid, params[])
{
        new player;
	if(sscanf(params, "u", player))
		return SendClientMessage(playerid, 1, "/cos id");

        if (player == INVALID_PLAYER_ID)
               return SendClientMessage (kolor, playerid, "Nie odnaleziono gracza o podanym id/nicku!");       

	player jest to id gracza ktoremu chcesz cos zrobic.
	return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Potrzebne jest Zcmd i sscanf

Komenda : /dajbron id id broni ammo -gdzie w ammo możemy dać od 1-99999 a 99999= nieskończoność

CMD:dajbron(playerid, params[])

{

    if(IsPlayerAdmin(playerid))

    {

        new id,weap,ammo,str[128],name[MAX_PLAYER_NAME],WeapName[32];

        if(sscanf(params,"uii",id,weap,ammo)) return SendClientMessage(playerid,0xFF9900AA,"WPISZ: /db [id] [id-broni] [ammo]");

        if(!IsPlayerConnected(id)) return SendClientMessage(playerid,0xFF0000FF,"Błąd: Nie ma takiego gracza!");

        GetPlayerName(playerid,name,sizeof(name));

        GetWeaponName(weap,WeapName,32);

        format(str,sizeof(str),"Admin %s dał ci %s i %d naboi",name,WeapName,weap,ammo);

        SendClientMessage(id,0xFF9900AA,str);

        GivePlayerWeapon(id,weap,ammo);

    }

    else return 0;

    return 1;

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/100hp

Daje graczowi życie

if (strcmp("/100hp", cmdtext, true, 10) == 0)
	{
	 if(GetPlayerMoney(playerid) < 2000)
  		return SendClientMessage(playerid, 0x0000FFAA, "(Błąd) Nie masz tyle kasy");
	SetPlayerHealth(playerid, 100);
	GivePlayerMoney(playerid, -2000);
	SendClientMessage(playerid, COLOR_YELLOW, "Kupiłeś życie za 2000$");

	}
	return 1;
/armour Daje graczowi kamizelkę
if (strcmp("/armour", cmdtext, true, 10) == 0)
	{
    if(GetPlayerMoney(playerid) < 3500)
        return SendClientMessage(playerid, 0x0000FFAA, "(Błąd) Nie masz tyle kasy"); 
    SetPlayerArmour(playerid, 100);
    GivePlayerMoney(playerid, -3500);
    SendClientMessage(playerid, 0xFFFFADAA, "Kupiłeś kamizelkę za 3500$ ");

	}
	return 1;
/zw Wysyła wiadomość do graczy,że jakiś gracz zaraz wraca i blokuje mu kontrolę
if (strcmp("/zw", cmdtext, true, 10) == 0)
	{
 	new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));

    format(string, sizeof(string), "%s zaraz wraca...", name);
    SendClientMessageToAll(COLOR_LIGHTBLUE, string);
    TogglePlayerControllable(playerid, 0);
    
    }
	return 1;
/jj Wysyła wiadomość,że gracz już jest i odblokowuje mu kontrole
if (strcmp("/jj", cmdtext, true, 10) == 0)
	{
	new name[MAX_PLAYER_NAME], string[24+MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));

    format(string, sizeof(string), "%s już jest!", name);
    SendClientMessageToAll(COLOR_LIGHTBLUE, string);
    TogglePlayerControllable(playerid, 1);
    
    }
    return 1;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/nrg

Daje graczowi motor i od razu wsadza do pojazdu

if (strcmp("/nrg", cmdtext, true, 10) == 0)
	{
	new vehicleid;
	new Float:X,Float:Y,Float:Z,Float:Angle;
	GetPlayerPos(playerid,X,Y,Z);
	GetPlayerFacingAngle(playerid,Angle);
	GetPlayerVehicleID(playerid);
	vehicleid=CreateVehicle(522,X,Y,Z,Angle,-5,-5,600);
	PutPlayerInVehicle(playerid, vehicleid, 0);
	SendClientMessage(playerid, COLOR_GREEN,"Dostałes darmowe NRG");

	}
	return 1;

Testowane i działa  ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/losowanie

Gracz może coś wygrać :)

if (strcmp("/losowanie", cmdtext, true, 10) == 0)
	{
	switch(random(7))


	{
		case 0:

		{
			SetPlayerHealth(playerid, 100);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś 100hp!");

		}
		case 1:

		{
			SetPlayerArmour(playerid, 100);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś kamizelkę!");

		}
		case 2:

		{
			GivePlayerMoney(playerid, 25000);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś 25000$!");

		}
		case 3:

		{
			GivePlayerWeapon(playerid, 4, 1);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś nóż!");

		}
		case 4:

		{
			SetPlayerHealth(playerid, 0);
			SendClientMessage(playerid, COLOR_RED, "Wygrałeś śmierć!");

		}
		case 5:

		{
			GivePlayerWeapon(playerid, 6, 1);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś łopate!");

		}
		case 6:

		{
			SetPlayerPos(playerid, 1685.8323,1586.0614,10.8203);
			SendClientMessage(playerid, COLOR_WHITE, "Wygrałeś teleport na lotnisko Las Venturas!");

		}


	}


	}
	return 1;

Też testowane  ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

/jetpack

Daje graczowi jetpack'a

if (strcmp("/jetpack", cmdtext, true, 10) == 0)
	{
	 SetPlayerSpecialAction(playerid, 2);
         SendClientMessage(playerid, COLOR_GREEN, "Dostałeś jetpack'a!");

	return 1;
        }

Poprawione  ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie lepiej tak?

COMMAND:j(playerid, params[]) return SetPlayerSpecialAction(playerid, 2);
if(!strcmp(cmdtext, "/j", false)) return SetPlayerSpecialAction(playerid, 2);

Ta opcja stworzy chyba tylko pickup, bez możliwości skorzystania z jetpacka, gdyż jetpack to specjalna akcja, więc po co tworzyć pickup, z którego nie będzie można korzystać? :P Do specjalnych akcji jest "Specjalna funkcja".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

CMD:j(playerid, params[])
{
   SetPlayerSpecialAction(playerid, 2);
   return 1;
}
-_- Dla strcmp
if(!strcmp(cmdtext, "/j", false))
{
   SetPlayerSpecialAction(playerid, 2);
   return 1;
}

Zadowolony? ;P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie za bardzo ale też tak pasuje

P.S Mi to działa wpisuje /jetpack spawnuje ale w ułamku sekundy(chyba)mam już jetpacka.

Nie widzę w tym problemu,może być i tak i tak.

po pierwsze twój kod ma duży błąd ponieważ return 1; powinno być przed a nie za klamrą }

po drugie po co bawić się w tworzenie pickup'a jak do dawania jetpack'a jest specjalna funkcja ?

po trzecie, a co jeśli gracz ma skopany mod jetpack'a np. jakimś modem? wtedy dostanie crash gdy wpisze tą cmd a jetpack będzie sobie leżał na ziemi

po czwarte kod jest dużo mniej optymalny i nico niedorzeczny, dam ci przykład: gdy chcesz komuś dać jakąś rzecz to mu ją rzucasz pod nogi czy dajesz do ręki ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie bo próbujesz zwracać wartość funkcji która nie zwraca wartości, lub nie jest do tego przystosowana to błąd.

Nie, to nie jest błąd. SetPlayerSpecialAction zwraca zawsze 1, spokojnie można jej tak używać. Można w ten sposób skrócić kod.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×