Beiträge von d0ma

    Ja damit geht es
    Da ich vorher das ganze mit sscanf gemacht habe, aber nach ner Zeit den überblick verloren hatte, hatte ich die Funktion noch verwendet :D
    Naja jetzt schmiert er mir nicht mehr ab falls mal ein Feld leer sein sollte^^


    so würde ich das machen, ohne dem new rows =.... for(...) zeug: (soweit ich es verstehe ohne das Plugin jemals benutzt zu haben)
    format(query, 500,"SELECT `DTuser`.`Name`,`DTuser`.`Team`,`DTuser`.`Rank`,`DTuser`.`Leader` FROM `DTKeys`, `DTuser` WHERE `DTKeys`.`userid` = `DTuser`.`userid` AND `DTKeys`.`Kennzeichen` = '%s';", VehicleData[vid][Kennzeichen]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    while(mysql_fetch_row_data(SQL))
    {
    mysql_fetch_field("Name",Titel,SQL);
    format(str, sizeof str, "• %s", Titel);
    mysql_fetch_field("Team",Titel,SQL);
    new TeamID = strval(Titel);
    format(str, sizeof str, "%s (Team: %s)",str, TeamName[TeamID]);
    mysql_fetch_field("Rank",Titel,SQL);
    format(str, sizeof str, "%s (Rank: %s)",str, TeamRank[TeamID][strval(Titel)]);
    mysql_fetch_field("Leader",Titel,SQL);
    if(strval(Titel) == 1)
    format(str, sizeof str, "%s (Leader)", str);
    SendClientMessage(playerid, cGreen, str);
    }
    mysql_free_result(SQL);


    ist
    mysql_fetch_row(Inhalt,"|",SQL);
    nicht die Funktion, die einfach die "row"/Zeile in "Inhalt" Speichert und die einzelnen Werte mit "|" trennt ?
    Unterhalb verwendest du aber wieder die direkte Methode mit mysql_fetch_field(...) und arbeitest garnicht mit "Inhalt" und "|"..


    Könnte mir vorstellen das der Code immer nur die erste Zeile verarbeitet, da mysql_fetch_field nicht auf die nächste Zeile geschaltet wird mit mysql_fetch_row(Inhalt,"|",SQL); da dies ja wie gesagt, die andere Methode ist ;)


    //Edit: native mysql_fetch_row_data(MySQL:handle = MySQL:0);
    sieht nach der richtigen Funktion aus

    das hat wenig mit sa-mp zu tun


    hier extra für dich, "Ein SA-MP tutorial"
    format(string, sizeof(string), "ABFRAGE HIER", einzelene werte hier);
    mysql_query(string);

    das ist der Code für SA-MP, der Rest ist nur noch: UPDATE Abfrage für MySQL aufbauen(wie oben gesagt, im Link erklärt)
    Und dafür muss man eben erstmal verstehen wie MySQL Abfragen überhaupt aufgebaut sind.

    Es ist stabieler und behält die Verbindung zur Datenbank, womit das plugin von Blue G ab und an probleme hat


    hab meinen SA-MP Server Prozess schon seit über 10 tagen offen, seitdem wurden bestimmt >20000 MySQL Abfragen gesendet und verarbeitet, also von Verbindungsproblemen kann man nicht sprechen. So gut wie alle großen Server nutzen das MySQL Plugin von dem du behauptest das es nicht gut funktioniert, würden es dann all die großen Server mit mehreren 100 Spielern nutzen ?


    Wenn du die neuste Version von BlueG mit threading + cache benutzt, dann ist auf alle fälle dieses Plugin die richtige und schnellste Wahl.


    ohne timer kann man auch zeit messen... sollte echt mal jemand ein Tutorial machen wie oft eigentlich sinnlos komplizierte Timer verwendet werden.


    Der code unterhalb erhöht CBUG[playerid] nur wenn innerhalb von 15 Sekunden erneut die tastenkombi für CBUG verwendet wird, ansonsten wird CBUG[playerid] wieder auf 0 gesetzt :D
    (code von BOMBER übernommen)
    new CBUG[MAX_PLAYERS], lastCBUG[MAX_PLAYERS];
    new CString[128];
    new name[MAX_PLAYER_NAME+1];
    GetPlayerName(playerid, name, sizeof(name));
    format(CString, sizeof(CString), "%s wurde vom Anti-Cbug System gekickt!", name);
    if ((newkeys & KEY_FIRE) && (oldkeys & KEY_CROUCH))
    {
    if(gettime() - lastCBUG[playerid] < 15 || CBUG[playerid] == 0)
    {
    CBUG[playerid]++;
    lastCBUG[playerid] = gettime();
    if(CBUG[playerid] == 3)return SendClientMessageToAll(0xffffff, CString), Kick(playerid);
    }
    else CBUG[playerid] = 0;
    }

    if(giveplayerid == playerid)
    {
    return SendClientMessage(playerid, COLOR_GREY,"Du kannst dich nicht selbst orten.");
    }
    //...............
    //hier wird erst giveplayerid gesetzt
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutzung: /orten [Spieler ID]");
    return 1;
    }
    giveplayerid = ReturnUser(tmp);


    du benutzt giveplayerid bevor es überhaupt gesetzt wurde

    Ist ein Video aus meinem Server...


    - alle Objekte in ein Array packen
    - mit einem timer alle paar sekunden ein objekt zufällig auswählen was abstürzen soll
    - das zufällig ausgewählte Objekt mit http://wiki.sa-mp.com/wiki/SetObjectRot wackeln lassen (so das die spieler merken das dies ein bald abstürzendes Objekt ist)
    - das objekt nach ein paar Wackler mit http://wiki.sa-mp.com/wiki/MoveObject nach unten bewegen



    natürlich noch eine Abfrage um zu überprüfen wenn ein spieler runterfällt ( GetPlayerPos )


    Viel Spaß beim nachbauen!


    new pID... // pID = 0 weil neu definiert
    GetPlayerName(pID,Oname,sizeof(Oname)); //pID ist immer noch 0, da noch kein anderer wert gesetzt wurde
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,Gelb,"Benutze:/showlic [id]"); //pID wird gesetzt
    verstanden ? Es wird immer der Name von ID 0 angezeigt

    einfach mit einem Timer ?
    DestroyMuellObjectForTime(i, seconds)
    {
    DestroyObject(muellobject[i]);
    muellobject[i] = INVALID_OBJECT_ID;
    SetTimerEx("RecreateMuellObject", seconds*1000, 0, "i", i);
    return 1;
    }


    forward RecreateMuellObject(i);
    public RecreateMuellObject(i)
    {
    muellobject[i] = CreateObject(Muell[i][ModelID], Muell[i][XPoss],Muell[i][YPoss],Muell[i][ZPoss]-0.25, 0.0, 0.0, 96.0, 100.0);
    return 1;
    }

    Ohne Timer bitte...



    UnmutePlayer(playerid, minuten)
    {
    DeletePVar(playerid, "muteTill");
    return 1;
    }


    MutePlayer(playerid, minuten)
    {
    SetPVarInt(playerid, "muteTill", gettime()+(minuten*60));
    return 1;
    }


    public OnPlayerText(playerid, text[])
    {
    if(GetPVarInt(playerid, "muteTill") > gettime())
    {
    new str[128];
    format(str,sizeof(str), "Fehler: Du hast Sprechverbot. %d Sekunden bis du wieder sprechen kannst!", GetPVarInt(playerid, "muteTill")-gettime());
    SendClientMessage(playerid, 0xFF0000FF, str);
    return 0;
    }
    //...
    return 1;
    }


    Dieser kleine Code ist ein vollständig funktionierendes Mute-System inklusive der Angabe wie lange man noch gemutet ist beim Versuch etwas zu schreiben.


    //Edit: UnmutePlayer(playerid) hinzugefügt

    bei /uninvite:
    variable[....] = gettime() + (60*60*24*5); // aktuelle zeit + 5 tage


    wie lange noch zu warten ist:
    if(variable[....] > gettime() )
    {
    new str[128];
    format(str,sizeof(str), "Du musst noch %d Sekunden warten!", variable[.....]-gettime());
    SendClientMessage(playerid, 0xFF0000FF, str);
    return 1;
    }


    für variable[....] musst du halt noch jeweils so schreiben das es beim Verlassen/Betreten des servers gespeichert/geladen wird ;)

    Das passt überhaupt nicht zusammen, mein code alleine ist ein KOMPLETTES zeitsystem
    du verbindest deine Methode mit meiner was überhaupt nicht zusammen gehört, entweder oder, aber nicht beides