Beiträge von Quetai

    Hey Leute.



    Ich hab' das "Savebox-System" von RFT genommen und eingefügt. Savebox


    Meine Frage:
    Godfather hat ja eine Fraktionskasse, wo alle Fraktionen dabei sind etc. Und die Dateien werden ja in einer .cfg Datei gespeichert.
    Ich hab' das gleiche ausprobiert, es kamen zwar keine Errors oder Warnings, aber der Server ging danach nicht mehr an.


    Meine Vermutung: Ich hab das mit der ".cfg speichern" falsch gemacht..
    Wie kann ich das machen, dass das Green "pDrug (Godfahter)" in einer .cfg gespeichert wird für die Fraktionen...


    Halt so sieht das bei der Fraktionskasse aus:


    //------------------------------------------------------------------------------
    public LoadFraktionsKassen()
    {
    new File:Kasse = fopen("Fraktionskassen.cfg",io_read);
    new idx = 0;
    new read[128];
    while(idx < sizeof(FraktionsKasse))
    {
    fread(Kasse,read);
    for(new x=0; x<strlen(read); x++)
    {
    if(read[x]== '\n')
    {
    read[x] = '\0';
    }
    }
    FraktionsKasse[idx] = strval(read);
    idx++;
    }
    fclose(Kasse);
    return 1;
    }


    public SaveFraktionsKassen()
    {
    new File:Kasse = fopen("Fraktionskassen.cfg",io_write);
    new write[24];
    for(new idx; idx < sizeof(FraktionsKasse); idx++)
    {
    format(write,sizeof(write),"%d\n",FraktionsKasse[idx]);
    fwrite(Kasse,write);
    }
    fclose(Kasse);
    return 1;
    }

    if(strcmp(tmp,"einzahlen",true) == 0)
    {
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid,COLOR_GREY,"Benutzung: /fkasse einzahlen [Betrag]");
    format(string,sizeof(string),"Momentan sind $%d in der Fraktionskasse.",FraktionsKasse[fraktion]);
    SendClientMessage(playerid,COLOR_YELLOW,string);
    return 1;
    }
    new amount = strval(tmp);
    if(amount < 0 || amount > 50000) return SendClientMessage(playerid,COLOR_GREY, "Die eingezahlte Summe muss zwischen $1 und $1Mio. liegen!");
    if(GetPlayerMoney(playerid) < amount) return SendClientMessage(playerid,COLOR_GREY, "Du hast nicht soviel Geld, um es einzuzahlen!");
    FraktionsKasse[fraktion] += amount;
    GivePlayerMoney(playerid,-amount);
    format(string,sizeof(string),"Du hast $%d in die Fraktionskasse eingezahlt. Insgesamt: $%d",amount,FraktionsKasse[fraktion]);
    SendClientMessage(playerid,COLOR_YELLOW,string);
    format(string,sizeof(string),"%s hat $%d in die Fraktionskasse eingezahlt. Insgesamt: $%d",sendername,amount,FraktionsKasse[fraktion]);
    SendLeaderMSG(fraktion+1,COLOR_YELLOW,string);
    SaveFraktionsKassen();
    }


    Sagen wir ich hab' $500 auf der Hand und schreibe /fkasse einzahlen 600...
    Dann wird das Geld eingezahlt, obwohl's nicht so sein sollte.


    Sieht einer den Fehler?

    Hey Leute.
    Ich hab' dieses Krankenhaussystem: Krankenhaussystem


    Wenn ein Spieler stirbt, läuft ja ein Timer ab.
    Wenn die Zeit um ist, lebt der Spieler wieder.
    ..


    Wie kann ich das anders mit der Zeit machen?
    Ich möchte, dass wenn der Spieler Tod ist, z.B. schon 120 Sekunden von 180 Sekunden im Krankenhaus war, danach offline geht, die Zeit gespeichert wird.
    Sprich, dass der Spieler, wenn der wieder online ist, nur noch 60 Sekunden auf dem Friedhof verbringen muss.


    Weil so wie das jetzt Krankenhaussystem hier ist, ist das bisschen verbuggt.
    Man ist, wenn man auf den Server connected Tod o.Ä.

    Ich hab' noch gestern gelesen, dass man OnPlayerUpdate so gut wie möglich umgehen sollte. :D
    Ich hab' die Zeit des Timers einfach auf 2 Sekunden gemacht.

    Dann entferne ich es doch lieber.
    Das würde doch Ressourcenfressend sein, wenn auf dem Server viele Leute sind, oder?


    Danke trotzdem.

    Hey Leute.


    Da habe ich unter OnPlayerTakeDamage


    new hptext[64];
    new Float:HP;
    GetPlayerHealth(playerid,HP);
    format(hptext, sizeof(hptext),"%d",floatround(HP));
    TextDrawSetString(lebensanzeige[playerid],hptext);


    Aber halt, der Textdraw wird nur geupdated, wenn ein anderen Spieler mir Schaden zufügt.
    Wie könnte ich das sonst lösen?
    Das mit 'nem Timer updaten zu lassen wäre das doch Ressourcenfressend oder nicht? (Wenn die Spieleranzahl hoch wäre)

    Ich möchte einen Befehl für Mechaniker machen..


    So sieht der jetzt aus.
    if(strcmp(cmd,"/repcar",true)==0)
    {
    if(IsPlayerConnected(playerid))
    {
    if (PlayerInfo[playerid][pJob] != 7)
    {
    SendClientMessage(playerid,COLOR_GREY,"Du bist kein Mechaniker!");
    return 1;
    }
    if(IsPlayerInAnyVehicle(playerid))
    {
    SetVehicleHealth(GetPlayerVehicleID(playerid), 500.0);
    RepairVehicle(GetPlayerVehicleID(playerid));
    GivePlayerMoney(playerid,-500);
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Fahrzeug erfolgreich für $500 repariert.");
    }
    }
    return 1;
    }


    Ich möchte das aber so machen, dass man nicht im Fahrzeug sitzen muss, sondern in der Nähe sein muss?
    Wie kann ich das machen?


    Muss man diese Funktion verwenden?
    GetVehicleDistanceFromPoint

    Hey Leute.


    Also, die Fightstyles lasse ich so abspeichern.
    PlayerInfo[playerid][pFightingStyle]


    So hab' ich das jetzt:
    if(listitem == 0)
    {
    if(GetPlayerMoney(playerid) >= 5000)
    {
    PlayerInfo[playerid][pFightingStyle] = FIGHT_STYLE_NORMAL;
    SetPlayerFightingStyle(playerid, PlayerInfo[playerid][pFightingStyle]);
    GivePlayerMoney(playerid, -5000);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Du hast dein Kampfstyle nun zum Standart geändert.");
    }
    else SendClientMessage(playerid, COLOR_GREY,"Du hast nicht genug Geld dabei!");
    }
    if(listitem == 1)
    {
    if(GetPlayerMoney(playerid) >= 5000)
    {
    PlayerInfo[playerid][pFightingStyle] = FIGHT_STYLE_BOXING;
    SetPlayerFightingStyle(playerid, PlayerInfo[playerid][pFightingStyle]);
    GivePlayerMoney(playerid, -5000);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Du hast dein Kampfstyle nun zum Boxen geändert.");
    }
    else SendClientMessage(playerid, COLOR_GREY,"Du hast nicht genug Geld dabei!");
    }


    Aber nachdem Server neustart ist der Fightstyle wieder beim Standart.

    Hey Leute.
    Ich hätte da eine Frage.
    Ich lasse beim connecten einen anklickbaren Textdraw zeigen. Beim klicken eines Textdraw wird eine Variable auf 1 gesetzt. Und wenn die Variable auf 1 gesetzt ist, kommt folgendes:


    public OnPlayerRequestClass(playerid, classid)
    {
    InterpolateCameraPos(playerid, 1683.0621,-1085.4174,124.2207, 1425.0975,-850.3584,91.8968, 20000, CAMERA_MOVE);
    InterpolateCameraLookAt(playerid, 1533.8693,-1006.8957,132.7358, 1394.9154,-819.5029,94.0750, 20000, CAMERA_MOVE);


    TextDrawShowForPlayer(playerid, PlayerInfo[playerid][LetterboxTop]);
    TextDrawShowForPlayer(playerid, PlayerInfo[playerid][LetterboxBottom]);


    if(gPlayerAccount[playerid] == 1 && Showing[playerid] == 1 && gPlayerLogged[playerid] == 0)
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Dein Account wurde erfolgreich gefunden!\nGib jetzt deinen Passwort ein,\num dich einloggen zu können.","Login","Abbrechen");
    }
    else if(gPlayerAccount[playerid] == 0 && Showing[playerid] == 1 && gPlayerLogged[playerid] == 0)
    {
    ShowPlayerDialog(playerid,DIALOG_REG,DIALOG_STYLE_MSGBOX,"Account","Dein Account wurde nicht gefunden!\nDu benötigst einen, wenn du auf diesem Server\nspielen möchtest!","Erstellen","Abbrechen");
    }
    return 1;
    }


    Aber, wenn ich auf den Server connecte und dann eine kurze Zeit warte (~5 Sekunden), nachdem die Textdraws halt gezeigt wurden, kommt "OnPlayerRequestClass von alleine".
    Halt, InterPolate wird ausgeführt und so. Wenn ich erst jetzt auf eines der Textdraws klicke, passiert nichts.
    Die Dialogs werden nicht angezeigt...
    Deswegen wollte ich fragen, ob es sinnvoll wäre diese zwei Dialoge unter OnPlayerRequestClass zu lassen oder wo anders hinzupacken?

    Also:

    format(string,sizeof(string),"%d",PlayerInfo[playerid][pDeagleSkill]);
    TextDrawShowForPlayer(playerid,WaffenSkill3[playerid]);
    TextDrawSetString(WaffenSkill3[playerid],string);


    Aber dann zeigt der ja nicht z.B. 1 oder 2 oder so an...
    Weil bei meinem WaffeSkill-System kriegt man bei jedem Level up Waffenupgradepunkte..
    Der Befehl lautet /wupgrade [waffe]...


    Sagen wir, der macht /wupgrade Deagle, dann erhöht sich der Deagle Skill um 167...167 weil 999/6 (durch 6 weil man nach 6 Level ups den Waffenskill voll haben soll) = ~167...
    Halt aufjedenfall würde der dann 167 oder anzeigen und nicht 1...
    Wie schaffe ich das, dass der dann 1 anzeigt?