Ednostaven Matematika SIS

Započeo Smith.amx, Avgust 11, 2020, 21:30:08 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 5 gostiju pregledaju ovu temu.

Toliko ste usrali kod sa stilom da ne radi uopste, lik je objavio simple system sa timerom koji radi, a ja sam ispravio sve sto nije radilo uz decent stil.
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

Citat: XACK poslato Avgust 12, 2020, 13:43:34 POSLE PODNE
Toliko ste usrali kod sa stilom da ne radi uopste, lik je objavio simple system sa timerom koji radi, a ja sam ispravio sve sto nije radilo uz decent stil.
Nerazuman si, to je to. Ne može čovek ništa da ti objasni...

Nemas sta da objasnjavas, svojim postovima si pokazao sta si trebao da pokazes, dalje nema svrhe nastavljati.  :-\
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

Evo kada već svi pišu bespotrebne primere "Kako najbolje i najlepše napisati kod" (i kako forsirati svoj stil na druge bez razloga jer svako ima svoj stil) haj i ja da napišem jedan u modularnom duhu :D

[pawn]#include <a_samp>

#if defined MATH_TIMER_INTERVAL
    #undef MATH_TIMER_INTERVAL
#endif
#define MATH_TIMER_INTERVAL (5) // Minutes

static gResult;
static bool: gMathActive;

forward Math_Timer();
forward OnCorrectMathAnswer(playerid);

// -
// Api
// -

stock ReturnMathQuizResult()
{
    return gResult;
}

stock bool:IsMathActive()
{
    return gMathActive;
}

stock bool:IsMathAnswer(const buffer[])
{
    if (!IsMathActive)
        return false;

    if (strval(buffer) == ReturnMathQuizResult())
        return true;

    return false;
}

stock ToggleMathActive(bool: toggle)
{
    return (gMathActive = toggle);
}

stock StartMathQuiz()
{
    new
        buffer[128],
        num[3]
    ;

    gResult = (num[0] = random(200)) + (num[1] = random(200)) - (num[2] = random(200));
    ToggleMathActive(true);

    format(buffer, sizeof(buffer), "{FFFFFF}[Math_Timer]: Vnesete go gResultot od izrazot %d+%d-%d i dobivate 10000$!", num[0], num[1], num[2]);
    SendClientMessageToAll(-1, buffer);
}

// -
// Callbacks
// -

public OnFilterScriptInit()
{
   SetTimer("Math_Timer", MATH_TIMER_INTERVAL * 60000, true);
   return 1;
}

public Math_Timer()
{
    StartMathQuiz();
    return 1;
}

public OnPlayerText(playerid, text[])
{
    if(IsMathAnswer(text))
    {
        CallLocalFunction("OnCorrectMathAnswer", "d", playerid);
        return 0;
    }
    return 1;
}

public OnCorrectMathAnswer(playerid)
{
    new pName[MAX_PLAYER_NAME], buffer[128];
    GetPlayerName(playerid, pName, sizeof(pName));
   
    format(buffer, sizeof(buffer), "{FFFFFF}[Math_Timer]: Tocniot odgovor na zadacata bese: %d", gResult);
    SendClientMessageToAll(-1, buffer);
   
    format(buffer, sizeof(buffer), "{FFFFFF}[Math_Timer]: Igracot %s prv go pogodi tocniot gResult i osvoi 1000$.", pName);
    SendClientMessageToAll(-1, buffer);
   
    GivePlayerMoney(playerid, 1000);
    ToggleMathActive(false);

    return;
}[/pawn]
Poslednja Izmena: Avgust 12, 2020, 15:01:58 POSLE PODNE od King of the Jungle
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

Da ispravim gore, zaboravio sam ()

[pawn]stock bool:IsMathAnswer(const buffer[])
{
    if (!IsMathActive())
        return false;

    if (strval(buffer) == ReturnMathQuizResult())
        return true;

    return false;
}[/pawn]
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

[pawn]
#if defined MATH_TIMER_INTERVAL
    #undef MATH_TIMER_INTERVAL
#endif
[/pawn]

Ako neko vec ima definisano nesto slicno poremetices mu sistem, a on nece znati da je to promenjeno, dakle - bespotrebno.

[pawn]
CallLocalFunction("OnCorrectMathAnswer", "d", playerid);
[/pawn]

Bespotrebno, dovoljan je normalan call, ovaj je retardiran.

[pawn]
new pName[MAX_PLAYER_NAME]
[/pawn]

Umesto ovoga mozes koristiti 'buffer', btw ako koristis ovo: + 1 na MAX_PLAYER_NAME ide u slucaju da ime ima maksimalan broj karaktera

[pawn]
sizeof(pName));
[/pawn]

takodje bespotrebno, po defaultu ce uzeti tu duzinu.



Cekamo jos i plugin verziju da slucajno ne ostanemo uskraceni i za to  :D

Poslednja Izmena: Avgust 12, 2020, 15:35:17 POSLE PODNE od XACK
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

Citat: XACK poslato Avgust 12, 2020, 15:33:36 POSLE PODNE
[pawn]
#if defined MATH_TIMER_INTERVAL
    #undef MATH_TIMER_INTERVAL
#endif
[/pawn]

Ako neko vec ima definisano nesto slicno poremetices mu sistem, a on nece znati da je to promenjeno, dakle - bespotrebno.

[pawn]
CallLocalFunction("OnCorrectMathAnswer", "d", playerid);
[/pawn]

Bespotrebno, dovoljan je normalan call, ovaj je retardiran.

[pawn]
new pName[MAX_PLAYER_NAME]
[/pawn]

Umesto ovoga mozes koristiti 'buffer', btw ako koristis ovo: + 1 na MAX_PLAYER_NAME ide u slucaju da ime ima maksimalan broj karaktera

[pawn]
sizeof(pName));
[/pawn]

takodje bespotrebno, po defaultu ce uzeti tu duzinu.



Cekamo jos i plugin verziju da slucajno ne ostanemo uskraceni i za to  :D
Uopšte nisam menjao kod nego stil druže...
Ali evo da odgovorimo na sve to :)

#if defined MATH_TIMER_INTERVAL
    #undef MATH_TIMER_INTERVAL
#endif

Rekao sam da pišem modularno, samim tim će definicija već biti iskorištena tamo gde treba i neće ništa poremetiti jer jer to pre-compiler

CallLocalFunction("OnCorrectMathAnswer", "d", playerid);
M O D U L A R A N kod koji verovatno nikada nisi pisao niti video.
CitatPackages
A Package is a folder containing one or more Modules.

Each isolated unit of functionality should be a package. Packages should communicate via events or exported functions. A package emits an event with CallLocalFunction to signal to other packages that something happened. A package may also export functions. Here, export simply means "to make available". static should be used to indicate a function only used within the immediate module.

CitatUmesto ovoga mozes koristiti 'buffer', btw ako koristis ovo: + 1 na MAX_PLAYER_NAME ide u slucaju da ime ima maksimalan broj karaktera
Poprilično sam siguran da niti jedan balkanac ne koristi ime duže od 18 karaktera, naravno + 1 svakako treba dodati, ja sam samo preimenovao varijablu, nisam bilo šta prčkao oko nje

Citat[pawn]
sizeof(pName));
[/pawn]

takodje bespotrebno, po defaultu ce uzeti tu duzinu.
Da, svesni smo toga, ali ostavljam to zbog urednosti jer se meni lično tako sviđa, ne zna svako da je default sizeof svakako, ništa neudi što tu stoji, meni se lično ne sviđa da GetPlayerName ima samo 2 parametra jer je sizeof pre-compiler pa ne škodi ništa da se doda

Kažem ovo sve je MOJ STIL a o STILu se ne diskutuje dok ne utiče na same perofrmanse servera.

Da sam ja pisao ovaj sistem, pre svega uopšte ne bih imao ovoliko retardirane evente i ovako simple matematiku nego bi znakovi +-/* bili random :D

Poslednji odgovor koji pišem na ovu temu, nemoj džaba da se umaraš da odgovaraš
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

Rekao sam ti da je bespotrebno, ali ti ne slusas.

Prvo, #ifdef - jednostavno nije potrebno da bude tu.

calllocalfunc, u dokumentaciji pise "should be", ali posto ti nisi u 2020. godini onda nikom nista, normal call je bolji i pouzdaniji.

buffer sam ti rekao da koristis umesto pName, jer ne moras praviti bezveze dve varijable kad mozes iskoristiti jednu za sve.

sizeof nije pre-compiler vec je operator
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

Citat: XACK poslato Avgust 12, 2020, 15:59:19 POSLE PODNE
Rekao sam ti da je bespotrebno, ali ti ne slusas.

Prvo, #ifdef - jednostavno nije potrebno da bude tu.

calllocalfunc, u dokumentaciji pise "should be", ali posto ti nisi u 2020. godini onda nikom nista, normal call je bolji i pouzdaniji.

buffer sam ti rekao da koristis umesto pName, jer ne moras praviti bezveze dve varijable kad mozes iskoristiti jednu za sve.

sizeof nije pre-compiler vec je operator
Druže Southclaws tako poziva call-ove, Y_Less tako poziva call-ove, y_inline tako signalizira evente, jel se ti bodeš?
I to je napisano u 2019oj godini, tako da molim te :)

Imaš i call function(); (koja je opet wrapper za CallLocalFunction) opciju koju ja koristim jer koristim _ALS_DO

#ifdef je stvar ukusa stvarno, nigde ne piše da mora, ja tako pišem jer eto ide gas

A što se buffer-a tiče to nisam video uopšte :D

I sizeof() ne utiče ne perforamanse server jer se uopšte ne poziva u toku runtime-a što ga čini pre-compiler ili ti preprocessor-om, dešava se u toku kompilacije jer string/array uvek imaju fiksiranu veličinu kada pre-compiler pređe preko nje, čak i kada je u pitanju string []

Evo, ovo sam pronašao prvom google pretargom...
CitatAlso it's good to know that sizeof is a compiler directive, so it's not a function (unlike strlen for example). That implies you cannot use it on arrays with a size that's not known at compile-time (function arguments mostly).
That's why functions which write into arrays also need the size of the array passed seperately (like format).
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

to sto koristi neko ko je malo pametniji od tebe ne znaci da je bolje

sto se tice sizeofa slazem se

sad se vrati na alhemicara, mogao si i odatle da pises
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

Citat: XACK poslato Avgust 12, 2020, 16:13:39 POSLE PODNE
to sto koristi neko ko je malo pametniji od tebe ne znaci da je bolje

sto se tice sizeofa slazem se

sad se vrati na alhemicara, mogao si i odatle da pises
Pravim mini-accove za slučaj da me banuju :P

I da, zbog dizajna kada radiš modularno je jedini pravilni način da signaliziraš pozivanje funkcije je CLF, pokušaj nekada da kreiraš modularan gamemode, onako da ti se omakne da izađeš iz pećine ;)
Poslednja Izmena: Avgust 12, 2020, 16:19:51 POSLE PODNE od King of the Jungle
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

Citat: King of the Jungle poslato Avgust 12, 2020, 16:14:25 POSLE PODNE
Pravim mini-accove za slučaj da me banuju :P

I da, zbog dizajna kada radiš modularno je jedini pravilni način da signaliziraš pozivanje funkcije je CLF, pokušaj nekada da kreiraš modularan gamemode, onako da ti se omakne da izađeš iz pećine ;)
i normalnim pozivom signaliziras pozivanje funkcije koje je takodje i brze nego si ti naucio samo za clf, ali zasto bi se to koristilo kada jelte ne mora.
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software

L3o

*

Citat: XACK poslato Avgust 12, 2020, 11:53:00 PRE PODNE
Totalno odudarate od koncepta koji je ovaj covek odradio.
Dzaba vam rad na drugaciji nacin ako ne pratite sta i kako radite.

Ako je filterskripta onda se po tom formatu i radi, callback break nedostaje, bespotrebne inicijalizacije, bespotrebno includanje sscanfa, da ne nabrajam dalje.

[pawn]
#define FILTERSCRIPT

   /*
       @Dependencies
   */

#include <a_samp>
#include <zcmd>

   /*
       @Configuration
   */

#define MATH_TEST_AUTOTIME (15)
#define MATH_TEST_AUTOREWARD (5000)

   /*
       @Data
   */

enum E_MATH_TEST
{
   m_result,
   m_reward,
   bool: m_active
};

new MathTest[E_MATH_TEST];

   /*
      @Prototypes
   */

forward MathTest_Auto();
stock MathTest_Start(reward);

   /*
       @Native callbacks
   */

public OnFilterScriptInit()
{
   SetTimer("MathTest_Auto", 60000 * MATH_TEST_AUTOTIME, true);
   return 1;
}

public OnPlayerText(playerid, text[])
{
   if(MathTest[m_active])
   {
       if(strval(text) == MathTest[m_result])
      {
         new tmpString[90];

         GetPlayerName(playerid, tmpString);

         format(
            tmpString, sizeof tmpString,
            "[Math]: %s je prvi dao tacan odgovor (rezultat: %d | nagrada: %d$)",
            tmpString, MathTest[m_result], MathTest[m_reward]
         );
         SendClientMessageToAll(-1, tmpString);

         GivePlayerMoney(playerid, MathTest[m_reward]);

         MathTest[m_active] = false;
         MathTest[m_result] =
         MathTest[m_reward] = 0;
         return 0;
      }
   }
   return 1;
}
   /*
       @Function bodies
   */
stock MathTest_Start(reward)
{
   if(reward < 0)
   {
       return 0;
   }
   new
      tmpString[56],
      num[3];

   MathTest[m_result] = (num[0] = random(100)) + (num[1] = random(100)) - (num[2] = random(100));
   MathTest[m_reward] = reward;
   MathTest[m_active] = true;

   format(
      tmpString, sizeof tmpString,
       "[Math]: Izracunajte (%d+%d-%d), nagrada iznosi %d$.",
        num[0], num[1], num[2], MathTest[m_reward]
     );
   SendClientMessageToAll(-1, tmpString);
   return 1;
}

public MathTest_Auto()
{
   MathTest_Start(MATH_TEST_AUTOREWARD);
   return 1;
}

   /*
       @Player area
   */

CMD:math(playerid, const params[])
{
   if(!IsPlayerAdmin(playerid))
   {
      return SendClientMessage(playerid, -1, "Ne mozete koristiti ovu komandu.");
   }

   if(isnull(params))
   {
      return SendClientMessage(playerid, -1, "[CMD]: /math [reward].");
   }
      
   MathTest_Start(strval(params));

   return 1;
}
[/pawn]

Alright, my bad što nisam napravio kao FS - jer uopće ni nisam išao za time već sam htio pokazati momku kako i na koji način bi bilo bolje da piše kod. Što se tiče bespotrebnog inc. sscanf2-a upravu si, nisam uopće išao za time s' obzirom da god. dana nisam napisao pawn kod. Ostalo što si rekao ne pije ti vodu, jer jedino što si ti napravio je c/p ono moje i samo dodao da se math-test preko timer-a sam poziva i promijenio si poruke u SCM-ovima. Bezveze kompliciraš na ovakvim stvarima, svatko ima svoj stil pisanja koda što ne znači da je moj bolji od tvoga, jer na kraju i moj i tvoj kod radi istu funkciju.
retired

Citat: XACK poslato Avgust 12, 2020, 16:22:57 POSLE PODNE
i normalnim pozivom signaliziras pozivanje funkcije koje je takodje i brze nego si ti naucio samo za clf, ali zasto bi se to koristilo kada jelte ne mora.
Ti očigledno ne razumeš pojam modularno programiranje?

Pacakage treba da bude independent, funckija iz CallLocalFunction može a i ne mora da postoji u onom momentu kada compileaš dok direct call odmah vrati error ako funkcija ne postoji...

Znači možeš a i ne moraš da koristiš taj event(callback) :)

Takođe CallLocalFunction NE MORA da zna ime callback-a dok direktno pozivanje mora, mnogo je korisno u zavisnosti šta kreiraš :D

Znači ovako izbegavamo undefined symbol error i potpuno je dinamično manageovanje u toku samog runtime-a

Na primer možeš da kreiraš 4 callback-a koja mogu biti called samo jednom na nekom mestu i onda samo uradiš CallLocalFunction :D

I to da je brže, jeste na 1.000.000 poziva, nemoj da overkilluješ stvari bespotrebno :)
Citat: XunderNebitno koliko god bio dobar i sa tobom Makenzi, Vedranom, Ziletom, Lanijem i ko se vec sve tu proziva moram se sloziti sa Krampom.
Umjesto toga sto se prozivate, ovaj forum bi mogao biti mnogo ljepse mjesto za pocetnike kada bi vi iskusniji usli u normalnu raspravu - podijelite svoj kod i napisite zasto je bolji od koda koji je neko drugi podijelio.


Pa... Hajde da probamo?

Citat: L3o poslato Avgust 12, 2020, 16:26:34 POSLE PODNE
Alright, my bad što nisam napravio kao FS - jer uopće ni nisam išao za time već sam htio pokazati momku kako i na koji način bi bilo bolje da piše kod. Što se tiče bespotrebnog inc. sscanf2-a upravu si, nisam uopće išao za time s' obzirom da god. dana nisam napisao pawn kod. Ostalo što si rekao ne pije ti vodu, jer jedino što si ti napravio je c/p ono moje i samo dodao da se math-test preko timer-a sam poziva i promijenio si poruke u SCM-ovima. Bezveze kompliciraš na ovakvim stvarima, svatko ima svoj stil pisanja koda što ne znači da je moj bolji od tvoga, jer na kraju i moj i tvoj kod radi istu funkciju.
ma jebo stil vise, gledaj kod malo

Citat: King of the Jungle poslato Avgust 12, 2020, 16:30:01 POSLE PODNE
Ti očigledno ne razumeš pojam modularno programiranje?

Pacakage treba da bude independent, funckija iz CallLocalFunction može a i ne mora da postoji u onom momentu kada compileaš dok direct call odmah vrati error ako funkcija ne postoji...

Znači možeš a i ne moraš da koristiš taj event(callback) :)

Takođe CallLocalFunction NE MORA da zna ime callback-a dok direktno pozivanje mora, mnogo je korisno u zavisnosti šta kreiraš :D

Znači ovako izbegavamo undefined symbol error i potpuno je dinamično manageovanje u toku samog runtime-a

Na primer možeš da kreiraš 4 callback-a koja mogu biti called samo jednom na nekom mestu i onda samo uradiš CallLocalFunction :D

I to da je brže, jeste na 1.000.000 poziva, nemoj da overkilluješ stvari bespotrebno :)

tako gubis mogucnost boljeg testiranja, ocigledno je da si video kako se "modularno" radi samo u pawnu, izadji malo pred terasu.
Those parts of the system that you can hit with a hammer (not advised) are called hardware; those program instructions that you can only curse at are called software