[SAMMELTHREAD] Kleine Scripting Fragen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • @LordDemacia
    Auch wenn mein Code selber manchmal unordentlich ist, möchte dir diesbezüglich, mal ein paar Tipps geben.


    Verwende wie ich bereits gestern erwähnte Makros, es ist nicht sehr "gut", überall im Skript, jederzeit, den Spieler Namen erneut auszulesen, wenn es einmal auch reicht.
    Wenn du eine Variable erstellst, erstelle sie alle auf einmal, und nicht einzeln.
    Verwende doch Tab anstatt Leerzeichen um deine Zeilen einzurücken, das ist schrecklich, aber genau so, habe ich es in meiner Anfangszeit auch gemacht, ist aber so ziemlich hässlich, benutze Tab.
    Ich weiß dass es bei einer bestimmten sscanf Version der Fall war, dass man die String Länge auch bei der Nutzung angeben musst, probiere es mal ohne, ich kann es auch problemlos ohne Angabe nutzen.
    Frage am Besten gleich ab ob er Eingeloggt ist & nicht ob er nur Online ist.
    Ban & Kick hintereinander? Das macht kein Skin, bei der Ban Funktion wird man ebenfalls gekickt.
    Nutze Banfix oder einen eigenen Timer der die das mit dem Kickfix übernimmt, sprich, wenn du es so machst, wird dem Spieler selbst, die Nachricht nicht angezeigt, warum er gebannt/gekickt wurde.


    Soo
    Wie gesagt, erstell dir mal in deiner Datenbank Struktur ein Feld was sich 'ban' nennt & richte es beim Speichern & Laden ein.
    Habe dir mal den Code umgeschrieben & kleine Erklärungen unterkommentiert, hoffentlich kannst du was mit anfangen.



    //Makro für das Spielernamen ausgeben, kann für jeden Spieler der Online ist, genutzt werden.
    #define getName(%0) PlayerInfo[%0][pName]


    //Bei deinem Player Enum fügst du hinzu & pBan
    pName[MAX_PLAYER_NAME+1],
    pBan,


    //Einmalig bei OnPlayerConnect
    GetPlayerName(playerid, getName(playerid), MAX_PLAYER_NAME+1);


    CMD:ban(playerid, params[])
    {
    if(PlayerInfo[playerid][pAdmin] < 1)return SendClientMessage(playerid, -1,"Du bist kein Admin. Du kannst den Befehl nicht nutzen!");
    new PID, str[128];
    if(sscanf(params, "us", PID, str)) return SendClientMessage(playerid, -1, "[Benutze] /ban [playerid] [Grund]");
    if(!PlayerInfo[PID][pLoggedIn])return SendClientMessage(playerid, -1, "Spieler ist nicht eingeloggt!");
    format(str, sizeof str, "'%s' wurde gebannt von [Admin] '%s'. [Grund:] %s", getName(PID), getName(playerid), str),
    SendClientMessageToAll(-1, str),
    pInfo[PID][pBan] = 1,
    Kick(PID);
    return 1;
    }


    //EDIT Admin Abfrage abgeändert. || Banfix ist ein Include, lad es dir mal runter.


    Meine SSCANF Version, die ich nutze. <- Download
    BanFix - Include | Download

    Einmal editiert, zuletzt von Kasakow ()

  • Danke für deinen Tipp.
    Ja das mit den Makros muss ich noch besser Umsetzen bzw mir eintrichtern :D
    Aber sehr gut erklärt. Ich werde mir mal Tutorials anschauen wegen dem kürzen Code schreiben und alles.

  • Kleine Frage...


    Wenn man mit Doppelklick auf einen Server connecten will, erscheint ja dieses Fenster indem man unter anderem das Server- sowie RCON-Passwort eingeben kann. Warum ist man also nicht bereits als RCON-Admin angemeldet, wenn man auf dem Server gespawned ist?

  • Kleine Frage...


    Wenn man mit Doppelklick auf einen Server connecten will, erscheint ja dieses Fenster indem man unter anderem das Server- sowie RCON-Passwort eingeben kann. Warum ist man also nicht bereits als RCON-Admin angemeldet, wenn man auf dem Server gespawned ist?

    Ich denke mal das hat nichts mit deinem Server/Skript zu tun, sondern ist nen SAMP Bug.

  • @MyU Weißt du darüber mehr? :)


    Ich weiß auch nur, dass es noch nie funktioniert hat :D

    Hat von 2007/2008 bis jetzt nicht funktioniert, vielleicht ein vergessenes feature ist im endeffekt nur noch ein überflüssige Control im SAMP Launcher, weder der Client hat ein Parameter zur übergabe noch macht der Launcher was besonderes damit - ist also nur deko.


    Das einzige was es gibt ist die rcon.exe die man damals noch über Tools -> Remote Console starten konnte, ist aber irgendwann auch verloren gegangen ¯\_(ツ)_/¯ (also der Menü Punkt die rcon.exe is noch da)

  • Schreibe es mal so:



    Oder hier nochmal eine Version, wo die AdminNamen etwas ausgelagert sind:


    ast2ufdyxkb1.png


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

  • @Kaliber
    Danke erstmal für den Tipp.
    Kann deinen Beitrag grade nicht als Zitat nutzen.


    Hätte grade noch eine andere Frage...
    Und zwar sitze ich grade an einem Befehl dran, der das Admin Level setzen soll.
    Funktioniert soweit auch.
    Das einzige was nicht Funktioniert ist, das es in der Datenbank gespeichert wird.


    Hier mal der Befehl:

    CMD:setadmin(playerid,params[])
    {
    if(PlayerInfo[playerid][pAdmin] < 1)return SendClientMessage(playerid, -1,"Du bist kein Admin. Du kannst den Befehl nicht nutzen!");
    new PID, str[128], rank[22];
    if(sscanf(params, "us", PID, str, rank))return SendClientMessage(playerid, -1 ,"[Benutze] /setadmin [playerid][rank]");
    if(!PlayerInfo[PID][pLoggedIn])return SendClientMessage(playerid, -1, "Spieler ist nicht eingeloggt!");
    {
    switch(PlayerInfo[PID][pAdmin])
    {
    case 1: rank = "Moderator";
    case 2: rank = "Anfänger Admin";
    case 3: rank = "Anwärter Admin";
    case 4: rank = "Administrator";
    }
    }
    format(str, sizeof(str), "'%s' wurde zu einem Admin ernannt mit dem Rank: %s",getName(PID),str, rank);
    SendClientMessageToAll(-1, str);
    PlayerInfo[PID][pAdmin] = rank;
    SaveUserStats(PID);
    return 1;
    }


    Jetzt möchte ich nur noch zusätzlich gerne, das anstatt die ID des Rang's der Name des Rangs dort steht.
    Sollte das nicht mit der Methode funktionieren die du mir oben gezeigt hast?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hmmm, bei dem Befehl stimmt so einiges nicht.


    Schau dir eventuell nochmal ein paar Tutorials zu format etc an.



    if(sscanf(params, "us", PID, str, rank))

    "us" sagt du hast 2 Variablen. Eine die was mit einer spielerid zu tun hat und einen string. Dann gibst du aber 3 an...wozu das mit dem str?


    Und wieso rank als String, wenn du es als Integer nutzen magst?


    Dann fragst du per switch & case den Rang ab, noch bevor du ihn überhaupt gesetzt hast.


    Und im Format unten, hast du wieder unnötig str stehen.


    und dann weist du einer Integer Variable...einen String mit dem Inhalt "Moderator" z.B. zu.........


    Also, dass dir da keine Errors/Warnings angezeigt werden grenzt schon nahezu an ein Wunder :D


    Besser wäre sowas (orientiert sich an der 2. Version von dem, was ich oben geschrieben hatte):


    ast2ufdyxkb1.png


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

  • Hey,
    Kann ich abfragen, ob die letzte Nachricht im Chat == einer Nachricht ist?
    Habe nichts gefunden im guten Internet

    Sowas brauch man auch eigentlich nicht.


    Gehe smarter an die Sache ran.


    Wenn es um eine Nachricht geht, die ein Spieler geschrieben hat, dann nutze einfach [wiki]OnPlayerText[/wiki].


    Ist es eine spezielle Info Nachricht, gesendet vom Server (dann schau, wo diese gesendet wird und dann weißt du ja, dass diese gesendet wurde...) :D


    ast2ufdyxkb1.png


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

  • Ja es geht halt darum, wenn ein Spieler das Interior eines Gebäudes betritt, dass er eine Nachricht erhält: "Du hast die Stadthalle betreten".


    Heißt Theoretisch.
    "Du hast die Stadthalle betreten"
    "Du hast die Stadthalle verlassen"


    hier möchte ich, wenn diese Nachricht die letzte ist, dass beim erneuten betreten diese Info Nachricht nicht raus geht.
    Sieht in meinen Augen sehr unprofessionell aus, wenn man öfters wo rein geht:


    "Du hast die Stadthalle betreten"
    "Du hast die Stadthalle verlassen"
    "Du hast die Stadthalle betreten"
    "Du hast die Stadthalle verlassen"
    "Du hast die Stadthalle betreten"
    [tt]"Du hast die Stadthalle verlassen"


    Jetzt weiß ich nicht, ob es sich lohnt einfach einen Delay zu setzten? Kann ja dann sein, dass mit Zufall der Delay im Gebäude nicht mehr aktiv ist und er dann nur die Nachricht beim rausgehen kriegt.
    Bin ja nur ein kleines bisschen Pingelig :D

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • hier möchte ich, wenn diese Nachricht die letzte ist, dass beim erneuten betreten diese Info Nachricht nicht raus geht

    Nutz doch bspw. Textdraws die du nur ganz kurz anzeigen lässt. Dann Spammst du den Chat damit nicht voll.

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

    Margarete Stokowski

  • Ich habe bei vielen globalen Timern folgende Zeile:
    if(!IsPlayerConnected(i) && !IsPlayerInAnyVehicle(i)) continue;



    Ich will ja abfragen, ob der Spieler connected ist und in einem Fahrzeug ist, aber warum benutzte ich da ein '!' davor.
    Ich frage, weil es so funktioniert und ich einfach nicht weiß, wie es so funktionieren kann :D


    Ich mein, bin ich doof? Wenn man !IsPlayerConnected abfragt, dann fragt man doch ob der Spieler nicht connected ist hä?
    Das ist einer meiner ersten Codeversuche von damals, hoffe einer kann mich aufklären, ich mein das continue hat da nichts zusuchen aber der Code funktioniert und genau das macht mir Kopfschmerzen X(


    Code
    public Timer()
    {
    	for(new i=0; i<MAX_PLAYERS; i++)
    	{
    		if(!IsPlayerConnected(i) && !IsPlayerInAnyVehicle(i)) continue;
                    if(getPlayerSpeed(i) > 100)
                    {

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.