Angepinnt [SAMMELTHREAD] Kleine Scripting Fragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3 Dinge zu dem Code:

    1. Das liegt an dem return 1; in der Funktion getPlayerSpeed. Das bedeutet in deinem TextDraw müsstest du immer eine 1 sehen, wenn du im Auto bist :) Also einfach das löschen.
    2. Du könntest die Funktion noch optimierten, indem du anstatt floatsqroot einfach [wiki]VectorSize[/wiki] nutzt, diese wurde dafür extra entwickelt :)
    3. In einer Schleife solltest du keine Variablen deklarieren, da das immer viel Zeit braucht.
    Im Spoiler ist die optimierte Version :)

    Spoiler anzeigen


    C-Quellcode

    1. stock getPlayerSpeed(playerid)
    2. {
    3. new Float:x, Float:y, Float:z;
    4. if(IsPlayerInAnyVehicle(playerid)) GetVehicleVelocity(GetPlayerVehicleID(playerid), x, y, z);
    5. else GetPlayerVelocity(playerid, x, y, z);
    6. return floatround(floatmul(VectorSize(x,y,z), 161.0));
    7. }
    8. //Nutzung dann so:
    9. for(new i,string[128]; i<MAX_PLAYERS; i++)
    10. {
    11. if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    12. format(string, sizeof(string), "Speed: %d KM/H", getPlayerSpeed(i));
    13. PlayerTextDrawSetString(i, Tacho9[i], string);
    14. }
    Alles anzeigen


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Warum werden bei diesen Code meine Login Boxen mit Angezeigt ?


    Quellcode

    1. new Text:Register[19];
    2. new Text:Login[2];
    3. new PlayerText:Registername[MAX_PLAYERS],
    4. PlayerText:Registerpw[MAX_PLAYERS],
    5. PlayerText:Registertag[MAX_PLAYERS],
    6. PlayerText:Registermonat[MAX_PLAYERS],
    7. PlayerText:Registerjahr[MAX_PLAYERS],
    8. PlayerText:Registerpfeill[MAX_PLAYERS],
    9. PlayerText:Registerpfeilr[MAX_PLAYERS],
    10. PlayerText:Registerpfeill2[MAX_PLAYERS],
    11. PlayerText:Registerpfeilr2[MAX_PLAYERS],
    12. PlayerText:Registergeschlecht[MAX_PLAYERS],
    13. PlayerText:Registerb[MAX_PLAYERS],
    14. PlayerText:Registerskin[MAX_PLAYERS],
    15. PlayerText:Registeremail[MAX_PLAYERS],
    16. PlayerText:Loginname[MAX_PLAYERS],
    17. PlayerText:Loginskin[MAX_PLAYERS],
    18. PlayerText:Loginb[MAX_PLAYERS];
    Alles anzeigen

    Quellcode

    1. if(rows == 0)
    2. {
    3. for(new i = 0; i < sizeof(Register); i++)
    4. {
    5. TextDrawShowForPlayer(playerid, Register[i]);
    6. }
    7. PlayerTextDrawSetString(playerid, Registername[playerid], pInfo[playerid][pName]);
    8. PlayerTextDrawShow(playerid, Registername[playerid]);
    9. PlayerTextDrawSetSelectable(playerid, Registerpw[playerid], 1);
    10. PlayerTextDrawShow(playerid, Registerpw[playerid]);
    11. PlayerTextDrawSetSelectable(playerid, Registertag[playerid], 1);
    12. PlayerTextDrawShow(playerid, Registertag[playerid]);
    13. PlayerTextDrawSetSelectable(playerid, Registermonat[playerid], 1);
    14. PlayerTextDrawShow(playerid, Registermonat[playerid]);
    15. PlayerTextDrawSetSelectable(playerid, Registerjahr[playerid], 1);
    16. PlayerTextDrawShow(playerid, Registerjahr[playerid]);
    17. PlayerTextDrawShow(playerid, Registerpfeill[playerid]);
    18. PlayerTextDrawShow(playerid, Registerpfeilr[playerid]);
    19. PlayerTextDrawSetSelectable(playerid, Registergeschlecht[playerid], 1);
    20. PlayerTextDrawShow(playerid, Registergeschlecht[playerid]);
    21. //PlayerTextDrawSetSelectable(playerid, Registeremail[playerid], 1);
    22. //PlayerTextDrawShow(playerid, Registeremail[playerid]);
    23. PlayerTextDrawSetSelectable(playerid, Registerb[playerid], 1);
    24. PlayerTextDrawShow(playerid, Registerb[playerid]);
    25. PlayerTextDrawShow(playerid, Registerskin[playerid]);
    26. SelectTextDraw(playerid, 0xFF0000FF);
    27. Regstep[playerid] = 1;
    28. SendClientMessage(playerid, -1, "Herzlich Willkommen, Gebe hier zunächst deine Daten ein.");
    29. SendClientMessage(playerid, -1, "Soblad du damit fertig bist kannst du dein Skin auswählen.");
    30. return 1;
    31. }
    Alles anzeigen
    youtube.com/channel/UC5TZUUd86…AZ4dYQ?view_as=subscriber

    Biete Scripting Service an bei Interesse ->Pn
    Verkaufe Selfmade Script bei Interesse -> Pn

    Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: FEHLER GEFUNDEN ().
  • 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:

    Quellcode

    1. ocmd@3:a,achat,adminchat(playerid,params[])
    2. {
    3. if(PlayerInfo[playerid][pAdmin]>=1)
    4. {
    5. new achat[128],msg[128];
    6. if(sscanf(params,"s",achat))return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    7. format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],achat);
    8. SendMessageToAdmins(COLOR_ADMIN,msg);
    9. }
    10. else{
    11. SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    12. }
    13. }
    Alles anzeigen



    Quellcode

    1. stock SendMessageToAdmins(color, const string[])
    2. {
    3. for(new i = 0; i < MAX_PLAYERS; i++)
    4. {
    5. if(PlayerInfo[i][pAdmin] != 0)
    6. {
    7. SendClientMessage(i,color, string);
    8. }
    9. }
    10. }
  • @Xazor

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

    PAWN-Quellcode

    1. ocmd@3:a,achat,adminchat(playerid,params[])
    2. {
    3. if(PlayerInfo[playerid][pAdmin]>=1)
    4. {
    5. new achat[128],msg[128];
    6. if(sscanf(params,"s[128]",achat))return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    7. format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],achat);
    8. SendMessageToAdmins(COLOR_ADMIN,msg);
    9. }
    10. else{
    11. SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    12. }
    13. }
    Alles anzeigen



    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 ♣
  • iZAG2k18 schrieb:

    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-Quellcode

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


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Habe kurz eine frage das mit unload funktioniert nicht wen er hinfährt und einfach /unload macht,

    Quellcode

    1. ocmd:unload(playerid, params[])
    2. {
    3. new vehicleid = GetPlayerVehicleID(playerid);
    4. if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_GREY, "Du befindest dich in keinem Tanker.");
    5. for(new it=1;it<MAX_TANKEN;it++)
    6. {
    7. if(Tanke[it][tCreated] == 1)
    8. {
    9. if(IsPlayerInRangeOfPoint(playerid, 5.0, Tanke[it][tPickupX], Tanke[it][tPickupY], Tanke[it][tPickupZ]))
    10. {
    11. new string[128], int;
    12. Tanke[it][tMaxLiter] -= Tanke[it][tLiter] = int;
    13. new cash = Tanke[it][tKasse];
    14. new kosten = (Tanke[it][tBenzinAnkauf]*int);
    15. if(cash < kosten)return SendClientMessage(playerid, COLOR_GREY, "** Die Kasse hat nicht genügend Geld für das Benzin.");
    16. Vehicle[GetVehicleTrailer(vehicleid)][vehProds] -= int;
    17. new Float:intfloat = float(int);
    18. new Float:add = floatadd(intfloat, Tanke[it][tLiter]);
    19. Tanke[it][tLiter] = add;
    20. if(Tanke[it][tLiter] == Tanke[it][tMaxLiter])
    21. {
    22. format(string, sizeof(string), "{21DD00}Es konnten nur %d Liter abgeliefert werden, die Tankstelle ist voll.", int);
    23. SendClientMessage(playerid, COLOR_WHITE, string);
    24. format(string, sizeof(string), "{21DD00}Gehalt: %d$", kosten);
    25. SendClientMessage(playerid, COLOR_WHITE, string);
    26. format(string, sizeof(string), "{21DD00}Liter: %d/2500", Vehicle[vehicleid][vehProds]);
    27. SendClientMessage(playerid, COLOR_WHITE, string);
    28. }
    29. format(string, sizeof(string), "{21DD00}Gehalt: %d$", kosten);
    30. SendClientMessage(playerid, COLOR_WHITE, string);
    31. format(string, sizeof(string), "{21DD00}Liter: %d/2500", Vehicle[vehicleid][vehProds]);
    32. SendClientMessage(playerid, COLOR_WHITE, string);
    33. Tanke[it][tKasse] -= kosten;
    34. GivePlayerMoneys(playerid, kosten);
    35. UpdateTankLabel(it, Tanke[it][tOwned]);
    36. }
    37. }
    38. }
    39. return 1;
    40. }
    Alles anzeigen
  • Dr. Frauenarzt schrieb:

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

    Quellcode

    1. ocmd:unload(playerid, params[])
    2. {
    3. new vehicleid = GetPlayerVehicleID(playerid);
    4. if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_GREY, "Du befindest dich in keinem Tanker.");
    5. for(new it=1;it<MAX_TANKEN;it++)
    6. {
    7. if(Tanke[it][tCreated] == 1)
    8. {
    9. if(IsPlayerInRangeOfPoint(playerid, 5.0, Tanke[it][tPickupX], Tanke[it][tPickupY], Tanke[it][tPickupZ]))
    10. {
    11. new string[128], int;
    12. Tanke[it][tMaxLiter] -= Tanke[it][tLiter] = int;
    13. new cash = Tanke[it][tKasse];
    14. new kosten = (Tanke[it][tBenzinAnkauf]*int);
    15. if(cash < kosten)return SendClientMessage(playerid, COLOR_GREY, "** Die Kasse hat nicht genügend Geld für das Benzin.");
    16. Vehicle[GetVehicleTrailer(vehicleid)][vehProds] -= int;
    17. new Float:intfloat = float(int);
    18. new Float:add = floatadd(intfloat, Tanke[it][tLiter]);
    19. Tanke[it][tLiter] = add;
    20. if(Tanke[it][tLiter] == Tanke[it][tMaxLiter])
    21. {
    22. format(string, sizeof(string), "{21DD00}Es konnten nur %d Liter abgeliefert werden, die Tankstelle ist voll.", int);
    23. SendClientMessage(playerid, COLOR_WHITE, string);
    24. format(string, sizeof(string), "{21DD00}Gehalt: %d$", kosten);
    25. SendClientMessage(playerid, COLOR_WHITE, string);
    26. format(string, sizeof(string), "{21DD00}Liter: %d/2500", Vehicle[vehicleid][vehProds]);
    27. SendClientMessage(playerid, COLOR_WHITE, string);
    28. }
    29. format(string, sizeof(string), "{21DD00}Gehalt: %d$", kosten);
    30. SendClientMessage(playerid, COLOR_WHITE, string);
    31. format(string, sizeof(string), "{21DD00}Liter: %d/2500", Vehicle[vehicleid][vehProds]);
    32. SendClientMessage(playerid, COLOR_WHITE, string);
    33. Tanke[it][tKasse] -= kosten;
    34. GivePlayerMoneys(playerid, kosten);
    35. UpdateTankLabel(it, Tanke[it][tOwned]);
    36. }
    37. }
    38. }
    39. return 1;
    40. }
    Alles anzeigen
    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 ().

  • Jeffry schrieb:

    Nutzt du die aktuelle ocmd Include?
    ocmd 2.1.1 [ Update 3.11.2013 ]

    Aktualisiere diese gegebenenfalls.
    Vielen Dank hat die Lösung eingebracht.


    Kaliber schrieb:

    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-Quellcode

    1. ocmd@3:a,achat,adminchat(playerid,params[])
    2. {
    3. if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    4. if(params[0] == EOS || params[0] == '\1') return SendClientMessage(playerid,COLOR_RED,"[INFO] Nutze /a[chat] [Text]");
    5. new msg[128];
    6. format(msg,sizeof(msg),"%s %s: %s",Adminrang(playerid),PlayerInfo[playerid][pName],params);
    7. SendMessageToAdmins(COLOR_ADMIN,msg);
    8. return 1;
    9. }
    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 ().
  • Hallo,

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

    PAWN-Quellcode

    1. 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:

    PAWN-Quellcode

    1. 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
  • Keslo schrieb:

    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-Quellcode

    1. #undef MAX_PLAYERS
    2. #define MAX_PLAYERS 25
    Dann würdest du eben nur 25 Einträge durchgehen hahaha :D

    Aber schon richtig foreach wäre am besten:

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

    Gehen würde auch sowas wie:

    PAWN-Quellcode

    1. 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 :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • seegras schrieb:

    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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Keslo ()