Beiträge von Jeffry

    sSpieler[playerid][Geld] = dini_Int(Spieler,"Geld");
    Zu
    sSpieler[playerid][Geld] = dini_Int(Spieler,"Geld");
    GivePlayerMoney(playerid, sSpieler[playerid][Geld]);

    Hast du den Code auch eingefügt? Mir fehlt da dieser print:
    printf("Timer aufgerufen: %d -> RobSek: %d", playerid, RobSek[playerid]);
    Dem Ablauf nach muss der drin sein, wenn der Code eingefügt ist.

    Der Variable "RobbedBot" wurde die ID des Bots anstatt des Indexes (i) zugewiesen, daher hat der falsche Bot die Sperre bekommen.
    Ich habe bei den Timern auch noch eine Sicherung hinzugefügt, dass die nicht doppelt gestartet werden, und ich habe die erste Abfrage angepasst.


    Deklariere dein Rob_Timer so:
    new Rob_Timer[MAX_PLAYERS] = {-1, ...};


    Und versuche es mit dem Timer so:
    void BotTimer()
    {
    for(new i = 0; i < sizeof(RobBot); i++)
    {
    if(RobBot[i][RobSperre] > 0)
    {
    RobBot[i][RobSperre]--;
    }
    }
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    new playerTargetActor = GetPlayerTargetActor(playerid);
    for(new i = 0; i < sizeof(RobBot); i++)
    {
    if(playerTargetActor == RobBot[i][rob_ID] && Spieler[playerid][Team] == 2 && IsRobbing[playerid] == false)
    {
    new playerWeapon = GetPlayerWeapon(playerid);
    new keys, updown, leftright;
    GetPlayerKeys(playerid, keys, updown, leftright);
    printf("Spieler %d zielt auf Actor %d", playerid, i);
    if(!ActorHandsup[RobBot[i][rob_ID]] && playerWeapon >= 22 && playerWeapon <= 42 && keys & KEY_AIM)
    {
    printf("Actor %d hat eine Sperre von: %d", i, RobBot[i][RobSperre]);
    if(RobBot[i][RobSperre] > 0)
    {
    printf("Robbing: %d", IsRobbing[playerid]);
    if(IsRobbing[playerid] == false)
    {
    new Sperre[145];
    format(Sperre, sizeof(Sperre), "Dieses Geschäft kann erst wieder in %02d:%02d ausgeraubt werden.", RobBot[i][RobSperre]/60, RobBot[i][RobSperre]%60);
    SendClientMessage(playerid, COLOR_RED, Sperre);
    }
    printf("Beende.");
    break;
    }
    else
    {
    printf("Raube Actor %d aus.", i);
    ApplyActorAnimation(RobBot[i][rob_ID], "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0); // Handsup
    ActorHandsup[RobBot[i][rob_ID]] = true;
    //ab hier startet der ROb
    IsRobbing[playerid] = true;
    RobbedBot[playerid] = i;
    RobSek[playerid] = random(10)+30;
    if(Rob_Timer[playerid] != -1) KillTimer(Rob_Timer[playerid]);
    Rob_Timer[playerid] = SetTimerEx("RobTimer", 1000, true, "i", playerid);
    break;
    }
    }
    }
    else if(playerTargetActor != RobBot[i][rob_ID] && Spieler[playerid][Team] == 2 && IsRobbing[playerid] == true)
    {
    //nicht anvisiert
    IsRobbing[playerid] = false;
    KillTimer(Rob_Timer[playerid]);
    Rob_Timer[playerid] = -1;
    new string[128];
    format(string, sizeof(string), "Du hast %d$ ausgeraubt.", RobMoney[playerid]);
    printf("string = %s", string);
    SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
    GivePlayerMoney(playerid, RobMoney[playerid]);
    RobBot[i][RobSperre] = 60;
    printf("Actor %d hat nun eine Sperre von: %d", i, RobBot[i][RobSperre]);
    RobMoney[playerid] = 0;
    RobbedBot[playerid] = -1;
    ActorHandsup[RobBot[i][rob_ID]] = false;
    ClearActorAnimations(RobBot[i][rob_ID]);
    break;
    }
    }
    }
    return 1;
    }


    void RobTimer(playerid)
    {
    printf("Timer aufgerufen: %d -> RobSek: %d", playerid, RobSek[playerid]);
    new sekMoney = random(100)+10, moneyText[128];
    RobSek[playerid]--;
    RobMoney[playerid] += sekMoney;
    format(moneyText, sizeof(moneyText), "~g~%d$", RobMoney[playerid]);
    GameTextForPlayer(playerid, moneyText, 988, 6);
    if(RobSek[playerid] == 0)
    {
    //RobBot[RobbedBot[playerid]][RobSperre] = 60;
    IsRobbing[playerid] = false;
    KillTimer(Rob_Timer[playerid]);
    Rob_Timer[playerid] = -1;
    new string[128];
    format(string, sizeof(string), "Du hast %d$ ausgeraubt.", RobMoney[playerid]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
    GivePlayerMoney(playerid, RobMoney[playerid]);
    RobMoney[playerid] = 0;
    RobBot[RobbedBot[playerid]][RobSperre] = 60;
    printf("Actor %d hat nun eine Sperre von: %d", RobbedBot[playerid], RobBot[RobbedBot[playerid]][RobSperre]);
    ActorHandsup[RobbedBot[playerid]] = false;
    ClearActorAnimations(RobBot[RobbedBot[playerid]][rob_ID]);
    RobbedBot[playerid] = -1;
    }
    return 1;
    }

    Versuche Folgendes:
    Setze nach
    Rob_Timer[playerid] = SetTimerEx("RobTimer", 1000, true, "i", playerid);
    und im else-if Teil drunter nach
    ClearActorAnimations(RobBot[i][rob_ID]);
    jeweils ein
    break;
    hin.

    Man kann den Server doch nicht ständig bei 200 Usern neu starten, nur weil ein User was im CP ändert...

    Das stimmt allerdings.
    Was hast du denn geändert? Etwas an der Struktur, oder einen Wert?


    Es wäre interessant da mal die Logs zu sehen, von dem Login, zusammen mit dem Code davon, einmal wenn es klappt, und einmal wenn es nicht klappt. Könntest du das generieren lassen und dann posten?

    Dann füge bitte beim SpielerSpeichern am Ende noch ein
    print(query);
    hinzu, und poste dann was im Server Log steht, wenn du dich registrierst und dann den Server verlässt.


    Steht zeitgleich etwas im MySQL Log, ein Error oder so?

    Lasse dir das Query mal per print ausgeben und poste dann was im Server Log steht, wenn zeitgleich der Fehler im MySQL Log auftritt (Error).
    mysql_function_query(MySqlConnection,mainquery,false,"","");
    zu:
    print(mainquery);
    mysql_function_query(MySqlConnection,mainquery,false,"","");

    Unter den Includes:
    new blockedUntil[MAX_PLAYERS];


    Und in dem Befehl:
    if(blockedUntil[playerid] > gettime())
    {
    new str[145], t = blockedUntil[playerid] - gettime();
    format(str, sizeof(str), "Error: Du kannst diesen Befehl erst in %02d:%02d nutzen.", t/60, t%60);
    return SendClientMessage(playerid, 0xFF0000FF, str);
    }
    blockedUntil[playerid] = gettime() + 60 * 5; //5 Minuten

    Alternativ zu der Erklärung hier ( [jTuT] MySQL R39-3 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System) ) kannst du es nach dem Code so machen:


    if(dialogid == DIALOG_REGISTER)
    {
    //Spieler hat Abbrechen gewählt
    if(!response) return Kick(playerid);


    //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
    if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");


    //Wenn alles passt wird der Spieler in der Datenbank angelegt
    //Als Verschlüsselung für das Passwort wird MD5 verwendet
    new query[256];
    mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);


    //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
    mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
    pFirstLog[playerid] = true;
    PlayerInfo[playerid][pMoney] = 2500;
    PlayerInfo[playerid][pLevel] = 1;
    return 1;
    }



    public OnPlayerSpawn(playerid)
    {
    SetPlayerPos(playerid, 329.0244,-1513.3033,36.0391);
    SetPlayerCameraPos(playerid, 329.0244,-1513.3033,36.0391);
    SetPlayerCameraLookAt(playerid, 329.0244,-1513.3033,36.0391);
    SetPlayerFacingAngle(playerid,49.4261);
    if(pFirstLog[playerid] == true)//Erster Login
    {
    SetPlayerPos(playerid,0.0,0.0,0.0); // Tutorial Position
    TogglePlayerControllable(playerid,false);
    TutTime[playerid] = 1;
    TutTimer[playerid] = SetTimerEx("Tutorial",1000,1,"i",playerid);
    }
    else if(pFirstLog[playerid] == false)//Nicht erster Login
    {
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    }
    return 1;
    }


    Dann wird das Geld beim Spawn jedes mal wieder korrekt gesetzt, zu dem was in der Variable steht.



    Außerdem musst du
    else if(TutTime[playerid] == 50) // hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
    {
    KillTimer(TutTimer[playerid]); // der Tutorial Timer wird beendigt
    TutTime[playerid] = -1; // die Tutorial Zeit auf INVALID gsetzt - nach Goldkiller :)
    SpawnPlayer(playerid); // der Spawn, wo er nach dem Tutorial hinsoll
    TogglePlayerControllable(playerid,true); // hier wird die Fähigkeit sich zu bewegen wieder auf "wahr" gesetzt
    GameTextForPlayer(playerid,"~g~Willkommen, ~r~ auf -",6000,1); // GameText am Ende des Tutorials
    pFirstLog[playerid] = false;
    }
    zu
    else if(TutTime[playerid] == 50) // hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
    {
    pFirstLog[playerid] = false;
    KillTimer(TutTimer[playerid]); // der Tutorial Timer wird beendigt
    TutTime[playerid] = -1; // die Tutorial Zeit auf INVALID gsetzt - nach Goldkiller :)
    SpawnPlayer(playerid); // der Spawn, wo er nach dem Tutorial hinsoll
    TogglePlayerControllable(playerid,true); // hier wird die Fähigkeit sich zu bewegen wieder auf "wahr" gesetzt
    GameTextForPlayer(playerid,"~g~Willkommen, ~r~ auf -",6000,1); // GameText am Ende des Tutorials
    }
    ändern, sonst startet das Tutorial ein zweites Mal.

    Das wird so nicht klappen, du wirst das Geld zwar in der Datenbank stehen haben, aber nach dem Register nicht bekommen.


    Mache es so:
    if(dialogid == DIALOG_REGISTER)
    {
    //Spieler hat Abbrechen gewählt
    if(!response) return Kick(playerid);


    //Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
    if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");


    //Wenn alles passt wird der Spieler in der Datenbank angelegt
    //Als Verschlüsselung für das Passwort wird MD5 verwendet
    new query[256];
    mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);


    //Das Query wird abgesendet und die playerid an OnUserRegister übergeben
    mysql_pquery(handle, query, "OnUserRegister", "d", playerid);

    PlayerInfo[playerid][pMoney] = 2500;
    PlayerInfo[playerid][pLevel] = 1;
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    if(PlayerInfo[playerid][pErsterLogin] == 0)
    {
    PlayerInfo[playerid][pErsterLogin] = 1;
    //Tutorial(playerid);
    }
    else if(PlayerInfo[playerid][pErsterLogin] >= 1)
    {

    }
    return 1;
    }


    Das Ganze unter OnPlayerSpawn zu regeln ist nicht gut, da das ja jedes mal aufgerufen wird, wenn der Spieler spawnt.
    Was höchstens gehen würde wäre:


    public OnPlayerSpawn(playerid)
    {
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    if(PlayerInfo[playerid][pErsterLogin] == 0)
    {
    PlayerInfo[playerid][pErsterLogin] = 1;
    //Tutorial(playerid);
    }
    else if(PlayerInfo[playerid][pErsterLogin] >= 1)
    {

    }
    return 1;
    }


    Dann wird das Geld beim Spawn jedes mal wieder korrekt gesetzt, zu dem was in der Variable steht.

    Ja, eines im einen Code, und eines im anderen Code, das die geänderten Daten in Empfang nimmt und dann die Variable entsprechend ändert, die du referenzieren wolltest.


    Als Alternativen:
    - Alles in einem Code haben.
    - Über Dateien/Datenbank die Daten hin- und herschicken/übergeben (CallRemoteFunction dann nur als Event nutzen).

    Es muss so aussehen, so habe ich es dir auch gepostet:
    stock SpielerSpeichern(playerid)
    {
    if(sInfo[playerid][pEingeloggt] == 0)return 1;
    new query[1024], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);

    format(query, sizeof(query), "UPDATE user SET Age='%i', Geschlecht='%i', AdminLevel='%i', Mapper='%i', Scripter='%i', Premium='%i', Level='%i', Respektpunkte='%i', ",
    sInfo[playerid][pAge], sInfo[playerid][pSex], sInfo[playerid][pAdminLevel], sInfo[playerid][pMapper], sInfo[playerid][pScripter],
    sInfo[playerid][pPremium], sInfo[playerid][pLevel], sInfo[playerid][pRespektpunkte]);

    format(query, sizeof(query), "%sBarGeld='%i', BankKonto='%i', BankGeld='%i',Skin='%i', Fraktion='%i', FraktionRang='%i', Spawn='%i', Handy='%i', Handynummer='%i', ",
    query, GetPlayerMoney(playerid), sInfo[playerid][pBankKonto], sInfo[playerid][pBankGeld],sInfo[playerid][pSkin], sInfo[playerid][pFraktion],
    sInfo[playerid][pFraktionRang], sInfo[playerid][pSpawn], sInfo[playerid][pHandy], sInfo[playerid][pHandynummer]);

    format(query, sizeof(query), "%sPayDay='%i', Spielzeit='%i', Jail='%i', JailTime='%i', Prison='%i', PrisonCheckpoints='%i' WHERE username='%s'",
    query, sInfo[playerid][pPayDay], sInfo[playerid][pSpielzeit], sInfo[playerid][pJail], sInfo[playerid][pJailTime],
    sInfo[playerid][pPrison], sInfo[playerid][pPrisonCheckpoints], name);

    mysql_function_query(Handle, query, false, "", "");
    return 1;
    }


    Du hast die Query-Übergabe jeweils entfernt.