Ok danke, jetzt habe ich es verstanden
Beiträge von Oskaar1994
-
-
Erstmal schonmal danke, aber das würde ja bedeuten erst wenn er 5 mal Geld gehackt hat wird er gebannt oder verstehe ich da was falsch ?
-
Das passiert auf allen Servern, sofern sie es nicht verhindern. Ich kenn zahllose Fehler die dadurch entstehen können.
Um das (einigermaßen) zu verhindern, lasse eine Variable hochzählen für den Spieler, wenn eine Gelddifferenz erkannt wird (da wo er jetzt bannt). Erst wenn die auf 3 oder 5 steht, dann wird der Spieler gebannt.
Pseudocode:
pVar != GetPlayerMoney => AnderepVar ++ ~~~> AnderepVar > 5 => Ban
else => AnderepVar = 0Prinzip verstanden?
Nein habe ich leider noch nicht ganz verstanden. Könntest du mir ein Beispiel anhand meines Codes machen ?
-
Code
[16:58:35] [Geldverkehr] playerid: 0 amount: -500 - pVar: 149967755 Get: 149967755 [16:58:36] [Ban] playerid: 0 - pVar: 149967255 Get: 149967755 [16:58:36] [Geldverkehr] playerid: 0 amount: -500 - pVar: 149967255 Get: 0 [16:58:36] [part] Oskaar has left the server (0:2)
Ich habe jetzt mal zur Sicherheit eine Zeile über dem Ban mit kopiert. Also es sieht so aus als hättest du Recht, aber wieso passiert das nur auf meinem Server ? Ich benutze nicht viele Timer es laggt nicht und mein Ping ist auch gut.
*edit*Kann es nicht auch einen anderen Grund haben ? Wie gesagt mir ist das Problem bisher nur aufgefallen, wenn mir Geld abgezogen wurde. Und das macht doch gar keinen Sinn, weil der Anti Cheat ja nur reagieren sollte wenn mein Geld mehr ist. -
Hey,
habe leider immer noch Probleme beim Anti Money Hack. Er funktioniert, aber ich werde auch manchmal wenn ich meine alternative Geldgebefunktion benutze gebannt. Mir ist es nur aufgefallen wenn ich Geld verliere also mir quasi einen negativen Betrag gebe. Das kann ich mir garnicht verstehen weil ich eigentlich nur gebannt werden dürfte, wenn ich mehr Geld habe als der Server sagt. Hier meine Funktionen:
public GivePlayerMoneyEx(playerid,ammount)
{
SetPVarInt(playerid, "money", GetPVarInt(playerid,"money") + ammount);
GivePlayerMoney(playerid, ammount);
return 1;
}
public AntiCheat()
{
for(new playerid; playerid<MAX_PLAYERS; playerid++)
{
if(IsPlayerConnected(playerid))
{
if(GetPlayerMoney(playerid) > GetPVarInt(playerid, "money") )
{
ResetPlayerMoney(playerid);
new mbformat[128];
format(mbformat,sizeof(mbformat),"Anti Cheat has banned %s due to Money Hack",getPlayerName(playerid));
SendClientMessageToAll(COLOR_RED,mbformat);
new tbanIP[50];
GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
TimeBan("Anti Cheat",getPlayerName(playerid),"Money Hack",90,tbanIP);
banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);}
if(PlayerSpawned[playerid] == 1 && sInfo[playerid][alevel] == 0)
{
new wep = GetPlayerWeapon(playerid);
if(wep==1||wep==2||wep==3||wep==4||wep==5||wep==6||wep==7||wep==8||wep==9||wep==10||wep==11||wep==12||wep==13||wep==14||wep==15||wep==16||wep==17||wep==18||wep==22||wep==23||wep==24||wep==25||wep==26||wep==27||wep==28||wep==29||wep==30||wep==31||wep==32||wep==33||wep==34||wep==35||wep==36||wep==37||wep==38||wep==39||wep==40||wep==41||wep==42||wep==43||wep==44||wep==45)
{
new tbanIP[50];
GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
TimeBan("Anti Cheat",getPlayerName(playerid),"Weapon Hack",90,tbanIP);
new cheat[250];
format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to weapon hack.",getPlayerName(playerid));
SendClientMessage(playerid,COLOR_RED,cheat);
banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
}
new Float:Armour;
GetPlayerArmour(playerid, Armour);
if(Armour > 0)
{
new tbanIP[50];
GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
TimeBan("Anti Cheat",getPlayerName(playerid),"Armour Hack",90,tbanIP);
new cheat[250];
format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to armour hack.",getPlayerName(playerid));
SendClientMessage(playerid,COLOR_RED,cheat);
banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
}
if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
{
new tbanIP[50];
GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
TimeBan("Anti Cheat",getPlayerName(playerid),"Jetpack Hack",90,tbanIP);
new cheat[250];
format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to jetpack hack.",getPlayerName(playerid));
SendClientMessage(playerid,COLOR_RED,cheat);
banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
}
if(IsPlayerInAnyVehicle(playerid))
{
new speed = floatround(GetVehicleSpeedEx(GetPlayerVehicleID(playerid),0));
if(speed>= 206){
new SpeedWarnString[250];
format(SpeedWarnString,sizeof(SpeedWarnString),"[SPEED WARNING]%s(%i) is going over 205MPH. Speed: %i MPH. Spectate him !",getPlayerName(playerid),playerid,speed);
SendAdminMessage(COLOR_RED,SpeedWarnString);
}
}
}
}
}
}
Und unter OnGameModeInit:
SetTimer("AntiCheat", 1000, true);
PS: Ich habe zur Sicherheit mal den ganzen Anti Cheat mit dazu gepackt. -
== Ist in diesem Fall aber nicht cool, denn beim PNS zum Beispiel verliert man immer Geld.
Also sollte ich statt: if(GetPlayerMoney(playerid) != GetPVarInt(playerid, "money") ) eher if(GetPlayerMoney(playerid) > GetPVarInt(playerid, "money") ) machen ? -
-
Ich weiß nicht, wieso Ihr das alle immer so kompliziert macht.
In der Funktion GivePlayerMoneyEx(); einfach folgendes:
SetPVarInt(playerid, "money", betrag);
Dann abgleichen, ob GetPlayerMoney(playerid) mit GetPVarInt(playerid, "money") übereinstimmt. Wenn nicht => Bann.
Viel einfacher und fehlerunanfälliger.
Müsste es nicht so sein ?
SetPVarInt(playerid, "money", money+ betrag); -
Hey,
ich bin echt schon am Verzweifeln. Ich habe schon verschiedenste Includes probiert, aber mein Anti Money Hack arbeitet nie wie er sein soll. Wenn jemand Geld hackt erkennt er es zwar, nur manchmal wird man auch zufällig gebannt wenn man von der alternativen Geldgebefunktion Geld bekommt oder abgezogen bekommt. So erkenne ich ob der Spieler sich das Geld ercheatet hat:
if(GetPlayerMoney(playerid) > NewMoney[playerid])
{
ResetPlayerMoney(playerid);
GivePlayerMoneyEx(playerid,OldMoney[playerid]);
new mbformat[128];
format(mbformat,sizeof(mbformat),"Anti Cheat has banned %s due to Money Hack",getPlayerName(playerid));
SendClientMessageToAll(COLOR_RED,mbformat);
new tbanIP[50];
GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
TimeBan("Anti Cheat",getPlayerName(playerid),"Money Hack",90,tbanIP);
banTimer[playerid] = SetTimerEx("KickIT",500,0,"i",playerid);}
Das ganze habe ich in einem Timer der jede Sekunde aufgerufen wird und nur zur Info, ich hattes auch schonmal unter OnPlayerUpdate aber dort trat das gleiche Problem auf. Hier noch die Geldgebefunktion:
public GivePlayerMoneyEx(playerid,ammount)
{
OldMoney[playerid] = GetPlayerMoney(playerid);
NewMoney[playerid] += ammount;
GivePlayerMoney(playerid,ammount);
return 1;
}
Und bei OnPlayerConnect noch das hier:
NewMoney[playerid] = GetPlayerMoney(playerid);
Über Hilfe wäre ich sehr erfreut -
Machst du allgemein keine Forum Designs oder nur nicht für WBB ? Ich suche nähmliche einen Coder für SMF (Simple Machines Forum). SMF arbeitet mit CSS und da ich ein schlichtes Design haben möchte brauche ich auch keine Grafiken also im Prinzip nur den reinen CSS Code.
-
Hey Breadfishcommunity,
Wie die Überschrift schon sagt suche ich jemanden der mir ein SMF Theme erstellen könnte. Ich hätte es gerne ohne Copyright und es sollte nicht zu teuer sein. Wenn ihr interessiert seid könnt ihr euch einfach unter dem Post mit einem Preisvorschlag melden
[Folgendes muss im Thema enthalten sein und darf nicht entfernt werden:]
______
Unverbindlicher Hinweis: Die Sicherheit einer Transaktion kann am besten durch die Einschaltung eines Mittelsmannes gewährleistet werden. Weitere Informationen dazu gibt es hier. -
Ups da habe ich mal wieder zu ungenau gelesen, mein Fehler ICh werde es mal probieren
-
Das wäre natürlich eine Möglichkeit. Aber das Problem ist ich habe jetzt schon für jede einzelne Map eine Datei erstellt und es wäre für mich sowieso praktischer wenn jede Map in einer einzelnen Datei ist. Ich habe mir mal die Funktionen von dem Plugin angeschaut, aber ich glaube es gibt keine Möglichkeit einfach durch alle Datein zu loopen, oder ?
-
Hey,
habe mal eine Frage. Ich bin gerade dabei ein Mapsystem zu machen, mit dem ich einzelne Maps per Listendialog laden und entladen kann. Die Maps werden in den Scriptfiles gespeichert. Zur Zeit funktioniert das auch, aber bevor ich die Liste mit den Maps öffnen kann müssen die jeweilligen Maps erstmal geladen werden. Für das Laden der Maps habe ich eine Funktion, aber die lädt immer nur eine Map und man muss den genauen Dateinamen angeben. Gibt es eine Möglichkeit alle Maps ohne den Dateinname zu laden ? Ich habe mir überlegt sich durch alle Datein in den Scriptfiles zu loopen, aber wie mache ich das ?
Also ich weiß wie Schleifen funktionieren, aber nicht im Zusamenhang mit den Scriptfiles. Wäre toll wenn jemand eine Idee hätte -
if(dialogid==19)
{
if(response)
{
new Float:vehX,Float:vehY,Float:vehZ, count = -1;
GetPlayerPos(playerid,vehX,vehY,vehZ);
for(new i=0;i {
if(cInfo[i][besitzer] == sInfo[playerid][id0]) count++;
if(count != listitem) continue;
SetVehiclePos(cInfo[i][id_x],vehX,vehY+2,vehZ);
break;
}
}
} //fehlte??Und pass mit den Klammern auf. Ich hab dir unten noch eine dazu gemacht.
Vielen Dank
Hatte es schonmal so ähnlich, bin aber nie darauf gekommen count nur zu
erhöhen, wenn ich der Besitzer des Fahrzeuges bin. Und die Klammer
hatte ich, nur vergessen mit zu kopieren -
Den String und den Dialog habe ich so gemacht :
CMD:mycars(playerid,params[])
{
new carstring[800];
for(new i=0;i<sizeof(cInfo);i++){
if(cInfo[i][id_x]==0)continue;
if(cInfo[i][besitzer]!=sInfo[playerid][id0])continue;
format(carstring,sizeof(carstring),"%s%s\n",carstring,GetVehicleName(cInfo[i][id_x]));
}
ShowPlayerDialog(playerid,19,DIALOG_STYLE_LIST,"Owned cars:",carstring,"Select","Close");
return 1;
} -
Hey,
ich versuche derzeit einen bestimmten Eintrag aus einem Array zu bekommen, der des angeklickten Listitems unter OnDialogResponse entspricht. ABER nehmen wir z.B. mein privates Fahrzeugsystem. Ich erstelle einen Dialog, der alle meine Autos anzeigt und ich klicke z.B. auf die zweite Zeile was dem Listitem 1 entspricht. Ich weiß, dass ich durch das Array loopen muss, nur nicht wie ich es in diesem Fall machen muss. Es soll entsprechen meines Beispiels das 2te Auto, dass mir gehört also der Kondition : cInfo[i][besitzer] == sInfo[playerid][id0]entspricht zu mir teleportieren. Hilfe wäre nett
Mein bisheriger Code:
if(dialogid==19){
if(response){
new Float:vehX,Float:vehY,Float:vehZ;
GetPlayerPos(playerid,vehX,vehY,vehZ);
for(new i=0;i<sizeof(cInfo);i++){
if(cInfo[i][besitzer] != sInfo[playerid][id0]) continue;
if(cInfo[i][besitzer] == sInfo[playerid][id0]) i=0;
if(i != listitem) continue;
SetVehiclePos(cInfo[i][id_x],vehX,vehY+2,vehZ);
}
} -
Danke, da dran habe ich garnicht gedacht
-
Hey,
ich habe ein kleines Problem. Ich bin gerade dabei ein System zu erstellen, mit dem ich alle Maps in einem Dialog verwalten kann. Wenn die Map geladen ist soll sie Grün angezeigt werden, wenn nicht, dann nicht. Dafür habe ich mir eine kleine Funktion erstellt die den richtigen Colorcode returnen soll. Das macht sie auch aber im Dialog wird es dann auch z.B. so angezeigt: {F81414}Testmap. Also der Text wird nicht farbig formatiert. Was mache ich falsch ?
CMD:maps(playerid, params[])
{
if(!isAdmin(playerid, 5)) return 0;
new maps[800];
for(new i=0;i<20;i++){
format(maps,sizeof(maps),"%s{%s}%s\n",maps,IsMapLoaded(i),MI[i][mapname]);
}
ShowPlayerDialog(playerid,30,DIALOG_STYLE_LIST,"Server maps",maps,"Select","Close");
return 1;
}
stock IsMapLoaded(mapID)
{
new colorstr[6];
if(MI[mapID][isLoaded] == 1){
format(colorstr,sizeof(colorstr),"6EF83C");
}
else if(MI[mapID][isLoaded] == 0){
format(colorstr,sizeof(colorstr),"F81414");
}
return colorstr;
} -
Ups das war nur als ich es hier rein geschrieben habe, im Script ist es.