open.mp forum
[Pawn] help with /payday command in samp - Printable Version

+ open.mp forum (https://forum.open.mp)
-- Forum: SA-MP (https://forum.open.mp/forumdisplay.php?fid=3)
--- Forum: Pawn Scripting (https://forum.open.mp/forumdisplay.php?fid=10)
--- Thread: [Pawn] help with /payday command in samp (/showthread.php?tid=2938)



help with /payday command in samp - madryx - 2024-10-20

hi, i have a problem with the /payday command in my samp script. i have a function called PayDay that gives players their salary at fixed times, but i want to create a /payday command that allows admins to grant the salary manually.

i thought that if i call the function it might work or if i call ResetPD it might work, but i don't understand how it should be done. if someone can help me understand, i would appreciate it.

function ResetPD() {
Paydaydat = 0;
return 1;
}

function PayDay() {
    new hour,minn,sec;
    gettime(hour,minn,sec);
    if(minn == 0 && Paydaydat == 0) {
        SetTimer("ResetPD", 60000, false);
        Paydaydat = 1;
        new string[128];
        new interest,account[MAX_PLAYERS];
        new rent[MAX_PLAYERS];
        SetTimer("ScadeLicentele", 4000, false);
        foreach(Player,i) {
            if(IsPlayerConnected(i) && IsPlayerLogged[i] == 1) {
                // Verifică limita de gift points
                if(PlayerInfo[i][pGiftpuncte] >= 200) {
                    SendClientMessage(i, COLOR_RED, "ERROR: Ai atins limita de 200 gift points. Nu mai poți primi gift points.");
                } else {
                    // Adaugă 50 gift points la payday
                    PlayerInfo[i][pGiftpuncte] += 50;
                    new giftMsg[128];
                    format(giftMsg, sizeof(giftMsg), "Ai primit 50 gift points la payday.");
                    SendClientMessage(i, COLOR_GREEN, giftMsg);
                }

                new key = PlayerInfo[i][pHouse];
                if(key != 999) {
                    rent[i] = HouseInfo[key][hRent];
                    HouseInfo[key][hTakings] += rent[i];
                }
                new tmpintrate;
                SendClientMessage(i, COLOR_SERVER, "------------------------------------------------------------------------------------------------");
                if(PlayerInfo[i][pPremiumAccount] == 1) {
                    tmpintrate = 2;
                    PlayerInfo[i][pPayDayHad] += 1;
                    if(PlayerInfo[i][pPayDayHad] >= 5) {
                        PlayerInfo[i][pExp]++;
                        PlayerInfo[i][pPayDayHad] = 0;
                    }
                    new bonus = PlayerInfo[i][pPayCheck] / 2;
                    PlayerInfo[i][pPayCheck] += bonus;
                } else {
                    tmpintrate = 1;
                }
                account[i] = PlayerInfo[i][pAccount];
                Tax += TaxValue;

                new checks = PlayerInfo[i][pLevel] * 2500 + random(3000);
                if(PlayerInfo[i][pDailyLogin] == 0) checks = checks * 2;
                GivePlayerCash(i, checks);
                interest = (PlayerInfo[i][pAccount] / 5000) * (tmpintrate);
                if(PlayerInfo[i][pDailyLogin] == 0) interest = interest * 2;
                if(PlayerInfo[i][pDailyLogin] == 0) PlayerInfo[i][pExp] += 2;
                else PlayerInfo[i][pExp] += 1;
                UpdateProgress(i, 0);
                PlayerInfo[i][pAccount] += interest + 1000;

                SCM(i, COLOR_WHITE, "Salariul tau a sosit! Viziteaza banca pentru a retrage banii.");
                format(string, sizeof(string), "Ai primit %0.2f ore jucate. (%.0f minute)", PlayerInfo[i][pSeconds] / 3600, PlayerInfo[i][pSeconds] / 60);
                SendClientMessage(i, COLOR_WHITE, string);
                PlayerInfo[i][pConnectTime] += PlayerInfo[i][pSeconds] / 3600;
                if(PlayerInfo[i][pSeconds] >= 1800) {
                    new query[180];
                    format(query, sizeof(query), "UPDATE `users` SET `DayHours`=`DayHours`+1 WHERE `ID`='%d'", PlayerInfo[i][pSQLID]);
                    mysql_query(SQL, query);
                    format(query, sizeof(query), "UPDATE `users` SET `HoursMonth`=`HoursMonth`+1 WHERE `ID`='%d'", PlayerInfo[i][pSQLID]);
                    mysql_query(SQL, query);
                }
                PlayerInfo[i][pSeconds] = 0;
               
                if(PlayerInfo[i][pDailyLogin] == 0) {
                    PlayerInfo[i][pDailyLogin] = 1;
                    UpdateVar(i, "DailyLogin", 1);
                    SCM(i, COLOR_LIGHTBLUE, "Ai primit de doua ori mai multe respect points si bani pentru primul tau payday de astazi.");
                }

                if(PlayerInfo[i][pHouse] != 999) {
                    format(string, sizeof(string), "Paycheck: $%s | Tax: -$%d | Rent: -$%d | Old Balance: $%s", FormatNumber(checks), FormatNumber(TaxValue), HouseInfo[PlayerInfo[i][pHouse]][hRent], FormatNumber(account[i]));
                    SendClientMessage(i, COLOR_GREY, string);
                    format(string, sizeof(string), "Interest rate: 0.%d% | Interest: $%s | New balance: $%s", tmpintrate, FormatNumber(interest), FormatNumber(PlayerInfo[i][pAccount]));
                    SendClientMessage(i, COLOR_GREY, string);
                } else {
                    format(string, sizeof(string), "Paycheck: $%s | Tax: -$%d | Rent: -$0 | Old Balance: $%s", FormatNumber(checks), FormatNumber(TaxValue), FormatNumber(account[i]));
                    SendClientMessage(i, COLOR_GREY, string);
                    format(string, sizeof(string), "Interest rate: 0.%d% | Interest: $%s | New balance: $%s", tmpintrate, FormatNumber(interest), FormatNumber(PlayerInfo[i][pAccount]));
                    SendClientMessage(i, COLOR_GREY, string);
                }

                PlayerInfo[i][pPayDay] = 0;
                PlayerInfo[i][pPayCheck] = 0;
                SendClientMessage(i, COLOR_SERVER, "------------------------------------------------------------------------------------------------");
            }
        }
        if(hour == 21) {
            new gold = 1 + random(10);
            new money = 10000 + random(5000);
            for(new h = 0; h < MAX_CLANS; h++) {
                if(strlen(ClanInfo[h][clName]) != 0) {
                    if(GetClanTurfs(h) >= 10) {
                        foreach(Player, i) {
                            if(PlayerInfo[i][pClan] == h && h != 0) {
                                PlayerInfo[i][pPremiumPoints] += gold;
                                Update(i, pPremiumPointsx);
                                GivePlayerCash(i, money);
                                format(string, sizeof(string), "Ai primit %d puncte premium si $%s deoarece clanul tau are peste 10 teriotrii.", gold, FormatNumber(money));
                                SCM(i, COLOR_MONEY, string);
                            }
                        }
                    }
                }
            }
        }
        if(RestartPayday == 1) {
            SendClientMessageToAll(COLOR_CLIENT, "Server-ul a fost restartat! Va rugam sa reveniti.");
            GameModeExit();
        }
    }
    return 1;
}



This is the payday and RESETPD system.


and here is what i tried to do

CMD:payday(playerid) {
    if (PlayerInfo[playerid][pAdmin] < 6) {
        return SendClientMessage(playerid, COLOR_RED, "Nu ai permisiuni pentru a folosi aceasta comanda.");
    }

    Paydaydat = 0;
    SendClientMessage(playerid, COLOR_GREEN, "Payday a fost acordat cu succes.");
    return 1;
}


RE: help with /payday command in samp - Kenth - 2024-10-24

This should work, but I would suggest you to start using Y-Less Timers.

Also i have a function called "MinuteTimer" that runs every minute, in there i have a variable that counts up every minute, and every 60 minutes HourTimer gets called, that way i only have 1 timer running for "looping" timers.

What you did was reset Paydaydat instead of calling the PayDay function. Also  added a manual variable to the function, so the timers wont be started again for payday even if admin uses the command. Again, better is to put it under a seperate looping timer that calls PayDay function, instead of starting a timer again inside the function in my opinion.

Code:
function ResetPD() {
Paydaydat = 0;
return 1;
}

function PayDay(bool:manual = false) {
    new hour,minn,sec;
    gettime(hour,minn,sec);
    if(minn == 0 && Paydaydat == 0) {
        if(!manual) SetTimer("ResetPD", 60000, false);
        Paydaydat = 1;
        new string[128];
        new interest,account[MAX_PLAYERS];
        new rent[MAX_PLAYERS];
        if(!manual) SetTimer("ScadeLicentele", 4000, false);
        foreach(Player,i) {
            if(IsPlayerConnected(i) && IsPlayerLogged[i] == 1) {
                // Verifică limita de gift points
                if(PlayerInfo[i][pGiftpuncte] >= 200) {
                    SendClientMessage(i, COLOR_RED, "ERROR: Ai atins limita de 200 gift points. Nu mai poți primi gift points.");
                } else {
                    // Adaugă 50 gift points la payday
                    PlayerInfo[i][pGiftpuncte] += 50;
                    new giftMsg[128];
                    format(giftMsg, sizeof(giftMsg), "Ai primit 50 gift points la payday.");
                    SendClientMessage(i, COLOR_GREEN, giftMsg);
                }

                new key = PlayerInfo[i][pHouse];
                if(key != 999) {
                    rent[i] = HouseInfo[key][hRent];
                    HouseInfo[key][hTakings] += rent[i];
                }
                new tmpintrate;
                SendClientMessage(i, COLOR_SERVER, "------------------------------------------------------------------------------------------------");
                if(PlayerInfo[i][pPremiumAccount] == 1) {
                    tmpintrate = 2;
                    PlayerInfo[i][pPayDayHad] += 1;
                    if(PlayerInfo[i][pPayDayHad] >= 5) {
                        PlayerInfo[i][pExp]++;
                        PlayerInfo[i][pPayDayHad] = 0;
                    }
                    new bonus = PlayerInfo[i][pPayCheck] / 2;
                    PlayerInfo[i][pPayCheck] += bonus;
                } else {
                    tmpintrate = 1;
                }
                account[i] = PlayerInfo[i][pAccount];
                Tax += TaxValue;

                new checks = PlayerInfo[i][pLevel] * 2500 + random(3000);
                if(PlayerInfo[i][pDailyLogin] == 0) checks = checks * 2;
                GivePlayerCash(i, checks);
                interest = (PlayerInfo[i][pAccount] / 5000) * (tmpintrate);
                if(PlayerInfo[i][pDailyLogin] == 0) interest = interest * 2;
                if(PlayerInfo[i][pDailyLogin] == 0) PlayerInfo[i][pExp] += 2;
                else PlayerInfo[i][pExp] += 1;
                UpdateProgress(i, 0);
                PlayerInfo[i][pAccount] += interest + 1000;

                SCM(i, COLOR_WHITE, "Salariul tau a sosit! Viziteaza banca pentru a retrage banii.");
                format(string, sizeof(string), "Ai primit %0.2f ore jucate. (%.0f minute)", PlayerInfo[i][pSeconds] / 3600, PlayerInfo[i][pSeconds] / 60);
                SendClientMessage(i, COLOR_WHITE, string);
                PlayerInfo[i][pConnectTime] += PlayerInfo[i][pSeconds] / 3600;
                if(PlayerInfo[i][pSeconds] >= 1800) {
                    new query[180];
                    format(query, sizeof(query), "UPDATE `users` SET `DayHours`=`DayHours`+1 WHERE `ID`='%d'", PlayerInfo[i][pSQLID]);
                    mysql_query(SQL, query);
                    format(query, sizeof(query), "UPDATE `users` SET `HoursMonth`=`HoursMonth`+1 WHERE `ID`='%d'", PlayerInfo[i][pSQLID]);
                    mysql_query(SQL, query);
                }
                PlayerInfo[i][pSeconds] = 0;
             
                if(PlayerInfo[i][pDailyLogin] == 0) {
                    PlayerInfo[i][pDailyLogin] = 1;
                    UpdateVar(i, "DailyLogin", 1);
                    SCM(i, COLOR_LIGHTBLUE, "Ai primit de doua ori mai multe respect points si bani pentru primul tau payday de astazi.");
                }

                if(PlayerInfo[i][pHouse] != 999) {
                    format(string, sizeof(string), "Paycheck: $%s | Tax: -$%d | Rent: -$%d | Old Balance: $%s", FormatNumber(checks), FormatNumber(TaxValue), HouseInfo[PlayerInfo[i][pHouse]][hRent], FormatNumber(account[i]));
                    SendClientMessage(i, COLOR_GREY, string);
                    format(string, sizeof(string), "Interest rate: 0.%d% | Interest: $%s | New balance: $%s", tmpintrate, FormatNumber(interest), FormatNumber(PlayerInfo[i][pAccount]));
                    SendClientMessage(i, COLOR_GREY, string);
                } else {
                    format(string, sizeof(string), "Paycheck: $%s | Tax: -$%d | Rent: -$0 | Old Balance: $%s", FormatNumber(checks), FormatNumber(TaxValue), FormatNumber(account[i]));
                    SendClientMessage(i, COLOR_GREY, string);
                    format(string, sizeof(string), "Interest rate: 0.%d% | Interest: $%s | New balance: $%s", tmpintrate, FormatNumber(interest), FormatNumber(PlayerInfo[i][pAccount]));
                    SendClientMessage(i, COLOR_GREY, string);
                }

                PlayerInfo[i][pPayDay] = 0;
                PlayerInfo[i][pPayCheck] = 0;
                SendClientMessage(i, COLOR_SERVER, "------------------------------------------------------------------------------------------------");
            }
        }
        if(hour == 21) {
            new gold = 1 + random(10);
            new money = 10000 + random(5000);
            for(new h = 0; h < MAX_CLANS; h++) {
                if(strlen(ClanInfo[h][clName]) != 0) {
                    if(GetClanTurfs(h) >= 10) {
                        foreach(Player, i) {
                            if(PlayerInfo[i][pClan] == h && h != 0) {
                                PlayerInfo[i][pPremiumPoints] += gold;
                                Update(i, pPremiumPointsx);
                                GivePlayerCash(i, money);
                                format(string, sizeof(string), "Ai primit %d puncte premium si $%s deoarece clanul tau are peste 10 teriotrii.", gold, FormatNumber(money));
                                SCM(i, COLOR_MONEY, string);
                            }
                        }
                    }
                }
            }
        }
        if(RestartPayday == 1) {
            SendClientMessageToAll(COLOR_CLIENT, "Server-ul a fost restartat! Va rugam sa reveniti.");
            GameModeExit();
        }
    }
    return 1;
}



This is the payday and RESETPD system.


and here is what i tried to do

CMD:payday(playerid) {
    if (PlayerInfo[playerid][pAdmin] < 6) {
        return SendClientMessage(playerid, COLOR_RED, "Nu ai permisiuni pentru a folosi aceasta comanda.");
    }

    PayDay(true);
    SendClientMessage(playerid, COLOR_GREEN, "Payday a fost acordat cu succes.");
    return 1;
}