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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,489 @@
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include("shared.lua")
ENT.BogeyDistance = 650 -- Needed for gm trainspawner
ENT.SyncTable = {
"SF1","SF2","SF3","SF4","SF5","SF6","SF7","SF8","SF9","R_UPO","SF01","SF10","SF11","SF12","SF13","SF02",
"SF14","SF15","SF16","SF17","SF18","SF19","SF20","SF21","SF22","SF23","SF24","SF25","SF26","SF27","SF03","SF04",
"SF31","SF32","SF33","SF34","SF35","SF36","SF37","SF38","SF41","SF42","SF43","SF44","SF45","SF46","SF47","SF48","SF49","SF51","SF52","SF53","SF54","SF55","SF56","SF57","SF58","SF59",
"PSNToggle","BattOn","BattOff","TorecDoorUnlock",
"PassLight","VKF","ParkingBrake","VRD","SOSDEnable","VAD","VAH","EmergencyRadioPower","RCARS",
"MirrorHeating","DoorLeft2","DoorBack","EmergencyDrive","Microphone","DoorLeft1",
"ARS","ALS","GlassWasher","EmergencyBrakeTPlus","EmergencyBrakeTPlusK","EmergencyBrake","Vigilance","DoorSelect","DoorRight",
"PanelLight",
"Ring",
"K9", "K29",
"EmergencyBrakeValve","UAVA",
"FrontBrakeLineIsolation","FrontTrainLineIsolation",
"RearBrakeLineIsolation","RearTrainLineIsolation",
"PB",
}
--------------------------------------------------------------------------------
function ENT:Initialize()
self.Plombs = {
EmergencyBrakeTPlusK = true,
VRU=true,
VAH = true,
VAD=true,
EmergencyRadioPower = true,
BARSMode = true,
PantSC = true,
RCARS = true,
K9 = true,
UAVA = true,
Init=true,
}
-- Set model and initialize
self:SetModel("models/metrostroi_train/81-722/81-722.mdl")
self.BaseClass.Initialize(self)
self:SetPos(self:GetPos() + Vector(0,0,140))
-- Create seat entities
self.DriverSeat = self:CreateSeat("driver",Vector(450-2,11,-35+2))
self.InstructorsSeat = self:CreateSeat("instructor",Vector(430,35,-30))
self.InstructorsSeat2 = self:CreateSeat("instructor",Vector(430,-20,-30))
-- Hide seats
self.DriverSeat:SetRenderMode(RENDERMODE_TRANSALPHA)
self.DriverSeat:SetColor(Color(0,0,0,0))
self.InstructorsSeat:SetRenderMode(RENDERMODE_TRANSALPHA)
self.InstructorsSeat:SetColor(Color(0,0,0,0))
self.InstructorsSeat2:SetRenderMode(RENDERMODE_TRANSALPHA)
self.InstructorsSeat2:SetColor(Color(0,0,0,0))
-- Create bogeys
self.FrontBogey = self:CreateBogey(Vector( 322,0,-90),Angle(0,180,0),true,"722")
self.RearBogey = self:CreateBogey(Vector(-333,0,-90),Angle(0,0,0),false,"722")
self.FrontBogey:SetNWBool("Async",true)
self.RearBogey:SetNWBool("Async",true)
self.FrontBogey:SetNWFloat("SqualPitch",0.75)
self.RearBogey:SetNWFloat("SqualPitch",0.75)
self.FrontBogey:SetNWBool("DisableEngines",true)
self.RearBogey:SetNWBool("DisableEngines",true)
if Metrostroi.BogeyOldMap then
self.FrontCouple = self:CreateCouple(Vector( 448-6,0,-77),Angle(0,0,0),true,"722")
self.RearCouple = self:CreateCouple(Vector(-419.5-7.5+6,0,-77),Angle(0,180,0),false,"717")
else
self.FrontCouple = self:CreateCouple(Vector( 454 -8,0,-79),Angle(0,0,0),true,"722")
self.RearCouple = self:CreateCouple(Vector(-419-6.8+8,0,-79),Angle(0,180,0),false,"717")
end
self.FrontBogey.DisableSound = 1
self.RearBogey.DisableSound = 1
self.FrontCouple.EKKDisconnected = true
-- Initialize key mapping
self.KeyMap = {
[KEY_W] = "PanelKVUp",
[KEY_S] = "PanelKVDown",
[KEY_1] = "PanelKV1",
[KEY_2] = "PanelKV2",
[KEY_3] = "PanelKV2",
[KEY_4] = "PanelKV4",
[KEY_5] = "PanelKV5",
[KEY_6] = "PanelKV6",
[KEY_7] = "PanelKV7",
[KEY_8] = "EmergencyDriveSet",
[KEY_0] = "KRO+",
[KEY_9] = "KRO-",
[KEY_V] = "DoorCloseA",
[KEY_A] = "DoorLeft",
[KEY_D] = "DoorRight",
[KEY_SPACE] = "PBSet",
[KEY_BACKSPACE] = {"EmergencyBrakeToggle",helper="EmergencyBrakeValveToggle"},
[KEY_PAD_ENTER] = "KVWrenchKV",
[KEY_LSHIFT] = {
[KEY_2] = "RingSet",
[KEY_S] = "PanelKV7",
[KEY_V] = "DoorCloseM",
[KEY_SPACE] = "VigilanceSet",
[KEY_PAD_ENTER] = "KVWrenchNone",
},
[KEY_LALT] = {
[KEY_UP] = "SarmatUpSet",
[KEY_DOWN] = "SarmatDownSet",
[KEY_RIGHT] = "SarmatEnterSet",
[KEY_LEFT] = "SarmatEscSet",
[KEY_PAD_1] = "SarmatF1Set",
[KEY_PAD_2] = "SarmatF2Set",
[KEY_PAD_3] = "SarmatF3Set",
[KEY_PAD_4] = "SarmatF4Set",
},
[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",
[KEY_PAD_MULTIPLY] = "EmergencyDriveSet",
[KEY_L] = "HornEngage",
}
self.TrainWireInverts = { [8]=true }
-- 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 = "RearTrainLineIsolationToggle",
Pos = Vector(-469.8, -34, -65), Radius = 8,
},
{
ID = "RearBrakeLineIsolationToggle",
Pos = Vector(-469.8, 35, -65), Radius = 8,
},
{
ID = "RearDoor",
Pos = Vector(-464.8, -38, 0), Radius = 20,
},
{
ID = "PassengerDoor",
Pos = Vector(374, -7, 0), Radius = 13,
},
{
ID = "CabinDoorLeft",
Pos = Vector(400, 62, -7), Radius = 20,
},
{
ID = "CabinDoorLeft",
Pos = Vector(400, 62, -30), Radius = 20,
},
{
ID = "CabinDoorRight",
Pos = Vector(400, -62, -7), Radius = 20,
},
{
ID = "CabinDoorRight",
Pos = Vector(400, -62, -30), Radius = 20,
},
}
self.Lights = {
[1] = { "light", Vector(493 , -60, -36), Angle(0,0,0), Color(200,255,255), brightness = 0.5, scale = 2.5, texture = "sprites/light_glow02.vmt" },
[2] = { "light", Vector(493 , 62, -36), Angle(0,0,0), Color(200,255,255), brightness = 0.5, scale = 2.5, texture = "sprites/light_glow02.vmt" },
[3] = { "light", Vector(490, -65, 15), Angle(0,0,0), Color(255,50,50), brightness = 0.2, scale = 4, texture = "sprites/light_glow02.vmt" },
[4] = { "light", Vector(489, 60, 15), Angle(0,0,0), Color(255,50,50), brightness = 0.2, scale = 4, texture = "sprites/light_glow02.vmt" },
[10] = { "dynamiclight", Vector( 440, 0, 14), Angle(0,0,0), Color(255,255,255), brightness = 0.25, distance = 550 },
-- Interior
[11] = { "dynamiclight", Vector( 180+30, 0, -5), Angle(0,0,0), Color(230,230,255), brightness = 3, distance = 260},
[12] = { "dynamiclight", Vector( -50+30, 0, -5), Angle(0,0,0), Color(230,230,255), brightness = 3, distance = 260},
[13] = { "dynamiclight", Vector(-280+30, 0, -5), Angle(0,0,0), Color(230,230,255), brightness = 3, distance = 260},
[15] = { "light",Vector(-46.4, 66,28.1)+Vector(0, 0,4.1), Angle(0,0,0), Color(254,254,254), brightness = 0.4, scale = 0.1, texture = "sprites/light_glow02.vmt" },
[16] = { "light",Vector(-46.4, 66,28.1)+Vector(0, 0.4,-0), Angle(0,0,0), Color(254,210,18), brightness = 0.3, scale = 0.1, texture = "sprites/light_glow02.vmt" },
[17] = { "light",Vector(-46.4, 66,28.1)+Vector(0, 0.8,-4.1), Angle(0,0,0), Color(40,240,122), brightness = 0.3, scale = 0.1, texture = "sprites/light_glow02.vmt" },
[18] = { "light",Vector(-46.4,-66,28.1)+Vector(0,-0,4.1), Angle(0,0,0), Color(254,254,254), brightness = 0.4, scale = 0.1, texture = "sprites/light_glow02.vmt" },
[19] = { "light",Vector(-46.4,-66,28.1)+Vector(0,-0.4,-0), Angle(0,0,0), Color(254,210,18), brightness = 0.3, scale = 0.1, texture = "sprites/light_glow02.vmt" },
[20] = { "light",Vector(-46.4,-66,28.1)+Vector(0,-0.8,-4.1), Angle(0,0,0), Color(40,240,122), brightness = 0.3, scale = 0.1, texture = "sprites/light_glow02.vmt" },
}
self.PassengerDoor = false
self.CabinDoorLeft = false
self.CabinDoorRight = false
self.RearDoor = false
self:SetNW2Float("UPONoiseVolume",math.Rand(0,0.3))
self:SetNW2Float("UPOVolume",math.Rand(0.8,1))
self.Scheme = 1
end
function ENT:NonSupportTrigger()
self.VAH:TriggerInput("Set",1)
self.RCARS:TriggerInput("Set",0)
self.K9:TriggerInput("Set",0)
self.Plombs.VAH = nil
self.Plombs.RCARS = nil
self.Plombs.K9 = nil
end
function ENT:OnUPOArrived()
return self.SarmatUPO:TriggerInput("CheckUPO")
end
--------------------------------------------------------------------------------
function ENT:Think()
local retVal = self.BaseClass.Think(self)
local power = self.BUKV.Power > 0
--[[
if self:GetWagonNumber() == 22010 or self:EntIndex()==1560 then --DEBUG
local accel = 0
for i=1,#self.WagonList do
accel=accel+self.WagonList[i].Acceleration
end
local drivers = {self.DriverSeat,self.InstructorsSeat,self.ExtraSeat1,self.ExtraSeat2}
if math.abs(accel) > 0.1 then
for k,v in pairs(drivers) do
if IsValid(v) and IsValid(v:GetDriver()) then
v:GetDriver():ChatPrint(Format("v=%.2f I=%.2f RK=%02d a=%.2f",self.Speed,0 or (self.Electric.I13+self.Electric.I24)/2,0 or self.RheostatController.SelectedPosition or 0,accel/#self.WagonList))--(accel/#self.WagonList)))
end
end
end
end
--[[
self.TestA = self.TestA or nil
self.TestV = self.TestV or nil
local accel = self.Acceleration
if (1 < self.Speed and self.Speed < 99) and self.Panel.TargetController < 0 and not self.TestA then
self.TestA = CurTime()
self.TestV = self.Speed/3600*1000
self.TestTyp = self.Speed > 55 and 2 or 1
self.TestS = 0
end
if self.Panel.TargetController >= 0 and self.TestA then
self.TestA = nil
self.TestV = nil
self.TestS = nil
end
if self.TestS then self.TestS=self.TestS+self.Speed*self.SpeedSign/3600*1000*self.DeltaTime end
if (self.Speed<2 and self.TestTyp ==2 or self.Speed<2 and self.TestTyp ==1) and self.TestA then
local curSpeed = self.Speed/3600*1000
local a = (curSpeed-self.TestV)/(CurTime()-self.TestA)
RunConsoleCommand("say",Format("[%05d]V0= %.1f V1=%.1f t=%.2f a=%.2f s=%.1f",self:GetWagonNumber(),self.TestV*3600/1000,curSpeed*3600/1000,CurTime()-self.TestA,a,self.TestS))
self.TestA = nil
self.TestV = nil
self.TestS = nil
end--]]
--self:SetPackedRatio("async1", math.min(self.Speed/7,self.AsyncInverter.State*math.Clamp(1+(self.Speed-15)/120,1,2)))
--self:SetPackedRatio("async1state", self.AsyncInverter.State)
--self:SetPackedRatio("asyncfreq", self.AsyncInverter.InverterFrequency)
--print()
if self.AsyncInverter.State==1 then
local state = math.abs(self.AsyncInverter.InverterFrequency/13)--(10+8*math.Clamp((self.AsyncInverter.State-0.4)/0.4,0,1)))
self:SetPackedRatio("asynccurrent", math.Clamp(state*(state+self.AsyncInverter.State/1),0,1))
else
local state = math.abs(self.AsyncInverter.InverterFrequency/(11+self.AsyncInverter.State*5))--(10+8*math.Clamp((self.AsyncInverter.State-0.4)/0.4,0,1)))
self:SetPackedRatio("asynccurrent", math.Clamp(state*(state+self.AsyncInverter.State/1),0,1))
end
self:SetPackedRatio("asyncstate", math.Clamp(self.AsyncInverter.State/0.2*math.abs(self.AsyncInverter.Current)/100,0,1))
self:SetPackedRatio("chopper", math.Clamp(self.Electric.Chopper>0 and self.Electric.Iexit/100 or 0,0,1))
--print(self.Electric.Chopper,self.Electric.Iexit/100)
self:SetPackedBool("BattOnL",self.Panel.BattOn)
self:SetPackedBool("BattOffL",self.Panel.BattOff)
self:SetPackedBool("BattPressed",self.Electric.BatterySound>0)
self:SetPackedRatio("ControllerPosition",self.Panel.Controller)
self:SetPackedRatio("ReverserPosition",self.KRO.Value/2)
self:SetPackedRatio("CompressorPosition",self.Compressor.Value)
self:SetPackedRatio("PassVent",self.PassVent.Value/4)
self:SetPackedRatio("VRU",self.VRU.Value/2)
self:SetPackedRatio("BARSMode",self.BARSMode.Value/2)
self:SetPackedRatio("PantSC",self.PantSC.Value/4)
self:SetPackedRatio("GlassCleaner",self.GlassCleaner.Value/2)
self:SetPackedRatio("Headlights",self.Headlights.Value/2)
self:SetPackedRatio("DoorClose",self.DoorClose.Value/2)
self:SetPackedRatio("CabinLight",self.CabinLight.Value/2)
self:SetPackedBool("LampLPT",self.BUKP.LPT)
self:SetPackedBool("LampRU",self.Panel.LRU > 0)
self:SetPackedBool("LampAVS",self.Panel.AVS > 0)
self:SetPackedBool("LampRC",self.Panel.RC > 0)
self:SetPackedBool("LampSD",self.Electric.LSD > 0)
self:SetPackedBool("RadioRVS",self.Panel.VPR1>0)
self:SetPackedBool("RadioMotorola",self.Panel.VPR2>0)
self:SetPackedBool("LampLRD",self.ALSCoil.F6 > 0)
self:SetPackedBool("Lamp04",self.ALSCoil.NoFreq > 0)
self:SetPackedBool("Lamp0",self.ALSCoil.F5 > 0)
self:SetPackedBool("Lamp40",self.ALSCoil.F4 > 0)
self:SetPackedBool("Lamp60",self.ALSCoil.F3 > 0)
self:SetPackedBool("Lamp70",self.ALSCoil.F2 > 0)
self:SetPackedBool("Lamp80",self.ALSCoil.F1 > 0)
local cablight = self.Panel.CabLights
self:SetLightPower(10,cablight > 0,cablight)
self:SetPackedBool("CabinEnabledEmer", cablight > 0)
self:SetPackedBool("CabinEnabledFull", cablight > 0.3)
self:SetPackedBool("PanelLighting",self.Panel.PanelLights>0)
local HeadlightsPower = self.Panel.Headlights2 > 0 and 1 or self.Panel.Headlights1 > 0 and 0.5 or 0
self:SetPackedBool("Headlights1",self.Panel.Headlights1 > 0)
self:SetPackedBool("Headlights2",self.Panel.Headlights2 > 0)
self:SetLightPower(1,HeadlightsPower > 0,HeadlightsPower^0.5)
self:SetLightPower(2,HeadlightsPower > 0,HeadlightsPower^0.5)
self:SetPackedRatio("Headlight",HeadlightsPower)
self:SetPackedBool("RedLights",self.Panel.RedLights>0)
self:SetLightPower(3,self.Panel.RedLights>0)
self:SetLightPower(4,self.Panel.RedLights>0)
local passlight = math.min(1,self.Panel.MainLights+self.Panel.EmergencyLights*0.3)
--self:SetLightPower(11,power and mul > 0, mul)
self:SetLightPower(11,passlight > 0, passlight)
self:SetLightPower(12,passlight > 0, passlight)
self:SetLightPower(13,passlight > 0, passlight)
self:SetPackedRatio("SalonLighting",passlight)
self:SetPackedBool("CompressorWork",self.Pneumatic.Compressor)
self:SetPackedBool("DoorLeftLamp",self.BUKP.DoorLeft)
self:SetPackedBool("DoorRightLamp",self.BUKP.DoorRight)
self:SetPackedBool("EmergencyBrakeTPlusL",self.Panel.EmergencyBrakeTPlusL > 0)
self:SetPackedBool("EmergencyDriveL",self.Panel.EmergencyDriveL > 0)
--self:SetPackedRatio("BatteryVoltage",(self.BUKV.Battery and (self.BUKV.PSN and 82 or 65) or 0)/150)
self:SetPackedRatio("HighVoltage",self.TR.Main750V/1000)
self:SetPackedRatio("LV",(self.Electric.Power*(65+15*self:ReadTrainWire(33)))/150)
self:SetPackedRatio("CranePosition", self.Pneumatic.DriverValvePosition)
self:SetPackedRatio("BLPressure", self.Pneumatic.BrakeLinePressure/16.0)
self:SetPackedRatio("TLPressure", self.Pneumatic.TrainLinePressure/16.0)
self:SetPackedRatio("BCPressure", math.min(3.2,self.Pneumatic.BrakeCylinderPressure)/6.0)
self:SetPackedBool("SOSD",self.Panel.SOSD>0)
self:SetPackedBool("SOSDLamp",self.BUKP.SOSD>0)
self.SOSD = self.Panel.SOSD>0
self:SetPackedBool("BortPneumo",self.Panel.BrW>0)
self:SetPackedBool("BortLSD",self.Panel.DoorsW>0)
self:SetPackedBool("BortBV",self.Panel.GRP>0)
self:SetLightPower(15, self.Panel.DoorsW > 0.5,1)
self:SetLightPower(18, self.Panel.DoorsW > 0.5,1)
self:SetLightPower(16, self.Panel.BrW > 0.5,1)
self:SetLightPower(19, self.Panel.BrW > 0.5,1)
self:SetLightPower(17, self.Panel.GRP > 0.5,1)
self:SetLightPower(20, self.Panel.GRP > 0.5,1)
self:SetPackedBool("RingEnabled",self.BUKP.Ring)
self:SetPackedBool("RingEnabledBARS",self.BARS.Ring>0)
self:SetPackedBool("DoorAlarmL",self.BUKV.CloseRing)
self:SetPackedBool("DoorAlarmR",self.BUKV.CloseRing)
self:SetNW2Int("PassSchemesLED",self.PassSchemes.PassSchemeCurr)
self:SetNW2Int("PassSchemesLEDN",self.PassSchemes.PassSchemeNext)
self:SetPackedBool("PassSchemesLEDO",self.PassSchemes.PassSchemePath)
self:SetPackedBool("SarmatLeft",self.Panel.PassSchemePowerL)
self:SetPackedBool("SarmatRight",self.Panel.PassSchemePowerR)
self:SetPackedBool("PassengerDoor",self.PassengerDoor)
self:SetPackedBool("CabinDoorLeft",self.CabinDoorLeft)
self:SetPackedBool("CabinDoorRight",self.CabinDoorRight)
self:SetPackedBool("RearDoor",self.RearDoor)
self:SetNW2Bool("VityazLamp", self.MFDU.State~=0)
self:SetPackedBool("AnnPlay",self.Panel.AnnouncerPlaying > 0)
self:SetPackedBool("AnnPlayUPO",self.Announcer.AnnTable=="AnnouncementsUPO")
--print(self.Panel.AnnouncerPlaying,self.UPO.LineOut)
self:SetPackedRatio("Speed", self.Speed)
self.AsyncInverter:TriggerInput("Speed",self.Speed)
if IsValid(self.FrontBogey) and IsValid(self.RearBogey) and not self.IgnoreEngine then
local A = self.AsyncInverter.Torque
self.FrontBogey.MotorForce = 43000+9000*(A < 0 and 1 or 0)--35300
self.FrontBogey.Reversed = self.Electric.Reverser < 0
self.FrontBogey.DisableSound = 1
self.FrontBogey.DisableContacts = self.Electric.DisablePant > 0
self.RearBogey.MotorForce = 43000+9000*(A < 0 and 1 or 0)--35300
self.RearBogey.Reversed = self.Electric.Reverser > 0
self.RearBogey.DisableSound = 1
self.RearBogey.DisableContacts = self.Electric.DisablePant > 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)
-- Apply brakes
self.FrontBogey.PneumaticBrakeForce = 50000.0--3000 --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.RearBogey.PneumaticBrakeForce = 50000.0--3000 --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
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 string.find(button,"PneumaticBrakeSet") then
self.Pneumatic:TriggerInput("BrakeSet",tonumber(button:sub(-1,-1)))
return
end
if button == "PassengerDoor" then self.PassengerDoor = not self.PassengerDoor end
if button == "CabinDoorLeft" then self.CabinDoorLeft = not self.CabinDoorLeft end
if button == "CabinDoorRight" then self.CabinDoorRight = not self.CabinDoorRight end
if button == "RearDoor" then self.RearDoor = not self.RearDoor end
if button == "DoorLeft" then
self.DoorSelect:TriggerInput("Set",0)
self.DoorLeft1:TriggerInput("Set",1)
end
if button == "DoorRight" then
self.DoorSelect:TriggerInput("Set",1)
self.DoorRight:TriggerInput("Set",1)
end
if button == "DoorCloseA" then
if self.DoorClose.Value == 1 then
self.DoorClose:TriggerInput("Set",2)
else
self.DoorClose:TriggerInput("Set",1)
end
end
if button == "DoorCloseM" then
if self.DoorClose.Value == 1 then
self.DoorClose:TriggerInput("Set",0)
else
self.DoorClose:TriggerInput("Set",1)
end
end
end
function ENT:OnButtonRelease(button,ply)
if string.find(button,"PneumaticBrakeSet") then
if button == "PneumaticBrakeSet1" and (self.Pneumatic.DriverValvePosition == 1) then
self.Pneumatic:TriggerInput("BrakeSet",2)
end
return
end
if button == "DoorLeft" then
self.DoorLeft1:TriggerInput("Set",0)
end
if button == "DoorRight" then
self.DoorRight:TriggerInput("Set",0)
end
end

View File

@@ -0,0 +1,390 @@
ENT.Type = "anim"
ENT.Base = "gmod_subway_base"
ENT.Author = ""
ENT.Contact = ""
ENT.Purpose = ""
ENT.Instructions = ""
ENT.Category = "Metrostroi (trains)"
ENT.SkinsType = "81-722"
ENT.Model = "models/metrostroi_train/81-722/81-722.mdl"
ENT.Spawnable = true
ENT.AdminSpawnable = false
ENT.DontAccelerateSimulation = false
function ENT:PassengerCapacity()
return 300
end
function ENT:GetStandingArea()
return Vector(-450,-30,-62),Vector(380,30,-62)
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
ENT.MirrorCams = {
Vector(441,72,15),Angle(1,180,0),15,
Vector(441,-72,15),Angle(1,180,0),15,
}
ENT.AnnouncerPositions = {
}
for i=1,4 do
table.insert(ENT.AnnouncerPositions,{Vector(323-(i-1)*230+37.5,47 ,44),100,0.1})
table.insert(ENT.AnnouncerPositions,{Vector(323-(i-1)*230,-47,44),100,0.1})
end
ENT.Cameras = {
{Vector(407.5+10,44,20),Angle(0,180,0),"Train.722.Breakers"},
{Vector(407.5+5,50,0),Angle(0,180,0),"Train.722.PU2_1"},
{Vector(407.5+10,43,-10),Angle(0,180,0),"Train.722.PU2_2"},
{Vector(407.5+60,6,-4.5),Angle(25,0,0),"Train.722.Vityaz"},
{Vector(407.5+57,31,-6),Angle(25,30,0),"Train.722.SARMAT"},
{Vector(407.5+40,40,-25),Angle(0,0,0),"Train.722.CabLights"},
{Vector(407.5+67.5,41.4,5),Angle(75,0,0),"Train.Common.RouteNumber"},
{Vector(407.5+15,44,-40),Angle(57,180,0),"Train.722.Disconnects"},
{Vector(407.5+40,45,-40),Angle(45,30,0),"Train.722.KRMH"},
{Vector(450+38,11,20),Angle(60,0,0),"Train.Common.CouplerCamera"},
}
function ENT:InitializeSounds()
self.BaseClass.InitializeSounds(self)
self.SoundNames["test_async1"] = {"subway_trains/722/engines/inverter_1000.wav",loop = true}
self.SoundNames["test_async1_2"] = {"subway_trains/722/engines/inverter_1000.wav",loop = true}
self.SoundNames["test_async1_3"] = {"subway_trains/722/engines/inverter_1000.wav",loop = true}
self.SoundNames["test_async2"] = {"subway_trains/722/engines/inverter_2000.wav",loop = true}
self.SoundNames["test_async3"] = {"subway_trains/722/engines/inverter_2800.wav",loop = true}
self.SoundNames["test_async3_2"] = {"subway_trains/722/engines/inverter_2800.wav",loop = true}
self.SoundPositions["test_async1"] = {400,1e9,Vector(0,0,0),0.5}
self.SoundPositions["test_async1_2"] = {400,1e9,Vector(0,0,0),0.1}
self.SoundPositions["test_async1_3"] = {400,1e9,Vector(0,0,0),0.1}
self.SoundPositions["test_async2"] = {400,1e9,Vector(0,0,0),0.1}
self.SoundPositions["test_async3"] = {400,1e9,Vector(0,0,0),0.1}
self.SoundPositions["test_async3_2"] = self.SoundPositions["test_async3"]
self.SoundNames["async_p2"] = {"subway_trains/722/engines/inverter_1000.wav",loop = true}
self.SoundPositions["async_p2"] = {400,1e9,Vector(0,0,0),1}
self.SoundNames["async_p3"] = {"subway_trains/722/engines/inverter_1000.wav",loop = true}
self.SoundPositions["async_p3"] = {400,1e9,Vector(0,0,0),1}
self.SoundNames["engine_loud"] = {"subway_trains/722/engines/engine_loud.wav",loop = true}
self.SoundPositions["engine_loud"] = {400,1e9,Vector(0,0,0),0.2}
self.SoundNames["chopper"] = {"subway_trains/722/chopper.wav",loop = true}
self.SoundPositions["chopper"] = {200,1e9,Vector(0,0,0),0.03}
self.SoundNames["battery_on_1"] = "subway_trains/722/battery/battery_off_1.mp3"
self.SoundPositions["battery_on_1"] = {100,1e9,Vector(182,50,-75),0.5}
self.SoundNames["battery_off_1"] = "subway_trains/722/battery/battery_off_1.mp3"
self.SoundPositions["battery_off_1"] = {100,1e9,Vector(182,50,-75),0.5}
self.SoundNames["battery_off_2"] = "subway_trains/722/battery/battery_off_2.mp3"
self.SoundPositions["battery_off_2"] = {100,1e9,Vector(182,50,-75),0.5}
self.SoundNames["battery_off_stop"] = "subway_trains/722/battery/battery_off_stop.mp3"
self.SoundPositions["battery_off_stop"] = {120,1e9,Vector(182,50,-75),0.5}
self.SoundNames["battery_pneumo"] = "subway_trains/722/battery/battery_pneumo.mp3"
self.SoundPositions["battery_pneumo"] = {200,1e9,Vector(182,50,-75),0.1}
self.SoundNames["battery_off_loop"] = {loop=true,"subway_trains/722/battery/battery_off_loop.wav"}
self.SoundPositions["battery_off_loop"] = {100,1e9,Vector(182,50,-75),0.02}
self.SoundNames["compressor"] = {loop=true,"subway_trains/722/compressol_loop.wav"}
self.SoundPositions["compressor"] = {485,1e9,Vector(-118,-40,-66),0.4} --FIXME: Pos
self.SoundNames["compressor_pn"] = "subway_trains/722/compressor_pssh.mp3"
self.SoundPositions["compressor_pn"] = {485,1e9,Vector(-118,-40,-66),0.4} --FIXME: Pos
self.SoundNames["release"] = {loop=true,"subway_trains/722/pneumo_release2.wav"}
self.SoundPositions["release"] = {320,1e9,Vector(-183,0,-70),0.1} --FIXME: Pos
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["crane013_brake"] = {loop=true,"subway_trains/common/pneumatic/release_2.wav"}
self.SoundPositions["crane013_brake"] = {80,1e9,Vector(475,-10,-47.9),0.86}
self.SoundNames["crane013_brake2"] = {loop=true,"subway_trains/common/pneumatic/013_brake2.wav"}
self.SoundPositions["crane013_brake2"] = {80,1e9,Vector(475,-10,-47.9),0.86}
self.SoundNames["crane013_release"] = {loop=true,"subway_trains/common/pneumatic/013_release.wav"}
self.SoundPositions["crane013_release"] = {80,1e9,Vector(475,-10,-47.9),0.4}
self.SoundNames["pneumo_disconnect_close"] = {"subway_trains/722/013_close1.mp3","subway_trains/722/013_close2.mp3","subway_trains/722/013_close3.mp3"}
self.SoundNames["pneumo_disconnect_open"] = {
"subway_trains/722/013_open1.mp3",
"subway_trains/722/013_open2.mp3",
"subway_trains/722/013_open3.mp3",
"subway_trains/722/013_open4.mp3",
}
self.SoundPositions["pneumo_disconnect_close"] = {100,1e9,Vector(411,45,-61),0.2}
self.SoundPositions["pneumo_disconnect_open"] = {100,1e9,Vector(411,45,-61),0.2}
self.SoundNames["front_isolation"] = {loop=true,"subway_trains/common/pneumatic/isolation_leak.wav"}
self.SoundPositions["front_isolation"] = {300,1e9,Vector(500, 0,-63),1}
self.SoundNames["rear_isolation"] = {loop=true,"subway_trains/common/pneumatic/isolation_leak.wav"}
self.SoundPositions["rear_isolation"] = {300,1e9,Vector(-469, 0,-63),1}
self.SoundNames["ring"] = {loop=0,"subway_trains/722/ring1_loop.wav","subway_trains/722/ring1_loop.wav","subway_trains/722/ring1_end.wav"}
self.SoundPositions["ring"] = {100,1e9,Vector(406+0.2,36.3,-2.7),1}
self.SoundNames["ring2"] = {loop=true,"subway_trains/722/ring2_loop.wav"} --FIXME: Sarmat
self.SoundPositions["ring2"] = {100,1e9,Vector(406+0.2,36.3+1.5,-2.7),1}
self.SoundNames["rolling_10"] = {loop=true,"subway_trains/722/rolling_10.wav"}
self.SoundNames["rolling_45"] = {loop=true,"subway_trains/722/rolling_45.wav"}
self.SoundNames["rolling_60"] = {loop=true,"subway_trains/722/rolling_60.wav"}
self.SoundNames["rolling_70"] = {loop=true,"subway_trains/722/rolling_70.wav"}
self.SoundPositions["rolling_10"] = {485,1e9,Vector(0,0,0),0.20}
self.SoundPositions["rolling_45"] = {485,1e9,Vector(0,0,0),0.50}
self.SoundPositions["rolling_60"] = {485,1e9,Vector(0,0,0),0.55}
self.SoundPositions["rolling_70"] = {485,1e9,Vector(0,0,0),0.60}
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["horn"] = {loop=0.6,"subway_trains/common/pneumatic/horn/horn3_start.wav","subway_trains/common/pneumatic/horn/horn3_loop.wav", "subway_trains/common/pneumatic/horn/horn3_end.wav"}
self.SoundPositions["horn"] = {1100,1e9,Vector(500,0,-30)}
self.SoundNames["disconnect_valve"] = "subway_trains/common/switches/pneumo_disconnect_switch.mp3"
self.SoundNames["KU_-3_-2"] = "subway_trains/722/kuau/x_xp.mp3"
self.SoundNames["KU_-2_-1"] = "subway_trains/722/kuau/xp_x2.mp3"
self.SoundNames["KU_-1_0"] = "subway_trains/722/kuau/x_xp.mp3"
self.SoundNames["KU_0_1"] = "subway_trains/722/kuau/0_x.mp3"
self.SoundNames["KU_1_2"] = "subway_trains/722/kuau/x_xp.mp3"
self.SoundNames["KU_2_1"] = "subway_trains/722/kuau/xp_x2.mp3"
self.SoundNames["KU_1_0"] = "subway_trains/722/kuau/x_xp.mp3"
self.SoundNames["KU_0_-1"] = "subway_trains/722/kuau/0_x.mp3"
self.SoundNames["KU_-1_-2"] = "subway_trains/722/kuau/x_xp.mp3"
self.SoundNames["KU_-2_-3"] = "subway_trains/722/kuau/xp_x.mp3"
self.SoundPositions["KU_-3_-2"] = {90,1e3,Vector(466.7,0.2,-16.9),0.4}
self.SoundPositions["KU_-2_-1"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_-1_0"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_0_1"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_1_2"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_2_1"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_1_0"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_0_-1"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_-1_-2"] = self.SoundPositions["KU_-3_-2"]
self.SoundPositions["KU_-2_-3"] = self.SoundPositions["KU_-3_-2"]
self.SoundNames["sf_on"] = "subway_trains/722/switches/sf_on.mp3"
self.SoundNames["sf_off"] = "subway_trains/722/switches/sf_off.mp3"
self.SoundNames["button_on"] = {"subway_trains/722/switches/button_press1.mp3","subway_trains/722/switches/button_press2.mp3","subway_trains/722/switches/button_press3.mp3"}
self.SoundNames["button_off"] = {"subway_trains/722/switches/button_release1.mp3","subway_trains/722/switches/button_release2.mp3","subway_trains/722/switches/button_release3.mp3"}
self.SoundNames["switch_emer_on"] = "subway_trains/722/switches/big_red_e_on.mp3"
self.SoundNames["switch_emer_off"] = "subway_trains/722/switches/big_red_e_off.mp3"
self.SoundNames["blinker_on1"] = {"subway_trains/722/blinker_on.mp3","subway_trains/722/blinker_on2.mp3","subway_trains/722/blinker_on3.mp3","subway_trains/722/blinker_on4.mp3","subway_trains/722/blinker_on5.mp3"}
self.SoundNames["blinker_off1"] = {"subway_trains/722/blinker_off.mp3","subway_trains/722/blinker_off2.mp3","subway_trains/722/blinker_off3.mp3","subway_trains/722/blinker_off4.mp3","subway_trains/722/blinker_off5.mp3"}
self.SoundNames["blinker_on2"] = self.SoundNames["blinker_on1"]
self.SoundNames["blinker_off2"] = self.SoundNames["blinker_off1"]
self.SoundPositions["blinker_on1"] = {30,1e9,Vector(481,39.3,-7.2),0.01}
self.SoundPositions["blinker_off1"] = self.SoundPositions["blinker_on1"]
self.SoundPositions["blinker_on2"] = self.SoundPositions["blinker_on1"]
self.SoundPositions["blinker_off2"] = self.SoundPositions["blinker_on1"]
self.SoundNames["switch_kb_on"] = "subway_trains/722/switches/big_red_kb_on.mp3"
self.SoundNames["switch_kb_off"] = "subway_trains/722/switches/big_red_kb_off.mp3"
self.SoundNames["switch_panel_up"] = "subway_trains/722/switches/panel_switch_up.mp3"
self.SoundNames["switch_panel_mid"] = "subway_trains/722/switches/panel_switch_mid.mp3"
self.SoundNames["switch_panel_down"] = "subway_trains/722/switches/panel_switch_down.mp3"
self.SoundNames["multiswitch_panel_max"] = "subway_trains/722/switches/multi_switch_panel_max.mp3"
self.SoundNames["multiswitch_panel_mid"] = {"subway_trains/722/switches/multi_switch_panel_mid.mp3","subway_trains/722/switches/multi_switch_panel_mid2.mp3"}
self.SoundNames["multiswitch_panel_min"] = "subway_trains/722/switches/multi_switch_panel_min.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_alarm"] = "subway_trains/722/door_alarm.mp3"
self.SoundPositions["door_alarm"] = {485,1e9,Vector(0,0,0),0.2}
self.SoundNames["doors"] = "subway_trains/722/door_start.mp3"
self.SoundNames["doorl"] = {loop=true,"subway_trains/722/door_loop.wav"}
self.SoundPositions["doors"] = {300,1e9,Vector(0,0,0),0.2}
self.SoundPositions["doorl"] = {300,1e9,Vector(0,0,0),0.2}
for i=0,3 do
for k=0,1 do
self.SoundNames["door"..i.."x"..k.."c"] = "subway_trains/722/door_close.mp3"
self.SoundPositions["door"..i.."x"..k.."c"] = {485,1e9,GetDoorPosition(i,k),0.2}
end
end
self.SoundNames["door_alarm"] = {"subway_trains/722/door_alarm.mp3"}
self.SoundPositions["door_alarm"] = {485,1e9,Vector(0,0,0),0.25}
self.SoundNames["epk_brake"] = {loop=true,"subway_trains/common/pneumatic/epv_loop.wav"}
self.SoundPositions["epk_brake"] = {40,1e9,Vector(458,56.5,-61),0.65}
self.SoundNames["valve_brake"] = {loop=true,"subway_trains/common/pneumatic/epv_loop.wav"}
self.SoundPositions["valve_brake"] = {400,1e9,Vector(418.25,-49.2,1.3),1}
self.SoundNames["emer_brake"] = {loop=true,"subway_trains/common/pneumatic/autostop_loop.wav"}
self.SoundPositions["emer_brake"] = {600,1e9,Vector(380,-45,-75),0.95}
for i = 1,10 do
local id1 = Format("b1tunnel_%d",i)
local id2 = Format("b2tunnel_%d",i)
self.SoundPositions[id1.."a"] = {700*0.75,1e9,Vector( 317-5,0,-84),1*0.5}
self.SoundPositions[id1.."b"] = self.SoundPositions[id1.."a"]
self.SoundPositions[id2.."a"] = {700*0.75,1e9,Vector(-317+0,0,-84),1*0.5}
self.SoundPositions[id2.."b"] = self.SoundPositions[id2.."a"]
end
for i = 1,14 do
local id1 = Format("b1street_%d",i)
local id2 = Format("b2street_%d",i)
self.SoundPositions[id1.."a"] = {700,1e9,Vector( 317-5,0,-84),1.5*0.5}
self.SoundPositions[id1.."b"] = self.SoundPositions[id1.."a"]
self.SoundPositions[id2.."a"] = {700,1e9,Vector(-317+0,0,-84),1.5*0.5}
self.SoundPositions[id2.."b"] = self.SoundPositions[id2.."a"]
end
for k,v in ipairs(self.AnnouncerPositions) do
self.SoundNames["announcer_noise1_"..k] = {loop=true,"subway_announcers/upo/noiseS1.wav"}
self.SoundPositions["announcer_noise1_"..k] = {v[2] or 300,1e9,v[1],v[3]*0.2}
self.SoundNames["announcer_noise2_"..k] = {loop=true,"subway_announcers/upo/noiseS2.wav"}
self.SoundPositions["announcer_noise2_"..k] = {v[2] or 300,1e9,v[1],v[3]*0.2}
self.SoundNames["announcer_noise3_"..k] = {loop=true,"subway_announcers/upo/noiseS3.wav"}
self.SoundPositions["announcer_noise3_"..k] = {v[2] or 300,1e9,v[1],v[3]*0.2}
self.SoundNames["announcer_noiseW"..k] = {loop=true,"subway_announcers/upo/noiseW.wav"}
self.SoundPositions["announcer_noiseW"..k] = {v[2] or 300,1e9,v[1],v[3]*0.2}
end
end
function ENT:InitializeSystems()
self:LoadSystem("TR","TR_3B")
self:LoadSystem("Electric","81_722_Electric")
self:LoadSystem("BKCU","81_722_UPI")
self:LoadSystem("AsyncInverter","81_722_AsyncInverter")
self:LoadSystem("BUKP","81_722_BUKP")
self:LoadSystem("MFDU","81_722_MFDU")
self:LoadSystem("BUKV","81_722_BUKV")
self:LoadSystem("RouteNumberSys","81_722_RouteNumber")
self:LoadSystem("BARS","81_722_BARS")
self:LoadSystem("ALSCoil")
--self:LoadSystem("PAM")
self:LoadSystem("Pneumatic","81_722_Pneumatic")
self:LoadSystem("Horn","81_722_Horn")
self:LoadSystem("Panel","81_722_Panel")
self:LoadSystem("Announcer","81_71_Announcer", "AnnouncementsSarmatUPO")
self:LoadSystem("SarmatUPO","81_722_sarmat")
self:LoadSystem("UPO","81_71_UPO")
self:LoadSystem("Tickers","81_722_Tickers")
self:LoadSystem("PassSchemes","81_722_PassScheme")
end
function ENT:PostInitializeSystems()
self.Electric:TriggerInput("Type",self.Electric.T722)
self.UPO:TriggerInput("ArriveRandom",1)
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-722",
Name = "81-722",
WagType = 1,
Manufacturer = "MVM",
ALS = {
HaveAutostop = true,
TwoToSix = false,
RSAs325Hz = false,
Aproove0As325Hz = true,
},
EKKType = 722,
NoFrontEKK=true,
}
ENT.NumberRanges = {{22001,22100}}
ENT.Spawner = {
model = {
"models/metrostroi_train/81-722/81-722.mdl",
"models/metrostroi_train/81-722/722_salon1.mdl",
"models/metrostroi_train/81-722/722_cabine.mdl",
"models/metrostroi_train/81-722/722_underwagon.mdl",
"models/metrostroi_train/81-722/722_sarmat_l.mdl",
"models/metrostroi_train/81-722/722_sarmat_r.mdl",
},
spawnfunc = function(i,tbls,tblt)
local WagNum = tbls.WagNum
if 1<i and i<WagNum then
if WagNum ~= 3 and (WagNum >= 6) and (i < WagNum/2 or i > WagNum/2+1) then
return "gmod_subway_81-723"
else
return "gmod_subway_81-724"
end
else
return "gmod_subway_81-722"
end
end,
--WagNumTable = {2,3,4,6,8},
WagNumTable = {3,6,8},
Metrostroi.Skins.GetTable("Texture","Spawner.Texture",false,"train"),
Metrostroi.Skins.GetTable("PassTexture","Spawner.PassTexture",false,"pass"),
Metrostroi.Skins.GetTable("CabTexture","Spawner.CabTexture",false,"cab"),
{"Announcer","Spawner.722.Announcer","List",function()
local Announcer = {}
for k,v in pairs(Metrostroi.AnnouncementsSarmatUPO or {}) do Announcer[k] = v.name or k end
return Announcer
end},
{"Scheme","Spawner.722.Schemes","List",function()
local Schemes = {}
for k,v in pairs(Metrostroi.Skins["722_schemes"] or {}) do Schemes[k] = v.name or k end
return Schemes
end},
{"SarmatInvert","Spawner.722.InvertSchemes","Boolean",false,function(ent,val,rot) ent:SetNW2Bool("SarmatInvert",val and not rot or not val and rot) end},
{"SpawnMode","Spawner.Common.SpawnMode","List",{"Spawner.Common.SpawnMode.Full","Spawner.Common.SpawnMode.Deadlock","Spawner.Common.SpawnMode.NightDeadlock","Spawner.Common.SpawnMode.Depot"}, nil,function(ent,val,rot,i,wagnum,rclk)
if rclk then return end
if ent._SpawnerStarted~=val then
ent.Battery:TriggerInput("Set",val<=2 and 1 or 0)
if ent.SF1 then
local first = i==1 or _LastSpawner~=CurTime()
ent.ALS:TriggerInput("Set",val==1 and 1 or 0)
ent.Headlights:TriggerInput("Set",val==1 and 1 or 0)
ent.CabinLight:TriggerInput("Set",val==1 and 1 or 0)
ent.Compressor:TriggerInput("Set",val==1 and 1 or 0)
ent.PassLight:TriggerInput("Set",val==1 and 1 or 0)
ent.VKF:TriggerInput("Set",val==3 and 1 or 0)
ent.SOSDEnable:TriggerInput("Set",(first and val==1) and 1 or 0)
ent.SF8:TriggerInput("Set",val<=2 and 1 or 0)
ent.SF9:TriggerInput("Set",val<=2 and 1 or 0)
ent.SF16:TriggerInput("Set",val<=2 and 1 or 0)
ent.SF17:TriggerInput("Set",val<=2 and 1 or 0)
ent.SF19:TriggerInput("Set",val<=2 and 1 or 0)
ent.SF20:TriggerInput("Set",val<=2 and 1 or 0)
_LastSpawner=CurTime()
ent.CabinDoorLeft = val==4 and first
ent.CabinDoorRight = val==4 and first
ent.PassengerDoor = val==4
ent.RearDoor = val==4
else
ent.FrontDoor = val==4
ent.RearDoor = val==4
end
--ent.GV:TriggerInput("Set",val<4 and 1 or 0)
ent._SpawnerStarted = val
end
ent.Pneumatic.TrainLinePressure = val==3 and math.random()*4 or val==2 and 4.5+math.random()*3 or 7.6+math.random()*0.6
end},
--{"GV","Spawner.717.GV","Boolean",true,function(ent,val) ent.GV:TriggerInput("Set",val) end},
--{"PB","Spawner.717.PB","Boolean",false,function(ent,val) ent.ParkingBrake:TriggerInput("Set",val) end},
}