Обучение и помощь по скриптингу для: wellasgood

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Всем добрый день!

Захотел создать вот такую тему, вроде видел подобные. (так как я сам скриптер, но у меня возникают порой вопросы, на которых нету в моем понимании ответов, или частично для моих 'уникальных проблем'. (заодно будет полезно и для других)


Такой вот первый вопросик который меня интересует:

Я регистрирую меню в public plugin_init():

C++:
public plugin_init()
{
   register_menu("ShowMyMenu", 1023, "Handle_ShowMyMenu");
}
Я знаю что динамичное меню нужно уничтожать с помощью menu_destroy();

Как мне поступить с меню которое зарегистрировано в Public plugin_init()? (я так понимаю оно статичное).

1. Его уничтожать получается не надо?

2. Где ставить проверки, на выход в таком меню? (return PLUGIN_HANDLED;)

3. Если я хочу вызывать в конце отработки функций меню, другое меню или тоже самое меню (т.е при нажатии на пункт меню, функция активируется, но меню не закрывается) нужно ли после return ShowMyMenu (id), ставить return PLUGIN_HANDLED; в конце кода.
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
наработка:

C++:
ShowMyMenu(id)
{
    new szMenu[512];

    iKeys = (1<<0|1<<1|1<<9);
    iLen = formatex(szMenu, charsmax(szMenu), "%L^n^n", id, "MENU_TITLE");

    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[1] \y# \w%L^n", id, "MENU_ITEM_1");
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[2] \y# \w%L^n", id, "MENU_ITEM_2");

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[0] \y# \w%L", id, "MENU_EXIT");
    return show_menu(id, iKeys, szMenu, -1, "ShowMyMenu");
}

public Handle_ShowMyMenu(id, iKeys)
{
    switch(iKeys)
    {
     case 0:
         {
            исполнение обычной функции.. (после нужно просто показать снвоа это же меню)
         }
     case 1:
         {
            return Menu2(id);
            return PLUGIN_HANDLED;
         }
     case 9: return PLUGIN_HANDLED;
    }
    return ShowMyMenu(id);
    return PLUGIN_HANDLED;
}
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Статическое и динамическое - не совсем верные определения, на самом деле. Ты имеешь ввиду два типа меню нового типа? Одно создаётся один раз, и потом показывается клиентам. Другое создаётся при необходимости и удаляется после использования. С элементами обоих меню в любом случае можно работать через каллбек (не путать с хендлером, т.е. с обработчиком нажатий), так что "статичность" тут только в том что меню создаётся один раз.

register_menu() это макрос-обёртка из amxmisc.inc, старый тип меню. Ты перепутал его с menu_create(), вероятно.

Код:
            return Menu2(id);
            return PLUGIN_HANDLED;
Компилятор не орёт? Unreachable code должно выдавать по идее. Один ретурн в каждой ветке условия может быть. После него код в функции не выполняется.
20 Ноя 2019
И возврат... понимаешь хоть, зачем оно? Вот батя тебя посылает за хлебом. Ты либо пришёл с хлебом (true, 1), либо без него (false, 0). А может пришёл с чёрным вместо белого (0,1,2... больше кодов возврата). Один механизм вызывает другой и ждёт от него кода возврата. На основе этого кода вызвавший механизм решает, что делать дальше. is_user_connected() в ядре возвращает тебе либо 0, либо 1. Так же и тут. Ты в плагине строишь цепь, одна функция вызывает другую и ждёт от неё результат работы (какой-то код возврата), на основе этого кода происходит ветвление поведения. И так же ядро или модуль может ожидать возврата из public-функций. тот же register_clcmd(), хукнул ты команду. Она затриггерилась -> amxx тебе в указанную public-функцию стукнул. Ты ему можешь вернуть
Код:
/**
* Return codes
*/
#define PLUGIN_CONTINUE     0   /* Results returned by public functions */
#define PLUGIN_HANDLED      1   /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2   /* to use in client_command(), continue all plugins but stop the command */
И на основе возвращённого значения меняется дальнейшее поведение уже с его(ядра) стороны.
Не возвращать ничего = вернуть 0. Просто чтоб ты знал.
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
спасибо, проведу ряд тестов.
 
Последнее редактирование:
Сообщения
287
Реакции
223
Помог
6 раз(а)
Код:
return 1;
и
Код:
return show_menu(id, iKeys, szMenu, -1, "ShowMyMenu");
- разные вещи
Второй вариант вернет черт знает, какую цифру, а вернет он величину размера твоего меню, если не ошибаюсь
Все-таки ошибаюсь, давно исходники амхх не смотрел. В любом случае использовать второй вариант не стоит
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Код:
 * @return          1 on success, 0 if menu could not be displayed (client not
 *                  connected)
Но принцип разный, надо это понимать, да. Об этом надо помнить, ибо можно получить непредсказуемое поведение.
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Доброй ночи :)

Вопросик второй.

Я начал изучать enum, применять его в плагинах, можно ли обращаться к enum элементам так:

Допустим такая enum структура:

C++:
enum _:Data
{
  nebo,
  voed,
  springmen
}

new g_Data[MAX_PLAYERS+1][Data];
По коду обращаться просто цифрой к элементу:

g_Data[id][1]
g_Data [id][2]

Т.е где 1 и 2, это данные из enum.
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
wellasgood, в данном случае можно, ибо Data не тег. Но без особой необходимости не нужно. Смысл enum'ерации не только в организации псевдоструктуры, оно заодно решает вопрос "с магическими числами".
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Спасибо. Просто мне нужно циклом прогонять. (в + оптимизации)
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
wellasgood, для цикла нормально, когда ты ссылаешься по итератору (по переменной). это не то же самое, что засовывать туда руками 0, 1, городя "магию".
21 Ноя 2019
Вот под рукой тут есть код, может пригодится тебе для понимания работы "пвсевдоструктур". В павне массив это просто шеренга ячеек, и при помощи энумерации мы можем эту шеренгу условно поделить на "участки", и по именам этих участков обращаться к конкретным частям массива.

Код:
enum _:WEAPON_DATA_STRUCT {
    WEAPON_DATA__MENU_NAME[48],
    WEAPON_DATA__NAME[24],
    WeaponIdType:WEAPON_DATA__TYPE,
    WEAPON_DATA__ROUND
}

new const g_ePrimaryWeapon[][WEAPON_DATA_STRUCT] = {
    { "AK-47", "weapon_ak47", WEAPON_AK47, 2 },
    { "M4A1", "weapon_m4a1", WEAPON_M4A1, 2 },
    { "AWP", "weapon_awp", WEAPON_AWP, 3 },
    { "Famas", "weapon_famas", WEAPON_FAMAS, 2 },
    { "Aug", "weapon_aug", WEAPON_AUG, 3 }
}

func_SomeFunc() { // iteration usage example
    new szMenu[MAX_MENU_LENGTH], iKeys

    new iLen = formatex(szMenu, charsmax(szMenu), "\ySome Menu^n^n")

    for(new i; i < sizeof(g_ePrimaryWeapon); i++) {
        iKeys |= (1 << i);

        iLen += formatex( szMenu[iLen], charsmax(szMenu) - iLen, "\r%i. \w%s^n",
            i + 1, g_ePrimaryWeapon[i][WEAPON_DATA__MENU_NAME] );
    }

    show_menu(pPlayer, iKeys, szMenu, -1)
}
 
Последнее редактирование:
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Добрый день!

Хотел бы обновить плагин пружины, что бы не пользоваться буквой Е для использования, т.е функция запускающая прыжки, активируется после того как игрок встает/подходит к пружине автоматически.

Есть много способов, какой лучше применить?

Отлов события соприкосновения, register_touch, не дал нужных результатов, т.е я пробовал делать с помощью указания класснейма, и просто соприкосновения игрока с пружиной.

Прошу помощи.
 
Сообщения
73
Реакции
8
wellasgood, покажите ваш кусочек кода, связанный с register_touch. Интересно, что у вас не получилось ?
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Сейчас не могу, на работе нахожусь, но вроде и так все понятно, когда я подхожу к пружине, то функция будто вызывается очень много раз подряд, соответсвенно прыжки не работают (функция прыжков).
27 Дек 2019
Пробовал ограничить, делал переключатель, мол туда сюда что бы 1 раз офф, в другой
27 Дек 2019
Все равно
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
Почему она должна вызывать много раз подряд, если игрок при касании должен подпрыгнуть... ох уж эта "ваша" логика...
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
zhorzh78, событие соприкосновения register_touch, в отлове будет делать то что указать постоянно.
27 Дек 2019
Т.е не 1 раз, т.е если сообщения в чат установить, то при соприкосновении будет спам в чат
27 Дек 2019
Подскажите как лучше то будет?
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
wellasgood, Извините, я забыл, что это только у меня прыжок означает отрыв от поверхности, в результате которого соприкосновение прерывается. Больше не буду вас беспокоить.
 
  • Нравится
Реакции: voed
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
zhorzh78, вы вообще поняли что нужно?))
27 Дек 2019
Нужно что бы когда игрок подошел к пружине, он сразу прыгнул (задействовалась функция прыжка )
27 Дек 2019
А не по нажатию Е
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Добрый день!

Хотел бы обновить плагин пружины, что бы не пользоваться буквой Е для использования, т.е функция запускающая прыжки, активируется после того как игрок встает/подходит к пружине автоматически.

Есть много способов, какой лучше применить?

Отлов события соприкосновения, register_touch, не дал нужных результатов, т.е я пробовал делать с помощью указания класснейма, и просто соприкосновения игрока с пружиной.

Прошу помощи.
Разобрался.
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Добрый день!

Интересует такой вопрос, возможно ли каким-то образом сделать вывод в коносль сообщения с поддержкой мультиязычности, стандартными методами, или если стандартными не получится, то как-то еще?

Я читал что для этой команды нету поддержки мультиязычноти.

C++:
console_print(id, "Сообщение");
 
Статус
В этой теме нельзя размещать новые ответы.

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу