Geld Lieferant | Variable + Schleife

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
  • Guten Tag,


    Mein Name lautet MrPawn.
    Und zwar komme ich aktuell nicht weiter und habe eine Denkblockade.
    Ich mache ein Geldlieferanten System.
    Und zwar kann man schon jeden Geldtransporter beladen, nun bin ich beim entladen.
    Und zwar soll der ATM dann 100$+ Bekommen.


    Angefangen habe ich so.
    enum ATMINFO {
    Float:a_x, Float:a_y, Float:a_z,
    LoadValue, aid,
    };


    new aInfo[][ATMINFO] = {
    {1185.8193, -1046.6255, 31.9194, 0, 1}
    };


    ocmd:moneydrop(playerid)
    {
    new tmp_id, string[136];
    if(PlayerInfo[playerid][pJob] != 22)return SendClientMessage(playerid, -1, "Du bist kein Geldlieferant.");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, -1, "Du sitzt in keinem Fahrzeug.");
    new carid = GetPlayerVehicleID(playerid);
    if(!IsASecuricar(carid))return SendClientMessage(playerid, -1, "Du sitzt in keinem Geldtransporter.");
    for ( new i; i < sizeof(Lieferantveh); i++)
    {
    if(carid != Lieferantveh[i])continue;
    tmp_id = i;
    }
    if(MoneyLoad[tmp_id] == 0)return SendClientMessage(playerid, -1, "Der Geldtransporter ist nicht beladen.");
    MoneyLoad[tmp_id] = 0;
    new rand = 300 + random(200);
    GivePlayerMoney(playerid, rand);
    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    aInfo[][LoadValue] += 100;
    }
    if(aInfo[tmp_id][LoadValue] > 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    aInfo[tmp_id][LoadValue] += 100;
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast den Geldtransporter erfolgreich entladen. Verdienst: $i", rand);
    SendClientMessage(playerid, COLOR_GREEN, string);
    return 1;
    }


    Ich weis grad echt nicht mehr weiter


    Mit freundlichen Grüßen,


    MrPawn

  • Was genau funktioniert denn nicht?


    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    aInfo[/*?*/][LoadValue] += 100; // Hier
    }
    if(aInfo[tmp_id][LoadValue] > 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    aInfo[tmp_id][LoadValue] += 100; // Hier


    Warum ist das doppelt?

  • Habe ich auch gerade gesehen, aber weist du ich habe das abladen System noch nicht ganz getestet.
    Meine jetzige schleife:


    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    aInfo[i][LoadValue] += 100;
    if(aInfo[i][LoadValue] > 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    }


  • Du hast trdm n Fehler drin..
    Du erhöhst die Variable des Automaten und fragst erst danach ab, ob er schon mehr als 15000$ hat..


    Versuch es mal so:
    ocmd:moneydrop(playerid)
    {
    new vehid, string[136];
    if(PlayerInfo[playerid][pJob] != 22)return SendClientMessage(playerid, -1, "Du bist kein Geldlieferant.");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, -1, "Du sitzt in keinem Fahrzeug.");
    new carid = GetPlayerVehicleID(playerid);
    if(!IsASecuricar(carid))return SendClientMessage(playerid, -1, "Du sitzt in keinem Geldtransporter.");
    for ( new i; i < sizeof(Lieferantveh); i++)
    {
    if(carid != Lieferantveh[i])continue;
    vehid = i;
    }
    if(MoneyLoad[vehid] == 0)return SendClientMessage(playerid, -1, "Der Geldtransporter ist nicht beladen.");
    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    else if(aInfo[i][LoadValue] > 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    aInfo[i][LoadValue] += 100;
    }
    new rand = 300 + random(200);
    GivePlayerMoney(playerid, rand), MoneyLoad[vehid] = 0;
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast den Geldtransporter erfolgreich entladen. Verdienst: $i", rand);
    return SendClientMessage(playerid, COLOR_GREEN, string);
    }

  • Ich würde mal gerne wissen, wo da das Problem liegt.
    for(new i;i<sizeof aInfo;i++){
    if(!IsPlayerInRangeOfPoint(playerid,3,aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    if(aInfo[i][LoadValue]>=15000)return SendClientMessage(playerid,-1,"Der Automat hat bereits, $15.000");
    aInfo[i][LoadValue] += 100;
    }
    Außerdem würde ich das lieber so machen, so wird erst der aktuelle Stand abgefragt.

  • Aktuell habe ich es so:


    ocmd:moneydrop(playerid)
    {
    new vehid, string[136];
    if(PlayerInfo[playerid][pJob] != 22)return SendClientMessage(playerid, -1, "Du bist kein Geldlieferant.");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, -1, "Du sitzt in keinem Fahrzeug.");
    new carid = GetPlayerVehicleID(playerid);
    if(!IsASecuricar(carid))return SendClientMessage(playerid, -1, "Du sitzt in keinem Geldtransporter.");
    for ( new i; i < sizeof(Lieferantveh); i++)
    {
    if(carid != Lieferantveh[i])continue;
    vehid = i;
    }
    if(MoneyLoad[vehid] == 0)return SendClientMessage(playerid, -1, "Der Geldtransporter ist nicht beladen.");
    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    if(aInfo[i][LoadValue] >= 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    aInfo[i][LoadValue] += 100;
    }
    new rand = 300 + random(200);
    GivePlayerMoney(playerid, rand), MoneyLoad[vehid] = 0;
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast den Geldtransporter erfolgreich entladen. Verdienst: $%i", rand);
    return SendClientMessage(playerid, COLOR_GREEN, string);
    }


    Und da besteht der Fehler auch wenn ich nicht in der Nähe eines ATM´s bin kann ich den Geldtransporter entladen.


    enum ATMINFO {
    Float:a_x, Float:a_y, Float:a_z,
    LoadValue,
    };


    new aInfo[][ATMINFO] = {
    {1185.8193, -1046.6255, 31.9194, 0}
    };


    Hiermal ein video zu:

    Spoiler anzeigen
    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Der Fehler liegt immernoch in diesem Abschnitt:
    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    if(aInfo[i][LoadValue] >= 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");
    aInfo[i][LoadValue] += 100;
    }

    Du weisst nach Ablauf des o.g. Codes nicht, ob er Spieler in der Nähe war oder eben nicht.
    Erstell vor der Schleife eine zusätzliche Variable, mit der du festlegst ob der Spieler in der nähe ist ( 1 ) oder eben nicht ( 0 ).
    Dann kannst du nach der Schleife mit der Variable prüfen, ob der Wert bei 0 liegt und ggf den Befehl mit einer Fehlermeldung beenden.


    Spoiler anzeigen
    Vom Prinzip könntest du auch den Teil nach der Schleife in die Schleife dazu packen. Fänd ich persönlich aber unsauber.

  • Könntest du mir eventuell ein Beispielcode dalassen, denn ich kann mich mit deinem Formulierung nicht ganz Iden­ti­fi­zie­ren.



    ocmd:moneydrop(playerid)
    {
    new tmp_id = -1, string[144];
    if(PlayerInfo[playerid][pJob] != 22)return SendClientMessage(playerid, -1, "Du bist kein Geldlieferant.");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, -1, "Du sitzt in keinem Fahrzeug.");
    new carid = GetPlayerVehicleID(playerid);
    if(!IsASecuricar(carid))return SendClientMessage(playerid, -1, "Du sitzt in keinem Geldtransporter.");
    for ( new i; i < sizeof(Lieferantveh); i++)
    {
    if(carid != Lieferantveh[i])continue;
    tmp_id = i;
    break;
    }
    if(tmp_id == -1)return SendClientMessage(playerid, -1, "Du sitzt in keinem Geldtransporter.");
    if(MoneyLoad[tmp_id] == 0)return SendClientMessage(playerid, -1, "Der Geldtransporter ist nicht beladen.");
    new atm = -1;
    for(new i;i<sizeof(aInfo);i++){
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, aInfo[i][a_x], aInfo[i][a_y], aInfo[i][a_z]))continue;
    atm = i;
    break;
    }
    if(atm == -1)return SendClientMessage(playerid, -1, "Du bist nicht nahe einer ATM.");
    if(aInfo[atm][LoadValue] > 15000)return SendClientMessage(playerid, -1, "Der Automat hat bereits, $15.000");


    aInfo[atm][LoadValue] += 100;
    MoneyLoad[tmp_id] = 0;
    new rand = 300 + random(200);
    GivePlayerMoney(playerid, rand);
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast den Geldtransporter erfolgreich entladen. Verdienst: $i", rand);
    SendClientMessage(playerid, COLOR_GREEN, string);
    return 1;
    }


    Das nennt sich das "EVA" Prinzip, nach dem solltest du wenn möglich vorgehen. Eingabe-Verarbeitung-Ausgabe