Beiträge von Jeffry

    Wird dir der Checkpoint dann trotzdem an der korrekten Position angezeigt?
    Wenn ja:


    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false))
    zu:
    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false) && strlen(Drogen[i][dBesitzer]))

    @Zim30 ich habe es 1:1 von @Jeffry sein Tutorial abgeschrieben.

    Je mehr Werte du hinzufügst, desto länger wird das Query, sprich irgendwann wirst du die Größe vergrößern müssen. Aktuell jedoch noch nicht, da
    UPADTE account SET level = '1',admin = '0',money = '47',fraktion = '0',frank = '0',spawn = '0' WHERE id = '1' nur 109 Zeichen sind, damit die 128 nicht überschreiten.


    Allerdings hast du UPADTE geschrieben, anstatt UPDATE. Da liegt der Fehler.

    mysql_format(handle,query,sizeof(query),"UPADTE account SET level = '%d',admin = '%d',money = '%d',fraktion = '%d',frank = '%d',spawn = '%d'WHERE id = '%d'",PlayerInfo[playerid][level],PlayerInfo[playerid][admin],PlayerInfo[playerid][pmoney],PlayerInfo[playerid][fraktion],PlayerInfo[playerid][frank],PlayerInfo[playerid][spawn]);
    Zu
    mysql_format(handle,query,sizeof(query),"UPADTE account SET level = '%d',admin = '%d',money = '%d',fraktion = '%d',frank = '%d',spawn = '%d' WHERE id = '%d'",PlayerInfo[playerid][level],PlayerInfo[playerid][admin],PlayerInfo[playerid][pmoney],PlayerInfo[playerid][fraktion],PlayerInfo[playerid][frank],PlayerInfo[playerid][spawn],PlayerInfo[playerid][p_id]);

    Wenn ein Spieler ein Stunt macht wird das Geld durch GivePlayerMoney gesetzt oder muss ich es extra anders angehen damit Spieler Geld bekommen können?

    Mit GetPlayerMoney kannst du das per Stunt bekommene Geld abfragen.


    Du kannst allerdings nicht zwischen gehacktem Geld und Stunt-Geld unterscheiden.




    [06:44:16] [ERROR] mysql_format: no value for specifier '%d' passed (entwicklung.p:394 -> entwicklung.p:105)
    [06:44:16] [ERROR] error #1065 while executing query "": Query was empty (entwicklung.p:395 -> entwicklung.p:105)

    Hier scheint bei dem Query in Zeile 105 etwas nicht zu passen.

    bin aber davon ausgegangen das die normalen SA-MP Shops alle deaktiviert waren.

    Natürlich, dann ist das kein Problem, aber:

    Ja, du müsstest sämtliche Ingame Funktionen die Geld geben/abziehen im Code abfragst oder nachbaust und die Standard-Funktionen deaktivierst.
    Für manche Server mag das kein Problem sein, für die meisten Server könnte das aber eine ziemliche Einschränkung sein (oder ein enormer Aufwand, wenn alles Server-Seitig gecoded wird).


    Ich weiß nicht ob es funktionierende Casino Systeme gibt, die alle Funktionen davon haben, oder Stunt-Bonus Systeme.
    Die Shops dürften machbar sein, allerdings wie gesagt mit ziemlichem Aufwand, oder mit Hilfe von veröffentlichten Systemen, da kann ich aber nicht beurteilen, wie gut oder schlecht diese sind.



    GetPlayerMoney

    Sobald GetPlayerMoney zum speichern verwendet wird, ist es ziemlich einfach "illegal" an Geld zu kommen, sofern kein herausragendes Anti-Money-Hack System existiert. Oder man wird gebannt, wenn man im Casino gewinnt. :fun:


    Bei Server-Seitigem Geld kann man sich höchstens kleine Vorteile verschaffen (umsonst Pay'N'Spray, etc).

    Wenn man aber Ammu Nation und so per Script-Code macht sieht das dann anders aus mit den sicher gehen das man kein geld cheatet? @Jeffry

    Ja, du müsstest sämtliche Ingame Funktionen die Geld geben/abziehen im Code abfragst oder nachbaust und die Standard-Funktionen deaktivierst.
    Für manche Server mag das kein Problem sein, für die meisten Server könnte das aber eine ziemliche Einschränkung sein (oder ein enormer Aufwand, wenn alles Server-Seitig gecoded wird).

    Wenn ihr denkt, dass ein Anti-Money-Cheat (der funktioniert) etwas einfaches ist, dann habt ihr entweder nie einen aktiv besuchten Server gehabt, oder sämtliche ingame Funktionen deaktiviert (Ammu Nation, Casino, etc...).


    Ich weiß wovon ich spreche.

    Ja, du kannst abfragen ob sich die Fahrzeug-Health über einen gewissen kurzen Zeitraum innerhalb der Position eines Pay'N'Spray erhöht hat.
    Sofern der Spieler dann kein Geld verloren hat, dann hat er dies eventuell per Tool eingefroren oder sich erneut gegeben. Dies muss aber nicht immer der Fall sein, da bei Netzwerkproblemen oft das gleiche Phänomen auftritt.

    Man kann sich auf keinem Server Geld ercheaten. Da das Geld Serverseitig gespeichert wird.

    Das ist falsch. GetPlayerMoney = nicht serverseitig!



    s0beit arbeitet mit GivePlayerMoney
    und das lässt sich speichern!

    Nein, außer per GetPlayerMoney, was wiederum nicht serverseitig ist und du speicherst das gehackte Geld mit.



    Anti-Money-Hacks sind sehr aufwendig zu erstellen und es gibt dutzende Dinge die zu beachten sind.
    Das kann weder in 5 Minuten erklärt werden, noch in ein paar Stunden geschrieben werden.
    Ich habe auf meinem Server die Anti-Money-Hack Funktion über Jahre immer wieder verbessert und erweitert, eine 100%'ige Sicherheit kann aber nicht gewährleistet werden, vor allem wenn man sein Geld einfriert und Geld an Stationen ausgibt, die nicht Code-Seitig (Ammu Nation z.B.) das Geld abziehen.

    Dazu gibt es keinen Code. Die Pay'N'Sprays aktualisieren das Geld einfach so. Ebenso die Essens-/Trinkens-Automaten, der Tune-Shop und Stunt Bonuse, sowie die Ammu-Nations und Restaurants.
    Geld das dort ausgegeben wird kann vom Server nicht erkannt werden (nur bedingt, über Positionsabfragen). Wird bei einem dortigen Kauf aber kein Geld abgezogen, dann kannst du das nicht erkennen, außer mit aufwendigen Prüfungen (Health Veränderung, Waffen Veränderung, etc...).

    Das ist allerdings nur beim Streamer normal. Der Updated die Dinge für Spieler erst, wenn sie sich bewegen, um eine bessere Performance zu erreichen.
    Gleich verhält es sich bei Objekten etc.

    Was steht im Server Log, wenn du diesen Print hier einfügst?
    if(GetPlayerMoney(playerid) > GetMoney(playerid))
    zu:
    printf("%d > %d", GetPlayerMoney(playerid), GetMoney(playerid));
    if(GetPlayerMoney(playerid) > GetMoney(playerid))

    Er deklariert in Zeile 1 vehicleid und modelid und initialisiert sie auch mit den richtigen Werten. In Zeile 5 jedoch überschreibt er modelid mit dem Wert aus AutoSkin[vehicleid], was eigentlich gar nicht nötig ist, da er den Wert bereits durch die Initialisierung hat. Gehen wir nun davon aus, und so scheint es auch, dass AutoSkin[vehicleid] 0 entspricht. 0 - 400 ergibt -400 -> dadurch wird der Array gesprengt. Das ist für mich deutlich plausibler und logischer, oder übersehe ich da etwas?

    Stimmt, dem könnte tatsächlich so sein, das ist zwei mal die gleiche if-Abfrage, darauf habe ich nicht geschaut. Ich habe deine Aussage so aufgefasst, dass die vehicleid den Fehler erzeugt. Mein Fehler, sorry.
    Wobei dann auch hier etwas nicht passen dürfte.



    Nachdem ich Carpark benutzt habe und aussteige und natürlich wieder einsteige um es zu testen, kann ich das Auto nicht kaufen bzw es kommt kein Dialog und ich bin einfach nur gefreezt.

    Oh ja, der else-Teil wird nicht aufgerufen wenn das einmal 0 war.
    Schreibe es so:
    if(modellid == 0)
    {
    modellid = GetVehicleModel(vehicleid);
    if(modellid == 0)
    {
    format(fstring, sizeof(fstring), "{00FF46}Name: {FEFEFE}Unknown [{00FF46}Modell: {FEFEFE}%d]\n{00FF46}Preis: {FEFEFE}%d$\n{00FF46}Verkaufspreis: {FEFEFE}%d$\n",CarInfo[i][modelID], CarInfo[i][c_Preis], CarInfo[i][c_Preis] / 100 * 75);
    }
    }
    if(modellid != 0)
    {
    format(fstring, sizeof(fstring), "{00FF46}Name: {FEFEFE}%s [{00FF46}Modell: {FEFEFE}%d]\n{00FF46}Preis: {FEFEFE}%d$\n{00FF46}Verkaufspreis: {FEFEFE}%d$\n",PlayerVehicle[modellid - 400],CarInfo[i][modelID], CarInfo[i][c_Preis], CarInfo[i][c_Preis] / 100 * 75);
    }


    Und am besten du entfernst modellid = AutoSkin[vehicleid]; wie Douq sagte.


    Außerdem kannst du die PlayerTextDrawSetPreviewModel-Zeile direkt in die Zeile vor die for-Schleife schreiben, dann wird die obere if-Abfrage komplett leer, und du kannst den Part löschen.


    EDIT:
    Ich würde dir dennoch zu dem etwas angepassten Code raten, da es wie gesagt durch Lag auch zu dem Fehler kommen kann, bei Arrays ist es immer gut, auf Nummer sicher zu gehen.

    PlayerVehicle[modellid - 400]

    Du sprengst dieses Array, da modellid den Wert 0 hat (eventuell durch Lag oder so).


    Schreibe es zur Sicherheit so:
    format(fstring, sizeof(fstring), "{00FF46}Name: {FEFEFE}%s [{00FF46}Modell: {FEFEFE}%d]\n{00FF46}Preis: {FEFEFE}%d$\n{00FF46}Verkaufspreis: {FEFEFE}%d$\n",PlayerVehicle[modellid - 400],CarInfo[i][modelID], CarInfo[i][c_Preis], CarInfo[i][c_Preis] / 100 * 75);
    zu:
    if(modellid == 0)
    {
    modellid = GetVehicleModel(vehicleid);
    if(modellid == 0)
    {
    format(fstring, sizeof(fstring), "{00FF46}Name: {FEFEFE}Unknown [{00FF46}Modell: {FEFEFE}%d]\n{00FF46}Preis: {FEFEFE}%d$\n{00FF46}Verkaufspreis: {FEFEFE}%d$\n",CarInfo[i][modelID], CarInfo[i][c_Preis], CarInfo[i][c_Preis] / 100 * 75);
    }
    }
    else
    {
    format(fstring, sizeof(fstring), "{00FF46}Name: {FEFEFE}%s [{00FF46}Modell: {FEFEFE}%d]\n{00FF46}Preis: {FEFEFE}%d$\n{00FF46}Verkaufspreis: {FEFEFE}%d$\n",PlayerVehicle[modellid - 400],CarInfo[i][modelID], CarInfo[i][c_Preis], CarInfo[i][c_Preis] / 100 * 75);
    }


    Dann dürfte der Fehler nicht mehr auftreten.

    Das liegt daran, dass du manche Sender ohne Farbcode drin hast.
    Ändere die Schleife im zweiten Dialog zu:
    for(new i2=0;i2<sizeof(Radio);i2++)
    {
    if((Radio[i2][urlname][0] == '{' && Radio[i2][urlname][7] == '}' && !strcmp(Radio[i2][urlname][8],inputtext,true)) || !strcmp(Radio[i2][urlname],inputtext,true))
    {
    StopAudioStreamForPlayer(playerid);
    PlayAudioStreamForPlayer(i,Radio[i2][url],x,y,z,5.0,0);
    format(VehicleRadioStream[vehicleid],128,Radio[i2][url]);
    }
    }


    Dann geht es sowohl mit Code, als auch ohne.