Beiträge von IPrototypeI

    Tabelle klausuren:
    Bekommt klausur_id (int) fach_id(int) beschreibung (text oder varchar)


    Das Datum denk ich wäre hier noch ziemlich wichtig da er diese ja ordnen möchte und um ein überblick zu bekommen , welche Arbeiten ja noch anstehen.


    /edit als kleine Hilfestellung beim auslesen falls du das format ändern möchtest gibt es den befehl DATE_FORMAT ( DATE_FORMAT(`Datum`, ' %d.%m.%Y') ) da das Format von MySQL für das Datum so aussieht 2013-09-21 16:37:35 (YYYY-MM-DD HH:MM:SS) und so wird das ganze auch ausgelesen es sei den man formatiert es über den bereits geschriebenen Befehl.


    Bei so kleinen Tabellen sind nach meiner Ansicht nach die Beziehungen scheiß egal da braucht man kein Entity-Relationship Diagram, aber das kann er ja entscheiden.


    Kleine Ergänzung zu Dark.Shadows post
    Ein kleiner Tipp um nur 10 Datensätze auszulesen, dazu gibt es den Befehl LIMIT hier LIMIT 10 um nur 10 Datensätze auszulesen


    Bsp:

    SQL
    SELECT * FROM `table` WHERE `date` > NOW()  ORDER BY `date` DESC LIMIT 10;


    Kannst du mal den Code posten wo das ganze laden lässt.
    mal abgesehen davon wenn du nicht mehreree indexe benötigst bei einem 2 dimensionalen array dann lass das ganze doch als 1 dimensionales array.



    enum Stuff
    {
    AutomaticUserSavetimer
    }


    new ServerStuff[Stuff];


    den wert speicherst du auch als integer ?

    Da gibt es mehrere Lösungsansätze:


    1. Du koppelst dies mit deiner Ingame-Uhr falls du sowas hast das ist ein Timer der sich immer wieder wiederholt.
    2. Du baust sowas in einen Timer ein den du bereits hast, welcher sich alle 1 bis maximal 10 Minuten wiederholt ein in dem du jeweils die Zeit mit Gettime ermittelst und den ersten Rückgabe wert vergleichst.
    http://wiki.sa-mp.com/wiki/Gettime
    3. Du holst dir das Plugin von Y_Less Timerfix http://forum.sa-mp.com/showthread.php?t=375925
    und berechnest die Zeit bis 19 Uhr unter OnGameModeInit und erstellst ein Timer, als auch wenn diese Zeit abgelaufen ist.
    Da es bei SetTimerEx und SetTimer bei größeren Zeiten eine extrem große Delay gibt.

    Also dass ich an einer Map mal nichts wesentliches finde, dass ich kritisieren kann passiert nicht wirklich oft. Der allererste Burgershot der mir wirklich gefällt.
    Die Textur ist halt Geschmackssache, mir pesönlich gefällt es da es ja "futuristisch" sein soll ;)


    Danke für die Bewertung ich werde wahrscheinlich demnächst paar Previews vorstellen von zwei/drei neuen Maps

    IPrototypeI:
    Hinzugefügt, einfach neu Herunterladen nicht vergessen das dies von mooman Herausgefunden wurde und alle Credits an ihn gehen ;)


    Danke für das Addon ich selbst hab mir mal eine Funktion dazu geschrieben nur speziell auf die Umlaute.


    wolltest du nicht die Funktionen deines Betterformat`s Plugin hinzufügen ?

    Ich muss sagen es sind schon enige sehr nützliche Funktionen dabei womit man so einiges zaubern kann.
    Wirklich gute Arbeit ein kleiner Verbesserungsvorschlag in deine Funktion
    TextDrawSetStringForPlayer(playerid, Text:Text, text[]);
    Köntest du ja den Bug mit Codierung noch zusätzlich fixen im Zusammenhang mit den Fonts.

    Das Streamerplugin ist von den Objektstreamern der beste Streamer den es gibt.


    Du kannst maximal für den Spieler 1000 Objecte einstreamen lassen dazu musst du das Limit welches sich auf 500 befindet erhöhen.
    mit der funktion
    Streamer_VisibleItems(STREAMER_TYPE_OBJECT, X );


    X steht für eine unbekannte Zahl, die du hier frei wählen kannst zwischen 0 - 1000 und die Anzahl der eingestreamten Objekte an dem Punkt somit beschränkt.


    Wenn man nun über dieses Limit hinaus möchte kann man nur noch mit der streamdinstanz arbeiten , welche man zusätzlich angeben kann bei CreateDynamicObject hier ist die streamdistanz schon auf 200 vordefiniert.


    Das liegt daran das die Zeile zu lang ist an der Stelle


    if(strlen(inputtext)<6)
    return ShowPlayerDialog(playerid,DIALOG_REGISTRATION,DIALOG_STYLE_INPUT,"Registration's Schritt {0000FF}1{FFFFFF}/{FF0000}3","Herzlich willkommen auf Titan {FFFF00}RolePlay\n{FFFFFF}Es wurde kein Account mit diesem Namen in der Datenbank gefunden.\nDamit du aber bei uns Spielen kannst musst du ein Account erstellen.\nDies ist einfach, Folge einfach denn Anweisungen!\nGebe bitte ein Gewünschtes Passwort ein!\n{FF0000}WICHTIG: Maximal 6-16 Zeichen!\n\nMfG. das Admin Team!",">>>","Beenden"); //191

    if(dialogid==DIALOG_REGISTRATION){ if(response==0)return Kick(playerid); if(response==1){ new query[512],passwort[16]; //<--- Die Warn Zeile if(strlen(inputtext)>=6){ /* mysql_escape_string(inputtext,passwort,dbhandle); format(query,sizeof(query),"INSERT INTO user (username,password) VALUES ('%s','%s')",SpielerName(playerid),passwort); mysql_function_query(dbhandle,query,false,"",""); SetPlayerMoney(playerid,500); SpielerInfo[playerid][sEingeloggt]=1; */ mysql_format(dbhandle,query,300,"INSERT INTO `user` (username,password) VALUES ('%e','%e');",SpielerName(playerid),inputtext); mysql_tquery(dbhandle,query,false,"",""); //<--- Die Erro Zeile SpielerInfo[playerid][sID] = cache_insert_id(); }else{ ShowPlayerDialog(playerid,DIALOG_REGISTRATION,DIALOG_STYLE_INPUT,"{FFFFFF}Registration's Schritt {0000FF}1{FFFFFF}/{FF0000}3","{FFFFFF}Herzlich willkommen auf Titan {FFFF00}RolePlay\n{FFFFFF}Es wurde kein Account mit diesem Namen in der Datenbank gefunden.\nDamit du aber bei uns Spielen kannst musst du ein Account erstellen.\nDies ist einfach, Folge einfach denn Anweisungen!\nGebe bitte ein Gewünschtes Passwort ein!\n{FF0000}WICHTIG: Maximal 6-16 Zeichen!\n\nMfG. das Admin Team!",">>>","Beenden"); } } return 1; }

    Ich sollte mich eigentlich selbst dafür schlagen



    if(dialogid==DIALOG_REGISTRATION){
    if(!response)return Kick(playerid);
    if(response){
    new query[512]; //<--- Die Warn Zeile
    if(strlen(inputtext)<6)return ShowPlayerDialog(playerid,DIALOG_REGISTRATION,DIALOG_STYLE_INPUT,"{FFFFFF}Registration's Schritt {0000FF}1{FFFFFF}/{FF0000}3","{FFFFFF}Herzlich willkommen auf Titan {FFFF00}RolePlay\n{FFFFFF}Es wurde kein Account mit diesem Namen in der Datenbank gefunden.\nDamit du aber bei uns Spielen kannst musst du ein Account erstellen.\nDies ist einfach, Folge einfach denn Anweisungen!\nGebe bitte ein Gewünschtes Passwort ein!\n{FF0000}WICHTIG: Maximal 6-16 Zeichen!\n\nMfG. das Admin Team!",">>>","Beenden");
    mysql_format(dbhandle,query,300,"INSERT INTO `user` (username,password) VALUES ('%e','%e');",SpielerName(playerid),inputtext);
    mysql_tquery(dbhandle,query,"",""); //<--- Die Erro Zeile
    SpielerInfo[playerid][sID] = cache_insert_id();
    SetPlayerMoney(playerid,500);
    SpielerInfo[playerid][sEingeloggt]=1;
    }
    return 1;
    }

    Aber so geht es auch nicht. :(

    Jo da hast du Recht das war nur die Halbemiete schau dir mal dein Update Query an


    format(query,sizeof(query),"UPDATE user SET level='%i',bargeld='%d',adminrang='%i' WHERE id='%i'",SpielerInfo[playerid][sLevel],GetPlayerMoney(playerid),SpielerInfo[playerid][sAdminrang],SpielerInfo[playerid][sID]);
    Wurde dem Spieler eine eindeutige ID zugewiesen ? Nein wurde sie nicht daher solltest du dir diese nochmal ausgeben lassen via
    cache_insert_id() oder du geht hier über den Namen des Spielers.



    mysql_format(query,300,dbhandle,"INSERT INTO `user` (username,password) VALUES ('%e','%e');",SpielerName(playerid),inputtext);
    mysql_tquery(dbhandle,query,false,"","");
    SpielerInfo[playerid][sID] = cache_insert_id();


    //Edit es ist besser
    mysql_tquery zu verwenden da du hier threaded querys nutzt, dies hast du bei mysql_query oder mysql_query_function nicht

    @

    IPrototypeI
    :


    Ich verstehe jetzt gar nicht's mehr. :D


    MfG.


    Okay nochmal Step by Step:


    OnUserSave(playerid){
    if(SpielerInfo[playerid][sEingeloggt]==0)return 1;
    new query[512];
    format(query,sizeof(query),"UPDATE user SET level='%i',bargeld='%d',adminrang='%i' WHERE id='%i'",SpielerInfo[playerid][sLevel],GetPlayerMoney(playerid),SpielerInfo[playerid][sAdminrang],SpielerInfo[playerid][sID]);
    mysql_function_query(dbhandle,query,false,"","");
    return 1;
    }


    kann nur richtig ausgeführt werden(Die Werte speichern) wenn SpielerInfo[playerid][sEingeloggt] den wert 1 besitzt.



    Nun stellt sich die Frage wo setzt du diesen Wert überall auf 1 ?


    1. Wenn der Spieler sich einloggt mit dem richtigen Passwort


    public OnUserPasswortCheck(playerid){
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows==1){
    SpielerInfo[playerid][sEingeloggt]=1;
    SpielerInfo[playerid][sLevel]=cache_get_field_content_int(0,"level",dbhandle);
    SetPlayerScore(playerid,SpielerInfo[playerid][sLevel]);
    SpielerInfo[playerid][sID]=cache_get_field_content_int(0,"id",dbhandle);
    SetPlayerMoney(playerid,cache_get_field_content_int(0,"bargeld",dbhandle));
    SpielerInfo[playerid][sAdminrang]=cache_get_field_content_int(0,"adminrang",dbhandle);
    }else{
    ShowPlayerDialog(playerid,DIALOG_EINLOGGEN,DIALOG_STYLE_PASSWORD,"Ü{FFFFFF}Einloggen Fortschritt {0000FF}1{FFFFFF}/{FF0000}2","{FFFFFF}Herlich willkommen auf Titan {FFFF00}RolePlay\n{FFFFFF}Es wurde ein Account mit diesm Namen in der Datenbank gefunden.\nDamit du weiet Spielen kannst musst du dich Einloggen.\nUm dich Einzuloggen gebe dein Passwort ein was du bei der Registration Eingetragen hast!\n\nMfG. das Titan RolePlay Admin Team!","Spielen","Beenden");
    }
    return 1;
    }


    2. ? Du setzt sonst nirgendwo anders den Wert. Jedoch rufst du den Dialog " DIALOG_REGISTRATION", wenn der Account des Spielers nicht existiert
    Nun gut der Spieler gibt nun ein Passwort ein und registriert sich. Es wird ein Eintrag in die Tabelle user eingetragen. Danach kann der Spieler mit 500 Dollar
    an dem Punkt 1958.3783, 1343.1572, 15.3746 mit einem CJ Skin spawnen, wenn er auf den Spawnbutton klickt.



    Wir halten nochmal zusammen der Spieler verlässt den Server die Funktion OnUserSave wird aufgerufen da SpielerInfo[playerid][sEingeloggt] nicht den Wert 1 hat wird nix gespeichert, da die Funktion direkt durch die if abfrage und dem return 1 abgebrochen wird.


    Noch ein Tipp um die ganzen Spielerwerte zu reseten für einen Spieler kannst du eine for-schleife nutzen
    for(new i; i != _:SpielerDatei; ++i) SpielerInfo[playerid][SpielerDatei:i] = 0;


    Dein Problem ist es das du es jemanden SpielerInfo[playerid][sEingeloggt] setzt der sich einloggt mit seinem passwort , jedoch nicht wenn er sich registriert, wie jedoch
    dein Adminlevel darüber gespeichert wird ist mir ein Rätsel direkt nach dem registrieren.

    Der Tag für eine Float ist in pawn anders geschrieben und zwar groß daher


    new float:


    zu

    new Float:


    zu dem benötigst du die Tags nicht in den Funktionen da diese schon als Datentyp Float deklariert wurde.



    Dennoch ist dazu zu sagen das es auch gehen würde wenn du float: als tag lassen würdest, dennoch wird der tag Float: bei der Funktion gewünscht.


    //edit


    Kleiner Tipp: du musst nicht jeweils die Floats die du benutzen willst einzelnt deklarieren, daher kannst du das als Array zusammenfassen.

    new Float:SV[3];
    GetPlayerPos(playerid,SV[0],SV[1],SV[2]);