|
10 | 10 | #include "amxmodx.h"
|
11 | 11 | #include "CMenu.h"
|
12 | 12 | #include "newmenus.h"
|
| 13 | +#include "format.h" |
13 | 14 |
|
14 | 15 | ke::Vector<Menu *> g_NewMenus;
|
15 | 16 | CStack<int> g_MenuFreeStack;
|
@@ -90,9 +91,9 @@ bool CloseNewMenus(CPlayer *pPlayer)
|
90 | 91 | return true;
|
91 | 92 | }
|
92 | 93 |
|
93 |
| -Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"), |
| 94 | +Menu::Menu(const char *title, AMX *amx, int fid, bool use_ml) : m_Title(title), m_ItemColor("\\r"), |
94 | 95 | m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid),
|
95 |
| -isDestroying(false), pageCallback(-1), showPageNumber(true), items_per_page(7) |
| 96 | +isDestroying(false), pageCallback(-1), showPageNumber(true), useMultilingual(use_ml), amx(amx), items_per_page(7) |
96 | 97 | {
|
97 | 98 | CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
|
98 | 99 | menuId = g_menucmds.registerMenuId(title, amx);
|
@@ -356,18 +357,32 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
356 | 357 |
|
357 | 358 | m_Text = nullptr;
|
358 | 359 |
|
| 360 | + |
| 361 | + auto title = m_Title.chars(); |
| 362 | + |
| 363 | + if (this->useMultilingual) |
| 364 | + { |
| 365 | + const auto language = playerlang(player); |
| 366 | + const auto definition = translate(this->amx, language, title); |
| 367 | + |
| 368 | + if (definition) |
| 369 | + { |
| 370 | + title = definition; |
| 371 | + } |
| 372 | + } |
| 373 | + |
359 | 374 | char buffer[255];
|
360 | 375 | if (showPageNumber && items_per_page && (pages != 1))
|
361 | 376 | {
|
362 | 377 | if (m_AutoColors)
|
363 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", m_Title.chars(), page + 1, pages); |
| 378 | + ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", title, page + 1, pages); |
364 | 379 | else
|
365 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", m_Title.chars(), page + 1, pages); |
| 380 | + ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", title, page + 1, pages); |
366 | 381 | } else {
|
367 | 382 | if (m_AutoColors)
|
368 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", m_Title.chars()); |
| 383 | + ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", title); |
369 | 384 | else
|
370 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", m_Title.chars()); |
| 385 | + ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", title); |
371 | 386 | }
|
372 | 387 |
|
373 | 388 | m_Text = m_Text + buffer;
|
@@ -462,24 +477,37 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
462 | 477 | option_display = 0;
|
463 | 478 | }
|
464 | 479 |
|
| 480 | + auto itemName = pItem->name.chars(); |
| 481 | + |
| 482 | + if (this->useMultilingual) |
| 483 | + { |
| 484 | + const auto language = playerlang(player); |
| 485 | + const auto definition = translate(this->amx, language, itemName); |
| 486 | + |
| 487 | + if (definition) |
| 488 | + { |
| 489 | + itemName = definition; |
| 490 | + } |
| 491 | + } |
| 492 | + |
465 | 493 | if (pItem->isBlank)
|
466 | 494 | {
|
467 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", pItem->name.chars()); |
| 495 | + ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", itemName); |
468 | 496 | }
|
469 | 497 | else if (enabled)
|
470 | 498 | {
|
471 |
| - if (m_AutoColors) |
| 499 | + if (m_AutoColors) |
472 | 500 | {
|
473 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, pItem->name.chars()); |
| 501 | + ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, itemName); |
474 | 502 | } else {
|
475 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, pItem->name.chars()); |
| 503 | + ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, itemName); |
476 | 504 | }
|
477 | 505 | } else {
|
478 | 506 | if (m_AutoColors)
|
479 | 507 | {
|
480 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, pItem->name.chars()); |
| 508 | + ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, itemName); |
481 | 509 | } else {
|
482 |
| - ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", pItem->name.chars()); |
| 510 | + ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", itemName); |
483 | 511 | }
|
484 | 512 | }
|
485 | 513 | slots++;
|
@@ -620,38 +648,45 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
620 | 648 | LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.length()); \
|
621 | 649 | return 0; }
|
622 | 650 |
|
623 |
| -//Makes a new menu handle (-1 for failure) |
624 |
| -//native csdm_makemenu(title[]); |
| 651 | +// native menu_create(const title[], const handler[], bool:ml = false); |
625 | 652 | static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
|
626 | 653 | {
|
627 |
| - int len; |
628 |
| - char *title = get_amxstring(amx, params[1], 0, len); |
629 |
| - validate_menu_text(title); |
630 |
| - char *handler = get_amxstring(amx, params[2], 1, len); |
| 654 | + enum args { arg_count, arg_title, arg_handler, arg_ml }; |
631 | 655 |
|
632 |
| - int func = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE); |
633 |
| - |
634 |
| - if (func == -1) |
| 656 | + int length; |
| 657 | + const auto title = get_amxstring(amx, params[arg_title], 0, length); |
| 658 | + const auto handler = get_amxstring(amx, params[arg_handler], 1, length); |
| 659 | + const auto callback = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE); |
| 660 | + |
| 661 | + if (callback == -1) |
635 | 662 | {
|
636 |
| - LogError(amx, AMX_ERR_NOTFOUND, "Invalid function \"%s\"", handler); |
| 663 | + LogError(amx, AMX_ERR_NOTFOUND, R"(Invalid function "%s")", handler); |
637 | 664 | return 0;
|
638 | 665 | }
|
639 | 666 |
|
640 |
| - Menu *pMenu = new Menu(title, amx, func); |
| 667 | + validate_menu_text(title); |
| 668 | + |
| 669 | + auto pMenu = new Menu(title, amx, callback, params[arg_ml] != 0); |
641 | 670 |
|
642 | 671 | if (g_MenuFreeStack.empty())
|
643 | 672 | {
|
644 | 673 | g_NewMenus.append(pMenu);
|
645 |
| - pMenu->thisId = (int)g_NewMenus.length() - 1; |
646 |
| - } else { |
647 |
| - int pos = g_MenuFreeStack.front(); |
| 674 | + |
| 675 | + pMenu->thisId = static_cast<int>(g_NewMenus.length()) - 1; |
| 676 | + } |
| 677 | + else |
| 678 | + { |
| 679 | + const auto position = g_MenuFreeStack.front(); |
| 680 | + |
648 | 681 | g_MenuFreeStack.pop();
|
649 |
| - g_NewMenus[pos] = pMenu; |
650 |
| - pMenu->thisId = pos; |
| 682 | + g_NewMenus[position] = pMenu; |
| 683 | + |
| 684 | + pMenu->thisId = position; |
651 | 685 | }
|
652 | 686 |
|
653 | 687 | return pMenu->thisId;
|
654 | 688 | }
|
| 689 | + |
655 | 690 | static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
|
656 | 691 | {
|
657 | 692 | GETMENU(params[1]);
|
|
0 commit comments