Русское сообщество по скриптингу

Массивы и проверка по ним  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: Массивы и проверка по ним

Сообщение Dmitry Beast » 16 фев 2017, 15:41

Но пункты всё так же не переключаются

Добавлено спустя 2 минуты:
Чтобы использовать для каждого игрока отдельно, должно быть так?

Код: Выделить всё
new g_Params[max_players+1]

if(
g_Params[id] & P_P1 = 1)
vkl
else
vikl

if(g_Params[id] & P_P2 = 1)
vkl
else
vikl

и т
.д.


верно?

Добавлено спустя 5 минут 5 секунд:
т.е. я передаю в другой плагин g_Params[id], а в нём уже проверяю P_P1, P_P2 и т.д.?
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Массивы и проверка по ним

Сообщение БиЗоН » 16 фев 2017, 15:43

Dmitry Beast писал(а):Однако моя задумка обойти ошибку long line не прокатила.


Если я правильно понял, то ошибка решается легким способом:

Вместо:
Код: Выделить всё
formatex(g_sMsg, charsmax(g_sMsg), "%s %s %s %s %s %s", sMsgChar1, sMsgChar2MsgChar3, sMsgChar4sMsgChar5, sMsgChar6); 


Вот так:
Код: Выделить всё
formatex(g_sMsg, charsmax(g_sMsg), "%s %s %s %s %s %s", // Куча твоих переменных
sMsgChar1, sMsgChar2, // просто переносим их на строку ниже
sMsgChar3, sMsgChar4,//  не забывая о запятых
sMsgChar5, sMsgChar6); // и строка уже не будет длинной  


В таком случае подобной ошибки не будет. Всё нормально скомпилируется.
Вечно занятой. Вечно в павне.
Аватара пользователя
БиЗоН
 
Сообщения: 165
Зарегистрирован: 24 мар 2014, 21:05
Благодарил (а): 10 раз.
Поблагодарили: 49 раз.
Опыт программирования: Больше трех лет

Re: Массивы и проверка по ним

Сообщение NEoMASTERR » 16 фев 2017, 15:45

Код: Выделить всё

enum PARAMS 
(<<=1)
{
    P_P1 = 1,
    P_P2 = 2,
    P_P3,
    P_P4
}

public menu_test(id, menu, key)
{
    if (key <= MENU_EXIT || key >= PARAMS)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}

    g_Params ^= (1<<key)  // поправил
    menu_destroy(menu)
    m(id)
}

Актуально
Последний раз редактировалось NEoMASTERR 16 фев 2017, 16:02, всего редактировалось 5 раз(а).
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Массивы и проверка по ним

Сообщение Dmitry Beast » 16 фев 2017, 15:48

Спасибо, по возможности проверю, строки уже сформировал, сейчас всё ок без этой ошибки.

Добавлено спустя 2 минуты 34 секунды:
NEoMASTERR писал(а):
Код: Выделить всё
public menu_test(id, menu, key)
{
    if (key <= MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}

    g_Params ^= (1<<(key-1))  // поправил
    menu_destroy(menu)
    m(id)
}
 

Но пункты уже переключаются. :-) :thumbs_up

По поводу прикрепления к ид и проверки, я выше спрашивал, правильно?
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Массивы и проверка по ним

Сообщение NEoMASTERR » 16 фев 2017, 15:59

g_Params[id] & P_P2 = 1 это можно убрать.
Да, можно использовать и массив, то же самое и с флагами игроков, они хранятся примерно так же
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Массивы и проверка по ним

Сообщение Dmitry Beast » 16 фев 2017, 16:10

Всё шикарно робит! :thumbs_up

Но не переключается первый пункт, костылём можно конечно обойти и просто начать с P_P2..

Добавлено спустя 43 секунды:
не увидел "актально" :crazy:
сейчас испробую) :thumbs_up

Добавлено спустя 2 минуты 20 секунд:
Сново тегиматчи и так же не переключается первый пункт :dntknw:
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Массивы и проверка по ним

Сообщение NEoMASTERR » 16 фев 2017, 16:16

Код: Выделить всё
    formatex(str, charsmax(str), "Menu item 1 %s", g_Params & _:P_P1 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 2 %s", g_Params & _:P_P2 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 3 %s", g_Params & _:P_P3 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 4 %s", g_Params & _:P_P4 ? "ON" : "OFF"); menu_additem(menu, str


Код: Выделить всё
public menu_test(id, menu, key)
{
    if (key <= MENU_EXIT || key >= _:PARAMS)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}

    g_Params ^= (1<<key)
    client_print(id, print_chat, "key %d params %d", key, g_Params)
    menu_destroy(menu)
    m(id)

Добавить _:

Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Массивы и проверка по ним

Сообщение Dmitry Beast » 16 фев 2017, 16:23

То-ли я тупой, то-ли лыжи не едут.. :crazy:

Нажимаю 1 меняет пункт два. жму два меняет третий, 3 - 4, а первый не переключается :crazy:

Добавлено спустя 2 минуты 24 секунды:
кей 0 , но при этом меняет вторую, 1-3, 3-4, на 4 жму, пишет кей 3, но ни чего не меняет :dntknw:
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Массивы и проверка по ним

Сообщение NEoMASTERR » 16 фев 2017, 16:29

Код: Выделить всё
#include <amxmodx>

new g_Params;

enum PARAMS (<<=1)
{
    P_P1 = 1,
    P_P2 = 2,
    P_P3,
    P_P4
}

public plugin_init()
{
    register_plugin("TEST", "0", "TEST")
    register_clcmd("menu_test", "m")
}

public m(id)
{
    static menu; menu = menu_create("test", "menu_test")
    static str[33]; 
    formatex
(str, charsmax(str), "Menu item 1 %s", g_Params & _:P_P1 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 2 %s", g_Params & _:P_P2 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 3 %s", g_Params & _:P_P3 ? "ON" : "OFF"); menu_additem(menu, str)
    formatex(str, charsmax(str), "Menu item 4 %s", g_Params & _:P_P4 ? "ON" : "OFF"); menu_additem(menu, str)
    menu_display(id, menu)
}

public menu_test(id, menu, key)
{
    if (key <= MENU_EXIT || key >= _:PARAMS)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}

    g_Params ^= (1<<key)
    client_print(id, print_chat, "key %d params %d", key, g_Params)
    menu_destroy(menu)
    m(id)
    return PLUGIN_HANDLED
}


Всё работает

Добавлено спустя 2 минуты 24 секунды:
Код: Выделить всё
#include <amxmodx>
#if AMXX_VERSION_NUM < 183
    #define MAX_PLAYERS 32
#endif

new g_Params[MAX_PLAYERS+1];

enum PARAMS (<<=1)
{
    
P_P1 1,
    
P_P2 2,
    
P_P3,
    
P_P4
}

public 
plugin_init()
{
    
register_plugin("TEST""0""TEST")
    
register_clcmd("menu_test""m")
}

public 
m(id)
{
    static 
menumenu menu_create("test""menu_test")
    static 
str[33]; 
    
formatex(strcharsmax(str), "Menu item 1 %s"g_Params[id] & _:P_P1 "ON" "OFF"); menu_additem(menustr)
    
formatex(strcharsmax(str), "Menu item 2 %s"g_Params[id] & _:P_P2 "ON" "OFF"); menu_additem(menustr)
    
formatex(strcharsmax(str), "Menu item 3 %s"g_Params[id] & _:P_P3 "ON" "OFF"); menu_additem(menustr)
    
formatex(strcharsmax(str), "Menu item 4 %s"g_Params[id] & _:P_P4 "ON" "OFF"); menu_additem(menustr)
    
menu_display(idmenu)
}

public 
client_putinserver(id)
{
    
g_Params[id] = 0
}

public 
menu_test(idmenukey)
{
    if (
key <= MENU_EXIT || key >= _:PARAMS)
    {
        
menu_destroy(menu)
        return 
PLUGIN_HANDLED
    
}

    
g_Params[id] ^= (1<<key)
    
client_print(idprint_chat"key %d params %d"keyg_Params)
    
menu_destroy(menu)
    
m(id)
    return 
PLUGIN_HANDLED

Как и для всех игроков
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Массивы и проверка по ним

Сообщение Dmitry Beast » 16 фев 2017, 19:36

Всё отлично, спасибо!

Добавлено спустя 3 часа 2 минуты 9 секунд:
можно как-то посчитать сколько включено в g_Params[id]?
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Пред.След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23