[Problem] mit Drogensystem

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
  • Hallo Brotfische,


    Ich habe 2 Probleme bei meinem Drogensystem, undzwar wenn man /anpflanzen eingibt wird ein CreatObject und ein Timer erstellt, wenn ich jetzt 2 mal /anpflanzen eingeben, wird der erste Timer gestoppt.... und Problem Nummer 2: wenn die Drogen bei 100% sind soll ein Pickup erstellt werden, aber da passiert leider nichts, das Object löscht sich aber es passiert einfach nichts, der Pickup wird nicht ersrtellt :(


    Codes:
    enum drogenenum
    {
    Float:dX,
    Float:dY,
    Float:dZ,
    }
    //new´s
    new dInfo[MAX_PLAYERS][drogenenum];
    new drogentimer[MAX_PLAYERS];
    new drogensamen[MAX_PLAYERS];
    new drogenpickup[MAX_PLAYERS];
    new drogenobject[MAX_PLAYERS];
    new Text3D:drogentext[MAX_PLAYERS];
    new drogenprozent[MAX_PLAYERS];
    new angepflanzteDrogen[MAX_PLAYERS];

    ocmd:anpflanzen(playerid,params[])
    {
    if(drogensamen[playerid]!=1)return SendClientMessage(playerid,C_Error,"Du hast keine Drogensamen!");
    if(GetPlayerInterior(playerid)==0)
    {
    new Float:x,Float:y,Float:z,Float:r;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid, Float:r);
    dInfo[playerid][dX]=x;
    dInfo[playerid][dY]=y;
    dInfo[playerid][dZ]=z;
    drogenobject[playerid]=CreateObject(647, dInfo[playerid][dX], dInfo[playerid][dY], dInfo[playerid][dZ]-1.2, 0.0, 0.0, r);
    drogentext[playerid]=Create3DTextLabel("0 %",C_Weiß,dInfo[playerid][dX],dInfo[playerid][dY],dInfo[playerid][dZ],10.0,0,0);
    SendClientMessage(playerid,C_Gruen,"Du hast 1 Drogenpflanze angebaut.");
    angepflanzteDrogen[playerid]=1;
    drogenprozent[playerid]=0;
    drogentimer[playerid]=SetTimerEx("drogen",1000,1,"i",playerid);
    return 1;
    }
    else
    {
    SendClientMessage(playerid,C_Error,"Du kannst keine Drogen im Interior anpflanzen!");
    }
    return 1;
    }


    public drogen(playerid)
    {
    if(drogenprozent[playerid]==100)
    {
    DestroyObject(drogenobject[playerid]);
    drogenpickup[playerid]=CreatePickup(19473,0,dInfo[playerid][dX],dInfo[playerid][dX],dInfo[playerid][dX],GetPlayerVirtualWorld(playerid));
    KillTimer(drogentimer[playerid]);
    Delete3DTextLabel(drogentext[playerid]);
    }
    else
    {
    new stringlol[60];
    drogenprozent[playerid]++;
    format(stringlol,sizeof(stringlol),"%i %",drogenprozent[playerid]);
    Update3DTextLabelText(drogentext[playerid],C_Weiß,stringlol);
    }
    return 1;
    }



    Ich hoffe es kann mir jemand helfen :D


    MFG German_ScripterHD


    Mit freundlichen Grüßen
    German_ScripterHD

  • oh :( ja ich hab es gesehn, Danke :D, das mit dem Pickup klappt jetzt, aber das mit dem Timer klappt immer noch net....


    Wenn man /anpflanzen eingibt, dann wird das Object erstellt und der Timer lauft dann.... wenn ich jetzt nochmal /anpflanzen eintippe wird wieder das Obejct erstellt, aber der Timer 1 wird gestoppt :(


    Ich hoffe es kann mir jemand helfen :D


    MFG German_ScripterHD


    Mit freundlichen Grüßen
    German_ScripterHD

  • Ok.


    Soll es ein Limit pro Spieler geben, oder ein Limit im Server?
    Also jeder Spieler kann maximal zum Beispiel 10 gleichzeitig anpflanzen, oder im Server dürfen gleichzeitig maximal zum Beispiel 100 Drogen angepflanzt werden, egal von wem?
    Wie soll es sein?

  • Ich zeige es dir mal, so wie ich es machen würde:



    Oben im Script
    new Pflanzen[MAX_PLAYERS]; // definiert eine Playervariable


    Nun baust du beim "Pflanzen-Befehl" folgendes ein:


    if(Pflanzen[playerid] >= 10) return SCM(playerid,FARBE,"Du kannst maximal 10 Pflanzen pflanzen!");


    Sobald ein Spieler eine Pflanze gepflanzt hat, addierst du der Variable "Pflanzen" einen Wert +.


    Sprich:


    Pflanzen[playerid] ++;

    Meine Werke

  • Naja, ich glaube nicht, dass er damit viel anfängt, das ist ja nur ein Zähler, der hier gar nichts bringt, denn er kann die fertigen Drogen ja in unterschiedlicher Reigenfolge abholen. ;)



    Grundsätzlich geht es ja darum, einen Code zu haben, der für alle X erlaubten "Anpflanzungen" das gleiche macht. Das wird über ein entsprechendes Array gemacht (wir fügen einfach "[MAX_ANPFLANZEN]" hinter den Variablen an, bei der Deklaration.
    Außer bei den zwei markierten, denn dies sind Zähler, die für alle X entsprechend sind.


    #define MAX_ANPFLANZEN 10
    enum drogenenum
    {
    Float:dX,
    Float:dY,
    Float:dZ,
    }
    //new´s
    new dInfo[MAX_PLAYERS][MAX_ANPFLANZEN][drogenenum];
    new drogentimer[MAX_PLAYERS][MAX_ANPFLANZEN];
    new drogenstatus[MAX_PLAYERS][MAX_ANPFLANZEN];
    new drogensamen[MAX_PLAYERS]; //Hier nicht!
    new drogenpickup[MAX_PLAYERS][MAX_ANPFLANZEN];
    new drogenobject[MAX_PLAYERS][MAX_ANPFLANZEN];
    new Text3D:drogentext[MAX_PLAYERS][MAX_ANPFLANZEN];
    new drogenprozent[MAX_PLAYERS][MAX_ANPFLANZEN];
    new angepflanzteDrogen[MAX_PLAYERS]; //Hier nicht!



    Der Befehl würde dann so aussehen:


    ocmd:anpflanzen(playerid,params[])
    {
    if(drogensamen[playerid] < 1)return SendClientMessage(playerid,C_Error,"Du hast keine Drogensamen!");
    if(GetPlayerInterior(playerid)==0)
    {
    new id = GetFreeDrogenID(playerid); //Wir brauchen diese Funktion um einen freien Index zu finden
    if(id == -1)return SendClientMessage(playerid,C_Error,"Du kannst keine Drogen mehr anpflanzen, ernte erst welche ab!");
    new Float:x,Float:y,Float:z,Float:r;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid, Float:r);
    dInfo[playerid][id][dX]=x;
    dInfo[playerid][id][dY]=y;
    dInfo[playerid][id][dZ]=z;
    drogenobject[playerid][id]=CreateObject(647, dInfo[playerid][id][dX], dInfo[playerid][id][dY], dInfo[playerid][id][dZ]-1.2, 0.0, 0.0, r);
    drogentext[playerid][id]=Create3DTextLabel("0 %",C_Weiß,dInfo[playerid][id][dX],dInfo[playerid][id][dY],dInfo[playerid][id][dZ],10.0,0,0);
    SendClientMessage(playerid,C_Gruen,"Du hast 1 Drogenpflanze angebaut.");
    drogenprozent[playerid][id]=0;
    drogenstatus[playerid][id] = 1; //Diese Droge ist nun erstellt.
    drogentimer[playerid][id]=SetTimerEx("DrogenWachsTimer",1000,1,"ii",playerid,id); //Auch im Timer die id mitgeben.
    angepflanzteDrogen[playerid]++;
    return 1;
    }
    else
    {
    SendClientMessage(playerid,C_Error,"Du kannst keine Drogen im Interior anpflanzen!");
    }
    return 1;
    }


    Hier unsere GetFreeDrogenID Funktion, einfach ganz unten im Gamemode einfügen.


    stock GetFreeDrogenID(playerid)
    {
    for(new i=0; i<MAX_ANPFLANZEN; i++)
    {
    if(drogenstatus[playerid][i] == 0) return i;
    }
    return -1;
    }



    Und dann dein Timer-Callback:


    forward DrogenWachsTimer(playerid, id);
    public DrogenWachsTimer(playerid, id)
    {
    if(drogenprozent[playerid][id]==100)
    {
    DestroyObject(drogenobject[playerid][id]);
    drogenpickup[playerid][id]=CreatePickup(19473,1,dInfo[playerid][id][dX],dInfo[playerid][id][dY],dInfo[playerid][id][dZ],GetPlayerVirtualWorld(playerid));
    KillTimer(drogentimer[playerid][id]);
    Delete3DTextLabel(drogentext[playerid][id]);
    drogenstatus[playerid][id] = 2; //Droge ist fertig.
    }
    else
    {
    new str[10];
    drogenprozent[playerid][id]++;
    format(str,sizeof(str),"%i %%",drogenprozent[playerid][id]);
    Update3DTextLabelText(drogentext[playerid][id],C_Weiß,str);
    }
    return 1;
    }



    Dort wo du dir Drogen aufsammelst muss dann natürlich das Pickup entfernt werden, und die Variablen zurückgesetzt werden:
    drogenprozent[playerid][id] = 0;
    drogenstatus[playerid][id] = 0; //Slot wieder frei
    angepflanzteDrogen[playerid]--;


    Die Prüfung, in welches Pickup, also in welche fertige Droge du läufst, sieht so aus:
    for(new i=0; i<MAX_ANPFLANZEN; i++)
    {
    if(pickupid == drogenpickup[playerid][i])
    {
    //Hier käme dann der Code aus dem Code drüber hin:
    drogenprozent[playerid][i] = 0;
    drogenstatus[playerid][i] = 0; //Slot wieder frei
    angepflanzteDrogen[playerid]--;
    //Und dann eben noch das was du sonst hier machen willst...

    //Schleife wird beendet.
    break;
    }
    }


    Außerdem musst du die Drogen natürlich löschen, wenn der Spieler den Server verlässt. Da kannst du einfach über den Status abfragen, was gelöscht werden soll:
    for(new i=0; i<MAX_ANPFLANZEN; i++)
    {
    if(drogenstatus[playerid][i] == 1)
    {
    DestroyObject(drogenobject[playerid][i]);
    KillTimer(drogentimer[playerid][i]);
    Delete3DTextLabel(drogentext[playerid][i]);
    }
    else if(drogenstatus[playerid][i] == 2)
    {
    DestroyPickup(drogenpickup[playerid][i]);
    }
    drogenstatus[playerid][i] = 0;
    }
    angepflanzteDrogen[playerid] = 0;



    Generell ist es einfach das gleiche Prinzip wie zuvor, nur eben mit dem Slot-Index überall dabei.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Ein d zu viel.

  • Naja, ich glaube nicht, dass er damit viel anfängt, das ist ja nur ein Zähler, der hier gar nichts bringt, denn er kann die fertigen Drogen ja in unterschiedlicher Reigenfolge abholen.

    Upps :)


    An diesen ganzen typischen Drogenkram (die braucht ne Stunde zum wachsen usw.) habe ich gar nicht gedacht :D


    Es war ja auch schon spät in der Nacht X(

    Meine Werke

  • public OnPlayerPickUpPickup(playerid, pickupid)
    {
    for(new i=0; i<MAX_ANPFLANZEN; i++)
    {
    if(pickupid == drogenpickup[playerid][i])
    {
    drogenprozent[playerid][i] = 0;
    drogenstatus[playerid][i] = 0;
    angepflanzteDrogen[playerid]--;
    SetPlayerArmour(playerid,25);
    DestroyPickup(drogenpickup[playerid][i]);
    break;
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen
    German_ScripterHD