Guten Morgen Brotfische,
da ich in letzter Zeit ziemlich oft lese, wie das geht und die meisten dann mit extra Funktionen oder extra TextDraws über der normalen Geldanzeige arbeiten, wollte ich mal euch zeigen, wie man das viel besser lösen kann
Im Prinzip ist es ganz einfach, also schaut es euch an und ich hoffe, ich kann euch noch etwas beibringen:
Wie genau machen wir das jetzt?
Ganz einfach, wir hooken die Funktion GivePlayerMoney, dadurch können wir eine Variable dazwischen schalten, die dann Serverseitig prüft, wie viel Geld er hat, unabhängig vom Client.
Desweiteren hooken wir OnPlayerConnect um die Variable für jeden neuen Spieler wieder auf 0 zu setzen.
Und wir nutzen einen Timer, der das dann direkt überprüft.
Das bedeutet, nur wenn GivePlayerMoney benutzt wird, bekommt er Geld, wenn er es versucht über Mods zu verändern, wird ihm das Geld direkt wieder abgezogen.
Gehen wir das nun Schritt für Schritt durch und setzen das in Form einer Include um:
Oben in der Include (kurz eine Wiederholung):
#if !defined _samp_included //Prüft ob die SA-MP Include includiert wurde, zwar nicht direkt notwendig, da das nochmal in der Include selbst gecheckt wird, aber finde es so übersichtlicher
#include <a_samp>
#endif
#if defined _a_hack_included //Hier prüfen wir, ob unsere Include schoneinmal includiert wurde, falls dies der Fall ist, #endinput
#endinput //Das bewirkt, dass hier der Compiler aufhört und die Include nicht weiter einliest
#endif
#define _a_hack_included //Definiert den Directive dafür, dass die Include includiert wurde.
So, wenn wir den Kopf-Bereich von der Include haben, kommen wir zu den Hooks und den Deklarationen.
forward A_C_OnPlayerConnect(playerid); //wir forwarden OnPlayerConnect unter anderem Namen um es zu hooken
static geld[MAX_PLAYERS]; //Die Geld Variable für jeden Spieler und static, damit das im Gamemode nicht stört
native __GivePlayerMoney(playerid, money) = GivePlayerMoney; //Der native von GivePlayerMoney ist auch für den Hook nötig, damit wir das später aufrufen können.
@MoneyTimer(playerid); //Der forward für den Spieler Timer
So und nun nur noch die Hooks:
//Hier setzen wir das geld[playerid] auf 0, wenn er auf den Server connectet
//CallLocalFunction sorgt nur dafür, dass in anderen Includes und im Gamemode OnPlayerConnect aufgerufen wird.
public OnPlayerConnect(playerid) {
geld[playerid]=0;
SetTimerEx("@MoneyTimer",999,0,"i",playerid); //Hier starten wir den Timer für den Spieler
return CallLocalFunction("A_C_OnPlayerConnect","i",playerid);
}
//Unteres ist einfach nur der OnPlayerConnect Hook
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect A_C_OnPlayerConnect
//Hier hooken wir GivePlayerMoney
//geld[playerid] += money..sprich wir speichern das Geld vom Spieler in der Variable
//__GivePlayerMoney, sorgt nur dafür, dass es als native für samp verarbeitet wird und InGame man Geld dazubekommt
stock _GivePlayerMoney(playerid, money) return geld[playerid] += money,__GivePlayerMoney(playerid, money);
//Unteres ist einfach nur der GivePlayerMoney Hook
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney _GivePlayerMoney
So und jetzt nur noch einen kleinen Timer gesetzt:
@MoneyTimer(playerid) {
if(!IsPlayerConnected(playerid)) return 0;
if(GetPlayerMoney(playerid) > geld[playerid]) return Ban(playerid); //Hier hat er Geld gecheatet!!!
/*
Um einen Reset des Geldes zu machen könnt ihr auch einfach folgendes schreiben:
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, geld[playerid]);
*/
return SetTimerEx("@MoneyTimer",999,0,"i",playerid);
}
Nochmal ganzer Source-Code:
Pastebin: http://pastebin.com/UqX8LFyJ
Ich hoffe ich konnte euch ein wenig weiter helfen, ich könnt mir ja mal ein kleines Feedback geben
Viel Spaß damit
//Edit: Pastebin Link
mfg.