Beiträge von Jeffry

    :|


    public AntiCheat()
    {
    for(new playerid; playerid<MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(GetPlayerMoney(playerid) > GetPVarInt(playerid, "money") )
    {
    SetPVarInt(playerid, "moneyhack", GetPVarInt(playerid,"moneyhack") + 1);
    if(GetPVarInt(playerid,"moneyhack") > 5)
    {
    SetPVarInt(playerid, "moneyhack", 0);
    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);
    }
    }
    else SetPVarInt(playerid, "moneyhack", 0);
    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);
    }
    }
    }
    }
    }
    }

    Hab auch gleich mal die Einrückung richtig gemacht. 8o


    Dann sollte dieser Fehler eigentlich nicht wieder vorkommen.

    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 = 0


    Prinzip verstanden?

    CreateDynamicObject(6450, 1191.856323, -2592.188477, -7.598844, 0.000000, 0.000000, -270.000001124, 0, 0, -1, 200);


    zu:
    CreateDynamicObject(6450, 1191.856323, -2592.188477, -7.598844, 0.000000, 0.000000, -270.000001124, 0, 0, -1, 200, 0.0);


    Bei allen Objekten.


    (STRG+H => 200); mit 200, 0.0); ersetzen => Alle ersetzen)

    Am Script scheint das nicht zu liegen. Ich rate dir, lass dir das mal loggen. Speicher dir in den server_log die beiden Werte wenn jemand gebannt wird, und jedes mal wenn sich sein Geld über die Funktion ändert.
    Ich tippe darauf, dass einfach das Paket nicht (rechtzeitig) beim Spieler ankommt. (Schonmal was von Desynchronisation gehört? Ich schätze nicht, das kennt hier kaum einer.)


    public GivePlayerMoneyEx(playerid,ammount)
    {
    printf("[Geldverkehr] playerid: %d amount: %d - pVar: %d Get: %d", playerid, amount, GetPVarInt(playerid,"money"), GetPlayerMoney(playerid));
    SetPVarInt(playerid, "money", GetPVarInt(playerid,"money") + ammount);
    GivePlayerMoney(playerid, ammount);
    return 1;
    }


    Und beim Ban vor: ResetPlayerMoney(playerid);
    printf("[Ban] playerid: %d - pVar: %d Get: %d", playerid, GetPVarInt(playerid,"money"), GetPlayerMoney(playerid));



    Ich kann mir gut vorstellen, dass zum Zeitpunkt des Bans das Geld noch nicht den Wert zurückgibt, den es eigentlich hat. (Je nach Ping)


    Lass dir das mal ausgeben und wenn so ein falscher Ban vorkommt, dann schau dir den Log an. Gegebenenfalls poste ihn hier.

    gibts da ne möglichkeit?


    Nein da gibs keine möglichkeit


    Doch.


    Unter OnPlayerUpdate aktualisierst du ständig den Geldbetrag des Spielers. Dabei fragst du ab, ob das Geld noch dem entspricht, wie es beim letzten Update war. Wenn nicht, dann prüfst du, ob der Spieler sich in einer Tuning Garage befindet, wenn ja, dann ziehst du ihm das Geld von deinem Geldsystem ab.
    //OnPlayerUpdate
    static oldMoney[MAX_PLAYERS];
    new curMoney = GetPlayerMoney(playerid);
    if(oldMoney[playerid] > curMoney)
    {
    if(IsPlayerInRangeOfPoint(...) oder IsPlayerInArea(...) von den ganzen Tuning Garagen)
    {
    //Ziehe hier die Differenz der zwei Werte ab.
    }
    }
    oldMoney[playerid] = curMoney;

    Wenn du nicht mal die erste Nachricht bekommst, dann liegt es nicht am Code in dem Befehl.
    Benenn den Befehl mal um.


    dcmd_abctest(playerid,params[])


    dcmd(abctest, 7, cmdtext);


    Kommt die Nachricht jetzt?



    Wenn nicht, poste dein ganzes OnPlayerCommandText.

    Dann solltest du uns davon auch Bericht erstatten, sonst kann das ja keiner wissen.


    "Geht nicht" heißt?
    Kommt die Meldung?
    SendClientMessage(playerid, 0xAFAFAFAA, "Befehl gestartet");


    Sieht es bei dir bei OnPlayerCommandText so aus?
    dcmd(textdraw, 8, cmdtext);


    Länge 8?

    #include <a_samp>
    #include <streamer>


    public OnFilterScriptInit()
    {
    CreateDynamicObject(9946, 1500.08337, -1616.46252, 12.26548, 0.00000, 0.00000, 0.00000);
    CreateDynamicObject(9946, 1451.05933, -1616.10718, 12.24198, 0.00000, 0.00000, 0.20000);
    CreateDynamicObject(9946, 1458.95532, -1708.31226, 12.26100, 0.00000, 0.00000, 0.00000);
    return 1;
    }


    Neue File erstellen und das hier reinschreiben. Dann unter /filterscripts/ speichern (Name: maps) und kompilieren.
    In der server.cfg bei "filterscipts"


    filterscripts maps (... andere hier...)


    Ich hatte mit Objekten im GameMode auch mal Probleme, seitdem habe ich alle Objekte in einem FilterScript, was auch ganz nett ist wenn man mal eine Änderung macht, muss nicht der ganze Server neu gestartet werden.

    Die return's haben in der Schleife nichts zu suchen. ;)


    case DIALOG_WP_VERGABE:
    {
    new string[sizeof(Wantedkatalog)*64];
    if(response == 0)
    {
    clickedplayer2[playerid] = -1;
    return 1;
    }
    else
    {
    switch(listitem)
    {
    case 0:
    {
    for(new i=0;i<sizeof(Wantedkatalog);i++)
    {
    format(string,sizeof(string),"%s\n%s | %i",string,Wantedkatalog[i][wantedreason],Wantedkatalog[i][wantedzahl]);
    }
    ShowPlayerDialog(playerid,DIALOG_WP_VERGABEW,DIALOG_STYLE_LIST,""#SERVERFARBE"Wähle aus:",string,"Auswählen","Abbrechen");
    return 1;
    }
    case 1:
    {
    for(new i=0;i<sizeof(Stvokatalog);i++)
    {
    format(string,sizeof(string),"%s\n%s | %i",string,Stvokatalog[i][wantedreason],Stvokatalog[i][wantedzahl]);
    }
    ShowPlayerDialog(playerid,DIALOG_WP_VERGABEST,DIALOG_STYLE_LIST,""#SERVERFARBE"Wähle aus:",string,"Auswählen","Abbrechen");
    return 1;
    }
    case 2:
    {
    ShowPlayerDialog(playerid,DIALOG_WP_CLEARWPS,DIALOG_STYLE_INPUT,""#SERVERFARBE"Wantedpunkte löschen","Wie viele Wantedpunkte möchtest du löschen?","Auswählen","Abbrechen");
    return 1;
    }
    case 3:
    {
    ShowPlayerDialog(playerid,DIALOG_WP_CLEARSTVOP,DIALOG_STYLE_INPUT,""#SERVERFARBE"STVO-Punkte löschen","Wie viele STVO-Punkte möchtest du löschen?","Auswählen","Abbrechen");
    return 1;
    }
    }
    }
    return 1;
    }

    Warum machst du auch nur die Hälfte die dir gesagt wird? :huh:


    dcmd_textdraw(playerid,params[])
    {
    SendClientMessage(playerid, 0xAFAFAFAA, "Befehl gestartet");
    new Auswahl[32], Name[32];
    if(sscanf(params,"s[32]s[32]", Auswahl, Name)) return SendClientMessage(playerid,0xAFAFAFAA,"Benutze: /textdraw [Aufrufen/Bearbeiten/Contract (Auftrag bei Hitman machen)] [Name des Textdraws]");
    if(!strcmp(Auswahl,"Aufrufen",true))
    {
    if(dini_Exists(Name))
    {
    SendClientMessage(playerid, black, "Benütze zum schliesen des Laptops /clostextdraw");
    }
    else
    {
    SendClientMessage(playerid, 0xAFAFAFAA, "Diesen Namen gibt es nicht!");
    }
    }
    if(!strcmp(Auswahl,"Aufrufen",true))
    {
    if(dini_Exists(Name))
    {


    }
    else
    {


    }
    }
    if(!strcmp(Auswahl,"Contract",true))
    {


    }
    return SendClientMessage(playerid, 0xAFAFAFAA, "Befehl beendet");
    }



    Bei OnPlayerCommandText:
    dcmd(textdraw, 8, cmdtext);

    Unter welches Callback hast du das geschrieben?
    Es sollte unter OnPlayerConnect:


    public OnPlayerConnect(playerid)
    {
    RemoveBuildingForPlayer(playerid, 4057, 1479.5547, -1693.1406, 19.5781, 0.25);
    //...
    return 1;
    }

    Schön wäre es. Dann wäre ich teilweise mit dem Mappen schneller fertig. ^^ Also soll heissen. Nein Geht nicht.


    Schade, dann eben Variante 2, das geht auf jeden Fall.


    Ich versteh ehrlich gesagt nicht, was du damit meinst.


    Stell dir das so vor:


    • Du hast einen Code
    • Dieser Code durchsucht den Pfad "C:/.../GTA SanAndreas/data/maps" nach .ipl Dateien.
    • Hat der Code eine solche Datei gefunden, dann öffnet er sie und liest sie durch
    • Jede Zeile, die mit der ID der Mülltonne anfängt, wird in eine Ausgabe-Datei geschrieben
    • Wenn er durch ist, sucht er die nächste .ipl Datei und macht das Gleiche.
    • Wenn alle .ipl Dateien ausgelesen worden sind, hast du alle Mülltonnen in der Ausgabedatei stehen, in einem Format deiner Wahl.



    Falls du Interesse hast, könnte ich dir das machen.