Beiträge von Jeffry

    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.

    Warum funktioniert der folgende Code nicht?
    Aber ich hätte trotzdem gerne eine Antwort^^


    Ganz einfach. Wie dir die Error-Ausgabe schon sagt, ein Array muss mit einer konstanten Größe deklariert werden. Du weist dem Array eine variable Größe zu (len), daher weiß der Kompiler nicht, wie viel Platz er reservieren muss. Arrays müssen immer konstant deklariert werden, das heißt mit "#define" oder einer Zahl, wobei du bei define eben ein Wort diese Zahl ist und darstellt.


    ich suche ein Editor,womit man zb eine kleine Sirene also Undercover Sirene ans auto machen kann.


    http://forum.sa-mp.com/showthread.php?t=282883

    stock GiveMoney(playerid,value)
    {
    SetPVarInt(playerid,"Money",GetPVarInt(playerid,"Money")+value);
    Spieler[playerid][pMoney]+=value;
    return value;
    }


    Es ist += und nicht =+. ;)

    Also das heißt auf gut Deutsch ich mülle dann meinen Server mit Textdraws zu... oder?


    Ja, da image2textdraw eben für jeden Pixel ein Textdraw erstellt. Daher solltest bzw. kannst du ja auch nur kleine Bilder nehmen.
    Du bekommst ja auch eine Warnung wenn du ein Bild mit mehr als 2048 Pixel konvertieren willst.

    Enums so bekanntermaßen schneller als PVars, das spielt aber kaum eine Rolle bei dem was du machen willst. Daher nimm das, was dir am liebsten ist.

    Nunja, was möchtest du noch mit der Variable wenn du gar nicht mehr Online bist? ;)


    Ein neuer Spieler mit der selben ID wird ja sicher bald den Server betreten, in dem Fall wäre die Variable angenommen vom Spieler der das Spiel verlassen hat noch "12345", gibst du dem neuen Spieler dann sein Geld, so hat die Variable 12345 mehr an Wert, was nach deinem System mit != zu einem Ban führt. ;)


    Variablen IMMER bei OnPlayerDisconnect resetten, sofern sie für den Spieler bestimmt sind, sie resetten sich NIE von alleine (außer du startest den Server neu).

    Jeffry: Wieso heißt sein stock denn nicht GetGiveMoney(playerid, value), denn sein stock gibt etwas zurück :o


    CreateVehicle gibt dir ja auch was zurück (Vehicle ID) und heißt deswegen nicht "GetCreateVehicle", oder? ^^
    Wie er die Funktion nennt, und was er zurück gibt ist irrelevant, solange er durchblickt. Er kann es auch "IchMagSchokodonuts" nennen.
    Siehe dazu: http://forum.sa-mp.com/showthread.php?t=255246


    reoarni:
    WENN, dann so:
    Spieler[playerid][pMoney]+=value;


    Wenn der Spieler den Server verlässt wird die Variable im normalfall sowieso resetet.


    Nö. Nur wenn du es auch angibst. Von selber geht nichts. ;)
    In dem Fall bei OnPlayerDisconnect: pMoney[playerid] = 0;

    Hab ich dich richtig verstanden, dass du 348 commands hast, in deiner .pwn Datei. Diese willst du nun in einer Liste (o.ä.) ausgegeben haben?
    Das geht eigentlich ganz einfach, wenn du dich mit filefunctions auskennst:


    • .pwn in /scriptfiles/ tun.
    • Per Script die datei auslesen (io_read) und nach dem ZCMD definer (CMD:) suchen (strfind).
    • Wird der gefunden, den string splitten, einmal am : und einmal am ( und schon kannst du den Command ausgeben, z.B. in einer Textdatei.


    Wobei 348 commands ja auch nicht die Welt ist, die kannst du in 3-4 Stunden kurz selbst raustippen.


    EDIT: Hami: Oder das, wenn es tut. Wäre noch besser.

    Das stock an sich ist schon falsch, der Compiler wird da sicher rummäckern.


    stock GiveMoney(playerid,value)
    {
    SetPVarInt(playerid,"Money",GetPVarInt(playerid,"Money")+value);
    Spieler[playerid][pMoney]+value; //Das hier hat keinen Sinn, und auch keinen Effekt.
    return value;
    }


    Blu3scReeN: Die Toleranzgrenze sollte dann über 36.000.000 sein, da ich bei einem Einsatz von 1.000.000 im Casino auf die 0 beim Roulette 36.000.000 gewinnen kann. :D Zugegebenermaßen etwas unrealistisch, aber es kann doch gut sein, dass der Spieler ein paar Hunderttausend gewinnt.


    reoarni: Du kannst auch ein ganz auf Server Variablen basierendes Geld System machen, dabei würden allerdings sämtliche genannten Funktionen (Casino, Ammu Nation...) ihren Sinn verlieren, da man kostenlos sich deren bedienen kann. Je nach GM wäre das sinnvoll, oder auch nicht.

    So sieht ein Anti Money Hack aus


    Also da muss ich doch mal einlenken. So sieht ein Anti Money Hack hoffentlich bei niemanden auch nur annähernd aus. Warum? Erklärungen folgen:

    • pMoney[playerid] = money; <= Falsch. Alleine der Aufruf deiner GiveUserMoney Funktion würde den Spieler schon bannen.
    • Es fehlen sämtliche Variable-Resets, wenn der Spieler den Server verlässt.
    • SetTimer("CheckMoneyHack", true), <= Alleine hier sind schon 2 Fehler. Zum einen Fehlt die Abfragezeit, also das Intervall, zum anderen gehört da ein Semikolon hin, und kein Komma.
    • Du beachtest keinen Lag. Spieler mit sehr hoher Ping können gebannt werden, wenn die Variable bereits hoch gesetzt wurde, der Befehl aber noch nicht beim Spieler Client ankam. Das ist tatsächlich der Fall, hatte das bei meinem Anti Money Hack System.
    • Außerdem fehlt dir jeglicher Ausschluss von Desynchronisation. Was ist das? Geh mal in einen Server, und dann lade eine größere Datei hoch, je nach Internetverbindung bist du danach im Server nicht mehr synchronisiert, was folglich zu einem Ban führt, sobald sich dein Geld per Aufruf ändert.
    • Es fehlen sämtliche Ausschlüsse, dazu zählen:

      • Snack Maschinen
      • Ammu Nation
      • Stunt Bonus
      • Tune Garagen
      • Pay'n'Spray
      • Casino
      • (...)


      Da du abfragst ob GetPlayerMoney nicht der Variable entspricht, wirst du, sofern der Timer richtig gesetzt wird (siehe (1)) sofort gebannt, solltest du eine der obigen Funktionen nutzen. Das ist sehr schlecht.


    Es gibt noch weitere Kriterien die unbedingt beachtet werden sollten, um falsche Bans auszuschließen. Ich habe über 1 Jahr lang mein Anti Money Hack immer wieder verbessert und mit diesen Kriterien ausgestattet. Also so was ist nicht in 5 Minuten gemacht.

    @NicoWiss: Danke für das Kompliment :)
    |-|auke: Deine Veränderung der Funktion ändert nichts, aber der Hinweis auf die 0 terminierenden Zeichen war Gold Wert!
    @BlackAce: Das würde allerdings nicht den gewünschten Effekt bringen. Erst durch das Ersetzen von sizeof() mit 128 wird der 129. Character nicht mehr beschrieben, und bildet somit das Ende.


    new string[478], salt[129], key[129], File:saltfile;
    randomString(salt, 128);
    printf("%s (%i)",salt, strlen(salt)); //Länge ist 128
    randomString(key, 128);
    printf("%s (%i)",key,strlen(key)); //Länge ist 256????!


    Man könnte es (als Alternative) auch so machen:
    new tmp[259];
    format(tmp, 259, "%s\r\n%s", salt, key);
    format(string, 100, "%s.txt", SpielerName(playerid));
    saltfile = fopen(string, io_write);
    if(saltfile)
    {
    fwrite(saltfile, tmp);
    fclose(saltfile);
    }

    Das ist aber bei Weitem nicht so "schön" wie die erste Variante.


    Beide Varianten wurden kompiliert und getestet.

    Ich erklär dir das mal kurz, warum das so ist, sonst weißt du es beim nächsten Mal wieder nicht.^^


    new Float:DtcParkPlatz[7][4][4] = {
    new Float:DtcSonstiges[7][5][4] = {
    Dies wären die richtigen Angaben (bzw. so wie Kaliber es gemacht hat, wobei ich das da besser finde, es ist übersichtlicher und verhindert Fehler in großen Arrays, meine Meinung).


    Nun, warum?


    DtcSonstiges:
    [7] bedeutet, dass wir 7 Abteile haben
    [5] gibt nun an, dass jeder Abteil 5 Zeilen hat
    [4] sagt schließlich, dass jede Zeile 4 Parameter hat.


    Diese Zahlen müssen immer so stimmen, sonst bekommst du den Error 052.

    Zitat

    error 052: multi-dimensional arrays must be fully initialized


    Das heißt übersetzt: Multidimensionale Arrays (in deinem Fall: 3 Dimensionen) müssen vollständig eingeleitet werden. => Es darf keine "Lücke" vorhanden sein, es muss alles gefüllt sein. Es müssen 7 Abteile vorhanden sein, jedes diese Abteile muss genau 5 Zeilen haben, wovon jede wiederum genau 4 Parameter hat.

    ocmd:sirene(playerid,params[])
    {
    if(IstSpielerMember(playerid,1))
    {
    if(GetPlayerVehicleID(playerid) == sultan[0] || GetPlayerVehicleID(playerid) == sultan[1])
    {
    Sirene(playerid);
    }
    if(GetPlayerVehicleID(playerid) == bullet[0] || GetPlayerVehicleID(playerid) == bullet[1])
    {
    Sirene1(playerid);
    }
    }
    return 1;
    }


    @[SoA]TheBester: Wenn du nur "|| sultan[1]" schreibst, wird nur geprüft, ob sultan[1] nicht 0 ist.