Kann nur eine Pflanze Löschen / die letzte

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
  • COMMAND:farmer(playerid,params[])
    {
    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    new query[128];
    GetPlayerPos(playerid,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]);
    FarmPflanzenInfo[fp][fpvirtualworld] = GetPlayerVirtualWorld(playerid);
    // FarmPflanzenInfo[fp][fpOwner] = Spieler[playerid][pName]);
    format(FarmPflanzenInfo[fp][fpOwner],24,"%s",Spieler[playerid][pName]);
    format(query,sizeof(query),"Pflanzen-ID %i\nVon: %s",fp,FarmPflanzenInfo[fp][fpOwner]);
    FarmPflanzenLabel[fp] = CreateDynamic3DTextLabel(query,GRUEN,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],7.5,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1,FarmPflanzenInfo[fp][fpvirtualworld]);
    FarmPflanzenInfo[fp][fpobject] = CreateDynamicObject(802,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],0.0,0.0,0.0,FarmPflanzenInfo[fp][fpvirtualworld]);
    SendClientMessage(playerid,0x0069FFFF,"PFLANZE ERSTELLT!");
    }
    return 1;
    }
    Erstell befehl kann mehrere machen mit /farmer
    aber wenn ich /delfarmer mache kann ich nur die zuletzt erstellte löschen weiß jemand wieso? und es wird im chat wenn ich eine pflanze erstelle 3x die sendclientmessage angezeigt MAX_FPFLANZEN is auf 3 gesetzt kann mir jemand helfen? Das ich jede Pflanze entfernen kann an der ich stehe? und die PFLANZEN-ID: geht nicht höher bleibt immer bei 0


    COMMAND:delfarmer(playerid,params[])
    {
    new pflanze = IsPlayerAtFarmerPflanze(playerid);
    if(pflanze == -1)return SendClientMessage(playerid,GRAU,"An keiner Farmer Pflanze von dir!");
    DestroyFarmPflanze(pflanze);
    return 1;
    }


    stock DestroyFarmPflanze(fp)
    {
    FarmPflanzenInfo[fp][fpXpos] = -1;
    FarmPflanzenInfo[fp][fpYpos] = -1;
    FarmPflanzenInfo[fp][fpZpos] = -1;
    FarmPflanzenInfo[fp][fpvirtualworld] = 0;
    DestroyDynamicObject(FarmPflanzenInfo[fp][fpobject]);
    DestroyDynamic3DTextLabel(FarmPflanzenLabel[fp]);
    return 1;
    }


    oben:


    FarmPflanzenInfo[MAX_FPFLANZEN][Farm_Pflanzen],


    enum Farm_Pflanzen
    {
    fpobject,
    Float:fpXpos,
    Float:fpYpos,
    Float:fpZpos,
    fpinterior,
    fpvirtualworld,
    fpOwner[24]
    }

  • Wie sieht denn deine Funktion "IsPlayerAtFarmerPflanze(playerid)" aus?


    Wegen deiner Schleife. Du musst sie abbrechen (break) nachdem die Pflanze erstellt wurde.


    COMMAND:farmer(playerid,params[])
    {

    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    // NOTE: Hier fehlt noch eine Abfrage, ob die Pflanze bereits erstellt wurde
    new query[128];
    GetPlayerPos(playerid,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]);
    FarmPflanzenInfo[fp][fpvirtualworld] = GetPlayerVirtualWorld(playerid);
    // FarmPflanzenInfo[fp][fpOwner] = Spieler[playerid][pName]);
    format(FarmPflanzenInfo[fp][fpOwner],24,"%s",Spieler[playerid][pName]);
    format(query,sizeof(query),"Pflanzen-ID %i\nVon: %s",fp,FarmPflanzenInfo[fp][fpOwner]);
    FarmPflanzenLabel[fp] = CreateDynamic3DTextLabel(query,GRUEN,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],7.5,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1,FarmPflanzenInfo[fp][fpvirtualworld]);
    FarmPflanzenInfo[fp][fpobject] = CreateDynamicObject(802,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],0.0,0.0,0.0,FarmPflanzenInfo[fp][fpvirtualworld]);
    SendClientMessage(playerid,0x0069FFFF,"PFLANZE ERSTELLT!");
    break;
    }
    return 1;
    }

  • Wie sieht denn deine Funktion "IsPlayerAtFarmerPflanze(playerid)" aus?

    stock IsPlayerAtFarmerPflanze(playerid)
    {
    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.0,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]) && FarmPflanzenInfo[fp][fpinterior] == GetPlayerInterior(playerid) && FarmPflanzenInfo[fp][fpvirtualworld] == GetPlayerVirtualWorld(playerid))
    return fp;
    }
    return -1;
    }

  • Die Funktion "IsPlayerAtFarmerPflanze" sieht richtig aus.
    Was eher das Problem ist, ist deine for-Schleife beim Erstellen der Pflanze. Du erstellst die Pflanze immer drei mal, dadurch werden immer alle 3 Pflanzen mit dem selben Wert überschrieben.


    Das Script muss dann ungefähr so aussehen:


    /*
    * In deinem Enum von FarmPflanzenInfo bitte hinzufügen:
    * bool isset
    */


    COMMAND:farmer(playerid,params[])
    {
    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    if(PlantExists(i)) continue; // --------------------- Existiert die Pflanze bereits, welche die Schleife gerade erstellen möchte? ---------------------
    new query[128];
    GetPlayerPos(playerid,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]);
    FarmPflanzenInfo[fp][fpvirtualworld] = GetPlayerVirtualWorld(playerid);
    // FarmPflanzenInfo[fp][fpOwner] = Spieler[playerid][pName]);
    format(FarmPflanzenInfo[fp][fpOwner],24,"%s",Spieler[playerid][pName]);
    format(query,sizeof(query),"Pflanzen-ID %i\nVon: %s",fp,FarmPflanzenInfo[fp][fpOwner]);
    FarmPflanzenLabel[fp] = CreateDynamic3DTextLabel(query,GRUEN,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],7.5,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1,FarmPflanzenInfo[fp][fpvirtualworld]);
    FarmPflanzenInfo[fp][fpobject] = CreateDynamicObject(802,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos],0.0,0.0,0.0,FarmPflanzenInfo[fp][fpvirtualworld]);
    FarmPflanzenInfo[fp][isset] = true; // --------------------- Dem Script mitteilen, dass diese Pflanze nun existiert! ---------------------
    SendClientMessage(playerid,0x0069FFFF,"PFLANZE ERSTELLT!");
    break;
    }
    return 1;
    }


    stock PlantExists(plant_id) {
    return FarmPflanzenInfo[plant_id][isset] ? true : false;
    // return (wenn isset == true) true (ansonsten) false
    }

    2 Mal editiert, zuletzt von unsigned ()

  • Die Funktion "IsPlayerAtFarmerPflanze" sieht richtig aus.
    Was eher das Problem ist, ist deine for-Schleife beim Erstellen der Pflanze. Du erstellst die Pflanze immer drei mal, dadurch werden immer alle 3 Pflanzen mit dem selben Wert überschrieben.


    Ich wüsste jetzt nicht was für eine if abfrage ich machen muss damit das Normal funktioniert könntest du mir dabei helfen?


  • Ich wüsste jetzt nicht was für eine if abfrage ich machen muss damit das Normal funktioniert könntest du mir dabei helfen?


    Habe meinen Beitrag oben editiert.
    Dort habe ich die einen Beispiel-Lösungsweg gezeigt.


    Was du tun müsstest:
    * In deinem enum einen boolean erstellen mit dem Namen "isset"
    * Die Funktion "PlantExists" einfügen
    * Die Änderungen des Commands "farmer" übernehmen



    Ist nur eine Lösung, wie ich es tun würde. Ist natürlich auch ungetestet. Könnte (sollte) funktionieren, muss aber nicht ;)

  • Könntest es ja mal so Probieren.
    Du hast ein return in deiner Schleife, es wird nach 1x direkt beendet.



    stock IsPlayerAtFarmerPflanze(playerid)
    {
    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    if(!IsPlayerInRangeOfPoint(playerid,2.0,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]) && FarmPflanzenInfo[fp][fpinterior] == GetPlayerInterior(playerid) && FarmPflanzenInfo[fp][fpvirtualworld] == GetPlayerVirtualWorld(playerid)) continue;
    return fp;
    }
    return -1;
    }

  • stock IsPlayerAtFarmerPflanze(playerid)
    {
    new bool:found = false;
    new pflanze;
    for(new fp=0;fp<MAX_FPFLANZEN;fp++)
    {
    if(!IsPlayerInRangeOfPoint(playerid,2.0,FarmPflanzenInfo[fp][fpXpos],FarmPflanzenInfo[fp][fpYpos],FarmPflanzenInfo[fp][fpZpos]) && FarmPflanzenInfo[fp][fpinterior] == GetPlayerInterior(playerid) && FarmPflanzenInfo[fp][fpvirtualworld] == GetPlayerVirtualWorld(playerid)) continue;
    found = true;
    pflanze = fp;
    }
    if (found == true) return pflanze;
    else if (found == false) return -1;
    }


    Bisschen kompliziert, aber kannst es mal versuchen.


    // EDIT:
    Sollte es nicht klappen, dann werde ich später schauhen sobald ich ausgepennt bin. ( wenn bis dahin noch keiner geholfen hat )

    Einmal editiert, zuletzt von Pascal. ()