[TuT] Pfandflaschen System

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
  • Kleine Info vorweg dies ist mein 1 Tutorial.
    Was brauchen wir:
    1. Enum
    2. news
    3. erstellen der Objecte
    4.Timer
    5. Befehl
    6. Dialog



    1.enum
    Als aller erstes erstellen wir ein enum.


    enum muellEnum{


    }


    Nun befüllen wir den/das Enum mit:
    Pfand Dies bewirkt das wir diese Anzahl an Pfandflaschen finden.
    Float:m_x Dies sind die Koordinaten des Objectes und wird für den Befehl verwendet
    Float:m_y Dies sind die Koordinaten des Objectes und wird für den Befehl verwendet
    Float:m_z Dies sind die Koordinaten des Objectes und wird für den Befehl verwendet
    Float:m_rx Dies sind die Rotations Koordinaten des Objectes
    Float:m_ry Dies sind die Rotations Koordinaten des Objectes
    Float:m_rz Dies sind die Rotations Koordinaten des Objectes


    enum muellEnum{
    pfand,
    Float:m_x,
    Float:m_y,
    Float:m_z,
    Float:m_rx,
    Float:m_ry,
    Float:m_rz
    }


    So nun haben wir schon mal das enum aber um es zu benutzen brauchen wir noch ein new.


    2.news

    So das muell steht für das wir es einfach muell genannt haben ihr könnt es auch anders nennen z.b flaschen.
    muellEnum steht dafür das das Script weiß von welchen enum wir das gerade abziehen/benutzen.
    new muell[][muellEnum] = {


    };


    jetzt fehlen natürlich noch die Informationen.
    new muell[][muellEnum] = {
    { 2,-2271.85278, -116.37270, 34.94200, 0.00000, 0.00000, 0.00000},
    { 2,-2278.18530, -116.31293, 34.94200, 0.00000, 0.00000, 0.00000},
    { 2,-2285.54272, -116.49574, 34.94200, 0.00000, 0.00000, 0.00000}
    };
    Die 2 steht für die anfangs Pfandflaschen in der Mülltonne mann kann auch die Mülltonnen mit unterschiedlichen Pfandflaschen spawnen/startenlassen
    Danach kommen die Koordinaten eures Objectes hier habe ich nur 3 neben einander erstellt.
    Am besten erstellt ihr die Mülltonnen mit einen Editor.
    Dies sollte kein Problem sein.


    Nun erstellen wir noch ein new
    new Flaschen[MAX_PLAYERS];
    Dies brauchen wir um unsere Pfandflaschen die wir schon gesammelt haben abzufragen.
    Ihr könnt die Pfandflaschen die ihr schon gesammelt habt abspeichern lassen aber das mache ich nicht in diesem Tutorial mit rein.


    So der Grundbaustein ist schon gesetzt.


    3.Erstellen der Mülltonnen
    Dazu gehen wir unter OnGameModeInit.
    Nun was brauchen wir wir brauchen eine Schleife die die Mülltonnen abfragt die wir oben alle zu stehen haben.
    Das geht so.
    for(new i=0; i<sizeof(muell); i++)
    {


    }

    Dafür steht muell für unser new was wir oben erstellt haben.
    Nun müssen wir das Object noch erstellen lassen.
    Die 1337 steht für die ID des Objectes hier ist es die blaue Mülltonne.
    muell[m_x],muell[m_y],muell[m_z] Stehen für die Koordinaten des Objectes.
    muell[m_rx],muell[m_ry],muell[m_rz] Stehen für die Rotation des Objectes


    CreateDynamicObject(1337,muell[i][m_x],muell[i][m_y],muell[i][m_z],muell[i][m_rx],muell[i][m_ry],muell[i][m_rz]);//man kann auch CreateObject benutzen


    Dann sollte es so aussehen
    for(new i=0; i<sizeof(muell); i++)
    {
    CreateDynamicObject(1337,muell[i][m_x],muell[i][m_y],muell[i][m_z],muell[i][m_rx],muell[i][m_ry],muell[i][m_rz]);//man kann auch CreateObject benutzen
    }


    So nun lassen wir die Objecte schon erstellen.


    4.Timer
    Wir brauchen einen Timer damit die Mülltonne ja Pfandflaschen dazu bekommen.
    Dafür brauchen wir ein forward das wir einfach oben im Script erstellen.
    forward Pfanddazu();
    Den Timer lassen wir am besten auch unter
    OnGameModeInit starten lassen.


    Das Pfanddazu ist einfach der Name des aufgerufenen Publics das wir noch erstellen werden.
    Die 30000 steht dafür das der Timer/Public nach 30 Sekunden abgerufen wird.
    Das False steht dafür das er nur ein mal Läuft.Warum seht ihr noch.Ihr könnt ihn auch Natürlich auf true setzen.
    SetTimer("Pfanddazu", 30000, false);


    So was soll passieren wen der Timer/Public abgerufen wird nun ja wir brauchen wieder eine schleife.
    public Pfanddazu()
    {
    for(new i=0; i<sizeof(muell); i++)
    {


    }
    return 1;
    }
    So was soll dann passieren?
    wir setzen den pfand den wir oben beim enum zu stehen haben +1 oder +eure zahl die ihr wollt das bedeutet das in der Mülltonne nun 1 Pfandflasche dazu kommt.
    public Pfanddazu()
    {
    for(new i=0; i<sizeof(muell); i++)
    {
    muell[i][pfand]+=1;
    }
    return 1;
    }


    Da wir aber oben den timer mit False gestzt haben machen wir nun das Noch.
    Wir setzen den Timer Random damit es nicht immer einheitlich ist wie Pfand dazu kommt.
    Das machen wir so.
    new randomsekunden[]=
    {
    30,
    60,
    90,
    180,
    240,
    300
    };
    Die zahlen stehen für die Sekunden zeit z.b 30 das bedeutet das der Timer/Public in 30 Sekunden abgerufen wird bei 60 in 60 Sekunden.
    Wann Pfandflaschen dazu kommen sollen ist euch überlassen.Einfach nur die zahlen ändern.


    Damit es aber auch gerandomt wird brauchen wir noch das hier.
    new randomtime = random(sizeof(randomsekunden));
    Die randomsekunden stehen für das new was wir gerade gemacht haben mit den random zahlen.


    Schön und Gut was ist aber mit dem Timer??
    Der Timer ist ganz einfach den setzt ihr unter dem random.


    SetTimer("Pfanddazu", 1000*randomsekunden[randomtime], false);
    So das randomsekunden[randomtime] ist einfach eine zahl von allen zahlen die wir eingetragen haben rausgesucht also gerandomt.
    Die 1000* steht dafür dass wir schon 1 Sekunde haben und das mal der random zahl. Da ja der Timer in Millisekunden geht.


    So sollte es dann zum Schluss aussehen.
    public Pfanddazu()
    {
    for(new i=0; i<sizeof(muell); i++)
    {
    muell[i][pfand]+=1;
    }
    new randomsekunden[]=
    {
    30,
    60,
    90,
    180,
    240,
    300
    };
    new randomtime = random(sizeof(randomsekunden));
    SetTimer("Pfanddazu", 1000*randomsekunden[randomtime], false);
    return 1;
    }


    5.Befehl
    Nun zum befehl den befehl erstelle ich mit einem ocmd den nennen wir mal pfandsuchen.
    als erstes brauchen wir wieder eine schleife das Heist.
    ocmd:pfandsuchen(playerid,params[])
    {
    for(new i=0; i<sizeof(muell); i++)
    {


    }
    }


    So nun müssen wir abfragen ob der Spieler in Reichweite ist das geht so.
    if(IsPlayerInRangeOfPoint(playerid,3,muell[i][m_x], muell[i][m_y], muell[i][m_z]))


    Dann müssen wir abfragen ob noch Pfandflaschen in der Mülltonne sind.
    if(muell[i][pfand]>=1)
    Ihr könnt die 1 auch verändern je nach dem mann erst Pfandflaschen finden soll z.b erst nach 5 soll man welche finden.


    Falls Pfandflaschen drinne sin lassen wir unsere Flaschen[] die wir oben definiert haben + die Pfandflaschen die in der mülltonne sind setzen.
    Flaschen[playerid]+=muell[i][pfand];


    Wir können auch noch eine Nachicht schicken lassen das wir welche gefunden haben z.b so
    new string[150];
    format(string,sizeof(string), "~w~Du hast ~g~%i ~w~Pfandflschen gefunden", muell[i][pfand]);
    GameTextForPlayer(playerid, string, 3000, 4);
    Dann Müssen wir die Pfandflaschen der Mülltonne wieder auf 0 setzten das geht so.
    muell[i][pfand]=0;
    Das wärs auch schohn
    Hier seht ihr wie ich es gemacht habe.

    Spoiler anzeigen
    ocmd:pfandsuchen(playerid,params[])
    {
    for(new i=0; i<sizeof(muell); i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,3,muell[i][m_x], muell[i][m_y], muell[i][m_z]))
    {
    if(muell[i][pfand]>=1)//kann man verändern z.b da man erst ab 5 flaschen diese findet
    {
    Flaschen[playerid]+=muell[i][pfand];
    new string[150];
    format(string,sizeof(string), "~w~Du hast ~g~%i ~w~Pfandflschen gefunden", muell[i][pfand]);
    GameTextForPlayer(playerid, string, 3000, 4);
    muell[i][pfand]=0;
    // mann kann noch eine Animation hinzufügen
    return 1;
    }
    else
    {
    SendClientMessage(playerid,rot,"Die Mülltonne ist leer");// müsst ihr selber anpassen
    return 1;
    }
    }
    }
    return SendClientMessage(playerid,rot,"Du bist bei keiner Mülltonne");//falls alle i durch sind kommt dass man an keiner mülltonne ist
    }


    6.Dialog
    Jetzt brauchen wir noch einen Ort wo mann die Pfandflaschen verkaufen kann. Dies kann mann mit befehl oder Dialog machen ich mache es hier mit Dialog.
    Aber dafor müssen wir noch den Dialog definieren.
    #define DIALOG_LADEN 0

    Die Zahl müsst ihr anpassen.


    Nun müsst ihr ihn noch anzeigen lassen wo müsst ihr selber wissen.
    ShowPlayerDialog(playerid,DIALOG_LADEN,DIALOG_STYLE_LIST,"24/7 Laden","Pfandflaschen verkaufen","Auswählen","Abbrechen");
    Nun gehen wir unter OnDialogResponse
    und erstellen ihn.
    was müssen wir alles abfragen wir müssen abfragen welcher dialog??
    if(dialogid==DIALOG_LADEN)


    ob er überhaupt Flaschen dabei hat das machen wir mit
    if(Flaschen[playerid]>=1)


    wenn er welche dabei hat rechnen wir nun seine Flaschen die er dabei hat mal irgend eine zahl die ihr wollt ich nehme mal 5.
    new pfandgeld=Flaschen[playerid]*5;//preis kann angepass werden das *25 steht für mal 25 also anzahl deiner pfanflschen mal 25


    Nun geben wir ihn das geld und setzen seine Flaschen wieder auf 0.Euren System anpasse.
    sInfo[playerid][geld]+=pfandgeld;
    Flaschen[playerid]=0;
    Nun kann man noch eine Message senden lassen das ist euch aber überlassen.


    So sieht es bei mir aus

    Spoiler anzeigen
    if(dialogid==DIALOG_LADEN)
    {
    if(response)
    {
    if(listitem==0)//bei pfand
    {
    if(Flaschen[playerid]>=1)
    {
    new string[180];
    new pfandgeld=Flaschen[playerid]*5;//preis kann angepass werden das *25 steht für mal 25 also anzahl deiner pfanflschen mal 25
    sInfo[playerid][geld]+=pfandgeld;
    format(string, sizeof(string), "-------------Kassenbong---------------");
    SendClientMessage(playerid,weiss,string);
    format(string, sizeof(string), "{FAFAFA}Du hast %d Flaschen für %d{00BB00}$ {FAFAFA}verkauft",Flaschen[playerid],pfandgeld);
    SendClientMessage(playerid,weiss,string);
    Flaschen[playerid]=0;
    }
    else
    {
    SendClientMessage(playerid,rot,"Du hast keine Pfandflaschen");
    }
    }
    else
    {
    SendClientMessage(playerid,weiss,"Beären sie uns bald wieder");
    }
    }
    }


    Ich hoffe ich konnte euch Helfem :thumbup: :thumbup:

  • aber muss das pfandgeld nicht so ?


    new pfandgeld=Flaschen[playerid]/5;


    weil *5 da gibt er mir bei 6 Flaschen nur 30



    //edit und hie rnoch ein vorschlag von mir ;)



    for(new i=0; i<sizeof(muell); i++)
    {
    CreateDynamicObject(1337,muell[i][m_x],muell[i][m_y],muell[i][m_z],muell[i][m_rx],muell[i][m_ry],muell[i][m_rz]);//man kann auch CreateObject benutzen
    Create3DTextLabel("/pfandsuchen", 0x6495EDFF,muell[i][m_x],muell[i][m_y],muell[i][m_z], 15.0,0);
    }

  • @Trafico
    das mit dem Pfandgeld
    also
    new pfandgeld=Flaschen[playerid]*5;
    kannst du anpasswen wie du willst
    aber
    new pfandgeld=Flaschen[playerid]/5;
    würde doch heissen seine Flaschen druch 5 also für 5 flaschen kriegt er ein Euro z.b
    aber jeder wie er will


    und dein vorschlag ist klasse habe ich wohl vergessen ;D

  • beides geht irgend wie nicht
    6X25 = 150
    bekomme aber 30 bei metode *5
    und 1 bei /5 ^^


    ich weiß auch nciht mehr weiter