Beiträge von Hagi

    Zuerst, ich benutze PVar


    Wenn ich mich normal auslogge (/q) dann wird alles korrekt gespeichert.


    Wenn ich jedoch den Server restarte (gmx) dann werden alle Werte auf 0 gesetzt obwohl doch da auch jeder Spieler den OnPlayerDisconnect durchläuft !?


    Wie kann ich das vermeiden ?

    Und zwar habe ich das Problem


    Zum Ersten:
    Aus der Datei wird der Wert falsch ausgelesen:


    if(dini_Isset(string,"Versteck"))
    {
    SetPVarInt(playerid,VERSTECK_KEY,dini_Int(string,"Versteck"));
    }
    else
    {
    dini_IntSet(string,"Versteck",(0));
    }


    Theoretisch bekommt die PVar ja den Wert auf der Datei mit dem Key Versteck. Doch egal was in der Datei steht, die Variable ist immer 1.



    @dit: Ich denke das hier kann kommen, wenn die Variable mit einem falschen Wert gespeichert wird. Also Richtet sich nun alles auf den zweiten Teil hier runter.


    Zweitens:


    Es wird warum auch immer die PVar Hatversteck verändert, wenn ich Versteck ändere.
    Beispiel:


    Durch das hier wird das Geld im Versteck geändert
    if(inputinteger <= GetPVarInt(playerid,VERSTECK_KEY))
    {
    SetPVarInt(playerid,VERSTECK_KEY,GetPVarInt(playerid,VERSTECK_KEY) - inputinteger);
    GivePlayerMoney(playerid,inputinteger);

    new string[128];
    format(string,sizeof(string),"Du hast %d $ abgehoben. Gesamt: %d $",inputinteger,GetPVarInt(playerid,VERSTECK_KEY));
    SendClientMessage(playerid,weiß,string);
    }
    else
    {
    SendClientMessage(playerid,rot,"Fehler: So viel Geld hast du nicht in deinem Versteck");
    }


    Doch wenn ich nun wieder das allgemeine Aufrufe, sagt er mir, dass ich kein Versteck habe, obwohl doch nichts an dem hier drpber an Hatversteck geändert wurde.


    if(listitem == 1) // abheben
    {
    if(GetPVarInt(playerid,HATVERSTECK_KEY) == 1)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,GetPVarFloat(playerid,VEX_KEY),GetPVarFloat(playerid,VEY_KEY),GetPVarFloat(playerid,VEZ_KEY)))
    {
    new string[128];
    format(string,sizeof(string),"Wie viel möchtest du abheben ? Gesamt: %d\n\n",GetPVarInt(playerid,VERSTECK_KEY));
    ShowPlayerDialog(playerid,versteckabhebendialog,DIALOG_STYLE_INPUT,"Abheben",string,"","");
    }
    else
    {
    SendClientMessage(playerid,rot,"Fehler: Du bist nicht an deinem Versteck");
    }
    }
    else
    {
    SendClientMessage(playerid,rot,"Fehler: Du hast noch kein Versteck");
    }
    }


    Ist das System vllt doch noch nichts ausgereift ?
    Und wie kann ich das beheben ?


    @dit: Problem gelöst: Mit dem neuen Server R6 geht es jetzt. Bei R5 waren die Zuordnungen bei manchen Keys einfach falsch bei PVar

    ja kann man , das gute dabei ist keine der Variablen muss vorher definiert werden sprich sie können ebenso Dynamisch hinzugefügt, wie auch gelöscht werden,
    sie setzen sich zudem Automatisch zurück.


    Ich finde nur, dass man Informiert werden sollte beim Compilen, wenn eine Variable nicht erstellt wurde, denn wenn man sich verschreibt bei z.B.


    GetPVarInt(playerid,"tset");
    anstatt
    GetPVarInt(playerid,"Test");


    würde es ja im GM den Wert 0 zurück geben, was ja letztendlich eigentlich zur völligen verwüstung kommen kann, je nach dem wie die abfrage gebaut wurde.


    Gibts da nicht ne Möglichkeit das irgentwie zu unterbinden ?


    @dit: Geil Blackfox das ne super Idee, danke

    So passts


    stock Freeze(playerid) // Freezed einen Spieler.
    {
    if(IsPlayerConnected(playerid))
    {
    TogglePlayerControllable(playerid, 0);
    }
    }
    stock unFreeze(playerid) // Unfreezed einen Spieler.
    {
    if(IsPlayerConnected(playerid))
    {
    TogglePlayerControllable(playerid, 1);
    }
    }


    Man brauch da keine schleife

    Erstmal wird das nicht fubnktionieren, denn wenn du tot bist, dorthin teleportiert wirst, wird dann der public OnPlayerSpawn ausgeführt, sprich man spawnt direkt.


    Setzt dir beim Tod eine Variable und überprüfe diese beim Spawnen, teleportiere ihn dann ggf.


    --------


    machen forward backtospawn(pid);


    dann unter dem
    SetPlayerPos(playerid, -2029.5033,-95.9288,35.1641);
    SetPlayerVirtualWorld(playerid,1);


    SetTimerEx("backtospawn",60000,0,"i",playerid);



    Dann irgentwo im Script

    public backtospawn(pid)
    {
    SetPlayerVirtualWorld(pid,0);
    SpawnPlayer(pid);
    }

    Du musst das


    if(isdm[playerid] == 1)
    {
    SetPlayerPos(playerid,x,y,z);
    GivePlayerWeapon(playerid,weapon,ammo);
    }



    In Public OnPlayerSpawn einfügen

    ja du kannst die camerapos dort hinsetzten und mit setplayercameralookat bestimmen wo sie hinschauen soll.


    Du solltest aber den Spieler auch noch mit dorthinsetzten und freezen, da sonst möglicherweise die autos und objecte nicht eingestreamet werden

    du kannst /dm zweimal benutzen.


    Er sieht ja anhand der variable ob man dri ist oder nicht.


    Wenn du das von Dominik verwendest, musst du meins auch ändern:


    new isdm[MAX_PLAYERS];


    if(strcmp(cmdtext,"/dm",true))
    {
    if(isdm[playerid] == 0)
    {
    SetPlayerPos(playerid,x,y,z);
    GivePlayerWeapon(playerid,weapon,ammo);
    isdm[playerid] = 1;
    }
    }


    OnPlayerSpawn
    {
    if(isdm[playerid] == 1)
    {
    SetPlayerPos(playerid,x,y,z);
    GivePlayerWeapon(playerid,weapon,ammo);
    }
    }

    new isdm[MAX_PLAYERS];


    if(strcmp(cmdtext,"/dm",true))
    {
    if(isdm[playerid] == 0)
    {
    SetPlayerPos(playerid,x,y,z);
    GivePlayerWeapon(playerid,weapon,ammo);
    isdm[playerid] = 1;
    }
    else
    {
    isdm[playerid] = 0;
    SpawnPlayer(playerid);
    }
    }


    OnPlayerSpawn
    {
    if(isdm[playerid] == 1)
    {
    SetPlayerPos(playerid,x,y,z);
    GivePlayerWeapon(playerid,weapon,ammo);
    }
    }


    Erklärung:


    Man gibt /dm ein, wenn die cariable auf 0 ist, wird sie auf 1 gesetzt, man wird teleportiert und bekommt waffen.
    Bei erneutem dm wwird die variable auf 0 gesetzt, sprich man kommt nicht in die dm arena.


    Wenn man spawnt wird abgefragt ob die variable 1 ist; sollte dies der Fall sein wird man mit Waffen teleportiert

    Wenn du dir Wiki durchlesen würdest, wärs doch klar:


    AddPlayerClass(skin, Float:x, Float:y, Float:z, Float:Angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo);


    skin = wie sieht der Spieler aus, entnehme hier


    x,y,z = die koordinaten wo er spawnen soll


    angle = wo schaut er beim spawnen hin


    weapon1 = spawnwaffe 1


    weapon1_ammo = schuss der spawnwaffe 1


    usw