Beiträge von Jeffry

    @Tony_Jaa:
    public OnPlayerSpawn(playerid)
    {
    new file[128], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(file, sizeof(file), "\\SavePos\\%s.ini", pname);
    if(pFirstLog[playerid] == true || !fexist(file))
    {
    SetPlayerPos(playerid,1731.6210,-1912.0577,13.5625);
    pFirstLog[playerid] == false;
    }
    else
    {
    new Float:x, Float:y, Float:z;
    x = dini_Float(file, "posX");
    y = dini_Float(file, "posY");
    z = dini_Float(file, "posZ");
    SetPlayerPos(playerid, x, y, z);
    }
    return 1;
    }


    Somit wäre das Problem behoben.

    1.) Du hast LoadPlayer und SavePlayer vertauscht.


    2.)
    sInfo[playerid][pLevel]=dini_IntSet(Datei,"Level");
    Das gibt keinen Sinn, es sollte "Get" sein, und es gehört zu LoadPlayer (siehe 1.)).


    3.) Der Rest passt, also GiveMoney.



    PS: Mut zum Versuch. Du kannst nichts kaputt machen, das schlimmste was passieren kann ist, dass du STRG+Z benutzen musst, weil der Compiler dich mit Errors zumüllt.^^
    PS2: Kluge Entscheidung enum's zu nehmen, die sind schneller und Ressourcensparender.

    Dort wo die Registration abgeschlossen wird und das Konto erstellt wird. Ich kann nicht sehen wie das in deinem Code ist, eben dort wo sowas in der Art steht:

    Zitat

    Du hast dein Account (NAME) erfolgreich mit dem Passwort 1234 erstellt. Wilkommen!

    Also, folgendes:


    Dort wo sich der Spieler / die Spielerin registriert:
    pFirstLog[playerid] = true;


    OnPlayerConnect:
    pFirstLog[playerid] = false;


    OnPlayerSpawn:
    public OnPlayerSpawn(playerid)
    {
    if(pFirstLog[playerid] == true)
    {
    SetPlayerPos(playerid,1731.6210,-1912.0577,13.5625);
    pFirstLog[playerid] == false;
    }
    else
    {
    new file[128], pname[MAX_PLAYER_NAME];
    new Float:x, Float:y, Float:z;
    GetPlayerName(playerid, pname, sizeof(pname));
    format(file, sizeof(file), "\\SavePos\\%s.ini", pname);
    x = dini_Float(file, "posX");
    y = dini_Float(file, "posY");
    z = dini_Float(file, "posZ");
    SetPlayerPos(playerid, x, y, z);
    }
    return 1;
    }

    Ich war so frei und hab es einfach an deinem ursprünglichen Command gemacht:


    if(!strcmp("/adminprison", cmd, true))
    {
    if(!IstSpielerAdmin(playerid, 1)) return SendClientMessage(playerid,COLOR_RED,"Zugriff verweigert! Du benötigst mindestens den Adminrang: {00A500}Supporter ");
    new len; //Hier
    tmp = strtok(cmdtext,idx); len = strlen(tmp); //Hier
    if(!tmp[0]) return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Benutze: /adminprison [ID] [Zeit]");
    new id = strval(tmp);
    if(!IsPlayerConnected(id)) return SendClientMessage(playerid,COLOR_RED,"~> Spieler nicht gefunden.");
    tmp = strtok(cmdtext,idx); len += strlen(tmp)+1; //Hier
    new zeit = strval(tmp);
    if(zeit < 0 || zeit > 300) return SendClientMessage(playerid,COLOR_WHITE," Zeit nur zwischen 0 und 300 Minuten!");
    //gMessage = strrest(cmdtext,idx); //WAS DAS?!
    sSpieler[id][Adminprison] = zeit; //Hier das was Gesetzt werden soll (Funktioniert nicht!)
    SetPlayerPos(id,1218.4226,2552.8484,10.8203);
    SetTimerEx("ajailtimer", 10, 1, "i", id); //Den Timer evtl überarbeiten
    //SetTimer("ajailtimer", 10, 0);
    new admin[MAX_PLAYER_NAME+1], string[120+MAX_PLAYER_NAME+1];
    GetPlayerName(playerid, admin, sizeof(admin));
    new adminprisontime = sSpieler[playerid][Adminprison];
    if(!cmdtext[13+len]) format(string, sizeof(string), "*Du wurdest von %s für %d Minuten ins Adminprison teleportiert, Grund: (Kein Grund) ", admin,adminprisontime); //Hier
    else format(string, sizeof(string), "*Du wurdest von %s für %d Minuten ins Adminprison teleportiert, Grund: (%s) ", admin,adminprisontime, cmdtext[13+len]); //Und hier
    SendClientMessage(id, COLOR_RED, string);
    SendClientMessage(playerid,COLOR_GREEN,"~> Spieler wurde ins Adminprison teleportiert!");
    return 1;
    }


    Geänderte Zeilen wurden markiert. Wenn ich richtig gezählt habe, sollte es tun.
    Somit hätten wir (mal wieder^^) vollständig auf sscanf verzichtet.

    stock GetWeaponIDFromName(WeaponName[])
    {
    for(new i = 0; i <= 46; i++)
    {
    switch(i)
    {
    case 0,19,20,21: continue;
    default:
    {
    if(strfind(GetWeaponNameById(i),WeaponName,true) != -1) return i;
    }
    }
    }
    return -1;
    }
    GetWeaponNameById


    Das würde das Ganze vervollständigen, somit haben wir einen Zwei-Wege-Abfragemöglichkeit.

    Kann es sein das bei deinem Code Doppeltab ist?


    Nein, das ist ein Tabsprung. Das Forum zeigt nur einen Tabsprung größer an als 4x Leerzeichen, in pawno ist das gleich. Ich arbeite eigentlich am PC immer mit TAB.
    Einfach mal den Code markieren, dann siehst du, dass es nur ein TAB ist.

    Edit: Jeffry: habe das extra mit nem Stock gemacht da die Neulinge besser damit anfangen als gleich das unübersichtliche mit den news :)
    Dazu wusste ich nicht das es sowas gab sehe oben :D


    Passt schon. Ich hab in meinem Code das auch mit einem stock drinne, finde ich persönlich besser, auch wenn es etwas langsamer ist.
    Für Anfänger ist es sicher besser mit einem stock zu arbeiten, es passieren dabei weniger ausschlaggebende Fehler, wenn man mal einen macht.
    Außerdem fand ich es gut, dass du den stock gepostet hast, hilfreich speziell auch für die, die die Waffennamen übersetzen wollen.


    ---------------------------------------------


    NiceMoney Funtkion:
    stock NiceMoney(money) //©Jeffry
    {
    new bmess[15];
    format(bmess, 15, "%d", money);
    if(money > 0)
    {
    for(new l=strlen(bmess)-3; l>0; l-=3)
    {
    if(l>0)
    {
    strins(bmess, ".", l);
    }
    }
    }
    else
    {
    for(new z=strlen(bmess)-3; z>1; z-=3)
    {
    if(z>1)
    {
    strins(bmess, ".", z);
    }
    }
    }
    return bmess;
    }


    Konvertiert 100000 zu 100.000, und gibt einen string zurück.


    Verwendung:
    printf("Mein Geld: %s€", NiceMoney(GetPlayerMoney(playerid)));

    new id, name[32], Float:x, Float:y, Float:z, Float:a, interior;
    new string[256];
    format(string, sizeof(string), "0|Keiner|1750|-1161|24|226|1023|1084|7|100|1|1|0|1|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0");
    printf(string);


    strins(string, "|", strlen(string));
    new oldi=0;
    new count=0;
    for(new i=0; i<strlen(string); i++)
    {
    if(string[i]=='|')
    {
    count++;
    new tmpstring[sizeof(string)]; tmpstring=string;
    strdel(tmpstring, i, strlen(tmpstring));
    strdel(tmpstring, 0, oldi+1);
    switch(count)
    {
    case 1: id = strval(tmpstring);
    case 2: format(name, sizeof(name), "%s", tmpstring);
    case 3: x = floatstr(tmpstring);
    case 4: y = floatstr(tmpstring);
    case 5: z = floatstr(tmpstring);
    case 6: a = floatstr(tmpstring);
    case 7: interior = strval(tmpstring);
    //usw...
    }
    oldi=i;
    }
    }
    printf("id: %d name: %s Pos: %f/%f/%f/%f Int: %d", id, name, x,y,z,a,interior);


    Also so mache ich es mit meinen Abfragen aus Dateien. Ich verzichte bewusst auf MySQL und sscanf.
    string würde bei dir eben das result der MySQL Rückgabe sein.


    Die Schleife musst du eben noch einbauen, und die Variablen mit den richtigen ersetzen, ich hab das nur so gemacht um es zu testen.
    Ich hoffe das hilft dir. Es tut auf jeden Fall:
    [12/08/2013 15:16:16] 0|Keiner|1750|-1161|24|226|1023|1084|7|100|1|1|0|1|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0
    [12/08/2013 15:16:16] id: 0 name: Keiner Pos: 1750.000000/-1161.000000/24.000000/226.000000 Int: 1023

    Hmm, ich seh grade:
    Haus[hausid][ID],
    Haus[hausid][Owner],
    Haus[hausid][ax],
    usw...


    Deine Schleifen-Variable ist aber hausid2. Ändere doch mal in der Schleife die "hausid" zu "hausid2".
    Wenn das auch nichts ändert, weiß ich nicht weiter. Man könnte den string manuell splitten, anstatt sscanf zu verwenden. Wenn du willst, kann ich dir das kurz machen.

    Deine Positionen sind in deiner Datenbank als INTEGER gespeichert. (1750|-1161|24) <= Integer Werte, da ist kein Komma vorhanden.
    Lässt du es möglicherweise falsch speichern?


    Daher kannst du es höchstens so versuchen:
    sscanf(resultline,"p<|>ds[32]ddddddddddddddddddddddddddd",
    Ob das tut kann ich dir nicht sagen, wäre nur eine Vermutung.

    Wie kann ich 2 Animationen nacheinander abspielen lassen?
    Also, dass eine Animation erst dann beginnt, wenn die andere zu Ende ist.


    Mit einem Timer.


    Beim Start der ersten Animation:
    SetTimerEx("ZweiteAnim", 2500, 0, "d", playerid); //2500 entspricht 2,5 Sekunden, musst du eben ausprobieren, wie lange die erste Animation braucht.


    Unten im Code:
    forward ZweiteAnim(playerid);
    public ZweiteAnim(playerid)
    {
    //Hier die zweite Animation.
    return 1;
    }