Beiträge von Mann im Mond

    // OnPlayerStateChange


    if(newstate == PLAYER_STATE_DRIVER)
    {
    new
    carid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(carid) == 427 || GetVehicleModel(carid) == 523 || GetVehicleModel(carid) == 596)// hier deine Definition, wann ein Auto ein Polizeiauto ist bzw. die Models austauschen/ergänzen
    {
    SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1);// Spieler ein Wanted geben, je nachdem wie du Wanteds vergibst
    }
    }

    Warte auf 0.3, da gibt es RepairVehicle, welches das automatisch übernehmen soll, also den kompletten Schaden reparieren


    Falls du nicht warten wills/kannst, musst du den Wagen einfach respawnwn und dann wieder herporten und den Spieler reinsetzen.
    Also
    SetVehicleToRespawn
    PuPlayerInVehicle
    SetVehiclePos


    Natürlich vorher noch die Position des Spielers speichern, der in dem Auto sitzt
    GetPlayerPos

    Mag jetzt ne dumme Antwort sein, die dir nichts bringt, aber ich empfehle dir ein eigenes zu machen, das auf deinen GM zugeschneidert ist. So kannst du dich am besten schützen. Prinzipiell ist es ganz einfach und immer das selbe. Du überlässt das Geld nicht mehr GTA und benutzt somit die Funktionen
    GetPlayerMoney
    und
    GivePlayerMoney
    nicht mehr bei jedem Mal, wenn du Geld gibts bzw. holst. Stattdessen übernimmt das dann eine Variable im Script, die das Geld speichert. Wenn du jemanden Geld gibts bzw. das aktuelle herausfinden willst benutzt du eine eigene Funktion dafür:
    stock GiveUserMoney(playerid, amount)
    {
    pMoney[playerid] += amount; // Deine variable im Script die das Geld speichern soll musst du erstellen und beim Login usw. entsprechend setzen
    GivePlayerMoney(playerid, amount);
    }
    Jetzt entspricht also pMoney deinem Geldbetrag, den der Spieler durch das Script haben sollte, sollte er geld cheaten, ist GetPlayerMoney > pMoney[playerid]. Das kannst du mit einem Timer z.B. überprüfen und entsprechende Schritte ziehen.
    Oder du lässt das Geld (pMoney[playerid]) einfach überhalb deines richtigen Geldes mit einem Textdraw anzeigen, sodass das alte Geld verdeckt wird. Somit ist das Geldcheaten unmöglich, eine ständige Überprüfung bräuchtest dann auch nciht unbedigt, außer du willst den Spieler trotzdem bannen/kicken

    Was hat
    floatstr(arrCoords[7]), 1);
    nach split verloren? Ohne weiteren Code?


    Außerdem:
    Pass mal den Query an zu z.B. so etwas

    SQL
    SELECT * FROM cars WHERE id='%d'


    Oder wie auch immer bei dir "id" in der Datenbank heisst, bzw. geschrieben ist. LIMIT 1 brauchst du hier nicht, da die ids eindeutig sind...

    Gibt mehrere Möglichkeiten dies zu Lösen, unten ein Ansatz. Ich denke die Arena geht nach Runden, also reicht das so aus, wenn sie nicht nach Runden geht, sondern man immer dazukann, wann man will, dann kann man dies auch entsprechend anpassen. Grunsätzätzlich kann man es so machen, indem man ein Array erstellt mit der Größe der Spawns. Beim betreten wird es dann alles ausgewertet un der Spieler an einen entsprechende Position gespawnt. Man kann es auch über PlayerToPoint regeln, dann kann man auf den Array verzichten. Wie du willst, hier mal die erstere Variante.


    // oben
    #define MAX_DERBYSPAWNS 5 // maximale Anzahl der Spawns


    new
    bool:dSpawn[MAX_DERBYSPAWNS];


    // beim Betreten der Arena


    new
    spawn = MAX_DERBYSPAWNS;
    for(new s = 0; s < MAX_DERBYSPAWNS; s++);
    {
    if(!dSpawn[s]) spawn = s; break;
    }
    switch(spawn)
    {
    case 0:
    {
    // Position setzen von Platz 1

    }
    case 1:
    {
    // Position setzen von Platz 2
    }
    case 2:
    {
    // Position setzen von Platz 2
    }
    [... usw. ...]
    default:
    {
    SendClientMessage(playerid, Farbe, "Die Arena ist voll");
    return 1;
    }
    }
    dSpawn[spawn] = true;


    // Beim Beenden der aktuellen Runde


    for(new s = 0; s < MAX_DERBYSPAWNS; s++)
    {
    dSpawn[s] = false;
    }

    Zitat

    Bis 0.2x hats ja geklappt, doch als ich 0.3 getestet habe, bin ich in meine Bank gegangen und musste feststellen, das das Geld nicht resetet wird


    public money()
    {
    new playerid;
    GivePlayerMoney(playerid,pInfo[playerid][Geld]);
    }
    Hat NIEMALS unter 0.2 funktioniert, genauso wenig wie in irgendeiner anderen Funktion. Dein von dir geposteter Code bringt nur soviel, dass jede Sekunde "money" aufgerufen wird und SPielerid 0 (sonst NIEMAND) dauerhaft "pInfo[playerid][pGeld] hinzuaddiert bekommt, er hat irgendwann undlich Geld in seiner Anzeige, auch wenn du das Geld nicht benutzt.
    Es ist mir egal, ob ich merke, ob jmd. cheatet (100 % ist das eh nicht machbar, da Geld ja auch beim Pay'n Spray abgezogen wird und es deshalb zu unregelmäßigkeiten kommt.
    Durch lesen meines Codes UND meines Textes hättest du bemerkt, dass nicht überprüft wird, ob das Geld kleiner ist, sondern nur überrüft wird ob das Geld größer ist, falls ja wird das Geld wieder zurückgesetzt auf die Variable in deinem Script, sofern du diese überhaupt mit hochzählen lasst durch z.B. "GiveUserMoney" anstatt "GivePlayerMoney" bei JEDEM Geld geben.
    stock GiveUserMoney(playerid, amount)
    {
    GivePlayerMoney(playerid, amount);
    pInfo[playerid][pGeld] += amount;
    }
    Bekanntlicherweise macht ein PaynSpray somit nichts aus, da es Geld abzieht, genauso wie ein Sprunk Automat usw.

    Benutze eine Schleife dafür innerhalb von dem Callback "money", so wird das nciht funktionieren, auch früher schon nicht
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected[i])
    {
    //hier dein Code mit "i" anstatt "playerid"
    }
    }


    Dein Money System wird aber sowieso nicht funktionieren... Du musst das Geld mit dem Geld des Scriptes vergleichen und dann wenn die beiden Zahlen unterscheidlich sind, weißt du, dass er gecheatet hat
    if(GetPlayerMoney(i) > pInfo[i][Geld]) ResetPlayerMoney(i); GivePlayerMoney(i, pInfo[i][Geld]);
    Natürlich musst du jedes mal im Script wenn du dem Spieler Geld gibst vorher auch die pInfo[playerid][pGeld] Variable aktualisieren
    pInfo[playerid][pGeld] += value;
    GivePlayerMoney(playerid, value);

    Habe zwar nur kurz über den Code geschaut, aber mir ist aufgefallen, dass das nicht stimmen sollte:
    PlayerInfo[playerid][pJob][FAHRSCHULE]
    Das Gleiche gibts weiter unter auch noch für Waffebhändler. Deine restlichen "PlayerInfo" sind nämlich sonst alle im Format
    PlayerInfo[][]
    Ändere also die beiden Zeilen in wahrscheinlich
    PlayerInfo[playerid][pJob]
    Eine Warning kommt außerdem durch falsches Einrücken

    versuchs doch aus, er gibt nur die zahl aus, also die ModelID.
    Wenn du den Namen willst, benutzt die Suchfunktion, da gibts genug Sachen, auch im englischen Forum ("Vehiclenames", "Autonamen" oder wie auch immer)