PDA

Просмотр полной версии : [Вопрос] Не могу понять в чем проблема (foreach)



phpadmin
18.07.2017, 22:36
Помогите если не сложно решить проблему. Заранее спасибо.
Например на сервере 2 игрока (я в том числе) Общее кол. игроков на сервере 2.
Есть диалог с двумя выборами "Лист 1" и "Лист 2" , Допусти Я выбрал "Лист 1", Игрок 2 выбирает соответственно "Лист 2".

Дальше есть команда которой вызывает другой диалог, в данном диалоге находиться "Лист 1" и "Лист 2".
*Данным диалогом выбираешь победителя.
Данный диалог определяет победителя. Как мы помним Я выбирал "Лист 1", то есть, если я её выберу то победителем буду Я. И мне дадут 200$

Собственно сама проблема: Если я выберу "Лист 2" (где диалог по выбору победителя) То получается баг, по сути 200$ должны пойти к человеку который выбирал "Лист 2", но пишет "Вы проиграли" но мне дают 200$, а тому челу который выбрал "Лист 2" пишет "Поздравляем ваша ставка выиграла. Ваш приз: 0$.

Если ничего не понятно продемонстрирую на скринах. Вникните в текст сверху. Прошу помочь исправить данный баг.


Сам код:

if(response)
{
switch(listitem)
{
case 0:
{
foreach(new i : Player)
{
if(post[i] == 1)
{
new string[(52+8)+1];
format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[playerid]*2);
SendClientMessage(i, -1, string);
ac_GivePlayerMoney(playerid, stav[playerid]*2);
stav[i] = 0;
post[i] = 0;
}
}
foreach(new i : Player)
{
if(post[i] == 2)
{
SendClientMessage(i, -1, "Ваша ставка проиграла.");
stav[i] = 0;
post[i] = 0;
}
}
stavki[0] = 0;
}
case 1:
{
foreach(new i : Player)
{
if(post[i] == 1)
{
SendClientMessage(i, -1, "Ваша ставка проиграла.");
stav[i] = 0;
post[i] = 0;
}
}
foreach(new i : Player)
{
if(post[i] == 2)
{
new string[(52+8)+1];
format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[playerid]*2);
SendClientMessage(i, -1, string);
ac_GivePlayerMoney(playerid, stav[playerid]*2);
stav[i] = 0;
post[i] = 0;
}
}
stavki[0] = 0;
stavki[1] = 0;
stavki[2] = 0;
}
}
OnPlayerUpdate(playerid);
}

Geebrox
19.07.2017, 05:07
if(respponse)
{
foreach(Player, i)
{
if(listitem + 1 == post[i])
{
new string[(52+8)+1];
format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[i]*2);
SendClientMessage(i, -1, string);
ac_GivePlayerMoney(i, stav[i]*2);
stav[i] = 0;
post[i] = 0;
}

else
{
SendClientMessage(i, -1, "Ваша ставка проиграла.");
stav[i] = 0;
post[i] = 0;
}
}
}

phpadmin
19.07.2017, 13:19
if(respponse)
{
foreach(Player, i)
{
if(listitem + 1 == post[i])
{
new string[(52+8)+1];
format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[i]*2);
SendClientMessage(i, -1, string);
ac_GivePlayerMoney(i, stav[i]*2);
stav[i] = 0;
post[i] = 0;
}

else
{
SendClientMessage(i, -1, "Ваша ставка проиграла.");
stav[i] = 0;
post[i] = 0;
}
}
}

Ого спс) А можешь объяснить в чем была моя ошибка и как это решил. Буду очень благодарен.

Geebrox
19.07.2017, 18:50
Ого спс) А можешь объяснить в чем была моя ошибка и как это решил. Буду очень благодарен.


format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[playerid]*2);
stav[playerid]



ac_GivePlayerMoney(playerid, stav[playerid]*2);
playerid, stav[playerid]
В основном тут, не говоря про оптимизацию.


Кстати, в коде выше я не учел один момент, а именно, когда игрок не делает ставку (post[i] == 0)
Вот обновленная версия (я некоторые части из твоего кода не добавлял, т.к. не увидел смысла, если что сам добавишь):

if(respponse)
{
foreach(Player, i)
{
if(0 == post[i])
{
continue;
}

else if(listitem + 1 == post[i])
{
new string[(52+8)+1];
format(string, sizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$", stav[i]*2);
SendClientMessage(i, -1, string);
ac_GivePlayerMoney(i, stav[i]*2);
stav[i] = 0;
post[i] = 0;
}

else
{
SendClientMessage(i, -1, "Ваша ставка проиграла.");
stav[i] = 0;
post[i] = 0;
}
}
}

phpadmin
19.07.2017, 22:31
Обязательно проверю, спасибо. Можно узнать. Если к примеру доступ к выбору победителя будет доступен лишь третьему лицу.
Например 2 игрока поставили на "Лист 1" и "Лист 2" и потом третий человек уже во втором диалоге выбирает один из двух листов. И все без бага будет? Типа смешивании чатов не должно же быть?

- - - Updated - - -

Да огромнейшее спасибо, если бы не ты я век бы думал какие нужны будут проверки. А ты с countie сразу решил.
Завтра или ночью проверю на 3 людей. На баги буду чекать крч. Если найду отпишусь, а так пока что найс)

- - - Updated - - -

А так без неё смешивался чат и SendClientMessage выбирал других игроков которые даже не ставили . Ну с этим ясно что фореач пробегается по всем игрокам, а запрета на значение поста 0 небыло. Огромное спасибо

phpadmin
19.07.2017, 23:03
Пока что главное что бы без бага было, про оптимизацию тоже надо наверное подумать там же все id чекает тех кто онлайн? Это можно какими то проверками запретить что бы фореач не чекал всех подряд. А именно тех кто на данный момент у кого активно post[playerid] каким то образом. Ладно на этом спасибо. :D не могу нарадоватья пока что

Geebrox
20.07.2017, 10:53
Это можно какими то проверками запретить что бы фореач не чекал всех подряд. А именно тех кто на данный момент у кого активно post[playerid] каким то образом.

через итераторы, создай отдельный итератор и используй его чтобы вывести всех игроков с "активным" post.
Урок про итераторы на оф форуме (http://forum.sa-mp.com/showthread.php?t=570937)
Русский урок от vvwvv на p-p (http://pro-pawn.ru/showthread.php?15081-%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B-%D0%B2-Pawn)