Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3
  1. #1
    Аватар для Andrik851
    Пользователь

    Статус
    Оффлайн
    Регистрация
    03.10.2018
    Сообщений
    186
    Репутация:
    1 ±

    Система банков фракций

    Помогите пожалуйста обнаружил такую проблемму что когда ложу в банк организации определенную сумму средств после перезахода
    баланс не изменяется ложу повторно эту же сумму вот тогда начисляется и так постоянно со второй попытки и для каждой организации одно и то же

    код

    PHP код:
    CMD:bank(playeridparams[])
    {
        if(!
    PlayerLogged[playerid]) return true;
        if(
    PlayerInfo[playerid][pMember] == F_GOPOTA || PlayerInfo[playerid][pMember] == F_LYTBRATVA || PlayerInfo[playerid][pMember] == F_POLICE || PlayerInfo[playerid][pMember] == F_DPS || PlayerInfo[playerid][pMember] == F_BATBRATVA || PlayerInfo[playerid][pMember] == F_UGBRATVA || PlayerInfo[playerid][pMember] == F_YAKUZA || PlayerInfo[playerid][pMember] == F_LCN || PlayerInfo[playerid][pMember] == F_RM || PlayerInfo[playerid][pMember] == F_RYTM || PlayerInfo[playerid][pMember] == F_ANTENCINO)
        {
            new 
    full;
            if(
    PlayerInfo[playerid][pLeader] > || PlayerInfo[playerid][pMember] > && strcmp(PlayerInfo[playerid][pSendername],FracInfo[PlayerInfo[playerid][pMember]][fAssistant],true) == 0)
            {
                
    BankFracEnter(playerid);
                
    SendClientMessage(playerid,-1,"Все Ваши действия записаны в лог.");
                
    full++;
            }
            else 
    SendClientMessage(playeridCOLOR_GREYYouCanNot);
        }
        else 
    SendClientMessage(playeridCOLOR_GREYYouCanNot);
        return 
    true;
    }






    stock BankFracEnter(playerid)
    {
        new 
    bank;
        if(
    PlayerInfo[playerid][pMember] == F_GOPOTAbank FracBank[0];
        if(
    PlayerInfo[playerid][pMember] == F_LYTBRATVAbank FracBank[1];
        if(
    PlayerInfo[playerid][pMember] == F_POLICEbank FracBank[2];
        if(
    PlayerInfo[playerid][pMember] == F_DPSbank FracBank[3];
        if(
    PlayerInfo[playerid][pMember] == F_BATBRATVAbank FracBank[3];
        if(
    PlayerInfo[playerid][pMember] == F_UGBRATVAbank FracBank[4];
        if(
    PlayerInfo[playerid][pMember] == F_YAKUZAbank FracBank[5];
        if(
    PlayerInfo[playerid][pMember] == F_LCNbank FracBank[8];
        if(
    PlayerInfo[playerid][pMember] == F_RMbank FracBank[7];
        if(
    PlayerInfo[playerid][pMember] == F_RYTMbank FracBank[8];
        if(
    PlayerInfo[playerid][pMember] == F_ANTENCINObank FracBank[9];
        
    format(totalstring256"Вывести средства из банка организации\nВвод средств в банк организации\nВ банке организации: %i рублей"bank);
        
    ShowPlayerDialog(playeridD_JOB+1312"{66CC00}Банк"totalstring"Принять""Отмена");
        return 
    true;
    }









        case 
    D_JOB+131:
            {
                if(!
    response) return true;
                switch(
    listitem)
                {
                case 
    0ShowPlayerDialog(playeridD_JOB+1321"{66CC00}Вывод""Введите кол-во рублей:""Принять""Назад");
                case 
    1ShowPlayerDialog(playeridD_JOB+1331"{66CC00}Ввод""Введите кол-во рублей:""Принять""Назад");
                case 
    2BankFracEnter(playerid);
                }
            }

        case 
    D_JOB+132:
            {
                if(!
    response) return BankFracEnter(playerid);
                new 
    pricebank;
                if(
    sscanf(inputtext"i",price)) return ShowPlayerDialog(playeridD_JOB+1321"Вывод""Введите кол-во рублей:""Принять""Назад");
                if(
    PlayerInfo[playerid][pMember] == F_GOPOTAbank FracBank[0];
                if(
    PlayerInfo[playerid][pMember] == F_LYTBRATVAbank FracBank[1];
                if(
    PlayerInfo[playerid][pMember] == F_POLICEbank FracBank[2];
                if(
    PlayerInfo[playerid][pMember] == F_DPSbank FracBank[3];
                if(
    PlayerInfo[playerid][pMember] == F_BATBRATVAbank FracBank[3];
                if(
    PlayerInfo[playerid][pMember] == F_UGBRATVAbank FracBank[4];
                if(
    PlayerInfo[playerid][pMember] == F_YAKUZAbank FracBank[5];
                if(
    PlayerInfo[playerid][pMember] == F_LCNbank FracBank[8];
                if(
    PlayerInfo[playerid][pMember] == F_RMbank FracBank[7];
                if(
    PlayerInfo[playerid][pMember] == F_RYTMbank FracBank[8];
                if(
    PlayerInfo[playerid][pMember] == F_ANTENCINObank FracBank[9];
                if(
    price || price bank)
                {
                    
    SendMes(playeridCOLOR_GREY"Кол-во рублей от 1 до %i!"bank);
                    return 
    ShowPlayerDialog(playeridD_JOB+1321"Вывод""Введите кол-во рублей:""Принять""Назад");
                }
                
    SendMes(playeridCOLOR_BLUE"Вы вывели %i рублей из банка организации. Остаток: %i рублей"pricebank-price);
                
    GiveMoney(playeridprice);
                if(
    PlayerInfo[playerid][pMember] == F_GOPOTA)  SetOtherInt("gopbank"FracBank[1]),FracBank[1]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_LYTBRATVASetOtherInt("lbbank"FracBank[1]),FracBank[1]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_POLICESetOtherInt("lspdbank"FracBank[2]),FracBank[2]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_DPSSetOtherInt("sfpdbank"FracBank[3]),FracBank[3]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_BATBRATVASetOtherInt("lspdbank"FracBank[2]),FracBank[2]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_UGBRATVASetOtherInt("ubbank"FracBank[4]),FracBank[4]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_YAKUZASetOtherInt("yakuzabank"FracBank[5]),FracBank[5]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_LCNSetOtherInt("lcnbank"FracBank[6]),FracBank[6]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_RMSetOtherInt("rmbank"FracBank[7]),FracBank[7]-=price;
                if(
    PlayerInfo[playerid][pMember] == F_RYTMSetOtherInt("rytmbank"FracBank[8]),FracBank[8]-=price;
                 if(
    PlayerInfo[playerid][pMember] == F_ANTENCINOSetOtherInt("antenkinobank"FracBank[9]),FracBank[9]-=price;
                return 
    true;
            }
        case 
    D_JOB+133:
            {
                new 
    pricebank;
                if(!
    response) return BankFracEnter(playerid);
                if(
    sscanf(inputtext"i",price)) return ShowPlayerDialog(playeridD_JOB+1331"Ввод""Введите кол-во рублей:""Принять""Назад");
                if(
    price || price GetMoney(playerid))
                {
                    
    SendMes(playeridCOLOR_GREY"Кол-во рублей от 1 до %i!"GetMoney(playerid));
                    return 
    ShowPlayerDialog(playeridD_JOB+1331"Ввод""Введите кол-во рублей:""Принять""Назад");
                }
                if(
    sscanf(inputtext"i",price)) return ShowPlayerDialog(playeridD_JOB+1321"Вывод""Введите кол-во рублей:""Принять""Назад");
                if(
    PlayerInfo[playerid][pMember] == F_GOPOTAbank FracBank[0];
                if(
    PlayerInfo[playerid][pMember] == F_LYTBRATVAbank FracBank[1];
                if(
    PlayerInfo[playerid][pMember] == F_POLICEbank FracBank[2];
                if(
    PlayerInfo[playerid][pMember] == F_DPSbank FracBank[3];
                if(
    PlayerInfo[playerid][pMember] == F_BATBRATVAbank FracBank[3];
                if(
    PlayerInfo[playerid][pMember] == F_UGBRATVAbank FracBank[4];
                if(
    PlayerInfo[playerid][pMember] == F_YAKUZAbank FracBank[5];
                if(
    PlayerInfo[playerid][pMember] == F_LCNbank FracBank[8];
                if(
    PlayerInfo[playerid][pMember] == F_RMbank FracBank[7];
                if(
    PlayerInfo[playerid][pMember] == F_RYTMbank FracBank[8];
                if(
    PlayerInfo[playerid][pMember] == F_ANTENCINObank FracBank[9];
                new 
    sbank bank+price;
                
    SendMes(playeridCOLOR_BLUE"Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей"pricesbank);
                
    GiveMoney(playerid, -price);
                if(
    PlayerInfo[playerid][pMember] == F_GOPOTA)  SetOtherInt("gopbank"FracBank[0]),FracBank[0] +=price;
                if(
    PlayerInfo[playerid][pMember] == F_LYTBRATVASetOtherInt("lbbank"FracBank[1]),FracBank[1]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_POLICESetOtherInt("lspdbank"FracBank[2]),FracBank[2]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_DPSSetOtherInt("sfpdbank"FracBank[3]),FracBank[3]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_BATBRATVASetOtherInt("lspdbank"FracBank[2]),FracBank[2]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_UGBRATVASetOtherInt("ubbank"FracBank[4]),FracBank[4]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_YAKUZASetOtherInt("yakuzabank"FracBank[5]),FracBank[5]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_LCNSetOtherInt("lcnbank"FracBank[6]),FracBank[6]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_RMSetOtherInt("rmbank"FracBank[7]),FracBank[7]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_RYTMSetOtherInt("rytmbank"FracBank[8]),FracBank[8]+=price;
                if(
    PlayerInfo[playerid][pMember] == F_ANTENCINOSetOtherInt("antenkinobank"FracBank[9]),FracBank[9]+=price;
                return 
    true;
            } 

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,065
    Репутация:
    1820 ±
    У тебя в коде какая-то каша. Зачем 2 раза вызываешь sscanf? Зачем такая вереница условий, если можно просто сопоставить ID фракции с индексом массива FracBank и из 20 строк сделать 3?


    Ну а проблема в том, что ты сначала вызываешь функцию обновления информации о банке, а потом только изменяешь количество денег в банке.
    Вот это
    PHP код:
    SetOtherInt("gopbank"FracBank[0]),FracBank[0] +=price
    Нужно превратить в это
    PHP код:
    FracBank[0] +=priceSetOtherInt("gopbank"FracBank[0]); 
    Или в это
    PHP код:
    SetOtherInt("gopbank", (FracBank[0] += price)); 
    Хотя, как я выше написал, лучше просто сопоставить ID фракций с ячейками FracBank, просто, например, отнимая от ID фракции единицу и получая нужный номер ячейки (если ID фракций у тебя идут с 1 и по порядку). Ну и SetOtherInt изменил, убрав указание имени столбца и сделав вместо этого указание номера фракции, а уже в самой функции SetOtherInt при помощи номера фракции получал нужный столбец. Это и написание кода упростит, и сэкономит кучу памяти, ибо сейчас каждый твой SetOtherInt дублирует в памяти все названия столбцов столько раз, сколько у тебя в коде есть SetOtherInt.
    В общем, получился бы такой код:
    1. case D_JOB+133:
    2. {
    3. if(!response)
    4. return BankFracEnter(playerid);
    5.  
    6. new price;
    7. if(sscanf(inputtext, "i",price))
    8. return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
    9.  
    10. if(price < 1 || price > GetMoney(playerid))
    11. {
    12. SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", GetMoney(playerid));
    13. return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
    14. }
    15. new idx = PlayerInfo[playerid][pMember]-1;
    16. new sbank = FracBank[idx]+price;
    17. SendMes(playerid, COLOR_BLUE, "Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей", price, sbank);
    18. GiveMoney(playerid, -price);
    19. SetOtherInt(PlayerInfo[playerid][pMember], sbank);
    20. return true;
    21. }


    Хотя я бы ещё по пальцам надавал бы за это:
    PHP код:
    case D_JOB+133
    С тем же успехом можно просто рандомное число сюда записывать, надеясь, что оно не будет занято. Делать так - лютый говнокод. В качестве ID объекта нужно указывать ТОЛЬКО константы из enum. Не нужно заниматься подобным прибавлением.
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Andrik851
    Пользователь

    Статус
    Оффлайн
    Регистрация
    03.10.2018
    Сообщений
    186
    Репутация:
    1 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    У тебя в коде какая-то каша. Зачем 2 раза вызываешь sscanf? Зачем такая вереница условий, если можно просто сопоставить ID фракции с индексом массива FracBank и из 20 строк сделать 3?


    Ну а проблема в том, что ты сначала вызываешь функцию обновления информации о банке, а потом только изменяешь количество денег в банке.
    Вот это
    PHP код:
    SetOtherInt("gopbank"FracBank[0]),FracBank[0] +=price
    Нужно превратить в это
    PHP код:
    FracBank[0] +=priceSetOtherInt("gopbank"FracBank[0]); 
    Или в это
    PHP код:
    SetOtherInt("gopbank", (FracBank[0] += price)); 
    Хотя, как я выше написал, лучше просто сопоставить ID фракций с ячейками FracBank, просто, например, отнимая от ID фракции единицу и получая нужный номер ячейки (если ID фракций у тебя идут с 1 и по порядку). Ну и SetOtherInt изменил, убрав указание имени столбца и сделав вместо этого указание номера фракции, а уже в самой функции SetOtherInt при помощи номера фракции получал нужный столбец. Это и написание кода упростит, и сэкономит кучу памяти, ибо сейчас каждый твой SetOtherInt дублирует в памяти все названия столбцов столько раз, сколько у тебя в коде есть SetOtherInt.
    В общем, получился бы такой код:
    1. case D_JOB+133:
    2. {
    3. if(!response)
    4. return BankFracEnter(playerid);
    5.  
    6. new price;
    7. if(sscanf(inputtext, "i",price))
    8. return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
    9.  
    10. if(price < 1 || price > GetMoney(playerid))
    11. {
    12. SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", GetMoney(playerid));
    13. return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
    14. }
    15. new idx = PlayerInfo[playerid][pMember]-1;
    16. new sbank = FracBank[idx]+price;
    17. SendMes(playerid, COLOR_BLUE, "Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей", price, sbank);
    18. GiveMoney(playerid, -price);
    19. SetOtherInt(PlayerInfo[playerid][pMember], sbank);
    20. return true;
    21. }


    Хотя я бы ещё по пальцам надавал бы за это:
    PHP код:
    case D_JOB+133
    С тем же успехом можно просто рандомное число сюда записывать, надеясь, что оно не будет занято. Делать так - лютый говнокод. В качестве ID объекта нужно указывать ТОЛЬКО константы из enum. Не нужно заниматься подобным прибавлением.
    Спасибо за ответ но я уже догадался

    тему можно закрывать

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •