Spielername mit SetTimerEx wiedergeben

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag


    ich möchte, dass man, wenn man sich wenige minuten nachdem man sich ausgeloggt hat, wieder am selben ort spawnt.
    Dazu starte ich einen Timer, sobald der Spieler sich ausgeloggt und es wird eine variable auf 1 gesetzt. Wenn der Timer zuende ist und das public aufgerufen wird, soll die variable wieder auf 0 gesetzt werden.


    wenn der Spieler sich einloggt und die variable auf 1 ist, wird er an seiner alten position gespawnt.


    Da der Spieler Offline ist, kann ich nicht variable[MAX_PLAYERS] nutzen. Ich habe variable[MAX_PLAYER_NAME].


    Nun habe ich das Problem mit den timer, wie kann ich den namen denn wiedergeben? also ich mache ansonsten:


    public test(playerid)
    {
    variable[playerid] = 0;
    return 1;
    }


    wie mache ich das nun mit dem Spielernamen?


    public OnPlayerDisconnect(playerid, reason)
    {
    new SpielerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,SpielerName,sizeof(SpielerName));
    spawntime[SpielerName] = 1;
    spawntimer[SpielerName] = SetTimerEx("spawntimeende",60000*15,0,"s",SpielerName);
    return 1;
    }


    public spawntimeende(???)
    {
    ???
    return 1;
    }


    Ich hoffe ihr könnt mir da helfen

  • jo sau logisch :wacko:


    ich bekomme Erros immer wenn ich die variable "spawntime[SpielerName]" benutze..


    public spawntimeende(name[])
    {
    new SpielerName[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    GetPlayerName(i,SpielerName,sizeof(SpielerName));
    if(!strcmp(name,SpielerName,true))
    {
    spawntime[SpielerName] = 1;
    return 1;
    }
    }
    return 0;
    }


    //edit: wäre logisch wenn ich den error posten würde :S


    Zitat

    error 033: array must be indexed (variable "SpielerName")

  • ähm iwie ist es doch unlogisch :S


    der Spieler ist ja offline.. der timer startet, wenn der spieler offline geht und wird gekillt wenn er online kommt.
    wenn das public aufgerufen wird, soll die variable mit dem namen, der mit dem SetTimerEx wiedergegeben werden soll, auf 0 gesetzt werden.

  • nochmal deutlicher erklärt:


    Wenn sich ein Spieler einloggt und auf spawn klickt, wird er ja in den meisten fällen gespawnt :D
    Nehmen wir an, der Spieler wird am LSPD gespawnt.
    Der Spieler befindet sich zur Zeit am BSN und loggt sich aus. Dann loggt er sich wieder ein und wird am LSPD gespawnt.


    Ich möchte nun dann ,wenn man sich ausloggt und nach wenigen Minuten wieder einloggt, das man nicht am Spawnpunkt (hier LSPD) spawnt, sondern an der letzten position (hier BSN).


    Das Problem was ich habe: Ich kann variablen den playerids zuweisen: variable[MAX_PLAYERS]. Jedoch ist der Spieler Offline und er hat keine ID. Nun weise ich der variable einen Namen zu und zwar den Namen des spielers: variable [MAX_PLAYER_NAME].


    Sobald sich der Spieler ausloggt, wird die variable "spawntime[SpielerName]" auf 1 gesetzt und ein Timer von 15 Minuten gestartet. Wenn dieser Timer vorbei ist, soll die variable wieder auf 0 gesetzt werden: "spawntime[SpielerName] = 0;"


    Wenn der Spieler sich einloggt, wird überprüft, ob die variable mit seinem Namen 1 oder 0 ist. ist sie 0, spawnt er am spawnpunkt. ist sie 1, spawnt er an seiner alten Position.


    Nun Mein Problem. Ich muss mit Hilfe von SetTimerEx den Namen an das public übergeben, damit ich im public die variable mit den namen auf 0 setzten kann.


    new spawntime[MAX_PLAYER_NAME];
    new spawntimer[MAX_PLAYER_NAME];


    public OnPlayerDisconnect(playerid, reason);
    {
    new SpielerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,SpielerName,sizeof(SpielerName));
    spawntime[SpielerName] = 1;
    spawntimer[SpielerName] = SetTimerEx("spawntimeende",60000*15,0,"s",SpielerName);
    return 1;
    }

    public spawntimeende(name[])
    {
    spawntime[name] = 0;
    return 1;
    }


    Nun kommen folgende Errors:


  • das ist mir kla... die position, das interior und die virtuale welt wird abgefragt und in eine datei geschrieben..


    ich will nicht, dass er grundsätzlich an seiner alten position spawnt, nur wenn er sich innerhalb 15 minuten nach dem logout wieder einloggt..


    //edit: den Fehler habe ich gefunden.


    wenn ich ne variable erstelle variable[MAX_PLAYER_NAME]; dann gibt die variable ein string wieder, der maximal die länge hat, die in den eckigen klammern steht.
    Ich möchte aber, dass die Variable einem Namen zugewiesen wird.


    Eine playerid wird so zugewiesen: variable[MAX_PLAYERS]; >> variable[playerid] = 1;


    wie kann ich der variablen nen Namen zuweisen?

    Einmal editiert, zuletzt von Simon ()

  • //edit: habs nun mal selber probiert, aber irgentwie will es nicht so wie ich will. Keine Ahnung, wo ich da nen Fehler habe..


    public Anmelden(playerid) // der Spieler gibt sein passwort ein und wird angemeldet
    {
    new Spielerdatei[256], name[MAX_PLAYER_NAME], str[50], hour, minute, second, year, month, day, str2[50], str3[20], array1[2][50], array2[2][50], zeit[4];
    GetPlayerName(playerid,name,sizeof(name));
    gettime(hour,minute,second);
    getdate(year,month,day);
    format(str, sizeof str, "%d:%d",hour,minute); //hier wird die aktuelle Zeit abgefragt
    format(str2,sizeof(str2),"%s",dini_Get(Spielerdatei,"lastlogout")); //hier wird die zeit seines letzten logouts ausgelesen
    format(str3,sizeof(str3),"%d.%d.%d",day, month, year);
    format(Spielerdatei,sizeof(Spielerdatei),"/LCN/%s.ini",name);
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
    Spieler[playerid][Admin] = dini_Int(Spielerdatei,"Admin");
    Spieler[playerid][Skin] = dini_Int(Spielerdatei,"Skin");
    Spieler[playerid][Leader] = dini_Int(Spielerdatei,"Leader");
    Spieler[playerid][Member] = dini_Int(Spielerdatei,"Member");
    Spieler[playerid][Geld] = dini_Int(Spielerdatei,"Geld");
    Spieler[playerid][Score] = dini_Int(Spielerdatei,"Score");
    Spieler[playerid][posx] = dini_Int(Spielerdatei,"posx");
    Spieler[playerid][posy] = dini_Int(Spielerdatei,"posy");
    Spieler[playerid][posz] = dini_Int(Spielerdatei,"posz");
    Spieler[playerid][virtualworld] = dini_Int(Spielerdatei,"virtualworld");
    Spieler[playerid][interior] = dini_Int(Spielerdatei,"interior");
    SetPlayerScore(playerid,Spieler[playerid][Score]);
    split(str2,array1,':'); // hier wird die stunde und Minute seines letzten logouts in 2 strings geteilt
    split(str,array2,':'); // hier wird die jetztige Stunde und Minute in 2 strings geteilt
    zeit[0] = strval(array1[0]); //stunde des letzten logouts
    zeit[1] = strval(array1[1]); // minute des letzten logouts
    zeit[2] = strval(array2[0]); // aktuelle stunde
    zeit[3] = strval(array2[1]); // aktuelle minute
    if(zeit[2] - zeit[0] <= 0 && zeit[3] - zeit[0] <= 15 && strcmp(str3, dini_Get(Spielerdatei,"logoutdate"), true) == 0) //hiet wird stunde - stunde und minuten - minuten gerechnet und überprüft, ob zwischen logout und login weniger als 15 minuten liegen
    {
    respawn[playerid] = 1; //die variable wird beim public OnPlayerSpawn abgefragt..
    }
    dini_Set(Spielerdatei,"lastlogin",str);
    dini_Set(Spielerdatei,"logindate",str3);
    SpawnPlayer(playerid);
    return 1;
    }


    Logout:


    public OnPlayerDisconnect(playerid, reason)
    {
    new SpielerName[MAX_PLAYER_NAME], Float:x, Float:y, Float:z;
    GetPlayerName(playerid,SpielerName,sizeof(SpielerName));
    GetPlayerPos(playerid,x,y,z);
    Spieler[playerid][posx] = x;
    Spieler[playerid][posy] = y;
    Spieler[playerid][posz] = z;
    Spieler[playerid][interior] = GetPlayerInterior(playerid);
    Spieler[playerid][virtualworld] = GetPlayerVirtualWorld(playerid);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(togjoin[i] == 0)
    {
    if(reason == 0)
    {
    new DisConnect[256];
    format(DisConnect,sizeof(DisConnect),"%s (%d) hat die Verbindung verloren!",SpielerName,playerid);
    SendClientMessage(i,0xFFFFFFFF, DisConnect);
    }
    if(reason == 1)
    {
    new DisConnect[256];
    format(DisConnect,sizeof(DisConnect),"%s (%d) hat sich ausgeloggt!",SpielerName,playerid);
    SendClientMessage(i,0xFFFFFFFF, DisConnect);
    }
    if(reason == 2)
    {
    new DisConnect[256];
    format(DisConnect,sizeof(DisConnect),"%s (%d) wurde gekickt!",SpielerName,playerid);
    SendClientMessage(i,0xFFFFFFFF, DisConnect);
    }
    }
    }
    logout[playerid] = 1;
    respawn[playerid] = 0;
    Update(playerid);
    return 1;
    }


    Update:


    public Update(playerid)
    {
    new Spielerdatei[256],SpielerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,SpielerName,sizeof(SpielerName));
    format(Spielerdatei,sizeof(Spielerdatei),"/LCN/%s.ini",SpielerName);
    dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
    dini_IntSet(Spielerdatei,"Admin",Spieler[playerid][Admin]);
    dini_IntSet(Spielerdatei,"Score",GetPlayerScore(playerid));
    dini_IntSet(Spielerdatei,"Skin",Spieler[playerid][Skin]);
    dini_IntSet(Spielerdatei,"ban",Spieler[playerid][ban]);
    dini_IntSet(Spielerdatei,"Member",Spieler[playerid][Member]);
    dini_IntSet(Spielerdatei,"Leader",Spieler[playerid][Leader]);
    dini_FloatSet(Spielerdatei,"posx",Spieler[playerid][posx]);
    dini_FloatSet(Spielerdatei,"posy",Spieler[playerid][posy]);
    dini_FloatSet(Spielerdatei,"posz",Spieler[playerid][posz]);
    dini_IntSet(Spielerdatei,"interior",Spieler[playerid][interior]);
    dini_IntSet(Spielerdatei,"virtualworld",Spieler[playerid][virtualworld]);
    if(logout[playerid] == 1)
    {
    new hour, minute, second, year, month, day, str1[50], str2[50];
    gettime(hour,minute,second);
    getdate(year,month,day);
    format(str1,sizeof(str1), "%d:%d", hour, minute); //hier wird die aktuelle Zeit abgefragt
    dini_Set(Spielerdatei,"lastlogout",str1);
    format(str2,sizeof(str2),"%d.%d.%d",day, month, year); //hier wird das aktuelle Datum abgefragt
    dini_Set(Spielerdatei,"logoutdate",str2);
    }
    return 1;
    }


    registrieren;
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == Dialog_Regis)
    {
    if(response)
    {
    new Spielerdatei[64], name[MAX_PLAYER_NAME], day, month, year, second, minute, hour, str1[50], str2[50];
    GetPlayerName(playerid,name,sizeof(name));
    gettime(hour,minute,second);
    format(str1, sizeof str1, "%d:%d", hour, minute); //Hier ist die ganze ausgabe, sieht schwer aus, ist es aber nicht!
    getdate(year,month,day);
    format(str2,sizeof(str2),"%d.%d.%d",day,month,year);
    format(Spielerdatei,sizeof(Spielerdatei),"/LCN/%s.ini",name);
    dini_Create(Spielerdatei);
    if(!strlen(inputtext))return ShowPlayerDialog(playerid, Dialog_Regis, DIALOG_STYLE_INPUT, "Registriere dich mit einem Passwort!", "Registrieren", "Registrieren!", "Abbrechen!");
    dini_Set(Spielerdatei,"Passwort",inputtext);
    dini_IntSet(Spielerdatei,"Admin",0);
    dini_IntSet(Spielerdatei,"ban",0);
    dini_Set(Spielerdatei,"bangrund","0");
    dini_IntSet(Spielerdatei,"Skin",0);
    dini_IntSet(Spielerdatei,"Member",0);
    dini_IntSet(Spielerdatei,"Leader",0);
    dini_IntSet(Spielerdatei,"Geld",1000);
    dini_IntSet(Spielerdatei,"Score",1);
    dini_FloatSet(Spielerdatei,"posx",0.0);
    dini_FloatSet(Spielerdatei,"posy",0.0);
    dini_FloatSet(Spielerdatei,"posz",0.0);
    dini_IntSet(Spielerdatei,"interior",0);
    dini_IntSet(Spielerdatei,"virtualworld",0);
    dini_Set(Spielerdatei,"regdate",str2);
    dini_Set(Spielerdatei,"lastlogin",str1);
    dini_Set(Spielerdatei,"logindate",str2);
    dini_Set(Spielerdatei,"lastlogout","- - -");
    dini_Set(Spielerdatei,"logoutdate","- - -");

    Anmelden(playerid);
    SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest automatisch eingeloggt!");
    }
    else
    {
    ShowPlayerDialog(playerid, Dialog_Regis, DIALOG_STYLE_INPUT, "Registrieren", "Registriere dich mit einem Passwort!", "Registrieren!", "Abbrechen!");
    }
    }
    return 1;
    }


    spawn:


    public OnPlayerSpawn(playerid)
    {
    if(duty[playerid] == 1)
    {
    SetPlayerColor(playerid,0xBB0000FF);
    SetPlayerSkin(playerid,147);
    }
    else
    {
    SetPlayerColor(playerid,0xFFFFFFFF);
    SetPlayerArmour(playerid,0.0);
    SetPlayerHealth(playerid,100.0);
    }
    SetPlayerSpawn(playerid);
    TogglePlayerControllable(playerid,1);
    return 1;
    }


    SetPlayerSpawn:
    public SetPlayerSpawn(playerid)
    {
    SetPlayerSkin(playerid,Spieler[playerid][Skin]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    if(respawn[playerid] == 1) // hier wird nun die variable wieder verwendet..
    {
    SetPlayerPos(playerid,Spieler[playerid][posx],Spieler[playerid][posy],Spieler[playerid][posz]);
    SetPlayerVirtualWorld(playerid,Spieler[playerid][virtualworld]);
    SetPlayerInterior(playerid,Spieler[playerid][interior]);
    respawn[playerid] = 0;
    if(Spieler[playerid][posz] >= 25)
    {
    GivePlayerWeapon(playerid,46,1);
    }
    }
    else
    {
    if(Spieler[playerid][Member] == 1 || Spieler[playerid][Leader] == 1)
    {
    SetPlayerPos(playerid,685.2319,-1276.2795,13.5609);
    }
    else if(Spieler[playerid][Member] == 2 || Spieler[playerid][Leader] == 2)
    {
    SetPlayerPos(playerid,-1743.0505,1398.6871,7.1875);
    }
    else if(Spieler[playerid][Member] == 3 || Spieler[playerid][Leader] == 3)
    {
    SetPlayerPos(playerid,-2178.6472,714.3528,53.8906);
    }
    else if(Spieler[playerid][Member] == 4 || Spieler[playerid][Leader] == 4)
    {
    SetPlayerPos(playerid,-2502.3442,1207.9100,37.4283);
    }
    else if(Spieler[playerid][Member] == 5 || Spieler[playerid][Leader] == 5)
    {
    SetPlayerPos(playerid,2597.3418,1888.7904,11.0312);
    }
    else if(Spieler[playerid][Member] == 6 || Spieler[playerid][Leader] == 6)
    {
    SetPlayerPos(playerid,2512.2119,-1689.4874,13.5450);
    }
    }
    return 1;
    }


    Ich hoffe ihr könnt mir da helfen, denn ich finde den fehler nicht. Habe keine Errors oder Warnings...

    Einmal editiert, zuletzt von Simon ()

  • Was funktioniert denn genau nicht ?


    Btw da du soviel Code gepostet hast,
    dass ich mehr als 2x scrollen muss,
    werd ich mir das so nicht ansehen ;)
    (Und so wirds evtl mehreren gehen,
    achte also darauf, nur den wichtigen code zu kopieren)

  • okay, der spawnt net an seiner alten position, obwohl zwsichen logout und login weniger als 15 min liegen


    public Anmelden(playerid)
    {
    new Spielerdatei[256], name[MAX_PLAYER_NAME], str[50], hour, minute, second, year, month, day, str2[50], str3[20], array1[2][50], array2[2][50], zeit[4];
    GetPlayerName(playerid,name,sizeof(name));
    gettime(hour,minute,second);
    getdate(year,month,day);
    format(str, sizeof str, "%d:%d",hour,minute); //hier wird die aktuelle Zeit abgefragt
    format(str2,sizeof(str2),"%s",dini_Get(Spielerdatei,"lastlogout")); //hier wird die zeit seines letzten logouts ausgelesen
    format(str3,sizeof(str3),"%d.%d.%d",day, month, year);
    format(Spielerdatei,sizeof(Spielerdatei),"/LCN/%s.ini",name);
    split(str2,array1,':'); // hier wird die stunde und Minute seines letzten logouts in 2 strings geteilt
    split(str,array2,':'); // hier wird die jetztige Stunde und Minute in 2 strings geteilt
    zeit[0] = strval(array1[0]); //stunde des letzten logouts
    zeit[1] = strval(array1[1]); // minute des letzten logouts
    zeit[2] = strval(array2[0]); // aktuelle stunde
    zeit[3] = strval(array2[1]); // aktuelle minute
    if(zeit[2] - zeit[0] <= 0 && zeit[3] - zeit[0] <= 15 && strcmp(str3, dini_Get(Spielerdatei,"logoutdate"), true) == 0)
    {
    respawn[playerid] = 1; //die variable wird beim public OnPlayerSpawn abgefragt..
    }
    dini_Set(Spielerdatei,"lastlogin",str);
    dini_Set(Spielerdatei,"logindate",str3);
    SpawnPlayer(playerid);
    return 1;
    }


    und wenn er dann spawnt wird abgefragt ob die variable respawn[playerid] 1 ist und wenn ja, wird er an seiner alten pos gespawnt..
    public SetPlayerSpawn(playerid)
    {
    SetPlayerSkin(playerid,Spieler[playerid][Skin]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    if(respawn[playerid] == 1)
    {
    SetPlayerPos(playerid,Spieler[playerid][posx],Spieler[playerid][posy],Spieler[playerid][posz]);
    SetPlayerVirtualWorld(playerid,Spieler[playerid][virtualworld]);
    SetPlayerInterior(playerid,Spieler[playerid][interior]);
    respawn[playerid] = 0;
    if(Spieler[playerid][posz] >= 25)
    {
    GivePlayerWeapon(playerid,46,1);
    }
    }
    return 1;
    }