Anfänger Gamemode MySQL basierend

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 liebe Breadfish Community,


    ich dachte mir ich mache den Pawno Einsteigern eine kleine Freude.
    Viele sind gerade dabei Pawno zu lernen, und ich möchte diesen Leuten auf die Sprünge helfen.
    Hiermit veröffentliche ich mein Anfänger Gamemode, dieser basiert auf MySQL und beihaltet ein paar Systeme. (SAMP Version 0.3.7)
    Das Script bietet eine gute Grundlage, und man kann gut darauf aufbauen, wenn man ein Selfmade schreiben möchte.




    Was ist vorhanden:

    • 1165 Script-Zeilen
    • Registrierung & Einloggen - (Mit Textdraws, MySQL)
    • Accounts werden gespeichert (MySQL - Name, Passwort, Adminlevel)
    • Verschiedene Adminbefehle, z.B: /goto /gethere /freeze /unfreeze /makeadmin /gmx /givegun und ein paar weitere...
    • Der Help Befehl der mit /help oder /hilfe aufgerufen werden kann, dieser ist leicht erweiterbar da ich die Dialoge bereits erstellt habe und nur noch Befehle etc. eingetragen werden müssen.
    • Der /stats befehl der mit /stats oder /statistik aufgerufen werden kann, dieser ist Dialog basierend und es müssen auch dort nur noch die jeweiligen Stats eingetragen werden.
    • Ein sehr Anfänger freundliches Enter und Exit System. Es müssen nur die Eingangskoordinaten,Ausgangskoordinaten und die Interior ID eingetragen werden, schon erstellt sich automatisch ein Pickup und ein Textlabel an der jeweiligen Stelle.
    • Einen Befehl für die Admins, mit dem man alle Accounts abspeichern kann. (/speichern)
    • Einen Kick Befehl, mit dem man einen Spieler kicken kann, eine Nachricht wird selbstverständlich auch wiedergegeben. Dazu gibt es noch einen passenden Kicklog, der auf dini basiert.
    • SendClientMessageToAdmins, das dient dazu Nachrichten an die Admins zu senden, gut geeignet für Cheater Meldungen o.ä.
    • Das Motorsystem darf natürlich nicht fehlen. mit /motor oder /engine kann man den Motor eines Fahrzeugs anschalten, und mit /licht oder /lights kann man die Scheinwerfer des Fahrzeugs anschalten.



    Warum veröffentliche ich diesen Gamemode:

    Ich veröffentliche den Gamemode weil es sicherliche Leute gibt, die ihn benötigen.
    Erstellt habe ich ihn, um den Pawno einsteigern zu helfen.



    Bugliste:

    Bugs sind mir bis jetzt nicht bekannt.
    Ich habe den Gamemode auch nicht sonderlich gut getestet.
    Wenn Bugs vorhanden sind, können die gerne genannt werden ich helfe auch beim fixen etc.



    Vergesst bitte nicht, das dies mein erster Gamemode ist den ich geschrieben habe ohne Hilfe.
    Ich habe zwar schon viele Scripts editiert, aber das ist mein erstes Selfmade.
    Wenn der Code an einigen Stellen unsauber oder fressend ist, kann mir das gerne gesagt werden ich nehme Kritik gerne entgegen um mich zu verbessern.


    Jetzt wünsche ich allen noch viel Spaß mit dem Script!! :D



    DOWNLOAD:


  • Ich habe das Script erstmal nur überflogen. Es ist natürlich sehr minimalistisch gehalten und hat somit kaum Umfang aber ich möchte vor allem da es sich an Script Anfänger richten soll und du, so scheint es mir, selbst einer bist mir zwei grundlegende Dinge aufgefallen sind, die ich nennen möchte. Es kann natürlich sein, dass ich hierbei nennenswertes übersehen habe, aber ich nenne einfach mal was mir auf den ersten Blick aufgefallen ist.


    1.
    Fangen wir mit den Befehlen an. Hier verwendest du ocmd was an sich nichts schlimmes ist.
    Wo liegt jetzt das Problem? Der Fakt dass du den Befehl immer nach diesem Schema aufbaust "ocmd:befehlsname(playerid,params[])"
    Unabhängig davon ob für den Befehl Paramater benötigt werden und man sich somit eigentlich params[] sparen könnte oder nicht.


    2.
    Dein Aufbau deiner Textdraws. Wenn ich mir das anschaue erstellst du Spielerbezogene Textdraws beim Connecten unabhängig davon ob man so viele Textdraws braucht und ob man es nicht hätte anders, Textdrawsparender mit gleichem Ergebnis gestalten können, möchte ich hier anmerken dass du temporäre Textdraws "createn" und wieder "destroyen" also löschen solltest und nicht "createn" und dann einfach Hiden solltest denn so ist immer noch ein "Slot" belegt und diese sind auch nur begrenzt. An dieser Stelle verlinke ich mal eine Liste zu allen Limits

  • Das Problem mit den Params kannst du auch ganz einfach lösen.



    #pragma unused params

    Außerdem finde ich das alles etwas sehr übertrieben, hätte man kleiner packen können.
    Wozu eigentlich 200 TextDraws? Habe es lediglich überflogen; das Script soll jedoch für Anfänger sein. Wie soll dort einer damit klarkommen? Das ist ja kein Grundwissen.


    Gruß :P

  • 200 Textdraws?
    Es ist nur der Login Screen enthalten und das sind vielleicht 8-10 Stück, oder war das Ironie? :o
    Normalerweise ist alles sehr Anfänger freundlich, denn wenn man sich alles anschaut ist es selbsterklärend.
    Man muss alles was bis jetzt vorhanden ist nur erweitern, z.B Help befehl, stats befehl, enter exit System und und und ... :D

  • Ja klar, aber ich dachte ich nehme schon mal ein bisschen mehr hinein, damit die Neulinge direkt die Möglichkeit haben etwas anderes zu sehen und zu lernen.
    Es gibt ja auch gerne welche die am Anfang übertreiben und schon mit etwas schwierigeren Dingen anfangen :D


    Aber danke trotzdem für deine Kritik :)

  • Normalerweise ist alles sehr Anfänger freundlich, denn wenn man sich alles anschaut ist es selbsterklärend.

    Dann erklär mal bitte einem Anfänger folgendes System:



    • //Nicht ändern
    • #define cmd:%1(%2) forward cmd_%1(%2);\
    • public cmd_%1(%2)
    • public OnPlayerCommandText(playerid,cmdtext[])
    • {
    • cmdtext[0]='_';
    • new cmdStr[128],cmdParams[128],bool:cmdAffe,cmdFu;
    • for(new i;i<128;i++)
    • {
    • if(cmdtext[i]=='\0')break;
    • if((cmdtext[i]==' ')&&(!cmdAffe))
    • {
    • cmdAffe=true;
    • continue;
    • }
    • if(!cmdAffe)cmdStr[i]=cmdtext[i];
    • else
    • {
    • cmdParams[cmdFu]=cmdtext[i];
    • cmdFu++;
    • }
    • }
    • format(cmdStr,128,"cmd%s",cmdStr);
    • if(!strlen(cmdParams))format(cmdParams,128," ");
    • new i,cmdStr2[128];
    • while(cmdStr[++i])
    • {
    • if ('A' <= cmdStr[i] <= 'Z') cmdStr[i] |= 0x20;
    • if(cmdStr[i] == 'ä' || cmdStr[i] == 'Ä')
    • {
    • format(cmdStr2,128,"%s",cmdStr);
    • cmdStr2[i] = 'a';
    • cmdStr2[i+1] = 'e';
    • for(new o = i+2; o < 128; o++)
    • {
    • cmdStr2[o] = cmdStr[o-1];
    • }
    • format(cmdStr,128,"%s",cmdStr2);
    • }
    • else if(cmdStr[i] == 'ö' || cmdStr[i] == 'Ö')
    • {
    • format(cmdStr2,128,"%s",cmdStr);
    • cmdStr2[i] = 'o';
    • cmdStr2[i+1] = 'e';
    • for(new o = i+2; o < 128; o++)
    • {
    • cmdStr2[o] = cmdStr[o-1];
    • }
    • format(cmdStr,128,"%s",cmdStr2);
    • }
    • else if(cmdStr[i] == 'ü' || cmdStr[i] == 'Ü')
    • {
    • format(cmdStr2,128,"%s",cmdStr);
    • cmdStr2[i] = 'u';
    • cmdStr2[i+1] = 'e';
    • for(new o = i+2; o < 128; o++)
    • {
    • cmdStr2[o] = cmdStr[o-1];
    • }
    • format(cmdStr,128,"%s",cmdStr2);
    • }
    • else if(cmdStr[i] == 'ß')
    • {
    • format(cmdStr2,128,"%s",cmdStr);
    • cmdStr2[i] = 's';
    • cmdStr2[i+1] = 's';
    • for(new o = i+2; o < 128; o++)
    • {
    • cmdStr2[o] = cmdStr[o-1];
    • }
    • format(cmdStr,128,"%s",cmdStr2);
    • }
    • }
    • if(CallLocalFunction(cmdStr,"ds",playerid,cmdParams)) return 1;
    • cmdtext[0]='/';
    • new string[100];
    • format(string,sizeof string,"Diesen Befehl gibt es leider nicht! (%s)",cmdtext);
    • return SendClientMessage(playerid,0xFF0000FF,string);
    • }
    • #define OnPlayerCommandText cmdOnPlayerCommandText


    Da bin ich ja mal auf eine Erklärung gespannt was es sein soll und wo der Sinn des Systems ist.
    Ich weiß wozu das System dient deswegen macht es auch absolut keinen Sinn da dieses Problem mittlerweile soweit ich weiß sowieso behoben wurde und selbst wenn nicht, wenn ich mich recht entsinne kümmert sich die ocmd Include sowieso darum und da eh alle Befehle mit ocmd geschrieben wurde klärt sich das von selbst.

  • Falls du noch mehr Feedback möchtest:
    - Zeile 162: Netter Hinweis, es schadet aber nicht es dann auch zu benutzen in Zeile 169
    - Die Textdraws die du erstellst, sind nicht Spielerbezogen (LoginDraw1 - LoginDraw9,LoginDraw14-15). Du überschreibst die Variablen der Textdraws, sobald mehr als 1 Spieler auf dem Server ist (Hast du also nur alleine getestet). Selbst die PlayerTextdraws sind nicht wirklich Spielerbezogen. Du überschreibst auch hier immer die Variablen (LoginDraw10-LoginDraw13)
    - Du erstellst pro PlayerConnect etwa 50 Objekte (Zeile 449 bis 502). Da du die DynamicObjects nicht für den Spieler erstellst (playerid Parameter), erstellst du dir damit unnötige Objekte. Das erstellen gehört einmalig, zum Beispiel OnGameModeInit. (Hast du ebenfalls nur alleine getestest)
    - /restart: Eventuell alle Spieler speichern?
    - /gotoxyz: Wie soll Zeile 854 und 855 gemeinsam funktionieren?
    - /gethere: Der Spieler sitzt in einem Fahrzeug. Was nun?
    - /veh: Wie soll Zeile 947 und 948 gemeinsam funktionieren?
    - SavePlayer(): Totaler Schrott. Eine WHERE Klausel fehlt, ohne die macht das Speichern überhaupt keinen Sinn. Du würdest immer die Daten fremder Spieler überschreiben. (Hast du auch nur alleine getestet,*wenn überhaupt). Die Platzhalter sind falsch bei Geld und Neuling.


    Das sollte für den Anfang reichen :P

    Einmal editiert, zuletzt von Goldkiller ()

  • Ja gut das ist einfach das man cmd: benutzen kann.
    Du hast vollkommen Recht, dass Neulinge das nicht verstehen können.
    Das ist aber das einzige was unverständlich ist :D


    Daran habe ich gar nicht gedacht :/


    Sorry :o

    Nein, die Hauptfunktion ist das ersetzen von Ä durch ae. Wenn ein Befehl /hälp heißen würde würde er durch dieses System

    • if(cmdStr[i] == 'ä' cmdStr[i] == 'Ä')
    • {
    • format(cmdStr2,128,"%s",cmdStr);
    • cmdStr2[i] = 'a';
    • cmdStr2[i+1] = 'e';


    Daraus ein /haelp machen.


    Was merkt man? Absolut unnötig und selbst du hast es nicht mal richtig verstanden. Keine Ahnung woher du den Code hast aber selbst erstellt bezweifel ich doch sehr.

  • Warum muss ich mich dort nicht Registern? im Login-System... steht nur gebe dein Passwort ein dann gebe ich irgendwas ein und es funkt hilfe :D

  • Du brauchst trotzdem eine Datenbank, ohne MySQL wirst du es nicht ordentlich zum laufen kriegen, da für den Login auch MySQL benötigt wird.
    Downloade einfach XAMPP, starte die MySQL Server und tippe im Browser 127.0.0.1/phpmyadmin ein, dort fügst du die Datenbank ein die im Scriptpaket dabei war.
    Dann im Script nur deine MySQL Daten anpassen und fertig sollte der Salat sein. :)

  • Du brauchst trotzdem eine Datenbank, ohne MySQL wirst du es nicht ordentlich zum laufen kriegen, da für den Login auch MySQL benötigt wird.
    Downloade einfach XAMPP, starte die MySQL Server und tippe im Browser 127.0.0.1/phpmyadmin ein, dort fügst du die Datenbank ein die im Scriptpaket dabei war.
    Dann im Script nur deine MySQL Daten anpassen und fertig sollte der Salat sein. :)

    Aber dort steht kein Register

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen