Beiträge von Kaliber

    dazu nicht jeder AFD wähler ist ein Nazi

    Nö, aber dumm.


    Die machen nur Politik für Superreiche, schlimmer als die FDP.


    Haben nur Nazis in den entscheidenden Positionen und leugnen den Klimawandel.

    Haben keinen Plan, nur leere Phrasen, Wut, Hass und Intoleranz.


    AfD-Verbot der Bundesregierung
    Helfen Sie dem Bundeskanzler und übermitteln Hinweise, die seinen Verbotsantrag gegen die Partei Alternative für Deutschland in Karlsruhe unterstützen.
    afd-verbot.de

    Schau mal ins Wiki: https://sampwiki.blast.hk/wiki/MySQL (Auch wenn hier nur die Rede von R40 ist, sind das die aktuellen Funktionen) :)


    Vieles wurde einfach umbenannt:


    mysql_num_rows() = cache_num_rows()


    mysql_free_result brauchst du nicht mehr.


    cache_get_value_name

    cache_get_value_name_int

    cache_get_value_name_float

    Damit holst du die Einträge raus.


    Wobei ich dir empfehlen würde, direkt ORM zu nutzen, dann kannst dir das alles schenken 😄

    Gibt es eine möglichkeit, oder ein Tool, was mir die Arbeit, mit hoch nummerieren erleichtert?

    Das kommt darauf an, was genau du tun magst.


    Die ID bei Objekten, als auch bei Fahrzeugen, werden sequenziell erstellt. Also einfach immer +1.


    Diese Eigenschaft lässt sich super ausnutzen.


    Willst du zum Beispiel immer die selben 2 Materialen setzen, bietet sich extrem ein 2 Pointer Ansatz an.

    Das heißt, wir nehmen das Erste und Letzte Objekt und kennen nun alle Objekte die dazwischen liegen.


    Sprich, sowas:


    Falls dies nicht anwendbar sein sollte, weil die Texturen zu komplex für bestimmte Objekte sind, empfehlt sich ein einfacher auto-Counter:


    C++
    new i=-1; //Wichtig bei -1 zu starten
    lspd1int[++i] = CreateDynamicObject(2310, -274.975494, 899.826477, -37.414501, 0.000000, 0.000000, 180.000000);
    SetDynamicObjectMaterial(lspd1int[i], 0, 14415, "carter_block_2", "mp_shop_floor2", 0x00000000);
    SetDynamicObjectMaterial(lspd1int[i], 1, 19480, "signsurf", "sign", 0x00000000);
    lspd1int[++i] = CreateDynamicObject(2310, -274.975494, 900.646484, -37.414501, 0.000000, 0.000000, 180.000000);
    SetDynamicObjectMaterial(lspd1int[i], 0, 14415, "carter_block_2", "mp_shop_floor2", 0x00000000);
    SetDynamicObjectMaterial(lspd1int[i], 1, 19480, "signsurf", "sign", 0x00000000);
    lspd1int[++i] = CreateDynamicObject(2310, -274.975494, 901.446472, -37.414501, 0.000000, 0.000000, 180.000000);

    So musst du nicht manuell zählen, sondern er macht das automatisch.


    Bei Fahrzeugen zum Beispiel, ist der erste Ansatz aber super effizient, da wenn man prüfen mag, ob der Spieler z.B. in einem LSPD Fahrzeug ist, keine Schleifen mehr benötigt, sondern einfach lspdCar[0] <= vehicleid <= lspdCar[1] nutzen kann und somit sofort weiß, ob er drinnen ist oder nicht.

    Du musst die Umkehroperation einfach anwenden.


    Bei + ist es -

    Bei / ist es *

    Bei > ist es <=

    Bei < ist es >=


    Willst du quasi ausdrücken:


    C++
    if(Admin > 5)
    {
        //Ok
    }
    else KeineRechte();
    
    //Ist die Umkehroperation von >, <= ergo
    if(Admin <= 5) return KeineRechte();
    // Ok

    Nein, du musst die Logik nur drehen.


    Also einfach negieren, das Gegenteil anwenden.


    Anstatt den Fall, dass das Admin Level größer Gleich 1 sein soll, sagst du, wenn sein Admin Level kleiner 1 ist, (bzw in diesem Fall einfach 0), dann darf er es nicht tun.


    C++
    cmd:blub(playerid,params[])
    {
        if(RechteInfo[playerid][Admin] < 1) return KeineRechte; // oder !RechteInfo[playerid][Admin]
        
        // Jo kann machen
        return 1;
    }

    Macht es viel aus wenn ich bei dieses hier es so mache ?

    Das kommt darauf an, was darunter geschieht :)


    Falls darunter auch ein return 1; steht, dann macht es keinen Unterschied.


    Generell ist es eher dafür gedacht bestimmte Clean Code Prinzipien einzuhalten.


    Hier mal ein Beispiel, was ich oft sehe:

    Das ist ein sogenannter if-Tree des Todes 😂 Meistens geht das ja noch viel weiter.

    Und oft ist das auch logisch nicht in der Reihenfolge, so wird meistens zum Schluss geprüft, ob man wirklich Dinge darf, obwohl vorher schon Dinge getriggert wurden.


    Durch das return und gezielte Negation ist es möglich das aufzuräumen und deutlich übersichtlicher zu gestalten, dass du keine Ebenen mehr hast.

    Alle negativen / Fehler - Fälle fängst du quasi vorne ab und übrig bleibt der Happy-Path.


    Dann ist das auch sehr übersichtlich und eindeutig.


    Aber Performance-Technisch ist da kein Unterschied. Nur deutlich übersichtlicher, da ja auch hier auf else etc verzichtet werden kann.