Beiträge von [EGC] selEcT

    Es KÖNNTE gehen, allerdings wäre das recht umständlich und viel zu scripten denk ich mal.
    Aber in einer datenbank sollte man eh nichts löschen, wenn dann verändern, aber nicht löschen.
    Damit der User nicht mehr auf den Server kann, kannst du ja ein neues feld (z.B. bann) machen.

    Hach, endlich geht das Forum wieder einigermassen X( also


    Wie lange kann ein Array sein?


    Also ich möchte gerne


    new field[110][32];


    aber soweit kommt er nicht (getestet mit print("field"), wird aber nicht in der konsole angezeigt).


    aber wieso geht


    new field[4][32];


    ???


    das wäre blöde, wenns nicht gehen würde. Gibt auch nirgens ne wiki dazu.


    MFG

    //oben
    forward Waffen(playerid);
    new waffen[MAX_PLAYERS];


    if blabla /suchen //der befehl halt ;)
    if(waffen[playerid] == 0)
    {
    //dein suchen befehl
    waffen[playerid] = 1;
    SetTimerEx("Waffen",600000,0,"i",playerid); //weiss grad den SetTimerEx befehl nicht auswendig, glaub stimmt aber
    }


    //Set timer ex
    public Waffen(playerid)
    {
    waffen[playerid] = 0;
    }


    geht vielleicht so ^^

    Da ich grad sowieso Zeit hab, bin ich mal 20 Minuten mitm Turismo durch Sa geheizt und hab 19 Tankstellen gefunden.


    Allen habe ich einen Namen zugewisen. Dieser hängt entweder vom Standort ab oder ich ich den Namen genommen, den die Tankstelle auf einem RL Server hat.
    Bei einer Tankstelle ist mir der Name nicht mehr eingefallen.


    PS: Karte folgt in wenigen Minuten


    wow ^^ kann ich sicher auch gebrauchen, thx :D


    hast du zufällig noch mehr zeit und kannst auch die koordinaten der gelben pfeile (eingänge) suchen? xD

    Ich leibe es ja, wenn Leute ohne AHnung etwas schreiben.


    ich hoffe du meinst nicht mich..


    (Edit by DMA:// Nein, Realist. ;))


    Erstmal: Ja, Public Funktionen haben viel mehr interne Aufrufe von Operationen als eine herkömmliche Funktion.
    Publics sollten deswegen oft vermieden werden, und nur bei Timern und Callbacks verwendet werden.


    hab ich mir doch gedacht. ^^


    Nunja, man muss ein gutes Mittelmaß finden.
    Das ist je nach Server unterschiedlich.
    Zuviel in einem Timer ist schlecht, wenig und viele Aufrufe dagegen Schwachsinn.


    das heisst, 2 timer à 1 sekunde mit je ca. 20 zeilen könnte man als beispiel zusammennehmen?


    [quote='DMA',index.php?page=Thread&postID=381821#post381821Alle "CMD" vereinfachungen sind langsamer als ein Vergleich mit strcmp und einer beliebigen "String Part Get" Methode.
    Dafür ist DCMD z.B. übersichtlicher. ;)[/quote]


    dann lass ich das drin xD die kommentarfunktion macht es auch übersichtlich ;)


    sonst noch sachen für die scriptoptimierung? ausser kleinere strings (das weiss ich schon :D)

    Hallo Breadfish!


    Vorneweg, ich hab nichts darüber gefunden bei der Suche.


    Ich möchte hier einen Thread machen, bei dem alle reinschreiben können, was bei einer Scriptoptimierung vorgenommen werden kann. Dazu hab ich auch einige Fragen:


    - Kann man alle durch forwards definierte publics zu stocks machen? Und bringt das auch was?
    - was braucht mehr leistung? mehr timer zu einem Intervall oder ein timer zu einem intervall mit allem drin?
    - braucht dcmd weniger leistung?


    MFG

    jaa aber es ist ja bei den meisten unterschiedlich.. oder hats ein ähnliches plugin wie das von strickenkid?


    Ich hab jetzt das von Adrenaline genommen, alles im script ersetzt, allerdings macht dieses plugin kein log, oder gibt es ne möglichkeit? Weil das brauch ich eigentlich zum schauen, was ausgelesen wird, da mir bei diesem Plugin leider irgendwie überall 0 steht, obwohl das nicht so in der db steht?! Wie kommt das? ich hab das plugin, ich hab die lib, die include etc. davon..

    Hi


    Mein Linuxserver crasht, sobald ich aus mysql bei den channels lade. in der log steht am schluss:


    [Wed Jun 30 18:29:33 2010] Function: 'mysql_query' executed: "SELECT * FROM channels WHERE ID = 10 LIMIT 1" with result: "0".
    [Wed Jun 30 18:29:33 2010] Function: 'mysql_fetch_field:iAdmin' called with result: "".
    [Wed Jun 30 18:29:33 2010] Function: 'mysql_fetch_field:iMOTD' called with result: "".
    [Wed Jun 30 18:29:33 2010] Function: 'mysql_fetch_field:iPassword' called with result: "ä".
    [Wed Jun 30 18:29:33 2010] Function: 'mysql_fetch_field:iNeedPass' called with result: "".


    iAdmin und iMOTD stimmen, aber in der Datenbank ist iPassword leer und iNeedPass ist 0! Die anderen 9 Datensätze liest es aber ganz normal und richtig aus.


    Bei Windows funktioniert das auch richtig o_O


    Ich weiss net mehr weiter :S wieso funktioniert das unter Windows, aber nicht unter Linux? Wieso liest er beim letzten teil etwas falsches aus?


    Er verbindet sich auch ganz normal mit der Datenbank, fängt bei der Tabelle stuff an, geht die erfolgreich durch, geht bei channels weiter (LoadIRC()), genau wie es sein sollte. Nur eben dann kommt er beim letzten Datensatz zu diesem Problem und nachher stürzt der Server ab. Ist das Plugin für Linux und Windows gleich gedacht?


    MFG


    /edit: es kann doch nicht sein das das problem niemand hat?!

    Connecten:


    public OnPlayerConnect(playerid)
    {
    //Andere dinge
    new plname[32];
    GetPlayerName(playerid, plname, sizeof(plname));
    new sqlaccountstatus = MySQLCheckAccount(plname);
    if(sqlaccountstatus != 0)
    {
    PlayerInfo[playerid][pSQLID] = sqlaccountstatus;
    //Login
    }
    else
    {
    //Register
    }
    }



    Einloggen:


    stock MySQLLogin(playerid, password)
    {
    new string[128];new query[128];new data[256];new playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername, sizeof(playername));
    PlayerInfo[playerid][pSQLID] = MySQLCheckAccount(playername);
    format(query, sizeof(query), "SELECT * FROM user WHERE id = %d LIMIT 1", PlayerInfo[playerid][pSQLID]);
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_field("Password", data))
    {
    if(!strcmp(data,password,false))
    {
    mysql_fetch_field("ID",data);PlayerInfo[playerid][pSQLID] = strval(data);
    mysql_fetch_field("Playername",data);strmid(PlayerInfo[playerid][pName], data, 0, strlen(data), 255);
    mysql_fetch_field("Password",data);strmid(PlayerInfo[playerid][pPassword], data, 0, strlen(data), 255);
    //etc.
    }
    else
    {
    //Passwort Falsch
    }
    }
    mysql_free_result();
    return 1;
    }


    Registrieren:


    stock MySQLRegister(playerid, password[])
    {
    if(IsPlayerConnected(playerid))
    {
    new playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername, sizeof(playername));
    new newaccountsqlid = MySQLCreateAccount(playername, password);
    if (newaccountsqlid != 0)
    {
    PlayerInfo[playerid][pSQLID] = newaccountsqlid;
    PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
    GetPlayerName(playerid,PlayerInfo[playerid][pName],32);
    PlayerInfo[playerid][pSQLID] = MySQLCheckAccount(PlayerInfo[playerid][pName]);
    new query[MAX_STRING];
    format(query, MAX_STRING, "UPDATE user SET Playername='%s' WHERE ID=%d",PlayerInfo[playerid][pName],PlayerInfo[playerid][pSQLID]);mysql_query(query);
    //etc.
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Beim Erstellen deines Accounts ist ein Fehler aufgetreten.");
    Kick(playerid);
    return 0;
    }
    }
    return 0;
    }


    MySQLCheckAccount:


    stock MySQLCheckAccount(playersname[])
    {
    new query[128];
    new escstr[MAX_PLAYER_NAME];
    mysql_real_escape_string(playersname, escstr);
    format(query, sizeof(query), "SELECT id FROM user WHERE LOWER(Name) = LOWER('%s') LIMIT 1", escstr);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()==0)
    {
    return 0;
    }
    else
    {
    new strid[32];
    new intid;
    mysql_fetch_row(strid);
    intid = strval(strid);
    return intid;
    }
    }


    MySQLCreateAccount


    stock MySQLCreateAccount(newplayername[], newpassword[])
    {
    new query[128];
    new plname[64];
    new password[64];
    mysql_real_escape_string(newplayername, plname);
    mysql_real_escape_string(newpassword, password);
    format(query, sizeof(query), "INSERT INTO `user` (`Name`, `Password`) VALUES ('%s', '%s')", plname, password);
    mysql_query(query);
    new newplayerid = MySQLCheckAccount(newplayername);
    if (newplayerid != 0)
    {
    return newplayerid;
    }
    return 0;
    }


    Ich hoffe ich muss das net so erklären, doch wenn, dann einfach fragen ;) (HIER GEHTS NACH DER ID!! NICHT NACH DEM NAMEN!!)

    Najoa MySQL ist halt neuland für mich, und irgendwoher muss ich das ja lernen oder?


    Erstmal dickes Danke hat mir schonmal gut weitergeholfen!
    Ich hab jez ne Tabelle erstellt mit "ID" ,"Name","Passwort" & "Level"
    Wozu ist jez das "ID" mit dem automatischem erhöhen? Also ich verstehe ja das ich irgendwas brauch um später sagen zu können "Diese Tabellenzeile gehört diesem User"
    Dafür kann ich dann diese ID benutzen?


    Ja, kannst du. Das mit dem automatisch erhöhen passiert dann, wenn sich ein neuer benutzer registriert (zumindest bei mir ^^), er überprüft, wieviele datensätze die datenbank hat und nimmt dann die letzte ID Plus 1. Dort ist dann der neue Benutzer drin.


    Außerdem, ich habe die Tabelle wie bereits gesagt erstellt,wie leg ich da jez z.B nen User rein?


    puhh du meinst scripttechnisch? Das geht ein bisschen länger ^^ ich bin im moment nicht zu hause, also kann ich dir das net so gut erklären. Was du aber brauchst ist 4 Variablen für den User im Script:
    z.B.
    Player[playerid][pSQLID] --> Die ID des Datensatzes (für die eindeutigkeit ;) )
    Player[playerid][pName] --> Der Name im Datensatz
    Player[playerid][pPasswort] --> Das Passwort im Datensatz
    Player[playerid][pLevel] --> Das Level im Datensatz


    In diese Variablen kommen dann die Daten aus der Tabelle.


    Zuerst müssen diese aber gefüllt werden. Dafür müsste ich wissen, welches Plugin du verwendest. Ich verwende dieses (http://strickenkid.info/mysql_plugin/1.2.X/ ;)


    MFG