[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Wäre der String gelöscht, wäre das "u" nicht mehr da.


    ...zum 3.x ja ich denke jetzt hat es jeder verstanden, da aber das EOS verschoben wird, existiert das "u" zwar im Speicher, aber gehört nicht direkt mehr zu dem String :rolleyes:


    ...es war nur eine Ergänzung, dass man so strings für die Funktionen quasi "leeren" kann...

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • ...es war nur eine Ergänzung, dass man so strings für die Funktionen quasi "leeren" kann...


    Die Variable ist auch nicht "quasi" leer, sie ist gar nicht leer. Man nutzt nur einen Fehler, wie BlackAce sagte. Jetzt stell dir mal vor (die Vorstellung ist bei SA-MP zwar etwas absurd, aber generell) du hast in der Variable sensible Daten, von mir aus eine Kontonummer. Du "leerst" nun die Variable nach deiner Methode, es folgt etwas Code und dann übergibst du den Wert der Variable (wohlgemerkt den neuen) an eine andere Variable und nehmen wir mal an das läuft über eine Schnittstelle in ein anderes System, vielleicht extern. Derjenige Programmierer bekommt dadurch dann möglicherweise Zugriff auf die Kontonummer, wenn du Pech hast, sie steht ja schließlich (wie das "u") noch in der Variable drin. Ich denke ich muss das nicht weiterführen, es ist klar auf was das hinauslaufen kann, wenn man sich solcher vermeintlich nützlichen Dinge betätigt.


    Außerdem wäre eine direkte Zuweisung (x = "Noob";) wesentlich performanter und hat das gleiche Ergebnis (mal von obiger Hypothese abgesehen, da das Problem dort auch existiert).
    Willst du das Problem wirklich umgehen und den Speicher wirksam leeren (sodass kein sinnvoller Zugriff mehr darauf besteht), musst du ihn entweder überschreiben oder memcpy verwenden (was übrigens gleich schnell ist aber nur eine Zeile Code benötigt).

  • Wieso bekomme ich keine Nachricht, das ich in keinem Fahrzeug sitze?
    Und wieso bekomme ich beim LichtAn nur die Nachricht, SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in einem Fahrzeug,Boot,Flugzeug, welches kein Licht hat!");


    stock StartMotor(playerid)
    {
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in keinem Fahrzeug, um den Motor zu starten!");
    new car = GetPlayerVehicleID(playerid),m = GetVehicleModel(car);
    if(m == 509 || m == 481 || m == 510) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt auf einem Fahrrad, das hat keinen Motor!");
    else if (Motor[car] == false)
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = true;
    SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen den Zündschlüssel, und schalten den Motor {36D61A}an!");
    return 1;
    }
    else
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false;
    SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen den Zündschlüssel, und schalten den Motor {E83A3D}aus!");
    return 1;
    }
    }
    return 1;
    }


    stock LichtAn(playerid)
    {
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in keinem Fahrzeug, um das Licht einzuschalten!");
    new car = GetPlayerVehicleID(playerid),m = GetVehicleModel(car);
    if(m == 417 || 425 || m == 447 || m == 464 || m == 465 || m == 469 || m == 487 || m == 488 || m == 497 || m == 501 || m == 548 || m == 563 || m == 430 || m == 446 || m == 452 || m == 453 || m == 454 || m == 472 || m == 473 || m == 484 || m == 493 || m == 595 ||
    m == 460 || m == 476 || m == 511 || m == 512 || m == 513 || m == 519 || m == 520 || m == 553 || m == 577 || m == 592 || m == 593) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in einem Fahrzeug,Boot,Flugzeug, welches kein Licht hat!");
    if (Licht[car] == false)
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,engine,VEHICLE_PARAMS_ON,alarm,doors,bonnet,boot,objective);
    Licht[car] = true;
    SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen am Schalter, und schalten das Licht {36D61A}an!");
    return 1;
    }
    else
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,engine,VEHICLE_PARAMS_OFF,alarm,doors,bonnet,boot,objective);
    Licht[car] = false;
    SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen am Schalter, und schalten das Licht {E83A3D}aus!");
    return 1;
    }
    }
    return 1;
    }

    Die Kritik an anderen hat noch keinem die eigene Leistung erspart.

    – Noël Coward


  • Probier es mal so:

    stock StartMotor(playerid)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in keinem Fahrzeug, um den Motor zu starten!");
    if(GetPlayerVehicleSeat(playerid) == 0)
    {

    new car = GetPlayerVehicleID(playerid),
    m = GetVehicleModel(car);


    if(m == 509 || m == 481 || m == 510) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt auf einem Fahrrad, das hat keinen Motor!");
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = !Motor[car];
    SetVehicleParamsEx(car, Motor[car],lights,alarm,doors,bonnet,boot,objective);


    if (Motor[car] == true)
    return SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen den Zündschlüssel, und schalten den Motor {36D61A}an!");
    else
    return SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen den Zündschlüssel, und schalten den Motor {E83A3D}aus!");

    }
    return 1;
    }


    stock LichtAn(playerid)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in keinem Fahrzeug, um das Licht einzuschalten!");
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new car = GetPlayerVehicleID(playerid),
    m = GetVehicleModel(car);

    if(m == 417 || 425 || m == 447 || m == 464 || m == 465 || m == 469 || m == 487 || m == 488 || m == 497 || m == 501 || m == 548 || m == 563 || m == 430 || m == 446 || m == 452 || m == 453 || m == 454 || m == 472 || m == 473 || m == 484 || m == 493 || m == 595 ||
    m == 460 || m == 476 || m == 511 || m == 512 || m == 513 || m == 519 || m == 520 || m == 553 || m == 577 || m == 592 || m == 593) return SendClientMessage(playerid, 0x9B0000FF, "Du sitzt in einem Fahrzeug,Boot,Flugzeug, welches kein Licht hat!");


    GetVehicleParamsEx(car, engine, lights, alarm, doors, bonnet, boot, objective);
    Licht[car] = !Licht[car];
    SetVehicleParamsEx(car, engine, Licht[car], alarm, doors, bonnet, boot, objective);



    if (Licht[car] == true)
    return SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen am Schalter, und schalten das Licht {36D61A}an!");
    else
    return SendClientMessage(playerid, 0x4B94FFFF, "{1AADD6}Gedanke: {F2F2F2}Sie drehen am Schalter, und schalten das Licht {E83A3D}aus!");


    }
    return 1;
    }


    Aber du müsstest uns auch noch sagen, welches Fahrzeug du gefahren bist als das mit dem Licht kam.

  • Außerdem wäre eine direkte Zuweisung (x = "Noob";) wesentlich performanter


    Achwas...aber man kann halt nicht immer direkt den Wert der Variable wissen und wenn schon was drinnen steht...ist es schneller einfach das NULL-Byte zu verschieben als format zu verwenden..Bei lokalen Variablen spielt das eh keine Rolle, da die nach verlassen des jeweiligen Scopes gecleart werden...


    memcpy verwenden (was übrigens gleich schnell ist aber nur eine Zeile Code benötigt).


    memcpy ist eine alternative zu strcat, aber die "löscht" dir auch nicht den string, sondern kopiert nur einen anderen String quasi darein.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Wie oft willst du das noch sagen? Das hab ich im ersten Post bereits dargestellt, daher verstehe ich nicht warum du so ein Drama darum machst. Natürlich ist das so, aber es ist nicht die beste Möglichkeit, daher ist sie, vor allem hinsichtlich dem was xMichael wissen wollte, nutzlos.

    memcpy ist eine alternative zu strcat, aber die "löscht" dir auch nicht den string, sondern kopiert nur einen anderen String quasi darein.


    Wenn man es richtig macht ist der Rest dahinter auch weg, bzw nicht mehr als das erkennbar was es mal war.
    new x[] = "BlaBlub";
    memcpy(x, "Noob", 0, 32);

  • Poste mal den log.

    Fehler doch nicht gefunden. Im Serverlog ist nichts.


    MySQL-Log:


    Mit freundlichen Grüßen
    Exqool

    Einmal editiert, zuletzt von Exqoolz ()

  • Beitrag von Exqoolz ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.


  • Kennt wer eine Lösung warum das mit dem Spawnen nicht klappt ?

  • ist es schneller einfach das NULL-Byte zu verschieben als format zu verwenden


    Auf so eine verquere Denkweise und mit ähnlichem Code ist damals Heartbleed entstanden.
    Beim nächsten ähnlichen Problem denk ich dann an dich :)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • CMD:treasury(playerid,params[])
    {
    if(!IsLoggedIn(playerid))return 1;
    if(Spieler[playerid][pAdmin] < 6)return SendClientMessage(playerid, COLOR_GREY, "** Du besitzt nicht die benötigten Rechte.");
    new enter[128], wert, string[128];
    if(sscanf(params,"s",enter))
    {
    SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    return 1;
    }
    if(strcmp(enter, "balance", true) == 0)
    {
    format(string, sizeof(string), "* In der Staatskasse sind %i$.", Others[Staatskasse]);
    SendClientMessage(playerid, COLOR_AM, string);
    return 1;
    }
    if(strcmp(enter, "deposit", true) == 0)
    {
    if(sscanf(params, "si", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat %i$ in die Staatskasse eingezahlt.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] += wert;
    GiveMoney(playerid, -wert);
    return 1;
    }
    if(strcmp(enter, "withdraw", true) == 0)
    {
    if(sscanf(params, "si", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat %i$ von der Staatskasse abgehoben.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] -= wert;
    GiveMoney(playerid, wert);
    return 1;
    }
    if(strcmp(enter, "set", true) == 0)
    {
    if(sscanf(params, "si", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat den Kontostand der Staatskasse auf %i$ gesetzt.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] = wert;
    return 1;
    }
    return 1;
    }


    Nur /treasury balance geht ?(

    Mit freundlichen Grüßen
    Exqool

  • Dann musst du die Größe angeben.
    s -> s[32] in sscanf.


    Spoiler anzeigen
    CMD:treasury(playerid,params[])
    {
    if(!IsLoggedIn(playerid))return 1;
    if(Spieler[playerid][pAdmin] < 6)return SendClientMessage(playerid, COLOR_GREY, "** Du besitzt nicht die benötigten Rechte.");
    new enter[32], wert, string[128];
    if(sscanf(params,"s[32]I(0)",enter,wert))
    {
    SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    return 1;
    }
    if(strcmp(enter, "balance", true) == 0)
    {
    format(string, sizeof(string), "* In der Staatskasse sind %i$.", Others[Staatskasse]);
    SendClientMessage(playerid, COLOR_AM, string);
    return 1;
    }
    if(strcmp(enter, "deposit", true) == 0)
    {
    if(sscanf(params, "s[32]i", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat %i$ in die Staatskasse eingezahlt.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] += wert;
    GiveMoney(playerid, -wert);
    return 1;
    }
    if(strcmp(enter, "withdraw", true) == 0)
    {
    if(sscanf(params, "s[32]i", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat %i$ von der Staatskasse abgehoben.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] -= wert;
    GiveMoney(playerid, wert);
    return 1;
    }
    if(strcmp(enter, "set", true) == 0)
    {
    if(sscanf(params, "s[32]i", enter, wert))return SendClientMessage(playerid, COLOR_GREY, "** Benutze /treasury [balance/deposit/withdraw/set] [value]");
    format(string, sizeof(string), "* %s %s hat den Kontostand der Staatskasse auf %i$ gesetzt.", GetPlayerAdminName(playerid), GetName(playerid), wert);
    SendAdminMessage(COLOR_AM, string);
    Others[Staatskasse] = wert;
    return 1;
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Code-Zeile 6 (siehe Post drunter). Man muss sscanf halt alles sagen :<

  • K


    Klappt leider nicht :/

    Mit freundlichen Grüßen
    Exqool