Beiträge von IPrototypeI


    Du machst es auch kompliziert für die parameter da reicht
    #define USER::%0(%1) %0(%1)


    Aber das ist nicht mal nötig Slice nimmt dazu immer die ersten zwei buchstaben


    #define USER:: U_
    stock U_create(name[],pw[],...)


    du kannst auch abfragen ob ein define definiert wurde und darauf hin die include hinzufügen also
    beispiel


    #define USER:: U_


    #if defined USER::
    #tryinclude "User.inc"
    #endif


    Nein. Nur einen Zeilen Unterschied in der .pwn :D


    mfg. :thumbup:


    Aber bei mehreren Anweisungen wenn man diese in einer reihe schreibt nur sind da die codes ein ganz ganz wenig schneller.
    Beispiel


    return SendClientMessage(playerid,-1,"Hallo"),SendClientMessage(playerid,-1,"wie"),SendClientMessage(playerid,-1,"gehts");


    ist schneller als



    SendClientMessage(playerid,-1,"Hallo");
    SendClientMessage(playerid,-1,"wie");
    SendClientMessage(playerid,-1,"gehts");
    return 1;

    Als erstes solltest du am ende return 1; hinsetzen bei deinem command dann hast das mit der Meldung UNKNOWN COMMAND los. Da letztendlich 0 zurück gegeben wird
    bei OnPlayerCommandText daher kommt die Fehlermeldung


    else
    {
    SendClientMessage(playerid,COLOR_RED,"Gangwars dürfen nur die Gangs oder Mafien machen!");
    }
    return 1;
    }


    Es bietet sich M_GetPlayerCurrentZone mal zu posten und auch die jeweiligen ids auszugeben ob diese auch richtig sind beispiel hier gzone
    womöglich wird der falsche wert von M_GetPlayerCurrentZone zurück gegeben.


    stock Check_If_Point_In_Triangle(playerid,Float:X,Float:Y,Float:Z,Float:R,Float:MAX_Z)
    {
    new const Float:Winkel = 60.0;
    new const Float:Weite = 30.0;
    new Float:Pos[8];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    Pos[4] = Y+(Weite*floatsin(Winkel+R,degrees));
    Pos[5] = Y-(Weite*floatsin(R-Winkel,degrees));
    Pos[6] = X+(Weite*floatcos(Winkel+R,degrees));
    Pos[7] = X-(Weite*floatcos(R-Winkel,degrees));
    return (((Y-Pos[4])*(Pos[0]-X) + (Pos[6]-X)*(Pos[1]-Y)) <0 ||((Pos[4]-Pos[5])*(Pos[0]-Pos[6]) + (Pos[7]-Pos[6])*(Pos[1]-Pos[4])) <0 ||((Pos[5]-Y)*(Pos[0]-Pos[7]) + (X-Pos[7])*(Pos[1]-Pos[5])) <0 || Pos[2] > MAX_Z || Pos[2] < Z) ? 0:1;
    }


    Mit der Berechnung ist es möglich abzuprüfen ob sichjemand in einem Dreieck befindet gedacht war die berechnung für einen blitzer womit man einseitig blitzen kann.



    Grafik noch dazu


    CreatePickup(1318,1,720.8774,-1380.6406,26197.5684,-1);


    Also hier ist es klar bei CreatePickup gibt es eine begrenzung , das bedeutet das es ab einer bestimmten höhe nicht mehr erstellt wird als auch ab einem bestimmten wert der x oder y koordinate.
    Jedoch muss da das Pickup schon aus der map draußen sein.


    Beim ersten Pickup kann ich dir nicht sagen warum dies nicht angezeigt wird hab es zum testen auch mal in einen gm rein gehauen und es wird erstellt.

    Im Endeffekt wollte ich auch nur auf die neuen Funktionen hinweisen. Ja es sind 2 kleine Queries die man spart, aber wenn sich ein Anfänger anschaut wie man so Queries spart, spart er sich Scriptarbeit und hat am Ende auch noch eine bessere Performance. Das merkt er sich und benutzt es weiterhin so, hat (wenn er jetzt sein erstes Gamemode macht) am Ende viel Mühe gespart. Mir geht es nur darum auf die neuen Funktionen aufmerksam zu machen.


    Da hast du vollkommen Recht ^^ die Verwendung zu zeigen war auch eine sehr gute Idee und auf diese neue Funktion aufmerksam zu machen mir ging es eigentlich darum das du meintest das cache_set_active( und die weitere passenden funktionen dazu) hier die performance steigert was es nicht tut klar kann man in manchen Bereichen
    dadurch unnötige Querys sparen da steigerst du dan die Performance ein Beispiel was mir auf die schnelle einfallen würde dazu wäre bei einem Serverrestart da kann man den MySQL server zusätzlich noch schohnen wenn die spieler wieder auf den Server connecten.

    Schau dir mal an wie viele 'SELECT'-Querys vor der Optimierung und wie viele danach insgesamt abgeschickt werden. Queries brauchen Zeit bis sie verarbeitet wurden, je weniger Queries benutzt werden desto weniger Zeit wird verbraucht desto höher ist die Performance.


    NicoAiko, du kannst deine Variablen so benennen wie du willst, aber normalerweise benennt man Konstanten in Großschrift.
    Zu der Passwort-Sache, niemand ist so bescheuert und speichert unverschlüsselt Passwörter. Und als ob man eine Query, die an einen Server geschickt wird, nicht abfangen könnte und dort das Passwort ablesen könnte. Von daher versteh ich da nicht ganz, was du da dran jetzt nicht magst.




    Es sind gerade mal 2 querys dennoch brauchst du hier kein cache_set_active verwenden das ist überflüssig.
    Klar kann man das absenden des einen querys raus kicken obwohl dies eigentlich eine der schnellsten methoden ist abzuprüfen ob ein eintrag existiert oder nicht.
    Ich sag dir sogar das man bei deinem SQL Befehl was abändern kann und zwar LIMIT 1 hinzufügen dann springt mysql nicht weiter nachdem es ein Eintrag gefunden hat.
    Ich möchte mal noch anmerken das man die performance von den Befehlen erhöhen kann es kommt als auf das zusammen spiel der jeweiligen befehle drauf an die jeder unterschiedlich verarbeitet wird vom MySQL Server.


    Man kann sich nun weiter über die performance streiten das ist ehrlich gesagt immer möglich ^^ aber das tutorial ist so doch eigentlich für anfänger gut genug es erfüllt den zweck und er hat es gut gemacht.

    Mysql R7 von Gstylez


    Ok dann sieht das ganze schonmal anders aus dann liegt das daran das dein eingegebene Passwort nicht mit dem deines Benutzers der MySQL Datenbank falsch ist.


    Beispiel:
    Ich benutzte kein Passwort gebe jedoch eins ein
    m_connect = mysql_connect("localhost", "root", "samp_db", "ads");


    Resultat


    CMySQLHandler::Connect() - Access denied for user 'root'@'localhost' (using password: YES) (Error ID: 1045)


    Daher wie schon gesagt überprüfe und schau danach das du das richtige passwort als 4s Argument eingibst was hier im beispiel ads ist

    Ich habe die Litle version dort kann ich ja kein benutzter erstellen
    Und mit passwort funzt es auch nicht ;(


    Du brauchst dazu auch nicht zwingend Navicat du kannst auch wahrscheinlich benutzt du wamp oder xamp da gehst du einfac hauf myphpadmin und erstellst da ein neuen benutzter
    aber ich frag trotzdem mal welches MySQL Plugin benutzt du


    Da du das MySQL plugin von strickenkid benutzt gibt es bei dem Plugin ein kleines Problem und zwar kommt das nicht damit zurecht wenn du kein password benutzt.
    daher musst du bei dem benutzer den du erstellst ein passwort setzen oder nachträglich noch setzen.

    Ich hab mir mal erlaubt das Script etwas zu editieren und verbessern.
    Hier ist die editierte Version, meine eigenen Kommentare sind in eckigen Klammern.
    Besonders die Performance wurde verbessert, da 'cache_save' benutzt wurde. Dadurch wird im ganzen Script nur insgesamt ein Mal eine "SELECT"-Query abgeschickt.
    Verbessert hab ich es weil viele Leute immer noch nicht das Potenzial von 'cache_save' verstehen und ich will immerhin diese Funktion nicht umsonst eingebaut haben.
    Hoffentlich werden die Änderungen umgesetzt.
    MfG


    Du solltest dennoch mal bedenken das , das Ergebnis des querys dadurch zwischen gespeichert wird im memory also temporär und du dieses Ergebniss ihrgend wann abrufen kannst.
    Das hat in dem fall nix mit Performance verbessert zu tun.

    Super Arbeit!
    Erst die Stadthalle dann der Shop.
    Respekt.


    10/10 Punkten


    Womit mappst du und kann man dich für ein Projekt haben?


    Da ich auch schon mehrere Anfragen bekommen habe dies bezüglich auch Aufträge will ich nur mal erwähnen das ich dies Hobbymäßig mache die maps sind seit längerem auf meinem PC ich finde nur keine Verwendung dafür und verkaufen fand ich auch blöd. Ich map eigentlich nur wenn mir gute Ideen einfallen und ich auch lust dazu habe.




    Joa bis auf ein paar kleineren Fehlern, ist die Map sehr schön. Der Boden müsste ausgebessert werden und der Innenraum passt nicht zu 100% zum Haus. Aber alles im allen muss ich sagen, das sie sehr schön aussieht.


    Gebe dir mal Glatte 7 Punkte. Werde sie für mein Projekt wohl nehmen. Wenn du mehr in SF hast, immer her damit. Dann muss ich nicht mappen. Hab nämlich keine Lust. :D


    Da müsste ich mal meine älteren mta maps durchgehen und sonst noch so ein bissle in meinen Festplatten rum suchen ob sich da noch was finden lässt und ja paar Fehler sind schon enthalten.
    Aber nun gut Nobody is perfect. Dennoch freut es mich das sie dir im groben und ganzen gefällt.

    Du liebst die Textur von der Stadthalle was? :D
    Aber endlich mal was in San Fierro. Da sieht man viel zu wenig von. Werde sie mir mal Live anschauen. Vielleicht benutze ich sie ja.


    Ich bin halt ein Fan von hellen texturen das ganze soll strahlen freundlich wirken also meine wand ist auch weiß :D .
    das einzigste was ich selbst bemängeln könnte ist das der boden ein wenig schickt er wackelt zwar nicht nur beim laufen ist das ein wechsel

    Naja ich finde es mehr Copy & Paste als Tutorial


    Anstatt mit Name würde ich mit Userid arbeiten, da es einfacher in Späteren fällen sein wird als es immer mit Name zu machen
    (Ändert man den Namen darf man alle Tabellen ändern wo der name eingesetzt wird. Daher ist da userid sinnvoller)


    Den Rest hat ja schon Prototype angeschprochen


    Man kann kein Tutorial als Copy Paste tutorial bezeichnen die Erklärung sind vorhanden es kommt auf die Leute drauf an die dies als Vorlage nehmen um was neues zu lernen
    der Sinn und Zweck eines Tutorials ist nicht der das Leute den Inhalt kopieren und einfügen und meinen dann können sie es siehe den oberen Beitrag das ist einfach stupide. Nein es geht darum es nachzumachen den Code zu verstehen.

    zum reseten der spieler variabeln kannst du auch eine for-schleife bneutzen
    for(new x; UserData:x < UserData; ++x) User[playerid][UserData:x] = 0;


    aber einen string versuchen mit format zu leeren ist einfach nur :facepalm: das hätte ich nicht erwartet von dir es gibt auch strdel.


    weiteres bei den dialogen kannst du es dir auch einfacher machen und zwar ein enum dazu verwendem



    enum {
    Dialog_Reg = 1,
    Dialog_Login,
    };


    Zu dem reicht auch 1 query um die daten zu aktualisieren


    Als weiteren tipp beim aufruf der jeweiligen funktion kann man auch state benutzen da muss nicht erstmal switch initalisiert werden und die zahlen durchgehen
    @LoadPlayerDataSequence(playerid, l_step);
    state MySQLState:load
    mysql_function_query(mycon, query, true, "@LoadPlayerDataSequence","dd",playerid,2) ;
    @LoadPlayerDataSequence(playerid, l_step)<MySQLState:load>
    {
    ....... code

    Habs jetzt in den Pawno Ordner reingehauen...immernoch der gleiche Fehler :(


    Schreib mir mal deinen weg wie du vorgangen bist


    Bei mir streamt er immernoch nicht..


    Benutzt du in deinem skript CreateObject ?


    erstellt dir ein neuen gm und füg da mal alles ein also die includes dann test es darüber dann kannst du dir sicher sein das es an deinem gm liegt und du zu oft CreateObject verwendest