1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/entities/gmod_subway_81-721/init.lua
g_brzhezinskiy 1d05caf866 init
2021-01-02 12:51:45 +03:00

201 lines
9.4 KiB
Lua

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