PDA

Просмотр полной версии : [Вопрос] Система банков фракций



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

код



CMD:bank(playerid, params[])
{
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] > 0 || PlayerInfo[playerid][pMember] > 0 && strcmp(PlayerInfo[playerid][pSendername],FracInfo[PlayerInfo[playerid][pMember]][fAssistant],true) == 0)
{
BankFracEnter(playerid);
SendClientMessage(playerid,-1,"Все Ваши действия записаны в лог.");
full++;
}
else SendClientMessage(playerid, COLOR_GREY, YouCanNot);
}
else SendClientMessage(playerid, COLOR_GREY, YouCanNot);
return true;
}






stock BankFracEnter(playerid)
{
new bank;
if(PlayerInfo[playerid][pMember] == F_GOPOTA) bank = FracBank[0];
if(PlayerInfo[playerid][pMember] == F_LYTBRATVA) bank = FracBank[1];
if(PlayerInfo[playerid][pMember] == F_POLICE) bank = FracBank[2];
if(PlayerInfo[playerid][pMember] == F_DPS) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_BATBRATVA) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_UGBRATVA) bank = FracBank[4];
if(PlayerInfo[playerid][pMember] == F_YAKUZA) bank = FracBank[5];
if(PlayerInfo[playerid][pMember] == F_LCN) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_RM) bank = FracBank[7];
if(PlayerInfo[playerid][pMember] == F_RYTM) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_ANTENCINO) bank = FracBank[9];
format(totalstring, 256, "Вывести средства из банка организации\nВвод средств в банк организации\nВ банке организации: %i рублей", bank);
ShowPlayerDialog(playerid, D_JOB+131, 2, "{66CC00}Банк", totalstring, "Принять", "Отмена");
return true;
}









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

case D_JOB+132:
{
if(!response) return BankFracEnter(playerid);
new price, bank;
if(sscanf(inputtext, "i",price)) return ShowPlayerDialog(playerid, D_JOB+132, 1, "Вывод", "Введите кол-во рублей:", "Принять", "Назад");
if(PlayerInfo[playerid][pMember] == F_GOPOTA) bank = FracBank[0];
if(PlayerInfo[playerid][pMember] == F_LYTBRATVA) bank = FracBank[1];
if(PlayerInfo[playerid][pMember] == F_POLICE) bank = FracBank[2];
if(PlayerInfo[playerid][pMember] == F_DPS) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_BATBRATVA) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_UGBRATVA) bank = FracBank[4];
if(PlayerInfo[playerid][pMember] == F_YAKUZA) bank = FracBank[5];
if(PlayerInfo[playerid][pMember] == F_LCN) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_RM) bank = FracBank[7];
if(PlayerInfo[playerid][pMember] == F_RYTM) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_ANTENCINO) bank = FracBank[9];
if(price < 1 || price > bank)
{
SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", bank);
return ShowPlayerDialog(playerid, D_JOB+132, 1, "Вывод", "Введите кол-во рублей:", "Принять", "Назад");
}
SendMes(playerid, COLOR_BLUE, "Вы вывели %i рублей из банка организации. Остаток: %i рублей", price, bank-price);
GiveMoney(playerid, price);
if(PlayerInfo[playerid][pMember] == F_GOPOTA) SetOtherInt("gopbank", FracBank[1]),FracBank[1]-=price;
if(PlayerInfo[playerid][pMember] == F_LYTBRATVA) SetOtherInt("lbbank", FracBank[1]),FracBank[1]-=price;
if(PlayerInfo[playerid][pMember] == F_POLICE) SetOtherInt("lspdbank", FracBank[2]),FracBank[2]-=price;
if(PlayerInfo[playerid][pMember] == F_DPS) SetOtherInt("sfpdbank", FracBank[3]),FracBank[3]-=price;
if(PlayerInfo[playerid][pMember] == F_BATBRATVA) SetOtherInt("lspdbank", FracBank[2]),FracBank[2]-=price;
if(PlayerInfo[playerid][pMember] == F_UGBRATVA) SetOtherInt("ubbank", FracBank[4]),FracBank[4]-=price;
if(PlayerInfo[playerid][pMember] == F_YAKUZA) SetOtherInt("yakuzabank", FracBank[5]),FracBank[5]-=price;
if(PlayerInfo[playerid][pMember] == F_LCN) SetOtherInt("lcnbank", FracBank[6]),FracBank[6]-=price;
if(PlayerInfo[playerid][pMember] == F_RM) SetOtherInt("rmbank", FracBank[7]),FracBank[7]-=price;
if(PlayerInfo[playerid][pMember] == F_RYTM) SetOtherInt("rytmbank", FracBank[8]),FracBank[8]-=price;
if(PlayerInfo[playerid][pMember] == F_ANTENCINO) SetOtherInt("antenkinobank", FracBank[9]),FracBank[9]-=price;
return true;
}
case D_JOB+133:
{
new price, bank;
if(!response) return BankFracEnter(playerid);
if(sscanf(inputtext, "i",price)) return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
if(price < 1 || price > GetMoney(playerid))
{
SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", GetMoney(playerid));
return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
}
if(sscanf(inputtext, "i",price)) return ShowPlayerDialog(playerid, D_JOB+132, 1, "Вывод", "Введите кол-во рублей:", "Принять", "Назад");
if(PlayerInfo[playerid][pMember] == F_GOPOTA) bank = FracBank[0];
if(PlayerInfo[playerid][pMember] == F_LYTBRATVA) bank = FracBank[1];
if(PlayerInfo[playerid][pMember] == F_POLICE) bank = FracBank[2];
if(PlayerInfo[playerid][pMember] == F_DPS) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_BATBRATVA) bank = FracBank[3];
if(PlayerInfo[playerid][pMember] == F_UGBRATVA) bank = FracBank[4];
if(PlayerInfo[playerid][pMember] == F_YAKUZA) bank = FracBank[5];
if(PlayerInfo[playerid][pMember] == F_LCN) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_RM) bank = FracBank[7];
if(PlayerInfo[playerid][pMember] == F_RYTM) bank = FracBank[8];
if(PlayerInfo[playerid][pMember] == F_ANTENCINO) bank = FracBank[9];
new sbank = bank+price;
SendMes(playerid, COLOR_BLUE, "Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей", price, sbank);
GiveMoney(playerid, -price);
if(PlayerInfo[playerid][pMember] == F_GOPOTA) SetOtherInt("gopbank", FracBank[0]),FracBank[0] +=price;
if(PlayerInfo[playerid][pMember] == F_LYTBRATVA) SetOtherInt("lbbank", FracBank[1]),FracBank[1]+=price;
if(PlayerInfo[playerid][pMember] == F_POLICE) SetOtherInt("lspdbank", FracBank[2]),FracBank[2]+=price;
if(PlayerInfo[playerid][pMember] == F_DPS) SetOtherInt("sfpdbank", FracBank[3]),FracBank[3]+=price;
if(PlayerInfo[playerid][pMember] == F_BATBRATVA) SetOtherInt("lspdbank", FracBank[2]),FracBank[2]+=price;
if(PlayerInfo[playerid][pMember] == F_UGBRATVA) SetOtherInt("ubbank", FracBank[4]),FracBank[4]+=price;
if(PlayerInfo[playerid][pMember] == F_YAKUZA) SetOtherInt("yakuzabank", FracBank[5]),FracBank[5]+=price;
if(PlayerInfo[playerid][pMember] == F_LCN) SetOtherInt("lcnbank", FracBank[6]),FracBank[6]+=price;
if(PlayerInfo[playerid][pMember] == F_RM) SetOtherInt("rmbank", FracBank[7]),FracBank[7]+=price;
if(PlayerInfo[playerid][pMember] == F_RYTM) SetOtherInt("rytmbank", FracBank[8]),FracBank[8]+=price;
if(PlayerInfo[playerid][pMember] == F_ANTENCINO) SetOtherInt("antenkinobank", FracBank[9]),FracBank[9]+=price;
return true;
}

DeimoS
11.09.2019, 11:53
У тебя в коде какая-то каша. Зачем 2 раза вызываешь sscanf? Зачем такая вереница условий, если можно просто сопоставить ID фракции с индексом массива FracBank и из 20 строк сделать 3?


Ну а проблема в том, что ты сначала вызываешь функцию обновления информации о банке, а потом только изменяешь количество денег в банке.
Вот это

SetOtherInt("gopbank", FracBank[0]),FracBank[0] +=price;
Нужно превратить в это

FracBank[0] +=price, SetOtherInt("gopbank", FracBank[0]);
Или в это

SetOtherInt("gopbank", (FracBank[0] += price));

Хотя, как я выше написал, лучше просто сопоставить ID фракций с ячейками FracBank, просто, например, отнимая от ID фракции единицу и получая нужный номер ячейки (если ID фракций у тебя идут с 1 и по порядку). Ну и SetOtherInt изменил, убрав указание имени столбца и сделав вместо этого указание номера фракции, а уже в самой функции SetOtherInt при помощи номера фракции получал нужный столбец. Это и написание кода упростит, и сэкономит кучу памяти, ибо сейчас каждый твой SetOtherInt дублирует в памяти все названия столбцов столько раз, сколько у тебя в коде есть SetOtherInt.
В общем, получился бы такой код:
case D_JOB+133:
{
if(!response)
return BankFracEnter(playerid);

new price;
if(sscanf(inputtext, "i",price))
return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");

if(price < 1 || price > GetMoney(playerid))
{
SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", GetMoney(playerid));
return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
}
new idx = PlayerInfo[playerid][pMember]-1;
new sbank = FracBank[idx]+price;
SendMes(playerid, COLOR_BLUE, "Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей", price, sbank);
GiveMoney(playerid, -price);
SetOtherInt(PlayerInfo[playerid][pMember], sbank);
return true;
}

Хотя я бы ещё по пальцам надавал бы за это:

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

Andrik851
12.09.2019, 19:27
У тебя в коде какая-то каша. Зачем 2 раза вызываешь sscanf? Зачем такая вереница условий, если можно просто сопоставить ID фракции с индексом массива FracBank и из 20 строк сделать 3?


Ну а проблема в том, что ты сначала вызываешь функцию обновления информации о банке, а потом только изменяешь количество денег в банке.
Вот это

SetOtherInt("gopbank", FracBank[0]),FracBank[0] +=price;
Нужно превратить в это

FracBank[0] +=price, SetOtherInt("gopbank", FracBank[0]);
Или в это

SetOtherInt("gopbank", (FracBank[0] += price));

Хотя, как я выше написал, лучше просто сопоставить ID фракций с ячейками FracBank, просто, например, отнимая от ID фракции единицу и получая нужный номер ячейки (если ID фракций у тебя идут с 1 и по порядку). Ну и SetOtherInt изменил, убрав указание имени столбца и сделав вместо этого указание номера фракции, а уже в самой функции SetOtherInt при помощи номера фракции получал нужный столбец. Это и написание кода упростит, и сэкономит кучу памяти, ибо сейчас каждый твой SetOtherInt дублирует в памяти все названия столбцов столько раз, сколько у тебя в коде есть SetOtherInt.
В общем, получился бы такой код:
case D_JOB+133:
{
if(!response)
return BankFracEnter(playerid);

new price;
if(sscanf(inputtext, "i",price))
return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");

if(price < 1 || price > GetMoney(playerid))
{
SendMes(playerid, COLOR_GREY, "Кол-во рублей от 1 до %i!", GetMoney(playerid));
return ShowPlayerDialog(playerid, D_JOB+133, 1, "Ввод", "Введите кол-во рублей:", "Принять", "Назад");
}
new idx = PlayerInfo[playerid][pMember]-1;
new sbank = FracBank[idx]+price;
SendMes(playerid, COLOR_BLUE, "Вы ввели %i рублей на счет банка организации. Теперь в банке: %i рублей", price, sbank);
GiveMoney(playerid, -price);
SetOtherInt(PlayerInfo[playerid][pMember], sbank);
return true;
}

Хотя я бы ещё по пальцам надавал бы за это:

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

Спасибо за ответ но я уже догадался

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