Holzfäller Job

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 ich wollte gerade mein Holzfäller Job machen unswa habe ich eine Frage wie mach ich das wenn ich am Baum stehe der Baum stück runter geht beim 2 mal noch ein stück ?
    habe das mit 1 Ausprobiert
    Jeffry:


    so wie hier ab 2:50
    https://www.youtube.com/watch?v=SbLIsmrTTnQ


    enum HolzBaum_enum {
    Float:BX,
    Float:BY,
    Float:BZ,
    Float:BRx,
    Float:BRy,
    Float:BRz
    }


    new Baeume[][HolzBaum_enum] = {
    {989.73, -334.84, 69.26, 0.00, 0.00, 0.00}
    };


    new BaumID[sizeof(Baeume)];


    if(newkeys == KEY_FIRE)
    {
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(GetPlayerWeapon(playerid) == 9)
    {
    if(IsPlayerInRangeOfPoint(playerid,5,Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]))
    {
    MoveObject(BaumID[i],989.73, -334.84, 69.26, 2.5, 0.00, -99.00, 0.00);
    SendClientMessage(playerid,ROT,"Erfolg");
    }
    return SendClientMessage(playerid,ROT,"Nicht am Baum!");
    }
    }
    }

  • So wie ich das sehe wird der dort rotiert.
    Musste einfach einen Timer starten wenn du beginnst, Abfragen vor welchem Baum er steht und ob er die Taste gedrückt hält und somit dann halt immer ein Stück weiter rotieren.



    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Versuche es erst mal so, ob es den Baum beim ersten Schlag umlegt:
    if(newkeys == KEY_FIRE)
    {
    if(GetPlayerWeapon(playerid) == 9)
    {
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5,Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]))
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]-0.1, 0.02, 0.0, 90.0, 0.0);
    SendClientMessage(playerid,ROT,"Erfolg");
    }
    }
    SendClientMessage(playerid,ROT,"Nicht am Baum!");
    }
    }


    Setze die 90.0 gegebenenfalls eins nach link/rechts, je nach dem was du für ein Objekt hast ist das anders.
    Bewegt sich dann was?

  • Versuch es so und sag, was passiert
    if(newkeys == KEY_FIRE)
    {
    if(GetPlayerWeapon(playerid) == 9)
    {
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5,Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]))
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]-0.1, 0.02, 0.0, 90.0, 0.0);
    return SendClientMessage(playerid,ROT,"Erfolg");
    }
    }
    SendClientMessage(playerid,ROT,"Nicht am Baum!");
    }
    }


    Das return ist in der Schleife, damit wenn du Erfolg hast, nicht noch die Errormessage kommt.
    Wenn du das mit dem Anklicken haben möchtest nutze vor der Erfolgsmessage "SelectObject(playerid);"
    Nun kannst unter OnPlayerSelectObject deinen Restlichen Code machen
    http://wiki.sa-mp.com/wiki/OnPlayerSelectObject

  • @[IRP]Steve_McGarrett:
    Jeffry:
    Er wird direkt umgeworfen aber ich will wenn man das erste mal mit der Ketten Saäge darauf haut stück weiter rum geht und beim 2 nocheinmal bis er unten ist
    muss ich dazu jedes mal die Cordinate speichern im enum ?
    z.b so



    beim 1 Schlag auf dem Baum
    dann abfragen ob Baeume[i][fall] == 0; ist und dann
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],0.02, Baeume[i][BRX], Baeume[i][BRY], Baeume[i][BRZ1]);
    Baeume[i][fall] = 1;


    beim 2 Schlag auf dem Baum
    dann abfragen ob Baeume[i][fall] == 1; ist und dann
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],0.02, Baeume[i][BRX], Baeume[i][BRY], Baeume[i][BRZ2]);
    Baeume[i][fall] = 2;
    ...
    bis er unten ist dann Zerstören und so

  • Ich habe das bis Jetze so man geht hin dann Schlägt man auf dem Baum ein bis er Zerstört wird.
    Jetze will ich das dort Holzblöcke Spawnen ( Object id 1463 )
    und da soll man dann hingehen und sich hinhocken und sie dann auf dem Händen Tragen
    und nach einer Bestimmten Zeit die Bäume wieder erstellt wird sagen wir mal so alle 10min werden alle Bäume die sozusagen Abgeholzt wurden wieder erstellt aber wie mach ich das kannst du mir ein Kleinen Denkstoß geben wie ich das am Besten machen kann ?
    und dann will ich ein Punkt machen an dem man z.b ein Befehl eingibt und dann dort steht %i Bäume reif
    Jeffry;
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    BaumID[i] = CreateObject(615, Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ], Baeume[i][BRx], Baeume[i][BRy], Baeume[i][BRz]);
    }


    enum HolzBaum_enum {
    Float:BX,
    Float:BY,
    Float:BZ,
    Float:BRx,
    Float:BRy,
    Float:BRz,
    Float:BRx1,
    Float:BRy1,
    Float:BRz1,
    Float:BRx2,
    Float:BRy2,
    Float:BRz2,
    Float:BRx3,
    Float:BRy3,
    Float:BRz3,
    Float:BRx4,
    Float:BRy4,
    Float:BRz4,
    Float:BRx5,
    Float:BRy5,
    Float:BRz5,
    Float:BRx6,
    Float:BRy6,
    Float:BRz6,
    Float:BRx7,
    Float:BRy7,
    Float:BRz7,
    Float:BRx8,
    Float:BRy8,
    Float:BRz8,
    Float:BRx9,
    Float:BRy9,
    Float:BRz9,
    Baumvar,
    Baumerstellt
    }


    new Baeume[][HolzBaum_enum] = {
    {989.73, -334.84, 69.26, 0.00, 0.00, 0.00,10.00, 0.00, 0.00, 20.00, 0.00, 0.00,30.00, 0.00, 0.00,40.00, 0.00, 0.00,50.00, 0.00, 0.00,60.00, 0.00, 0.00, 70.00, 0.00, 0.00, 80.00, 0.00, 0.00,90.00, 0.00, 0.00}
    };


    new BaumID[sizeof(Baeume)];


    if(newkeys == KEY_FIRE)
    {
    if(GetPlayerWeapon(playerid) == 9)
    {
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5,Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ]))
    {
    if(Baeume[i][Baumvar] == 0)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx1], Baeume[i][BRy1], Baeume[i][BRz1]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 1)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx2], Baeume[i][BRy2], Baeume[i][BRz2]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 2)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx3], Baeume[i][BRy3], Baeume[i][BRz3]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 3)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx4], Baeume[i][BRy4], Baeume[i][BRz4]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 4)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx5], Baeume[i][BRy5], Baeume[i][BRz5]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 5)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx6], Baeume[i][BRy6], Baeume[i][BRz6]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 6)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx7], Baeume[i][BRy7], Baeume[i][BRz7]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 7)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx8], Baeume[i][BRy8], Baeume[i][BRz8]);
    Baeume[i][Baumvar] ++;
    return 1;
    }
    if(Baeume[i][Baumvar] == 8)
    {
    MoveObject(BaumID[i],Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ],2.0, Baeume[i][BRx9], Baeume[i][BRy9], Baeume[i][BRz9]);
    Baeume[i][Baumvar] ++;
    DestroyObject(BaumID[i]);
    Baueme[i][Baumerstellt] = 1;
    return 1;
    }
    }
    }
    }
    }

  • Zum Respawn der Bäume:
    Dort wo du:
    DestroyObject(BaumID[i]);
    machst, fügst du danach das ein:
    BaumID[i] = -1;


    Und dann in dem Timer, der die Bäume wieder erstellt:
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(BaumID[i] == -1) BaumID[i] = CreateObject(615, Baeume[i][BX], Baeume[i][BY], Baeume[i][BZ], Baeume[i][BRx], Baeume[i][BRy], Baeume[i][BRz]);
    }


    Was meinst du mit dem Punkt und den reifen Bäumen? Wie definierst du einen reifen Baum? Fällbare Bäume?
    Das wäre dann:
    for(new i = 0; i < sizeof(Baeume); i++)
    {
    if(BaumID[i] != -1) reifeBaeume++;
    }

  • Ok also ich bin jetze soweit das Der Baum gelöscht wurde und ich DIe Holzplanken erstellt habe jetze will ich das der Spieler zuden Holzplanken hingeht und sich dort mit c Hinhockt und wenn er dann ALT drückt das er dann die Holzplanken in die Hände nimmt


    ist das so ok oder wie wäre es Besser ?

    new Holzblock[MAX_PLAYERS];


    Holzblock[playerid] = CreateObject(1463,Baeume[i][BX],Baeume[i][BY],Baeume[i][BZ],0,-13.0000,0.0000,400);

  • Das kannst du so machen, ja. Ob es besser geht kann ich dir so nicht direkt sagen, da ich nicht weiß was du alles damit vor hast.
    Aber mache es einfach mal so und schaue ob es klappt, was du vor hast. Besser machen kann man es noch immer, wenn es nicht geht.

  • Jeffry:
    so geht es glaube net weil ich habe es jetze so
    und ich will dann noch Abfragen ob der Spieler in der Nähe von einem Holzblock ist und wenn ja will ich fragen ob es sein Holzblock ist damit er z.b nicht den von anderen nehmen kann
    wie kann ich das am besten machen ?
    if(newkeys == KEY_FIRE)
    {
    if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK)
    {
    }
    }

  • Doch, dann ist es sogar gut so wie du es machst.


    Du machst dort dann eine Schleife durch alle Spieler und fragst ab, oder der Spieler in der Nähe eines Balken-Objektes ist (GetObjectPos & IsPlayerInRangeOfPoint). Falls ja, dann fragst du ab ob i == playerid ist. Falls nein ist es nicht sein Balken, falls ja kann er ihn aufnehmen. Ist er in keiner Nähe eines Balkens, dann schickst du die entsprechende Meldung, oder machst gar nichts.

  • Beitrag von reaL. ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Jeffry:
    ich bin jetze soweit das ich den Baumgefällt habe dann das Holz aufgenommen habe und jetze will ich 5 Holzblöcke auf mein Car laden wie Define ich das am Besten das ich die wieder Löschen kann ?



    hier ist ein Problem ich gebe dem User die Kettensäge nehm das Holz auf und wenn ich es abgeladen habe ist sie wieder weg aber wieso ?
    und kann man das so machen das man nicht immer die Ketten säge hat
    sprich das man auch zur faust wechseln kann und zum baum laufen kann und dann wieder zur Kettensäge wechseln ?

    //aufnehmen
    if(Holz[playerid][Holz_Aktiv])
    {
    if(Holz[playerid][Aholz] < 5)
    {
    Holz[playerid][Aholz] ++;
    DisablePlayerCheckpoint(playerid);
    RemovePlayerAttachedObject(playerid, 0);
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_NONE);
    if(Holz[playerid][Aholz] == 5)
    {
    SendClientMessage(playerid,ROT,"Genug aufgeladen!");
    return 1;
    }
    return 1;
    }
    }


    //Starten
    if(Holz[playerid][Holz_Aktiv] == false)
    {
    Holz[playerid][Holz_Aktiv]=true;
    Holzcar[playerid] = GetPlayerVehicleID(playerid);
    SendClientMessage(playerid,ROT,"Du beginnst dein Job als Holzfäller!");
    GivePlayerWeapon(playerid, 9, 10);
    return 1;
    }
    else
    {
    return 1;
    }

  • 1.)
    new holzID[MAX_PLAYERS][5];
    Der zweite Index ist dann die Anzahl der abgelieferten Hölzer. Beachte, dass du bei 0 anfangen musst (0 bis 4).


    2.)
    Die Kettensäge ist weg? Kann ich dir nicht sagen warum, gib sie ihm einfach wieder.


    3.)
    Wenn du ihm eine Kettensäge gibst, dann kann er die ganz normal weg-switchen, mit Q und E.

  • Ich finde er sollte das Holzfällen mit Animationen machen, also die Kettensäge ihm mit einer Animation geben, jedoch danach Kettensäge verschwinden lassen.. Weil sonst User oder besser gesagt SDM lustige auf dumme Ideen kommen und die Kettensäge als Waffe benutzen gegen andere User..