Beiträge von Manyula

    Scheint manchmal doch die blödeste Lösung die richtige zu sein. -.-'


    Aber wieso wurde mir beim 2. Tod immer eine -10 angezeigt, obwohl ich den Wert bei Funktionsende immer resettet habe?

    Ich lasse einen Timer für das Ausbluten eines Spielers in einem Textdraw in Form von BleedOutPoints anzeigen. Von 300 sollen die Punkte auf 0 runtergezählt werden. Innerhalb der Timerfunktion fang ich gleich an 10 abzuziehen, weswegen BleedOutPoints auf 310 gesetzt wurde.
    Wenn ich nun beim ersten mal sterbe, dann dauert es eine Sekunde bis das TD angezeigt wird, mit den intendierten 300 Punkten. Sterbe ich allerdings ein zweites Mal wird das TD sofort angezeigt, aber der Wert -10 angezeigt. Eine Sekunde später springt er wieder auf 300.
    Wie stelle ich es an, dass von vorne rein die 300 angezeigt werden?


    //Variable
    new BleedOutPoints[MAX_PLAYERS] = 310;


    //OnPlayerDeath
    BleedOutTimer[playerid] = SetTimerEx("BleedOut", 1000/3, true, "i", playerid);
    PlayerTextDrawShow(playerid, BleedoutTD[playerid]);


    //Timer Funktion
    forward BleedOut(playerid);
    public BleedOut(playerid)
    {
    if(!BeingRezzed[playerid])
    {
    BleedOutCount[playerid]++;
    if(BleedOutCount[playerid] >= 3)
    {
    BleedOutPoints[playerid] -= 10;
    new string3D[4],
    stringTD[20];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringTD, sizeof(stringTD), "~r~%d~w~/1000", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringTD, sizeof(stringTD), "~r~%d~w~/1000", BleedOutPoints[playerid]);
    }
    BleedOutCount[playerid] = 0;
    PlayerTextDrawSetString(playerid, BleedoutTD[playerid], stringTD);
    }
    }
    else if(BeingRezzed[playerid])
    {
    BleedOutPoints[playerid] += (10*PlayersRezzingPlayer[playerid]);
    new string3D[4],
    stringTD[20];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringTD, sizeof(stringTD), "~r~%d~w~/1000", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringTD, sizeof(stringTD), "~r~%d~w~/1000", BleedOutPoints[playerid]);
    }
    PlayerTextDrawSetString(playerid, BleedoutTD[playerid], stringTD);
    }
    if(BleedOutPoints[playerid] < 0)
    {
    new stringGT[67];
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "Verblutet~n~Benutze ~r~~k~~VEHICLE_ENTER_EXIT~~w~ um zu respawnen.");
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "Bled to death~n~Use ~r~~k~~VEHICLE_ENTER_EXIT~~w~ to respawn.");
    }
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    GameTextForPlayer(playerid, stringGT, 10000, 5);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]);
    DestroyDynamicArea(RevivalArea[playerid]);
    ApplyAnimation(playerid, "CRACK", "crckdeth1", 4.1, 0, 1, 1, 1, 24*60*60000, 1);
    BleedOutCount[playerid] = 0;
    }
    if(BleedOutPoints[playerid] >= 1000)
    {
    SetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    SetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]);
    DestroyDynamicArea(RevivalArea[playerid]);
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    BleedOutPoints[playerid] = 310;
    BleedOutCount[playerid] = 0;
    }
    return 1;
    }


    //Respawn Funktion
    CMD:respawn(playerid, params[])
    {
    RespawnPlayerAtHospital(playerid);
    SetPlayerHealth(playerid, 100);
    IsPlayerInDownState[playerid] = false;
    ClearAnimations(playerid);
    KillTimer(BleedOutTimer[playerid]);
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    DestroyDynamicArea(RevivalArea[playerid]);
    SetSpawnProtection(playerid);
    BleedOutPoints[playerid] = 310;
    BleedOutCount[playerid] = 0;
    return 1;
    }

    Dann hatte ich, was 2D-Arrays betrifft einen kleinen Denkfehler, danke für die Klarstellung.^^


    Im Prinzip müsste es ja...
    new Float:damageMade[MAX_PLAYERS][MAX_PLAYERS-1];
    ... sein, wenn man davon ausgeht, dass der Spieler sich nicht selbst Schaden zufügt. Er soll für seinen selbstverschuldeten Tod ja nicht durch das Kill Assist System auch noch belohnt werden.

    Hallo,


    ich möchte ein Kill Assist System schreiben, und hab es konzeptuell auch schon ganz gut im Kopf. Nur habe ich eben ein paar Schwierigkeiten bei den Vorüberlegungen.
    Ich möchte das ganze so machen, dass jeder Spieler eine Variable "KA_HitBy" hat. Wird ein Spieler getroffen, sollen in seine Variable alle Spielernamen von denen er getroffen wurde UND der summierte Schaden der jeweiligen Spieler gespeichert werden.


    Beispiel:
    Spieler A wird von Spieler B getroffen und nimmt 10.0 Schaden. | Spieler B - 10.0
    Spieler A wird von Spieler C getroffen und nimmt 15.0 Schaden. | Spieler B - 10.0 | Spieler C - 15.0
    Spieler A wird wieder von Spieler B getroffen und nimmt 20.0 Schaden | Spieler B - 30.0 | Spieler C - 15.0


    Das Problem ist hierbei eben, dass ich nicht weiß, wie ich mehrere IDs in eine Variable schreibe. Wenn ich eine einfache MAX_PLAYER Variable mache, wird der letzte Wert ja immer wieder neu überschrieben, wenn ein anderer Spieler das Opfer trifft.


    Danke!

    Das Ding ist, dass ich Wert darauf lege, dass der Spieler immer an derselben Stelle bleibt. Ich schätz mal OnPlayerEnterVehicle wäre dafür die schonendere Variante, oder? Auch, wenn die Abfrage unter OnPlayerUpdate nicht besonders groß ist.
    Danke schon mal für eure Hilfe!

    Hallo,


    momentan setze ich die Animationszeit eines Spielers möglichst hoch, um den Spieler in dieser "gefangen" zu halten, ihm aber dennoch die Möglichkeit zu geben die Kamera zu bewegen.
    Nun ist mir aber aufgefallen, dass hier kein Halt vor state wechseln gemacht wird. Wenn ein Spielr also in Reichweite eines Vehikels ist, kann er die Animation abbrechen, indem er einsteigt. TogglePlayerControllable würde das ganze natürlich auch lösen, jedoch geht dabei die Möglichkeit die Kamera zu bewegen verloren.
    Habt ihr weitere Lösungsmöglichkeiten?

    Wieso immer Roleplay? Macht doch bitte mal etwas ausgefalleneres als ständig nur RP. RP hängt zu sehr davon ab wie gut die Spieler mitmachen. Find ich persönlich ziemlich heikel. Spielt doch einfach auf BreadfishRP, oder auf anderen renommierten RP Servern, dann habt ihr mehr davon, in Sachen Spielerzahl - wenige RP Server, viele RP Spieler = vollere RP Server. Man kann scripttechnisch sehr viel tun. Sich darauf zu verlassen, dass die Spieler fehlende Sachen im Script durch RP kompensieren find ich armselig.

    Hm, ich habe mir in der Zwischenzeit etwas anderes überlegt. Und zwar jedem Tag im Jahr eine Zahl zuzuweisen und dann einfach nach Werten vergleichen.
    Also, wenn der Spieler sich an Tag 230 zuletzt eingeloggt hat und heute Tag 340 ist, dann wird die Serie unterbrochen. Das find ich eine (für mich) deutlich verständlichere Variante, nur eben etwas zeilenlastig.


    Jeffry: Wozu brauch ich die Abfrage, ob der letzte Login heute ist/war? Ebenso verstehe ich nicht wieso ich das Datum in Textform vergleichen soll und was das mit strcmo zu tun hat, ich bin leicht verwirrt, tut mir Leid.^^

    Hallo!


    Ich möchte eine Login Serie erstellen. Im Prinzip heißt das, dass wenn ein Spieler 7 Tage am Stück online sein muss, um seinen Loginbonus immer weiter aufzustocken.
    Das ganze soll offentlichtlich datumsgesteuert sein. Ist ein Spieler mitten in der Serie einen Tag lang nicht online, fängt die Serie von vorne an.


    Nun die Frage: Wie stelle ich das am besten an? Das letzte Logindatum mit getdate() in die Userfile speichern und bei jedem erneuten Login dann eine Variable hochzählen, die dann auch in der Userfile gespeichert wird, und den Loginbonus bestimmt. Das würde mcih ja dann zu dem Punkt bringen, dass der Spieler sich 7 beliebiege Male einloggen muss, nicht 7 aufeinanderfolgende Tage. Wie frage ich nun ab, ob der Spieler einen Tag zuvor sich auch schon eingeloggt hat?


    Danke!

    Und wenn ich den Timer dann endgültig kille, setze ich den bleedCount wieder auf 0, oder wird das automatisch gemacht?
    Hab mir auch schon überlegt das gabze mit einem Count zu machen, danke für die code-technische Ausführung!

    Mir ist eben erst selbst aufgefallen, dass der Timer bei jedem Funktionsaufruf neu gestartet wird. So hatte ich das eigentlich nicht beabsichtigt...^^


    Ich versuch das ganze mal anhand eines Beispiels zu erklären.


    Spieler A wird von Spieler B getötet, also auf 0HP gebracht.
    Spieler A verfällt in den Downstate Modus.
    Da Spieler A nicht von einem anderen Spieler wiederbelebt wird, verblutet A langsam. Hier zählt ein Timer mit einem Intervall von 1s die übrige "Lebenskraft" runter, bis sie auf 0 ist und der Spielet schließlich stirbt. In diesem Zeitraum bis der Spieler aber vollkommen verblutet ist, kann ein anderer Spieler herbeieilen und den Spieler wiedetbeleben.
    Also kommt ein Spieler C zu A und beginnt ihn wiederzubeleben. Hier soll dann der 1s Timer gekillt werden und der 333ms Timer einsetzen. Wenn Spieler C mitten im Prozess aufhört wiederzubeleben, dann schaltet der Timer wieder auf 1s um.
    Deswegen hab ich Killtimer ja immet zu Beginn hedes Statements gehabt, im Falle, dass die Bedingung umschwingt immer nur ein Timer aktiv ist, und nicht beide laufen.

    Hallo!


    Die Überschrift mag etwas konfus wirken, aber es geht tatsächlich darum einen sich wiederholten Timer zu killen, der gar nicht existiert.
    Das Ganze sieht ungefähr so aus:


    public OnPlayerDeath(...)
    {
    BleedOut(playerid); //Funktionsaufruf ohne direkt einen sich wiederholenden Timer zu starten.
    return 1;
    }


    forward BleedOut(playerid);
    public BleedOut(playerid)
    {
    if(!BeingRezzed[playerid])
    {
    KillTimer(BleedOutTimer[playerid]);
    BleedOutTimer[playerid] = SetTimerEx("BleedOut", 1000, true, "i", playerid);
    }
    if(BeingRezzed[playerid])
    {
    KillTimer(BleedOutTimer[playerid]);
    BleedOutTimer[playerid] = SetTimerEx("BleedOut", 1000/3, true, "i", playerid);
    }
    return 1;
    }


    Im Prinzip geht es nur um den ersten Durchlauf. Wenn jemand stirbt, wird er in eine Art "Downstate" versetzt. Wird er nicht wiederbelebt, hat der Timer ein Intervall von 1s. Wird er wiederbelebt, schrumpft das Intervall auf 333,33ms. Je nach Fall soll das Intervall sich anpassen.
    Wenn der Spieler also direkt stirbt, wird er ja nicht sofort wiederbelebt, also trifft der erste Fall zu, in dem, trotz allem, der Timer gekillt wird. Gibt es eine schönere Möglichkeit hierfür?

    Script in eine neue .txt Datei (Editor) kopieren, speichern und den Dateinamen mit einem ".inc" abschließen, dann ists sofort eine Include Datei.

    Wie sieht es in Punkto Ausführungsgeschwindigkeit aus zwischen print und file Funktionen? Nimmt sich das großartig was?


    Danke für die schnelle Antwort!