Beiträge von Kaliber

    Schreib den Befehl doch einfach so, dann musst du nichts einrücken (daher kommt der Warning):


    ocmd:gmx(playerid)
    {
    if (!(PlayerInfo[playerid][pAdmin] == 7 || PlayerInfo[playerid][pAdmin] == 8)) return SendClientMessage(playerid,-1,"Sie besitzen nicht die notwendigen Rechte dafür!");
    SaveStuff(),Fight_Close(),SaveWars();
    TextDrawShowForAll(GMXCOME);
    TextDrawShowForAll(GMXCOME1);
    return SetTimer("GMXCOME5",10000,0),1;
    }

    Du kannst auch einfach eine kleine .sql Datei anlegen wo das gut geht.


    Hier mal ein Beispiel:


    //Oben im Skript:
    new DB:handle;


    //Dann unter OnGameModeInit
    handle = db_open("Admins.db");
    db_query(handle,"CREATE TABLE IF NOT EXISTS `Admins` (`Name`,`Rang`)");


    //Dann beim makeadmin:
    new string[128];
    GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID = Der Typ der Admin werden soll
    format(string,128,"INSERT INTO `Admins` (`Name`,`Rang`) VALUES ('%s','%d')",string,rang); //Hier rang von dem der Admin werden soll
    db_query(handle, string);


    //Wenn er schon ein Adminlevel hat und du das z.B. erhöhst musst du es updaten:
    new string[128];
    GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID = Der Typ der ein höheres Adminlevel bekommt
    format(string,128,"UPDATE `Admins` SET `Rang`='%d' WHERE `Name`='%s'",rang,string); //Hier rang von dem der Admin werden soll
    db_query(handle, string);


    //Wenn Adminlevel = 0 bzw wenn man den Adminposten verliert:
    new string[128];
    GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID der Typ der Adminrang 0 bekommt
    format(string,128,"DELETE FROM `Admins` WHERE `Name`='%s'",string);
    db_query(handle, string);


    //Und hier dann auflisten alle admins:
    ocmd:admins(playerid)
    {
    new DBResult:result,string[512] = "{FFFFFF}",l;
    result = db_query(handle,"SELECT * FROM `Admins`"),l=db_num_rows(result);
    if(!l) return SendClientMessage(playerid,-1,"* Es wurden noch keine Admins eingetragen!"),db_free(result);
    for(new i,rang[11],name[MAX_PLAYER_NAME]; i<l; i++) {
    db_get_field(result,0,name,MAX_PLAYER_NAME);
    db_get_field(result,1,rang,MAX_PLAYER_NAME);
    format(string,512,"%sName: %s (Rang: %d) - %s{FFFFFF}",string,name,strval(rang),CheckOnline(name));
    db_next_row(result);
    }
    db_free(result);
    ShowPlayerDialog(playerid,999,DIALOG_STYLE_MSGBOX,"Admin Liste",string,"Bestätigen","");
    return 1;
    }


    stock CheckOnline(const n[])
    {
    new name[MAX_PLAYER_NAME];
    static const online[] = "{00FF00}Online",offline[] = "{FF0000}Offline";
    for(new i=GetPlayerPoolSize(); i!=-1; i--) if(GetPlayerName(i,name,MAX_PLAYER_NAME) && !strcmp(name,n)) return Online;
    return offline;
    }


    mfg. :thumbup:


    //Edit: Update Query

    Du solltest Fehler bzw Warnings einbauen, wo es mehrere Möglichkeiten gibt diese zu lösen und dann schauen, wie effizient man diese dann auch gelöst hast :)


    Ich meine...wenn man z.B. sowas hat:


    for(new i; i<GetMaxPlayers(); O++)
    {
    SendClientMessage(i,-1,"Opfer");
    }


    Dann wird da ein Fehler kommen und zwar ist ja O nicht deklariert.


    Wenn man es jetzt so macht:


    new i;
    SendClientMessage(i,-1,"Opfer");


    Dann ist ja kein Fehler mehr da...aber das ist nicht das...was wirklich gefordert war und auch wenn man es so löst:


    for(new i; i<GetMaxPlayers(); i++)
    {
    SendClientMessage(i,-1,"Opfer");
    }


    Ist es nicht sehr effizient.


    Es gibt jetzt hier mehrere Möglichkeiten das gut zu lösen, wenn man unbedingt diese Funktion nutzen will und es am effizientesten machen will und mal die Reihenfolge außer acht lässt, da sie hier trivial ist:


    for(new i=GetMaxPlayers(); i!=-1; i--)
    {
    SendClientMessage(i,-1,"Opfer");
    }


    Das wäre hier definitiv die beste Lösung.


    Alternativen wären auch noch folgende, die aber langsamer sind, da man immer auf eine Variable zugreifen muss:


    for(new i,l=GetMaxPlayers()+1; i<l; i++)


    Wichtig ist hier das +1...wenn man das z.B. vergessen hätte...würde man den letzten index nicht beachten und hätte somit ja einen Fehler.


    Da kann man einige anspruchsvolle Aufgaben stellen, die nicht so pille palle sind wie mal eben kurz paar Errors fixxen ^^


    mfg. :thumbup:

    Auch das kann man gut verwalten in dem man sich ein Controller schreibt und die hocking methode mit state nutzt


    Das ist egal.


    Ich rede von der Ausführungszeit wenn es große Funktionen sind.


    Dann wirst du es nie schaffen, ohne Zeitversetzung die Funktionen (bzw Callbacks) aufzurufen...und das Problem ist einfach je mehr du das machst desto später werden sie logischerweise aufgerufen...


    Bei 30x...und jeder Callback muss 20ms verarbeitet werden hast du schon beim letzten mehr als 600ms delay... :S

    wie kann ich das Object dann Bewegen ?
    oder wieder Unattachten ? aber halt an dieser Stelle lassen ?


    Nun...gar nicht attachen.


    Erstelle das Objekte und dann musst du in dein MoveObject die Position vom Auto + Geschwindigkeit halt berücksichtigen...damit sich das immer updatet :D


    Also...das ist alles andere als einfach, das gut hinzubekommen :D


    Aber versuchs mal so (ungtestet aus dem Kopf geschrieben):


    new obj;
    ocmd:test(playerid)
    {
    new Float:x,Float:y,Float:z,v=GetPlayerVehicleID(playerid);
    GetVehiclePos(v,x,y,z);
    obj = CreateObject(1430,x,y,z+0.75,0,0,0);
    MoveObject(obj,x,x-0.225,y-0.5,z+0.75,10.0,-121.499946);
    }


    und dann theoretisch unter OnObjectMoved...prüfen ob sich das auto bewegt und dann permanent die Achsen anpassen :D


    Aber...das ist ziemlich bescheuert..und kompliziert..denk dir lieber was anderes aus ^^