mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
211 lines
5.1 KiB
Lua
211 lines
5.1 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
ENT.DriverActiveSound = "vehicles/atv_ammo_close.wav"
|
||
|
|
ENT.DriverInActiveSound = "vehicles/atv_ammo_open.wav"
|
||
|
|
|
||
|
|
function ENT:AlignView( ply, SetZero )
|
||
|
|
if not IsValid( ply ) then return end
|
||
|
|
|
||
|
|
timer.Simple( 0, function()
|
||
|
|
if not IsValid( ply ) or not IsValid( self ) then return end
|
||
|
|
local Ang = Angle(0,90,0)
|
||
|
|
|
||
|
|
if not SetZero then
|
||
|
|
Ang = self:GetAngles()
|
||
|
|
Ang.r = 0
|
||
|
|
end
|
||
|
|
|
||
|
|
ply:SetEyeAngles( Ang )
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:HandleActive()
|
||
|
|
local Pod = self:GetDriverSeat()
|
||
|
|
|
||
|
|
if not IsValid( Pod ) then
|
||
|
|
self:SetActive( false )
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local Driver = Pod:GetDriver()
|
||
|
|
local Active = self:GetActive()
|
||
|
|
|
||
|
|
if Driver ~= self:GetDriver() then
|
||
|
|
local NewDriver = Driver
|
||
|
|
local OldDriver = self:GetDriver()
|
||
|
|
local IsActive = IsValid( Driver )
|
||
|
|
|
||
|
|
self:SetDriver( Driver )
|
||
|
|
self:SetActive( IsActive )
|
||
|
|
|
||
|
|
self:OnDriverChanged( OldDriver, NewDriver, IsActive )
|
||
|
|
|
||
|
|
if IsActive then
|
||
|
|
Driver:lvsBuildControls()
|
||
|
|
self:AlignView( Driver )
|
||
|
|
|
||
|
|
if self.DriverActiveSound then self:EmitSound( self.DriverActiveSound ) end
|
||
|
|
else
|
||
|
|
self:WeaponsFinish()
|
||
|
|
|
||
|
|
if self.DriverInActiveSound then self:EmitSound( self.DriverInActiveSound ) end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:SetPassenger( ply )
|
||
|
|
if not IsValid( ply ) then return end
|
||
|
|
|
||
|
|
local AI = self:GetAI()
|
||
|
|
local DriverSeat = self:GetDriverSeat()
|
||
|
|
local AllowedToBeDriver = hook.Run( "LVS.CanPlayerDrive", ply, self ) ~= false
|
||
|
|
|
||
|
|
if IsValid( DriverSeat ) and not IsValid( DriverSeat:GetDriver() ) and not ply:KeyDown( IN_WALK ) and not AI and AllowedToBeDriver then
|
||
|
|
ply:EnterVehicle( DriverSeat )
|
||
|
|
self:AlignView( ply )
|
||
|
|
|
||
|
|
hook.Run( "LVS.UpdateRelationship", self )
|
||
|
|
else
|
||
|
|
local Seat = NULL
|
||
|
|
local Dist = 500000
|
||
|
|
|
||
|
|
for _, v in pairs( self:GetPassengerSeats() ) do
|
||
|
|
if not IsValid( v ) or IsValid( v:GetDriver() ) then continue end
|
||
|
|
if v:GetNWInt( "pPodIndex" ) == -1 then continue end
|
||
|
|
|
||
|
|
local cDist = (v:GetPos() - ply:GetPos()):Length()
|
||
|
|
|
||
|
|
if cDist < Dist then
|
||
|
|
Seat = v
|
||
|
|
Dist = cDist
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if IsValid( Seat ) then
|
||
|
|
ply:EnterVehicle( Seat )
|
||
|
|
self:AlignView( ply, true )
|
||
|
|
|
||
|
|
hook.Run( "LVS.UpdateRelationship", self )
|
||
|
|
else
|
||
|
|
if IsValid( DriverSeat ) then
|
||
|
|
if not IsValid( self:GetDriver() ) and not AI then
|
||
|
|
if AllowedToBeDriver then
|
||
|
|
ply:EnterVehicle( DriverSeat )
|
||
|
|
self:AlignView( ply )
|
||
|
|
|
||
|
|
hook.Run( "LVS.UpdateRelationship", self )
|
||
|
|
else
|
||
|
|
hook.Run( "LVS.OnPlayerCannotDrive", ply, self )
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
self:EmitSound( "doors/default_locked.wav" )
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:AddDriverSeat( Pos, Ang )
|
||
|
|
if IsValid( self:GetDriverSeat() ) then return self:GetDriverSeat() end
|
||
|
|
|
||
|
|
local Pod = ents.Create( "prop_vehicle_prisoner_pod" )
|
||
|
|
|
||
|
|
if not IsValid( Pod ) then
|
||
|
|
self:Remove()
|
||
|
|
|
||
|
|
print("LVS: Failed to create driverseat. Vehicle terminated.")
|
||
|
|
|
||
|
|
return
|
||
|
|
else
|
||
|
|
self:SetDriverSeat( Pod )
|
||
|
|
|
||
|
|
local DSPhys = Pod:GetPhysicsObject()
|
||
|
|
|
||
|
|
Pod:SetMoveType( MOVETYPE_NONE )
|
||
|
|
Pod:SetModel( "models/nova/airboat_seat.mdl" )
|
||
|
|
Pod:SetKeyValue( "vehiclescript","scripts/vehicles/prisoner_pod.txt" )
|
||
|
|
Pod:SetKeyValue( "limitview", 0 )
|
||
|
|
Pod:SetPos( self:LocalToWorld( Pos ) )
|
||
|
|
Pod:SetAngles( self:LocalToWorldAngles( Ang ) )
|
||
|
|
Pod:SetOwner( self )
|
||
|
|
Pod:Spawn()
|
||
|
|
Pod:Activate()
|
||
|
|
Pod:SetParent( self )
|
||
|
|
Pod:SetNotSolid( true )
|
||
|
|
Pod:SetColor( Color( 255, 255, 255, 0 ) )
|
||
|
|
Pod:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||
|
|
Pod:DrawShadow( false )
|
||
|
|
Pod.DoNotDuplicate = true
|
||
|
|
Pod:SetNWInt( "pPodIndex", 1 )
|
||
|
|
Pod:PhysicsDestroy()
|
||
|
|
|
||
|
|
debugoverlay.BoxAngles( Pod:GetPos(), Pod:OBBMins(), Pod:OBBMaxs(), Pod:GetAngles(), 5, Color( 255, 93, 0, 200 ) )
|
||
|
|
|
||
|
|
self:DeleteOnRemove( Pod )
|
||
|
|
|
||
|
|
self:TransferCPPI( Pod )
|
||
|
|
end
|
||
|
|
|
||
|
|
return Pod
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:AddPassengerSeat( Pos, Ang )
|
||
|
|
if not isvector( Pos ) or not isangle( Ang ) then return NULL end
|
||
|
|
|
||
|
|
local Pod = ents.Create( "prop_vehicle_prisoner_pod" )
|
||
|
|
|
||
|
|
if not IsValid( Pod ) then return NULL end
|
||
|
|
|
||
|
|
Pod:SetMoveType( MOVETYPE_NONE )
|
||
|
|
Pod:SetModel( "models/nova/airboat_seat.mdl" )
|
||
|
|
Pod:SetKeyValue( "vehiclescript","scripts/vehicles/prisoner_pod.txt" )
|
||
|
|
Pod:SetKeyValue( "limitview", 0 )
|
||
|
|
Pod:SetPos( self:LocalToWorld( Pos ) )
|
||
|
|
Pod:SetAngles( self:LocalToWorldAngles( Ang ) )
|
||
|
|
Pod:SetOwner( self )
|
||
|
|
Pod:Spawn()
|
||
|
|
Pod:Activate()
|
||
|
|
Pod:SetParent( self )
|
||
|
|
Pod:SetNotSolid( true )
|
||
|
|
Pod:SetColor( Color( 255, 255, 255, 0 ) )
|
||
|
|
Pod:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||
|
|
|
||
|
|
debugoverlay.BoxAngles( Pod:GetPos(), Pod:OBBMins(), Pod:OBBMaxs(), Pod:GetAngles(), 5, Color( 100, 65, 127, 200 ) )
|
||
|
|
|
||
|
|
Pod:DrawShadow( false )
|
||
|
|
Pod.DoNotDuplicate = true
|
||
|
|
|
||
|
|
self.pPodKeyIndex = self.pPodKeyIndex and self.pPodKeyIndex + 1 or 2
|
||
|
|
|
||
|
|
if self.WEAPONS[ self.pPodKeyIndex ] then
|
||
|
|
local weapon = Pod:lvsAddWeapon( self.pPodKeyIndex )
|
||
|
|
|
||
|
|
if IsValid( weapon ) then
|
||
|
|
self:TransferCPPI( weapon )
|
||
|
|
self:DeleteOnRemove( weapon )
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
Pod:SetNWInt( "pPodIndex", self.pPodKeyIndex )
|
||
|
|
Pod:PhysicsDestroy()
|
||
|
|
|
||
|
|
self:DeleteOnRemove( Pod )
|
||
|
|
self:TransferCPPI( Pod )
|
||
|
|
|
||
|
|
if not istable( self.pSeats ) then self.pSeats = {} end
|
||
|
|
|
||
|
|
table.insert( self.pSeats, Pod )
|
||
|
|
|
||
|
|
return Pod
|
||
|
|
end
|