Jump to content

[F]Lekce 7. - Hratky s DCMD


ffredyk

Recommended Posts

  • Majitel

Nekdo z vas to jiz zna a nekdo jeste ne..

 

Zde vam ukazu jak DCMD pouzivat a co vsechno se s nim da delat..

 

Nejdrive samotna DCMD definice:

 

#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1

 

 

Pokud ted chceme udelat prikaz pres DCMD musime si vytvorit neco jako "listener" nebo-li "poslouchac", ktery nam zajisti v pripade napsani hracem naseho prikazu, ze se vyvola ten spravny stock..

 

Tak tedy.. Napiseme si naseho posluchace do publicu OnPlayerCommandText

dcmd(prikaz,5,cmdtext);

 

Ted si vysvetlime proc to je tak a co to tam vsechno je..

Zacneme prvnim parametrem jimz je "prikaz". Je to text prikazu (bez /), ktery hrac musi napsat aby se nas prikaz vyvolal. "5" Je delka prikazu. Je to pro pozdejsi urcovani parametru prikazu, takze vzdy udavejte hodnotu delky vaseho prikazu (Kvuli lenosti pocitat se muzete nekdy divit proc vam prikaz nefunguje tak jak ma.. Kdyz napriklad mate prikaz "kill" a jako delku date 1 tak vam ve hre nepujde napsat /kill nybrz /k coz nepotrebujeme :) ). A nakonec "cmdtext" je zdroj cteni naseho poslouchace.. To znamena, ze DCMD se da pouzit i v OnPlayerText, OnRconCommand apod. (Dokonce ho muzete pouzit i v OnPlayerDisconnect pri urcovani duvodu.. Jen musite integer "reason" prevest na string jenz bude poslouchac cist..)

 

Ted musime udelat stock jenz bude listener vyvolavat.. Neco o stocich a publicich si rozebereme v pristi lekci.. Takze ted se zatim nemusite obtezovat jak to funguje.. M osobne to, ze jsem umel DCMD driv nez jsem plne chapal stocky a publicy hodne pomohlo je pochopit.

 

Takze si vytvorime kdekoliv v modu (Ve svete pawneru jsou zabehnute zvyky, ze DCMD stocky piseme bud pod/nad public OnPlayerCommandText a nebo nakonec/zacatek modu.. Nikdo neni rad, pri oprave ciziho scriptu, kdyz musi vse slozite hledat) stock na nas DCMD listener:

dcmd_prikaz(playerid,params[])
{
return 1;
}

 

Tento prikaz sam o sobe nic nedela.. Proto do nej pridame vypis textu do klientovo chatu.

 

dcmd_prikaz(playerid,params[])
{
SendClientMessage(playerid,BARVA,"Zadal jsi prikaz!");
return 1;
}

 

Barvu si dosadte sami.. Nejsem tu jak vase chuva a tim, ze tam nebudu psat barvu vas donutim aspon minimalne premyslet v cem j chyba (Myslim ty, kteri to oznaci, zmacknout CTRL + C vjedou si do pawna a CTRL + V). Kdyz nad tim budete aspon malinko premyslet, vas mozek bude pracovat s informacemi a stejne jako pocitac si nejaky informace musi ulozit. Akorat, ze pocitac si docasne informace hned maze, mozek vsak nikoliv.

 

Ted jiz znate zakladni prikaz a jak do nej vkladat funkce.. Nyni si vysvetlime proc je tam to zahadne "return 1;". Je tam z toho duvodu, ze kdyby tam nebylo, nebo by tam bylo 0 (tudiz by prikaz vracel 0 = false) Server by bral prikaz jako neznamy a napsal by bylim textem: "Server Unknown Command" nebo neco v tom smyslu..

 

Ted si napisem co je "params[]" a k cemu nam slouzi.

 

"params[]" je zde jako text toho, co je napsano za prikazem (tedy presneji "/prikaz " a dal uz je obssah "params[]"). Da se vyuzivat k urcovani cisel, textu a ruznych pozic (desetinnych cisel). My si ukazeme jak params pouzit jako urcivani cisel a textu..

 

Nejdriv si ukazeme prikaz warpu ve stylu "/warp [1 - 3]".

dcmd_warp(playerid,params[])
{
switch(strval(params))
{
case 1:
{
SetPlayerPos(playerid,X,Y,Z);
}
case 2:
{
SetPlayerPos(playerid,X,Y,Z);
}
case 3:
{
SetPlayerPos(playerid,X,Y,Z);
}
default:
{
SendClientMessage(playerid,BARVA,"Prikaz je ve tvaru: /warp 1 - 3");
}
}
return 1;
}

 

"switch" jsme si vysvetlili v minule lekci (doufam) a "strval" je jednoduchy prikaz k prevodu stringu na integer. Tento prikaz je jasny.. Tak si zkusime prikaz na vypsani textu jako "console - nastext".

 

V prikazu vyuzijeme tzv. "formatovani stringu", jenz znamena to, ze si string upravime presne podle nasich predstav (tohle opravdu nevim jak bych vam vysvetlil.. Proste a jednoduse, dela se s tim kazdy pokrocilejsi vystup textu).

dcmd_prikaz(playerid,params[])
{
if(strlen(params))
{
new str[80];
format(str,80,"console - %s",params);
SendClientMessage(playerid,0xFFFFFFFF,str);
}
else
{
SendClientMessage(playerid,BARVA,"Prikaz: /prikaz [text]");
}
return 1;
}

 

Kdyz ptom ve hre napr. napisete "/prikaz ahoj" tak se vam do chatu napise bíle "console - ahoj". Doufam, ze jste pochopili.. Ted vam jeste ukazu zpusob, jakym se da docilit jedne funkce pomoci 2 a vice prikazu. Tedy abych vam to vysvetlil.. Mate treba jeden velky prikaz. Ale ted potrebujete uplne stejny prikaz, ale na jinou syntaxi (napr. prvni prikaz se pise "/warp 1 - 3" a druhej treba "/w 1 - 3". A chcete aby plnili tu stejnou funkci, ale nechcete zbytecne psat 2 stocky uplne stejny.. Da se toho docilit jednoduse:

dcmd(warp,4,cmdtext);
if(strcmp(cmdtext,"/w")) dcmd_warp(playerid,cmdtext[strlen(cmdtext)+1]);

 

Doufam, ze tutorial pomuze.. Priste cokoliv !! :d

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

7/10 protože jsi tam ještě mohl říct, jak udělat příkaz například s ID. A pokud možno příští lekci chci chrfind :d

 

Dyt to tam je jenom tam nepracoval s ID jako hracovou ale s /warpy 1-3 a to je stejny,

Link to comment
Share on other sites

no pekny to je havne /w nebo /warp :) 10/10

Tak to je jednodussi, protoze dcmd je vlastne stock jak tam psal ffredyk takze ty vlastne udelas -

 

if(strcmp(cmdtext,"/warp")) // kdyz napise /warp
dcmd_warp(playerid,cmdtext[strlen(cmdtext)+1]); //spusti se dcmd_warp

Link to comment
Share on other sites

  • 2 weeks later...
no pekny to je havne /w nebo /warp :) 10/10

Tak to je jednodussi, protoze dcmd je vlastne stock jak tam psal ffredyk takze ty vlastne udelas -

 

if(strcmp(cmdtext,"/warp")) // kdyz napise /warp
dcmd_warp(playerid,cmdtext[strlen(cmdtext)+1]); //spusti se dcmd_warp

 

a co třeba k tomu ještě

dcmd_warp(playerid,params[]){
OnPlayerCommandText(playerid,"/warp");

 

:d nekonecny warp

 

 

case 1:
{
SetPlayerPos(playerid,X,Y,Z);
}

nebylo by jednodušší

case 1: return SetPlayerPos(playerid,X,Y,Z);

Link to comment
Share on other sites

  • Majitel
no pekny to je havne /w nebo /warp :) 10/10

Tak to je jednodussi, protoze dcmd je vlastne stock jak tam psal ffredyk takze ty vlastne udelas -

 

if(strcmp(cmdtext,"/warp")) // kdyz napise /warp
dcmd_warp(playerid,cmdtext[strlen(cmdtext)+1]); //spusti se dcmd_warp

 

a co třeba k tomu ještě

dcmd_warp(playerid,params[]){
OnPlayerCommandText(playerid,"/warp");

 

:d nekonecny warp

 

 

case 1:
{
SetPlayerPos(playerid,X,Y,Z);
}

nebylo by jednodušší

case 1: return SetPlayerPos(playerid,X,Y,Z);

 

Ja hraju na prehlednost.. A ne na spatlanost ;)

Link to comment
Share on other sites

a jaký má proboha racionalní důvod používat v něčem jako je switch returny?

 

Jinak

if(strcmp(cmdtext,"/warp")) dcmd_warp(playerid,cmdtext[strlen(cmdtext)+1]);

má dělat co?. Porovnáváš co to napíše s textem /warp a když se nerovnají voláš stock dcmd_warp a předáváš mu jako parametr neexistující pole cmdtextu :shock: :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...