-------------------------------------------------------------------------------- -- 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.ClientSounds = {} ENT.AutoAnims = {} ENT.AutoAnimNames = {} ENT.ClientProps["salon"] = { model = "models/metrostroi_train/81-717/interior_mvm_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, } ENT.ClientProps["schemes"] = { model = "models/metrostroi_train/81-717/labels/schemes.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, callback = function(ent) ent.PassSchemesDone = false end, } ENT.ClientProps["lamps"] = { model = "models/metrostroi_train/81-717/lamps_type1_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, } ENT.ClientProps["body_additional"] = { model = "models/metrostroi_train/81-717/714_body_additional.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, } ENT.ClientProps["seats_old"] = { model = "models/metrostroi_train/81-717/couch_old_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=1.5, } ENT.ClientProps["handrails_old"] = { model = "models/metrostroi_train/81-717/handlers_old_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, } ENT.ClientProps["seats_new"] = { model = "models/metrostroi_train/81-717/couch_new_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=1.5, callback = function(ent) ent.NewBlueSeats = false end, } ENT.ClientProps["handrails_new"] = { model = "models/metrostroi_train/81-717/handlers_new_int.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hide=2, } ENT.ClientProps["seats_old_cap"] = { model = "models/metrostroi_train/81-717/couch_cap_l.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hideseat=0.8, } ENT.ClientProps["seats_old_cap_o"] = { model = "models/metrostroi_train/81-717/couch_cap_l.mdl", pos = Vector(-285,410,13), ang = Angle(0,70,-70), hideseat=0.8, } ENT.ClientProps["seats_new_cap"] = { model = "models/metrostroi_train/81-717/couch_new_cap.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hideseat=0.8, callback = function(ent) ent.NewBlueSeats = false end, } ENT.ClientProps["seats_new_cap_o"] = { model = "models/metrostroi_train/81-717/couch_new_cap.mdl", pos = Vector(-285,410,13), ang = Angle(0,70,-70), hideseat=0.8, callback = function(ent) ent.NewBlueSeats = false end, } ENT.ClientProps["otsek_cap_l"] = { model = "models/metrostroi_train/81-717/otsek_cap_l.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hideseat=0.8, } ENT.ClientProps["otsek_cap_r"] = { model = "models/metrostroi_train/81-717/otsek_cap_r.mdl", pos = Vector(0,0,0), ang = Angle(0,0,0), hideseat=0.8, } ENT.ButtonMap["FrontPneumatic"] = { pos = Vector(470-9,-45.0,-58.0+5), ang = Angle(0,90,90), width = 900, 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=500, 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+11, -34, -62), ang = Angle( 15,-90,0), hide = 2, } ENT.ClientProps["FrontTrain"] = {-- model = "models/metrostroi_train/bogey/disconnect_valve_blue.mdl", pos = Vector(449+11, 34, -62), 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,45.0,-58.0+5), ang = Angle(0,270,90), width = 1050, height = 100, scale = 0.1, buttons = { {ID = "RearTrainLineIsolationToggle",x=500, y=0, w=400, h=100, tooltip="",var="RtI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}}, {ID = "RearBrakeLineIsolationToggle",x=000, y=0, w=400, h=100, tooltip="",var="RbI",states={"Train.Buttons.Opened","Train.Buttons.Closed"}}, {ID = "ParkingBrakeToggle",x=900, y=0, w=150, h=100, tooltip="",var="ParkingBrake"}, } } ENT.ClientProps["RearTrain"] = {-- model = "models/metrostroi_train/bogey/disconnect_valve_blue.mdl", pos = Vector(-450-22, -34, -62), ang = Angle(-15,90,0), hide = 2, } ENT.ClientProps["RearBrake"] = {-- model = "models/metrostroi_train/bogey/disconnect_valve_red.mdl", pos = Vector(-450-22, 34, -62), ang = Angle( 15,90,0), } ENT.ClientProps["ParkingBrake"] = {-- model = "models/metrostroi_train/bogey/disconnect_valve_white.mdl", pos = Vector(-450-22, -55, -62), ang = Angle(-15,90,0), hide = 0.5, } ENT.ClientSounds["ParkingBrake"] = {{"ParkingBrake",function() return "disconnect_valve" end,1,1,50,1e3,Angle(-90,0,0)}} 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["GV"] = { pos = Vector(-165,-50+20-40,-60+2), ang = Angle(0,225-15-180,90), width = 260, height = 260, scale = 0.1, buttons = { {ID = "GVToggle",x=0, y=0, w= 260,h = 260, tooltip="", model = { var="GV",sndid = "gv", 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"] = { model = "models/metrostroi/81-717/gv.mdl", pos = Vector(-153.5,36+20-115,-78+3), ang = Angle(-90,90-180,-90), color = Color(150,255,255), hide = 0.5, } ENT.ClientProps["gv_wrench"] = { model = "models/metrostroi_train/reversor/reversor_classic.mdl", pos = ENT.ClientProps["gv"].pos, ang = Angle(-90,180,0), hide = 0.5, } ENT.ButtonMap["AirDistributor"] = { pos = Vector(185,68,-50), ang = Angle(0,180,90), width = 170, height = 80, scale = 0.1, hideseat=0.1, hide=true, screenHide = true, buttons = { {ID = "AirDistributorDisconnectToggle",x=0,y=0,w= 170,h = 80,tooltip="",var="AD",states={"Train.Buttons.On","Train.Buttons.Off"}}, } } -- Battery panel ENT.ButtonMap["Battery"] = { pos = Vector(-470.0,-10,50.6), ang = Angle(0,-90,180), width = 100, height = 100, scale = 0.08, hide=0.8, buttons = { {ID = "VBToggle", x=0, y=0, w=100, h=100, tooltip="ВБ: Выключатель батареи", model = { model = "models/metrostroi_train/81-717/battery_enabler.mdl", var="VB",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["Voltages"] = { pos = Vector(-464.3,-15.2,60.7), ang = Angle(0,90,90), width = 145, height = 75, scale = 0.0625, hideseat=0.2, buttons = { {ID = "!BatteryVoltage", x=0, y=0, w=72.5,h=75, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BatteryVoltage"),ent:GetPackedRatio("BatteryVoltage")*150) end}, {ID = "!BatteryCurrent", x=72.5, y=0, w=72.5,h=75, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BatteryCurrent"),ent:GetPackedRatio("BatteryCurrent")*500) end}, } } ENT.ButtonMap["Pressures"] = { pos = Vector(-464.3,6.3,61), ang = Angle(0,90,90), width = 160, height = 80, scale = 0.0625, hideseat=0.2, buttons = { {ID = "!BCPressure", x=0, y=0, w=80,h=80, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BCPressure"),ent:GetPackedRatio("BCPressure")*6) end}, {ID = "!BLTLPressure", x=80, y=0, w=80,h=80, tooltip="",tooltipFunc = function(ent) return Format(Metrostroi.GetPhrase("Train.Buttons.BLTLPressure"),ent:GetPackedRatio("TLPressure")*16,ent:GetPackedRatio("BLPressure")*16) end}, } } ENT.ButtonMap["couch_cap"] = { pos = Vector(-460,60,0), ang = Angle(0,0,70), width = 1000, height = 600, scale = 0.0625, hide=0.8, buttons = { {ID = "CouchCap",x=0,y=0,w=1000,h=600, tooltip=""} } } ENT.ButtonMap["couch_cap_o"] = { pos = Vector(-464,-21,-45), ang = Angle(0,70,5), width = 1100, height = 380, scale = 0.0625, hide=0.8, buttons = { {ID = "CouchCap",x=0,y=0,w=1100,h=380, tooltip=""} } } ENT.ButtonMap["Stopkran"] = { pos = Vector(397-13.1,60,0), ang = Angle(0,0,70), width = 1000, height = 600, scale = 0.0625, hide=0.8, buttons = { {ID = "EmergencyBrakeValveToggle",x=0,y=0,w=1000,h=600,tooltip="", tooltip="",tooltip="",states={"Train.Buttons.Closed","Train.Buttons.Opened"},var="EmergencyBrakeValve"}, } } ENT.ButtonMap["AV_S"] = { pos = Vector(-456,60,-15), ang = Angle(0,0,90), width = 325, height = 205, scale = 0.0625, hide=0.8, buttons = { {ID = "A53Toggle",x=25*0,y=80*0,w=25,h=45,tooltip=""}, {ID = "A56Toggle",x=25*1,y=80*0,w=25,h=45,tooltip=""}, {ID = "A54Toggle",x=25*2,y=80*0,w=25,h=45,tooltip=""}, {ID = "A24Toggle",x=25*3,y=80*0,w=25,h=45,tooltip=""}, {ID = "A39Toggle",x=25*4,y=80*0,w=25,h=45,tooltip=""}, {ID = "A23Toggle",x=25*5,y=80*0,w=25,h=45,tooltip=""}, {ID = "A14Toggle",x=25*6,y=80*0,w=25,h=45,tooltip=""}, {ID = "A13Toggle",x=25*7,y=80*0,w=25,h=45,tooltip=""}, {ID = "A31Toggle",x=25*8,y=80*0,w=25,h=45,tooltip=""}, {ID = "A32Toggle",x=25*9,y=80*0,w=25,h=45,tooltip=""}, {ID = "A16Toggle",x=25*10,y=80*0,w=25,h=45,tooltip=""}, {ID = "A12Toggle",x=25*11,y=80*0,w=25,h=45,tooltip=""}, {ID = "A49Toggle",x=25*12,y=80*0,w=25,h=45,tooltip=""}, ------------------------------------------------------------------------ {ID = "A15Toggle",x=25*0,y=80*1,w=25,h=45,tooltip=""}, {ID = "A27Toggle",x=25*1,y=80*1,w=25,h=45,tooltip=""}, {ID = "A50Toggle",x=25*2,y=80*1,w=25,h=45,tooltip=""}, {ID = "A8Toggle",x=25*3,y=80*1,w=25,h=45,tooltip=""}, {ID = "A52Toggle",x=25*4,y=80*1,w=25,h=45,tooltip=""}, {ID = "A19Toggle",x=25*5,y=80*1,w=25,h=45,tooltip=""}, {ID = "A10Toggle",x=25*6,y=80*1,w=25,h=45,tooltip=""}, {ID = "A22Toggle",x=25*7,y=80*1,w=25,h=45,tooltip=""}, {ID = "A30Toggle",x=25*8,y=80*1,w=25,h=45,tooltip=""}, {ID = "A1Toggle",x=25*9,y=80*1,w=25,h=45,tooltip=""}, {ID = "A2Toggle",x=25*10,y=80*1,w=25,h=45,tooltip=""}, {ID = "A3Toggle",x=25*11,y=80*1,w=25,h=45,tooltip=""}, {ID = "A4Toggle",x=25*12,y=80*1,w=25,h=45,tooltip=""}, ------------------------------------------------------------------------ {ID = "A5Toggle",x=25*0,y=80*2,w=25,h=45,tooltip=""}, {ID = "A6Toggle",x=25*1,y=80*2,w=25,h=45,tooltip=""}, {ID = "A72Toggle",x=25*2,y=80*2,w=25,h=45,tooltip=""}, {ID = "A38Toggle",x=25*3,y=80*2,w=25,h=45,tooltip=""}, {ID = "A20Toggle",x=25*4,y=80*2,w=25,h=45,tooltip=""}, {ID = "A25Toggle",x=25*5,y=80*2,w=25,h=45,tooltip=""}, {ID = "A37Toggle",x=25*6,y=80*2,w=25,h=45,tooltip=""}, {ID = "A55Toggle",x=25*7,y=80*2,w=25,h=45,tooltip=""}, {ID = "A45Toggle",x=25*8,y=80*2,w=25,h=45,tooltip=""}, {ID = "A66Toggle",x=25*9,y=80*2,w=25,h=45,tooltip=""}, {ID = "A51Toggle",x=25*10,y=80*2,w=25,h=45,tooltip=""}, {ID = "A65Toggle",x=25*11,y=80*2,w=25,h=45,tooltip=""}, {ID = "A28Toggle",x=25*12,y=80*2,w=25,h=45,tooltip=""}, } } for i,button in pairs(ENT.ButtonMap.AV_S.buttons) do button.model = { model = "models/metrostroi_train/81-720/button_av1.mdl", var=button.ID:Replace("Toggle",""),speed=8, 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), } button.ID = "1:"..button.ID end ENT.ButtonMap["AV_T"] = { pos = Vector(-470,30,-18), ang = Angle(0,80,90), width = 200, height = 45, scale = 0.0625, hide=0.8, buttons = { {ID = "A70Toggle",x=25*0,y=0,w=25,h=45,tooltip=""}, {ID = "A81Toggle",x=25*4,y=0,w=25,h=45,tooltip=""}, {ID = "A80Toggle",x=25*5,y=0,w=25,h=45,tooltip=""}, {ID = "A18Toggle",x=25*6,y=0,w=25,h=45,tooltip=""}, } } for i,button in pairs(ENT.ButtonMap.AV_T.buttons) do button.model = { model = "models/metrostroi_train/81-720/button_av1.mdl", var=button.ID:Replace("Toggle",""),speed=8, 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), } button.ID = "1:"..button.ID end ENT.ButtonMap["DriverValveBLTLDisconnect"] = { pos = Vector(-466,44,-18), ang = Angle(0,80,90), width = 160, height = 140, scale = 0.0625, buttons = { {ID = "DriverValveBLDisconnectToggle", x=0, y=0, w=80, h=140, tooltip="", model = { var="DriverValveBLDisconnect",sndid="brake_disconnect", sndvol = 1, snd = function(val) return "disconnect_valve" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), states={"Train.Buttons.Closed","Train.Buttons.Opened"}, }}, {ID = "DriverValveTLDisconnectToggle", x=80, y=0, w=80, h=140, tooltip="", model = { var="DriverValveTLDisconnect",sndid="train_disconnect", sndvol = 1, snd = function(val) return val and "pneumo_TL_open" or "pneumo_TL_disconnect" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), states={"Train.Buttons.Closed","Train.Buttons.Opened"}, }}, } } ENT.ClientProps["brake_disconnect"] = { model = "models/metrostroi_train/81-707/cran1.mdl", pos = Vector(-466,47,-24), ang = Angle(90,80,90), hideseat=0.2, } ENT.ClientProps["train_disconnect"] = { model = "models/metrostroi_train/81-707/cran3.mdl", pos = Vector(-465,51,-24), ang = Angle(90,80,90), hideseat=0.2, } ENT.ClientProps["brake013"] = { model = "models/metrostroi_train/81-717/cran13.mdl", pos = Vector(-466,49,-10), ang = Angle(0,58,0), hideseat = 0.2, } ENT.ClientProps["brake334"] = { model = "models/metrostroi_train/81-703/cabin_cran_334.mdl", pos = Vector(-466,49,-10), ang = Angle(0,-50,0), hideseat = 0.2, } if not ENT.ClientSounds["br_013"] then ENT.ClientSounds["br_013"] = {} end table.insert(ENT.ClientSounds["br_013"],{"brake013",function(ent,_,var) return "br_013" end,0.7,1,50,1e3,Angle(-90,0,0)}) if not ENT.ClientSounds["br_334"] then ENT.ClientSounds["br_334"] = {} end table.insert(ENT.ClientSounds["br_334"],{"brake334",function(ent,_,var) return "br_334_"..var end,1,1,50,1e3,Angle(-90,0,0)}) ENT.ButtonMap["Shunt"] = { pos = Vector(-468,28,-5), ang = Angle(0,80,90), width = 206, height = 200, scale = 0.0625, hideseat=0.2, buttons = { {ID = "BPSNonToggle",x=39,y=30,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_tumbler_pp250.mdl",ang = 180,z=-5, var="BPSNon",speed=16, sndvol = 1,snd = function(val) return val and "switch_on" or "switch_off" end,sndmin = 90,sndmax = 1e3,sndang = Angle(-90,0,0), }}, {ID = "!RZPLight",x=39,y=130,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_slc77.mdl",z = -3, lamp = {model = "models/metrostroi_train/81-717/buttons/slc_77_lamp.mdl",ang=2,x=-0.3,y=-0.3,z=20.6,var="RZP",color=Color(255,60,40)} }}, {ID = "ConverterProtectionSet",x=39,y=180,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_button_black.mdl",z = -4, var="ConverterProtection",speed=16,min=1,max=0, sndvol = 0.07,snd = function(val) return val and "button3_on" or "button3_off" end,sndmin = 60,sndmax = 1e3/3,sndang = Angle(-90,0,0), }}, {ID = "L_1Toggle",x=80,y=30,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_tumbler_pp250.mdl",ang = 180,z=-5, var="L_1",speed=16, sndvol = 1,snd = function(val) return val and "switch_on" or "switch_off" end, sndmin = 90,sndmax = 1e3,sndang = Angle(-90,0,0), }}, {ID = "StartSet",x=80,y=180,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_button_black.mdl",z = -3, var="Start",speed=16,vmin=1,vmax=0, sndvol = 0.07,snd = function(val) return val and "button3_on" or "button2_off" end, sndmin = 60,sndmax = 1e3/3,sndang = Angle(-90,0,0), }}, {ID = "VozvratRPSet",x=121,y=180,radius=20,tooltip="",model = { model = "models/metrostroi_train/81-710/ezh3_button_black.mdl",z = -3, var="VozvratRP",speed=16,vmin=1,vmax=0, sndvol = 0.07,snd = function(val) return val and "button2_on" or "button1_off" end,sndmin = 60,sndmax = 1e3/3,sndang = Angle(-90,0,0), }}, {ID = "RV", x=176, y=140, radius=0, model = { model = "models/metrostroi_train/81-717/buttons/breaker_common001.mdl",ang=270,z=12, var="RV",speed=2,min=1,max=0.5,getfunc = function(ent) return ent:GetPackedRatio("RV") end, sndvol = 0.8, snd = function(_,val) return val%2>0 and "pak_on" or "pak_off" end,sndmin = 80, sndmax = 1e3/3, sndang = Angle(-90,0,0), }}, {ID="RV-",x=176-30, y=140-30, w=30,h=60, tooltip="ВТПР(влево)",states={"Train.Buttons.Back","Train.Buttons.0","Train.Buttons.Forward"},varTooltip = function(ent) return ent:GetPackedRatio("RV") end,}, {ID="RV+",x=176 , y=140-30, w=30,h=60, tooltip="ВТПР(вправо)",states={"Train.Buttons.Back","Train.Buttons.0","Train.Buttons.Forward"},varTooltip = function(ent) return ent:GetPackedRatio("RV") end,}, } } ENT.ButtonMap["VU"] = { pos = Vector(-468.7,24,-5), ang = Angle(0,80,90), width = 60, height = 120, scale = 0.0625, hideseat = 0.2, buttons = { {ID = "A84Toggle", x=0, y=0, w=60,h=120, tooltip="", model = { model = "models/metrostroi_train/Equipment/vu22_brown.mdl", z=-20, ang = Angle(180,-90,0), plomb = {model = "models/metrostroi_train/equipment/vu_plomb_right.mdl",ang=Angle(-90,90,0),x=25,y=33.2,z=9.3,var="A84Pl", ID="A84Pl",}, var="A84",speed=6, sndvol = 1, snd = function(val) return val and "vu22_on" or "vu22_off" end, sndmin = 90, sndmax = 1e3, sndang = Angle(0,0,0), }}, } } ENT.ButtonMap["FrontDoor"] = { pos = Vector(470-11,16,48.4-2), ang = Angle(0,-90,90), width = 642, height = 1900, scale = 0.1/2, buttons = { {ID = "FrontDoor",x=0,y=0,w=642,h=1900, tooltip="Передняя дверь", model = { var="door1",sndid="door1", sndvol = 1, snd = function(val) return val and "cab_door_open" or "cab_door_close" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), noTooltip = true, }}, } } ENT.ClientProps["door1"] = { model = "models/metrostroi_train/81-717/door_torec_spb.mdl", pos = Vector(459.2,-15.9,-2.7), ang = Angle(0,89.5,0), hide=2, } ENT.ButtonMap["RearDoor"] = { pos = Vector(-470-3,-16,48.4-2), ang = Angle(0,90,90), width = 642, height = 1900, scale = 0.1/2, buttons = { {ID = "RearDoor",x=0,y=0,w=642,h=1900, tooltip="Задняя дверь", model = { var="door2",sndid="door2", sndvol = 1, snd = function(val) return val and "cab_door_open" or "cab_door_close" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), noTooltip = true, }}, } } ENT.ClientProps["door2"] = { model = "models/metrostroi_train/81-717/door_torec_spb.mdl", pos = Vector(-472.5,15.75,-2.7), ang = Angle(0,-90,0), hide=2, } -------------------------------------------------------------------------------- ENT.ClientPropsInitialized = false ENT.ClientProps["train_line"] = { model = "models/metrostroi_train/Equipment/arrow_nm.mdl", pos = Vector(-465.05,14.2,58.55), ang = Angle(-90,0,180), hideseat=0.8, } ENT.ClientProps["brake_line"] = { model = "models/metrostroi_train/Equipment/arrow_tm.mdl", pos = Vector(-465.01,14.2,58.55), ang = Angle(-90,0,180), hideseat=0.8, } ENT.ClientProps["brake_cylinder"] = { model = "models/metrostroi_train/Equipment/arrow_nm.mdl", pos = Vector(-464.94,9.0,58.45), ang = Angle(-90,0,180), hideseat=0.8, } -------------------------------------------------------------------------------- ENT.ClientProps["voltmeter"] = { model = "models/metrostroi_train/81-710/ezh3_voltages.mdl", pos = Vector(-464.80,-13.07,56.81), ang = Angle(-90,0,180), hideseat=0.8, bscale = Vector(1.2,1.2,1.65) } ENT.ClientProps["ampermeter"] = { model = "models/metrostroi_train/81-710/ezh3_voltages.mdl", pos = Vector(-464.80,-8.04,56.81), ang = Angle(-90,0,180), hideseat=0.8, bscale = Vector(1.2,1.2,1.65) } ENT.ClientProps["bortlamps1"] = { model = "models/metrostroi_train/81-502/bort_lamps_body.mdl", pos = Vector(-52,67,45.5), ang = Angle(0,0,0), hide = 2, } ENT.ClientProps["bortlamp1_w"] = { model = "models/metrostroi_train/equipment/bort_lamps_b.mdl", pos = ENT.ClientProps.bortlamps1.pos+Vector(0,0.9,3.25), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamp1_g"] = { model = "models/metrostroi_train/equipment/bort_lamps_g.mdl", pos = ENT.ClientProps.bortlamps1.pos+Vector(0,0.9,-0.1), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamp1_y"] = { model = "models/metrostroi_train/equipment/bort_lamps_y.mdl", pos = ENT.ClientProps.bortlamps1.pos+Vector(0,0.9,-3.3), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamps2"] = { model = "models/metrostroi_train/81-717/bort_lamps_body.mdl", pos = Vector(39,-67,45.5), ang = Angle(0,180,0), hide = 2, } ENT.ClientProps["bortlamp2_w"] = { model = "models/metrostroi_train/equipment/bort_lamps_b.mdl", pos = ENT.ClientProps.bortlamps2.pos+Vector(0,-0.9,3.25), ang = Angle(0,180,0), nohide = true, } ENT.ClientProps["bortlamp2_g"] = { model = "models/metrostroi_train/equipment/bort_lamps_g.mdl", pos = ENT.ClientProps.bortlamps2.pos+Vector(0,-0.9,-0.1), ang = Angle(0,180,0), nohide = true, } ENT.ClientProps["bortlamp2_y"] = { model = "models/metrostroi_train/equipment/bort_lamps_y.mdl", pos = ENT.ClientProps.bortlamps2.pos+Vector(0,-0.9,-3.3), ang = Angle(0,180,0), nohide = true, } --[[ ENT.ClientProps["bortlamps3"] = { model = "models/metrostroi_train/81-502/bort_lamps_body.mdl", pos = Vector(-6.5,67,51.2), ang = Angle(90,0,0), hide = 2, } ENT.ClientProps["bortlamp3_w"] = { model = "models/metrostroi_train/equipment/bort_lamps_b.mdl", pos = ENT.ClientProps.bortlamps3.pos+Vector(3.28,0.9,-0.02), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamp3_g"] = { model = "models/metrostroi_train/equipment/bort_lamps_g.mdl", pos = ENT.ClientProps.bortlamps3.pos+Vector(-0.06,0.9,-0.02), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamp3_y"] = { model = "models/metrostroi_train/equipment/bort_lamps_y.mdl", pos = ENT.ClientProps.bortlamps3.pos+Vector(-3.33,0.9,-0.02), ang = Angle(0,0,0), nohide = true, } ENT.ClientProps["bortlamps4"] = { model = "models/metrostroi_train/81-502/bort_lamps_body.mdl", pos = Vector(-6.5,-67,51.2), ang = Angle(90,180,0), hide = 2, } ENT.ClientProps["bortlamp4_w"] = { model = "models/metrostroi_train/equipment/bort_lamps_b.mdl", pos = ENT.ClientProps.bortlamps4.pos+Vector(-3.28,-0.9,-0.02), ang = Angle(0,180,0), nohide = true, } ENT.ClientProps["bortlamp4_g"] = { model = "models/metrostroi_train/equipment/bort_lamps_g.mdl", pos = ENT.ClientProps.bortlamps4.pos+Vector(0.06,-0.9,-0.02), ang = Angle(0,180,0), nohide = true, } ENT.ClientProps["bortlamp4_y"] = { model = "models/metrostroi_train/equipment/bort_lamps_y.mdl", pos = ENT.ClientProps.bortlamps4.pos+Vector(3.33,-0.9,-0.02), ang = Angle(0,180,0), nohide = true, }--]] -------------------------------------------------------------------------------- -- Add doors --[[ local function GetDoorPosition(i,k,j) if j == 0 then return Vector(338.0-230.1*i+(1-k)*0.8,-65*(1-2*k),0.761) else return Vector(338.2-230.1*i+(1-k)*0.8,-65*(1-2*k),0.761) end end for i=0,3 do for k=0,1 do ENT.ClientProps["door"..i.."x"..k.."a"] = { model = "models/metrostroi_train/81-717/door_right_spb.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-717/door_left_spb.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-717/81-717_doors_spb_pos1.mdl", pos = Vector(338.445+1.2-2.2,65.164,0.807), ang = Angle(0,-90,0), hide = 2.0, } ENT.ClientProps["door1x1"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos2.mdl", pos = Vector(108.324+1.2-2.2,65.164,0.807), ang = Angle(0,-90,0), hide = 2.0, } ENT.ClientProps["door2x1"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos3.mdl", pos = Vector(-122.182+1.6-2.2,65.164,0.807), ang = Angle(0,-90,0), hide = 2.0, } ENT.ClientProps["door3x1"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos4.mdl", pos = Vector(-351.531+0.8-2.2,65.164,0.807), ang = Angle(0,-90,0), hide = 2.0, } ENT.ClientProps["door0x0"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos4.mdl", pos = Vector(338.445+1.2,-65.164,0.807), ang = Angle(0,90,0), hide = 2.0, } ENT.ClientProps["door1x0"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos3.mdl", pos = Vector(108.324+1.2,-65.164,0.807), ang = Angle(0,90,0), hide = 2.0, } ENT.ClientProps["door2x0"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos2.mdl", pos = Vector(-122.182+1.6,-65.164,0.807), ang = Angle(0,90,0), hide = 2.0, } ENT.ClientProps["door3x0"] = { model = "models/metrostroi_train/81-717/81-717_doors_spb_pos1.mdl", pos = Vector(-351.531+0.8,-65.164,0.807), ang = Angle(0,90,0), hide = 2.0, } for i = 0,12 do local b = 15--math.random()*15 local g = 15--b+math.random()*(15-b) if math.random() > 0.4 then g = math.random()*15 b = g else g = 15 b = -10+math.random()*25 end ENT.ClientProps["lamp1_"..i+1] = { model = "models/metrostroi_train/81-717/lamps/lamp_typ1.mdl", pos = Vector(394.5- 66.65*i, 0, 67.608), ang = Angle(0,0,0), color = Color(255,235+g,235+b), hideseat = 1.1, } end for i=0,4 do ENT.ClientProps["TrainNumberL"..i] = { model = "models/metrostroi_train/common/bort_numbers.mdl", pos = Vector(41+16+i*6.6-5*6.6/2,67.4,-17.8), ang = Angle(0,180,0), skin=i, hide = 1.5, callback = function(ent) ent.WagonNumber = false end, } ENT.ClientProps["TrainNumberR"..i] = { model = "models/metrostroi_train/common/bort_numbers.mdl", pos = Vector(64+16-i*6.6-5*6.6/2,-67.4,-17.8), ang = Angle(0,0,0), skin=i, hide = 1.5, callback = function(ent) ent.WagonNumber = false end, } end -- Lights ENT.Lights = { -- Interior [11] = { "dynamiclight", Vector( 200, 0, 0), Angle(0,0,0), Color(255,245,245), brightness = 3, distance = 400 , fov=180,farz = 128, changable = true }, [12] = { "dynamiclight", Vector( 0, 0, 0), Angle(0,0,0), Color(255,245,245), brightness = 3, distance = 400, fov=180,farz = 128, changable = true }, [13] = { "dynamiclight", Vector(-200, 0, 0), Angle(0,0,0), Color(255,245,245), brightness = 3, distance = 400 , fov=180,farz = 128, changable = true }, -- Side lights [15] = { "light",Vector(-52,67,45.5)+Vector(0,0.9,3.25), Angle(0,0,0), Color(254,254,254), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [16] = { "light",Vector(-52,67,45.5)+Vector(0,0.9,-0.02), Angle(0,0,0), Color(40,240,122), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [17] = { "light",Vector(-52,67,45.5)+Vector(0,0.9,-3.3), Angle(0,0,0), Color(254,210,18), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [18] = { "light",Vector(39,-67,45.5)+Vector(0,-0.9,3.25), Angle(0,0,0), Color(254,254,254), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [19] = { "light",Vector(39,-67,45.5)+Vector(0,-0.9,-0.02), Angle(0,0,0), Color(40,240,122), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [20] = { "light",Vector(39,-67,45.5)+Vector(0,-0.9,-3.3), Angle(0,0,0), Color(254,210,18), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [21] = { "light",Vector(-6.5,67,51.2)+Vector(3.25,0.9,-0.02), Angle(0,0,0), Color(254,254,254), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [22] = { "light",Vector(-6.5,67,51.2)+Vector(-0.06,0.9,-0.02), Angle(0,0,0), Color(40,240,122), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [23] = { "light",Vector(-6.5,67,51.2)+Vector(-3.33,0.9,-0.02), Angle(0,0,0), Color(254,210,18), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [24] = { "light",Vector(-6.5,-67,51.2)+Vector(3.33,-0.9,-0.02), Angle(0,0,0), Color(254,254,254), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [25] = { "light",Vector(-6.5,-67,51.2)+Vector(0.06,-0.9,-0.02), Angle(0,0,0), Color(40,240,122), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, [26] = { "light",Vector(-6.5,-67,51.2)+Vector(-3.28,-0.9,-0.02), Angle(0,0,0), Color(254,210,18), brightness = 0.1, scale = 0.2, texture = "sprites/light_glow02", size = 1.5 }, } -------------------------------------------------------------------------------- function ENT:UpdateWagonNumber() local count = math.max(4,math.ceil(math.log10(self.WagonNumber+1))) for i=0,4 do self:ShowHide("TrainNumberL"..i,i 0, Bortlamp_w) self:SetLightPower(18, Bortlamp_w > 0, Bortlamp_w) self:SetLightPower(16, Bortlamp_g > 0, Bortlamp_g) self:SetLightPower(19, Bortlamp_g > 0, Bortlamp_g) self:SetLightPower(17, Bortlamp_y > 0, Bortlamp_y) self:SetLightPower(20, Bortlamp_y > 0, Bortlamp_y) local kvr = self:GetNW2Bool("KVR") local newSeats = self:GetNW2Bool("NewSeats") self:ShowHide("handrails_old",not kvr) self:ShowHide("handrails_new",kvr) self:ShowHide("seats_old",not newSeats) self:ShowHide("seats_new",newSeats) local capOpened = self:GetPackedBool("CouchCap") local c013 = self:GetPackedBool("Crane013") self:ShowHide("seats_old_cap_o",capOpened and not newSeats) self:ShowHide("seats_old_cap",not capOpened and not newSeats) self:ShowHide("seats_new_cap_o",capOpened and newSeats) self:ShowHide("seats_new_cap",not capOpened and newSeats) self:HidePanel("couch_cap",capOpened) self:HidePanel("couch_cap_o",not capOpened) self:HidePanel("AV_S",not capOpened) self:HidePanel("AV_T",not capOpened) -- self:HidePanel("Stopkran",not capOpened) self:ShowHide("otsek_cap_r",not capOpened) self:ShowHide("brake334",capOpened and not c013) self:ShowHide("brake013",capOpened and c013) self:ShowHide("brake_disconnect",capOpened) self:ShowHide("train_disconnect",capOpened) self:HidePanel("DriverValveBLTLDisconnect",not capOpened) self:HidePanel("Shunt",not capOpened) self:HidePanel("VU",not capOpened) self:Animate("brake_disconnect",self:GetPackedBool("DriverValveBLDisconnect") and 1 or 0,0.25,0, 4,false) self:Animate("train_disconnect",self:GetPackedBool("DriverValveTLDisconnect") and 1 or 0,0.25,0, 4,false) self:Animate("brake334",self:GetPackedRatio("CranePosition")/5,0.35,0.65,256,24) self:Animate("brake013",Cpos[self:GetPackedRatio("CranePosition")] or 0, 0.03, 0.458, 256,24) self:Animate("brake_line", self:GetPackedRatio("BLPressure"),0.14, 0.875, 256,2)--,,0.01) self:Animate("train_line", self:GetPackedRatio("TLPressure"),0.14, 0.875, 256,2)--,,0.01) self:Animate("brake_cylinder", self:GetPackedRatio("BCPressure"),0.14, 0.875, 256,2)--,,0.03) self:Animate("voltmeter", self:GetPackedRatio("BatteryVoltage"),0.601, 0.400) self:Animate("ampermeter", 0.5+self:GetPackedRatio("BatteryCurrent"),0.604, 0.398) if self.LampType ~= self:GetNW2Int("LampType",1) then self.LampType = self:GetNW2Int("LampType",1) end local activeLights = 0 for i = 1,13 do local colV = self:GetNW2Vector("lamp"..i) local col = Color(colV.x,colV.y,colV.z) local state = self:Animate("Lamp1_"..i,(self:GetPackedBool("lightsActive"..i)) and 1 or 0,0,1,6,false) self:ShowHideSmooth("lamp1_"..i,state,col) activeLights = activeLights + state end for i=11,13 do local col = self:GetNW2Vector("lampD"..i) if self.LightsOverride[i].vec ~= col then self.LightsOverride[i].vec = col self.LightsOverride[i][4] = Color(col.x,col.y,col.z) self:SetLightPower(i, false) else self:SetLightPower(i, activeLights > 0,activeLights/13) end end local door1 = self:Animate("door1", self:GetPackedBool("FrontDoor") and 0.99 or 0,0,0.25, 4, 0.5) local door2 = self:Animate("door2", self:GetPackedBool("RearDoor") and (self:GetPackedBool("CouchCap") and 0.25 or 0.99) or 0,0,0.25, 4, 0.5) if self.Door1 ~= (door1 > 0) then self.Door1 = door1 > 0 self:PlayOnce("door1","bass",self.Door1 and 1 or 0) end if self.Door2 ~= (door2 > 0) then self.Door2 = door2 > 0 self:PlayOnce("door2","bass",self.Door2 and 1 or 0) end 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) self:Animate("ParkingBrake", self:GetPackedBool("ParkingBrake") and 1 or 0,1,0, 3, false) -- Main switch 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,0.9,128,1,false) self:ShowHideSmooth("gv_wrench", CurTime() < self.ResetTime and 1 or 0.1) 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.8,1.2)) else self:PlayOnce(sid.."c","",1,math.Rand(0.8,1.2)) 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.8+self.DoorLoopStates[id]*0.2) 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/14 end end self:Animate(n_l,state,0,0.95, dlo*14,false)--0.8 + (-0.2+0.4*math.random()),0) --self:Animate(n_r,state,0,1, dlo*14,false)--0.8 + (-0.2+0.4*math.random()),0) end end local dT = self.DeltaTime --self.TunnelCoeff = 0.8 --self.StreetCoeff = 0 local rollingi = math.min(1,self.TunnelCoeff+math.Clamp((self.StreetCoeff-0.82)/0.3,0,1)) local rollings = math.max(self.TunnelCoeff*0.6,self.StreetCoeff) --if self:EntIndex() == 3239 then LocalPlayer():ChatPrint(Format("T: %.2f, S: %.2f",rollingi,rollings)) end -- Brake-related sounds local dT = self.DeltaTime local speed = self:GetPackedRatio("Speed")*100.0 local rol5 = math.Clamp(speed/1,0,1)*(1-math.Clamp((speed-3)/8,0,1)) local rol10 = math.Clamp(speed/12,0,1)*(1-math.Clamp((speed-25)/8,0,1)) local rol40p = Lerp((speed-25)/12,0.6,1) local rol40 = math.Clamp((speed-23)/8,0,1)*(1-math.Clamp((speed-55)/8,0,1)) local rol40p = Lerp((speed-23)/50,0.6,1) local rol70 = math.Clamp((speed-50)/8,0,1)*(1-math.Clamp((speed-72)/5,0,1)) local rol70p = Lerp(0.8+(speed-65)/25*0.2,0.8,1.2) 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_5",math.min(1,rollingi*(1-rollings)+rollings*0.8)*rol5,1) self:SetSoundState("rolling_10",rollingi*rol10,1) self:SetSoundState("rolling_40",rollingi*rol40,rol40p) self:SetSoundState("rolling_70",rollingi*rol70,rol70p) self:SetSoundState("rolling_80",rollingi*rol80,rol80p) 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 self.ReleasedPdT = math.Clamp(self.ReleasedPdT + 2*(-self:GetPackedRatio("BrakeCylinderPressure_dPdT",0)-self.ReleasedPdT)*dT,0,1) local release1 = math.Clamp((self.ReleasedPdT-0.1)/0.8,0,1)^2 self:SetSoundState("release1",release1,1) self:SetSoundState("release2",(math.Clamp(0.3-release1,0,0.3)/0.3)*(release1/0.3),1.0) local parking_brake = self:GetPackedRatio("ParkingBrakePressure_dPdT",0) local parking_brake_abs = math.Clamp(math.abs(parking_brake)-0.3,0,1) if self.ParkingBrake1 ~= (parking_brake<1) then self.ParkingBrake1 = (parking_brake<1) if self.ParkingBrake1 then self:PlayOnce("parking_brake_en","bass",1,1) end end if self.ParkingBrake2 ~= (parking_brake>-0.8) then self.ParkingBrake2 = (parking_brake>-0.8) if self.ParkingBrake2 then self:PlayOnce("parking_brake_rel","bass",0.6,1) end end self:SetSoundState("parking_brake",parking_brake_abs,1) self.FrontLeak = math.Clamp(self.FrontLeak + 10*(-self:GetPackedRatio("FrontLeak")-self.FrontLeak)*dT,0,1) self.RearLeak = math.Clamp(self.RearLeak + 10*(-self:GetPackedRatio("RearLeak")-self.RearLeak)*dT,0,1) self:SetSoundState("front_isolation",self.FrontLeak,0.9+0.2*self.FrontLeak) self:SetSoundState("rear_isolation",self.RearLeak,0.9+0.2*self.RearLeak) local ramp = self:GetPackedRatio("Crane_dPdT",0) if c013 then if ramp > 0 then self.CraneRamp = self.CraneRamp + ((0.2*ramp)-self.CraneRamp)*dT else self.CraneRamp = self.CraneRamp + ((0.9*ramp)-self.CraneRamp)*dT end self.CraneRRamp = math.Clamp(self.CraneRRamp + 1.0*((1*ramp)-self.CraneRRamp)*dT,0,1) self:SetSoundState("crane334_brake",0,1.0) self:SetSoundState("crane334_brake_reflection",0,1.0) self:SetSoundState("crane334_brake_slow",0,1.0) self:SetSoundState("crane334_release",0,1.0) self:SetSoundState("crane013_release",self.CraneRRamp^1.5,1.0) self:SetSoundState("crane013_brake",math.Clamp(-self.CraneRamp*1.5-0.1,0,1)^1.3,1.0) local loudV = self:GetNW2Float("Crane013Loud",0) if loudV>0 then if ramp>0 then self.CraneLRamp = self.CraneLRamp + (math.min(ramp,0)-self.CraneLRamp)*dT*0.5 else self.CraneLRamp = self.CraneLRamp + (math.min(ramp,0)-self.CraneLRamp)*dT*1 end self:SetSoundState("crane013_brake_l",(math.Clamp(-self.CraneRamp*2.5-0.1,0,1)^1.3)*(1-math.Clamp((-self.CraneLRamp-loudV)*3,0,1)),1.12-math.Clamp((-self.CraneLRamp-0.15)*2,0,1)*0.12) else self:SetSoundState("crane013_brake_l",0,1) end self:SetSoundState("crane013_brake2",math.Clamp(-self.CraneRamp*1.5-0.95,0,1.5)^2,1.0) else self:SetSoundState("crane013_brake",0,1.0) self:SetSoundState("crane013_release",0,1.0) --self:SetSoundState("crane013_brake2",0,1.0) self.CraneRamp = math.Clamp(self.CraneRamp + 8.0*((1*self:GetPackedRatio("Crane_dPdT",0))-self.CraneRamp)*dT,-1,1) self:SetSoundState("crane334_brake_low",math.Clamp((-self.CraneRamp)*2,0,1)^2,1) local high = math.Clamp(((-self.CraneRamp)-0.5)/0.5,0,1)^1 self:SetSoundState("crane334_brake_high",high,1.0) self:SetSoundState("crane013_brake2",high*2,1.0) self:SetSoundState("crane334_brake_eq_high",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.2,0,1)^0.8*1,1) self:SetSoundState("crane334_brake_eq_low",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.4,0,1)^0.8*1.3,1) self:SetSoundState("crane334_release",math.Clamp(self.CraneRamp,0,1)^2,1.0) end local emergencyBrakeValve = self:GetPackedRatio("EmergencyBrakeValve_dPdT", 0) self.EmergencyBrakeValveRamp = math.Clamp(self.EmergencyBrakeValveRamp + (emergencyBrakeValve-self.EmergencyBrakeValveRamp)*dT*8,0,1) self:SetSoundState("valve_brake",self.EmergencyBrakeValveRamp,0.8+math.min(0.4,self.EmergencyBrakeValveRamp*0.8)) -- Compressor self:SetSoundState("compressor",self:GetPackedBool("Compressor") and 0.6 or 0,1) self:SetSoundState("compressor2",self:GetPackedBool("Compressor") and 0.8 or 0,1) -- RK rotation if self:GetPackedBool("RK") then self.RKTimer = CurTime() end self:SetSoundState("rk",(self.RKTimer and (CurTime() - self.RKTimer) < 0.2) and 0.7 or 0,1) -- BPSN sound self.BPSNType = self:GetNW2Int("BPSNType",5) if not self.OldBPSNType then self.OldBPSNType = self.BPSNType end if self.BPSNType ~= self.OldBPSNType then for i=1,4 do self:SetSoundState("bpsn"..i,0,1.0) end end self.OldBPSNType = self.BPSNType if self.BPSNType<5 then self:SetSoundState("bpsn"..self.BPSNType,self:GetPackedBool("BPSN") and 1 or 0,1) --FIXME громкость по другому end local work = self:GetPackedBool("AnnPlay") local buzz = self:GetPackedBool("AnnBuzz") and self:GetNW2Int("AnnouncerBuzz") local noise = self:GetNW2Int("AnnouncerNoise", -1) local volume = self:GetNW2Float("UPOVolume",1) local noisevolume = self:GetNW2Float("UPONoiseVolume",1) local buzzvolume = volume if self.Sounds["announcer1"] and IsValid(self.Sounds["announcer1"]) then buzzvolume = (1-(self.Sounds["announcer1"]:GetLevel())*math.Rand(0.9,3))*buzzvolume*2 end if self.BPSNBuzzVolume > buzzvolume then self.BPSNBuzzVolume = math.Clamp(self.BPSNBuzzVolume + 8*(buzzvolume-self.BPSNBuzzVolume)*dT,0.1,1) else self.BPSNBuzzVolume = math.Clamp(self.BPSNBuzzVolume + 0.4*(buzzvolume-self.BPSNBuzzVolume)*dT,0.1,1) end for k,v in ipairs(self.AnnouncerPositions) do self:SetSoundState("announcer_noiseW"..k,work and v[3]*noisevolume*volume or 0,1) for i=1,3 do self:SetSoundState(Format("announcer_noise%d_%d",i,k),(work and i==noise) and v[3]*volume*self.BPSNBuzzVolume*self:GetNW2Float("UPOBuzzVolume",1) or 0,1) end for i=1,2 do self:SetSoundState(Format("announcer_buzz%d_%d",i,k),(work and i==buzz) and v[3]*volume*self.BPSNBuzzVolume*self:GetNW2Float("UPOBuzzVolume",1) or 0,1) end if IsValid(self.Sounds["announcer"..k]) then self.Sounds["announcer"..k]:SetVolume(work and v[3]*volume or 0) end end end function ENT:OnAnnouncer(volume) return self:GetPackedBool("AnnPlay") and self:GetNW2Float("UPOVolume",1)*volume or 0 end function ENT:Draw() self.BaseClass.Draw(self) end function ENT:DrawPost() self:DrawOnPanel("AirDistributor",function() draw.DrawText(self:GetNW2Bool("AD") and "Air Distributor ON" or "Air Distributor OFF","Trebuchet24",0,0,Color(0,0,0,255)) end) 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 == "pkg" then return end if location == "bass" then if soundid == "VDOL" then return range > 0 and "vdol_on" or "vdol_off",location,1,pitch end if soundid == "VDOP" then return range > 0 and "vdor_on" or "vdor_off",location,1,pitch end if soundid == "VDZ" then return range > 0 and "vdz_on" or "vdz_off",location,1,pitch end if soundid:sub(1,4) == "IGLA" then return range > 0 and "igla_on" or "igla_off",location,1,pitch end if soundid == "lk2c" then local speed = self:GetPackedRatio("Speed") self.SoundPositions[soundid][1] = 350-Lerp(speed/0.1,0,250) return soundid,location,1-Lerp(speed/10,0.2,0.8),pitch end if soundid == "LK2" then local speed = self:GetPackedRatio("Speed") if range == 0 and speed < 20 and self:GetPackedRatio("EnginesCurrent") > 0.55 then self:PlayOnce("lk2c","bass",1,pitch) end local id = range > 0 and "lk2_on" or "lk2_off" self.SoundPositions[id][1] = 350-Lerp(speed/0.1,0,250) return id,location,1-Lerp(speed/10,0.2,0.8),pitch end if soundid == "LK3" then local speed = self:GetPackedRatio("Speed") local id = range > 0 and "lk3_on" or "lk3_off" self.SoundPositions[id][1] = 350-Lerp(speed/0.1,0,250) return id,location,1-Lerp(speed/10,0.2,0.8),pitch end if soundid == "LK5" and range > 0 then local speed = self:GetPackedRatio("Speed") self.SoundPositions["lk5_on"][1] = 440-Lerp(speed/0.1,0,330) return "lk5_on",location,1-Lerp(speed/10,0.2,0.8),pitch end if soundid == "brake" then self:PlayOnce("brake_f",location,range,pitch) self:PlayOnce("brake_b",location,range,pitch) return end if soundid == "KK" then return range > 0 and "kk_on" or "kk_off",location,1,0.8 end end return soundid,location,range,pitch end Metrostroi.GenerateClientProps()