PDA

Просмотр полной версии : [Прочее] GivePlayerMoneyPlus



m1n1vv
30.09.2016, 19:33
Решил сделать функцию GivePlayerMoney, которая сразу обрабатывает данные с переменной.


stock GivePlayerMoneyPlus(playerid, amount)
{
pInfo[playerid][pMoney] += amount;
GivePlayerMoney(playerid, amount);

if (GetPlayerMoney(playerid) != pInfo[playerid][pMoney])
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}

return 1;
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney GivePlayerMoneyPlus

GivePlayerMoneyPlus получает указанную сумму, присваивает ее к переменной и выводит количество денег в hud. А дальше проверка, если количество денег с переменной и функции не совпадает, игрок получает число с переменной.

Код желательно ставить после объявления переменной с главным энуменатором, или после всех new. Также, чтобы выше этого stock'а не было задач с GivePlayerMoney!

В паблик завершения регистрации/авторизации добавляем:

GivePlayerMoney(playerid, 0); //оставляем 0. Можно использовать для бонуса при регистрации: GivePlayerMoney(playerid, 25000);

Все просто.

StevenH
30.09.2016, 20:03
К чему переменная AmountPlus?
Судя по коду, при каждой передаче money, переменная увеличивается на +1, вопрос зачем? И если игрок получит больше 255 раз money, будет кое что не очень хорошее). Т.к. char, только 0..255

m1n1vv
30.09.2016, 20:23
К чему переменная AmountPlus?
Судя по коду, при каждой передаче money, переменная увеличивается на +1, вопрос зачем? И если игрок получит больше 255 раз money, будет кое что не очень хорошее). Т.к. char, только 0..255

if (!AmountPlus{playerid})

- - - Добавлено - - -

А хотя можно и без переменной с проверкой, а выдавать игроку 0 при загрузке данных.

GivePlayerMoney(playerid, 0);

DeimoS
30.09.2016, 21:04
А общее дублирование кода к чему?

То бишь это

pInfo[playerid][pMoney] += amount;
GivePlayerMoney(playerid, amount);
+ условие

if (GetPlayerMoney(playerid) != pInfo[playerid][pMoney])
и ещё 2 действия

ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, pInfo[playerid][pMoney]);

Как я понимаю, это попытка избавиться от постоянного вызова ResetPlayerMoney, так?
Только на деле выходит, что ты добавляешь вызов GetPlayerMoney и, собственно, обращение к массиву.
А если условие срабатывает, то ещё и GivePlayerMoney вызываешь повторно.
Шило на мыло, уроненное в тюремной душевой, меняешь :grin:

Проще сделать так, как по мне:

stock GivePlayerMoneyPlus(playerid, money)
{
pInfo[playerid][pMoney] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}

Тут ты и логику функции не меняешь (GivePlayerMoney возвращает 0 в случаях, когда игрок не подключён. Ну и во всех других случаях, когда функция не смогла выполнится), и лишних действий никаких.

Можно ещё код сделать компактнее, перенеся "+= money" в GivePlayerMoney, но просто у меня в этой функции сразу отправляется запрос в БД с обновлением денег:

stock ac_money_GivePlayerMoney(playerid, money)
{
pInfo[playerid][pMoney] += money;
if(money) UpdatePlayerMoneyInAccount(playerid);// Если в GivePlayerMoney не выдаётся 0 долларов, вызываем функцию, в которой хранится запрос на обновление денег
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney ac_money_GivePlayerMoney
поэтому код именно такой (а компактность подобному коду, имхо, не повредит)

_lizard
30.09.2016, 21:09
Проще сделать так, как по мне:

stock GivePlayerMoneyPlus(playerid, money)
{
pInfo[playerid][pMoney] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, pInfo[playerid][pMoney]);
}

ResetPlayerMoney() долго срабатывает, если у человека большая сумма на руках и ему надо дать допустим 20$, то на худе цифры будут крутиться много времени, что выглядит некрасиво

DeimoS
30.09.2016, 21:25
ResetPlayerMoney() долго срабатывает, если у человека большая сумма на руках и ему надо дать допустим 20$, то на худе цифры будут крутиться много времени, что выглядит некрасиво

Эмм, нет. Какая сумма бы не была, ты сразу её обновляешь. Попробуй использовать этот код и увидишь, что момент, когда деньги отнимает, практически незаметен

m1n1vv
30.09.2016, 22:02
ResetPlayerMoney() долго срабатывает, если у человека большая сумма на руках и ему надо дать допустим 20$, то на худе цифры будут крутиться много времени, что выглядит некрасиво

Это просто так в игре отображается

vovandolg
30.09.2016, 23:13
Ндаа и будут всякие гопники хакать эти цифры потом писать почему я не могу купить то и другое,
объяснять им что они используют читы и сумма их в другом месте будет точная))

Я бы с нуля поверх стандартного тд сунул свой который не мигал бы, не крутился, не хакался и обновлялся бы 1 функцией всего...

Nexius_Tailer
30.09.2016, 23:28
Я бы с нуля поверх стандартного тд сунул свой который не мигал бы, не крутился, не хакался и обновлялся бы 1 функцией всего...
Тогда ныли бы те, кто ставит моды на худы.
А уделять внимание тому, что какой-то читер внезапно станет возмущаться, почему его визуальное бабло не работает, как по мне, не сильно весомая проблема.

DeimoS
30.09.2016, 23:30
Ндаа и будут всякие гопники хакать эти цифры потом писать почему я не могу купить то и другое,
объяснять им что они используют читы и сумма их в другом месте будет точная))

Я бы с нуля поверх стандартного тд сунул свой который не мигал бы, не крутился, не хакался и обновлялся бы 1 функцией всего...

Сейчас бы о читерах заботиться... :crazy::crazy:

vovandolg
30.09.2016, 23:41
Оффтоп
Я вообще нытьё на сервере не люблю, поэтому всё сразу такое закрываю чтобы не было подёргиваний на нервных окончаниях:sarcastic:

KrutoyKrosch
01.10.2016, 00:36
а я бы еще такую проверку впихнул


if(pInfo[playerid][pMoney] + money < 0) return SendClientMessage(playerid, -1, !"{C4C4C4}[Оповещение]Недостаточно средств!");

что бы в моде по сто раз проверок не делать

DeimoS
01.10.2016, 11:32
а я бы еще такую проверку впихнул


if(pInfo[playerid][pMoney] + money < 0) return SendClientMessage(playerid, -1, !"{C4C4C4}[Оповещение]Недостаточно средств!");

что бы в моде по сто раз проверок не делать

Эмм, а если тебе нужно установить отрицательное значение для денег?
Всё же это функция работы с худом, не стоит туда пихать лишнее, имхо

KrutoyKrosch
01.10.2016, 13:16
да как вроде должно же отбавиться

DeimoS
01.10.2016, 14:20
да как вроде должно же отбавиться

У тебя проверка выглядит так:

если текущее число денег + выданное значение меньше нуля - показываем сообщение
то бишь

if(100 + -150) return SendClientMessage...
Или я тебя неправильно понял?

KrutoyKrosch
01.10.2016, 21:09
и опять все решают скобки)0)0

DeimoS
03.10.2016, 19:57
и опять все решают скобки)0)0

Да там что со скобками, что без - смысла не особо много в таком условии

m1n1vv
29.10.2016, 02:48
А если так?

stock GivePlayerMoneyPlus(playerid, &money, gmoney) //Не традиционно
{
money += gmoney;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, money);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney GivePlayerMoneyPlus


stock GivePlayerMoneyPlus(playerid, money)
{
money = pInfo[playerid][pMoney] += money;
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, money);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif
#define GivePlayerMoney GivePlayerMoneyPlus