Beiträge von Kaliber

    ich versteh nur nicht was daran falsch ist

    Es steht doch da, was falsch ist.


    Schau mal in die Doku: https://team.sa-mp.com/wiki/My…#cache_get_value_name_int


    Du verwendest cache_get_value_name_int gibst aber keinen Spaltennamen an...


    So wie das aussieht, willst du cache_get_value_index_int verwenden.


    Aber selbst da, bekommst du nicht als return wert den Wert zurück, sondern als Parameter gesetzt.


    Sprich dann so nutzen:


    cache_get_value_index_int(i, 0, dynClothesInfo[playerid][i][cID]);


    Wobei ich dir empfehle das per Name zu machen, damit es zu keinen Verwechslungen kommt...ist schwer zu finden xD


    Oder nutze direkt ein ORM System, wobei das etwas komplexer ist, wenn man damit noch nie gearbeitet hat.

    Genau :)


    Nur die Klammern sind unnötig, also:


    C++
    for(new i, j = GetPlayerPoolSize(); i <= j; i++)
    {
        if(IsPlayerNPC(i) || !eingeloggt[i]) continue;
        SpeichereSpieler(i);
    }


    Das reicht völlig.


    Wenn btw keine Reihenfolge nötig ist (beim Zählen der Loop), kannst die Loop auch noch optimieren:


    C++
    for(new i = GetPlayerPoolSize(); i != -1; i--)
    {
        if(IsPlayerNPC(i) || !eingeloggt[i]) continue;
        SpeichereSpieler(i);
    }


    Dann ist die Bedingung nämlich eine Konstante und keine Variable mehr.


    Aber Grundsätzlich ist das mit dem GetPlayerPoolSize überbewertet. Ich denke es macht mehr Sinn MAX_PLAYERS auf ein angemessenes Niveau zu definieren und dann zu nutzen.


    OMP zum Beispiel hat das auch entdeckt und empfiehlt halt foreach oder MAX_PLAYERS :)


    Siehe: https://www.open.mp/docs/scrip…nctions/GetPlayerPoolSize

    Das hängt mit Callback-Hooking zusammen :)


    Dort wird quasi der Callback unbenannt mit _ALS_ und deshalb kannst du das nicht direkt aufrufen.

    Generell ist das keine gute Idee Callbacks direkt aufzurufen. Willst du, dass der Spieler den Server verlässt, dann Kick ihn.


    Ansonsten lager den Code von OnPlayerDisconnect in eine Funktion aus und rufe diese gezielt auf.


    PS: Der schlägt dir Gas vor, weil der Compiler durcheinander kommt. Der sucht nach 3 stelligen Variablennamen, weil "ALS" auch 3 stellig ist und schlägt dir das deshalb vor :D

    Dinge die mir aufgefallen sind:

    1. Gut, dass der Server 1000 Slots hat. Das nenne ich Optimismus! 💕
    2. Wieso darf das Passwort keine Sonderzeichen enthalten, wtf? Nutzt ihr kein Hashing? Das wirkt maximal suspekt und gefährlich.
    3. Ich kann mich nicht registrieren, er sagt nachdem ich mein PW eingegeben habe, dass mein PW nicht stimmt. (Habe es mit 2 Accs ausprobiert) Das sollte evtl nochmal geprüft werden.

    Joa, also Respekt 👍🏼

    (function($) {

    Es ist komisch, dass du Dropbox direkt aufrufst.

    Normalerweise musst du das dem $.fn Objekt hinzufügen.


    In deinem Fall am Ende (der (function($) { Funktion) folgendes tun:


    $.fn.Dropbox = Dropbox;


    Und dann das wie folgt aufrufen:


    JavaScript
    function BootOs_Dropbox(elem) {
        var myBootOs = new $.fn.Dropbox({content: 'ajax/test.php', elem: elem, ajax: true});
    }

    nur wird das nur auf eine Seite angezeigt und nicht auf beiden Seiten

    Das liegt an der Reihenfolge, wie du die Dinge aufrufst.


    Du musst natürlich erst das eine Objekt erstellen und anheften und dann das Andere.

    Nicht beides versuchen parallel zu mixxen.


    Ich empfehle dir btw das in eine Funktion auszulagern (da du das sicherlich noch öfters nutzen wirst) und zum Anderen einen Streamer zu verwenden, denn wenn du da (nur als extremes Beispiel) 500 Fahrzeuge hast, könntest du keine anderen Objekte mehr auf dem Server streamen 😅 Deshalb nie CreateObject verwenden, sondern immer CreateDynamicObject.


    Sähe dann z.B. so aus:


    Habe es eben getestet, also mit den Daten stimmt alles.


    (Bekommst du da nicht mega viele compile Fehler?)


    Wie Maho schon gesagt hat, es reicht quasi:


    C++
    Postwagen[0]=CreateVehicleEx(609,989.9643,-1525.2175,13.7328,180.3481,1,1,120,false);
    
    new postobj = CreateObject(19477, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
    SetObjectMaterialText(postobj, "-", 0, OBJECT_MATERIAL_SIZE_128x64,"Wingdings", 75, 1, 0xFFFFFFFF, 0, OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
    AttachObjectToVehicle(postobj, Postwagen[0],1.24, -1.0, 1.2, 0.0, 0.0, 0.0);

    So, das sieht doch schon einmal ganz anders aus.


    Laut Log handelt es sich hier um einen OutOfMemory Fehler der GPU.


    Da gibt es jetzt 3 Möglichkeiten:

    1. Der Mod ist absolut kacke programmiert. Am Besten testest du das, wenn jemand mit besserer Hardware das testet und wenn es dort auch fehlschlägt, dann kannst du dir sehr sicher sein, dass da Memory-Leaks oder unnötige riesen Speicher-Reservierungen. im Code vorhanden sind.
    2. Deine GPU hat einen Hardwarefehler, zu wenig Speicherplatz, ist zu alt oder hat veraltete Treiber o.ä.
    3. Im Log wird versucht D3D11 zu verwenden. D3D11 steht für Direct3D11 oder auch DirectX11 genannt. Da stellt sich mir jetzt die Frage, wieso da auf die 11er Version zugegriffen wird. Liegt das an deinem PC, welches Betriebssystem nutzt du? Seit Windows10 ist der Standard eigentlich DirectX12. Eventuell hier mal aktualisieren.

    Viel Erfolg :)

    Ich liebe es ja Log Einträge als Screenshots zu erhalten...vor Allem, wenn es nur n kleiner Teil der Logs ist.

    Auch gut, dass die Screens in unterschiedlicher Zeitlicher Abfolge gepostet wurden...


    Am Besten wäre ja ein Video, wie du die Logs ganz schnell durchscrollst, kappa xD


    Wieso nicht einfach den gesamten Log mal hier posten? Ist das so schwer? Oder hänge ihn an...



    Was hat das in der Sektion Fehler / Vorschläge / Kritik / Lob zum Forum zu suchen? Also die Zeit hätte man sich nehmen können...

    tag mismatch ist immer die hp = 15.0;

    Ah, sry, schreib es so:


    Oder versuchs mal so:


    In Pawn, kannst du nicht einfach unterschiedliche Typen in ein Array quetschen :)


    Da die Sprache C-Ähnlich ist, unterliegt sie einer strengen Typisierung.

    Mehr Infos dazu: https://de.wikipedia.org/wiki/Typisierung_(Informatik)


    Im Gegensatz zu z.B. Javascript/Python, wo das Problemlos möglich wäre, muss hier angegeben werden, um was für einen Typ es sich handelt. Also String (Array) oder int, bool, float o.ä.


    Sonst kann der Compiler das nicht verarbeiten.


    Also das "enum" sorgt in diesem Fall dafür, dass der Compiler weiß, welche Typen im Array sind und es hat den netten Nebeneffekt, dass du die Variablen im Array gleich benennen kannst und es so übersichtlicher auch für dich wird :)


    Alternativ könntest du auch mehrere Arrays erstellen:


    C
    new VPNames[][] =
    {
        "Ronald",
        "Donald",
        "Gonald"
    };
    
    new VPBools[sizeof(VPNames)] = {true, true, false};

    Das sizeof(VPNames) gibt in diesem Fall vor, dass das Array, genauso groß sein muss, wie VPNames.

    Aber es ist denke ich schöner alles in einem zu haben und auch direkt mit einem Namen ansprechen zu können.

    Hier hätte man mehrere Stellen, die immer zu berücksichtigen sind, das kann schnell unübersichtlich werden.


    Falls es sich hier übrigens um Konstanten handelt, also ein Array, wo der Wert zur Laufzeit nicht mehr geändert wird, dann kannst du anstatt

    new

    stock const verwenden.


    stock sagt aus (egal ob vor globalen Variablen oder Funktionen), dass wenn die Variable (oder die Funktion) nicht im Code benutzt wird, der Compiler es ignorieren kann und so wird kein Speicher reserviert in der .amx Datei.


    Das const sorgt dafür, dass die Nutzung optimiert wird und du nicht (evtl. ausversehen) irgendwelche Werte mehr darin nachträglich ändern kannst.

    Oder kann ich einfach irgendwie

    Ja, fast, kannst es so machen:


    Finde es gut, dass du pogressbar, statt progressbar geschrieben hast ^^


    Laut ChatGPT könnte dir das helfen.


    Da so wenig Infos zur Verfügung stehen, ist das doch schon einmal ein guter guess.


    Nächstes mal doch einfach selbst ChatGPT nutzen.