Beiträge von Hagi

    dini_Set(Spielerdatei,"NName",strlen(inputtext));


    dini_Set erwartet als dritten Parameter einen Datentyp String (Zeichenkette).
    Du lieferst da durch strlen die Länge der Zeichenkette als Integer (Zahl wenn man so will)


    dini_Set(Spielerdatei,"NName",inputtext);

    btw wenn du in der Funktion (Public) playerid als Parameter nutzt und diesen im SetTimer nicht übergibst wird dir das Ding nicht liefern was du willst.
    Also entweder SetTimerEx und die id als Integer übergeben oder mit ner for im Public alle Spieler durchlaufen.


    SetTimerEx("Heal", 8000, true,"i",playerid);

    Ich würde warscheinlich den Hunger auch noch stärker als linear anwachsen lassen.
    Also etwa so:


    Zeiteinheit 1: 1 Hunger
    Zeiteinheit 2: 3 Hunger
    Zeiteinheit 3: 9 Hunger
    Zeiteinheit 4: 27 Hunger
    Zeiteinheit 5: 81 Hunger


    f(x)=2x+x


    Oder du lässt es einfach bei einem linearen Anstieg.


    Dann musst du dich fragen wie sich der Hunger auswirken soll.
    Soll man immer einen prozentualen Anteil des Hungers an Lebel verlieren oder immer einen abolouten Wert?


    So jetzt zum script:


    Jeder Spieler benötigt je nach dem wie du es machen willst eine Variable mit dem Hungerwert.
    Dazu kann man entweder eine Variable deklarieren oder man verwendet einfach die PVars von SAMP.


    Dann einen Timer erstellen, welcher in einem bestimmten Intervall alle Spieler durchgeht.


    In diesem Timer-Public überprüfst du den aktuellen Hungerwert und setzt diesen neu.
    Anschließend ziehst du ggf. Health ab.
    Dazu ließt du die Health aus und verringerst den Wert


    new Float:health;
    GetPlayerHealth(playerid,health);
    SetPlayerHealth(playerid,health-Wert[Float]);


    Dann brauchen wir noch die Kehrseite: Das Essen


    Wenn jemand isst o.Ä dann musst du den Hungerwert verringern.

    Problem 1: Den Spieler bei 1 HP freezen


    Das ist fast unmöglich umzusetzen, da z.B. ein Fall aus großer Höhe direkt tötlich ist. Oder man einen Timer mit sehr kleiner Zeitspanne laufen lassen müsste um sonstige Verletzungen (Beschuss o.Ä) zu registrieren.


    Besser ist hier bei OnPlayerDeath die Position zu speichern (ggf. eine Variable auf true setzten, dass der Spieler tot ist) und dann bei OnPlayerSpawn diese Variable abfragen, den Spieler an die gespeicherte Position setzten und freezen (TogglePlayerControllable).


    Problem 2: Den Medics bescheid geben


    Geschieht auch in OnPlayerSpawn. Dort die gespeicherten koordinaten z.B. für einen Marker benutzen, welcher allen Spieler gesetzt wird, welche den Beruf des Sanitäters ausüben. (per for alle Spieler durchgehen).


    Problem 3: Den Verletzten wiederbeleben


    Einen Command erstellen, mit dem man jemanden Wiederbeleben kann. Dazu soll folgendes Sequenz-Struktogramm dienen:


    Code
    Abfrage ob Spieler Medic
    Abfrage ob Spieler neben anderen Spieler (IsPlayerInRangeOfPoint)
    Abfrage ob anderer Spieler tot (Ist die Totvariable gesetzt?)
    Anderen Spieler unfreezen (TogglePlayerControllable)
    Anderen Spieler volle HP geben (sollte aber durch OnPlayerSpawn schon geschehen sein)
    Spieler eine Animation ausführen lassen


    Und das wars auch schon.

    Du brauchst drei Variabeln des Types Float.


    new Float:x,Float:y,Float:z;
    Darin speicherst du die Position
    GetPlayerPos(playerid,x,y,z);
    Diese Variablen überträgst du in die Speicherverwaltung des PVarFloat
    SetPVarFloat(playerid,"x",x);
    SetPVarFloat(playerid,"y",y);
    SetPVarFloat(playerid,"z",z);


    Mit Integern kannst du hier nicht arbeiten, es seie denn du rundest deine Floats auf ganze Zahlen.


    edit:
    Zum Speichern musst du in deiner dini dann natürlich drei Felder für die drei Achsen erzeugen und nicht nur ein Feld.


    Wenn du das ganze auf ein Feld reduzieren willst müsstest du die drei Koordinaten per Trenner (z.B. "|") in einen String schreiben und diesen speichern. Dann beim laden natürlich per split o.Ä. wieder in drei Werte brechen. Das ist aber nicht zu empfehlen, da es sich dann nicht mehr um atomare Werte handelt und das sowieso sehr Laufzeitintensiv ist.

    Integer ist eine Zahl sprich 5 oder 6 oder 14000
    String ist eine Zeichenkette sprich "Hallo Welt" oder "5" oder "6" (Auch "Zahlen" können eine Zeichenkette bilden).


    Probiers mal so


    new einwohner[3],result[16];
    mysql_query("SELECT `Name`, `Einwohnerort` FROM `accounts`");
    mysql_store_result();
    while(mysql_retrieve_row())
    {
    mysql_fetch_field__row(result,"Einwohnerort"); //Error
    if(result == 0) einwohner[0] ++;
    if(result == 1) einwohner[1] ++;
    if(result == 2) einwohner[2] ++;
    }
    mysql_free_result();


    Oder schick mir ma nen Forenlink o.ä zum Plugin (Ich finde das grad net)

    Du musst garnicht jedes zurückgegebene Tupel (Zeile) durchgehen. Es reicht die Anzahl der zurückgegebenen Tupel.
    Welches Plugin nutzt du?


    btw: result wird vorraussichtlich ein String und kein Interger sein.

    Genau so ist richtig. Gerade für sowas bietet sich MYSQL an. Wie bereits gesagt den Query ausführen und die zurückgegebenen Werte auslesen (jedes Plugin bietet da eigene Methoden und Umsetzungen an).

    Ich weiß noch wie es bis zu einer bestimmten Version immer extreme Asynchronitäten gab. Ein Auto stand bei zwei Spieler an zwei verschiedenen Positionen.

    Das mit der Shotgun (wir reden nicht von der Sawn-Off oder?) wird man nicht über den Skill regeln können, da im Singleplayer man die Shotgun nie in einer Hand halten kann, egal welchen Skill man hat.
    Denn der native SetPlayerSkillLevel ist ja die SAMP Umsetzung der Singleplayer-Skills. (Berichtigt mich wenn ich falsch liegen)