Skillsystem funktioniert nicht richtig warum?

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
  • Mein Skillsystem funktioniert nicht richtig Warum?


    Man kann wenn man Skill lvl 50 hat also EXP bis Status: 120% voll machen wird auch angezeigt..
    Aber wenn ich SKill lvl 100 habe also EXP wird auch geupdatet von meinem Sys auf 140% das man haben kann
    aber man kann troz nur bis 120% auffüllen..
    Was hab ich Falsch gemacht?
    Und man kann ohne Fahrzeug Objekte einsammeln :O



    if(dienst[playerid] == 13 && IsVehicleACleanCar(vehicleid2))
    {
    for(new i=0;i<MAX_RUBBISH;i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,SRubbishInfo[i][RposX],SRubbishInfo[i][RposY],SRubbishInfo[i][RposZ]) && SRubbishInfo[i][RubbishCreated] == true)
    {
    new dirtrand = 10;
    if(PlayerInfo[playerid][pBauerSkill] < 50)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 101)return 1;
    }
    else if(PlayerInfo[playerid][pBauerSkill] >= 49)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 121)return 1;
    }
    else if(PlayerInfo[playerid][pBauerSkill] >= 99)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 141)return 1;
    }
    else if(PlayerInfo[playerid][pBauerSkill] >= 149)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 161)return 1;
    }
    if(PlayerInfo[playerid][pBauerSkill] >= 199)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 181)return 1;
    }
    else if(PlayerInfo[playerid][pBauerSkill] >= 249)
    {
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= 201)return 1;
    }
    // if((VehicleLoadTank[vehicleid2] + dirtrand) >= 101)return 1;
    SRubbishInfo[i][RubbishCreated] = false;
    SRubbishInfo[i][NextRubbishIn] = gettime() + (60*3);
    DestroyDynamicObject(SRubbishInfo[i][RubbishObject]);
    /*format(string,sizeof(string),"%i kg aufgesaugt wien staubsauger",dirtrand);
    SendClientMessage(playerid,COLOR_YELLOW,string);*/
    VehicleLoadTank[vehicleid2] += dirtrand;
    /*format(string,sizeof(string),"Ladungsstatus: %i/500kg",VehicleLoadTank[vehicleid]);
    SendClientMessage(playerid,COLOR_YELLOW,string);*/
    // new string3[254];
    if(PlayerInfo[playerid][pBauerSkill] >= 49)
    {
    format(string3,128,"Status: %i/120%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    if(PlayerInfo[playerid][pBauerSkill] >= 99)
    {
    format(string3,128,"Status: %i/140%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    if(PlayerInfo[playerid][pBauerSkill] >= 149)
    {
    format(string3,128,"Status: %i/160%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    if(PlayerInfo[playerid][pBauerSkill] >= 199)
    {
    format(string3,128,"Status: %i/180%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    if(PlayerInfo[playerid][pBauerSkill] >= 249)
    {
    format(string3,128,"Status: %i/200%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    if(PlayerInfo[playerid][pBauerSkill] < 50)
    {
    format(string3,128,"Status: %i/100%", VehicleLoadTank[vehicleid2]);
    PlayerTextDrawSetString(playerid, BauernJobanzeigedraw[playerid], string3);
    }
    return 1;
    }
    }
    }

    stock IsVehicleACleanCar(vehicleid){ for(new i=0;i<sizeof(bauerauto);i++) { if(vehicleid == bauerauto[i]) return 1; } return 0;}

  • Generell: Packe es am besten in einen For-Loop und fange beim größten Item an zum kleinsten sowie nutze statt if-if-... Strukturen if - else if - else strukturen :)
    Ist besser für die Performance und zur verarbeitung von den Textdraws, denn falls du bspw. 200Skill hast, werden zuerst 3 if-Statements ausgeführt, bevor überhaupt dein gewünschter if-Block ausgeführt wird. Mit freundlichen Grüßen - wird vllt nicht das problem lösen, dafür aber alles übersichtlich sowie performance optimierter dargestellt :)

  • Das kommt weil du returnst bevor du die Variable um dirtrand erhöhst.


    Problem mit aufpicken ohne Fahrzeug benutze: IsPlayerInAnyVehicle(playerid) dann GetPlayerState(playerid) == PLAYER_STATE_DRIVER und
    dann deine Abfrage ob es ein CleanCar ist.


    //Bin am Handy

  • Das kommt weil du returnst bevor du die Variable um dirtrand erhöhst.
    Problem mit aufpicken ohne Fahrzeug benutze: IsPlayerInAnyVehicle(playerid) dann IsPlayerVehicleDriver(playerid) und dann deine Abfrage ob es ein CleanCar ist.


    //Bin am Handy

    das dirtrand erhöht immer pro Objekt um 10% daran liegts nicht ^^ denke ich mal.
    Das mit dem vehicle habe ich behoben habe falsche Fahrzeug Variable bentutz nur noch das Problem mit
    dem Skillsystem das man nur bis 120% aufsammeln kann nicht höher..
    Oder wie meinst du das? bin gerade echt Müde

    Generell: Packe es am besten in einen For-Loop und fange beim größten Item an zum kleinsten sowie nutze statt if-if-... Strukturen if - else if - else strukturen :)
    Ist besser für die Performance und zur verarbeitung von den Textdraws, denn falls du bspw. 200Skill hast, werden zuerst 3 if-Statements ausgeführt, bevor überhaupt dein gewünschter if-Block ausgeführt wird. Mit freundlichen Grüßen - wird vllt nicht das problem lösen, dafür aber alles übersichtlich sowie performance optimierter dargestellt :)

    Bin neu im Scripting wenn ich ehrlich bin verstehe ich nicht viel was du da schreibst oder bin einfach zu Müde ^^

  • Ich habe das gerade nur im Kopf durchdacht, ka ob es klappt, werde dir aber heute abend das korrekte senden, falls es nicht geht.


    Du hast jetzt zwar dank @CrueL die Lösung, dennoch wäre hier eine saubere und leichter veränderbare Funktion:


    new dirtrand = 10;
    new highestSkill = 250;
    new jumps = 50;
    new tankJumps = 20;
    new minTank = 100;


    new maxTank = minTank + tankJumps * (highestSkill / jumps) + 1;
    for(new x = highestSkill; x >= jumps; x -= jumps) {
    if(x != 0 && PlayerInfo[playerid][pBauerSkill] >= x) { //von >= 250 bis >= 50
    if((VehicleLoadTank[vehicleid2] + dirtrand) >= maxTank)
    return 1;
    }
    else if(x == 0 && (VehicleLoadTank[vehicleid2] + dirtrand) < jumps) { // <50
    return 1;
    }
    maxTank -= tankJumps;
    }


    Das wäre für die if-Abfragen am Anfang, den Code für dein jetziges gelöstes Problem werde ich dir nachsenden, falls du es selbst nicht mit diesem Code abwandeln kannst (würde dir das ans Herz legen, es ist einfacher und äbersichtlicher).


    MfG