Beiträge von Jeffry

    Das Problem kommt hin und wieder bei dieses Systemen vor. Das kannst du ganz leicht mit einem Trick umgehen, und zwar machst du die erste Zeile in der Datei als Dummy, also einfach den Stat XYZ mit dem Wert ABC, dann macht es nichts, wenn da ein y davor steht. Das Passwort kommt in die zweite Zeile und bekommt somit kein y vorangestellt.

    Dann prüfe wie gesagt mal was in der Datei steht, und ob das passt. Denn dini_Get wird dir einen leeren String zurück geben, was zur Folge hat, dass alles akzeptiert wird, denn nichts ist ja in allem unendlich oft drin.

    Deine Abfrage passt nicht. True und false sagen in strcmp nur aus, ob die Groß bzw Kleinschreibung beachtet werden.


    Versuche es so:
    stock Login(playerid,key[])
    {
    new Spielerdatei[64];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);
    if(!strcmp(key,dini_Get(Spielerdatei,"Passwort")))
    {
    LoadAccount(playerid);
    SetPlayerPos(playerid,1755.5660,-1929.4365,13.5767);
    SetPlayerFacingAngle(playerid,270);
    }
    else
    {
    SendClientMessage(playerid,0xF50000FF,"Falsches Passwort");
    ShowPlayerDialog(playerid,logindialog,DIALOG_STYLE_INPUT,"Login","Gib dein Passwort ein!","Login","Tschüss");
    }
    }
    Wenn das nicht geht, schau mal ob das Passwort auch korrekt in der Datei steht.

    Kommt so etwas?
    if(strcmp(cmd, "/ao", true) == 0 || strcmp(cmd, "/ai", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if (PlayerInfo[playerid][pAdmin] >= 1)
    {
    GetPlayerName(playerid, sendername, sizeof(sendername));
    new length = strlen(cmdtext);
    while ((idx < length) && (cmdtext[idx] <= ' '))
    {
    idx++;
    }
    new offset = idx;
    new result[64];
    while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
    {
    result[idx - offset] = cmdtext[idx];
    idx++;
    }
    result[idx - offset] = EOS;
    if(!strlen(result))
    {
    SendClientMessage(playerid, COLOR_RED, "Benutze: (/a)dmin [admin chat]");
    return 1;
    }


    if(PlayerInfo[playerid][pAdmin] == 1 || PlayerInfo[playerid][pAdmin] == 2 || PlayerInfo[playerid][pAdmin] == 3)
    {
    format(string, sizeof(string),"Supporter %s: %s", sendername, result);
    }
    else if(PlayerInfo[playerid][pAdmin] == 4 || PlayerInfo[playerid][pAdmin] == 5)
    {
    format(string, sizeof(string),"Administrator %s: %s", sendername, result);
    }
    else if(PlayerInfo[playerid][pAdmin] == 1338)
    {
    format(string, sizeof(string), "Communityleiter %s: %s", sendername, result);
    }
    else if(PlayerInfo[playerid][pAdmin] == 2000)
    {
    format(string, sizeof(string), "Communitygründer %s: %s", sendername, result);
    }
    else
    {
    format(string, sizeof(string), "<Unbekannt> %s: %s", sendername, result);
    }
    if (PlayerInfo[playerid][pAdmin] >= 1)
    {
    SendAdminMessage(0xFF00A5FF, string);
    }
    printf("Admin (%d) %s: %s", PlayerInfo[playerid][pAdmin], sendername, result);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Du darfst diesen Befehl nicht benutzen !");
    }
    }
    return 1;
    }

    Falls <Unbekannt> kommt, dann hast du ein anderes pAdmin Level als du dort in den if-Abfragen angegeben hast.
    Was zeigt der Print im Server Log an?

    Also einmal erstellst du die Zone mit GangZoneCreate und einmal mit M_CreateZone, gibst aber keinen Wert an fInfo[id][ctf_zone] zurück.
    Das erscheint mir nicht ganz richtig.


    new string[64];
    if(fInfo[id][ctf_text] != Text3D:-1)
    {
    Delete3DTextLabel(fInfo[id][ctf_text]);
    }
    if (!strlen(fInfo[id][ctf_team]))
    {
    format(string, sizeof(string), "» %s «\nTEAM: None",fInfo[id][ctf_name]);
    fInfo[id][ctf_pickup] = CreateDynamicPickup(1314, 1, fInfo[id][ctf_x], fInfo[id][ctf_y], fInfo[id][ctf_z], -1);
    printf("M: %f / %f / %f / %f / %d", fInfo[id][Min_x], fInfo[id][Min_y], fInfo[id][Max_x], fInfo[id][Max_y], fInfo[id][ctf_color]);
    M_CreateZone(fInfo[id][Min_x], fInfo[id][Min_y], fInfo[id][Max_x], fInfo[id][Max_y], fInfo[id][ctf_color], string, COLOR_RED);
    printf("Zone: %d", fInfo[id][ctf_zone]);
    GangZoneShowForAll(fInfo[id][ctf_zone], fInfo[id][ctf_color]);
    }
    else
    {
    format(string, sizeof(string), "» %s «\nTEAM: %s",fInfo[id][ctf_name], fInfo[id][ctf_team]);
    fInfo[id][ctf_pickup] = CreateDynamicPickup(1314, 1, fInfo[id][ctf_x], fInfo[id][ctf_y], fInfo[id][ctf_z], -1);
    fInfo[id][ctf_text] = Create3DTextLabel(string, COLOR_RED, fInfo[id][ctf_x], fInfo[id][ctf_y], fInfo[id][ctf_z], 10, 0, 1);
    printf("G: %f / %f / %f / %f / %d", fInfo[id][Min_x], fInfo[id][Min_y], fInfo[id][Max_x], fInfo[id][Max_y]);
    fInfo[id][ctf_zone] = GangZoneCreate(fInfo[id][Min_x], fInfo[id][Min_y], fInfo[id][Max_x], fInfo[id][Max_y], fInfo[id][ctf_color]);
    printf("Zone: %d", fInfo[id][ctf_zone]);
    GangZoneShowForAll(fInfo[id][ctf_zone], fInfo[id][ctf_color]);
    }


    Schreibe es und poste dann was im Log steht.

    Das liegt daran, dass du den Pfad nicht formatiert hast, somit wird der Platzhalter nicht ersetzt und der Pfad stimmt nicht.
    Die Nachrichten bekommst du nicht, da alles was mit Kick/Ban(playerid) ausgeführt wird nicht mehr angezeigt wird. Nutze entweder die Kick/Ban-Fix Include oder mache es mit einem kurzen Timer wie im Code unten:


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    //Login/Register System
    if(response)// They pressed the first button.
    {
    switch(dialogid)// If you only have one dialog, then this isn't required, but it's neater for when you implement more dialogs.
    {
    case 1:// LOGIN FENSTER
    {
    if(strlen(inputtext) > 3)
    {
    new string[64];
    GetPlayerName(playerid,string,MAX_PLAYER_NAME);
    format(string,sizeof string,"/Accounts/%s.ini",string);
    if(!strcmp(inputtext, dini_Get(string, "Passwort")))
    {
    //Geld setzen
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, dini_Int(string, "Geld"));
    //Scroe setzen
    SetPlayerScore(playerid, dini_Int(string, "Level"));
    //Narchicht und spawn
    SetSpawnInfo(playerid, 0, 26, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_YELLOW, "Willkommen auf 'Empire Bay Reallife'");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Falsches Passwort");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort ist zu kurz!");
    }
    }
    case 2:// REGISTER FENSTER
    {
    if(strlen(inputtext) > 3)
    {
    new string[64];
    GetPlayerName(playerid, string, MAX_PLAYER_NAME);
    format(string, sizeof(string), "/Accounts/%s.ini", string);
    dini_Create(string);
    //Sachen eintragen: (Key=Value)
    dini_Set(string, "Passwort", inputtext);
    dini_IntSet(string, "Geld", 5000);
    dini_IntSet(string, "Level", 1);
    SendClientMessage(playerid, COLOR_GREEN, "Dein Account wurde erfolgreich eingerichtet.\nMache bitte einen relog!");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort muss mindestens 4 Zeichen lang sein!");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    }
    }
    }
    else
    {
    Kick(playerid);
    }
    return 1;
    }


    forward KickPlayer(playerid);
    public KickPlayer(playerid)
    {
    return Kick(playerid);
    }

    Wenn du das so über eine einzige Datei speicherst, ob ein Spieler registriert ist oder nicht, dann wirst du irgendwann (je nach dem wie viele Spieler sich registrieren), ziemlich schnell Probleme mit der Performance haben. Der LAdmin-Filterscript hatte (bzw. hat) seinerzeit, als er aktuell war, auch so etwas in der Art, nur mit IPs. Das führte bei vielen ziemlich schnell zu extremen Lags.


    Schreibe es daher so:
    public OnPlayerConnect(playerid)
    {
    new path[64];
    GetPlayerName(playerid, path, MAX_PLAYER_NAME);
    format(path, sizeof(path), "/Accounts/%s.ini", path);
    //Login/Register System
    if(dini_Exists(path))
    {
    //Account existiert
    }
    else
    {
    //Account existiert nicht
    ShowPlayerDialog(playerid, 0, 3, "Registration", "Bitte gebe ein Passwort für deinen Account ein.", "Weiter", "Abbrechen");
    }
    return 1;
    }

    Der Code von Kaliber wird so nicht kompilieren (lokale Variable heißt gleich wie das globale Array), außerdem sind die returns auch nicht grade toll, wenn danach noch Code folgt.


    So:
    new g_target[MAX_PLAYERS];
    public OnPlayerUpdate(playerid)
    {
    new l_target = GetPlayerTargetPlayer(playerid);
    if(l_target == INVALID_PLAYER_ID)
    {
    if(g_target[playerid]) g_target[playerid]=0;
    }
    else if(IsPlayerNPC(l_target))
    {
    if(!g_target[playerid]) g_target[playerid] = gettime()+10;
    else
    {
    if(gettime() >= g_target[playerid])
    {
    //Hier hat er 10Sekunden auf den Bot gezielt!
    g_target[playerid] = 0;
    //Hier dann die Nachricht aus deinem /robtanke.
    }
    }
    }
    return 1;
    }

    Ich habe dir das mal etwas ausgebessert. Vergleiche bitte meine Version mit deiner, damit du die Unterschiede erkennst und sie nächstes mal anwenden kannst.
    Achte vor allem auf die Einrückung deiner Codes.


    stock SpielerSpeichern(playerid)
    {
    new path[64], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);

    //Pfad 1
    format(path,sizeof(path),"/Spieler/%s.txt",pname);
    if(dini_Exists(path))
    {
    dini_IntSet(path,"AdminLevel", sSpieler[playerid][AdminLevel]);
    dini_IntSet(path,"Level", sSpieler[playerid][Level]);
    dini_IntSet(path,"Fraktion", sSpieler[playerid][Fraktion]);
    }

    //Pfad 2
    format(path,sizeof(path),"/Userdaten/%s.txt",pname);
    if(dini_Exists(path))
    {
    dini_Set(path,"RegTime", sLog[playerid][RegTime]);
    }
    return 1;
    }


    stock SpielerLaden(playerid)
    {
    new path[64], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);

    //Pfad 1
    format(path,sizeof(path),"/Spieler/%s.txt",pname);
    if(dini_Exists(path))
    {
    SetPlayerScore(playerid, dini_Int(path,"Level"));
    sSpieler[playerid][AdminLevel] = dini_Int(path,"AdminLevel");
    sSpieler[playerid][Level] = dini_Int(path,"Level");
    sSpieler[playerid][Fraktion] = dini_Int(path,"Fraktion");
    }

    //Pfad 2
    format(path,sizeof(path),"/Userdaten/%s.txt",pname);
    if(dini_Exists(path))
    {
    format(sLog[playerid][RegTime], 11, dini_Get(path,"RegTime"));
    }
    return 1;
    }


    stock SpielerReset(playerid)
    {
    sSpieler[playerid][AdminLevel] = 0;
    sSpieler[playerid][Level] = 0;
    sSpieler[playerid][Fraktion] = 0;
    return 1;
    }


    Anschließend kannst du Folgendes verwenden:
    ocmd:admintest(playerid)
    {
    if(isAdmin(playerid, 1)) SendClientMessage(playerid, COLOR_LIGHTRED, "Info: Du scheinst wohl Admin zu sein!");
    else SendClientMessage(playerid, COLOR_LIGHTRED, "Info: Du bist wohl kein Admin!");
    return 1;
    }


    stock isAdmin(playerid, a_level)
    {
    if(sSpieler[playerid][AdminLevel] >= a_level) return 1;
    return 0;
    }


    Natürlich setze ich voraus, dass du SpielerLaden und SpielerSpeichern auch im Code aufrufst (Connect / Disconnect).

    Das würde ich dir so nicht empfehlen, die einzelnen Daten zu nummerieren. Spätestens in einem Schaltjahr wirst du am 29.02. Probleme bekommen, da dieser Tag in deiner Nummerierung nicht vorhanden ist, oder, falls er vorhanden ist, dann hast du jedes Jahr an dem Dateum Probleme, da der Tag ja nicht existiert.
    Das Prüfen des Datums ist da viel einfacher und es passieren keine Fehler.


    In deinem SpielerInfo erstellst du zwei neue Variablen:
    onlineCount,
    lastOnline[11],


    Beim Login prüfst du:
    if(!strcmp(yesterday, SpielerInfo[playerid][lastOnline]))
    {
    SpielerInfo[playerid][onlineCount]++;
    }
    else if(strcmp(today, SpielerInfo[playerid][lastOnline]))
    {
    SpielerInfo[playerid][onlineCount]=1;
    }
    format(SpielerInfo[playerid][lastOnline], 11, today);


    Die Variablen yesterday und today bekommst du über den TimestampToDate.
    //TimestampToDate mit Timestamp gettime()-86400
    new yesterday[11];
    format(yesterday, sizeof(yesterday), "%02d.%02d.%d", day, month, year);
    //gleiches für today, nur mit Timestamp gettime().


    Somit kannst du mit SpielerInfo[playerid][onlineCount] immer abfragen, wie viele Tage hintereinander der Spieler online war.
    Gegebenenfalls machst du diese Prüfung auch beim SpielerSpeichern hin, denn es könnte ja sein, dass der Spieler 100 Stunden am Stück online ist, und das würde sich ja über mehrere Tage verteilen, in denen unter Umständen kein Login erfolgt, sondern nur eine Speicherung.

    Du fragst beim Login ab, ob das Datum an dem er sich zuletzt angemeldet hat das gestrige Datum war.
    Nutze dazu: http://forum.sa-mp.com/showthread.php?t=347605 (gettime()-86400).
    Wenn es das ist, zähle die Folge um eins hoch (Folge[playerid]++;).


    Falls nicht, fragst du ab ob das Datum an dem er sich zuletzt angemeldet hat das heutige Datum ist. Falls ja, passiert nichts.


    Falls es weder das heutige noch das gestrige Datum ist, dann setzt du die Folge auf 0/1 (je nach dem wo es anfangen soll).


    Danach speicherst du in einer Variable bzw. eben in die Datei/Datenbank das Login Datum (also das momentane Datum) ab, in Textform, sodass du es beim nächsten Login vergleichen kannst (strcmp).

    Versuche es so:
    Function OnPlayerCarUpdate(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    for(new x = 0; x < MaxVeh; x++)
    {
    if(Dtc_PlayerHaveCar[playerid][x])
    {
    GetVehicleHealth(PlayerCar[playerid][x][CarId], PlayerCar[playerid][x][Health]);
    DestroyVehicle(PlayerCar[playerid][x][CarId]);
    Dtc_Carlock[PlayerCar[playerid][x][CarId]] = 0;
    Dtc_LockCar(PlayerCar[playerid][x][CarId]);
    new string3[128];
    new playername3[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername3, sizeof(playername3));
    format(string3, sizeof(string3), "/Autos/%s%d.dtcar", playername3,x);
    new File: hFile = fopen(string3, io_write);
    if (hFile)
    {
    new var[32];
    format(var, 32, "CarId=%d\n",PlayerCar[playerid][x][CarId]);fwrite(hFile, var);
    format(var, 32, "CarModel=%d\n",PlayerCar[playerid][x][CarModel]);fwrite(hFile, var);
    format(var, 32, "CarPos_x=%.3f\n",PlayerCar[playerid][x][CarPos_x]);fwrite(hFile, var);
    format(var, 32, "CarPos_y=%.3f\n",PlayerCar[playerid][x][CarPos_y]);fwrite(hFile, var);
    format(var, 32, "CarPos_z=%.3f\n",PlayerCar[playerid][x][CarPos_z]);fwrite(hFile, var);
    format(var, 32, "CarRotate=%.3f\n",PlayerCar[playerid][x][CarRotate]);fwrite(hFile, var);
    format(var, 32, "CarNitro=%d\n",PlayerCar[playerid][x][CarNitro]);fwrite(hFile, var);
    format(var, 32, "CarHyd=%d\n",PlayerCar[playerid][x][CarHyd]);fwrite(hFile, var);
    format(var, 32, "CarWheel=%d\n",PlayerCar[playerid][x][CarWheel]);fwrite(hFile, var);
    format(var, 32, "CarAusp=%d\n",PlayerCar[playerid][x][CarAusp]);fwrite(hFile, var);
    format(var, 32, "CarSideL=%d\n",PlayerCar[playerid][x][CarSideL]);fwrite(hFile, var);
    format(var, 32, "CarSideR=%d\n",PlayerCar[playerid][x][CarSideR]);fwrite(hFile, var);
    format(var, 32, "CarFB=%d\n",PlayerCar[playerid][x][CarFB]);fwrite(hFile, var);
    format(var, 32, "CarRB=%d\n",PlayerCar[playerid][x][CarRB]);fwrite(hFile, var);
    format(var, 32, "CarSpoiler=%d\n",PlayerCar[playerid][x][CarSpoiler]);fwrite(hFile, var);
    format(var, 32, "CarRoof=%d\n",PlayerCar[playerid][x][CarRoof]);fwrite(hFile, var);
    format(var, 32, "CarHood=%d\n",PlayerCar[playerid][x][CarHood]);fwrite(hFile, var);
    format(var, 32, "CarVents=%d\n",PlayerCar[playerid][x][CarVents]);fwrite(hFile, var);
    format(var, 32, "CarLamps=%d\n",PlayerCar[playerid][x][CarLamps]);fwrite(hFile, var);
    format(var, 32, "CarPJ=%d\n",PlayerCar[playerid][x][CarPJ]);fwrite(hFile, var);
    format(var, 32, "CarC1=%d\n",PlayerCar[playerid][x][CarC1]);fwrite(hFile, var);
    format(var, 32, "CarC2=%d\n",PlayerCar[playerid][x][CarC2]);fwrite(hFile, var);
    format(var, 32, "Plate=%s\n",PlayerCar[playerid][x][Plate]);fwrite(hFile, var);
    format(var, 32, "Health=%.3f\n",PlayerCar[playerid][x][Health]);fwrite(hFile, var);
    fclose(hFile);
    }
    }
    }
    }
    }

    Dann müsstest du es so schreiben:
    stock ReturnPlayerID(l_PlayerName[])
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(!strcmp(NC_GetPlayerName(i),l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(strfind(NC_GetPlayerName(i),l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }