Anti-Selbstmord

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
  • Code
    Hey leute, ich habe auf einigen servern gesehen das wenn man angeschossen wird und dann selbstmord macht, das dass system dann nicht erkennt das er voher angeschossen wurde.
    Ich zeige euch heute wir ihr einen Intwert in eine PVar packen könnt somit die eigentliche killerid ermitteln könnt.


    Code
    So was wird benötigt.
    Einfache Publics und etwas grundkenntnis vobei das überflüssig ist weil ich das ja erkläre. Ein Public ist ein so genanntes callback



    Code
    Die Folgenden Parameter des Callbacks lauten:[b]playerid[/b], [b]issuerid[/b], [b][color=#0000ff]Float[/color][/b]: [b]amount[/b], [b]weaponid[/b]




    playerid = der getroffen wurde, issuerid = der den hit gelandet hat, Float: amount = Menge/Größe: Anzahl, weaponid = Mit welcher waffe der hit getäigt wurde.


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {

    }


    Code
    So nun nehmen wir die bekannte "if" abfrage.
    if ist auf deutsch übersetzt wenn


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(playerid != 0 && issuerid != INVALID_PLAYER_ID)
    {
    }
    }


    Code
    Damit Fragen wir ab ob der der getroffen wurde und der den hitgelandet haben keine ungestreamten spieler sind.
    
    
    && = Und
    Da gibt es noch was ähnliches bitte nicht verwechseln
    || = oder
    INVALID_PLAYER_ID ist schon ein vorgefertiges #define / setting by SAMP
    Heißt auf Deutsch ÜNGÜLTIGE_SPIELER_ID/NUMMER


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(playerid != && issuerid != INVALID_PLAYER_ID)
    { SetPVarInt(playerid, "LastKillerid", issuerid);
    }
    }



    Code
    So hier haben wir für den Spieler der getroffen wurde eine Vorgefertige string, int funtkion verwendet.
    Aber ich zunächst einmal möchte ich PVar erklären.
    PVar ist eine Vorgefertige Funktion von SAMP mit der man Strings, VariablenInts setzen kann.


    Code
    Man setzt PVar so ein.


    SetPVarInt(userid, "Belibig", Int);


    Code
    Dann gibt es aber noch ähnliche Funtkionen, bitte nicht verwechseln.
    
    
    So nun haben wir da aber auch etwas vergessen.
    Wie müssen abfragen ob der Spieler sich nicht gehited hat. (Durch Fallschaden)


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(playerid != 0 && issuerid != INVALID_PLAYER_ID)
    {
    if(playerid != issuerid)
    {
    SetPVarInt(playerid, "LastKillerid", issuerid);
    }
    }
    }


    Code
    Aber nun müssen wir auch scripten das der genaue name des Hiters speichern lassen.
    
    
    Dazu erstellen wir oben erstmal eine neue TextVariable.


    new Killername[MAX_PLAYERS][24];


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(playerid != 0 && issuerid != INVALID_PLAYER_ID)
    {
    if(playerid != issuerid)
    {
    SetPVarInt(playerid, "LastKillerid", issuerid);
    format(Killername[playerid], 24, "%s", Spielername(issuerid));
    }
    }
    }


    Code
    Dann werdet ihr warscheinlich einen Error haben.
    
    
    Spielername wurde nicht gefunden.
    
    
    Wir erstellen uns nun einen stock.


    stock Spielername(playerid) {
    new name[24];
    GetPlayerName(playerid, name, 24);
    return name;
    }


    So name = die die neue Variable in der Funktion Spielername(Kann Belibig genannt werden)
    GetPlayerName ist eine Funktion von SAMP und beteudet übersetzt BekommeSpielerName



    Code
    [expander][list][*][u][b][color=#000000]Nun gehen wir zu OnPlayerDeath[/color][/b][/u][/list][/expander]


    Code
    Dieses Callback hat folgende Parameter playerid, killerid, reason
    
    
    playerid = der der gestorben ist , killerid = MÖRDER!!! xD, reason = Grund warum er gestorben ist, (Fallschaden etc)


    public OnPlayerDeath(playerid, killerid, reason)
    {

    return 1;
    }


    Code
    Das stinknormale Callback OnPlayerDeath!


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    }
    return 1;
    }


    Code
    Ach ja ich habe ja noch garnicht erklärt was != beteudet.
    != beteudet "nicht"
    Eigentlich beteudet ! auch "nicht"
    Aber das es keine genauere Funk von SAMP ist würden wir dabei ein Warn/Error bekommen.
    
    
    = Beteudet eigentlich Setze aber mit ! verbunden also != beteudet es "nicht"


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    }
    else
    {
    }
    return 1;
    }


    Code
    else beteudet , umgekehrt und ist verbunden mit den if abfragen


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    }
    else
    {
    if(IsPlayerConnected(GetPVarInt(playerid, "LastKillerid") && if(!strcmp(Spielername(GetPVarInt(playerid, "LastKillerid")), Killername[playerid], true))
    {
    // Das Was Passieren soll ;)
    }
    }
    return 1;
    }



    So das war im Großen und Ganzen das Anti - Selbstmord System ;)


    Alles nochmal in einer PWN Reingeklatscht:


    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(playerid && issuerid != INVALID_PLAYER_ID)
    {
    if(playerid != issuerid)
    {
    SetPVarInt(playerid, "LastKillerid", issuerid);
    format(Killername[playerid], 24, "%s", Spielername(issuerid));
    }
    }
    }


    Spielername(playerid) {
    new name[24];
    GetPlayerName(playerid, name, 24);
    return name;
    }


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    }
    else
    {
    if(IsPlayerConnected(GetPVarInt(playerid, "LastKillerid") && if(!strcmp(Spielername(GetPVarInt(playerid, "LastKillerid")), Killername[playerid], true))
    {
    // Das Was Passieren soll ;)
    }
    }
    return 1;
    }


    Mit Freundlichen Grüßen
    MrPawn, und bitte beschwert euch nicht wegen Rechtschreibfehler, Grammatik (Bin Russe :love: )

    4 Mal editiert, zuletzt von Kasakow ()

  • Zitat
    Code
    != beteudet "nicht"
    Eigentlich beteudet ! auch "nicht"
    Aber das es keine genauere Funk von SAMP ist würden wir dabei ein Warn/Error bekommen.
    
    
    = Beteudet eigentlich Setze aber mit ! verbunden also != beteudet es "nicht"

    Deine Erklärungen sind teilweise alles andere als verständlich.
    Du sagtest du seist Russe und hast es nicht so mit der Rechtschreibung und Grammatik. Nur sollte man dann ein Tutorial machen?
    Mir würde das hier kein Stück weiter helfen.

  • Ich finde das Tutorial eher ungeeignet es wirkt fast als ob du selbst nicht genau weist was du machst,...


    - Du Speicherst die Killerid als PvarInt aber den namen nicht als PvarString ?
    - Für was bei einmaligen Aufruf vom Namen einen eigenen Stock?
    ,...


    Verbesser dein Tutorial am besten noch mal ein bisschen

  • Zitat

    if(playerid && issuerid != INVALID_PLAYER_ID)


    playerid mit dem Wert 0 wird die Abfrage nie wahr werden lassen. Was hast du gegen ID 0 ?


    //Edit: Zum Verständnis. Danach habe ich nicht weiter gelesen, da sich der Fehler sicherlich durch das komplette Tutorial ziehen wird und es auch bestimmt noch mehr davon gibt.

  • Ich finde das Tutorial eher ungeeignet es wirkt fast als ob du selbst nicht genau weist was du machst,...


    - Du Speicherst die Killerid als PvarInt aber den namen nicht als PvarString ?
    - Für was bei einmaligen Aufruf vom Namen einen eigenen Stock?
    ,...


    Verbesser dein Tutorial am besten noch mal ein bisschen


    So ;)
    Einmal wegen der ID und dann wegen dem string.
    Z.B ich schiese dich an , ich gehe off ein anderer kommt on und bekommt meinen kill das macht keinen sinn ;)
    PS: Das mit stock ist nützlich
    Ich weis was ich tuhe^^

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • if(playerid && issuerid != INVALID_PLAYER_ID)
    Ist der größte mist den ich je gesehen habe (Goldkiller hats berreits geschrieben).


    Ausgeschrieben würde die Abfrage so aussehen:
    if(playerid == 0 && issuerid != INVALID_PLAYER_ID)

  • Und Vegan dieses Tutorial ist nicht umbedingt für Anfänger

    Ob man Anfänger ist oder nicht, ist egal. Ich selbst bin auch keiner, verstehe deine Ausdrucksweise aber nicht :P
    Nicht-Anfänger aka. Fortgeschrittene sollten mit Vergleichsoperatoren umgehen können und du versuchst diese zu erklären, allerdings nicht sehr gut.
    Ich möchte dein Tutorial nicht schlecht machen, dies sollte nur ein Ansporn sein deine Erklärungen mal ein wenig zu überarbeiten :whistling:

  • if(playerid && issuerid != INVALID_PLAYER_ID)
    Ist der größte mist den ich je gesehen habe (Goldkiller hats berreits geschrieben).


    Ausgeschrieben würde die Abfrage so aussehen:
    if(playerid == 0 && issuerid != INVALID_PLAYER_ID)


    Ne, stimmt nicht. Das wäre richtig bei:
    if(!playerid && issuerid != INVALID_PLAYER_ID)


    Wir haben aber,
    if(playerid && issuerid != INVALID_PLAYER_ID)
    Wäre:
    if(playerid != 0 && issuerid != INVALID_PLAYER_ID)


    Letztendlich ist es egal ob dort
    if( playerid ) oder if( !playerid ) steht. Schließlich wäre beides nicht richtig um playerid zu prüfen auf eine gültige Spieler-ID.


    //Edit:
    Das Tutorial ist meeeega unübersichtlich. Kommentare kann man auch direkt neben den Quellcode schreiben, gibt ja immerhin // bzw /* */. Das du die Kommentare in das Code-Tag gepackt hast lässt das Tutorial vom Aufbau sehr falsch wirken. Dann hast du auch noch BB-Codes verwendet innerhalb von Code bzw PWN. Da erkennt man nichts(!)


  • Danke an dich Goldkiller , wusste garnicht das wenn playerid = 0 ist es als INVALID_PLAYER_ID zählt , naja du bist killer.


    H4rd_B4se Außerdem lauten die Paramter des Callbacks anders. Es gibt jetzt einen mehr, nämlich bodypart. Trägt zwar nichts zum Tutorial bei, aber dass die Leute nicht vergessen ;)


    Danke an dich , so könnte ja man ein sehr einfaches HeadshotSystem etc machen

  • Danke an dich Goldkiller , wusste garnicht das wenn playerid = 0 ist es als INVALID_PLAYER_ID zählt , naja du bist killer.


    Du hast das Problem definitiv nicht verstanden, sonst würdest du so einen Quatsch nicht schreiben.


    Du fragst ab:
    if( playerid ) // = if( playerid != 0 )


    Bedeutet, ALLE Werte sind erlaubt AUßER 0.
    INVALID_PLAYER_ID ist 65535 -> Erfüllt die Bedingung 65535 != 0. Die Sache ist aber, dass INVALID_PLAYER_ID gar kein gültiger Spieler ist. Der Wert darf nicht die Abfrage erfüllen.


    Spieler (ID 0 ) -> Erfüllt die Bedingung 0 != 0 nicht. Spieler ( ID 0 ) kann aber ein echter Spieler sein.


    Seh es ein, dein Code ist falsch. Wenn überhaupt, dann müsstest du prüfen ob playerid nicht INVALID_PLAYER_ID ist.
    Hättest du im Wiki nachgeschaut würdest du sowieso sehen, dass playerid immer ein gültige Spieler-ID ist. Wer soll denn auch sonst melden, dass er angeschossen wird ? Etwa Jemand der gar nicht auf dem Server ist oder Jemand der gar nicht existiert ( INVALID_PLAYER_ID ) ?

    Zitat

    http://wiki.sa-mp.com/wiki/OnPlayerTakeDamage
    playerid The ID of the player that took damage.


    Übrigens gilt die EDIT-Regel auch für Tutorials, somit auch für dich.