Skip to content

Commit

Permalink
Новый функционал
Browse files Browse the repository at this point in the history
Добавлены уведомления в чат о нажатии игроком кнопок на станционных/деповских пультах
  • Loading branch information
angelus1637 committed Dec 8, 2021
1 parent 8eb72e8 commit 52a53b0
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 3 deletions.
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Metrostroi Advanced

**Версия: 2.1**
**Версия: 2.2**

**Разработчики:** [Alexell](https://steamcommunity.com/profiles/76561198210303223) и [Agent Smith](https://steamcommunity.com/profiles/76561197990364979)

Expand All @@ -16,6 +16,7 @@
* Заменена команда !binds для запуска меню биндов Метростроя, теперь отрабатывает нормально

**Новые возможности:**
* Добавлена опциональная возможность уведомления в чат о нажатии игроками кнопок на пультах (подробности см. ниже)
* Добавлена команда !swn для установки собственного бортового номера вагона
* Добавлена команда !entitytp для телепорта к любой энтити по ее ID
* Реализована система "Автоинформатор", которая по прибытии состава на станцию, автоматически проигрывает запись информатора на составах с системой АСНП (включая 81-760 "Ока")
Expand Down Expand Up @@ -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) наводитесь на нужную кнопку
* В поле "Исходное название" вводите название кнопки, отображаемое нажиматором
* В поле "Видимое название" вводите то что будет выводиться игрокам в чат после фразы "нажал кнопку"
* После заполнения обоих полей, нажимаете "Добавить / изменить"
* После добавления всех нужных кнопок на карте, нажимаете "Сохранить" для сохранения данных в файл
78 changes: 78 additions & 0 deletions lua/autorun/metrostroi_advanced_init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ if not MetrostroiAdvanced then
MetrostroiAdvanced.TrainList = {}
MetrostroiAdvanced.StationsIgnore = {}
MetrostroiAdvanced.MapWagons = {}
MetrostroiAdvanced.MapButtonNames = {}
end

-- Загрузка локализации
Expand Down Expand Up @@ -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)
Expand Down
27 changes: 26 additions & 1 deletion lua/metrostroi_advanced/cl_metrostroi_advanced.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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"))
Expand All @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 10 additions & 1 deletion lua/metrostroi_advanced/language/en.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
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"
9 changes: 9 additions & 0 deletions lua/metrostroi_advanced/language/ru.lua
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ MetrostroiAdvanced.Lang["AfkWarning"] = "Если вы не начнете д
MetrostroiAdvanced.Lang["Afkmins"] = "минут(ы)"
MetrostroiAdvanced.Lang["Afkmin1"] = "минуту"
MetrostroiAdvanced.Lang["AfkKick"] = "отключен за бездействие"
MetrostroiAdvanced.Lang["PressedButton"] = "нажал кнопку"

-- ULX
MetrostroiAdvanced.Lang["Teleported"] = "телепортировался"
Expand Down Expand Up @@ -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"] = "Добавить расшифровку кнопки"
46 changes: 46 additions & 0 deletions lua/metrostroi_advanced/sv_metrostroi_advanced.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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"))
Expand Down Expand Up @@ -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)

0 comments on commit 52a53b0

Please sign in to comment.