1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/metrostroi/systems/sys_81_71_announcer.lua
kosmik641 5d6dd0cdd6 Оптимизация.
В gmod_subway_base добавлена переменная self.WagonCount и заменены везде на неё, где используется #self.WagonList.
В 81-501 убран лишний цикл 18 провода.
В БУВ 81-720 и 81-722 убрана неиспользуемая локальная переменная
В sys_81_71_announcer добавленая локальная переменная для self.Train там где это релевантно, убраны лишние локальные перменные.
2025-12-20 16:33:24 +03:00

169 lines
6.1 KiB
Lua

--------------------------------------------------------------------------------
-- Announcer and announcer-related code
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("81_71_Announcer")
TRAIN_SYSTEM.DontAccelerateSimulation = true
local ANNOUNCER_CACHE_LIMIT = 30
function TRAIN_SYSTEM:Outputs()
return {}
end
function TRAIN_SYSTEM:Inputs()
return {"Reset"}
end
if TURBOSTROI then return end
--------------------------------------------------------------------------------
if SERVER then
function TRAIN_SYSTEM:Initialize(tbl)
self.Schedule = {}
self.AnnTable = tbl
end
util.AddNetworkString("metrostroi_announcer")
function TRAIN_SYSTEM:TriggerInput(name,value)
if name == "Reset" then
self:Reset()
self.AnnTable = value
end
end
function TRAIN_SYSTEM:Queue(tbl)
if not Metrostroi[self.AnnTable] then return end
local Train = self.Train
for k, v in pairs(tbl) do
local tbl = Metrostroi[self.AnnTable][Train:GetNW2Int("Announcer", 1)] or Metrostroi[self.AnnTable][1]
if v~=-2 then
table.insert(self.Schedule, tbl and tbl[v] or v)
else
self:Reset()
end
end
end
function TRAIN_SYSTEM:Reset()
if #self.Schedule > 0 then
self.Schedule = {}
self.AnnounceTimer = nil
if self.BuzzWork then self:Queue{"buzz_end"} end
end
self:WriteMessage("_STOP")
end
function TRAIN_SYSTEM:WriteMessage(msg)
local Train = self.Train
for i=1,Train.WagonCount do
net.Start("metrostroi_announcer", true)
net.WriteEntity(Train.WagonList[i])
net.WriteString(msg)
net.WriteString(self.AnnTable)
net.Broadcast()
end
end
--end
function TRAIN_SYSTEM:Think()
local Train = self.Train
if #self.Schedule > 0 and not self.Playing then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Bool("AnnouncerPlaying", true)
end
self.Playing = true
elseif #self.Schedule == 0 and self.Playing and not self.AnnounceTimer then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Bool("AnnouncerPlaying", false)
end
self.Playing = false
end
while #self.Schedule > 0 and (not self.AnnounceTimer or CurTime() - self.AnnounceTimer > 0) do
local tbl = table.remove(self.Schedule, 1)
if type(tbl) == "number" then
if tbl == -1 then
for i=1,Train.WagonCount do
Train.WagonList[i].AnnouncementToLeaveWagon = true
--train.AnnouncementToLeaveWagonAcknowledged = false
end
elseif self.NoiseWork == true then
self.NoiseWork = tbl
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerNoise", tbl)
end
elseif self.BuzzWork == 1 then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerBuzz", tbl)
end
self.BuzzWork = true
else
self.AnnounceTimer = CurTime() + tbl
end
elseif tbl == "noise_start" then
self.NoiseWork = true
elseif tbl == "noise_end" then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerNoise", -1)
end
self.NoiseWork = false
elseif tbl == "buzz_start_upo" then
self.BuzzWork = 1
elseif tbl == "buzz_end_upo" then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerBuzz", -1)
end
elseif tbl == "buzz_start" then
local bpsn = Train:GetNW2Int("BPSNType",13)
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerBuzz", (bpsn == 1 or bpsn == 2 or bpsn == 8) and 2 or 1)
end
self.BuzzWork = true
elseif tbl == "buzz_end" then
for i=1,Train.WagonCount do
Train.WagonList[i]:SetNW2Int("AnnouncerBuzz", -1)
end
self.BuzzWork = false
elseif type(tbl) == "table" then
self:WriteMessage(tbl[1])
self.AnnounceTimer = CurTime() + tbl[2]
else
ErrorNoHalt("Announcer error in message "..tbl.."\n")
end
end
if #self.Schedule == 0 and self.AnnounceTimer and CurTime() - self.AnnounceTimer > 0 then
self.AnnounceTimer = nil
if self.BuzzWork then self:Queue{"buzz_end"} end
end
if #self.Schedule > ANNOUNCER_CACHE_LIMIT then
self:Reset()
end
end
else
net.Receive("metrostroi_announcer", function(len, pl)
local train = net.ReadEntity()
if not IsValid(train) or not train.RenderClientEnts then return end
local snd = net.ReadString()
if train.Announcer then
train.Announcer.AnnTable = net.ReadString()
end
if train.AnnouncerPositions then
for k, v in ipairs(train.AnnouncerPositions) do
train:PlayOnceFromPos("announcer" .. k, snd, train.OnAnnouncer and train:OnAnnouncer(v[3],k) or v[3] or 1, 1, v[2] or 400, 1e9, v[1])
end
else
train:PlayOnceFromPos("announcer", snd, train.OnAnnouncer and train:OnAnnouncer(1) or 1, 1, 600, 1e9, Vector(0, 0, 0))
end
end)
function TRAIN_SYSTEM:ClientInitialize(tbl)
self.AnnTable = tbl
end
function TRAIN_SYSTEM:ClientThink()
end
end