Timer wird ausgelöst perm bei ? anderen Spieler

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

  • ocmd:abbauen(playerid,params[])
    {
    if(dienst[playerid] == 14)
    {
    if(PlayerInfo[playerid][pSpitzhacke] == 0 && PlayerInfo[playerid][pRucksack] == 0) return SendClientMessage(playerid,COLOR_PURPLE,"Du hast deine Ausrüstung nicht dabei!");//ERROR ZEILE
    if(PlayerInfo[playerid][pKristalle] > 100) return SendClientMessage(playerid,COLOR_PURPLE,"Dein Rucksack ist voll .. gebe diese erstmal ab!");
    for(new i=0;i<MAX_KRISTALLE;i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,SKristallInfo[i][kposX],SKristallInfo[i][kposY],SKristallInfo[i][kposZ]) && SKristallInfo[i][KristallCreated] == true)
    {
    new randzeit = random(6000) + 5000;
    SendClientMessage(playerid,COLOR_PURPLE,"* Du beginnst den Kristall abzubauen!");
    TogglePlayerControllable(playerid,0);//FREEZE
    SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
    //SetTimer("KristallErnte",randzeit,0);
    KristallTimer[playerid] = SetTimerEx("KristallErnte", randzeit, true, "i", playerid);
    return 1;
    }
    }
    }
    return 1;
    }

    Ich hab ein Problem .. ich hab ein kristall farmer job erstellt.. und teste den mit meinem Kollegen ich kann nur mit /abbauen die Kristalle ernten
    mein kollege rennt einfach drüber und die kristalle verschwinden nach einer bestimmten zeit er braucht keinen befehl es passiert einfach hat er
    mir per Bildschirmübertragung gezeigt was ist falsch?




    new KristallTimer[MAX_PLAYERS];

    forward KristallErnte(playerid);
    public KristallErnte(playerid)
    {
    for(new i=0;i<MAX_KRISTALLE;i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.5,SKristallInfo[i][kposX],SKristallInfo[i][kposY],SKristallInfo[i][kposZ]) && SKristallInfo[i][KristallCreated] == true)
    {
    new randkristall = random(9) + 14;
    new string[254];
    KillTimer(KristallTimer[playerid]);
    SKristallInfo[i][KristallCreated] = false;
    SKristallInfo[i][NextKristallIn] = gettime() + (60*5);
    DestroyDynamicObject(SKristallInfo[i][KristallObject]);
    ClearAnimations(playerid);
    TogglePlayerControllable(playerid,1);//UNFREEZE
    format(string,sizeof(string),"* Du hast %i gramm Kristall geerntet.",randkristall);
    SendClientMessage(playerid,COLOR_PURPLE,string);
    PlayerInfo[playerid][pKristalle] += randkristall;
    ///ehicleLoadTank[vehicleid2] += dirtrand;
    /*format(string,sizeof(string),"Ladungsstatus: %i/500kg",VehicleLoadTank[vehicleid]);
    SendClientMessage(playerid,COLOR_YELLOW,string);*/
    }
    }
    }




    KillTimer(KristallTimer[playerid]);ONPLAYERDISC:

  • Ich würde es so machen:


    Füge bei deinem enum zu SKristallInfo noch "KristallOwner" oder sowas zu,
    beim erstellen vom Object setzt du diese Variable auf playerid und beim Abfragen zum ernten machst du noch eine Abfrage unter der RangeOfPoint rein:
    if(SKristallInfo[i][KristallOwner] == playerid)


    Sollte dann nur für dich verfügbar sein, sodass niemand anderes diese aufheben kann.

  • Ich verstehe ansich dein Problem bei dem Job nicht, kannst du das nochmal ausführlich erläutern?

    - Man muss mit /abbauen die Kristalle ernten.


    Mein Kollege hat auch erstmal mit /abbauen geerntet aber irgendwann musste der keinen befehl mehr eingeben musste nur noch an die Position laufen und hat einfach bekommen .. was man nur mit /abbauen bekommt

  • Änder beim SetTimerEx im Befehl das "true" (für die Wiederholung) mal auf "false".


    So wie es mir scheint wird die ganze Zeit ein Kristall abgebaut, da du "KristallErnte" die ganze Zeit aufrufen lässt ohne Ende.


    Zudem würde ich noch eine Variable einführen wie "pPlayerIsFarming" o.ä da du sonst die ganze Zeit den Befehl spammen könntest.
    Also:


    Ganz oben: new pPlayerIsFarming[MAX_PLAYERS];


    Im Befehl nach der Position-Abfrage:
    pPlayerIsFarming[playerid] = 1;



    Und im Timer wenn zB das Object gelöscht wird:


    pPlayerIsFarming[playerid] = 0;


    Ich hoffe ich konnte dir helfen. ;)