[EASY] Schusstazer erstellen

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
  • Guten Tag liebe Community,
    da mein altes Tutorial im Archiv gelandet ist und die Variante, die ich damals genutzt habe nicht wirklich die beste war, erstelle ich nun ein neues Tutorial.


    Ihr benötigt:
    - Grundkenntnisse
    - mindestens SA:MP 0.3d


    Um den Schusstazer zu verwenden müsst ihr eine Deagle in der Hand haben und die mittlere Maustaste drücken, während ihr jemanden anvisiert, fangen wir mal an:


    Zuallererst suchen wir den Callback OnPlayerKeyStateChange in unserem Script.
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    return 1;
    }


    Jetzt wollen wir überprüfen, ob der Spieler die mittlere Maustaste drückt, wenn ja wollen wir wissen, ob der Spieler eine Deagle in der Hand hat, wenn ja überprüfen wir, ob der Spieler jemanden anvisiert, wenn nicht soll die Nachricht "Du hast daneben geschossen" zurückgegeben werden.


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_LOOK_BEHIND)//Überprüft ob der Spieler "KEY_LOOK_BEHIND" ( mittlere Maustaste ) gedrückt hat.
    {
    if(GetPlayerWeapon(playerid) == 24)//Überprüft ob die von des Spielers, welche er in der Hand trägt, die ID 24 ( Deagle ) hat.
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)//Überprüft ob GetPlayerTargetPlayer NICHT INVALID_PLAYER_ID zurück gibt, das wird zurückgegeben, wenn man niemanden anvisiert
    {
    //Alles was hier steht wird aufgerufen, wenn ich die mittlere Maustaste drücke, eine Deagle in der Hand hab und jemanden anvisiere
    }
    else return SendClientMessage(playerid,0xFF000000,"Du hast daneben geschossen.");//Wenn doch INVALID_PLAYER_ID zurückgegeben wird, wird eine Nachricht mit "Du hast daneben geschossen." zurückgegeben
    }
    }
    return 1;
    }


    Gut, die ganzen Abfragen sind nun fertig, jetzt müssen wir nur noch bestimmen, was überhaupt passieren soll.


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_LOOK_BEHIND)
    {
    if(GetPlayerWeapon(playerid) == 24)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    new string[64],name[MAX_PLAYER_NAME+1],rnddmg;//Erstellt eine String names string mit der Größe 64, einen String namens name mit der Größe von MAX_PLAYER_NAME ( 24 ) + 1 ( 25 ) und einen Integer namens rnddmg.
    new target = GetPlayerTargetPlayer(playerid); //Erstellt die Variable target und schreibt die ID des anvisierten Spielers hinein.
    rnddmg = random(10); //Ändert den Inhalt von rnddmg zu einem zufälligen Wert zwischen 0 und 10
    GetPlayerName(target,name,sizeof(name));//Speichert den Spielernamen der ID target in den String "name".
    format(string,sizeof(string),"Du hast %s mit deiner Tazerpistole getroffen und ihm %d Schaden hinzugefügt.",name,rnddmg);//Formatiert einen Text
    GameTextForPlayer(target,"~r~Tazed",2000,0);//Gibt einen GameText für target aus
    SendClientMessage(playerid,0xFF000000,string);//Sende eine Nachricht mit dem Inhalt aus dem String "string"
    TogglePlayerControllable(target,0);//freezt target
    new Float:health;//erstellt die Variable "health"
    GetPlayerHealth(target,health);//gibt die aktuelle Health des Spielers aus und schreibt sie in die Variable health
    SetPlayerHealth(target,health-rnddmg);//Setzt die Health des Spielers auf health(vorherige Leben des Spielers)-rnddmg(zufälliger Wert zwischen 0 und 10)
    SetTimerEx("tazer",5000,0,"i",target);//Startet einen 5 Sekunden langen Timer
    }
    else return SendClientMessage(playerid,0xFF000000,"Du hast daneben geschossen.");
    }
    }
    return 1;
    }


    Jetzt müssen wir nur noch den Callback "tazer" schreiben und forwarden, denn dieser wird aufgerufen, wenn der Timer von oben abgelaufen ist. Also schreiben wir über den bisherigen Code:



    forward tazer(target); //Das kommt nach oben ins Script, aber die Includes
    public tazer(target)//Das kommt über den bisherigen Code
    {
    TogglePlayerControllable(target,1);//Entfreezt den Spieler
    return 1;
    }


    Das war's erstmal.
    Wenn ihr Fehler findet sagt Bescheid.


    Mit freundlichen Grüßen
    Key

    20€ geschenkt - bei Fragen gerne PN an mich


    Mehr über reCyclix
    reCyclix - more than recycling
    reyCyclix ist ein polnisches Recyclingunternehmen, welches jedem die Möglichkeit bietet, sich an ihrem Geschäftsmodell gewinnbringend zu beteiligen. Normalerweise passiert das, in dem man eine beliebige Summe in Kunststoffmüll investiert, allerdings schenkt reCyclix zur Zeit noch jedem neuem Nutzer 20€, die zur Investition genutzt werden können.

  • Finde ich eine gute Idee.
    Habe es zwar noch nicht getestet, werde ich aber auf jeden fall mal machen!
    Ich persönlich hätte das aber ned released da jetzt jetzt 0815 Server sagen kann: "Wir haben einen Schusstazer", naja.


    9/10 :thumbup:

  • Eben nicht NicoWiss, weil man nicht auf ihn schießt, sondern nur ein Tazer"schuss" auf ihn gibt, ohne dass er von der Deagle Leben abgezogen bekommt, sondern er bekommt nur einen zufälligen Wert abgezogen, der die Schmerzen des Tazers simulieren soll.

  • Eben nicht NicoWiss, weil man nicht auf ihn schießt, sondern nur ein Tazer"schuss" auf ihn gibt, ohne dass er von der Deagle Leben abgezogen bekommt, sondern er bekommt nur einen zufälligen Wert abgezogen, der die Schmerzen des Tazers simulieren soll.


    Geht trotzdem bei OnPlayerTakeDamage da im Callback die schöne Funktion existiert wieviel Leben er verloren hat das kannst ihm wieder geben und ggf. random wieder abziehen wegen der Schmerzen. Und schwups 40 Zeilen schreibarbeit erspart

  • NicoWiss, du weißt aber dass das Insgesamt 32-Zeilen sind, und durch deine System sich höchsten 5 Zeilen verringern würden?


    EDIT: Und bei OPTD musst du mit der rechtenMaustaste oder STRG abschießen, damit es als Schuss gilt, und erst dann wird abgefragt ob getroffen wurde , was unrealistisch ist.
    Bei diesem System visiert man an, und drückt das Mausrad (!) das ist meiner Meinung realisitischer und macht auch kein "Bäääng".

  • NicoWiss, du weißt aber dass das Insgesamt 32-Zeilen sind, und durch deine System sich höchsten 5 Zeilen verringern würden?


    EDIT: Und bei OPTD musst du mit der rechtenMaustaste oder STRG abschießen, damit es als Schuss gilt, und erst dann wird abgefragt ob getroffen wurde , was unrealistisch ist.
    Bei diesem System visiert man an, und drückt das Mausrad (!) das ist meiner Meinung realisitischer und macht auch kein "Bäääng".


    Das Problem ist das ich dass dann garnet mit eine Waffe machen kann, da sie dann noch normal schiesst ;D

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Dieses System ist nicht umbedingt das beste.
    Der "Tazerer" hat da einen unglaublichen Vorteil damit.
    Nämlich wird hier nur überprüft, ob der mit dem Tazer einen Spieler anvisiert und die mittlere Maustaste drückt.
    Wenn das stimmt, hat jedoch der Spieler keine Chance wie beim einem echten Schuss mehr auszuweichen, d.h. das Tazern wird hierbei enorm vereinfacht, da der mit dem Tazer nicht mal treffen muss, sondern nur den Spieler anvisieren muss.


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Dieses System ist nicht umbedingt das beste.
    Der "Tazerer" hat da einen unglaublichen Vorteil damit.
    Nämlich wird hier nur überprüft, ob der mit dem Tazer einen Spieler anvisiert und die mittlere Maustaste drückt.
    Wenn das stimmt, hat jedoch der Spieler keine Chance wie beim einem echten Schuss mehr auszuweichen, d.h. das Tazern wird hierbei enorm vereinfacht, da der mit dem Tazer nicht mal treffen muss, sondern nur den Spieler anvisieren muss.


    LG


    Find ich ebenfalls.
    Sollte unter OnPlayerTakeDamage gemacht werden :/
    Sonst sieht es ganz gut aus, nützlich für Anfänger ^^