From 52a53b0c8d5dd9f98147ec2d9a62c2fae101c037 Mon Sep 17 00:00:00 2001 From: Agent Smith <89154459+angelus1637@users.noreply.github.com> Date: Wed, 8 Dec 2021 20:30:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены уведомления в чат о нажатии игроком кнопок на станционных/деповских пультах --- README.md | 15 +++- lua/autorun/metrostroi_advanced_init.lua | 78 +++++++++++++++++++ .../cl_metrostroi_advanced.lua | 27 ++++++- lua/metrostroi_advanced/language/en.lua | 11 ++- lua/metrostroi_advanced/language/ru.lua | 9 +++ .../sv_metrostroi_advanced.lua | 46 +++++++++++ 6 files changed, 183 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d553349..e797136 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Metrostroi Advanced -**Версия: 2.1** +**Версия: 2.2** **Разработчики:** [Alexell](https://steamcommunity.com/profiles/76561198210303223) и [Agent Smith](https://steamcommunity.com/profiles/76561197990364979) @@ -16,6 +16,7 @@ * Заменена команда !binds для запуска меню биндов Метростроя, теперь отрабатывает нормально **Новые возможности:** +* Добавлена опциональная возможность уведомления в чат о нажатии игроками кнопок на пультах (подробности см. ниже) * Добавлена команда !swn для установки собственного бортового номера вагона * Добавлена команда !entitytp для телепорта к любой энтити по ее ID * Реализована система "Автоинформатор", которая по прибытии состава на станцию, автоматически проигрывает запись информатора на составах с системой АСНП (включая 81-760 "Ока") @@ -101,3 +102,15 @@ metrostroi_maxtrains 8 metrostroi_advanced_maxwagons 3 ``` Если при спавне окажется что игроку доступно больше вагонов, чем указано в **metrostroi_maxwagons** (например из-за права на +3 вагона при **metrostroi_advanced_maxwagons 4**, то игроку все равно будет доступно только указанное в **metrostroi_maxwagons** количество вагонов, как абсолютный максимум. + +### О настройке уведомлений по нажатию кнопок на пультах +По умолчанию функция включена. Отключить можно, добавив в `server.cfg` опцию `metrostroi_advanced_buttonmessage 0` + +В комплект аддона входит пример прописанных кнопок пультов на карте gm_metro_kalinin_v2. Данные сохраняются в файл `metrostroi_advanced/map_buttons.txt` + +Администраторы сервера могут добавлять и изменять соответствие исходных названий кнопок с названием, выводимым в чат. Делается это в админской панели `[Q]->Утилиты->Metrostroi Advanced->Админ`. +* С помощью нажиматора кнопок (button_presser) наводитесь на нужную кнопку +* В поле "Исходное название" вводите название кнопки, отображаемое нажиматором +* В поле "Видимое название" вводите то что будет выводиться игрокам в чат после фразы "нажал кнопку" +* После заполнения обоих полей, нажимаете "Добавить / изменить" +* После добавления всех нужных кнопок на карте, нажимаете "Сохранить" для сохранения данных в файл diff --git a/lua/autorun/metrostroi_advanced_init.lua b/lua/autorun/metrostroi_advanced_init.lua index 2a49445..1dde9f1 100644 --- a/lua/autorun/metrostroi_advanced_init.lua +++ b/lua/autorun/metrostroi_advanced_init.lua @@ -18,6 +18,7 @@ if not MetrostroiAdvanced then MetrostroiAdvanced.TrainList = {} MetrostroiAdvanced.StationsIgnore = {} MetrostroiAdvanced.MapWagons = {} + MetrostroiAdvanced.MapButtonNames = {} end -- Загрузка локализации @@ -64,6 +65,83 @@ if SERVER then end end end + + -- Кнопки на картах + function MetrostroiAdvanced.LoadMapButtons() + local source_data = [[ +{ + "gm_metro_kalinin_v2": + { + "mr_ao_b": "[Марксистская] АО ВКЛ", + "mr_b_nb": "[Марксистская] Табло ПОСАДКИ НЕТ", + "mr_b_sw1-": "[Марксистская] Стрелка 1-", + "mr_b_sw1+": "[Марксистская] Стрелка 1+", + "mr_b_sw2-": "[Марксистская] Стрелка 2-", + "mr_b_sw2+": "[Марксистская] Стрелка 2+", + "se_ao_b": "[Шоссе Энт-ов] АО ВКЛ/ВЫКЛ", + "se_b_sw1+": "[Шоссе Энт-ов] Стрелка 1+", + "se_b_sw1-": "[Шоссе Энт-ов] Стрелка 1-", + "se_b_sw2+": "[Шоссе Энт-ов] Стрелка 2+", + "se_b_sw2-": "[Шоссе Энт-ов] Стрелка 2-", + "se_b_nb": "[Шоссе Энт-ов] Табло ПОСАДКИ НЕТ", + "se_b_sw3-": "[Шоссе Энт-ов] Стрелка 3-", + "se_b_sw3+": "[Шоссе Энт-ов] Стрелка 3+", + "kgu_b_on": "[Шоссе Энт-ов] КГУ ВКЛ", + "kgu_b_off": "[Шоссе Энт-ов] КГУ ВЫКЛ", + "kgu_b_reset": "[Шоссе Энт-ов] КГУ ВОССТ.", + "nv_b_nb": "[Новогиреево] Табло ПОСАДКИ НЕТ", + "nv_b_sw1+": "[Новогиреево] Стрелка 1+", + "nv_b_sw1-": "[Новогиреево] Стрелка 1-", + "nv_b_sw2+": "[Новогиреево] Стрелка 2+", + "nv_b_sw2-": "[Новогиреево] Стрелка 2-", + "nv_b_sw3+": "[Новогиреево] Стрелка 3+", + "nv_b_sw3-": "[Новогиреево] Стрелка 3-", + "nv_b_sw5+": "[Новогиреево] Стрелка 5+", + "nv_b_sw5-": "[Новогиреево] Стрелка 5-", + "nv_b_sw4+": "[Новогиреево] Стрелка 4+", + "nv_b_sw4-": "[Новогиреево] Стрелка 4-", + "nv_b_sw6+": "[Новогиреево] Стрелка 6+", + "nv_b_sw6-": "[Новогиреево] Стрелка 6-", + "nv_b_ad4_on": "[Новогиреево] АО 4 путь ВКЛ", + "nv_b_ad4_off": "[Новогиреево] АО 4 путь ВЫКЛ", + "nv_b_ad3_on": "[Новогиреево] АО 3 путь ВКЛ", + "nv_b_ad3_off": "[Новогиреево] АО 3 путь ВЫКЛ", + "tr_b_sw3+": "[Третьяковская] Стрелка 3+", + "tr_b_sw3-": "[Третьяковская] Стрелка 3-", + "tr_b_sw1+": "[Третьяковская] Стрелка 1+", + "tr_b_sw1-": "[Третьяковская] Стрелка 1-", + "tr_b_sw2+": "[Третьяковская] Стрелка 2+", + "tr_b_sw2-": "[Третьяковская] Стрелка 2-", + "tr_b_ad3_on": "[Третьяковская] АО ВКЛ", + "tr_b_ad3_off": "[Третьяковская] АО ВЫКЛ", + "nk_b_nb": "[Новокосино] Табло ПОСАДКИ НЕТ", + "nk_b_ad3_on": "[Новокосино] АО 3 путь ВКЛ", + "nk_b_ad3_off": "[Новокосино] АО 3 путь ВЫКЛ", + "nk_b_ad4_on": "[Новокосино] АО 4 путь ВКЛ", + "nk_b_ad4_off": "[Новокосино] АО 4 путь ВЫКЛ", + "nk_b_sw6+": "[Новокосино] Стрелка 6+", + "nk_b_sw6-": "[Новокосино] Стрелка 6-", + "nk_b_sw4+": "[Новокосино] Стрелка 4+", + "nk_b_sw4-": "[Новокосино] Стрелка 4-", + "nk_b_sw2+": "[Новокосино] Стрелка 2+", + "nk_b_sw2-": "[Новокосино] Стрелка 2-", + "nk_b_sw1+": "[Новокосино] Стрелка 1+", + "nk_b_sw1-": "[Новокосино] Стрелка 1-", + "nk_b_sw3+": "[Новокосино] Стрелка 3+", + "nk_b_sw3-": "[Новокосино] Стрелка 3-", + "nk_b_sw5+": "[Новокосино] Стрелка 5+", + "nk_b_sw5-": "[Новокосино] Стрелка 5-" + } +}]] + + if not file.Exists("metrostroi_advanced/map_buttons.txt","DATA") then + file.Write("metrostroi_advanced/map_buttons.txt",source_data) + end + + local fl = file.Read("metrostroi_advanced/map_buttons.txt","DATA") + local tab = fl and util.JSONToTable(fl) or {} + MetrostroiAdvanced.MapButtonNames = tab[game.GetMap()] or {} + end -- Название состава по классу function MetrostroiAdvanced.GetTrainName(class) diff --git a/lua/metrostroi_advanced/cl_metrostroi_advanced.lua b/lua/metrostroi_advanced/cl_metrostroi_advanced.lua index 5130955..d25938a 100644 --- a/lua/metrostroi_advanced/cl_metrostroi_advanced.lua +++ b/lua/metrostroi_advanced/cl_metrostroi_advanced.lua @@ -15,6 +15,8 @@ CreateClientConVar("ma_clientoptimize","1",true,false) CreateClientConVar("ma_voltage","0",false,false) CreateClientConVar("ma_curlim","0",false,false) CreateClientConVar("ma_requirethirdrail","0",false,false) +CreateClientConVar("ma_button_sourcename", "", false, false) +CreateClientConVar("ma_button_output", "", false, false) -- Дублирующие серверные квары для админов CreateClientConVar("metrostroi_advanced_spawninterval","0",false,false) @@ -25,6 +27,7 @@ CreateClientConVar("metrostroi_advanced_maxwagons","0",false,false) CreateClientConVar("metrostroi_advanced_autowags","0",false,false) CreateClientConVar("metrostroi_advanced_afktime","0",false,false) CreateClientConVar("metrostroi_advanced_timezone","0",false,false) +CreateClientConVar("metrostroi_advanced_buttonmessage","0",false,false) -- Локализация MetrostroiAdvanced.LoadLanguage(GetConVarString("metrostroi_language")) @@ -44,6 +47,16 @@ local function SendCommand(com,val) net.SendToServer() end +concommand.Add("ma_add_buttonoutput",function(ply,cmd,args) + if not ply:IsAdmin() then return end + local btn_name = GetConVar("ma_button_sourcename"):GetString() + local btn_text = GetConVar("ma_button_output"):GetString() + net.Start("MA.AddNewButtons") + net.WriteString(btn_name) + net.WriteString(btn_text) + net.SendToServer() +end) + hook.Add("InitPostEntity","MA_PlayerInit",function() if not LocalPlayer():IsAdmin() then return end timer.Simple(1,function() @@ -79,6 +92,10 @@ hook.Add("InitPostEntity","MA_PlayerInit",function() if (old == new) then return end SendCommand(cvar,new) end) + cvars.AddChangeCallback("metrostroi_advanced_buttonmessage",function(cvar,old,new) + if (old == new) then return end + SendCommand(cvar,new) + end) -- cvars.AddChangeCallback("ma_voltage",function(cvar,old,new) if (old == new) then return end @@ -172,8 +189,16 @@ local function AdminPanel(panel) panel:Help(lang("APCurLim").." (A):") panel:TextEntry("","ma_curlim") panel:Help("") -- отступ - panel:Help("") -- отступ panel:ControlHelp(lang("APTools")) + panel:Help(lang("ACPBtnHeader")) + panel:CheckBox(lang("ACPBtnCheckBox"),"metrostroi_advanced_buttonmessage") + panel:Help(lang("ACPBtnCheckBox")) + panel:TextEntry(lang("ACPBtnSource"),"ma_button_sourcename") + panel:TextEntry(lang("ACPBtnVisible"),"ma_button_output") + panel:Button(lang("ACPBtnAdd"),"ma_add_buttonoutput",true) + panel:Button(lang("ACPBtnSave"),"ma_save_buttonoutput",true) + panel:Help("") -- отступ + panel:Help(lang("ACPSigTools")) panel:Button(lang("APSignSave"),"metrostroi_save",true) panel:Button(lang("APSignReload"),"metrostroi_load",true) panel:Button(lang("APTrackEditor"),"metrostroi_trackeditor",true) diff --git a/lua/metrostroi_advanced/language/en.lua b/lua/metrostroi_advanced/language/en.lua index 00d5bc1..a49bdea 100644 --- a/lua/metrostroi_advanced/language/en.lua +++ b/lua/metrostroi_advanced/language/en.lua @@ -58,6 +58,7 @@ MetrostroiAdvanced.Lang["AfkWarning"] = "If you dont start moving in %s %s, yo MetrostroiAdvanced.Lang["Afkmins"] = "minute(s)" MetrostroiAdvanced.Lang["Afkmin1"] = "minute" MetrostroiAdvanced.Lang["AfkKick"] = "kicked for being AFK" +MetrostroiAdvanced.Lang["PressedButton"] = "pressed button" -- ULX MetrostroiAdvanced.Lang["Teleported"] = "teleported" @@ -121,4 +122,12 @@ MetrostroiAdvanced.Lang["APSignReload"] = "Load signals" MetrostroiAdvanced.Lang["APTrackEditor"] = "Track editor" MetrostroiAdvanced.Lang["APToggleNodes"] = "Show/Hide nodes" MetrostroiAdvanced.Lang["ACPAdmin"] = "Admin" -MetrostroiAdvanced.Lang["ACPClient"] = "Client" \ No newline at end of file +MetrostroiAdvanced.Lang["ACPClient"] = "Client" +MetrostroiAdvanced.Lang["ACPSigTools"] = "Signalling Tools" +MetrostroiAdvanced.Lang["ACPBtnSource"] = "Source name:" +MetrostroiAdvanced.Lang["ACPBtnVisible"] = "Visible name:" +MetrostroiAdvanced.Lang["ACPBtnAdd"] = "Add / Edit" +MetrostroiAdvanced.Lang["ACPBtnSave"] = "Save all buttons" +MetrostroiAdvanced.Lang["ACPBtnHeader"] = "Station control buttons notifications" +MetrostroiAdvanced.Lang["ACPBtnCheckBox"] = "Enable/Disable notifications" +MetrostroiAdvanced.Lang["ACPBtnNLabel"] = "Add button definition" \ No newline at end of file diff --git a/lua/metrostroi_advanced/language/ru.lua b/lua/metrostroi_advanced/language/ru.lua index ca078b9..2068899 100644 --- a/lua/metrostroi_advanced/language/ru.lua +++ b/lua/metrostroi_advanced/language/ru.lua @@ -59,6 +59,7 @@ MetrostroiAdvanced.Lang["AfkWarning"] = "Если вы не начнете д MetrostroiAdvanced.Lang["Afkmins"] = "минут(ы)" MetrostroiAdvanced.Lang["Afkmin1"] = "минуту" MetrostroiAdvanced.Lang["AfkKick"] = "отключен за бездействие" +MetrostroiAdvanced.Lang["PressedButton"] = "нажал кнопку" -- ULX MetrostroiAdvanced.Lang["Teleported"] = "телепортировался" @@ -122,3 +123,11 @@ MetrostroiAdvanced.Lang["APTrackEditor"] = "Редактор треков" MetrostroiAdvanced.Lang["APToggleNodes"] = "Показать/скрыть треки" MetrostroiAdvanced.Lang["ACPAdmin"] = "Админ" MetrostroiAdvanced.Lang["ACPClient"] = "Клиент" +MetrostroiAdvanced.Lang["ACPSigTools"] = "Управление сигнализацией" +MetrostroiAdvanced.Lang["ACPBtnSource"] = "Исх. название:" +MetrostroiAdvanced.Lang["ACPBtnVisible"] = "Видимое название:" +MetrostroiAdvanced.Lang["ACPBtnAdd"] = "Добавить / изменить" +MetrostroiAdvanced.Lang["ACPBtnSave"] = "Сохранить все кнопки" +MetrostroiAdvanced.Lang["ACPBtnHeader"] = "Уведомления о нажатии кнопок на пультах" +MetrostroiAdvanced.Lang["ACPBtnCheckBox"] = "Включить/отключить уведомления" +MetrostroiAdvanced.Lang["ACPBtnNLabel"] = "Добавить расшифровку кнопки" \ No newline at end of file diff --git a/lua/metrostroi_advanced/sv_metrostroi_advanced.lua b/lua/metrostroi_advanced/sv_metrostroi_advanced.lua index ad7c918..3a499f5 100644 --- a/lua/metrostroi_advanced/sv_metrostroi_advanced.lua +++ b/lua/metrostroi_advanced/sv_metrostroi_advanced.lua @@ -19,8 +19,10 @@ local auto_wags = CreateConVar("metrostroi_advanced_autowags", 0, {FCVAR_ARCHIVE local madv_lang = CreateConVar("metrostroi_advanced_lang", "ru", {FCVAR_ARCHIVE}) local afktime = CreateConVar("metrostroi_advanced_afktime", 0, {FCVAR_ARCHIVE}) local timezone = CreateConVar("metrostroi_advanced_timezone", 3, {FCVAR_ARCHIVE}) +local buttonmessage = CreateConVar("metrostroi_advanced_buttonmessage", 1, {FCVAR_ARCHIVE}) util.AddNetworkString("MA.ServerCommands") +util.AddNetworkString("MA.AddNewButtons") AFK_TIME = 0 AFK_WARN1 = 0 @@ -34,9 +36,18 @@ timer.Create("MetrostroiAdvancedInit",1,1,function() MetrostroiAdvanced.LoadLanguage(GetConVarString("metrostroi_advanced_lang")) MetrostroiAdvanced.LoadStationsIgnore() MetrostroiAdvanced.LoadMapWagonsLimit() + MetrostroiAdvanced.LoadMapButtons() SetGlobalInt("TrainLastSpawned",os.time()) end) +concommand.Add("ma_save_buttonoutput", function( ply, cmd, args ) + if not ply:IsAdmin() then return end + local fl = file.Read("metrostroi_advanced/map_buttons.txt","DATA") + local tab = fl and util.JSONToTable(fl) or {} + tab[game.GetMap()] = MetrostroiAdvanced.MapButtonNames + file.Write("metrostroi_advanced/map_buttons.txt",util.TableToJSON(tab,true)) +end) + cvars.AddChangeCallback("metrostroi_advanced_lang", function(cvar, old, new) MetrostroiAdvanced.LoadLanguage(new) end) @@ -61,6 +72,13 @@ net.Receive("MA.ServerCommands",function(ln,ply) RunConsoleCommand(com,val) end) +net.Receive("MA.AddNewButtons",function(ln,ply) + if not IsValid(ply) then return end + local sourcename = net.ReadString() + local outputname = net.ReadString() + MetrostroiAdvanced.MapButtonNames[sourcename] = outputname +end) + local function PlayerPermission(ply,permission) if ULib then return ULib.ucl.query(ply,permission) @@ -232,6 +250,7 @@ hook.Add("PlayerInitialSpawn","SetPlyParams",function(ply) ply:ConCommand("metrostroi_advanced_autowags "..GetConVarNumber("metrostroi_advanced_autowags")) ply:ConCommand("metrostroi_advanced_afktime "..GetConVarNumber("metrostroi_advanced_afktime")) ply:ConCommand("metrostroi_advanced_timezone "..GetConVarNumber("metrostroi_advanced_timezone")) + ply:ConCommand("metrostroi_advanced_buttonmessage "..GetConVarNumber("metrostroi_advanced_buttonmessage")) -- ply:ConCommand("ma_voltage "..GetConVarNumber("metrostroi_voltage")) ply:ConCommand("ma_curlim "..GetConVarNumber("metrostroi_current_limit")) @@ -409,3 +428,30 @@ timer.Simple(1,function() v.Think = Think end end) + +-- Вывод в чат нажатия кнопок на карте +timer.Simple(5,function() -- отсекаем лишний высер в лог на старте карт + hook.Add("AcceptInput", "MA.ButtonUsedOutputs", function(ent, input, activator, caller, value) + if(GetConVar("metrostroi_advanced_buttonmessage"):GetInt() == 0) then return end + if IsValid(ent) and ent:GetClass() == "func_button" then + local Nick + local ButtonName + if MetrostroiAdvanced.MapButtonNames[ent:GetName()] == nil then + ButtonName = ent:GetName() + else + ButtonName = MetrostroiAdvanced.MapButtonNames[ent:GetName()] + end + if input == "Use" then + if IsValid(activator) and activator:GetClass() == "player" then + if IsValid(caller) and caller:GetClass() == "player" then + Nick = caller:Nick() + ulx.fancyLog("#s "..lang("PressedButton").." #s",Nick,ButtonName) + end + end + elseif input == "Press" then + Nick = "Someone" + ulx.fancyLog("#s "..lang("PressedButton").." #s",Nick,ButtonName) + end + end + end) +end)