enum, oder PVar bleibt dir überlassen, ich habe mehr Erfahrung mit enum´s aber wenn du mehr Erfahrung mit PVars hast, dann mach das
Anti Money
- Kindischer Namesfaker
- Geschlossen
- Erledigt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Naja ich schreibs auf enums
-
Einfach das Geld immer in einer Variable laufen lassen.
Genau wie das Level oder sonst was auch.Das Geld in der Anzeige oben Rechts bei einer Transaktion einfach wieder resetten und auf den Betrag der Variable setzen.
Sollte in der Wert der Geldanzeige (GetPlayerMoney) größer als der der Varialbe sein, so ist davon auszugehen, dass
der Spieler sich Geld gehackt hat. -
So ist der stock richtigstock GiveMoney(playerid,value)
{
SetPVarInt(playerid,"Money",GetPVarInt(playerid,"Money")+value);
Spieler[playerid][pMoney]=+value;
return value;
} -
stock GiveMoney(playerid,value)
{
SetPVarInt(playerid,"Money",GetPVarInt(playerid,"Money")+value);
Spieler[playerid][pMoney]+=value;
return value;
}Es ist += und nicht =+.
-
new pMoney[MAX_PLAYERS];
stock GiveUserMoney(playerid, money)
{
GivePlayerMoney(playerid, money);
pMoney[playerid] = money;
return 1;
}SetTimer("CheckMoneyHack", 100, true),
public CheckMoneyHack(playerid)
{
if(pMoney[playerid] != GetPlayerMoney(playerid))
{
SendClientMessage(playerid, 0xFFFFFFFF, "*hust* warum hack? *hust*");
Ban(playerid);
}
return 1;
}
So sieht ein Anti Money Hack ausEhm das kann man auch ohne Timer regeln gib doch den Neulingen direkt den reocurcenfrssenden Müll
stock _GivePlayerMoney(playerid,az)
{
if(GetPlayerMoney(playerid) != PlayerInfo[playerid][Geld]) return 1;
else PlayerInfo[playerid][Geld] += az, GivePlayerMoney(playerid,az);
return 1;
}So easy ohne timner statt return 1; bei dem ersten if deine Sache hineinschreiben (ban(); kick())
-
Ehm das kann man auch ohne Timer regeln gib doch den Neulingen direkt den reocurcenfrssenden Müll
stock _GivePlayerMoney(playerid,az)
{
if(GetPlayerMoney(playerid) != PlayerInfo[playerid][Geld]) return 1;
else PlayerInfo[playerid][Geld] += az, GivePlayerMoney(playerid,az);
return 1;
}So easy ohne timner statt return 1; bei dem ersten if deine Sache hineinschreiben (ban(); kick())
Ne ich machs auf meiner art mit dem Geld in der Variable... -
Ja das ist doch ne Variable?
-
Ehm das kann man auch ohne Timer regeln gib doch den Neulingen direkt den reocurcenfrssenden Müll
So easy ohne timner statt return 1; bei dem ersten if deine Sache hineinschreiben (ban(); kick())
Gegen einen Timer ist nichts einzuwenden, der ist im Gegensatz zu deiner Variante sogar besser. Warum?Folgendes Szenario:
- Cheater kommt in den Server, bekommt meinetwegen 100€ Startgeld, ok. Funktion wird aufgerufen, passt alles.
- Cheater cheated sich 100.000€
- Nichts passiert, die Funktion wurde ja noch nicht aufgerufen.
- Cheater verlässt den Server, sein Geld wird nun gespeichert (100.100€), kein Ban, die Funktion wurde noch nicht wieder aufgerufen.
- Cheater kommt wieder in den Server und erhält nun völlig legal die 100.100€ vom Server.
Daher: Timer, und zwar einen der alle paar Sekunden abfragt, so wird die Chance minimiert, dass bei einem Server-Absturz oder Neustart ein Cheater sich durchmogelt. Und bei OnPlayerDisconnect unbedingt auch überprüfen.
-
Gegen einen Timer ist nichts einzuwenden, der ist im Gegensatz zu deiner Variante sogar besser. Warum?Folgendes Szenario:
- Cheater kommt in den Server, bekommt meinetwegen 100€ Startgeld, ok. Funktion wird aufgerufen, passt alles.
- Cheater cheated sich 100.000€
- Nichts passiert, die Funktion wurde ja noch nicht aufgerufen.
- Cheater verlässt den Server, sein Geld wird nun gespeichert (100.100€), kein Ban, die Funktion wurde noch nicht wieder aufgerufen.
- Cheater kommt wieder in den Server und erhält nun völlig legal die 100.100€ vom Server.
Daher: Timer, und zwar einen der alle paar Sekunden abfragt, so wird die Chance minimiert, dass bei einem Server-Absturz oder Neustart ein Cheater sich durchmogelt. Und bei OnPlayerDisconnect unbedingt auch überprüfen.
Das stimmt aber nicht ganz...du hast zwar Recht, dass wenn die Funktion nicht mehr aufgerufen wird der Cheater auch nciht direkt gebannt wird aber durch diese Variante mit der Geldvariable wird ja beim ausloggen auch die Variable gespeichert und nicht per GetplayerMoney(so würde ich es zumindest machen) und damit nicht sein ercheatetes Geld -
Das stimmt aber nicht ganz...du hast zwar Recht, dass wenn die Funktion nicht mehr aufgerufen wird der Cheater auch nciht direkt gebannt wird aber durch diese Variante mit der Geldvariable wird ja beim ausloggen auch die Variable gespeichert und nicht per GetplayerMoney(so würde ich es zumindest machen) und damit nicht sein ercheatetes Geld
Unter dieser Vorraussetzung ja, da hast du allerdings Recht, wenn es so gemacht wird.Ich denke mal wir können da noch unendlich weit ins Detail gehen, daher würde ich mal sagen, dass dieser Thread eigentlich beendet ist, zumindest was die Ausgangsfrage betrifft sollte dem Threadstarter ja mehr als geholfen sein.
-
Gegen einen Timer ist nichts einzuwenden, der ist im Gegensatz zu deiner Variante sogar besser. Warum?Folgendes Szenario:
- Cheater kommt in den Server, bekommt meinetwegen 100€ Startgeld, ok. Funktion wird aufgerufen, passt alles.
- Cheater cheated sich 100.000€
- Nichts passiert, die Funktion wurde ja noch nicht aufgerufen.
- Cheater verlässt den Server, sein Geld wird nun gespeichert (100.100€), kein Ban, die Funktion wurde noch nicht wieder aufgerufen.
- Cheater kommt wieder in den Server und erhält nun völlig legal die 100.100€ vom Server.
Daher: Timer, und zwar einen der alle paar Sekunden abfragt, so wird die Chance minimiert, dass bei einem Server-Absturz oder Neustart ein Cheater sich durchmogelt. Und bei OnPlayerDisconnect unbedingt auch überprüfen.
Falsch!!!
Es werden dann zwar 100.000 angezeigt aber in der Variable sind noch 100 Euro. Folglich sind innerlich 100 Euro in der Datenbank. Da ich GetPlayerMoney nur für den Anticheat nutze.
Aber beim Speichern Frage ich das selbe nochmal ab
-
Falsch!!!
Es werden dann zwar 100.000 angezeigt aber in der Variable sind noch 100 Euro. Folglich sind innerlich 100 Euro in der Datenbank. Da ich GetPlayerMoney nur für den Anticheat nutze.
Aber beim Speichern Frage ich das selbe nochmal ab
Genau, wurde ja bereits gesagt.
Diese Vorraussetzung hatte ich unterschlagen, tut mir Leid. Gehen wir mal davon aus, dass du nicht GetPlayerMoney verwendest, dann wird das Geld natürlich nicht gespeichert, das stimmt. Das war aber aus deinem Code nicht ersichtlich, wie du das machst. Um nicht mit nackten Variablen zu arbeiten, würde sich das da anbieten:stock _GetPlayerMoney(playerid)
{
return PlayerInfo[playerid][Geld];
}Damit wären dann alle Unklarheiten beseitigt, würde ich sagen, oder?
-
Ich habs mal so gemacht das ich einen Zufallsschlüssel für die nächste "Geldübergabe" generiert habe natürlich auch in eigene Funktionen eingebunden, alles was diesen Schlüssel nicht hatte wurde abgelehnt hinzu wurde die gesetzte Variable beim verlassen des Servers gespeichert und nicht der Betrag der Visuell zu sehen war. Bei jeder Geldübergabe habe ich einen neuen Schlüssel definiert in einer Zufalls Spielervariable, der Bezeichner dieser Variable wurde in einer weiteren Spielervariable gespeichert
-
Genau, wurde ja bereits gesagt.
Diese Vorraussetzung hatte ich unterschlagen, tut mir Leid. Gehen wir mal davon aus, dass du nicht GetPlayerMoney verwendest, dann wird das Geld natürlich nicht gespeichert, das stimmt. Das war aber aus deinem Code nicht ersichtlich, wie du das machst. Um nicht mit nackten Variablen zu arbeiten, würde sich das da anbieten:stock _GetPlayerMoney(playerid)
{
return PlayerInfo[playerid][Geld];
}Damit wären dann alle Unklarheiten beseitigt, würde ich sagen, oder?
Ja sry habe nicht nachgedacht das da mehrere Teile dranhängen als der Stock
Aber sonst wäre es ja auch kein AntiMoney System
Naja ende gut alles gut
-
breadfish.de
Hat das Thema geschlossen.