[TUT]sscanf - Admin Script

Sekcia určená pre programovací jazyk pawn.

[TUT]sscanf - Admin Script

Poslaťod KarTooN » Sob 16. Júl 2011 22:11:44

Zdravím. Tohle je můj první Tutoriál. sscanf je hodně používaný, dá se použít na příkazy, třeba do Admin Scriptu apod. Nyní vám ukážu, co musíte udělat, aby jste tohle mohli použít.

mezi definice napíšeme
Kód: Vybrať všetko
#define RED 0xFF0000AA//definice červené barvy
#define SCM SendClientMessage//Definice pro SendClientMessage... zabere to méně času


mezi newy napíšeme
Kód: Vybrať všetko
new level[MAX_PLAYERS]


mezi stocky napíšete tohle
Kód: Vybrať všetko
stock sscanf(string[], format[], {Float,_}:...)
{
   #if defined isnull
      if (isnull(string))
   #else
      if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
   #endif
      {
         return format[0];
      }
   #pragma tabsize 4
   new
      formatPos = 0,
      stringPos = 0,
      paramPos = 2,
      paramCount = numargs(),
      delim = ' ';
   while (string[stringPos] && string[stringPos] <= ' ')
   {
      stringPos++;
   }
   while (paramPos < paramCount && string[stringPos])
   {
      switch (format[formatPos++])
      {
         case '\0':
         {
            return 0;
         }
         case 'i', 'd':
         {
            new
               neg = 1,
               num = 0,
               ch = string[stringPos];
            if (ch == '-')
            {
               neg = -1;
               ch = string[++stringPos];
            }
            do
            {
               stringPos++;
               if ('0' <= ch <= '9')
               {
                  num = (num * 10) + (ch - '0');
               }
               else
               {
                  return -1;
               }
            }
            while ((ch = string[stringPos]) > ' ' && ch != delim);
            setarg(paramPos, 0, num * neg);
         }
         case 'h', 'x':
         {
            new
               num = 0,
               ch = string[stringPos];
            do
            {
               stringPos++;
               switch (ch)
               {
                  case 'x', 'X':
                  {
                     num = 0;
                     continue;
                  }
                  case '0' .. '9':
                  {
                     num = (num << 4) | (ch - '0');
                  }
                  case 'a' .. 'f':
                  {
                     num = (num << 4) | (ch - ('a' - 10));
                  }
                  case 'A' .. 'F':
                  {
                     num = (num << 4) | (ch - ('A' - 10));
                  }
                  default:
                  {
                     return -1;
                  }
               }
            }
            while ((ch = string[stringPos]) > ' ' && ch != delim);
            setarg(paramPos, 0, num);
         }
         case 'c':
         {
            setarg(paramPos, 0, string[stringPos++]);
         }
         case 'f':
         {

            new changestr[16], changepos = 0, strpos = stringPos;
            while(changepos < 16 && string[strpos] && string[strpos] != delim)
            {
               changestr[changepos++] = string[strpos++];
                }
            changestr[changepos] = '\0';
            setarg(paramPos,0,_:floatstr(changestr));
         }
         case 'p':
         {
            delim = format[formatPos++];
            continue;
         }
         case '\'':
         {
            new
               end = formatPos - 1,
               ch;
            while ((ch = format[++end]) && ch != '\'') {}
            if (!ch)
            {
               return -1;
            }
            format[end] = '\0';
            if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
            {
               if (format[end + 1])
               {
                  return -1;
               }
               return 0;
            }
            format[end] = '\'';
            stringPos = ch + (end - formatPos);
            formatPos = end + 1;
         }
         case 'u':
         {
            new
               end = stringPos - 1,
               id = 0,
               bool:num = true,
               ch;
            while ((ch = string[++end]) && ch != delim)
            {
               if (num)
               {
                  if ('0' <= ch <= '9')
                  {
                     id = (id * 10) + (ch - '0');
                  }
                  else
                  {
                     num = false;
                  }
               }
            }
            if (num && IsPlayerConnected(id))
            {
               setarg(paramPos, 0, id);
            }
            else
            {
               #if !defined foreach
                  #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS_EX; %2++) if (IsPlayerConnected(%2))
                  #define __SSCANF_FOREACH__
               #endif
               string[end] = '\0';
               num = false;
               new
                  name[MAX_PLAYER_NAME];
               id = end - stringPos;
               foreach (Player, playerid)
               {
                  GetPlayerName(playerid, name, sizeof (name));
                  if (!strcmp(name, string[stringPos], true, id))
                  {
                     setarg(paramPos, 0, playerid);
                     num = true;
                     break;
                  }
               }
               if (!num)
               {
                  setarg(paramPos, 0, INVALID_PLAYER_ID);
               }
               string[end] = ch;
               #if defined __SSCANF_FOREACH__
                  #undef foreach
                  #undef __SSCANF_FOREACH__
               #endif
            }
            stringPos = end;
         }
         case 's', 'z':
         {
            new
               i = 0,
               ch;
            if (format[formatPos])
            {
               while ((ch = string[stringPos++]) && ch != delim)
               {
                  setarg(paramPos, i++, ch);
               }
               if (!i)
               {
                  return -1;
               }
            }
            else
            {
               while ((ch = string[stringPos++]))
               {
                  setarg(paramPos, i++, ch);
               }
            }
            stringPos--;
            setarg(paramPos, i, '\0');
         }
         default:
         {
            continue;
         }
      }
      while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
      {
         stringPos++;
      }
      while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
      {
         stringPos++;
      }
      paramPos++;
   }
   do
   {
      if ((delim = format[formatPos++]) > ' ')
      {
         if (delim == '\'')
         {
            while ((delim = format[formatPos++]) && delim != '\'') {}
         }
         else if (delim != 'z')
         {
            return delim;
         }
      }
   }
   while (delim > ' ');
   return 0;
}

potom ještě tohle
Kód: Vybrať všetko
stock pName(playerid)
{
   new i[MAX_PLAYER_NAME];
   GetPlayerName(playerid,i,MAX_PLAYER_NAME);
   return i;
}

A můžeme jít přímo na příkaz, třeba na Kick.

dcmd_kick(playerid,params[])
{
new id, duvod[64]; //newy, nepiště nahoru
if(level[playerid]<3) return SCM(playerid,RED,"Nemáš dostatečný Admin Level !"); //Podmínka na Admin level
if(sscanf(params, "uz", id, dovod)) return SCM(playerid,RED,"Použití: /kick ID Důvod"); //pokud není napsáno dobře
if(!IsPlayerConnected(id)) return SCM(playerid,RED,"Hráč není na servery !"); //pokud ID není na serveru
if(id == playerid) return SCM(playerid,RED,"Nemůžeš vyhodit sám sebe !"); //pokud zadadné ID je ID hráče
if(level[id]>level[playerid]) return SCM(playerid,RED,"Nemůžeš vyhodit admina s levelom větším než máš ty !"); //pokud je ID vyššího levelu
if(strlen(duvod)>80) return SCM(playerid,RED,"Příliž dlhý důvod !");//pokud je moc písmen(to znamená to duvod[64]
if(strlen(duvod)<4) return SCM(playerid,RED,"Příliž krátký důvod!");//pokud je málo písmen jako důvod
new str[128];//používám 128
format(str,128,"[ Admin Script ]Admin %s vyhodil hráče %s [Důvod %s ]" ,pName(playerid), pName (id), duvod);
SCMTA(RED,str);
Kick(id);
print(str);
return 1;
}

nakonec dejte do OnPlayerCommand text
dcmd(kick,4,cmdtext);

Pokud bude chyba, tak hlaste...

Pro kopíráky: Je to do modu, nebo FS... neudělal jsem tam registraci a ukládání do složky kvůli toho, aby jste nekopírovali, tak nehlaste stupidní errory (pokud uděláte Ctrl+C a Ctrl+V tak jich to naháže kopu... ;)
Obrázok
KarTooN
Super člen
Super člen
 
Príspevky: 1320
Registrovaný: Pon 27. Jún 2011 9:49:07
Bydlisko: Opava
Obľúbený server?: PTPM

Re: [TUT]sscanf - Admin Script

Poslaťod MarKo » Ned 17. Júl 2011 8:17:40

Musím podotknout, že to má Morloxer na serveru a hodí se to  ;D
Propadák roku 2011
1. Místo - Admin Vexta
Obrázok užívateľa
MarKo
Člen
Člen
 
Príspevky: 412
Registrovaný: Sob 11. Sep 2010 13:16:46

Re: [TUT]sscanf - Admin Script

Poslaťod Angel » Ned 17. Júl 2011 9:57:49

Takže:
-lepšie je si dať sscanf do includu, aspoň v tom neni taký bordel
-TuT s vysvetlením 0 bodov
-niesom si istý ale: premennú duvod máš na 64 znakov, ale pri podmienke máš, že môže použiť aj viac ako 64 znakov, no čo by sa potom stalo neviem, netestoval som ani nič pod.
-
new level[MAX_PLAYERS]
chýba ;
-takisrto nemáš hore definované SCMTA -
SCMTA(RED,str);

-Ani nebude fungovať lebo:
new id, duvod[64]; //newy, nepiště nahoru
if(sscanf(params, "uz", id, dovod)) return SCM(playerid,RED,"Použití: /kick ID Důvod"); //pokud není napsáno dobře

a na koniec: určite si to odniekial skopíroval, viz. hore

1/10 vieš použiť CTRL + C & CTRL + V :)
Naposledy upravil Angelus dňa Ned 17. Júl 2011 10:00:01, celkovo upravené 1
Angel
 

Re: [TUT]sscanf - Admin Script

Poslaťod Iron[CZ] » Ned 17. Júl 2011 11:55:09

Podle mě je sscanf blbost. Mnohem rychlejší a užitečnější je CHRFIND nebo pro příkazy se 2 a více parametry použít MCMD.
Obrázok užívateľa
Iron[CZ]
Nováčik
Nováčik
 
Príspevky: 125
Registrovaný: Pon 19. Júl 2010 20:56:53
Bydlisko: Týniště nad Orlicí

Re: [TUT]sscanf - Admin Script

Poslaťod KarTooN » Ned 17. Júl 2011 17:40:01

[SBS]CloSeR píše:Musím podotknout, že to má Morloxer na serveru a hodí se to  ;D

a od koho myslíš, že to má? ???
Obrázok
KarTooN
Super člen
Super člen
 
Príspevky: 1320
Registrovaný: Pon 27. Jún 2011 9:49:07
Bydlisko: Opava
Obľúbený server?: PTPM

Re: [TUT]sscanf - Admin Script

Poslaťod [W]_h1sp3_[R] » Uto 19. Júl 2011 20:49:35

Od samp-forum ¨COPY¨ :D
Obrázok
Obrázok užívateľa
[W]_h1sp3_[R]
Junior
Junior
 
Príspevky: 237
Registrovaný: Sob 30. Okt 2010 11:43:30

Re: [TUT]sscanf - Admin Script

Poslaťod KarTooN » Uto 19. Júl 2011 21:59:42

z modu, který jsem dělal s kámošem...

//Citácia na posledný príspevok sa nepoužíva ! //Angelus
Naposledy upravil Angelus dňa Str 03. Aug 2011 13:27:08, celkovo upravené 1
Obrázok
KarTooN
Super člen
Super člen
 
Príspevky: 1320
Registrovaný: Pon 27. Jún 2011 9:49:07
Bydlisko: Opava
Obľúbený server?: PTPM

Re: [TUT]sscanf - Admin Script

Poslaťod QWER » Str 21. Sep 2011 7:19:39

mcmd je veľmi pomalé a chrfind není tak užitočné ako sscanf a sscanf2 je ešte lepšie ako všetký podobné funkcie "explode,... tých ale je"
Všetci sú netopieri iba ja som Batman
Obrázok užívateľa
QWER
Nováčik
Nováčik
 
Príspevky: 65
Registrovaný: Pia 02. Jan 2009 7:49:32


Späť na Pawn

Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť

cron