Abfragen ob Taste gedrückt bleibt & Objektabfrage

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
  • Hey,


    wie man aus dem Titel villt. entnehmen kann möchte ich wissen wie man abfragen kann ob eine bestimmte Steuerung noch gedrückt wird.
    Also ich brauche das für das Bäume fällen und entfernen.


    1. Wie kann abfragen ob ein Spieler mit der Kettensäge 15 Sekunden durchsägt, und zwischendurch nicht aufhört (oder zu weit weg geht)?


    2. Wie kann ich abfragen, das sobald der Timer 15 Sekunden beendet ist auch nur der Baum verschwindet wo der Spieler dran stand. Also wie kann ich herrausfinden an welchem Object der Spieler steht, und dieses dann entfernen?


    Danke schonmal.


    MfG Tomsen aka byBSE

  • 1.


    Mit diesem define:
    #define HOLDING(%0) \
    ((newkeys & (%0)) == (%0))
    und einem kleinen Timer ;)


    2.
    Mit einer kleinen Schleife:


    for(new i; i<100; i++)//100 ist die Spieleranzahl falls du mehr Spieler auf deinem Server hast, erhöhen
    {
    if(!IsPlayerConnected(i)) continue;
    if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z)) //X, Y, Z ersetzen durch die Koordinaten von dem Baum
    {
    //Hier befindet er sich dann in der Nähe des Objekts
    }
    }


    Viel Spaß damit ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Es sind mehrere Bäume. Muss ich dann IsPlayerInRangeOfPoint(...) || IsPlayerInRangeOfPoint... machen? Also die ODER Funktion einbauen mit allen Koordinaten der Bäume?


    Kannst du mir erstens ein Bisschen genauer erklären, das versteh ich nicht wirklich?

  • Nein, du musst mehrere if Abfragen machen, da ja jeder Baum einzeln verschwinden soll ^^


    Also hier mal ein Bsp:


    for(new i; i<100; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z)) //X, Y, Z ersetzen durch die Koordinaten von dem Baum
    {
    if(15sekgesägt(playerid) == 1)
    {
    DestroyObject(baum1);
    break;
    }
    }
    else if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z))//X, Y, Z ersetzen durch die Koordinaten von Baum 2
    {
    if(15sekgesägt(playerid) == 1)
    {
    DestroyObject(baum2);
    break;
    }
    }
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    Einmal editiert, zuletzt von Kaliber ()

  • Okay. und wenn es 100% sind muss ich eine variable auf eins setzen lassen damit der baum dann verschwindet sobald 100% voll sind?


    Bitte erkläre mir das mit den % nochmal, wie genau ich das jetzt benutzen muss. Ich versteh das nicht. ^^

  • Ich würde es so machen , dass du eine Variable bei dem Befehl auf 0 setzt , dann einen Timer startest , der 1000 Millisekunden Interval hat , und sich immer wiederholt.
    In dem Timer fragst du ab ob er die Taste drückt , wenn ja , fragst du ab ob die Variable <15 ist , wenn ja , erhöhst du sie , wenn nein , machst du dass was passieren soll wenn er den Baum fällt.

  • Mir ist gerade was besseres eingefallen, mache es so:


    //oben im Script
    new btimer[MAX_PLAYERS], gehalten[MAX_PLAYERS];


    //Einen Timer Für alle Spieler setzen
    public OnPlayerConnect(playerid)
    {
    SetTimerEx("Check", 1000, 1, "i", playerid);
    return 1;
    }


    //Der Callback
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if (HOLDING( KEY_FIRE ))
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z)) //Wieder koords ersetzen
    {
    btimer[playerid] = SetTimerEx("Hold", 1000*15, 0, "i", playerid);
    }
    else if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z))//X, Y, Z ersetzen durch die Koordinaten von Baum 2
    {
    btimer[playerid] = SetTimerEx("Hold", 1000*15, 0, "i", playerid);
    }
    }
    else
    {
    KillTimer(btimer[playerid]);
    }
    return 1;
    }


    forward Hold(playerid);
    public Hold(playerid)
    {
    gehalten[playerid] = 1;
    return 1;
    }


    forward Check(playerid);
    public Check(playerid)
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z)) //X, Y, Z ersetzen durch die Koordinaten von dem Baum
    {
    if(gehalten[playerid] == 1)
    {
    DestroyObject(baum1);
    }
    }
    else if(IsPlayerInRangeOfPoint(playerid, 7.5, X, Y, Z))//X, Y, Z ersetzen durch die Koordinaten von Baum 2
    {
    if(gehalten[playerid] == 1)
    {
    DestroyObject(baum2);
    }
    }
    return 1;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ist "HOLDING" direkt ein definierter Begriff in Pawn?


    Nein, deshalb habe ich dir doch schon das Makro geschrieben:


    #define HOLDING(%0) \
    ((newkeys & (%0)) == (%0))


    mfg. ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Wenn ich die Koordinaten bei dem Teil wo es die Objecte löschen soll einsetze kommen ne Menge warnings. Eigentlich muss bei Destroy(Dynamic)Object ja nur die Objektid rein. Aber löscht es mir dann nicht alle?


    Edit: Habe es probiert, wenn ich an die Bäume ran gehe, und säge, passiert nichts.



    Einmal editiert, zuletzt von Tomsen ()