PDA

Просмотр полной версии : [Вопрос] Проблема с деньгами



weather
06.03.2016, 12:42
Странная конечно проблема.

Вычитаешь у игрока деньги, а они наоборот прибавляются.
Вот убираем деньги - User[playerid][Cash] -= 250. Но в итоге они в + идут.

В секундном таймере есть Античит на деньги.


foreach (new i : Player)
{
AntiMoney();

А вот и сам паблик,


public AntiMoney()
{
foreach (new i : Player)
{
if(User[i][Cash] != GetPlayerMoney(i)) ResetPlayerMoney(i), GivePlayerMoney(i, User[i][Cash]);
}
return;
}

В чем может быть проблема?

BadPawn
06.03.2016, 13:03
new i = 350;//цена за коробку конфет к примеру
GivePlayerMoney(playerid, -i);
pInfo[playerid][pCash] = EOS;//очищаем массив
pInfo[playerid][pCash] = GetPlayerMoney(playerid);//загружаем деньги в массив

Как-то так.

ziggi
06.03.2016, 14:16
Убери вызов AntiMoney(); из таймера.



new i = 350;//цена за коробку конфет к примеру
GivePlayerMoney(playerid, -i);
pInfo[playerid][pCash] = EOS;//очищаем массив
pInfo[playerid][pCash] = GetPlayerMoney(playerid);//загружаем деньги в массив

Как-то так.

Нет. Использование GivePlayerMoney с отрицательным значением нормально не работает. "Очищать массив" здесь не нужно. Записывать деньги напрямую от игрока - это приглашение читерам.

vovandolg
06.03.2016, 15:47
Пуух)


//Засунь меня в таймер^^
new pMoney = GetPlayerMoney(playerid);
if(pInfo[playerid][pCash] < pMoney)
{
GivePlayerMoney(playerid, pInfo[playerid][pCash]);
}
else pInfo[playerid][pCash] = pMoney;




//Теперь выдавай деньги так
stock GiveMoney(playerid, amount)
{
pInfo[playerid][pCash] += amount;
GivePlayerMoney(playerid, amount);
}

DeimoS
06.03.2016, 15:57
Для чего эти бессмысленные проверки и обновления в таймере? Разве от вас убудет, если читер сможет на своей стороне увеличить число денег? Да пусть хоть бесконечными их сделает, вообще плевать должно быть. Весь "античит" пишется в 3 строки, не считая перехвата функции.

stock ac_GivePlayerMoney(playerid, money)
{
pInfo[playerid][pCash] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pCash]);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney ac_GivePlayerMoney
И не надо никаких таймеров или что-то ещё. Совершил игрок операцию с деньгами - обновили ему юзербар с деньгами, установив настоящее значение. А до этого момента пусть хоть что со своими деньгами делает