1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
This commit is contained in:
g_brzhezinskiy
2021-01-02 12:51:45 +03:00
commit 1d05caf866
613 changed files with 337020 additions and 0 deletions

View File

@@ -0,0 +1,774 @@
--------------------------------------------------------------------------------
-- All the models, materials, sounds belong to their corresponding authors. Permission is granted to only distribute these models through Garry's Mod Steam Workshop and the official Metrostroi GitHub accounts for use with Garry's Mod and Metrostroi Subway Simulator.
--
-- It is forbidden to use any of these models, materials, sounds and other content for any commercial purposes without an explicit permission from the authors. It is forbidden to make any changes in these files in any derivative projects without an explicit permission from the author.
--
-- The following models are (C) 2015-2018 oldy (Aleksandr Kravchenko). All rights reserved.
-- models\metrostroi_train\81-502:
-- - 81-502 (Ema-502 head)
-- - 81-501 (Em-501 intermediate)
-- models\metrostroi_train\81-702:
-- - 81-702 (D head)
-- - 81-702 (D intermediate)
-- models\metrostroi_train\81-703:
-- - 81-703 (E head)
-- - 81-508 (E intermediate)
-- models\metrostroi_train\81-707:
-- - 81-707 (Ezh head)
-- - 81-708 (Ezh1 intermediate)
-- models\metrostroi_train\81-710:
-- - 81-710 (Ezh3 head)
-- - 81-508T (Em-508T intermediate)
-- models\metrostroi_train\81-717:
-- - 81-717 (Moscow head)
-- - 81-714 (Moscow intermediate)
-- - 81-717 (St. Petersburg head)
-- - 81-714 (St. Petersburg intermediate)
-- models\metrostroi_train\81-718:
-- - 81-718 (TISU head)
-- - 81-719 (TISU intermediate)
-- models\metrostroi_train\81-720:
-- - 81-720 (Yauza head)
-- - 81-721 (Yauza intermediate)
-- - 81-722 (Yubileyniy head)
-- models\metrostroi_train\81-722:
-- - 81-723 (Yubileyniy intermediate motor)
-- - 81-724 (Yubileyniy intermediate trailer)
--------------------------------------------------------------------------------
include("shared.lua")
--------------------------------------------------------------------------------
ENT.ClientProps = {}
ENT.ButtonMap = {}
ENT.AutoAnims = {}
ENT.AutoAnimNames = {}
ENT.ClientSounds = {}
--------------------------------------------------------------------------------
ENT.ClientPropsInitialized = false
ENT.ButtonMap["PVZ"] = {
pos = Vector(450,53,-12), --446 -- 14 -- -0,5
ang = Angle(0,-90+10,90),
width = 330,
height = 350,
scale = 0.0625,
hideseat=0.2,
buttons = {
{ID = "SFV1Toggle",x=0*30, y=0, w=30,h=50, tooltip = "SF1: Питание цепей управления вагона",},
{ID = "SFV2Toggle",x=1*30, y=0, w=30,h=50, tooltip = "SF2: Питание БУВ",},
{ID = "SFV3Toggle",x=2*30, y=0, w=30,h=50, tooltip = "SF3: Питание БУТП",},
{ID = "SFV4Toggle",x=3*30, y=0, w=30,h=50, tooltip = "SF4: БУТП Управление",},
{ID = "SFV5Toggle",x=4*30, y=0, w=30,h=50, tooltip = "SF5: БУТП Управление резервное",},
{ID = "SFV6Toggle",x=5*30, y=0, w=30,h=50, tooltip = "SF6: БУТП Питание",},
{ID = "SFV7Toggle",x=6*30, y=0, w=30,h=50, tooltip = "SF7: ББЭ",},
{ID = "SFV8Toggle",x=7*30, y=0, w=30,h=50, tooltip = "SF8: БВ управление",},
{ID = "SFV9Toggle",x=8*30, y=0, w=30,h=50, tooltip = "SF9: БВ питание",},
{ID = "SFV10Toggle",x=9*30, y=0, w=30,h=50, tooltip = "SF10: ППО",},
{ID = "SFV11Toggle",x=10*30, y=0, w=30,h=50, tooltip = "SF11: Мотор-компрессор"},
{ID = "SFV12Toggle",x=0*30, y=150, w=30,h=50, tooltip = "SF12: Двери закрытие",},
{ID = "SFV13Toggle",x=1*30, y=150, w=30,h=50, tooltip = "SF13: Двери открытие левых",},
{ID = "SFV14Toggle",x=2*30, y=150, w=30,h=50, tooltip = "SF14: Двери открытие правых",},
{ID = "SFV15Toggle",x=3*30, y=150, w=30,h=50, tooltip = "SF15: Двери торцевые",},
{ID = "SFV16Toggle",x=4*30, y=150, w=30,h=50, tooltip = "SF16: Оповещение",},
{ID = "SFV17Toggle",x=5*30, y=150, w=30,h=50, tooltip = "SF17: Экстренная связь",},
{ID = "SFV18Toggle",x=6*30, y=150, w=30,h=50, tooltip = "SF18: Резерв",},
{ID = "SFV19Toggle",x=7*30, y=150, w=30,h=50, tooltip = "SF19: Освещение салона питание",},
{ID = "SFV20Toggle",x=8*30, y=150, w=30,h=50, tooltip = "SF20: Освещение салона аварийное",},
{ID = "SFV21Toggle",x=9*30, y=150, w=30,h=50, tooltip = "SF21: Датчик скорости",},
{ID = "SFV22Toggle",x=10*30, y=150, w=30,h=50, tooltip = "SF22: Тормоз стояночный"},
{ID = "SFV23Toggle",x=0*30, y=300, w=30,h=50, tooltip = "SF23: Вентиляция управление 1-я группа",},
{ID = "SFV24Toggle",x=1*30, y=300, w=30,h=50, tooltip = "SF24: Вентиляция управление 2-я группа",},
{ID = "SFV25Toggle",x=2*30, y=300, w=30,h=50, tooltip = "SF25: Вентиляция питание 1-я группа",},
{ID = "SFV26Toggle",x=3*30, y=300, w=30,h=50, tooltip = "SF26: Вентиляция питание 2-я группа",},
{ID = "SFV27Toggle",x=4*30, y=300, w=30,h=50, tooltip = "SF27: Питание возбудителя FIXME",},
{ID = "SFV28Toggle",x=5*30, y=300, w=30,h=50, tooltip = "SF28: Питание ЗКК FIXME",},
{ID = "SFV29Toggle",x=6*30, y=300, w=30,h=50, tooltip = "SF29: Токоприёмники",},
{ID = "SFV30Toggle",x=7*30, y=300, w=30,h=50, tooltip = "SF30: Табло",},
{ID = "SFV31Toggle",x=8*30, y=300, w=30,h=50, tooltip = "SF31: Резерв",},
{ID = "SFV32Toggle",x=9*30, y=300, w=30,h=50, tooltip = "SF32: Резерв",},
{ID = "SFV33Toggle",x=10*30, y=300, w=30,h=50, tooltip = "SF33: Резерв"},
}
}
for k,buttbl in ipairs(ENT.ButtonMap["PVZ"].buttons) do
buttbl.model = {
model = "models/metrostroi_train/81-720/button_av1.mdl",z=-16, ang=-90,
var=buttbl.ID:Replace("Toggle",""),speed=9, vmin=0,vmax=1,
sndvol = 0.8, snd = function(val) return val and "av_on" or "av_off" end,sndmin = 80, sndmax = 1e3/3, sndang = Angle(-90,0,0),
}
end
ENT.ButtonMap["Battery"] = {
pos = Vector(455,19.1,-11.5), --446 -- 14 -- -0,5
ang = Angle(0,0,90),
width = 80,
height = 80,
scale = 0.0625,
buttons = {
{ID = "BatteryToggle",x=0, y=0, w=80,h=80 , tooltip = "Батарея", model = {
model = "models/metrostroi_train/81-717/battery_enabler.mdl",
var="Battery",speed=0.5,vmin=1,vmax=0.8,
sndvol = 0.8, snd = function(val) return val and "pak_on" or "pak_off" end,sndmin = 80, sndmax = 1e3/3, sndang = Angle(-90,0,0),
}},
}
}
ENT.ButtonMap["RearDoor"] = {
pos = Vector(-465,16-32,42),
ang = Angle(0,90,90),
width = 642,
height = 2000,
scale = 0.1/2,
buttons = {
{ID = "RearDoor",x=0,y=0,w=642,h=2000, tooltip="Задняя дверь\nRear door", model = {
var="RearDoor",sndid="door_cab_b",
sndvol = 1, snd = function(val) return val and "door_cab_open" or "door_cab_close" end,
sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0),
noTooltip = true,
}},
}
}
ENT.ButtonMap["FrontPneumatic"] = {
pos = Vector(470-9+5,-42,-58.0+5-6),
ang = Angle(0,90,90),
width = 800,
height = 100,
scale = 0.1,
buttons = {
{ID = "FrontBrakeLineIsolationToggle",x=000, y=0, w=400, h=100, tooltip="",var="FbI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}},
{ID = "FrontTrainLineIsolationToggle",x=400, y=0, w=400, h=100, tooltip="",var="FtI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}},
}
}
ENT.ClientProps["FrontBrake"] = {--
model = "models/metrostroi_train/bogey/disconnect_valve_red.mdl",
pos = Vector(449+13, -30+0.5, -69),
ang = Angle( 15,-90,0),
hide = 2,30
}
ENT.ClientProps["FrontTrain"] = {--
model = "models/metrostroi_train/bogey/disconnect_valve_blue.mdl",
pos = Vector(449+13, 30+0.5, -69),
ang = Angle(-15,-90,0),
hide = 2,
}
ENT.ClientSounds["FrontBrakeLineIsolation"] = {{"FrontBrake",function() return "disconnect_valve" end,1,1,50,1e3,Angle(-90,0,0)}}
ENT.ClientSounds["FrontTrainLineIsolation"] = {{"FrontTrain",function() return "disconnect_valve" end,1,1,50,1e3,Angle(-90,0,0)}}
ENT.ButtonMap["RearPneumatic"] = {
pos = Vector(-473-0.5+4,42,-58.0+5-6),
ang = Angle(0,270,90),
width = 800,
height = 100,
scale = 0.1,
buttons = {
{ID = "RearBrakeLineIsolationToggle",x=000, y=0, w=400, h=100, tooltip="",var="RbI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}},
{ID = "RearTrainLineIsolationToggle",x=400, y=0, w=400, h=100, tooltip="",var="RtI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}},
}
}
ENT.ClientProps["RearTrain"] = {--
model = "models/metrostroi_train/bogey/disconnect_valve_blue.mdl",
pos = Vector(-450-18, -30, -69),
ang = Angle(-15,90,0),
hide = 2,
}
ENT.ClientProps["RearBrake"] = {--
model = "models/metrostroi_train/bogey/disconnect_valve_red.mdl",
pos = Vector(-450-18, 30, -69),
ang = Angle( 15,90,0),
hide = 2,
}
ENT.ClientSounds["RearBrakeLineIsolation"] = {{"RearBrake",function() return "disconnect_valve" end,1,1,50,1e3,Angle(-90,0,0)}}
ENT.ClientSounds["RearTrainLineIsolation"] = {{"RearTrain",function() return "disconnect_valve" end,1,1,50,1e3,Angle(-90,0,0)}}
ENT.ButtonMap["FrontDoor"] = {
pos = Vector(462,16.5,42),
ang = Angle(0,-90,90),
width = 642,
height = 2000,
scale = 0.1/2,
buttons = {
{ID = "FrontDoor",x=0,y=0,w=642,h=2000, tooltip="Передняя дверь\nFront door", model = {
var="FrontDoor",sndid="door_cab_f",
sndvol = 1, snd = function(val) return val and "door_cab_open" or "door_cab_close" end,
sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0),
noTooltip = true,
}},
}
}
for i=0,3 do
ENT.ClientProps["TrainNumberL"..i] = {
model = "models/metrostroi_train/common/bort_numbers.mdl",
pos = Vector(57+i*6.6-4*6.6/2,66.3,18),
ang = Angle(0,180,-5),
skin=0,
hide = 1.5,
callback = function(ent)
ent.WagonNumber = false
end,
}
end
for i=0,3 do
ENT.ClientProps["TrainNumberR"..i] = {
model = "models/metrostroi_train/common/bort_numbers.mdl",
pos = Vector(61+i*6.6-4*6.6/2,-66.3,18),
ang = Angle(0,0,-5),
skin=0,
hide = 1.5,
callback = function(ent)
ent.WagonNumber = false
end,
}
end
ENT.ButtonMap["Tickers"] = {
pos = Vector(-460.5,-31.5,54.8), --446 -- 14 -- -0,5
ang = Angle(0,90,90),
width = 852,
height = 64,
scale = 0.074,
hide=true,
hideseat=1,
}
ENT.ClientProps["salon"] = {
model = "models/metrostroi_train/81-720/721_salon.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
hide=1.5,
}
ENT.ClientProps["underwagon"] = {
model = "models/metrostroi_train/81-720/721_underwagon.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
hide=1,
}
ENT.ClientProps["tickers"] = {
model = "models/metrostroi_train/81-720/720_tablo.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
hide=1.5,
}
ENT.ClientProps["lamps_emer"] = {
model = "models/metrostroi_train/81-720/720_lamps_emer.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
color = Color(245,238,223),
hide=1.5,
}
ENT.ClientProps["lamps_full"] = {
model = "models/metrostroi_train/81-720/720_lamps_full.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
color = Color(245,238,223),
hide=1.5,
}
ENT.ClientProps["PassSchemes"] = {
model = "models/metrostroi_train/81-720/720_sarmat_l.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
hide=1.5,
callback = function(ent)
ent.PassSchemesDone = false
end,
}
ENT.ClientProps["PassSchemesR"] = {
model = "models/metrostroi_train/81-720/720_sarmat_r.mdl",
pos = Vector(0,0,0),
ang = Angle(0,0,0),
hide=1.5,
callback = function(ent)
ent.PassSchemesDone = false
end,
}
for i=1,5 do
ENT.ClientProps["led_l_f"..i] = {
model = "models/metrostroi_train/81-720/720_led_l_r.mdl",
pos = Vector((i-1)*10.5+0.2,0,0),
ang = Angle(0,0,0),
skin=6,
hideseat = 1.5,
}
ENT.ClientProps["led_l_b"..i] = {
model = "models/metrostroi_train/81-720/720_led_l.mdl",
pos = Vector(-(i-1)*10.5-0.2,0,0),
ang = Angle(0,0,0),
skin=6,
hideseat = 1.5,
}
ENT.ClientProps["led_r_f"..i] = {
model = "models/metrostroi_train/81-720/720_led_r.mdl",
pos = Vector((i-1)*10.5+0.2,0,0),
ang = Angle(0,0,0),
skin=6,
hideseat = 1.5,
}
ENT.ClientProps["led_r_b"..i] = {
model = "models/metrostroi_train/81-720/720_led_r_r.mdl",
pos = Vector(-(i-1)*10.5-0.2,0,0),
ang = Angle(0,0,0),
skin=6,
hideseat = 1.5,
}
end
ENT.ButtonMap["GV"] = {
pos = Vector(128,63,-52-15),
ang = Angle(0,180,90),
width = 170,
height = 150,
scale = 0.1,
buttons = {
{ID = "GVToggle",x=0, y=0, w= 170,h = 150, tooltip="Разъединитель БРУ (ГВ)", model = {
var="GV",sndid = "gv_wrench",
sndvol = 0.8,sndmin = 80, sndmax = 1e3/3, sndang = Angle(-90,0,0),
snd = function(val) return val and "gv_f" or "gv_b" end,
states={"Train.Buttons.Disconnected","Train.Buttons.On"}
}},
}
}
ENT.ClientProps["gv_wrench"] = {
model = "models/metrostroi_train/reversor/reversor_classic.mdl",
pos = Vector(126.4,50,-60-23.5),
ang = Angle(-90,0,0),
hide = 0.5,
}
--------------------------------------------------------------------------------
-- Add doors
--------------------------------------------------------------------------------
--[[ local function GetDoorPosition(i,k,j)
if j == 0
then return Vector(377.0 - 36.0 + 1*(k) - 230*i,-64*(1-2*k),-10)
else return Vector(377.0 - 36.0 + 1*(k) - 230*i,-64*(1-2*k),-10)
end
end
for i=0,3 do
for k=0,1 do
ENT.ClientProps["door"..i.."x"..k.."a"] = {
model = "models/metrostroi_train/81-720/81-720_door_l.mdl",
pos = GetDoorPosition(i,k,0),
ang = Angle(0,90 +180*k,0),
hide = 2,
}
ENT.ClientProps["door"..i.."x"..k.."b"] = {
model = "models/metrostroi_train/81-720/81-720_door_r.mdl",
pos = GetDoorPosition(i,k,1),
ang = Angle(0,90 +180*k,0),
hide = 2,
}
end
end--]]
ENT.ClientProps["door0x1"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos1.mdl",
pos = Vector( 341.539,63.171,-11.1),
ang = Angle(0,-90,0),
hide = 2.0,
}
ENT.ClientProps["door1x1"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos2.mdl",
pos = Vector( 111.38,63.171,-11.1),
ang = Angle(0,-90,0),
hide = 2.0,
}
ENT.ClientProps["door2x1"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos3.mdl",
pos = Vector(-117.756,63.171,-11.1),
ang = Angle(0,-90,0),
hide = 2.0,
}
ENT.ClientProps["door3x1"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos4.mdl",
pos = Vector(-348.72,63.171,-11.1),
ang = Angle(0,-90,0),
hide = 2.0,
}
ENT.ClientProps["door0x0"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos4.mdl",
pos = Vector( 341.539,-63.171,-11.1),
ang = Angle(0,90,0),
hide = 2.0,
}
ENT.ClientProps["door1x0"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos3.mdl",
pos = Vector( 111.38,-63.171,-11.1),
ang = Angle(0,90,0),
hide = 2.0,
}
ENT.ClientProps["door2x0"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos2.mdl",
pos = Vector(-117.756,-63.171,-11.1),
ang = Angle(0,90,0),
hide = 2.0,
}
ENT.ClientProps["door3x0"] = {
model = "models/metrostroi_train/81-720/81-720_doors_pos1.mdl",
pos = Vector(-348.72,-63.171,-11.1),
ang = Angle(0,90,0),
hide = 2.0,
}
ENT.ClientProps["door_cab_f"] = {
model = "models/metrostroi_train/81-720/720_door_tor.mdl",
pos = Vector(462,-17,-10),
ang = Angle(0,89,0),
hide=2
}
ENT.ClientProps["door_cab_b"] = {
model = "models/metrostroi_train/81-720/720_door_tor.mdl",
pos = Vector(-466.2,17,-10),
ang = Angle(0,-91,-0.15),
hide=2
}
local yventpos = {
-414.5+0*117,
-414.5+1*117+6.2,
-414.5+2*117+5,
-414.5+3*117+2,
-414.5+4*117+0.5,
-414.5+5*117-2.3,
-414.5+6*117-2.3,
-414.5+7*117+4,
}
for i=1,8 do
ENT.ClientProps["vent"..i] = {
model = "models/metrostroi_train/81-720/vent.mdl",
pos = Vector(yventpos[i],0,57.2),
ang = Angle(0,0,0),
hideseat=0.8,
}
end
ENT.Lights = {
-- Headlight glow
--[2] = { "dynamiclight", Vector( 300, 0, 40), Angle(0,0,0), Color(255,255,255), brightness = 4, distance = 550 },
}
function ENT:Initialize()
self.BaseClass.Initialize(self)
self.Tickers = self:CreateRT("721Ticker",1024,64)
render.PushRenderTarget(self.Tickers,0,0,1024, 64)
render.Clear(0, 0, 0, 0)
render.PopRenderTarget()
self.ReleasedPdT = 0
self.PreviousCompressorState = false
self.CompressorVol = 0
self.TISUVol = 0
self.FrontLeak = 0
self.RearLeak = 0
self.ParkingBrake = 0
self.VentRand = {}
self.VentState = {}
self.VentVol = {}
for i=1,8 do
self.VentRand[i] = math.Rand(0.5,2)
self.VentState[i] = 0
self.VentVol[i] = 0
end
end
function ENT:UpdateWagonNumber()
for i=0,3 do
--self:ShowHide("TrainNumberL"..i,i<count)
--self:ShowHide("TrainNumberR"..i,i<count)
--if i< count then
local num = math.floor(self.WagonNumber%(10^(i+1))/10^i)
local leftNum,rightNum = self.ClientEnts["TrainNumberL"..i],self.ClientEnts["TrainNumberR"..i]
if IsValid(leftNum) then
leftNum:SetPos(self:LocalToWorld(Vector(60+i*6.6-4*6.6/2,66.3,18)))
leftNum:SetSkin(num)
end
if IsValid(rightNum) then
rightNum:SetPos(self:LocalToWorld(Vector(53-i*6.6+4*6.6/2,-66.3,18)))
rightNum:SetSkin(num)
end
--end
end
end
function ENT:Think()
self.BaseClass.Think(self)
if not self.RenderClientEnts or self.CreatingCSEnts then
return
end
if not self.PassSchemesDone then
local sarmat = self.ClientEnts.PassSchemes
local sarmatr = self.ClientEnts.PassSchemesR
local scheme = Metrostroi.Skins["720_schemes"] and Metrostroi.Skins["720_schemes"][self.Scheme]
if IsValid(sarmat) and IsValid(sarmatr) and scheme then
if self:GetNW2Bool("PassSchemesInvert") then
sarmat:SetSubMaterial(0,scheme[2])
sarmatr:SetSubMaterial(0,scheme[1])
else
sarmat:SetSubMaterial(0,scheme[1])
sarmatr:SetSubMaterial(0,scheme[2])
end
self.PassSchemesDone = true
end
end
if self.Scheme ~= self:GetNW2Int("Scheme",1) then
self.PassSchemesDone = false
self.Scheme = self:GetNW2Int("Scheme",1)
end
if self.InvertSchemes ~= self:GetNW2Bool("PassSchemesInvert",false) then
self.PassSchemesDone=false
self.InvertSchemes = self:GetNW2Bool("PassSchemesInvert",false)
end
if self.LastGVValue ~= self:GetPackedBool("GV") then
self.ResetTime = CurTime()+1.5
self.LastGVValue = self:GetPackedBool("GV")
end
self:Animate("gv_wrench",self.LastGVValue and 1 or 0,0.5,1,128,1,false)
self:ShowHideSmooth("gv_wrench", CurTime() < self.ResetTime and 1 or 0.1)
local dT = self.DeltaTime
local parking_brake = math.max(0,-self:GetPackedRatio("ParkingBrakePressure_dPdT",0))
self.ParkingBrake = self.ParkingBrake+(parking_brake-self.ParkingBrake)*dT*10
self:SetSoundState("parking_brake",self.ParkingBrake,1.4)
local dPdT = self:GetPackedRatio("BrakeCylinderPressure_dPdT")
self.ReleasedPdT = math.Clamp(self.ReleasedPdT + 4*(-self:GetPackedRatio("BrakeCylinderPressure_dPdT",0)-self.ReleasedPdT)*dT,0,1)
--print(dPdT)
self:SetSoundState("release",math.Clamp(self.ReleasedPdT,0,1)^1.65,1.0)
self:ShowHideSmooth("lamps_emer",self:Animate("LampsEmer",self:GetPackedRatio("SalonLighting") == 0.4 and 1 or 0,0,1,5,false))
self:ShowHideSmooth("lamps_full",self:Animate("LampsFull",self:GetPackedRatio("SalonLighting") == 1 and 1 or 0,0,1,5,false))
self:Animate("FrontBrake", self:GetNW2Bool("FbI") and 0 or 1,0,1, 3, false)
self:Animate("FrontTrain", self:GetNW2Bool("FtI") and 1 or 0,0,1, 3, false)
self:Animate("RearBrake", self:GetNW2Bool("RbI") and 0 or 1,0,1, 3, false)
self:Animate("RearTrain", self:GetNW2Bool("RtI") and 1 or 0,0,1, 3, false)
local scurr = self:GetNW2Int("PassSchemesLED")
local snext = self:GetNW2Int("PassSchemesLEDN")
local led_back = self:GetPackedBool("PassSchemesLEDO",false)
if self:GetPackedBool("PassSchemesInvert",false) then led_back = not led_back end
local ledwork = scurr~=0 or snext~=0
for i=1,5 do
self:ShowHide("led_l_f"..i,not led_back and ledwork)
self:ShowHide("led_l_b"..i,led_back and ledwork)
self:ShowHide("led_r_f"..i,not led_back and ledwork)
self:ShowHide("led_r_b"..i,led_back and ledwork)
end
local led = scurr
if snext ~= 0 and CurTime()%.5 > .25 then led = led + snext end
if scurr < 0 then led = math.floor(CurTime()%5*6.2) end
if led_back then
if ledwork then
for i=1,5 do
if IsValid(self.ClientEnts["led_l_b"..i]) then self.ClientEnts["led_l_b"..i]:SetSkin(math.Clamp(led-((i-1)*6),0,6)) end
if IsValid(self.ClientEnts["led_r_b"..i]) then self.ClientEnts["led_r_b"..i]:SetSkin(math.Clamp(led-((i-1)*6),0,6)) end
end
end
else
if ledwork then
for i=1,5 do
if IsValid(self.ClientEnts["led_l_f"..i]) then self.ClientEnts["led_l_f"..i]:SetSkin(math.Clamp(led-((i-1)*6),0,6)) end
if IsValid(self.ClientEnts["led_r_f"..i]) then self.ClientEnts["led_r_f"..i]:SetSkin(math.Clamp(led-((i-1)*6),0,6)) end
end
end
end
if not self.DoorStates then self.DoorStates = {} end
if not self.DoorLoopStates then self.DoorLoopStates = {} end
for i=0,3 do
for k=0,1 do
local st = k==1 and "DoorL" or "DoorR"
local doorstate = self:GetPackedBool(st)
local id,sid = st..(i+1),"door"..i.."x"..k
local state = self:GetPackedRatio(id)
--print(state,self.DoorStates[state])
if (state ~= 1 and state ~= 0) ~= self.DoorStates[id] then
if doorstate and state < 1 or not doorstate and state > 0 then
else
if state > 0 then
self:PlayOnce(sid.."o","",1,math.Rand(0.9,1.1))
else
self:PlayOnce(sid.."c","",1,math.Rand(0.9,1.1))
end
end
self.DoorStates[id] = (state ~= 1 and state ~= 0)
end
if (state ~= 1 and state ~= 0) then
self.DoorLoopStates[id] = math.Clamp((self.DoorLoopStates[id] or 0) + 2*self.DeltaTime,0,1)
else
self.DoorLoopStates[id] = math.Clamp((self.DoorLoopStates[id] or 0) - 6*self.DeltaTime,0,1)
end
self:SetSoundState(sid.."r",self.DoorLoopStates[id],0.9+self.DoorLoopStates[id]*0.1)
local n_l = "door"..i.."x"..k--.."a"
--local n_r = "door"..i.."x"..k.."b"
local dlo = 1
--local dro = 1
if self.Anims[n_l] then
dlo = math.abs(state-(self.Anims[n_l] and self.Anims[n_l].oldival or 0))
if dlo <= 0 and self.Anims[n_l].oldspeed then dlo = self.Anims[n_l].oldspeed/15 end
end
--[[ if self.Anims[n_r] then
dro = math.abs(state-self.Anims[n_r].oldival)
if dro <= 0 and self.Anims[n_r].oldspeed then dro = self.Anims[n_r].oldspeed/15 end
end--]]
self:Animate(n_l,state,0.02,1, dlo*15,false)--0.8 + (-0.2+0.4*math.random()),0)
--self:Animate(n_r,state,0,1, dro*15,false)--0.8 + (-0.2+0.4*math.random()),0)
end
end
local door_f = self:GetPackedBool("FrontDoor")
local door_b = self:GetPackedBool("RearDoor")
local door_cab_f = self:Animate("door_cab_f",door_f and 1 or -0.05,0,0.235, 8, 0.05)
local door_cab_b = self:Animate("door_cab_b",door_b and 1 or -0.05,0,0.25, 8, 0.05)
local door1s = (door_cab_f > 0 or door_f)
if self.Door1 ~= door1s then
self.Door1 = door1s
self:PlayOnce("FrontDoor","bass",door1s and 1 or 0)
end
local door2s = (door_cab_b > 0 or door_b)
if self.Door2 ~= door2s then
self.Door2 = door2s
self:PlayOnce("RearDoor","bass",door2s and 1 or 0)
end
local speed = self:GetPackedRatio("Speed", 0)
local ventSpeedAdd = math.Clamp(speed/30,0,1)
local v1state = self:GetPackedBool("Vent1Work")
local v2state = self:GetPackedBool("Vent2Work")
for i=1,8 do
local rand = self.VentRand[i]
local vol = self.VentVol[i]
local even = i%2 == 0
local work = (even and v1state or not even and v2state)
local target = math.min(1,(work and 1 or 0)+ventSpeedAdd*rand*0.4)*2
if self.VentVol[i] < target then
self.VentVol[i] = math.min(target,vol + dT/1.5*rand)
elseif self.VentVol[i] > target then
self.VentVol[i] = math.max(0,vol - dT/8*rand*(vol*0.3))
end
self.VentState[i] = (self.VentState[i] + 10*((self.VentVol[i]/2)^3)*dT)%1
local vol1 = math.max(0,self.VentVol[i]-1)
local vol2 = math.max(0,(self.VentVol[i-1] or self.VentVol[i+1])-1)
self:SetSoundState("vent"..i,vol1*(0.7+vol2*0.3),0.5+0.5*vol1+math.Rand(-0.01,0.01))
if IsValid(self.ClientEnts["vent"..i]) then
self.ClientEnts["vent"..i]:SetPoseParameter("position",self.VentState[i])
end
end
self:SetSoundState("compressor",self:GetPackedBool("CompressorWork") and 1 or 0,1)
local speed = self:GetPackedRatio("Speed", 0)
--local rol10 = math.Clamp(speed/5,0,1)*(1-math.Clamp((speed-50)/8,0,1))
--local rol70 = math.Clamp((speed-50)/8,0,1)
local rollingi = math.min(1,self.TunnelCoeff+math.Clamp((self.StreetCoeff-0.82)/0.5,0,1))
local rollings = math.max(self.TunnelCoeff*0.6,self.StreetCoeff)
local rol10 = math.Clamp(speed/12,0,1)*(1-math.Clamp((speed-20)/12,0,1))
local rol10p = Lerp((speed-12)/12,0.9,1.1)
local rol30 = math.Clamp((speed-20)/12,0,1)*(1-math.Clamp((speed-40)/12,0,1))
local rol30p = Lerp((speed-15)/30,0.8,1.2)
local rol55 = math.Clamp((speed-40)/12,0,1)*(1-math.Clamp((speed-65)/15,0,1))
local rol55p = Lerp(0.8+(speed-43)/24,0.8,1.2)
local rol75 = math.Clamp((speed-65)/15,0,1)
local rol75p = Lerp(0.8+(speed-67)/16,0.8,1.2)
self:SetSoundState("rolling_10",rollingi*rol10,rol10p)
self:SetSoundState("rolling_30",rollingi*rol30,rol30p)
self:SetSoundState("rolling_55",rollingi*rol55,rol55p)
self:SetSoundState("rolling_75",rollingi*rol75,rol75p)
local rol10 = math.Clamp(speed/15,0,1)*(1-math.Clamp((speed-18)/35,0,1))
local rol10p = Lerp((speed-15)/14,0.6,0.78)
local rol40 = math.Clamp((speed-18)/35,0,1)*(1-math.Clamp((speed-55)/40,0,1))
local rol40p = Lerp((speed-15)/66,0.6,1.3)
local rol70 = math.Clamp((speed-55)/20,0,1)--*(1-math.Clamp((speed-72)/5,0,1))
local rol70p = Lerp((speed-55)/27,0.78,1.15)
--local rol80 = math.Clamp((speed-70)/5,0,1)
--local rol80p = Lerp(0.8+(speed-72)/15*0.2,0.8,1.2)
self:SetSoundState("rolling_low" ,rol10*rollings,rol10p) --15
self:SetSoundState("rolling_medium2",rol40*rollings,rol40p) --57
--self:SetSoundState("rolling_medium1",0 or rol40*rollings,rol40p) --57
self:SetSoundState("rolling_high2" ,rol70*rollings,rol70p) --70
local state = self:GetPackedRatio("RNState")
self.TISUVol = math.Clamp(self.TISUVol+(state-self.TISUVol)*dT*8,0,1)
self:SetSoundState("tisu", self.TISUVol, 1)
self:SetSoundState("bbe", self:GetPackedBool("BBEWork") and 1 or 0, 1)
local work = self:GetPackedBool("AnnPlay")
for k,v in ipairs(self.AnnouncerPositions) do
if IsValid(self.Sounds["announcer"..k]) then
self.Sounds["announcer"..k]:SetVolume(work and (v[3] or 1) or 0)
end
end
end
function ENT:OnAnnouncer(volume)
return self:GetPackedBool("AnnPlay") and volume or 0
end
function ENT:Draw()
self.BaseClass.Draw(self)
end
function ENT:DrawPost()
self.RTMaterial:SetTexture("$basetexture", self.Tickers)
self:DrawOnPanel("Tickers",function(...)
surface.SetMaterial(self.RTMaterial)
surface.SetDrawColor(255,255,255)
surface.DrawTexturedRectRotated(512,32+8,1024+16,64+16,0)
end)
end
function ENT:OnButtonPressed(button)
end
function ENT:OnPlay(soundid,location,range,pitch)
if location == "stop" then
if IsValid(self.Sounds[soundid]) then
self.Sounds[soundid]:Pause()
self.Sounds[soundid]:SetTime(0)
end
return
end
if soundid == "K1" then
local id = range > 0 and "k1_on" or "k1_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["k1_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
if soundid == "K2" then
local id = range > 0 and "k2_on" or "k2_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["k2_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
if soundid == "K3" then
local id = range > 0 and "k3_on" or "k3_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["k3_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
if soundid == "KMR1" then
local id = range > 0 and "kmr1_on" or "kmr1_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["kmr1_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
if soundid == "KMR2" then
local id = range > 0 and "kmr2_on" or "kmr2_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["kmr2_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
if soundid == "QF1" then
local id = range > 0 and "qf1_on" or "qf1_off"
local speed = self:GetPackedRatio("Speed")
self.SoundPositions["qf1_on"][1] = 440-Lerp(speed/0.1,0,330)
return id,location,1-Lerp(speed/10,0.2,0.8),pitch
end
return soundid,location,range,pitch
end
Metrostroi.GenerateClientProps()

View File

@@ -0,0 +1,200 @@
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include("shared.lua")
ENT.BogeyDistance = 650 -- Needed for gm trainspawner
ENT.SyncTable = {
"SFV1","SFV2","SFV3","SFV4","SFV5","SFV6","SFV7","SFV8","SFV9","SFV10","SFV11",
"SFV12","SFV13","SFV14","SFV15","SFV16","SFV17","SFV18","SFV19","SFV20","SFV21","SFV22",
"SFV23","SFV24","SFV25","SFV26","SFV27","SFV28","SFV29","SFV30","SFV31","SFV32","SFV33",
"RearBrakeLineIsolation","RearTrainLineIsolation",
"FrontBrakeLineIsolation","FrontTrainLineIsolation","Battery",
"GV",
}
--------------------------------------------------------------------------------
function ENT:Initialize()
-- Set model and initialize
self:SetModel("models/metrostroi_train/81-720/81-721.mdl")
self.BaseClass.Initialize(self)
self:SetPos(self:GetPos() + Vector(0,0,140))
-- Create seat entities
self.DriverSeat = self:CreateSeat("instructor",Vector(450,11,-35))
-- Hide seats
self.DriverSeat:SetRenderMode(RENDERMODE_TRANSALPHA)
self.DriverSeat:SetColor(Color(0,0,0,0))
-- Create bogeys
if Metrostroi.BogeyOldMap then
self.FrontBogey = self:CreateBogey(Vector( 320,0,-90),Angle(0,180,0),true,"720")
self.RearBogey = self:CreateBogey(Vector(-320,0,-90),Angle(0,0,0),false,"720")
self.FrontCouple = self:CreateCouple(Vector( 413.7+6.8,0,-79),Angle(0,0,0),true,"717")
self.RearCouple = self:CreateCouple(Vector(-419-6.8,0,-79),Angle(0,180,0),false,"717")
else
self.FrontBogey = self:CreateBogey(Vector( 320,0,-90),Angle(0,180,0),true,"720")
self.RearBogey = self:CreateBogey(Vector(-320,0,-90),Angle(0,0,0),false,"720")
self.FrontCouple = self:CreateCouple(Vector( 420 -8,0,-79),Angle(0,0,0),true,"717")
self.RearCouple = self:CreateCouple(Vector(-419-6.8+8,0,-79),Angle(0,180,0),false,"717")
end
self.FrontBogey:SetNWBool("Async",true)
self.RearBogey:SetNWBool("Async",true)
self.FrontBogey:SetNWInt("MotorSoundType",2)
self.RearBogey:SetNWInt("MotorSoundType",2)
local rand = math.random()*0.05
self.FrontBogey:SetNWFloat("SqualPitch",1.45+rand)
self.RearBogey:SetNWFloat("SqualPitch",1.45+rand)
-- Initialize key mapping
self.KeyMap = {
[KEY_F] = "PneumaticBrakeUp",
[KEY_R] = "PneumaticBrakeDown",
[KEY_PAD_1] = "PneumaticBrakeSet1",
[KEY_PAD_2] = "PneumaticBrakeSet2",
[KEY_PAD_3] = "PneumaticBrakeSet3",
[KEY_PAD_4] = "PneumaticBrakeSet4",
[KEY_PAD_5] = "PneumaticBrakeSet5",
[KEY_PAD_6] = "PneumaticBrakeSet6",
}
-- Cross connections in train wires
self.TrainWireCrossConnections = {
[4] = 3, -- Orientation F<->B
[13] = 12, -- Reverser F<->B
[38] = 37, -- Doors L<->R
}
self.InteractionZones = {
{
ID = "FrontBrakeLineIsolationToggle",
Pos = Vector(463.4, -22, -60), Radius = 16,
},
{
ID = "FrontTrainLineIsolationToggle",
Pos = Vector(463.4, 22, -60), Radius = 16,
},
{
ID = "RearBrakeLineIsolationToggle",
Pos = Vector(-470, 30, -60), Radius = 16,
},
{
ID = "RearTrainLineIsolationToggle",
Pos = Vector(-470, -30, -60), Radius = 16,
},
{
ID = "RearDoor",
Pos = Vector(-464.8,-30,0), Radius = 20,
},
{
ID = "FrontDoor",
Pos = Vector(458,30,0), Radius = 20,
},
{
ID = "GVToggle",
Pos = Vector(128,60,-75), Radius = 20,
},
{
ID = "AirDistributorDisconnectToggle",
Pos = Vector(-177, -66, -50), Radius = 20,
},
}
self.Lights = {
-- Interior
--[11] = { "dynamiclight", Vector( 200, 0, 10), Angle(0,0,0), Color(255,175,50), brightness = 3, distance = 400 , fov=180,farz = 128
[15] = { "dynamiclight", Vector(-330, 0, 10), Angle(0,0,0), Color(238,238,197), brightness = 0.5, distance = 500, fov=180,farz = 128 },
[16] = { "dynamiclight", Vector(-0, 0, 10), Angle(0,0,0), Color(238,238,197), brightness = 0.5, distance = 500, fov=180,farz = 128 },
[17] = { "dynamiclight", Vector( 330, 0, 10), Angle(0,0,0), Color(238,238,197), brightness = 0.5, distance = 500, fov=180,farz = 128 },
--[13] = { "dynamiclight", Vector(-200, 0, 10), Angle(0,0,0), Color(255,175,50), brightness = 3, distance = 400 , fov=180,farz = 128 },
--[11] = { "dynamiclight", Vector( 100, 0, 10), Angle(0,0,0), Color(255,175,50), brightness = 3, distance = 400 , fov=180,farz = 128 },
--[12] = { "dynamiclight", Vector( 100, 0, 10), Angle(0,0,0), Color(255,175,50), brightness = 3, distance = 400, fov=180,farz = 128 },
}
self.FrontDoor = false
self.RearDoor = false
end
--------------------------------------------------------------------------------
function ENT:Think()
local retVal = self.BaseClass.Think(self)
local power = self.Electric.Battery80V > 62
if self.BPTI.State < 0 then
self:SetPackedRatio("RNState", ((self.BPTI.RNState)-0.25)*math.Clamp((math.abs(self.Electric.Itotal/2)-30-self.Speed*2)/20,0,1))
--self:SetNW2Int("RNFreq", 13)
else--if self.BPTI.State > 0 then
self:SetPackedRatio("RNState", (0.75-self.BPTI.RNState)*math.Clamp((math.abs(self.Electric.Itotal/2)-30-self.Speed*2)/20,0,1))
--self:SetNW2Int("RNFreq", ((self.BPTI.FreqState or 0)-1/3)/(2/3)*12)
--[[ else
self:SetPackedRatio("RNState", 0)--]]
end
self:SetPackedRatio("Speed", self.Speed)
self:SetPackedBool("CompressorWork",power and self.Pneumatic.Compressor)
self:SetPackedBool("Vent1Work",self.Electric.Vent1>0)
self:SetPackedBool("Vent2Work",self.Electric.Vent2>0)
self:SetPackedBool("BBEWork",power and self.BUV.BBE > 0)
self:SetNW2Int("PassSchemesLED",self.PassSchemes.PassSchemeCurr)
self:SetNW2Int("PassSchemesLEDN",self.PassSchemes.PassSchemeNext)
self:SetPackedBool("PassSchemesLEDO",self.PassSchemes.PassSchemePath)
self:SetPackedBool("AnnPlay",self.Panel.AnnouncerPlaying > 0)
self:SetPackedBool("FrontDoor",self.FrontDoor)
self:SetPackedBool("RearDoor",self.RearDoor)
local passlight = power and (self.BUV.MainLights and 1 or self.SFV20.Value > 0.5 and 0.4) or 0
--self:SetLightPower(11,power and mul > 0, mul)
self:SetLightPower(15,passlight > 0, passlight)
self:SetLightPower(16,passlight > 0, passlight)
self:SetLightPower(17,passlight > 0, passlight)
self:SetPackedRatio("SalonLighting",passlight)
--local mul = self.SF45.Value > 0.5 and self.BUV.MainLights and 1 or self.SF46.Value > 0.5 and 0.5 or 0
--self:SetLightPower(11,self.BUV.Power and mul > 0, mul)
--self:SetLightPower(12,self.BUV.Power and mul > 0, mul)
self.Engines:TriggerInput("Speed",self.Speed)
if IsValid(self.FrontBogey) and IsValid(self.RearBogey) and not self.IgnoreEngine then
local A = 2*self.Engines.BogeyMoment
self.FrontBogey.MotorForce = (24000+3000*(A < 0 and 1 or 0))--*add--35300+10000*(A < 0 and 1 or 0)
self.FrontBogey.Reversed = self.KMR2.Value > 0
self.FrontBogey.DisableSound = 0
self.RearBogey.MotorForce = (24000+3000*(A < 0 and 1 or 0))--*add--+5000--35300
self.RearBogey.Reversed = self.KMR1.Value > 0
self.RearBogey.DisableSound = 0
-- These corrections are required to beat source engine friction at very low values of motor power
local P = math.max(0,0.04449 + 1.06879*math.abs(A) - 0.465729*A^2)
if math.abs(A) > 0.4 then P = math.abs(A) end
if math.abs(A) < 0.05 then P = 0 end
if self.Speed < 10 then P = P*(1.0 + 0.5*(10.0-self.Speed)/10.0) end
self.RearBogey.MotorPower = P*0.5*((A > 0) and 1 or -1)
self.FrontBogey.MotorPower = P*0.5*((A > 0) and 1 or -1)
self.FrontBogey.PneumaticBrakeForce = (50000.0--[[ +5000+10000--]] ) --40000
self.FrontBogey.BrakeCylinderPressure = self.Pneumatic.BrakeCylinderPressure
self.FrontBogey.ParkingBrakePressure = math.max(0,(3-self.Pneumatic.ParkingBrakePressure)/3)/2
self.FrontBogey.BrakeCylinderPressure_dPdT = -self.Pneumatic.BrakeCylinderPressure_dPdT
self.FrontBogey.DisableContacts = self.BUV.Pant
self.RearBogey.PneumaticBrakeForce = (50000.0--[[ +5000+10000--]] ) --40000
self.RearBogey.BrakeCylinderPressure = self.Pneumatic.BrakeCylinderPressure
self.RearBogey.BrakeCylinderPressure_dPdT = -self.Pneumatic.BrakeCylinderPressure_dPdT
self.RearBogey.ParkingBrakePressure = math.max(0,(3-self.Pneumatic.ParkingBrakePressure)/3)/2
self.RearBogey.DisableContacts = self.BUV.Pant
end
return retVal
end
function ENT:OnCouple(train,isfront)
if isfront and self.FrontAutoCouple then
self.FrontBrakeLineIsolation:TriggerInput("Open",1.0)
self.FrontTrainLineIsolation:TriggerInput("Open",1.0)
self.FrontAutoCouple = false
elseif not isfront and self.RearAutoCouple then
self.RearBrakeLineIsolation:TriggerInput("Open",1.0)
self.RearTrainLineIsolation:TriggerInput("Open",1.0)
self.RearAutoCouple = false
end
self.BaseClass.OnCouple(self,train,isfront)
end
function ENT:OnButtonPress(button,ply)
if button == "FrontDoor" and (self.FrontDoor or not self.BUV.BlockTorec) then self.FrontDoor = not self.FrontDoor end
if button == "RearDoor" and (self.RearDoor or not self.BUV.BlockTorec) then self.RearDoor = not self.RearDoor end
end

View File

@@ -0,0 +1,166 @@
ENT.Type = "anim"
ENT.Base = "gmod_subway_base"
ENT.Author = ""
ENT.Contact = ""
ENT.Purpose = ""
ENT.Instructions = ""
ENT.Category = "Metrostroi (trains)"
ENT.SkinsType = "81-720"
ENT.Model = "models/metrostroi_train/81-720/81-721.mdl"
ENT.Spawnable = true
ENT.AdminSpawnable = true
function ENT:PassengerCapacity()
return 300
end
function ENT:GetStandingArea()
return Vector(-450,-30,-60),Vector(380,30,-60)
end
local function GetDoorPosition(i,k)
return Vector(377.0 - 36.0 + 1*(k) - 230*i,-64*(1-2*k),-10)
end
-- Setup door positions
ENT.LeftDoorPositions = {}
ENT.RightDoorPositions = {}
for i=0,3 do
table.insert(ENT.LeftDoorPositions,GetDoorPosition(i,1))
table.insert(ENT.RightDoorPositions,GetDoorPosition(i,0))
end
function ENT:InitializeSounds()
self.BaseClass.InitializeSounds(self)
self.SoundNames["tisu"] = {"subway_trains/720/tisu.wav",loop = true}
self.SoundPositions["tisu"] = {400,1e9,Vector(0,0,-448),0.11} --FIXME: Pos
self.SoundNames["tisu2"] = {"subway_trains/720/tisu4.wav",loop = true}
self.SoundPositions["tisu2"] = {50,1e9,Vector(439,13,-40),0.15} --FIXME: Pos
self.SoundNames["tisu3"] = {"subway_trains/720/tisu3.wav",loop = true}
self.SoundPositions["tisu3"] = {400,1e9,Vector(0,0,-448),0.11} --FIXME: Pos
self.SoundNames["bbe"] = {"subway_trains/720/bbe.wav",loop = true}
self.SoundPositions["bbe"] = {400,1e9,Vector(0,0,-448),0.016*0.5} --FIXME: Pos
for i=1,7 do
self.SoundNames["vent"..i] = {loop=true,"subway_trains/720/vent_mix.wav"}
self.SoundPositions["vent"..i] = {100,1e9,Vector(-413+(i-1)*117,0,30),0.5}
end
self.SoundNames["compressor"] = {loop=2,"subway_trains/720/compressor/compressor720_start.wav","subway_trains/720/compressor/compressor720_loop.wav","subway_trains/720/compressor/compressor720_stop.wav"}
self.SoundPositions["compressor"] = {485,1e9,Vector(-118,-40,-66),0.35}
self.SoundNames["compressor_pn"] = "subway_trains/722/compressor_pssh.mp3"
self.SoundPositions["compressor_pn"] = {485,1e9,Vector(-118,-40,-66),0.45} --FIXME: Pos
self.SoundNames["release"] = {loop=true,"subway_trains/720/pneumo_release.wav"}
--self.SoundNames["release"] = {loop=true,"subway_trains/common/pneumatic/release_2.wav"}
self.SoundPositions["release"] = {485,1e9,Vector(-183,0,-70),0.55}
self.SoundNames["parking_brake"] = {loop=true,"subway_trains/common/pneumatic/autostop_loop.wav"}
self.SoundPositions["parking_brake"] = {400,1e9,Vector(-183,0,-70),0.95}
self.SoundNames["disconnect_valve"] = "subway_trains/common/switches/pneumo_disconnect_switch.mp3"
self.SoundNames["front_isolation"] = {loop=true,"subway_trains/common/pneumatic/isolation_leak.wav"}
self.SoundPositions["front_isolation"] = {300,1e9,Vector(443, 0,-63),1}
self.SoundNames["rear_isolation"] = {loop=true,"subway_trains/common/pneumatic/isolation_leak.wav"}
self.SoundPositions["rear_isolation"] = {300,1e9,Vector(-456, 0,-63),1}
self.SoundNames["k2_on"] = "subway_trains/717/pneumo/lk2_on.mp3"
self.SoundNames["k2_off"] = "subway_trains/717/pneumo/lk2_off.mp3"
self.SoundNames["k1_on"] = "subway_trains/717/pneumo/lk1_on.mp3"
self.SoundNames["k3_on"] = self.SoundNames["k2_on"]
self.SoundNames["kmr1_on"] = self.SoundNames["k1_on"]
self.SoundNames["kmr2_on"] = self.SoundNames["k1_on"]
self.SoundNames["k1_off"] = self.SoundNames["k2_off"]
self.SoundNames["k3_off"] = self.SoundNames["k2_off"]
self.SoundNames["kmr1_off"] = self.SoundNames["k2_off"]
self.SoundNames["kmr2_off"] = self.SoundNames["k2_off"]
--self.SoundNames["ksh1_off"] = "subway_trains/717/pneumo/ksh1.mp3"
self.SoundPositions["k2_on"] = {440,1e9,Vector(-60,-40,-66),0.45}
self.SoundPositions["k1_on"] = {440,1e9,Vector(-60,-40,-66),0.6}
self.SoundPositions["k2_off"] = self.SoundPositions["k2_on"]
self.SoundPositions["k3_off"] = self.SoundPositions["k2_on"]
self.SoundPositions["k3_on"] = self.SoundPositions["k2_on"]
self.SoundPositions["k3_off"] = self.SoundPositions["k2_on"]
self.SoundPositions["kmr1_on"] = self.SoundPositions["k2_on"]
self.SoundPositions["kmr1_off"] = self.SoundPositions["k2_on"]
self.SoundPositions["kmr2_on"] = self.SoundPositions["k2_on"]
self.SoundPositions["kmr2_off"] = self.SoundPositions["k2_on"]
self.SoundNames["rolling_10"] = {loop=true,"subway_trains/720/rolling/rolling_10.wav"}
self.SoundNames["rolling_30"] = {loop=true,"subway_trains/720/rolling/rolling_30.wav"}
self.SoundNames["rolling_55"] = {loop=true,"subway_trains/720/rolling/rolling_55.wav"}
self.SoundNames["rolling_75"] = {loop=true,"subway_trains/720/rolling/rolling_75.wav"}
self.SoundPositions["rolling_10"] = {485,1e9,Vector(0,0,0),0.33}
self.SoundPositions["rolling_30"] = {485,1e9,Vector(0,0,0),0.7}
self.SoundPositions["rolling_55"] = {485,1e9,Vector(0,0,0),0.85}
self.SoundPositions["rolling_75"] = {485,1e9,Vector(0,0,0),0.90}
self.SoundNames["rolling_low"] = {loop=true,"subway_trains/717/rolling/rolling_outside_low.wav"}
self.SoundNames["rolling_medium1"] = {loop=true,"subway_trains/717/rolling/rolling_outside_medium1.wav"}
self.SoundNames["rolling_medium2"] = {loop=true,"subway_trains/717/rolling/rolling_outside_medium2.wav"}
self.SoundNames["rolling_high2"] = {loop=true,"subway_trains/717/rolling/rolling_outside_high2.wav"}
self.SoundPositions["rolling_low"] = {480,1e12,Vector(0,0,0),0.6*0.4}
self.SoundPositions["rolling_medium1"] = {480,1e12,Vector(0,0,0),0.90*0.4}
self.SoundPositions["rolling_medium2"] = {480,1e12,Vector(0,0,0),0.90*0.4}
self.SoundPositions["rolling_high2"] = {480,1e12,Vector(0,0,0),1.00*0.4}
self.SoundNames["gv_f"] = {"subway_trains/717/kv70/reverser_0-b_1.mp3","subway_trains/717/kv70/reverser_0-b_2.mp3"}
self.SoundNames["gv_b"] = {"subway_trains/717/kv70/reverser_b-0_1.mp3","subway_trains/717/kv70/reverser_b-0_2.mp3"}
self.SoundPositions["gv_f"] = {80,1e9,Vector(126.4,50,-60-23.5),0.8}
self.SoundPositions["gv_b"] = {80,1e9,Vector(126.4,50,-60-23.5),0.8}
self.SoundNames["pak_on"] = "subway_trains/717/switches/rc_on.mp3"
self.SoundNames["pak_off"] = "subway_trains/717/switches/rc_off.mp3"
self.SoundNames["door_cab_open"] = "subway_trains/common/door/cab/door_open.mp3"
self.SoundNames["door_cab_close"] = "subway_trains/common/door/cab/door_close.mp3"
self.SoundNames["door_cab_roll"] = {"subway_trains/720/door/cabdoor_roll1.mp3","subway_trains/720/door/cabdoor_roll2.mp3","subway_trains/720/door/cabdoor_roll3.mp3","subway_trains/720/door/cabdoor_roll4.mp3"}
for i=0,3 do
for k=0,1 do
self.SoundNames["door"..i.."x"..k.."r"] = {"subway_trains/720/door/door_loop.wav",loop=true}
self.SoundPositions["door"..i.."x"..k.."r"] = {100,1e9,GetDoorPosition(i,k),0.07}
self.SoundNames["door"..i.."x"..k.."o"] = {"subway_trains/720/door/door_open_end4.mp3","subway_trains/720/door/door_open_end3.mp3"}
self.SoundPositions["door"..i.."x"..k.."o"] = {150,1e9,GetDoorPosition(i,k),0.55}
self.SoundNames["door"..i.."x"..k.."c"] = {"subway_trains/720/door/door_close_end4.mp3","subway_trains/720/door/door_close_end5.mp3","subway_trains/720/door/door_close_end3.mp3"}
self.SoundPositions["door"..i.."x"..k.."c"] = {250,1e9,GetDoorPosition(i,k),0.55}
end
end
self.SoundNames["batt_on"] = "subway_trains/720/batt_on.mp3"
self.SoundPositions["batt_on"] = {400,1e9,Vector(126.4,50,-60-23.5),0.3}
end
function ENT:InitializeSystems()
self:LoadSystem("TR","TR_3B")
self:LoadSystem("Engines","DK_120AM")
self:LoadSystem("Electric","81_720_Electric")
self:LoadSystem("BPTI","81_720_BPTI")
self:LoadSystem("BUV","81_720_BUV")
self:LoadSystem("Pneumatic","81_720_Pneumatic")
self:LoadSystem("Panel","81_721_Panel")
self:LoadSystem("Tickers","81_720_Ticker")
self:LoadSystem("PassSchemes","81_720_PassScheme")
self:LoadSystem("IGLA_PCBK","81_720_IGLA_PCBK")
end
ENT.AnnouncerPositions = {}
for i=1,3 do
table.insert(ENT.AnnouncerPositions,{Vector(188-(i-1)*230+38,47*(i%2 > 0 and -1 or 1) ,44),200,0.3})
end
---------------------------------------------------
-- Defined train information
-- Types of wagon(for wagon limit system):
-- 0 = Head or intherim
-- 1 = Only head
-- 2 = Only intherim
---------------------------------------------------
ENT.SubwayTrain = {
Type = "81-720",
Name = "81-721",
WagType = 2,
Manufacturer = "MVM",
EKKType = 720
}
ENT.NumberRanges = {{0100,0300}}