Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±

    Запутался в системе

    Доброго времени суток. Прошу помощи в написании, запутался в системе)

    Я пытался сделать такую вот интересную систему.

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

    Далее получаем ответ:

    Как оказывается в базе данных есть такой номер фракции с таким же номером ранга.
    НО
    Их имеется трое образно говоря
    Test1 | Ранг: 1 | Фракция: 1 | automat_assig: 1
    Test2 | Ранг: 1 | Фракция: 1 | automat_assig: 1
    Test3 | Ранг: 1 | Фракция: 1 | automat_assig: 0

    Теперь нам нужно загрузить automat_assig
    Она и есть наша главная цель.
    - Загрузили.

    Мы видим, что у нас 3 названия это (Test1,Test2,Test3) и у них имеется automat_assig: 1
    Только у Test3 automat_assig: 0
    Делаем следующий вывод, нам нужно рандомно назначит игрока на должности где: automat_assig: 1
    Т.е назначит на Test1 или Test2 при этом всём сделать это нужно рандомно.

    Перейдем к следующему этапу:

    Если же Test1,Test3,имеют automat_assig: 0
    А Test2 имеет automat_assig: 1
    То назначаем игрока на должность Test2
    Если же Test1,Test2,Test3 имеют: automat_assig: 0
    Не назначаем игрока некуда.
    PHP код:
        new frac_id 1;
        new 
    frac_rank 1;
        new 
    mysql_Str[90];
        
    format(mysql_Str,sizeof(mysql_Str), "SELECT * FROM `baza_danih` WHERE `id_frack`='%d' AND `rank_frack`='%d'"frac_id,frac_rank);
        
    mysql_function_query(MysqlConnect,mysql_Strtrue"CallBack","ddd",playerid,frac_id,frac_rank); 

    Параметр: number_ids отвечает за то на какую должность ставить.
    PHP код:
    forward CallBack(playerid,rank_ids,frac_ids);
    public 
    CallBack(playerid,rank_ids,frac_ids)
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields,MysqlConnect);
        
    cache_get_row_count(rows); 
        new 
    rand random(2);
        new 
    bool:auto_s[6];
        new 
    number_ids[6];
        for(new 
    0rowsi++)
        {
            
    auto_s[frac_ids] = bool:cache_get_field_content_int(i, !"automat_assig"MysqlConnect);
            
    number_ids[frac_ids] = cache_get_field_content_int(i, !"number_id"MysqlConnect);
        }
        if(
    auto_s[frac_ids] == true)
        {
            switch(
    rand)
            {
            case 
    0printf("Назначаем на 0 должность");            
            case 
    1printf("Назначаем на 1 должность");
            }
        }
        return 
    1;


  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Во-первых, если я правильно понял суть системы, то проще один раз загрузить ранги и уже потом работать с загруженными данными, а не каждый раз обращаться к базе.
    Во-вторых, то, что ты хочешь сделать, выглядит как-то так:
    1. #define MAX_RANK_IN_TABLE 6// Максимально возможное количество названий для ранга
    2.  
    3. forward CallBack(playerid,rank_ids,frac_ids);
    4. public CallBack(playerid,rank_ids,frac_ids)
    5. {
    6. new rows, fields;
    7. cache_get_data(rows, fields, MysqlConnect);
    8. cache_get_row_count(rows);
    9. if(!rows)
    10. return;
    11. if(rows > MAX_RANK_IN_TABLE)
    12. rows = MAX_RANK_IN_TABLE;
    13.  
    14. new bool:auto_s[MAX_RANK_IN_TABLE];
    15. new number_ids[MAX_RANK_IN_TABLE];
    16. new count;
    17.  
    18. for(new i = 0; i < rows; i++)
    19. {
    20. auto_s[i] = bool:cache_get_field_content_int(i, !"automat_assig", MysqlConnect);
    21. number_ids[i] = cache_get_field_content_int(i, !"number_id", MysqlConnect);
    22.  
    23. if(auto_s[i] == true)
    24. {
    25. count++;
    26. }
    27. }
    28. if(count > 0)// Если количество "разрешённых" рангов не равно нулю
    29. {
    30. new rand = random(count);// Получаем рандомный порядковый номер ранга
    31. for(new i = 0, c; i < MAX_RANK_IN_TABLE; i++)// По новой запускаем цикл
    32. {
    33. if(auto_s[i] == true)// Если ранг "разрешён"
    34. {
    35. if(c++ == rand)// Проверяем, равен ли его номер рандомному номеру, полученному ранее
    36. {
    37. printf("Назначаем на %d должность", i);
    38. return;
    39. }
    40. }
    41. }
    42. }
    43. else
    44. {
    45. print("Не назначаем никуда");
    46. }
    47. return;
    48. }
    Последний раз редактировалось DeimoS; 07.12.2018 в 14:09.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Я сделал чуть-чуть теперь по иному, вообщем, а что будет если загрузить их сначала в массив? automat_assig = 1 я имею ввиду, и потом уже работать только с этим массивом? Только вот вынуть теперь из массива не получается, и само назначение произвести...

    PHP код:
    #define MAX_FRAC_IDS    6

    forward CallBack(frac_ids); 
    public 
    CallBack(frac_ids
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields,MysqlConnect);
        new 
    bool:auto_s[MAX_FRAC_IDS][3];
        new 
    idsi[MAX_FRAC_IDS][3];
        new 
    count;
        if(
    rows)
        {
            for(new 
    0rowsi++)
            {
                
    auto_s[frac_ids][i] = bool:cache_get_field_content_int(i, !"automat_assig"MysqlConnect);
                if(
    auto_s[frac_ids][i] == true)
                {
                    
    idsi[frac_ids][i] = auto_s[frac_ids][i];
                    
    count++;
                }
                if(
    count 0)
                {
                    if(
    auto_s[frac_ids][i] == true)
                    {
                        new 
    rand random(idsi[frac_ids][i]);
                    }
                }
            }
        }
        
    printf("%d | %d | %d",idsi[frac_ids][0],idsi[frac_ids][1],idsi[frac_ids][2]); 

    По последнему printf вот такие вот данные
    PHP код:

    Последний раз редактировалось Сергей; 07.12.2018 в 14:39.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, твой текущий код вообще непонятно что делает.
    Во-первых, зачем ты в цикле делаешь проверку if(count > 0)? Как только загрузится хоть один "разрешённый" ранг, эта проверка будет срабатывать для всех последующих итераций.
    Во-вторых, ты нигде не используешь rand.

    Мой код - это то, что тебе нужно. Только значение MAX_RANK_IN_TABLE замени на 3 вместо 6 и всё


    Касаемо загрузки данных в массив - это будет более оптимизированый вариант, если вкратце.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Так а если сделать вот через массив? Это же будет более оптимальный вариант
    Касаемо этого всего, я же не просто так загружаю:
    PHP код:
    number_ids[i] = cache_get_field_content_int(i, !"number_id"MysqlConnect); 
    Я конкретно хочу назначить игрока на конкретную должность

    Вот как оно всё в бд
    ссылка на скрин
    Последний раз редактировалось Сергей; 07.12.2018 в 16:10.

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну так мой вариант и позволяет назначить на конкретную должность. Вот расписал более подробно пример работы с данными
    1. #define MAX_RANK_IN_TABLE 6// Максимально возможное количество названий для ранга
    2.  
    3. forward CallBack(playerid,rank_ids,frac_ids);
    4. public CallBack(playerid,rank_ids,frac_ids)
    5. {
    6. new rows, fields;
    7. cache_get_data(rows, fields, MysqlConnect);
    8. cache_get_row_count(rows);
    9. if(!rows)
    10. return;
    11. if(rows > MAX_RANK_IN_TABLE)
    12. rows = MAX_RANK_IN_TABLE;
    13.  
    14. new bool:auto_s[MAX_RANK_IN_TABLE];
    15. new number_ids[MAX_RANK_IN_TABLE];
    16. new count;
    17.  
    18. for(new i = 0; i < rows; i++)
    19. {
    20. auto_s[i] = bool:cache_get_field_content_int(i, !"automat_assig", MysqlConnect);
    21. number_ids[i] = cache_get_field_content_int(i, !"number_id", MysqlConnect);
    22.  
    23. if(auto_s[i] == true)
    24. {
    25. count++;
    26. }
    27. }
    28. if(count > 0)
    29. {
    30. new rand = random(count);
    31. for(new i = 0, c; i < MAX_RANK_IN_TABLE; i++)
    32. {
    33. if(auto_s[i] == true)
    34. {
    35. if(c++ == rand)
    36. {
    37. printf("Назначаем на %d должность (%d | %d)", i, auto_s[i], number_ids[i]);// Вот обращаемся к конкретному рангу и работаем с его данными
    38. return;
    39. }
    40. }
    41. }
    42. }
    43. else
    44. {
    45. print("Не назначаем никуда");
    46. }
    47. return;
    48. }


    Ну а касаемо загрузки в массив - для начала кинь скрин структуры таблицы и объясни что ты хочешь сделать
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #7
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Я хочу вот что сделать:
    Назначит игрока на одну из рандомных должностей. При условии, если в базе данных automat_assig для конкретной фракции и для конкретного ранга стоит на значении 1
    Если в базе данных создано 2 должности под конкретный ранг, допустим 1, и там значение automat_assig == 1 то мы сделаем рандом.
    Скрин 1
    Скрин 2

    Как собственно ставит на должность, мы записуем игроку number_id должности которая у нас выбралась или рандомно или же нет.
    Последний раз редактировалось Сергей; 07.12.2018 в 18:00.

  8. #8
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Вообщем, просто прошу посмотреть, что я написал(нарыгал, только глаза себе не выдавливайте)
    PHP код:
    forward CallBack(frac_ids);
    public 
    CallBack(frac_ids)
    {
        new 
    rowsfields
        
    cache_get_data(rowsfieldsMysqlConnect); 
        
    cache_get_row_count(rows);  
        if(!
    rows)    return 1;
     
        new 
    bool:auto_s[6]; 
        new 
    idsi[6][4];
        new 
    count;
        new 
    number_ids[6];
        new 
    number_idis[6][4];
        for(new 
    0rowsi++)
        {
            
    auto_s[frac_ids] = bool:cache_get_field_content_int(i, !"automat_assig"MysqlConnect);
            
    number_ids[frac_ids] = cache_get_field_content_int(i, !"number_id"MysqlConnect); 
            if(
    auto_s[frac_ids] == true)
            {
                
    idsi[frac_ids][i] = auto_s[frac_ids];
                
    number_idis[frac_ids][i] = number_ids[frac_ids];
                
    count++;
            }
        }
        if(
    count >= 2)
        {
            if(
    idsi[frac_ids][0] != || idsi[frac_ids][1] != || idsi[frac_ids][2] != 0)
            {
                
    printf("%d || %d || %d",number_idis[frac_ids][0],number_idis[frac_ids][1],number_idis[frac_ids][2]);
            }
        }
        else if(
    count == 1)
        {
            
    printf("Назначим только на ту, где есть 1");
        }
        else if(
    count == 0) print("Нетрогаем игрока");
        
    printf("=============%d | %d | %d=================",idsi[frac_ids][0],idsi[frac_ids][1],idsi[frac_ids][2]);
        return 
    1;

    Последний раз редактировалось Сергей; 07.12.2018 в 21:20.

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Зачем ты создаёшь массив для всех 6-и фракций, если всегда грузишь информацию только одной фракции?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #10
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Зачем ты создаёшь массив для всех 6-и фракций, если всегда грузишь информацию только одной фракции?
    Да это пробный вариант, потому-что пока-что нехватает меня сделать по нормальному.
    Поможете сделать по нормальному? Ибо не получается... .
    Последний раз редактировалось Сергей; 08.12.2018 в 16:11.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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