Szerző Téma: Játékos pénzének változásának ellenõrzése  (Megtekintve 2167 alkalommal)

Nem elérhető Rupert

  • 2301
    • Profil megtekintése
Játékos pénzének változásának ellenõrzése
« Dátum: 2013. Január 03. - 17:52:09 »
0
Sziasztok!
Készítettem egy egyszerû módot arra, hogyan ellenõrizzük, ha egy játékos pénze megváltozik; kezdjünk is neki.
Elõször is, a mód elején hozzuk létre az eljárás prototípusát:
 

forward OnPlayerChangeMoney(playerid);

 
Magyarázat:
forward - prototípus létrehozása (arra most nem fogok kitérni, hogy pontosan mi is az a prototípus)
OnPlayerChangeMoney - ez az eljárás neve
(playerid) - ez alapján fogunk hivatkozni a játékosra
Hozzunk létre egy új változót is a script elején!
 

new penz[MAX_PLAYERS];

 
Magyarázat:
new - ezzel hozzuk létre a változót
penz - ez a változó neve
[MAX_PLAYERS] - ezzel a változót tömbként kezeljük, írhatnánk számmal is a maximális játékost; magyarul ez a változó minden játékosra érvényes.
Állítsuk be az értékét nullára, amikor a játékos csatlakozik:
 

public OnPlayerConnect(playerid)
{
penz[playerid] = 0;
return 1;
}

 
Miután lespawnolt, állítsuk át megint az értékét, a GetPlayerMoney(playerid) függvényt felhasználva.
 

public OnPlayerSpawn(playerid)
{
penz[playerid] = GetPlayerMoney(playerid);
return 1;
}

 
Azt hiszem ezt sem kell magyaráznom.
Most pedig jön maga az ellenõrzés, és az eljárásunk meghívása...
 

public OnPlayerUpdate(playerid)
{
        if((GetPlayerMoney(playerid) > penz[playerid]) || (GetPlayerMoney(playerid) < penz[playerid]))
{
CallLocalFunction(\"OnPlayerChangeMoney\", \"i\", playerid);
penz[playerid] = GetPlayerMoney(playerid);
}
return 1;
}

 
Na és akkor most mit csináltunk?
Minden mûveletet az OnPlayerUpdate eljárás alatt végeztünk el. Az OnPlayerUpdate az adott játékost vizsgálja, konkrétabban ellenõrzi hogy normálisan csatlakozva van-e, és nem-e fagyott ki, mozog-e, stb.
Az if feltételnél megnéztük, hogy a játékos pénze nagyobb-e, vagy kisebb-e mint maga a változó. Ha valamelyik igaz, akkor meghívjuk az eljárásunkat, a CallLocalFunction függvénnyel.
Argumentumai:
\"OnPlayerChangeMoney\" - ez az eljárásunk neve, ezzel hivatkozunk rá.
\"i\" - ezzel megadjuk az átadott érték formátumát (igazából a játékos ID-jét) => Most a formátum integer.
playerid - ennek (a játékos ID-jének) a formátumát illetve értékét adjuk át az eljárásunknak.
Azt hiszem ennyi lett volna ez a kis téma, és hogy még jobban húzzam az idõt és a téma hosszát, itt van egy .inc kódja, amit én készítettem, és a fenti feljárást tartalmazza:
 

#include <a_samp>
forward OnPlayerChangeMoney(playerid);
new penz[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
penz[playerid] = 0;
return 1;
}
public OnPlayerSpawn(playerid)
{
penz[playerid] = GetPlayerMoney(playerid);
return 1;
}
public OnPlayerUpdate(playerid)
{
if((GetPlayerMoney(playerid) > penz[playerid]) || (GetPlayerMoney(playerid) < penz[playerid]))
{
CallLocalFunction(\"OnPlayerChangeMoney\", \"i\", playerid);
penz[playerid] = GetPlayerMoney(playerid);
}
return 1;
}

 


Végezetül pedig egy példascript:

 

#include <a_samp>
forward OnPlayerChangeMoney(playerid);
new penz[MAX_PLAYERS];
public OnPlayerFilterScriptInit()
{
           return 1;
}
public OnPlayerFilterScriptExit()
{
           return 1;
}
public OnPlayerConnect(playerid)
{
penz[playerid] = 0;
return 1;
}
public OnPlayerSpawn(playerid)
{
penz[playerid] = GetPlayerMoney(playerid);
return 1;
}
public OnPlayerUpdate(playerid)
{
if((GetPlayerMoney(playerid) > penz[playerid]) || (GetPlayerMoney(playerid) < penz[playerid]))
{
CallLocalFunction(\"OnPlayerChangeMoney\", \"i\", playerid);
penz[playerid] = GetPlayerMoney(playerid);
}
return 1;
}
public OnPlayerChangeMoney(playerid)
{
        SendClientMessage(playerid, -1, \"Megváltozott a pénzed!\");
        return 1;
}

 


Köszönöm, hogy elolvastad!

Rupert
« Utoljára szerkesztve: 2013. Szeptember 02. - 14:50:57 írta Benceee »

Játékos pénzének változásának ellenõrzése
« Válasz #1 Dátum: 2013. Január 03. - 18:34:10 »
0
Szép leírás..
Megjegyzés:
 
if((GetPlayerMoney(playerid) > penz[playerid]) || (GetPlayerMoney(playerid) < penz[playerid]))

 
rövidebb így
 
if(GetPlayerMoney(playerid) != penz[playerid])

 
Illetve, hogy OnPlayerUpdate alatt okozhat némi szerver laggot, de jobb és gyorsabb ellenõrzési folyamat nincs rá.

Nem elérhető Rupert

  • 2301
    • Profil megtekintése
Játékos pénzének változásának ellenõrzése
« Válasz #2 Dátum: 2013. Január 03. - 18:37:57 »
0
OnPlayerUpdate igazából akkor okoz észlelhetõ laggot, ha renkdívül megterhelõ ciklust (akár for, akár while) alkalmazunk.
A másik, általad írt feltétel pedig egyre megy. :D

Játékos pénzének változásának ellenõrzése
« Válasz #3 Dátum: 2013. Január 07. - 19:09:23 »
0
Idézetet írta: Rupert date=1357234677\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"31885\" data-ipsquote-contentclass=\"forums_Topic
OnPlayerUpdate igazából akkor okoz észlelhetõ laggot, ha renkdívül megterhelõ ciklust (akár for, akár while) alkalmazunk.
A másik, általad írt feltétel pedig egyre megy. :D
 
tudom, de rövidebb  :angel:

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal