[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
  • Ein Fremder sieht den SA-MP Server erst gar nicht, außer er hat jetzt die IP von DC oder Webseite.

    Aber Jucken tut mich das ehrlich gesagt auch nicht. ^^

    So ähnlich hab ich es auch gelöst =)


    PS: wusste gar nicht das es dich auch hier noch gibt =) Grüsse gehen dann mal raus wa =)

    German-Reallive Script



    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||55% Fertig

  • Nun, ich habe auch einmal eine Frage,


    ich habe einmal den discord-connector implementiert und haben diesem einen Token zugewiesen, was auch soweit funktioniert, übrigens, Informationen zum Discord Connector gibt es hier -> klick...


    Nun sagt mir der liebe Compiler folgendes.


    Zitat

    C:\Users\Labware\Desktop\rosalife projekt\gameserver\gamemodes\pending/gamemode.pwn(11950) : fatal error 102: table overflow: "literal table"


    Mit dem Verweis auf :

    0lY22Jl.png


    Das ganze ist aber erst passiert, nachdem ich 2 Zeilen hinzugefügt habe,


    PHP
    else if(ServerLadenStatus == 13)
        {
            printf("-- Der Serverladevorgang wurde erfolgreich beendet.");
            
            aDiscordId = DCC_FindChannelById(1094693219268305046);
            DCC_SendChannelMessage(DCC_Channel(aDiscordId), "Der Server wurde erfolgreich gestartet.");


    Es handelt sich um das DCC, die Includes sind vorhanden. Woran liegt nun dieser Fehler?


    Das Problem konnte behoben werden.


    PHP
            new DCC_Channel:aDiscordId;
            aDiscordId = DCC_FindChannelById("01234567890");
            if(aDiscordId)
            {
                new messageString[265];
                format(messageString, sizeof(messageString), "Der Server wurde erfolgreich gestartet..");
                DCC_SendChannelMessage(aDiscordId, messageString);
            }

    Einmal editiert, zuletzt von LabWare ()

  • GitHub - maddinat0r/samp-discord-connector: SA:MP plugin which controls a Discord bot
    SA:MP plugin which controls a Discord bot. Contribute to maddinat0r/samp-discord-connector development by creating an account on GitHub.
    github.com


    Durchgelesen? Ich weiß ob es ein zsmhang haben kann.

    Du willst mich kennenlernen? Kauf mein Buch, Bia*ch!


  • Prizipiell kannst du jede IDE verwenden und dann das ganze durch den Compiler jagen, Anleitung findest du bspw. hier


    Gamemodes auf einem Li... | bithost Docs
    Compiler herunterladen Wir finden den Compiler auf GitHub, einfach den aktuellsten Release herunter...
    docs.bithost.co


    Ob die Dependencies 1:1 auf macOS so zu finden sind kann ich allerdings nicht sagen - Versucht macht Klug!


    „Nicht das, was du nicht weißt, bringt dich in Schwierigkeiten, sondern dass, was du sicher zu wissen glaubst, obwohl es gar nicht wahr ist.“
    Mark Twain

    ---
    ICH BIN NUR HIER UM LEUTE ANZUSCHREIEN

  • Guten Morgen,

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


    Code
    else return SendClientMessage(playerid,-1,"Hi ^^");

    oder doch lieber so ?

    Code
    else SendClientMessage(playerid,-1,"Hi ^^");
  • 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.

    ast2ufdyxkb1.png


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

  • Sehr verständlich, danke dir :)




    //e


    Wie währe es denn in diesen fall hier richtig da es nur mit else geht wo ich aber auch drauf verzichten will


    Code
    if(RechteInfo[playerid][Admin] >= 1)return true;

    derzeit geht es nur so


    Code
    cmd:blub(playerid,params[])
    {
        if(RechteInfo[playerid][Admin] >= 1)
        {
            jo ist admin kann machen 
        }
        else KeineRechte  // ist so definiert
        return 1;
    }

    Muss ich da ein stock anwenden um es zu umgehen wie zb

    Code
    if(AdminLevel(playerid,1))

    3 Mal editiert, zuletzt von DJSatrox ()

  • 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;
    }

    ast2ufdyxkb1.png


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

  • als stadt = nur < 1 was dann auch für höher als 1 steht dann ?


    /e

    habe es getestet jedoch leider mit beiden verianten kein erfolg

    die mit ! davor ergibt das

    Code
    warning 213: tag mismatch: expected tag "bool", but found none ("_")



    // Habs gelöst, habe nicht richtig aufgepasst, hatte die "<" noch falschrum, geht nun ohne "!" davor, danke dir :thumbup:

    3 Mal editiert, zuletzt von DJSatrox ()

  • 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

    ast2ufdyxkb1.png


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

  • Siehe mein Post den edit :) hatte es zu spät gemerkt xD

    Danke dir aber nochmal :thumbup:

  • Beitrag von kleinersampzocker ()

    Dieser Beitrag wurde von seegras aus folgendem Grund gelöscht: Lange Fehlermeldungen bitte in [code] Tags verfrachten damit sie einklappbar sind, Code entweder ebenfalls in [code] oder falls zu lang bspw bei https://paste.bithost.co hochladen ().
  • Beitrag von kleinersampzocker ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Guten Morgen :)


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

    zb

    Bei über 400 Objecte ist es echt müheselig, alles zu nummerieren.

  • 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.

    ast2ufdyxkb1.png


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

  • Beitrag von DJSatrox ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: erledigt return bei wanted veregessen ^^ ().
  • 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.

    Hey ich habe es jetzt so gemacht aber nun spawnt nix mehr an objecte ?


    Code
        new hplus=-1,hotel[301];
        hotel[++hplus] = CreateDynamicObjectEx(4033, 1721.875000, -1643.054687, 12.734397, 0.000000, 0.000000, 0.000000,500.00,500.00);
        SetDynamicObjectMaterial(hotel[++hplus], 1, 4593, "buildblk55", "snpdsqdoor", 0x00000000);
        SetDynamicObjectMaterial(hotel[++hplus], 2, 7555, "bballcpark1", "ws_carparknew2", 0x00000000);
        SetDynamicObjectMaterial(hotel[++hplus], 3, 14847, "mp_policesf", "mp_cop_tile", 0xFFFFFFFF);
        SetDynamicObjectMaterial(hotel[++hplus], 5, 6873, "vgnshambild1", "fitzwallvgn6_256", 0xFFFFFFFF);
        SetDynamicObjectMaterial(hotel[++hplus], 6, 14847, "mp_policesf", "mp_cop_vinyl", 0xFFFFFFFF);