Skocz do zawartości
skyvoo

zcmd - szybszy i prostszy system komend

Rekomendowane odpowiedzi

Troszkę ode mnie

Kiedyś, kiedy zcmd robiło się popularne, nie mogłem się do niego przekonać, ale gdy napisałem pierwszą komendę z użyciem zcmd, uznałem, że jest o wiele wygodniej w nim pisać komendy. Jest szybszy od zwykłego strcmp i prostszy.

Link do oryginalnego tematu na forum.sa-mp.com: http://forum.sa-mp.com/showthread.php?t=91354

Instalacja

Na samym początku usuwany zbędny public, który już nam nie będzie potrzebny.

public OnPlayerCommandText(playerid, cmdtext[])
{
	return 0;
}
Teraz na dole mapki dodajemy dwa nowe publici:
public OnPlayerCommandReceived(playerid, cmdtext[])
{
	return 1;
}
Odpowiada on za to, co stanie się przed komendą którą wpisał gracz. Użycie później. Drugi public:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
	return 1;
}
Ten zaś, odpowiada za to co stanie się po, komendzie którą wpisał gracz. Z instalacją to już wszystko. Użycie No to najpierw napiszmy swoją pierwszą komendę. Komendy piszemy poza publicami, najlepiej gdzieś na dole mapki. Komendy możemy pisać na dwa sposoby, CMD:komenda i COMMAND:komenda.
CMD:hp(playerid, params[])
{
	if(GetPlayerMoney(playerid) < 5000)
	    return SendClientMessage(playerid, CZERWONY, "Nie masz tyle kasy! (5000$)");

	GivePlayerMoney(playerid, -5000);
	SetPlayerHealth(playerid, 100.0);
	SendClientMessage(playerid, ZIELONY, "Kupiłeś max hp! (5000$)");
	return 1;
}
Prosta komenda na kupno hp. Jak widzimy zamiast pisać " if(strcmp(cmdtext, "/hp", true) == 0) " piszemy tylko taki krótki kod. Teraz troszkę zastosowania z publicami:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
	if(!success)
	{
		SendClientMessage(playerid, CZERWONY, "Nie ma takiej komendy!");
		return 1;
	}
	return 1;
}
Public, który wykonuje się po wpisanej komendzie, często posłuży nam do wysyłania graczowi wiadomości jeżeli wpisał złą komendę. Argument success zwraca 1 jeżeli komenda została dobrze wpisana, a 0 jeżeli źle. Teraz drugi public, w którym prosta blokada komend (np. w JAIL)
public OnPlayerCommandReceived(playerid, cmdtext[])
{
	if(GetPVarInt(playerid, "JAIL") == 1)
	{
		SendClientMessage(playerid, CZERWONY, "Jesteś w więzieniu, nie możesz używać komend!");
		return 0;
	}
	return 1;
}
I teraz, gdy gracz wpiszę jaką kolwiek komendę i będzie miał PVara JAIL ustawionego na 1 to komenda się nie wykona i tylko wyśle graczowi wiadomość.
CMD:health(playerid, params[])
{
	return cmd_hp(playerid, params);
}
Powyższy kod pokazuje nam jak zrobić komendę odsyłającą do drugiej komendy. Przydatne, bo czasami nie potrzebnie niektórzy robią dwie komendy, a tutaj możemy użyć taki prosty kod. Prosta komenda /kick [id] [powód] Pokarzę wam, jak łatwo można stworzyć komendę /kick [id] [powód] z użyciem sscanf 2.0. Wszystko wytłumaczę za pomocą komentarzy, wtedy zajmie mi to mniej czasu.
CMD:kick(playerid, params[])
{
    new player,//zmienna z id gracza którego chcemy wyrzucić
        powod[64];//tablica z powodem wyrzucenia
    if(!IsPlayerAdmin(playerid))//sprawdzamy czy gracz jest administratorem ( ! ) symbolizuje że if wykona się gdy gracz nie będzie adminem
        return SendClientMessage(playerid, 0xFF0000FF, "Nie jesteś administratorem!"); //jeżeli if się wykona wyśle wiadomość

    if(sscanf(params, "rs[64]", player, powod))//to wytłumacze poza kodem niżej
        return SendClientMessage(playerid, 0xFF0000FF, "/kick (id) (powód)");//jeżeli gracz nic nie wpisze, to wyśle mu tą wiadomość.

    if(!IsPlayerConnected(player))//sprawdzamy czy gracz jest aktywny (gra na serwerze) wykrzyknik ( ! ) oznacza że if się wykona jak gracza nie będzie
        return SendClientMessage(playerid, 0xFF0000FF, "Ten gracz nie jest podłączony!");//tutaj wysyłamy wiadomość jeżeli gracz nie jest podłączony

    //tutaj dajecie sobie formaty itd.
    Kick(player);//wyrzucamy gracza
    return 1;
}

sscanf(params, "rs[64]", player, powod))

params - string do podzielenia

"rs[64]" - argumenty w komendzie ( r - gracz, s[64] - string (powód) )

player, powód - zmienna i tablica do której przypiszemy wcześniejsze argumenty

Więcej na temat sscanf 2.0 - http://pawno.pl/index.php?topic=2180.0

Download

http://pastebin.com/gEe33Ppg

Stworzone przez Slash dla Pawno.PL

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze można by było dopisać o skróceniu komendy.

Np. jak ja to robię może mało optymalnego jest w tym ale 2 linijki i tp gotowy

CMD:lv(playerid, params[])
    return SetPlayerPosEx(playerid, 2157.7390,1037.0997,10.8203,177.6198, 0, "LV");

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@UP

Ale trzeba sobię jeszcze zrobić:

SetPlayerPosEx


Argument success zwraca jeżeli komenda została dobrze wpisana, a 0 jeżeli źle.

Zapomniałeś jednego s  :)

Dobry poradnik.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

co za różnica czy wpiszecie dwa przecinki czy dwie klamry, jak dla mnie samo return czy samą funkcje powinno się stosować do normalnych funkcji i tylko w przypadkach np. przekierować itp. (2 taki same komendy etc.)

@MixX jeśli używasz SetPlayerPosEx jako funkcji stock to wywal to, gdybyś się pytał czemu poczytaj temat o optymalności y_less'a (forum.sa-mp.com)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dam funkcje, oglądnijcie i nie dotykajcie :D xD

stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, Float:rot, interorid, gametxt[])
{
    if (GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
        new carid = GetPlayerVehicleID(playerid);
        LinkVehicleToInterior(carid, interorid);
        SetVehiclePos(carid, x, y, z);
        SetVehicleZAngle(carid, rot);
    }
    else
    {
        SetPlayerInterior(playerid, interorid);
        SetPlayerPos(playerid, x, y, z);
        SetPlayerFacingAngle(playerid, rot);
    }
    GameTextForPlayer(playerid, gametxt, 3000, 1);
    return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może ja się odniosę do poradnika, bo jest w nim kilka nieścisłości, a może ja czegoś nie wiem lub czytać nie potrafię. Po pierwsze nie trzeba dodawać tych dwóch public'ów, o których wspomina autor są one opcjonalne i mogą się przydać, ale nie muszą ;)

Komendy można w sumie robić na 4 sposoby, ale o sposobie EXI w życiu nie słyszałem, nawet kod tego systemu komend temu zaprzecza chyba, że ja coś źle odczytałem. W sumie ten system komend jest dość zabawny, ponieważ każda komenda jest tak na prawdę zwykła funkcją, która można wywołać w kodzie, w sumie bardzo przydatne i elastyczne, bo inne systemu tego nie oferowały za bardzo, nie licząc y_cmd czy jak to się nazywa, bo tego nie używałem, więc nic na ten temat nie mówię, choć znając życie jest to wynalazek, który też takie coś potrafi :) Co do optymalności, o której znów koledzy napomknęli, to moje zdanie jest takie kod powinien działać, a potem można się martwić o optymalność :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bantu pytałem TerinoR'a o to jak można pisać komendy. On podał właśnie te EXI:, choć nie wiem czy to jest dobrze. Zaraz to usunę. Dzięki.

P.S. Bantu, ale tak czy inaczej poradnik dobry? :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jeśli będziemy chcieli napisać komende np. /kick [id] [powod], to trzeba zastosować te argumenty tak jak przy zwykłym systemie CMD ?

Czyli:

new dis[256]; // odpowiada za id
new cos[256]; //odpowiada za powod

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

public OnPlayerCommandReceived(playerid, cmdtext[])

{

  if(GetPVarInt(playerid, "JAIL") == 1)

  {

      SendClientMessage(playerid, CZERWONY, "Jesteś w więzieniu, nie możesz używać komend!");

      return 1;

  }

  return 1;

}

Return powinien być na 0 inaczej komenda się nie zablokuje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Równie dobrze mogło by być tak:

public OnPlayerCommandReceived(playerid, cmdtext[])
{
   if(GetPVarInt(playerid, "JAIL") == 1)
      return SendClientMessage(playerid, CZERWONY, "Jesteś w więzieniu, nie możesz używać komend!");
   return 1;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zajefajny :), że tak to ujmę poradnik.

Jestem za przyklejeniem.

Dzięki czemuś takiemu zacznę pisać w zcmd  :o ...

P.S : Piszcie na temat...(nie chcę wam dyrygować oczywiście  :D)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możecie mi powiedzieć dlaczego gdy włożę includ zcmd.inc do folderu z includami to SAMPCE mi się nie chce włączyć bo wyskakuje błąd? (zwykłe pawno normalnie się włącza)

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

×