[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
  • Hallo, ich verstehe da jetzt nicht was daran falsch ist.
    Mir wird folgende Fehlermeldung ausgespuckt:


    s.p(324) : error 010: invalid function or declaration
    s.p(326) : error 010: invalid function or declaration
    s.p(329) : error 010: invalid function or declaration
    s.p(331) : error 021: symbol already defined: "SendMessageToAdmins"
    s.p(333) : error 010: invalid function or declaration
    s.p(388) : warning 203: symbol is never used: "achat"
    s.p(388) : warning 203: symbol is never used: "msg"


    Code:



    Code
    stock SendMessageToAdmins(color, const string[])
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(PlayerInfo[i][pAdmin] != 0)
    {
    SendClientMessage(i,color, string);
    }
    }
    }
  • @Xazor


    Falls du die neuste ocmd Include hast, und du das sscanf Plugin nutzt, versuch es mal bitte so:

    ocmd@3:a,achat,adminchat(playerid,params[])
    {
    if(PlayerInfo[playerid][pAdmin]>=1)
    {
    new achat[128],msg[128];
    if(sscanf(params,"s[128]",achat))return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],achat);
    SendMessageToAdmins(COLOR_ADMIN,msg);
    }
    else{
    SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    }
    }



    Dazu schaut es aus, als wenn du schon die Funktion "symbol already defined: "SendMessageToAdmins"" irgendwo hast, und, ist der stock über den Befehl oder unter den Befehl ?
    Hatte tatsächlich schon einmal das Problem, als der Stock unter dem Befehl war, das mir der Compiler auch Fehler ausgespuckt hat.

    Macht alles, versteht aber nichts!
    ♣ Entwickeln, Testen, Versagen, meine Devise ♣

  • und du das sscanf Plugin nutzt, versuch es mal bitte so:

    Nur um das mal zu erwähnen, sscanf in so einem Fall zu nutzen ist sehr schlecht, da das komplett überflüssig ist.


    Man sollte bei so einem Fall direkt params nutzen:


    C
    ocmd@3:a,achat,adminchat(playerid,params[])
    {
    	if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    	if(params[0] == EOS || params[0] == '\1') return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    	new msg[128];
    	format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],params);
    	SendMessageToAdmins(COLOR_ADMIN,msg);
    	return 1;
    }

    ast2ufdyxkb1.png


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

  • Habe kurz eine frage das mit unload funktioniert nicht wen er hinfährt und einfach /unload macht,


  • Habe kurz eine frage das mit unload funktioniert nicht wen er hinfährt und einfach /unload macht,


    C&P lassen und es mal neu schreibe, vielleicht klappt es dann? ;)

  • Beitrag von John_Dree ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Problem bereits gelöst ().
  • Nutzt du die aktuelle ocmd Include?
    ocmd 2.1.1 [ Update 3.11.2013 ]


    Aktualisiere diese gegebenenfalls.

    Vielen Dank hat die Lösung eingebracht.



    Nur um das mal zu erwähnen, sscanf in so einem Fall zu nutzen ist sehr schlecht, da das komplett überflüssig ist.
    Man sollte bei so einem Fall direkt params nutzen:


    C
    ocmd@3:a,achat,adminchat(playerid,params[])
    {
    	if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    	if(params[0] == EOS || params[0] == '\1') return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    	new msg[128];
    	format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],params);
    	SendMessageToAdmins(COLOR_ADMIN,msg);
    	return 1;
    }

    Vielen Dank auch hier, ich wollte nur so ne Art return wie bei dir beschrieben ausgeben und du hast mir da einen kürzeren und besseren Lösungsansatz mitgegeben ^^

  • Beitrag von John_Dree ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fehler gefunden ().
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hallo,


    wie kann man seine for-Schleifen effizient machen? (oder eine andere methode nutzen? foreach?)
    Da die meisten es so machen:


    for(new i=0;i<MAX_PLAYERS;i++)


    Durchgeht er ja jedes mal das Server Limit von 500 Usern. Wie geht es perfomanter?


    2. Frage:
    Wie kann man die globalen Variabeln, beispiel:


    new Hallo[MAX_PLAYERS];


    ebenfalls perfomant machen? Da ich gelesen habe, dass man "GetMaxPlayers()" nutzen kann, aber die ID 0 nicht mitgezählt wird.

    Mit freundlichen Grüßen,


    Keslo

  • Durchgeht er ja jedes mal das Server Limit von 500 Usern. Wie geht es perfomanter?

    Am besten wäre es einfach, sowas zu machen, das würde beide deiner Probleme auf einen Schlag lösen:



    C
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 25

    Dann würdest du eben nur 25 Einträge durchgehen hahaha :D


    Aber schon richtig foreach wäre am besten:


    http://forum.sa-mp.com/showthread.php?t=570868


    Gehen würde auch sowas wie:


    for(new i=GetPlayerPoolSize(); i!=-1; i--)


    Das beispielsweise beginnt ab der höchsten spielerid auf dem Server und nicht z.B. ab 500 :)


    Also zur Verdeutlichung:


    MAX_PLAYERS = Ein fester (konstanter) Wert, den du für Arrays nutzen kannst. (Da dort nur feste Werte verwendet werden können, also Dinge die sich nicht ändern. Die müssen von vorne herein fest definiert sein.) Habe oben ja gezeigt, wie du das anpassen kannst.


    GetMaxPlayers = Diese Funktion liest dir aus der server.cfg den Wert aus. Ist schlecht und kann nicht für Arrays verwendet werden, da es eine Funktion ist und keine konstante! Also am Besten einfach MAX_PLAYERS den Wert von der server.cfg mittels dem Makro trick oben anpassen.


    GetPlayerPoolSize = Gibt die höchste Spielerid auf dem Server wieder. Halt gut geeignet für Loops, aber foreach ist besser, da bei foreach keine Lücken zwischen den IDs entstehen. Quasi wenn ID 4 die höchste Spielerid ist, aber nur ID 1 noch online. Dann beginnt die Loop trotzdem von 4 runter zu zählen. Und bei foreach hättest du nur 2 anstatt 5 (4-0) Einträge.




    Zu deinem 2. Punkt kann man nicht viel sagen.
    Es gibt Memory Editing Plugins, so dass man Variablen dynamisch allozieren kann.


    Einfacher wäre der spezielle Gebrauch von PVars, da du diesen Speicher wieder freigeben kannst.


    Oder eben gezielte Anpassung des Makros von MAX_PLAYERS :)

    ast2ufdyxkb1.png


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

  • Schau dir mal folgendes Thema bzw. explizit den verlinkten Beitrag an


    Code Optimierung


    Alles klar, vielen Dank euch beiden! :rolleyes::rolleyes:



    --


    Hey,


    ich hab da ein Problem, leider hab ich absolut keine Ahnung woran es liegen könnte.


    Wenn ich mein Server Starte, läuft alles super, keine Warns/Errors von Crashdetect/MySQL etc...
    Dann joine ich wie gewohnt auf mein Server, logge mich ein und logge mich wieder aus.
    Wenn ich dann versuche zu joinen, tut er es nicht, sondern da steht dann einfach nur "Connecting to Server...."


    Anschließend muss ich Server und Client neu starten, damit ich wieder connecten kann.


    Hätte jemand eine Idee, was es evtl. sein könnte?

    Mit freundlichen Grüßen,


    Keslo

    Einmal editiert, zuletzt von Keslo ()

  • Ja, dein Server schmiert ab, lade mal crashdetect und schaue dann in den server_log bzw poste den hier

    Das ist der Punkt, da steht nichts :huh:
    Habs nochmal versucht, zwar connected er aber dann steht da nur noch: Connected to MeinServer...

    Mit freundlichen Grüßen,


    Keslo

  • Tjaa...was sollen wir jetzt tun? :D


    Unsere Wunderkugel befragen? :D


    Offensichtlich ist dann etwas an deinem Code verkehrt, wenn wirklich nichts im Log steht ^^

    ast2ufdyxkb1.png


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

  • Tjaa...was sollen wir jetzt tun?


    Unsere Wunderkugel befragen?


    Offensichtlich ist dann etwas an deinem Code verkehrt, wenn wirklich nichts im Log steht

    haha die gute alte Wunderkugel :D
    Natürlich könnt ihr nicht alles wissen, aber ich dachte, vielleicht gab es ja schon vorfälle :D


    trotzdem danke :)


    //edit:
    hab nochmal rumprobiert...
    hab herausgefunden, dass wenn ich nicht connecten kann, dann aber wieder connecte, dann gehts einwandfrei, versuch
    ich danach wieder zu connecten, gehts wieder nicht, dann wieder schon... was ist hier los :whistling::whistling:
    auf anderen servern, mit anderem script funkioniert alles einwandfrei...

    Mit freundlichen Grüßen,


    Keslo

    Einmal editiert, zuletzt von Keslo ()

  • was ist hier los

    Ja wie schon erwähnt ist dies ein Skript Fehler.


    Nun bräuchten wir Code...so von OnPlayerConnect, OnPlayerRequestClass und eben da wo du den Spieler Einloggen willst usw.


    Oder du kannst auch auf eigene Faust ermitteln und mal überall prints verteilen und schauen, wie weit du kommst bzw wo der Code hängen bleibt :)


    Wenn du das gezielt machst, kannst du genau feststellen, an welcher Zeile es hängen bleibt ;)

    ast2ufdyxkb1.png


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

  • Beitrag von John_Dree ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen