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

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

    Не могу понять в чем проблема (foreach)

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

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

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

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


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

  2. #2
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    PHP код:
    if(respponse)
    {
        foreach(
    Playeri)
        {
            if(
    listitem == post[i])
            {
                new 
    string[(52+8)+1]; 
                
    format(stringsizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$"stav[i]*2); 
                
    SendClientMessage(i, -1string); 
                
    ac_GivePlayerMoney(istav[i]*2); 
                
    stav[i] = 0
                
    post[i] = 0;
            }

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


  3. Пользователь сказал cпасибо:
    phpadmin (19.07.2017)
  4. #3
    Аватар для phpadmin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2017
    Сообщений
    103
    Репутация:
    1 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    PHP код:
    if(respponse)
    {
        foreach(
    Playeri)
        {
            if(
    listitem == post[i])
            {
                new 
    string[(52+8)+1]; 
                
    format(stringsizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$"stav[i]*2); 
                
    SendClientMessage(i, -1string); 
                
    ac_GivePlayerMoney(istav[i]*2); 
                
    stav[i] = 0
                
    post[i] = 0;
            }

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

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

  5. #4
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от phpadmin Посмотреть сообщение
    Ого спс) А можешь объяснить в чем была моя ошибка и как это решил. Буду очень благодарен.
    PHP код:
    format(stringsizeof(string), "Поздравляем ваша ставка выиграла. Ваш приз {4AD64C}%d$"stav[playerid]*2); 
    stav[playerid]


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


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

        foreach(
    Playeri
        {
            if(
    == post[i])
            {
                continue;
            }

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

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

    Последний раз редактировалось Geebrox; 19.07.2017 в 18:56.

  6. Пользователь сказал cпасибо:
    phpadmin (19.07.2017)
  7. #5
    Аватар для phpadmin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2017
    Сообщений
    103
    Репутация:
    1 ±
    Обязательно проверю, спасибо. Можно узнать. Если к примеру доступ к выбору победителя будет доступен лишь третьему лицу.
    Например 2 игрока поставили на "Лист 1" и "Лист 2" и потом третий человек уже во втором диалоге выбирает один из двух листов. И все без бага будет? Типа смешивании чатов не должно же быть?

    - - - Updated - - -

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

    - - - Updated - - -

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

  8. #6
    Аватар для phpadmin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.05.2017
    Сообщений
    103
    Репутация:
    1 ±
    Пока что главное что бы без бага было, про оптимизацию тоже надо наверное подумать там же все id чекает тех кто онлайн? Это можно какими то проверками запретить что бы фореач не чекал всех подряд. А именно тех кто на данный момент у кого активно post[playerid] каким то образом. Ладно на этом спасибо. :D не могу нарадоватья пока что

  9. #7
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от phpadmin Посмотреть сообщение
    Это можно какими то проверками запретить что бы фореач не чекал всех подряд. А именно тех кто на данный момент у кого активно post[playerid] каким то образом.
    через итераторы, создай отдельный итератор и используй его чтобы вывести всех игроков с "активным" post.
    Урок про итераторы на оф форуме
    Русский урок от vvwvv на p-p

 

 

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

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

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

Ваши права

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