diff --git a/.luacheckrc b/.luacheckrc index a568fc8..b21b60b 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -13,19 +13,19 @@ ignore = { "611", -- disable "line contains only whitespace" } -std = "+VT1+VMF" +std = "+VT1+VT2+VMF" stds["VMF"] = { globals = { - "new_mod", "get_mod", "VMFMod", "VMFModsKeyMap", "VMFOptionsView", "VT1" - } + "new_mod", "get_mod", "VMFMod", "VMFModsKeyMap", "VMFOptionsView", "VT1", + }, } stds["VT1"] = { - globals = { + read_globals = { string = { fields = { "split" }}, debug = { fields = { - "load_level", "level_loaded", "spawn_hero", "animation_log_specific_profile", "upvaluejoin", "upvalueid" + "load_level", "level_loaded", "spawn_hero", "animation_log_specific_profile", "upvaluejoin", "upvalueid", }}, table = { fields = { "merge", "table_to_array", "mirror_table", "tostring", "is_empty", "array_to_table", "reverse", "shuffle", @@ -411,5 +411,11 @@ stds["VT1"] = { "TelemetryEvents", "debug_bot_transitions", "FreeFlightControllerSettings","ApexClothQuality", "UICalibrationView", "profiler_scopes_trace", "flow_callback_overcharge_reset_unit", "RandomTable_05_05", "POOL_blackboard", "PlayGoTutorialSystem", - } -} \ No newline at end of file + }, +} + +stds["VT2"] = { + read_globals = { + "IngameViewLayoutLogic", "HeroWindowIngameView", + }, +} diff --git a/vmf/localization/vmf.lua b/vmf/localization/vmf.lua index ae2ea9a..fa535f9 100644 --- a/vmf/localization/vmf.lua +++ b/vmf/localization/vmf.lua @@ -1,178 +1,225 @@ return { mods_options = { en = "Mod Options", + es = "Configuración de mods", ru = "Настройки модов", }, open_vmf_options = { en = "Open Options Menu", + en = "Abrir el menu de configuración", ru = "Открыть меню настроек", }, open_vmf_options_description = { en = "Keybind for opening and closing mods options menu.", + es = "Atajo para abrir/cerrar el menu de configuración de mods.", ru = "Клавиша / сочетание клавиш для открытия и закрытия меню настроек модов.", }, vmf_options_scrolling_speed = { en = "Options Menu Scrolling Speed", + es = "Velocidad de desplazamiento en el menu", ru = "Скорость прокрутки меню", }, percent = { - en = "%%" + en = "%%", }, ui_scaling = { en = "UI Scaling for FHD+ Resolutions", + es = "Reescalado de la interfaz para resoluciones Full HD+", ru = "Нормализация масштаба UI для FHD+ разрешений", }, ui_scaling_description = { en = "Automatically scale UI when resolution exceeds 1080p.", + en = "Redimensionar automáticamente la interfaz cuando la resolución exceda 1080p.", ru = "Нормализует масштаб элементов интерфейса, если разрешений экрана превышает 1080p.", }, developer_mode = { en = "Developer Mode", + en = "Modo de desarrollo", ru = "Режим разработчика", }, developer_mode_description = { en = "Allows you to reload VMF and mods, gives you access to some debug features.", + es = "Permite recargar los mods y configurar herramientas de depuración.", ru = "Позволяет перезагружать VMF и моды, даёт доступ к инструментам отладки.", }, show_developer_console = { en = "Show Developer Console", + es = "Mostrar el registro (log) a tiempo real", ru = "Консоль разработчика", }, show_developer_console_description = { en = "Opens up the new window showing game log in real time.", + es = "Abre una ventana que muestra el registro (log) del juego en tiempo real.", ru = "Открывает новое окно, в которое в реальном времени выводится игровой лог.", }, toggle_developer_console = { en = "Toggle Developer Console", + es = "Abrir el registro (log) a tiempo real", ru = "Открыть/закрыть консоль разработчика", }, show_network_debug_info = { en = "Log Network Calls", + en = "Depurar las llamadas de red", ru = "Логирование сетевых вызовов", }, show_network_debug_info_description = { en = "Log all the VMF network calls and all the data transfered with them.\n\n" .. "The method 'info' is used for the logging.", + es = "Escribe en el registro todas las llamadas de red (RPCs) que se ejecuten a través de VMF.\n\n" .. + "Esta información se registra en el nivel 'info'.", ru = "Логирование всех сетевых вызовов VMF и передаваемых с ними данных.\n\n" .. "Для логирования используется метод 'info'.", }, log_ui_renderers_info = { en = "Log UI Renderers Creation Info", + es = "Depurar la renderización de la interfaz de usuario", ru = "Логирование информации при создании UI Renderer", }, log_ui_renderers_info_description = { - en = "Log the UI Renderer's creator name and all the materials passed as the agruments.\n\n" .. + en = "Log the UI Renderer's creator name and all the materials passed as the arguments.\n\n" .. "The method 'info' is used for the logging.", + es = "Escribe en el registro cada vez que se inicialize un renderizador de la interfaz.\n\n" .. + "Esta información se registra en el nivel 'info'.", ru = "Логирование имени создателя UI Renderer'а и всех материалов, переданных в качестве аргументов.\n\n" .. "Для логирования используется метод 'info'.", }, logging_mode = { en = "Logging Settings", + es = "Opciones de logging", ru = "Настройки логирования", }, settings_default = { en = "Default", + es = "Valor por defecto", ru = "Стандартные", }, settings_custom = { en = "Custom", + es = "Personalizado", ru = "Пользовательские", }, output_mode_echo = { en = "'Echo' Output", + en = "Mensajes de 'Echo'", ru = "Вывод 'Echo'", }, output_mode_error = { en = "'Error' Output", + es = "Mensajes de 'Error'", ru = "Вывод 'Error'", }, output_mode_warning = { en = "'Warning' Output", + es = "Mensajes de 'Warning'", ru = "Вывод 'Warning'", }, output_mode_info = { en = "'Info' Output", + es = "Mensajes de 'Info'", ru = "Вывод 'Info'", }, output_mode_debug = { en = "'Debug' Output", + es = "Mensajes de 'Debug'", ru = "Вывод 'Debug'", }, output_disabled = { en = "Disabled", + es = "Desactivado", ru = "Выключен", }, output_log = { en = "Log", + es = "Registro (log)", ru = "Лог", }, output_chat = { en = "Chat", + es = "Chat", ru = "Чат", }, output_log_and_chat = { en = "Log & Chat", + es = "Registro (log) y chat", ru = "Лог и чат", }, chat_history_enable = { en = "Chat Input History", + es = "Historial de chat", ru = "История ввода чата", }, chat_history_enable_description = { en = "Saves all the messages and commands you typed in the chat window.\n\n" .. "You can browse your input history by opening the chat and pressing \"Arrow Up\" and \"Arrow Down\".", + es = "Guarda todos los mensajes y comandos que escribas en la ventana de chat.\n\n" .. + "Puedes navegar por tu historial de comandos abriendo el chat y usando las flechas del teclado.", ru = "Сохраняет все сообщения и команды, введённые в чате.\n\n" .. "Чтобы пролистывать историю ввода, откройте чат и используйте клавиши \"стрелка вверх\" и \"стрелка вниз\".", }, chat_history_save = { en = "Save Input History Between Game Sessions", + es = "Guardar la entrada", ru = "Сохранять историю ввода между сеансами игры", }, chat_history_save_description = { en = "Your chat input history will be saved even after reloading your game (or just VMF).", + es = "El texto que introduzcas en el chat se guardara incluso al recargar el juego (o solo VMF)", ru = "Когда игрок выключает игру (или перезагружает VMF), VMF cохраняет историю ввода в файл настроек, чтобы загрузить её при следующем запуске игры.", }, chat_history_buffer_size = { en = "Input History Buffer Size", + es = "Número de comandos antiguos guardados", ru = "Размер буфера истории ввода", }, chat_history_buffer_size_description = { en = "Maximum number of saved entries.\n\n" .. "WARNING: Changing this setting will erase your chat history.", + es = "Máximo número de comandos antiguos guardados.\n\n" .. + "ATENCIÓN: Cambiar esta preferencia borra el historial del chat.", ru = "Максимальное количество сохраняемых записей.\n\n" .. "ВНИМАНИЕ: изменение этой настройки очистит вашу историю ввода.", }, chat_history_remove_dups = { en = "Remove Duplicate Entries", + es = "Eliminar lineas repetidas", ru = "Удалять повторяющиеся записи", }, chat_history_remove_dups_mode = { en = "Removal Mode", + es = "Modo de eliminación de repetidos", ru = "Режим удаления", }, chat_history_remove_dups_mode_description = { en = "Which duplicate entries should be removed.\n\n" .. "-- LAST --\nRemoves previous entry if it matches the last one.\n\n" .. "-- ALL --\nRemoves all entries if it matches the last one.", + es = "Que lineas antiguas seran borradas cuando se escriba una nueva.\n\n" .. + "-- ÚLTIMA --\nSolo la última, si es igual que la nueva.", + "-- TODAS --\nTodas las lineas antiguas que sean iguales que la nueva. ", ru = "Повторяющиеся записи, которые будут удалены.\n\n" .. "-- ПОСЛЕДНИЕ --\nПредпоследняя запись будет удалена, если она совпадает с последней.\n\n" .. "-- ВСЕ --\nВсе записи, совпадающие с последней записью, будут удалены.", }, settings_last = { en = "Last", + es = "Última", ru = "Последние", }, settings_all = { en = "All", + es = "Todas", ru = "Все", }, chat_history_commands_only = { en = "Save only executed commands", + es = "Salvar unicamente los comandos ejecutados", ru = "Сохранять только выполненные команды", }, chat_history_commands_only_description = { en = "Only successfully executed commands will be saved in the chat history.\n\n" .. "WARNING: Changing this setting will erase your chat history.", + es = "Solo los comandos ejecutados exitosamente serán salvados en el historial.\n\n" .. + "ATENCIÓN: Cambiar esta preferencia borra el historial del chat.", ru = "Только успешно выполненные команды будут сохранены в истории ввода.\n\n" .. "ВНИМАНИЕ: изменение этой настройки очистит вашу историю ввода.", }, @@ -180,14 +227,17 @@ return { clean_chat_history = { en = "cleans chat input history", + es = "Borra el historial de usuario", ru = "очищает историю ввода", }, dev_console_opened = { en = "Developer console opened.", + es = "Abierto la consola de desarrollo.", ru = "Консоль разработчика открыта.", }, dev_console_closed = { en = "Developer console closed.", + es = "Cerrado la consola de desarrollo.", ru = "Консоль разработчика закрыта.", }, @@ -195,7 +245,8 @@ return { -- MUTATORS mutator_no_description_provided = { - en = "No description provided." + en = "No description provided.", + es = "No se proporcionó una descripción.", }, -- Difficulties' names [V1] @@ -226,74 +277,95 @@ return { -- Chat messages broadcast_enabled_mutators = { - en = "ENABLED MUTATORS" + en = "ENABLED MUTATORS", + es = "MUTACIONES ACTIVADAS", }, broadcast_all_disabled = { - en = "ALL MUTATORS DISABLED" + en = "ALL MUTATORS DISABLED", + es = "TODAS LAS MUTACIONES DESACTIVADAS", }, broadcast_disabled_mutators = { - en = "MUTATORS DISABLED" + en = "MUTATORS DISABLED", + es = "MUTACIONES DESACTIVADAS", }, local_disabled_mutators = { - en = "Mutators disabled" + en = "Mutators disabled", + es = "Mutaciones desactivadas", }, whisper_enabled_mutators = { - en = "[Automated message] This lobby has the following mutators active" + en = "[Automated message] This lobby has the following mutators active", + en = "[Mensaje automático] Esta partida tiene las siguientes mutaciones", }, disabled_reason_not_server = { - en = "because you're no longer the host" + en = "because you're no longer the host", + es = "porque ya no eres el anfitrión", }, disabled_reason_difficulty_change = { - en = "DUE TO CHANGE IN DIFFICULTY" + en = "DUE TO CHANGE IN DIFFICULTY", + es = "DEBIDO A UN CAMBIO DE DIFICULTAD", }, -- Interface mutators_title = { - en = "Mutators" + en = "Mutators", + es = "Mutaciones", }, mutators_banner_description = { - en = "Enable and disable mutators" + en = "Enable and disable mutators", + es = "Activa y desactiva las mutaciones", }, no_mutators = { - en = "No mutators installed" + en = "No mutators installed", + es = "No hay mutaciones instaladas", }, no_mutators_description = { - en = "Subscribe to mods and mutators on the workshop" + en = "Subscribe to mods and mutators on the workshop", + es = "Subscribete a mutaciones en el Steam Workshop", }, -- Mutator widgets' tooltips tooltip_incompatible_mutators = { - en = "\n\n-- INCOMPATIBLE WITH MUTATORS --\n" + en = "\n\n-- INCOMPATIBLE WITH MUTATORS --\n", + es = "\n\n-- INCOMPATIBLE CON LAS MUTACIONES --\n", }, tooltip_compatible_mutators = { - en = "\n\n-- COMPATIBLE ONLY WITH MUTATORS --\n" + en = "\n\n-- COMPATIBLE ONLY WITH MUTATORS --\n", + es = "\n\n-- COMPATIBLE CON LAS MUTACIONES --\n", }, tooltip_compatible_with_all_mutators = { - en = "\n\n-- COMPATIBLE WITH ALL MUTATORS --" + en = "\n\n-- COMPATIBLE WITH ALL MUTATORS --", + es = "\n\n-- COMPATIBLE CON TODAS LAS MUTACIONES --", }, tooltip_incompatible_with_all_mutators = { - en = "\n\n-- INCOMPATIBLE WITH ALL MUTATORS --" + en = "\n\n-- INCOMPATIBLE WITH ALL MUTATORS --", + es = "\n\n-- INCOMPATIBLE CON TODAS LAS MUTACIONES --", }, tooltip_incompatible_diffs = { - en = "\n\n-- INCOMPATIBLE WITH DIFFICULTIES --\n" + en = "\n\n-- INCOMPATIBLE WITH DIFFICULTIES --\n", + es = "\n\n-- INCOMPATIBLE CON LAS DIFICULTADES --\n", }, tooltip_compatible_diffs = { - en = "\n\n-- COMPATIBLE ONLY WITH DIFFICULTIES --\n" + en = "\n\n-- COMPATIBLE ONLY WITH DIFFICULTIES --\n", + es = "\n\n-- COMPATIBLE CON LAS DIFICULTADES --\n", }, tooltip_compatible_with_all_diffs = { - en = "\n\n-- COMPATIBLE WITH ALL DIFFICULTIES --" + en = "\n\n-- COMPATIBLE WITH ALL DIFFICULTIES --", + es = "\n\n-- COMPATIBLE CON TODAS LAS DIFICULTADES --", }, tooltip_conflicts = { - en = "\n\n-- CONFLICTS --\n" + en = "\n\n-- CONFLICTS --\n", + es = "\n\n-- CONFLICTOS --\n", }, tooltip_append_mutator = { - en = " (mutator)" + en = " (mutator)", + es = " (mutacion)", }, tooltip_append_difficulty = { - en = " (difficulty)" + en = " (difficulty)", + es = " (dificultad)", }, -} \ No newline at end of file +} diff --git a/vmf/scripts/mods/vmf/modules/core/chat.lua b/vmf/scripts/mods/vmf/modules/core/chat.lua index 4562a62..b7e31fc 100644 --- a/vmf/scripts/mods/vmf/modules/core/chat.lua +++ b/vmf/scripts/mods/vmf/modules/core/chat.lua @@ -3,8 +3,11 @@ local vmf = get_mod("VMF") -- Constants used as parameters in some 'chat_manager's functions local CHANNEL_ID = 1 local MESSAGE_SENDER = "" -local LOCAL_PLAYER_ID = 0 -- VT2 only -local LOCALIZATION_PARAM = "" +local LOCAL_PLAYER_ID = 0 -- VT2 only +local LOCALIZATION_PARAMETERS = {} -- VT2 only +local LOCALIZE = false -- VT2 only +local LOCALIZE_PARAMETERS = false -- VT2 only +local LOCALIZATION_PARAM = "" -- VT1 only local IS_SYSTEM_MESSAGE = false local POP_CHAT = true local IS_DEV = true @@ -18,8 +21,8 @@ local function send_system_message(peer_id, message) RPC.rpc_chat_message(peer_id, CHANNEL_ID, MESSAGE_SENDER, message, LOCALIZATION_PARAM, IS_SYSTEM_MESSAGE, POP_CHAT, IS_DEV) else - RPC.rpc_chat_message(peer_id, CHANNEL_ID, MESSAGE_SENDER, LOCAL_PLAYER_ID, message, LOCALIZATION_PARAM, - IS_SYSTEM_MESSAGE, POP_CHAT, IS_DEV) + RPC.rpc_chat_message(peer_id, CHANNEL_ID, MESSAGE_SENDER, LOCAL_PLAYER_ID, message, LOCALIZATION_PARAMETERS, + LOCALIZE, LOCALIZE_PARAMETERS, IS_SYSTEM_MESSAGE, POP_CHAT, IS_DEV) end end diff --git a/vmf/scripts/mods/vmf/modules/core/misc.lua b/vmf/scripts/mods/vmf/modules/core/misc.lua index 3d45c99..7520d1f 100644 --- a/vmf/scripts/mods/vmf/modules/core/misc.lua +++ b/vmf/scripts/mods/vmf/modules/core/misc.lua @@ -17,4 +17,13 @@ function vmf.check_wrong_argument_type(mod, vmf_function_name, argument_name, ar mod:error("(%s): argument '%s' should have the '%s' type, not '%s'", vmf_function_name, argument_name, table.concat(allowed_types, "/"), argument_type) return true +end + +function vmf.check_old_vmf() + local old_vmf_table = rawget(_G, "Mods") + + if old_vmf_table and old_vmf_table.exec then + error("Unfortunately, workshop mods and old-fashioned mods (VMF-pack or QoL) are incompatible. " .. + "Either remove old mods or disable workshop mods.") + end end \ No newline at end of file diff --git a/vmf/scripts/mods/vmf/modules/core/network.lua b/vmf/scripts/mods/vmf/modules/core/network.lua index a57a7aa..78edd29 100644 --- a/vmf/scripts/mods/vmf/modules/core/network.lua +++ b/vmf/scripts/mods/vmf/modules/core/network.lua @@ -137,7 +137,7 @@ local function rpc_chat_message(member, channel_id, message_sender, message, loc RPC.rpc_chat_message(member, channel_id, message_sender, message, localization_param, is_system_message, pop_chat, is_dev) else - RPC.rpc_chat_message(member, channel_id, message_sender, 0, message, localization_param, + RPC.rpc_chat_message(member, channel_id, message_sender, 0, message, {localization_param}, false, false, is_system_message, pop_chat, is_dev) end end @@ -255,7 +255,7 @@ vmf:hook("ChatManager", "rpc_chat_message", rpc_data2 = arg2 else rpc_data1 = arg2 - rpc_data2 = arg3 + rpc_data2 = arg3[1] end if channel_id == RPC_VMF_REQUEST_CHANNEL_ID then -- rpc_vmf_request diff --git a/vmf/scripts/mods/vmf/modules/debug/table_dump.lua b/vmf/scripts/mods/vmf/modules/debug/table_dump.lua index 5999d07..b20e08e 100644 --- a/vmf/scripts/mods/vmf/modules/debug/table_dump.lua +++ b/vmf/scripts/mods/vmf/modules/debug/table_dump.lua @@ -41,8 +41,9 @@ end VMFMod.dump = function (self, dumped_object, dumped_object_name, max_depth) - if not dumped_object or not max_depth then - self:error("(dump): not all arguments are specified.") + if vmf.check_wrong_argument_type(self, "dump", "dumped_object_name", dumped_object_name, "string", "nil") or + vmf.check_wrong_argument_type(self, "dump", "max_depth", max_depth, "number") + then return end @@ -187,7 +188,7 @@ local function table_dump_to_file(dumped_table, dumped_table_name, max_depth) table_entry[key] = "[" .. value_type .. "]" else - + value = tostring(value):gsub('\\','\\\\'):gsub('\"','\\\"'):gsub('\t','\\t'):gsub('\n','\\n') table_entry[key] = value .. " (" .. value_type .. ")" end @@ -327,8 +328,9 @@ end VMFMod.dump_to_file = function (self, dumped_object, object_name, max_depth) - if not dumped_object or not object_name or not max_depth then - self:error("(dump_to_file): not all arguments are specified.") + if vmf.check_wrong_argument_type(self, "dump_to_file", "object_name", object_name, "string") or + vmf.check_wrong_argument_type(self, "dump_to_file", "max_depth", max_depth, "number") + then return end diff --git a/vmf/scripts/mods/vmf/modules/ui/options/vmf_options_view.lua b/vmf/scripts/mods/vmf/modules/ui/options/vmf_options_view.lua index 4e340ee..b4ab0e6 100644 --- a/vmf/scripts/mods/vmf/modules/ui/options/vmf_options_view.lua +++ b/vmf/scripts/mods/vmf/modules/ui/options/vmf_options_view.lua @@ -3821,7 +3821,8 @@ VMFOptionsView.update_picked_option_for_settings_list_widgets = function (self) elseif widget_type == "header" then - widget_content.is_checkbox_checked = get_mod(widget_content.mod_name):is_enabled() + widget_content.is_checkbox_checked = get_mod(widget_content.mod_name):is_enabled() or + get_mod(widget_content.mod_name):get_internal_data("is_mutator") elseif widget_type == "keybind" then diff --git a/vmf/scripts/mods/vmf/vmf_loader.lua b/vmf/scripts/mods/vmf/vmf_loader.lua index 083932b..8c998a7 100644 --- a/vmf/scripts/mods/vmf/vmf_loader.lua +++ b/vmf/scripts/mods/vmf/vmf_loader.lua @@ -97,6 +97,7 @@ end function vmf_mod_object:on_game_state_changed(status, state) print("VMF:ON_GAME_STATE_CHANGED(), status: " .. tostring(status) .. ", state: " .. tostring(state)) + if VT1 then vmf.check_old_vmf() end vmf.mods_game_state_changed_event(status, state) vmf.save_unsaved_settings_to_file() vmf.apply_delayed_hooks(status, state)