[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
  • Huhu,
    nach langer Inaktivität melde ich mich hier auch mal wieder, da mir ein Fehler in einem neuen Script unterlaufen ist:



    Warum auch immer speichert die Funktion nicht nur den Spieler in der DB, sondern setzt seine Werte auch in jeden anderen Spieler ein.



    Screens von der Tabelle (Usernamen + verlüsselte Passwörter ausgeschnitten):
    https://imgur.com/a/MN4QnS0


    Ich danke euch wie immer im Voraus für eure Hilfe.


    //EDIT: Fehler lustigerweise beim Posten direkt gesehen. Habe beim letzten format nicht das ,query angehängt.

    MfG. Adrian

  • Wenn du viel true/false hast dann würde ich dir empfehlen das ganze in ein "bit-field" umzulagern, du hast leicht gesagt einen 32bit Integer (ganz normale "Pawn Variable") und darin kannst du einfach gesagt 32x(0 oder 1) also false/true speichern.
    Das macht es auch ganz einfach zu Speichern, indem du einfach das ganze bitfield in deinem System der Wahl als Integer behandelst, Zeit und Platz gespart :)


    Das beste Beispiel was ich gerade schnell gefunden hab ist hier zu finden: https://forums.alliedmods.net/showthread.php?t=139916 siehe Example 3 ist soweit das gleiche in "SAMP PAWN"

  • Ist es irgendwie möglich Zeilenumbrüche mit SendClientMessage zu machen, sodass ich nicht 4x SendClientMessage(string) nutzen muss sondern einfach einen string einfüge, der dann \n beinhaltet ?

    MfG. Adrian

  • Das ist mit SA:MP leider nicht möglich.

    Doch ist es, indem er eine Funktion schreibt wo der String ausgelesen wird und doch geschaut wird steht dort /n und dann darauf eine Neue Nachricht macht, was es natürlich unnütz macht.



    Ist es irgendwie möglich Zeilenumbrüche mit SendClientMessage zu machen, sodass ich nicht 4x SendClientMessage(string) nutzen muss sondern einfach einen string einfüge, der dann \n beinhaltet ?

    Das könnte dir helfen und dann einfach SendClientMessageEx nutzen, Jedoch ist das nur für 2 Nachrichten gedacht.
    Du kannst dies jedoch auch erweitern.


  • versuche es mal so




    stock SaveUserStats(playerid)
    {
    if(!pInfo[playerid][pLoggedIn]) return 1;
    new query[1024];
    mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', skin = '%d', frak = '%d', fraklevel = '%d',",
    pInfo[playerid][pLevel], pInfo[playerid][pAdmin], pInfo[playerid][pSkin], pInfo[playerid][pFrak], pInfo[playerid][pFraklevel]);
    mysql_format(handle, query, sizeof(query), "%s, crew = '%d', crewlevel = '%d', job = '%d', money = '%d', bank = '%d',",
    query, pInfo[playerid][pCrew], pInfo[playerid][pCrewlevel], pInfo[playerid][pJob], pInfo[playerid][pMoney], pInfo[playerid][pBank]);
    mysql_format(handle, query, sizeof(query), "%s, kills = '%d', deaths = '%d', prem = '%d', house = '%d', maxcars = '%d',",
    query, pInfo[playerid][pKills], pInfo[playerid][pDeaths], pInfo[playerid][pPrem], pInfo[playerid][pHouse], pInfo[playerid][pMaxcars]);
    mysql_format(handle, query, sizeof(query), "%s, tut = '%d', checkpoint = '%d', wanteds = '%d', veri = '%d',",
    query, pInfo[playerid][pTut], pInfo[playerid][pCheckpoint], pInfo[playerid][pWanteds], pInfo[playerid][pVeri]);
    mysql_format(handle, query, sizeof(query), "%s WHERE uid = '%d' ", pInfo[playerid][pID]);
    mysql_pquery(handle, query);
    return 1;
    }

  • tja passiert aber , am ende bei jeder zeile fehlte auch

    Danke trotzdem für deine Rückmeldung. Im Endeffekt mein Fehler, wenn ich den Edit direkt drunter schreibe. Es gibt immer einige die es nicht komplett durchlesen.
    Jedoch steht das Komma, welches du überall hinzugefügt hast schon in der query und zwar jedes mal hinter dem %s.


    Ich hätte einfach nur direkt ein fehlendes ,query hinter dem letzten format sehen müssen.



    Er hat doch bereits geschrieben, dass er den Fehler gefunden hat. :D
    Dein Code würde das Problem deswegen auch nicht lösen, weil du genauso vergessen hast den alten query String mitzuformatieren.

    Wohl wahr. Diese formats sind aber auch immer kacke unleserlich hehe.

    MfG. Adrian

  • Hey,
    wie ist es möglich, bei allen Commands statt der ID auch einfach einen Teil des Namen anzugeben?


    Bsp.: Wenn wir einen Spieler Names Testaccount haben


    Statt /whisper [ID von Testaccount]
    /whisper [Testacc]


    habe diese Funktion auf anderen Servern gesehen und würde das ganze selbst auch gerne nutzen.


    Ist das ganze außerdem mit ocmd möglich ?

    MfG. Adrian

  • Dafür benutzt du einfach sscanf.
    Statt d (für einen Integer) oder s (für einen String) verwende einfach u (für einen User)
    Das hat genau diese Funktion.

    Oh shit. Ich glaub das wurde mir sogar schon mal gesagt.


    Dankesehr ihr beiden.




    //e: FRAGE: Kann keine neue Antwort auf das Thema hier senden, von daher versuche ich mal so zu fragen:


    Macht es einen krassen Unterschied, wenn ich 3Enums(und damit auch 3 verschiedene MySQL-Tabellen) für folgendes mache:
    1. Spielerstatistik 2. Spielerinventar 3.Spielereinstellungen


    Würde das gerne für mich selbst so machen, damit ich zum einen nicht eine extrem volle "users" Tabelle habe und ich zum anderen im script leichter unter ähnlich benannten variablen unterscheiden kann.
    Wenn das ganze performancetechnisch recht gravierend wär, würde ich es sein lassen. Auch wenn ich sowieso mind. noch 10enums+tabellen für andere Systeme erstellen werde.


    Abgefragt werden die Tabellen sowieso nur, wenn etwa alle halbe stunde ein AutoSave ausgeführt wird und eben bei connect/disconnect eines Spielers.

    MfG. Adrian

    Einmal editiert, zuletzt von SkeeZy ()

  • Wieso denn neue Enumeratoren.
    Klar kannst du verschiedene Tabellen nutzen, dennoch das gleiche Array, gebunden an den selben Enumerator.

    Ist eher so für mich, würde es so ein wenig übersichtlicher haben, da ich recht viele ähnlich benannte Variablen in den Arrays habe, diese schon mehrfach verwechselt habe, und das nach ihren Bereichen unterteilen möchte.
    Deshalb fragte ich ja, ob man dadurch performancetechnisch einen Unterschied merken würde.


    Wieder eine neue Frage:
    Ich habe 2 Funktionen, mit denen ich das Geld eines Spielers setzen / getten kann.


    beim setter wird sein Geld resettet(ResetPlayerMoney) und dann auf die variable(pInfo[playerid][pMoney]) += menge gesetzt.


    Allerdings habe ich ein Problem mit einigen Aktionen die standardmäßig Geld abziehen, z.B. bei
    Sprunk-Automatenm, Tuning in Werkstätten, Respray(PnS).


    Hierbei wird das Geld direkt vom "normalen" Geld abgezogen. Da meine Funktion das nicht sieht bzw. die Variable hierbei nicht angepasst wird, kann der Spieler diese Funktionen kostenlos nutzen, da beim nächsten GivePlayerMoneySave(meine Funktion) einfach das Geld resettet und nach pInfo[playerid][pMoney] neugesetzt werden würde.


    Ich hoffe man versteht was ich meine.


    Ich brauche einfach nur eine Lösung, die diese Kosten(Sprunk, Tuning, Respray und weitere) bei der Aktion auch von der Variable abziehen.

    MfG. Adrian