add sborka
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:UpdatePoseParameters( steer )
|
||||
self:SetPoseParameter( "vehicle_steer", steer )
|
||||
self:SetPoseParameter( "kickstart", self:GetKickStarter() )
|
||||
end
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/bmw_r75/eng_start.wav", 75, 100, LVS.EngineVolume )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:EmitSound( "lvs/vehicles/bmw_r75/eng_stop.wav", 75, 100, LVS.EngineVolume )
|
||||
end
|
||||
@@ -0,0 +1,58 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
ENT.LeanAngleIdle = -10
|
||||
ENT.LeanAnglePark = 10
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
self:AddDriverSeat( Vector(-10,0,23), Angle(0,-90,0) )
|
||||
self:AddPassengerSeat( Vector(-25,0,24), Angle(0,-90,-5) )
|
||||
|
||||
self:AddEngine( Vector(14,0,10) )
|
||||
self:AddFuelTank( Vector(13.84,0,26.21), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL, Vector(-10,-5,-4),Vector(8,5,4) )
|
||||
|
||||
local WheelModel = "models/diggercars/bmw_r75/r75_wheel.mdl"
|
||||
|
||||
local FWheel = self:AddWheel( { hide = true, pos = Vector(38,0,12), mdl = WheelModel, mdl_ang = Angle(0,0,0), width = 2 } )
|
||||
local RWheel = self:AddWheel( { hide = true, pos = Vector(-14,0,11), mdl = WheelModel, mdl_ang = Angle(0,0,0), width = 2 } )
|
||||
|
||||
self:CreateRigControler( "fl", FWheel, 5, 13 )
|
||||
self:CreateRigControler( "rl", RWheel, 5, 13 )
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = { FWheel },
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 10000,
|
||||
SpringDamping = 800,
|
||||
SpringRelativeDamping = 800,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { RWheel },
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 10000,
|
||||
SpringDamping = 800,
|
||||
SpringRelativeDamping = 800,
|
||||
},
|
||||
} )
|
||||
end
|
||||
@@ -0,0 +1,148 @@
|
||||
|
||||
ENT.Base = "lvs_bike_wheeldrive"
|
||||
|
||||
ENT.PrintName = "BMW R75"
|
||||
ENT.Author = "Digger"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Military"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/bmw_r75/r75_bike.mdl"
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.MaxHealth = 500
|
||||
|
||||
ENT.MaxVelocity = 1250
|
||||
ENT.MaxVelocityReverse = 100
|
||||
|
||||
ENT.EngineCurve = 0.4
|
||||
ENT.EngineTorque = 250
|
||||
|
||||
ENT.TransGears = 4
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.KickStarter = true
|
||||
ENT.KickStarterSound = "lvs/vehicles/bmw_r75/moped_crank.wav"
|
||||
ENT.KickStarterMinAttempts = 2
|
||||
ENT.KickStarterMaxAttempts = 4
|
||||
ENT.KickStarterAttemptsInSeconds = 5
|
||||
|
||||
ENT.DriverBoneManipulateIdle = {
|
||||
["ValveBiped.Bip01_L_Thigh"] = Angle(-25,45,0),
|
||||
["ValveBiped.Bip01_L_Calf"] = Angle(0,-30,0),
|
||||
["ValveBiped.Bip01_L_Foot"] = Angle(0,0,0),
|
||||
}
|
||||
|
||||
ENT.DriverBoneManipulateParked = {
|
||||
["ValveBiped.Bip01_R_Thigh"] = Angle(25,45,0),
|
||||
["ValveBiped.Bip01_R_Calf"] = Angle(0,-30,0),
|
||||
["ValveBiped.Bip01_R_Foot"] = Angle(0,0,0),
|
||||
}
|
||||
|
||||
ENT.DriverBoneManipulateKickStart = {
|
||||
Start = {
|
||||
["ValveBiped.Bip01_L_Thigh"] = Angle(-20,60,25),
|
||||
["ValveBiped.Bip01_L_Calf"] = Angle(0,0,0),
|
||||
["ValveBiped.Bip01_L_Foot"] = Angle(0,-10,0),
|
||||
},
|
||||
End = {
|
||||
["ValveBiped.Bip01_L_Thigh"] = Angle(-20,-10,25),
|
||||
["ValveBiped.Bip01_L_Calf"] = Angle(0,70,0),
|
||||
["ValveBiped.Bip01_L_Foot"] = Angle(0,-10,0),
|
||||
},
|
||||
}
|
||||
|
||||
ENT.PlayerBoneManipulate = {
|
||||
[1] = {
|
||||
["ValveBiped.Bip01_Pelvis"] = Angle(0,0,23),
|
||||
|
||||
["ValveBiped.Bip01_R_Thigh"] = Angle(14,10,-5),
|
||||
["ValveBiped.Bip01_L_Thigh"] = Angle(-14,10,5),
|
||||
|
||||
["ValveBiped.Bip01_R_Calf"] = Angle(0,40,0),
|
||||
["ValveBiped.Bip01_L_Calf"] = Angle(0,40,0),
|
||||
|
||||
["ValveBiped.Bip01_R_Foot"] = Angle(0,-20,0),
|
||||
["ValveBiped.Bip01_L_Foot"] = Angle(0,-20,0),
|
||||
|
||||
["ValveBiped.Bip01_R_UpperArm"] = Angle(10,25,0),
|
||||
["ValveBiped.Bip01_L_UpperArm"] = Angle(-5,25,0),
|
||||
|
||||
["ValveBiped.Bip01_R_Forearm"] = Angle(0,-10,0),
|
||||
["ValveBiped.Bip01_L_Forearm"] = Angle(0,-10,0),
|
||||
},
|
||||
[2] = {
|
||||
["ValveBiped.Bip01_R_Thigh"] = Angle(14,10,0),
|
||||
["ValveBiped.Bip01_L_Thigh"] = Angle(-14,10,0),
|
||||
},
|
||||
}
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/bmw_r75/eng_idle.wav",
|
||||
Volume = 0.7,
|
||||
Pitch = 85,
|
||||
PitchMul = 50,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/bmw_r75/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 50,
|
||||
PitchMul = 50,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main+high",
|
||||
SubMaterialID = 0,
|
||||
Sprites = {
|
||||
{ pos = "lamp", colorB = 200, colorA = 150 },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main",
|
||||
Sprites = {
|
||||
{ pos = "back1", colorG = 0, colorB = 0, colorA = 150, width = 10, height = 10 },
|
||||
},
|
||||
ProjectedTextures = {
|
||||
{ pos = "lamp", ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
ProjectedTextures = {
|
||||
{ pos = "lamp", ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 4,
|
||||
},
|
||||
{
|
||||
Trigger = "brake",
|
||||
SubMaterialBrightness = 1,
|
||||
Sprites = {
|
||||
{ pos = "back1", colorG = 0, colorB = 0, colorA = 150, width = 20, height = 20 },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-38.43,-5,16),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:OnFrame()
|
||||
local Heat = 0
|
||||
if self:GetSelectedWeapon() == 1 then
|
||||
Heat = self:QuickLerp( "50cal_heat", self:GetNWHeat(), 10 )
|
||||
else
|
||||
Heat = self:QuickLerp( "50cal_heat", 0, 0.2 )
|
||||
end
|
||||
|
||||
local name = "halftrack_gunglow_"..self:EntIndex()
|
||||
|
||||
if not self.TurretGlow then
|
||||
self.TurretGlow = self:CreateSubMaterial( 4, name )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if self._oldGunHeat ~= Heat then
|
||||
self._oldGunHeat = Heat
|
||||
|
||||
self.TurretGlow:SetFloat("$detailblendfactor", Heat ^ 7 )
|
||||
|
||||
self:SetSubMaterial(4, "!"..name)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,86 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "sh_turret.lua" )
|
||||
AddCSLuaFile( "sh_tracks.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_turret.lua")
|
||||
include("sh_tracks.lua")
|
||||
|
||||
-- since this is based on a tank we need to reset these to default var values:
|
||||
ENT.DSArmorDamageReductionType = DMG_BULLET + DMG_CLUB
|
||||
ENT.DSArmorIgnoreDamageType = DMG_SONIC
|
||||
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local DriverSeat = self:AddDriverSeat( Vector(0,21,30), Angle(0,-90,0) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(15,-21,37), Angle(0,-90,10) )
|
||||
|
||||
self.HornSND = self:AddSoundEmitter( Vector(40,0,35), "lvs/horn3.wav" )
|
||||
self.HornSND:SetSoundLevel( 75 )
|
||||
self.HornSND:SetDoppler( true )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "left_door", Vector(20,30,48), Angle(0,0,0), Vector(-17,-3,-12), Vector(20,6,12), Vector(-17,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:LinkToSeat( DriverSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "right_door", Vector(20,-30,48), Angle(0,180,0), Vector(-17,-3,-12), Vector(20,6,12), Vector(-17,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "hatch", Vector(35,0,70), Angle(0,0,0), Vector(-10,-30,-10), Vector(10,30,10), Vector(-10,-30,-10), Vector(10,30,10) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "trunk", Vector(-115,0,60), Angle(0,0,0), Vector(-1,-15,-15), Vector(1,15,15), Vector(-30,-15,-15), Vector(1,15,15) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
|
||||
self:AddEngine( Vector(68,0,50) )
|
||||
self:AddFuelTank( Vector(55,0,18), Angle(0,0,0), 600, LVS.FUELTYPE_DIESEL )
|
||||
|
||||
self.SNDTurretMG = self:AddSoundEmitter( Vector(-63,0,85), "lvs/vehicles/halftrack/mc_loop.wav" )
|
||||
self.SNDTurretMG:SetSoundLevel( 95 )
|
||||
|
||||
local WheelModel = "models/diggercars/m5m16/m5_wheel.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0.5,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(81,-32,20),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(81,32,20),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:AddTrailerHitch( Vector(-121,0,25), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/halftrack/engine_start.wav" )
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
if SERVER then
|
||||
function ENT:TracksCreate( PObj )
|
||||
local WheelModel = "models/diggercars/m5m16/m5_wheel.mdl"
|
||||
|
||||
local L1 = self:AddWheel( { hide = true, pos = Vector(-37,32,23), mdl = WheelModel } )
|
||||
local L2 = self:AddWheel( { hide = true, pos = Vector(-75,32,23), mdl = WheelModel } )
|
||||
local LeftWheelChain = self:CreateWheelChain( {L1, L2} )
|
||||
self:SetTrackDriveWheelLeft( L1 )
|
||||
|
||||
local R1 = self:AddWheel( { hide = true, pos = Vector(-37,-32,23), mdl = WheelModel, mdl_ang = Angle(0,180,0) } )
|
||||
local R2 = self:AddWheel( { hide = true, pos = Vector(-75,-32,23), mdl = WheelModel, mdl_ang = Angle(0,180,0) } )
|
||||
local RightWheelChain = self:CreateWheelChain( {R1, R2} )
|
||||
self:SetTrackDriveWheelRight( R1 )
|
||||
|
||||
local LeftTracksArmor = self:AddArmor( Vector(-55,30,20), Angle(0,0,0), Vector(-50,-10,-25), Vector(50,10,15), 200, 1000 )
|
||||
self:SetTrackArmorLeft( LeftTracksArmor, LeftWheelChain )
|
||||
|
||||
local RightTracksArmor = self:AddArmor( Vector(-55,-30,20), Angle(0,0,0), Vector(-50,-10,-25), Vector(50,10,15), 200, 1000 )
|
||||
self:SetTrackArmorRight( RightTracksArmor, RightWheelChain )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.5,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R1, L1, L2, R2 },
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
end
|
||||
else
|
||||
ENT.TrackSystemEnable = true
|
||||
|
||||
ENT.TrackScrollTexture = "models/diggercars/m5m16/m5_tracks_right"
|
||||
ENT.ScrollTextureData = {
|
||||
["$bumpmap"] = "models/diggercars/shared/skin_nm",
|
||||
["$phong"] = "1",
|
||||
["$phongboost"] = "0.04",
|
||||
["$phongexponent"] = "3",
|
||||
["$phongfresnelranges"] = "[1 1 1]",
|
||||
["$translate"] = "[0.0 0.0 0.0]",
|
||||
["$colorfix"] = "{255 255 255}",
|
||||
["Proxies"] = {
|
||||
["TextureTransform"] = {
|
||||
["translateVar"] = "$translate",
|
||||
["centerVar"] = "$center",
|
||||
["resultVar"] = "$basetexturetransform",
|
||||
},
|
||||
["Equals"] = {
|
||||
["srcVar1"] = "$colorfix",
|
||||
["resultVar"] = "$color",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENT.TrackLeftSubMaterialID = 5
|
||||
ENT.TrackLeftSubMaterialMul = Vector(-0.0725,0,0)
|
||||
|
||||
ENT.TrackRightSubMaterialID = 6
|
||||
ENT.TrackRightSubMaterialMul = Vector(-0.0725,0,0)
|
||||
|
||||
ENT.TrackPoseParameterLeft = "spin_wheels_left"
|
||||
ENT.TrackPoseParameterLeftMul = -2
|
||||
|
||||
ENT.TrackPoseParameterRight = "spin_wheels_right"
|
||||
ENT.TrackPoseParameterRightMul = -2
|
||||
|
||||
ENT.TrackSounds = "lvs/vehicles/halftrack/tracks_loop.wav"
|
||||
ENT.TrackHull = Vector(5,5,5)
|
||||
ENT.TrackData = {}
|
||||
|
||||
for i = 1, 5 do
|
||||
for n = 0, 1 do
|
||||
local LR = n == 0 and "l" or "r"
|
||||
local LeftRight = n == 0 and "left" or "right"
|
||||
local data = {
|
||||
Attachment = {
|
||||
name = "vehicle_suspension_"..LR.."_"..i,
|
||||
toGroundDistance = 37,
|
||||
traceLength = 150,
|
||||
},
|
||||
PoseParameter = {
|
||||
name = "suspension_"..LeftRight.."_"..i,
|
||||
rangeMultiplier = -1.25,
|
||||
lerpSpeed = 25,
|
||||
}
|
||||
}
|
||||
table.insert( ENT.TrackData, data )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret.lua")
|
||||
|
||||
ENT.TurretAimRate = 50
|
||||
|
||||
ENT.TurretFakeBarrel = true
|
||||
ENT.TurretFakeBarrelRotationCenter = Vector(-63,0,85)
|
||||
|
||||
ENT.TurretRotationSound = "vehicles/tank_turret_loop1.wav"
|
||||
|
||||
ENT.TurretPitchPoseParameterName = "turret_pitch"
|
||||
ENT.TurretPitchMin = -30
|
||||
ENT.TurretPitchMax = 40
|
||||
ENT.TurretPitchMul = 1
|
||||
ENT.TurretPitchOffset = -10
|
||||
|
||||
ENT.TurretYawPoseParameterName = "turret_yaw"
|
||||
ENT.TurretYawMul = 1
|
||||
ENT.TurretYawOffset = 180
|
||||
|
||||
function ENT:TurretInRange()
|
||||
local ID = self:LookupAttachment( "muzzle_1" )
|
||||
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return true end
|
||||
|
||||
local Dir1 = Muzzle.Ang:Forward()
|
||||
local Dir2 = self:GetAimVector()
|
||||
|
||||
return self:AngleBetweenNormal( Dir1, Dir2 ) < 10
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
function ENT:UpdatePoseParameters( steer, speed_kmh, engine_rpm, throttle, brake, handbrake, clutch, gear, temperature, fuel, oil, ammeter )
|
||||
self:SetPoseParameter( "vehicle_steer", steer )
|
||||
self:CalcTurret()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,255 @@
|
||||
|
||||
ENT.Base = "lvs_tank_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Half-track"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Armored"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/m5m16/m5m16.mdl"
|
||||
|
||||
ENT.AITEAM = 2
|
||||
|
||||
ENT.MaxHealth = 650
|
||||
ENT.MaxHealthEngine = 400
|
||||
ENT.MaxHealthFuelTank = 100
|
||||
|
||||
--damage system
|
||||
ENT.CannonArmorPenetration = 2700
|
||||
ENT.CannonArmorPenetration1km = 1200
|
||||
|
||||
ENT.MaxVelocity = 700
|
||||
ENT.MaxVelocityReverse = 250
|
||||
|
||||
ENT.EngineCurve = 0
|
||||
ENT.EngineTorque = 175
|
||||
|
||||
ENT.TransGears = 3
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/halftrack/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/halftrack/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 50,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_REV_UP,
|
||||
UseDoppler = true,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/halftrack/eng_revdown_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 50,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_REV_DOWN,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(91.57,29.43,50.18),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(91.57,-29.43,50.18),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(91.57,29.43,50.18),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(91.57,-29.43,50.18),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
SubMaterialID = 2,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(96.81,19.99,49.67),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(96.81,-19.99,49.67),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(96.81,19.99,49.67),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(96.81,-19.99,49.67),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-49.71,-39.44,25.4),
|
||||
ang = Angle(0,-142.92,-24.29),
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:InitWeapons()
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/bullet.png")
|
||||
weapon.Ammo = 2000
|
||||
weapon.Delay = 0.02
|
||||
weapon.HeatRateUp = 0.25
|
||||
weapon.HeatRateDown = 0.15
|
||||
weapon.Attack = function( ent )
|
||||
if not ent:TurretInRange() then
|
||||
if IsValid( ent.SNDTurretMG ) then
|
||||
ent.SNDTurretMG:Stop()
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
ent._MuzzleID = ent._MuzzleID and ent._MuzzleID + 1 or 1
|
||||
|
||||
if ent._MuzzleID > 4 then
|
||||
ent._MuzzleID = 1
|
||||
end
|
||||
|
||||
local ID = ent:LookupAttachment( "muzzle_"..ent._MuzzleID )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local Pos = Muzzle.Pos
|
||||
local Dir = Muzzle.Ang:Forward()
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - Pos):GetNormalized()
|
||||
bullet.Spread = Vector(0.03,0.03,0.03)
|
||||
bullet.TracerName = "lvs_tracer_white"
|
||||
bullet.Force = ent.CannonArmorPenetration
|
||||
bullet.Force1km = ent.CannonArmorPenetration1km
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 1
|
||||
bullet.Damage = 35
|
||||
bullet.Velocity = 20000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
bullet.Callback = function(att, tr, dmginfo) end
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( Pos )
|
||||
effectdata:SetNormal( Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
|
||||
ent.SNDTurretMG:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
if not ent.SNDTurretMG:GetActive() then return end
|
||||
|
||||
ent.SNDTurretMG:Stop()
|
||||
ent.SNDTurretMG:EmitSound( "lvs/vehicles/halftrack/mc_lastshot.wav" )
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/vehicles/222/cannon_overheat.wav")
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = ent:TurretInRange() and Color(255,255,255,255) or Color(255,0,0,255)
|
||||
|
||||
ent:PaintCrosshairCenter( Pos2D, Col )
|
||||
ent:PaintCrosshairOuter( Pos2D, Col )
|
||||
ent:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/horn.png")
|
||||
weapon.Ammo = -1
|
||||
weapon.Delay = 0.5
|
||||
weapon.HeatRateUp = 0
|
||||
weapon.HeatRateDown = 0
|
||||
weapon.UseableByAI = false
|
||||
weapon.Attack = function( ent ) end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.HornSND ) then return end
|
||||
ent.HornSND:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.HornSND ) then return end
|
||||
ent.HornSND:Stop()
|
||||
end
|
||||
weapon.OnSelect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( false )
|
||||
end
|
||||
end
|
||||
weapon.OnDeselect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( true )
|
||||
end
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
ent:SetHeat( self.WEAPONS[1][ 1 ]._CurHeat or 0 )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
end
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
include("shared.lua")
|
||||
@@ -0,0 +1,109 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local DriverSeat = self:AddDriverSeat( Vector(-6.5,12,16.5), Angle(0,-95,-8) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(13,-12,22), Angle(0,-85,15) )
|
||||
local PassengerSeat1 = self:AddPassengerSeat( Vector(-22,12,22), Angle(0,-90,15) )
|
||||
local PassengerSeat2 = self:AddPassengerSeat( Vector(-22,-12,22), Angle(0,-90,15) )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "left_door", Vector(10,21,35), Angle(0,0,0), Vector(-10,-3,-12), Vector(20,6,12), Vector(-10,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( DriverSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "right_door", Vector(20,-21,35), Angle(0,180,0), Vector(-10,-3,-12), Vector(20,6,12), Vector(-10,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "rear_left_door", Vector(-20,21,35), Angle(0,0,0), Vector(-8,-3,-12), Vector(18,6,12), Vector(-8,-15,-12), Vector(18,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat1 )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "rear_right_door", Vector(-10,-21,35), Angle(0,180,0), Vector(-8,-3,-12), Vector(18,6,12), Vector(-8,-15,-12), Vector(18,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat2 )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "hatch", Vector(27.71,0,53), Angle(0,0,0), Vector(-5,-23,-5), Vector(5,23,7), Vector(-5,-23,-10), Vector(18,23,-3) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
|
||||
local FuelCap = self:AddDoorHandler( "fuel_cap", Vector(46.84,-15.13,45.95), Angle(0,90,-70), Vector(-2,-0.5,-2), Vector(2,2,2), Vector(-2,-3,-2), Vector(2,2,5) )
|
||||
FuelCap:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
FuelCap:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
|
||||
self:AddEngine( Vector(-56,0,37.5) )
|
||||
|
||||
local FuelTank = self:AddFuelTank( Vector(-57.06,0,18.92), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
FuelTank:SetDoorHandler( FuelCap )
|
||||
|
||||
local WheelModel = "models/diggercars/kubel/kubelwagen_wheel.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(53,-23,17.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(53,23,17.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-46.5,-25,15.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(-46.5,25,15.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:AddTrailerHitch( Vector(-74,0,16.5), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,98 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Kuebelwagen"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Military"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/kubel/kubelwagen.mdl"
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.MaxVelocity = 1200
|
||||
|
||||
ENT.EngineTorque = 150
|
||||
ENT.EngineCurve = 0.25
|
||||
|
||||
ENT.TransGears = 4
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.HornSound = "lvs/horn1.wav"
|
||||
ENT.HornPos = Vector(40,0,35)
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/kuebelwagen/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/kuebelwagen/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 100,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
Sprites = {
|
||||
{ pos = Vector(-71.74,20.47,40.6), colorG = 0, colorB = 0, colorA = 150 },
|
||||
{ pos = Vector(-71.74,-20.47,40.6), colorG = 0, colorB = 0, colorA = 150 },
|
||||
},
|
||||
ProjectedTextures = {
|
||||
{ pos = Vector(70.57,25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
{ pos = Vector(70.57,-25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
ProjectedTextures = {
|
||||
{ pos = Vector(70.57,25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
{ pos = Vector(70.57,-25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main+high",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
{ pos = Vector(70.57,25.1,33.49), colorB = 200, colorA = 150 },
|
||||
{ pos = Vector(70.57,-25.1,33.49), colorB = 200, colorA = 150 },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "brake",
|
||||
SubMaterialID = 2,
|
||||
Sprites = {
|
||||
{ pos = Vector(-71.36,20.51,39.48), colorG = 0, colorB = 0, colorA = 150 },
|
||||
{ pos = Vector(-71.36,-20.51,39.48), colorG = 0, colorB = 0, colorA = 150 },
|
||||
}
|
||||
},
|
||||
{
|
||||
Trigger = "fog",
|
||||
SubMaterialID = 3,
|
||||
Sprites = {
|
||||
{ pos = Vector(33.15,-25.63,48.61), colorB = 200, colorA = 150 },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-72.3,15.49,17.61),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:CalcViewPassenger( ply, pos, angles, fov, pod )
|
||||
|
||||
if pod ~= self:GetGunnerSeat() then
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
|
||||
if pod:GetThirdPersonMode() then
|
||||
local view = {}
|
||||
view.fov = fov
|
||||
view.drawviewer = true
|
||||
|
||||
local mn = self:OBBMins()
|
||||
local mx = self:OBBMaxs()
|
||||
local radius = ( mn - mx ):Length()
|
||||
local radius = radius + radius * pod:GetCameraDistance()
|
||||
|
||||
local clamped_angles = pod:WorldToLocalAngles( angles )
|
||||
clamped_angles.p = math.max( clamped_angles.p, -20 )
|
||||
clamped_angles = pod:LocalToWorldAngles( clamped_angles )
|
||||
|
||||
local StartPos = pos
|
||||
local EndPos = StartPos - clamped_angles:Forward() * radius + clamped_angles:Up() * (radius * pod:GetCameraHeight())
|
||||
|
||||
local WallOffset = 4
|
||||
|
||||
local tr = util.TraceHull( {
|
||||
start = StartPos,
|
||||
endpos = EndPos,
|
||||
filter = function( e )
|
||||
local c = e:GetClass()
|
||||
local collide = not c:StartWith( "prop_physics" ) and not c:StartWith( "prop_dynamic" ) and not c:StartWith( "prop_ragdoll" ) and not e:IsVehicle() and not c:StartWith( "gmod_" ) and not c:StartWith( "lvs_" ) and not c:StartWith( "player" ) and not e.LVS
|
||||
|
||||
return collide
|
||||
end,
|
||||
mins = Vector( -WallOffset, -WallOffset, -WallOffset ),
|
||||
maxs = Vector( WallOffset, WallOffset, WallOffset ),
|
||||
} )
|
||||
|
||||
view.angles = angles + Angle(5,0,0)
|
||||
view.origin = tr.HitPos + pod:GetUp() * 65
|
||||
|
||||
if tr.Hit and not tr.StartSolid then
|
||||
view.origin = view.origin + tr.HitNormal * WallOffset
|
||||
end
|
||||
|
||||
return view
|
||||
end
|
||||
|
||||
local ZoomAttach = self:GetAttachment( self:LookupAttachment( "zoom" ) )
|
||||
local EyeAttach = self:GetAttachment( self:LookupAttachment( "eye" ) )
|
||||
|
||||
if ZoomAttach and EyeAttach then
|
||||
local ZOOM = ply:lvsKeyDown( "ZOOM" )
|
||||
|
||||
local TargetZoom = ZOOM and 1 or 0
|
||||
|
||||
pod.smZoom = pod.smZoom and (pod.smZoom + (TargetZoom - pod.smZoom) * RealFrameTime() * 12) or 0
|
||||
|
||||
local Zoom = pod.smZoom
|
||||
local invZoom = 1 - Zoom
|
||||
|
||||
pos = ZoomAttach.Pos * Zoom + EyeAttach.Pos * invZoom
|
||||
end
|
||||
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
@@ -0,0 +1,119 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local DriverSeat = self:AddDriverSeat( Vector(-6.5,12,16.5), Angle(0,-95,-8) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(13,-12,22), Angle(0,-85,15) )
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(-30,0,18), Angle(0,-90,0) )
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
local PassengerSeat2 = self:AddPassengerSeat( Vector(-22,-12,22), Angle(0,-90,15) )
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sdkfz250/mg_loop.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "left_door", Vector(10,21,35), Angle(0,0,0), Vector(-10,-3,-12), Vector(20,6,12), Vector(-10,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( DriverSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "right_door", Vector(20,-21,35), Angle(0,180,0), Vector(-10,-3,-12), Vector(20,6,12), Vector(-10,-15,-12), Vector(20,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "rear_left_door", Vector(-20,21,35), Angle(0,0,0), Vector(-8,-3,-12), Vector(18,6,12), Vector(-8,-15,-12), Vector(18,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( GunnerSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "rear_right_door", Vector(-10,-21,35), Angle(0,180,0), Vector(-8,-3,-12), Vector(18,6,12), Vector(-8,-15,-12), Vector(18,30,12) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
DoorHandler:LinkToSeat( PassengerSeat2 )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "hatch", Vector(27.71,0,53), Angle(0,0,0), Vector(-5,-23,-5), Vector(5,23,7), Vector(-5,-23,-10), Vector(18,23,-3) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
|
||||
local FuelCap = self:AddDoorHandler( "fuel_cap", Vector(46.84,-15.13,45.95), Angle(0,90,-70), Vector(-2,-0.5,-2), Vector(2,2,2), Vector(-2,-3,-2), Vector(2,2,5) )
|
||||
FuelCap:SetSoundOpen( "lvs/vehicles/generic/car_door_open.wav" )
|
||||
FuelCap:SetSoundClose( "lvs/vehicles/generic/car_door_close.wav" )
|
||||
|
||||
self:AddEngine( Vector(-56,0,37.5) )
|
||||
|
||||
local FuelTank = self:AddFuelTank( Vector(-57.06,0,18.92), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
FuelTank:SetDoorHandler( FuelCap )
|
||||
|
||||
local WheelModel = "models/diggercars/kubel/kubelwagen_wheel.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(53,-23,17.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(53,23,17.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-46.5,-25,15.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(-46.5,25,15.5),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:AddTrailerHitch( Vector(-74,0,16.5), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,303 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Kuebelwagen MG34"
|
||||
ENT.Author = "Digger"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Military"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/kubel/kubelwagen_mg.mdl"
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.MaxVelocity = 1200
|
||||
|
||||
ENT.EngineTorque = 150
|
||||
ENT.EngineCurve = 0.25
|
||||
|
||||
ENT.TransGears = 4
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.HornSound = "lvs/horn1.wav"
|
||||
ENT.HornPos = Vector(40,0,35)
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/kuebelwagen/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/kuebelwagen/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 100,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
end
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
Sprites = {
|
||||
{ pos = Vector(-71.74,20.47,40.6), colorG = 0, colorB = 0, colorA = 150 },
|
||||
{ pos = Vector(-71.74,-20.47,40.6), colorG = 0, colorB = 0, colorA = 150 },
|
||||
},
|
||||
ProjectedTextures = {
|
||||
{ pos = Vector(70.57,25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
{ pos = Vector(70.57,-25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
ProjectedTextures = {
|
||||
{ pos = Vector(70.57,25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
{ pos = Vector(70.57,-25.1,33.49), ang = Angle(0,0,0), colorB = 200, colorA = 150, shadows = true },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main+high",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
{ pos = Vector(70.57,25.1,33.49), colorB = 200, colorA = 150 },
|
||||
{ pos = Vector(70.57,-25.1,33.49), colorB = 200, colorA = 150 },
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "brake",
|
||||
SubMaterialID = 2,
|
||||
Sprites = {
|
||||
{ pos = Vector(-71.36,20.51,39.48), colorG = 0, colorB = 0, colorA = 150 },
|
||||
{ pos = Vector(-71.36,-20.51,39.48), colorG = 0, colorB = 0, colorA = 150 },
|
||||
}
|
||||
},
|
||||
{
|
||||
Trigger = "fog",
|
||||
SubMaterialID = 3,
|
||||
Sprites = {
|
||||
{ pos = Vector(33.15,-25.63,48.61), colorB = 200, colorA = 150 },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-72.3,15.49,17.61),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:InitWeapons()
|
||||
self:AddGunnerWeapons()
|
||||
end
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
local pod = self:GetGunnerSeat()
|
||||
|
||||
if IsValid( pod ) and not pod:GetThirdPersonMode() then
|
||||
local ply = pod:GetDriver()
|
||||
|
||||
if IsValid( ply ) and ply:lvsKeyDown( "ZOOM" ) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 40
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local Muzzle = base:GetAttachment( base:LookupAttachment( "muzzle" ) )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
|
||||
local ply = ent:GetDriver()
|
||||
|
||||
if IsValid( ply ) and ply:lvsKeyDown( "ZOOM" ) then
|
||||
local pod = ply:GetVehicle()
|
||||
|
||||
if IsValid( pod ) and not pod:GetThirdPersonMode() then
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
else
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
end
|
||||
else
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
end
|
||||
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ply
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
base:PlayAnimation( "shot" )
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not ent:GetAI() and not IsValid( ent:GetDriver() ) then
|
||||
base:SetPoseParameter("f_pitch", 15 )
|
||||
base:SetPoseParameter("f_yaw", 0 )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("f_yaw", -Angles.y )
|
||||
base:SetPoseParameter("f_pitch", -Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
local pod = ply:GetVehicle()
|
||||
|
||||
if not IsValid( pod ) then return end
|
||||
|
||||
if not ply:lvsKeyDown( "ZOOM" ) or pod:GetThirdPersonMode() then
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
end
|
||||
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon, 3 )
|
||||
end
|
||||
|
||||
|
||||
function ENT:CalcMainActivityPassenger( ply )
|
||||
local GunnerSeat = self:GetGunnerSeat()
|
||||
|
||||
if not IsValid( GunnerSeat ) then return end
|
||||
|
||||
if GunnerSeat:GetDriver() ~= ply then return end
|
||||
|
||||
if ply.m_bWasNoclipping then
|
||||
ply.m_bWasNoclipping = nil
|
||||
ply:AnimResetGestureSlot( GESTURE_SLOT_CUSTOM )
|
||||
|
||||
if CLIENT then
|
||||
ply:SetIK( true )
|
||||
end
|
||||
end
|
||||
|
||||
ply.CalcIdeal = ACT_STAND
|
||||
ply.CalcSeqOverride = ply:LookupSequence( "cwalk_revolver" )
|
||||
|
||||
return ply.CalcIdeal, ply.CalcSeqOverride
|
||||
end
|
||||
|
||||
function ENT:UpdateAnimation( ply, velocity, maxseqgroundspeed )
|
||||
ply:SetPlaybackRate( 1 )
|
||||
|
||||
if CLIENT then
|
||||
local GunnerSeat = self:GetGunnerSeat()
|
||||
|
||||
if ply == self:GetDriver() then
|
||||
ply:SetPoseParameter( "vehicle_steer", self:GetSteer() / self:GetMaxSteerAngle() )
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
if IsValid( GunnerSeat ) and GunnerSeat:GetDriver() == ply then
|
||||
local Pitch = math.Remap( self:GetPoseParameter( "f_pitch" ),0,1,-15,-5)
|
||||
local Yaw = math.Remap( self:GetPoseParameter( "f_yaw" ),0,1,-25,25)
|
||||
|
||||
ply:SetPoseParameter( "aim_pitch", Pitch * 1.5 )
|
||||
ply:SetPoseParameter( "aim_yaw", Yaw * 1.5 )
|
||||
|
||||
ply:SetPoseParameter( "head_pitch", -Pitch * 2 )
|
||||
ply:SetPoseParameter( "head_yaw", -Yaw * 3 )
|
||||
|
||||
ply:SetPoseParameter( "move_x", 0 )
|
||||
ply:SetPoseParameter( "move_y", 0 )
|
||||
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
GAMEMODE:GrabEarAnimation( ply )
|
||||
GAMEMODE:MouthMoveAnimation( ply )
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
@@ -0,0 +1,38 @@
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
include("cl_optics.lua")
|
||||
include("cl_tankview.lua")
|
||||
|
||||
local switch = Material("lvs/weapons/change_ammo.png")
|
||||
local AP = Material("lvs/weapons/bullet_ap.png")
|
||||
local HE = Material("lvs/weapons/tank_cannon.png")
|
||||
function ENT:DrawWeaponIcon( PodID, ID, x, y, width, height, IsSelected, IconColor )
|
||||
local Icon = self:GetUseHighExplosive() and HE or AP
|
||||
|
||||
surface.SetMaterial( Icon )
|
||||
surface.DrawTexturedRect( x, y, width, height )
|
||||
|
||||
local ply = LocalPlayer()
|
||||
|
||||
if not IsValid( ply ) or self:GetSelectedWeapon() ~= 2 then return end
|
||||
|
||||
surface.SetMaterial( switch )
|
||||
surface.DrawTexturedRect( x + width + 5, y + 7, 24, 24 )
|
||||
|
||||
local buttonCode = ply:lvsGetControls()[ "CAR_SWAP_AMMO" ]
|
||||
|
||||
if not buttonCode then return end
|
||||
|
||||
local KeyName = input.GetKeyName( buttonCode )
|
||||
|
||||
if not KeyName then return end
|
||||
|
||||
draw.DrawText( KeyName, "DermaDefault", x + width + 17, y + height * 0.5 + 7, Color(0,0,0,IconColor.a), TEXT_ALIGN_CENTER )
|
||||
end
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/sherman/engine_start.wav", 75, 100, LVS.EngineVolume )
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,57 @@
|
||||
|
||||
ENT.OpticsFov = 30
|
||||
ENT.OpticsEnable = true
|
||||
ENT.OpticsZoomOnly = true
|
||||
ENT.OpticsFirstPerson = true
|
||||
ENT.OpticsThirdPerson = false
|
||||
ENT.OpticsPodIndex = {
|
||||
[1] = true,
|
||||
}
|
||||
|
||||
ENT.OpticsCrosshairMaterial = Material( "lvs/circle_filled.png" )
|
||||
ENT.OpticsCrosshairColor = Color(0,0,0,150)
|
||||
ENT.OpticsCrosshairSize = 4
|
||||
|
||||
local axis = Material( "lvs/axis.png" )
|
||||
local sight = Material( "lvs/shermansights.png" )
|
||||
local scope = Material( "lvs/scope_viewblocked.png" )
|
||||
|
||||
function ENT:PaintOpticsCrosshair( Pos2D )
|
||||
surface.SetMaterial( sight )
|
||||
surface.SetDrawColor( 0, 0, 0, 150 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 210, Pos2D.y - 23, 420, 420 )
|
||||
|
||||
surface.SetMaterial( axis )
|
||||
surface.SetDrawColor( 255, 255, 255, 25 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 7, Pos2D.y - 7, 16, 16 )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 8, Pos2D.y - 8, 16, 16 )
|
||||
end
|
||||
|
||||
function ENT:PaintOptics( Pos2D, Col, PodIndex, Type )
|
||||
local size = self.OpticsCrosshairSize
|
||||
|
||||
surface.SetMaterial( self.OpticsCrosshairMaterial )
|
||||
surface.SetDrawColor( self.OpticsCrosshairColor )
|
||||
surface.DrawTexturedRect( Pos2D.x - size * 0.5, Pos2D.y - size * 0.5, size, size )
|
||||
|
||||
if Type == 1 then
|
||||
self:DrawRotatedText( "MG", Pos2D.x + 30, Pos2D.y + 10, "LVS_FONT_PANEL", Color(0,0,0,220), 0)
|
||||
else
|
||||
self:DrawRotatedText( Type == 3 and "HE" or "AP", Pos2D.x + 30, Pos2D.y + 10, "LVS_FONT_PANEL", Color(0,0,0,220), 0)
|
||||
end
|
||||
|
||||
local ScrW = ScrW()
|
||||
local ScrH = ScrH()
|
||||
|
||||
local diameter = ScrH + 64
|
||||
local radius = diameter * 0.5
|
||||
|
||||
surface.SetMaterial( scope )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - radius, Pos2D.y - radius, diameter, diameter )
|
||||
|
||||
-- black bar left + right
|
||||
surface.DrawRect( 0, 0, Pos2D.x - radius, ScrH )
|
||||
surface.DrawRect( Pos2D.x + radius, 0, Pos2D.x - radius, ScrH )
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:TankViewOverride( ply, pos, angles, fov, pod )
|
||||
if ply == self:GetDriver() and not pod:GetThirdPersonMode() then
|
||||
local vieworigin, found = self:GetTurretViewOrigin()
|
||||
|
||||
if found then pos = vieworigin end
|
||||
end
|
||||
|
||||
return pos, angles, fov
|
||||
end
|
||||
@@ -0,0 +1,102 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "sh_tracks.lua" )
|
||||
AddCSLuaFile( "sh_turret.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "cl_optics.lua" )
|
||||
AddCSLuaFile( "cl_tankview.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local ID = self:LookupAttachment( "machinegun" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
local ID = self:LookupAttachment( "turret_machinegun" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMG = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMG:SetSoundLevel( 95 )
|
||||
self.SNDTurretMG:SetParent( self, ID )
|
||||
|
||||
local ID = self:LookupAttachment( "turret_cannon" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurret = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/cannon_fire.wav", "lvs/vehicles/sherman/cannon_fire.wav" )
|
||||
self.SNDTurret:SetSoundLevel( 95 )
|
||||
self.SNDTurret:SetParent( self, ID )
|
||||
|
||||
local DriverSeat = self:AddDriverSeat( Vector(0,0,60), Angle(0,-90,0) )
|
||||
DriverSeat.HidePlayer = true
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(88,-20,32), Angle(0,-90,0) )
|
||||
GunnerSeat.HidePlayer = true
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
self:AddEngine( Vector(-79.66,0,70), Angle(0,180,0) )
|
||||
self:AddFuelTank( Vector(-75,0,40), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL, Vector(0,-20,-18),Vector(18,20,18) )
|
||||
|
||||
-- extra front plate left
|
||||
self:AddArmor( Vector(82,20.5,65), Angle(-36,0,0), Vector(-1.2,-11,-12), Vector(1.2,11,12), 1200, self.FrontArmorExtra )
|
||||
-- extra front plate right
|
||||
self:AddArmor( Vector(82,-20.5,65), Angle(-36,0,0), Vector(-1.2,-11,-12), Vector(1.2,11,12), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- front upper wedge
|
||||
self:AddArmor( Vector(70,0,66), Angle(0,0,0), Vector(-26,-48,-16), Vector(26,48,16), 1000, self.FrontArmor )
|
||||
|
||||
-- transmission rib left
|
||||
self:AddArmor( Vector(102,12.6,35), Angle(0,0,0), Vector(-16,-1.5,-19), Vector(16,1.5,19), 1200, self.FrontArmorExtra )
|
||||
-- transmission rib right
|
||||
self:AddArmor( Vector(102,-11.8,35), Angle(0,0,0), Vector(-16,-1.5,-19), Vector(16,1.5,19), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- transmission
|
||||
self:AddArmor( Vector(110,1,34), Angle(0,0,0), Vector(-15,-32,-18), Vector(15,32,18), 1000, self.FrontArmor )
|
||||
|
||||
-- extra ammo armor right front
|
||||
self:AddArmor( Vector(50,-51,63), Angle(0,0,0), Vector(-14,-1,-9), Vector(14,1,9), 1200, self.FrontArmorExtra )
|
||||
-- extra ammo armor right rear
|
||||
self:AddArmor( Vector(1,-51,63), Angle(0,0,0), Vector(-14,-1,-10), Vector(14,1,10), 1200, self.FrontArmorExtra )
|
||||
-- extra ammo armor left
|
||||
self:AddArmor( Vector(50,51,63), Angle(0,0,0), Vector(-14,-1,-9), Vector(14,1,9), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- rear down
|
||||
self:AddArmor( Vector(-85,0,34), Angle(0,0,0), Vector(-6,-29,-18), Vector(6,29,18), 800, self.SideArmor )
|
||||
-- rear up
|
||||
self:AddArmor( Vector(-105,0,63), Angle(0,0,0), Vector(-3,-48,-13), Vector(3,48,13), 800, self.SideArmor )
|
||||
-- rear top
|
||||
self:AddArmor( Vector(-69,0,66), Angle(0,0,0), Vector(-33,-48,-10), Vector(33,48,10), 600, self.RoofArmor )
|
||||
|
||||
-- roof mid
|
||||
self:AddArmor( Vector(4,0,72), Angle(0,0,0), Vector(-40,-48,-4), Vector(40,48,4), 600, self.RoofArmor )
|
||||
|
||||
-- turret neck
|
||||
self:AddArmor( Vector(2,0,79), Angle(0,0,0), Vector(-42,-44,-3), Vector(42,44,3), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- right up
|
||||
self:AddArmor( Vector(-6,-49,63), Angle(0,0,0), Vector(-102,-1,-13), Vector(102,1,13), 800, self.SideArmor )
|
||||
-- left up
|
||||
self:AddArmor( Vector(-6,49.5,63), Angle(0,0,0), Vector(-102,-1.5,-13), Vector(102,1.5,13), 800, self.SideArmor )
|
||||
|
||||
-- right down
|
||||
self:AddArmor( Vector(2,-30,34), Angle(0,0,0), Vector(-93,-2,-18), Vector(93,2,18), 800, self.SideArmor )
|
||||
-- left down
|
||||
self:AddArmor( Vector(2,31,34), Angle(0,0,0), Vector(-93,-1,-18), Vector(93,1,18), 800, self.SideArmor )
|
||||
|
||||
-- shelf
|
||||
self:AddArmor( Vector(-29,0,51), Angle(0,0,0), Vector(-73,-48,-1), Vector(73,48,1), 600, self.RoofArmor )
|
||||
-- bottom
|
||||
self:AddArmor( Vector(8,0,17), Angle(0,0,0), Vector(-87,-29,-1), Vector(87,29,1), 600, self.RoofArmor )
|
||||
|
||||
-- turret
|
||||
local TurretArmor = self:AddArmor( Vector(2,0,95), Angle(0,0,0), Vector(-42,-44,-13), Vector(42,44,13), 1500, self.TurretArmor )
|
||||
TurretArmor:SetLabel( "Turret" )
|
||||
self:SetTurretArmor( TurretArmor )
|
||||
|
||||
-- ammo rack weakspot
|
||||
self:AddAmmoRack( Vector(0,40,64), Vector(-5,0,70), Angle(0,0,0), Vector(-18,-6,-9), Vector(18,6,9) )
|
||||
self:AddAmmoRack( Vector(0,-40,64), Vector(-5,0,70), Angle(0,0,0), Vector(-18,-6,-9), Vector(18,6,9) )
|
||||
|
||||
-- trailer hitch
|
||||
self:AddTrailerHitch( Vector(-100,0,24), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,183 @@
|
||||
|
||||
if SERVER then
|
||||
ENT.PivotSteerEnable = true
|
||||
ENT.PivotSteerByBrake = true
|
||||
ENT.PivotSteerWheelRPM = 40
|
||||
|
||||
ENT.TrackGibs = {
|
||||
["left"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/sherman_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,41.3,3),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
},
|
||||
["right"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/sherman_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,-41.3,3),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function ENT:OnLeftTrackRepaired()
|
||||
self:SetBodygroup(2,0)
|
||||
end
|
||||
|
||||
function ENT:OnLeftTrackDestroyed()
|
||||
self:SetBodygroup(2,1)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackRepaired()
|
||||
self:SetBodygroup(3,0)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackDestroyed()
|
||||
self:SetBodygroup(3,1)
|
||||
end
|
||||
|
||||
function ENT:TracksCreate( PObj )
|
||||
self:CreateTrackPhysics( "models/blu/tanks/sherman_tracks_col.mdl" )
|
||||
|
||||
local WheelModel = "models/props_vehicles/tire001b_truck.mdl"
|
||||
|
||||
local L1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(100,42,55), mdl = WheelModel } )
|
||||
local L2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(70,42,35), mdl = WheelModel } )
|
||||
local L3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(35,42,40), mdl = WheelModel } )
|
||||
local L4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(0,42,45), mdl = WheelModel } )
|
||||
local L5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-35,42,45), mdl = WheelModel } )
|
||||
local L6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-70,42,45), mdl = WheelModel } )
|
||||
local LeftWheelChain = self:CreateWheelChain( {L1, L2, L3, L4, L5, L6} )
|
||||
self:SetTrackDriveWheelLeft( L4 )
|
||||
|
||||
local R1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(100,-42,55), mdl = WheelModel } )
|
||||
local R2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(70,-42,35), mdl = WheelModel } )
|
||||
local R3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(35,-42,40), mdl = WheelModel } )
|
||||
local R4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(0,-42,45), mdl = WheelModel } )
|
||||
local R5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-35,-42,45), mdl = WheelModel } )
|
||||
local R6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-70,-42,45), mdl = WheelModel} )
|
||||
local RightWheelChain = self:CreateWheelChain( {R1, R2, R3, R4, R5, R6} )
|
||||
self:SetTrackDriveWheelRight( R4 )
|
||||
|
||||
local LeftTracksArmor = self:AddArmor( Vector(12,43,22), Angle(0,0,0), Vector(-121,-10,-28), Vector(121,10,28), 500, self.FrontArmor )
|
||||
self:SetTrackArmorLeft( LeftTracksArmor, LeftWheelChain )
|
||||
|
||||
local RightTracksArmor = self:AddArmor( Vector(12,-41,22), Angle(0,0,0), Vector(-121,-10,-28), Vector(121,10,28), 500, self.FrontArmor )
|
||||
self:SetTrackArmorRight( RightTracksArmor, RightWheelChain )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R1, L1, R2, L2 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R3, L3, L4, R4 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_REAR,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R5, L5, R6, L6 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
end
|
||||
else
|
||||
ENT.TrackSystemEnable = true
|
||||
|
||||
ENT.TrackScrollTexture = "models/blu/track_sherman"
|
||||
ENT.ScrollTextureData = {
|
||||
["$alphatest"] = "1",
|
||||
["$translate"] = "[0.0 0.0 0.0]",
|
||||
["$colorfix"] = "{255 255 255}",
|
||||
["Proxies"] = {
|
||||
["TextureTransform"] = {
|
||||
["translateVar"] = "$translate",
|
||||
["centerVar"] = "$center",
|
||||
["resultVar"] = "$basetexturetransform",
|
||||
},
|
||||
["Equals"] = {
|
||||
["srcVar1"] = "$colorfix",
|
||||
["resultVar"] = "$color",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENT.TrackLeftSubMaterialID = 1
|
||||
ENT.TrackLeftSubMaterialMul = Vector(0,0.0065,0)
|
||||
|
||||
ENT.TrackRightSubMaterialID = 2
|
||||
ENT.TrackRightSubMaterialMul = Vector(0,0.0065,0)
|
||||
|
||||
ENT.TrackPoseParameterLeft = "spin_wheels_left"
|
||||
ENT.TrackPoseParameterLeftMul = -1.252
|
||||
|
||||
ENT.TrackPoseParameterRight = "spin_wheels_right"
|
||||
ENT.TrackPoseParameterRightMul = -1.252
|
||||
|
||||
ENT.TrackSounds = "lvs/vehicles/sherman/tracks_loop.wav"
|
||||
ENT.TrackHull = Vector(20,20,20)
|
||||
ENT.TrackData = {}
|
||||
for i = 1, 6 do
|
||||
for n = 0, 1 do
|
||||
local LR = n == 0 and "l" or "r"
|
||||
local LeftRight = n == 0 and "left" or "right"
|
||||
local data = {
|
||||
Attachment = {
|
||||
name = "vehicle_suspension_"..LR.."_"..i,
|
||||
toGroundDistance = 41,
|
||||
traceLength = 100,
|
||||
},
|
||||
PoseParameter = {
|
||||
name = "suspension_"..LeftRight.."_"..i,
|
||||
rangeMultiplier = -1,
|
||||
lerpSpeed = 25,
|
||||
}
|
||||
}
|
||||
table.insert( ENT.TrackData, data )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret.lua")
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret_ballistics.lua")
|
||||
|
||||
ENT.TurretBallisticsPredicted = false -- sherman optics are not adjustable
|
||||
|
||||
ENT.TurretBallisticsProjectileVelocity = ENT.ProjectileVelocityCoaxial
|
||||
ENT.TurretBallisticsMuzzleAttachment = "turret_machinegun"
|
||||
ENT.TurretBallisticsViewAttachment = "sight"
|
||||
|
||||
ENT.TurretAimRate = 25
|
||||
|
||||
ENT.TurretRotationSound = "vehicles/tank_turret_loop1.wav"
|
||||
|
||||
ENT.TurretPitchPoseParameterName = "turret_pitch"
|
||||
ENT.TurretPitchMin = -15
|
||||
ENT.TurretPitchMax = 15
|
||||
ENT.TurretPitchMul = 1
|
||||
ENT.TurretPitchOffset = 0
|
||||
|
||||
ENT.TurretYawPoseParameterName = "turret_yaw"
|
||||
ENT.TurretYawMul = 1
|
||||
ENT.TurretYawOffset = 0
|
||||
@@ -0,0 +1,433 @@
|
||||
|
||||
ENT.Base = "lvs_tank_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Sherman"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Tanks"
|
||||
ENT.VehicleSubCategory = "Medium"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/blu/tanks/sherman_lvs.mdl"
|
||||
ENT.MDL_DESTROYED = "models/blu/tanks/sherman_gib_1.mdl"
|
||||
|
||||
ENT.GibModels = {
|
||||
"models/blu/tanks/sherman_gib_2.mdl",
|
||||
"models/blu/tanks/sherman_gib_3.mdl",
|
||||
"models/blu/tanks/sherman_gib_4.mdl",
|
||||
"models/blu/tanks/sherman_gib_6.mdl",
|
||||
"models/blu/tanks/sherman_gib_7.mdl",
|
||||
}
|
||||
|
||||
ENT.AITEAM = 2
|
||||
|
||||
ENT.MaxHealth = 1200
|
||||
|
||||
--damage system
|
||||
ENT.DSArmorIgnoreForce = 3000
|
||||
ENT.CannonArmorPenetration = 9200
|
||||
ENT.FrontArmor = 2000
|
||||
ENT.FrontArmorExtra = 4500
|
||||
ENT.SideArmor = 800
|
||||
ENT.TurretArmor = 3000
|
||||
ENT.RoofArmor = 100
|
||||
|
||||
-- ballistics
|
||||
ENT.ProjectileVelocityCoaxial = 15000
|
||||
ENT.ProjectileVelocityHighExplosive = 13000
|
||||
ENT.ProjectileVelocityArmorPiercing = 16000
|
||||
|
||||
ENT.SteerSpeed = 1
|
||||
ENT.SteerReturnSpeed = 2
|
||||
|
||||
ENT.PhysicsWeightScale = 2
|
||||
ENT.PhysicsDampingSpeed = 1000
|
||||
ENT.PhysicsInertia = Vector(6000,6000,1500)
|
||||
|
||||
ENT.MaxVelocity = 450
|
||||
ENT.MaxVelocityReverse = 150
|
||||
|
||||
ENT.EngineCurve = 0.1
|
||||
ENT.EngineTorque = 200
|
||||
|
||||
ENT.TransMinGearHoldTime = 0.1
|
||||
ENT.TransShiftSpeed = 0
|
||||
|
||||
ENT.TransGears = 3
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.MouseSteerAngle = 45
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/sherman/eng_idle_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 70,
|
||||
PitchMul = 30,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/sherman/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 20,
|
||||
PitchMul = 90,
|
||||
SoundLevel = 85,
|
||||
SoundType = LVS.SOUNDTYPE_NONE,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-90.47,17.01,52.77),
|
||||
ang = Angle(180,0,0)
|
||||
},
|
||||
{
|
||||
pos = Vector(-90.47,-17.01,52.77),
|
||||
ang = Angle(180,0,0)
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
self:AddDT( "Bool", "UseHighExplosive" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
-- coaxial machinegun
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "turret_machinegun" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = ent.ProjectileVelocityCoaxial
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Stop()
|
||||
end
|
||||
weapon.OnOverheat = function( ent ) ent:EmitSound("lvs/overheat.wav") end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "turret_machinegun" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairCenter( MuzzlePos2D, COLOR_WHITE )
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnSelect = function( ent )
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityCoaxial, "turret_machinegun" )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = true
|
||||
weapon.Ammo = 40
|
||||
weapon.Delay = 2.5
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 0.4
|
||||
weapon.OnThink = function( ent )
|
||||
if ent:GetSelectedWeapon() ~= 2 then return end
|
||||
|
||||
local ply = ent:GetDriver()
|
||||
|
||||
if not IsValid( ply ) then return end
|
||||
|
||||
local SwitchType = ply:lvsKeyDown( "CAR_SWAP_AMMO" )
|
||||
|
||||
if ent._oldSwitchType ~= SwitchType then
|
||||
ent._oldSwitchType = SwitchType
|
||||
|
||||
if SwitchType then
|
||||
ent:SetUseHighExplosive( not ent:GetUseHighExplosive() )
|
||||
ent:EmitSound("lvs/vehicles/sherman/cannon_unload.wav", 75, 100, 1, CHAN_WEAPON )
|
||||
ent:SetHeat( 1 )
|
||||
ent:SetOverheated( true )
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityHighExplosive )
|
||||
else
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityArmorPiercing )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "turret_cannon" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0,0,0)
|
||||
bullet.EnableBallistics = true
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
bullet.Force = 500
|
||||
bullet.HullSize = 15
|
||||
bullet.Damage = 250
|
||||
bullet.SplashDamage = 750
|
||||
bullet.SplashDamageRadius = 200
|
||||
bullet.SplashDamageEffect = "lvs_bullet_impact_explosive"
|
||||
bullet.SplashDamageType = DMG_BLAST
|
||||
bullet.Velocity = ent.ProjectileVelocityHighExplosive
|
||||
else
|
||||
bullet.Force = ent.CannonArmorPenetration
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 1000
|
||||
bullet.Velocity = ent.ProjectileVelocityArmorPiercing
|
||||
end
|
||||
|
||||
bullet.TracerName = "lvs_tracer_cannon"
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
local PhysObj = ent:GetPhysicsObject()
|
||||
if IsValid( PhysObj ) then
|
||||
PhysObj:ApplyForceOffset( -bullet.Dir * 150000, bullet.Src )
|
||||
end
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( ent.SNDTurret ) then return end
|
||||
|
||||
ent.SNDTurret:PlayOnce( 100 + math.cos( CurTime() + ent:EntIndex() * 1337 ) * 5 + math.Rand(-1,1), 1 )
|
||||
|
||||
ent:EmitSound("lvs/vehicles/sherman/cannon_reload.wav", 75, 100, 1, CHAN_WEAPON )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "turret_cannon" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:PaintCrosshairSquare( MuzzlePos2D, COLOR_WHITE )
|
||||
else
|
||||
ent:PaintCrosshairOuter( MuzzlePos2D, COLOR_WHITE )
|
||||
end
|
||||
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnSelect = function( ent )
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityHighExplosive, "turret_cannon" )
|
||||
else
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityArmorPiercing, "turret_cannon" )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
-- smoke
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/smoke_launcher.png")
|
||||
weapon.Ammo = 3
|
||||
weapon.Delay = 1
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 0.05
|
||||
weapon.Attack = function( ent )
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( ent:LocalToWorld( Vector(-92,0,51) ) )
|
||||
grenade:SetAngles( ent:GetAngles() )
|
||||
grenade:SetParent( ent )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:Enable()
|
||||
grenade:SetColor( Color(0,0,0,0) )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
-- turret rotation disabler
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/tank_noturret.png")
|
||||
weapon.Ammo = -1
|
||||
weapon.Delay = 0
|
||||
weapon.HeatRateUp = 0
|
||||
weapon.HeatRateDown = 0
|
||||
weapon.OnSelect = function( ent, old, new )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( false )
|
||||
end
|
||||
end
|
||||
weapon.OnDeselect = function( ent, old, new )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( true )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
self:AddGunnerWeapons()
|
||||
end
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 60
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local ID = base:LookupAttachment( "machinegun" )
|
||||
|
||||
local Muzzle = base:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( Muzzle.Ang:Forward() )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("machinegun_yaw", Angles.y )
|
||||
base:SetPoseParameter("machinegun_pitch", Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
self:AddWeapon( weapon, 2 )
|
||||
end
|
||||
@@ -0,0 +1,11 @@
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
include("cl_optics.lua")
|
||||
include("cl_tankview.lua")
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/sherman/engine_start.wav", 75, 100, LVS.EngineVolume )
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,51 @@
|
||||
|
||||
ENT.OpticsFov = 30
|
||||
ENT.OpticsEnable = true
|
||||
ENT.OpticsZoomOnly = true
|
||||
ENT.OpticsFirstPerson = true
|
||||
ENT.OpticsThirdPerson = false
|
||||
ENT.OpticsPodIndex = {
|
||||
[1] = true,
|
||||
}
|
||||
|
||||
ENT.OpticsCrosshairMaterial = Material( "lvs/circle_filled.png" )
|
||||
ENT.OpticsCrosshairColor = Color(0,0,0,150)
|
||||
ENT.OpticsCrosshairSize = 4
|
||||
|
||||
local axis = Material( "lvs/axis.png" )
|
||||
local sight = Material( "lvs/shermansights.png" )
|
||||
local scope = Material( "lvs/scope_viewblocked.png" )
|
||||
|
||||
function ENT:PaintOpticsCrosshair( Pos2D )
|
||||
surface.SetMaterial( sight )
|
||||
surface.SetDrawColor( 0, 0, 0, 150 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 210, Pos2D.y - 23, 420, 420 )
|
||||
|
||||
surface.SetMaterial( axis )
|
||||
surface.SetDrawColor( 255, 255, 255, 25 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 7, Pos2D.y - 7, 16, 16 )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 8, Pos2D.y - 8, 16, 16 )
|
||||
end
|
||||
|
||||
function ENT:PaintOptics( Pos2D, Col, PodIndex, Type )
|
||||
local size = self.OpticsCrosshairSize
|
||||
|
||||
surface.SetMaterial( self.OpticsCrosshairMaterial )
|
||||
surface.SetDrawColor( self.OpticsCrosshairColor )
|
||||
surface.DrawTexturedRect( Pos2D.x - size * 0.5, Pos2D.y - size * 0.5, size, size )
|
||||
|
||||
local ScrW = ScrW()
|
||||
local ScrH = ScrH()
|
||||
|
||||
local diameter = ScrH + 64
|
||||
local radius = diameter * 0.5
|
||||
|
||||
surface.SetMaterial( scope )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - radius, Pos2D.y - radius, diameter, diameter )
|
||||
|
||||
-- black bar left + right
|
||||
surface.DrawRect( 0, 0, Pos2D.x - radius, ScrH )
|
||||
surface.DrawRect( Pos2D.x + radius, 0, Pos2D.x - radius, ScrH )
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:TankViewOverride( ply, pos, angles, fov, pod )
|
||||
if ply == self:GetDriver() and not pod:GetThirdPersonMode() then
|
||||
local vieworigin, found = self:GetTurretViewOrigin()
|
||||
|
||||
if found then pos = vieworigin end
|
||||
end
|
||||
|
||||
return pos, angles, fov
|
||||
end
|
||||
@@ -0,0 +1,101 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "sh_tracks.lua" )
|
||||
AddCSLuaFile( "sh_turret.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "cl_optics.lua" )
|
||||
AddCSLuaFile( "cl_tankview.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local ID = self:LookupAttachment( "machinegun" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
self:SetBodygroup( 4, 1 )
|
||||
local FlameThrower = self:AddFlameEmitter( self, "muzzle_zippo" )
|
||||
--[[FlameThrower:SetFlameLifeTime( 1.5 )
|
||||
FlameThrower:SetFlameVelocity( 1000 )
|
||||
FlameThrower:SetFlameSize( 80 )
|
||||
FlameThrower:SetDamage( 100 )
|
||||
FlameThrower:SetFlameStartSound( "lvs/weapons/flame_start.wav" )
|
||||
FlameThrower:SetFlameStopSound( "lvs/weapons/flame_end.wav" )
|
||||
FlameThrower:SetFlameLoopSound( "lvs/weapons/flame_loop.wav" )]]
|
||||
self.WPNFlameThrower = FlameThrower
|
||||
|
||||
local DriverSeat = self:AddDriverSeat( Vector(0,0,60), Angle(0,-90,0) )
|
||||
DriverSeat.HidePlayer = true
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(88,-20,32), Angle(0,-90,0) )
|
||||
GunnerSeat.HidePlayer = true
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
self:AddEngine( Vector(-79.66,0,70), Angle(0,180,0) )
|
||||
self:AddFuelTank( Vector(-75,0,40), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL, Vector(0,-20,-18),Vector(18,20,18) )
|
||||
|
||||
-- extra front plate left
|
||||
self:AddArmor( Vector(82,20.5,65), Angle(-36,0,0), Vector(-1.2,-11,-12), Vector(1.2,11,12), 1200, self.FrontArmorExtra )
|
||||
-- extra front plate right
|
||||
self:AddArmor( Vector(82,-20.5,65), Angle(-36,0,0), Vector(-1.2,-11,-12), Vector(1.2,11,12), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- front upper wedge
|
||||
self:AddArmor( Vector(70,0,66), Angle(0,0,0), Vector(-26,-48,-16), Vector(26,48,16), 1000, self.FrontArmor )
|
||||
|
||||
-- transmission rib left
|
||||
self:AddArmor( Vector(102,12.6,35), Angle(0,0,0), Vector(-16,-1.5,-19), Vector(16,1.5,19), 1200, self.FrontArmorExtra )
|
||||
-- transmission rib right
|
||||
self:AddArmor( Vector(102,-11.8,35), Angle(0,0,0), Vector(-16,-1.5,-19), Vector(16,1.5,19), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- transmission
|
||||
self:AddArmor( Vector(110,1,34), Angle(0,0,0), Vector(-15,-32,-18), Vector(15,32,18), 1000, self.FrontArmor )
|
||||
|
||||
-- extra ammo armor right front
|
||||
self:AddArmor( Vector(50,-51,63), Angle(0,0,0), Vector(-14,-1,-9), Vector(14,1,9), 1200, self.FrontArmorExtra )
|
||||
-- extra ammo armor right rear
|
||||
self:AddArmor( Vector(1,-51,63), Angle(0,0,0), Vector(-14,-1,-10), Vector(14,1,10), 1200, self.FrontArmorExtra )
|
||||
-- extra ammo armor left
|
||||
self:AddArmor( Vector(50,51,63), Angle(0,0,0), Vector(-14,-1,-9), Vector(14,1,9), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- rear down
|
||||
self:AddArmor( Vector(-85,0,34), Angle(0,0,0), Vector(-6,-29,-18), Vector(6,29,18), 800, self.SideArmor )
|
||||
-- rear up
|
||||
self:AddArmor( Vector(-105,0,63), Angle(0,0,0), Vector(-3,-48,-13), Vector(3,48,13), 800, self.SideArmor )
|
||||
-- rear top
|
||||
self:AddArmor( Vector(-69,0,66), Angle(0,0,0), Vector(-33,-48,-10), Vector(33,48,10), 600, self.RoofArmor )
|
||||
|
||||
-- roof mid
|
||||
self:AddArmor( Vector(4,0,72), Angle(0,0,0), Vector(-40,-48,-4), Vector(40,48,4), 600, self.RoofArmor )
|
||||
|
||||
-- turret neck
|
||||
self:AddArmor( Vector(2,0,79), Angle(0,0,0), Vector(-42,-44,-3), Vector(42,44,3), 1200, self.FrontArmorExtra )
|
||||
|
||||
-- right up
|
||||
self:AddArmor( Vector(-6,-49,63), Angle(0,0,0), Vector(-102,-1,-13), Vector(102,1,13), 800, self.SideArmor )
|
||||
-- left up
|
||||
self:AddArmor( Vector(-6,49.5,63), Angle(0,0,0), Vector(-102,-1.5,-13), Vector(102,1.5,13), 800, self.SideArmor )
|
||||
|
||||
-- right down
|
||||
self:AddArmor( Vector(2,-30,34), Angle(0,0,0), Vector(-93,-2,-18), Vector(93,2,18), 800, self.SideArmor )
|
||||
-- left down
|
||||
self:AddArmor( Vector(2,31,34), Angle(0,0,0), Vector(-93,-1,-18), Vector(93,1,18), 800, self.SideArmor )
|
||||
|
||||
-- shelf
|
||||
self:AddArmor( Vector(-29,0,51), Angle(0,0,0), Vector(-73,-48,-1), Vector(73,48,1), 600, self.RoofArmor )
|
||||
-- bottom
|
||||
self:AddArmor( Vector(8,0,17), Angle(0,0,0), Vector(-87,-29,-1), Vector(87,29,1), 600, self.RoofArmor )
|
||||
|
||||
-- turret
|
||||
local TurretArmor = self:AddArmor( Vector(2,0,95), Angle(0,0,0), Vector(-42,-44,-13), Vector(42,44,13), 1500, self.TurretArmor )
|
||||
TurretArmor:SetLabel( "Turret" )
|
||||
self:SetTurretArmor( TurretArmor )
|
||||
|
||||
-- ammo rack weakspot
|
||||
self:AddAmmoRack( Vector(0,40,64), Vector(-5,0,70), Angle(0,0,0), Vector(-18,-6,-9), Vector(18,6,9) )
|
||||
self:AddAmmoRack( Vector(0,-40,64), Vector(-5,0,70), Angle(0,0,0), Vector(-18,-6,-9), Vector(18,6,9) )
|
||||
|
||||
-- trailer hitch
|
||||
self:AddTrailerHitch( Vector(-100,0,24), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,183 @@
|
||||
|
||||
if SERVER then
|
||||
ENT.PivotSteerEnable = true
|
||||
ENT.PivotSteerByBrake = true
|
||||
ENT.PivotSteerWheelRPM = 40
|
||||
|
||||
ENT.TrackGibs = {
|
||||
["left"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/sherman_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,41.3,3),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
},
|
||||
["right"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/sherman_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,-41.3,3),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function ENT:OnLeftTrackRepaired()
|
||||
self:SetBodygroup(2,0)
|
||||
end
|
||||
|
||||
function ENT:OnLeftTrackDestroyed()
|
||||
self:SetBodygroup(2,1)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackRepaired()
|
||||
self:SetBodygroup(3,0)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackDestroyed()
|
||||
self:SetBodygroup(3,1)
|
||||
end
|
||||
|
||||
function ENT:TracksCreate( PObj )
|
||||
self:CreateTrackPhysics( "models/blu/tanks/sherman_tracks_col.mdl" )
|
||||
|
||||
local WheelModel = "models/props_vehicles/tire001b_truck.mdl"
|
||||
|
||||
local L1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(100,42,55), mdl = WheelModel } )
|
||||
local L2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(70,42,35), mdl = WheelModel } )
|
||||
local L3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(35,42,40), mdl = WheelModel } )
|
||||
local L4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(0,42,45), mdl = WheelModel } )
|
||||
local L5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-35,42,45), mdl = WheelModel } )
|
||||
local L6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-70,42,45), mdl = WheelModel } )
|
||||
local LeftWheelChain = self:CreateWheelChain( {L1, L2, L3, L4, L5, L6} )
|
||||
self:SetTrackDriveWheelLeft( L4 )
|
||||
|
||||
local R1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(100,-42,55), mdl = WheelModel } )
|
||||
local R2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(70,-42,35), mdl = WheelModel } )
|
||||
local R3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(35,-42,40), mdl = WheelModel } )
|
||||
local R4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(0,-42,45), mdl = WheelModel } )
|
||||
local R5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-35,-42,45), mdl = WheelModel } )
|
||||
local R6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-70,-42,45), mdl = WheelModel} )
|
||||
local RightWheelChain = self:CreateWheelChain( {R1, R2, R3, R4, R5, R6} )
|
||||
self:SetTrackDriveWheelRight( R4 )
|
||||
|
||||
local LeftTracksArmor = self:AddArmor( Vector(12,43,22), Angle(0,0,0), Vector(-121,-10,-28), Vector(121,10,28), 500, self.FrontArmor )
|
||||
self:SetTrackArmorLeft( LeftTracksArmor, LeftWheelChain )
|
||||
|
||||
local RightTracksArmor = self:AddArmor( Vector(12,-41,22), Angle(0,0,0), Vector(-121,-10,-28), Vector(121,10,28), 500, self.FrontArmor )
|
||||
self:SetTrackArmorRight( RightTracksArmor, RightWheelChain )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R1, L1, R2, L2 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R3, L3, L4, R4 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_REAR,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R5, L5, R6, L6 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
end
|
||||
else
|
||||
ENT.TrackSystemEnable = true
|
||||
|
||||
ENT.TrackScrollTexture = "models/blu/track_sherman"
|
||||
ENT.ScrollTextureData = {
|
||||
["$alphatest"] = "1",
|
||||
["$translate"] = "[0.0 0.0 0.0]",
|
||||
["$colorfix"] = "{255 255 255}",
|
||||
["Proxies"] = {
|
||||
["TextureTransform"] = {
|
||||
["translateVar"] = "$translate",
|
||||
["centerVar"] = "$center",
|
||||
["resultVar"] = "$basetexturetransform",
|
||||
},
|
||||
["Equals"] = {
|
||||
["srcVar1"] = "$colorfix",
|
||||
["resultVar"] = "$color",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENT.TrackLeftSubMaterialID = 1
|
||||
ENT.TrackLeftSubMaterialMul = Vector(0,0.0065,0)
|
||||
|
||||
ENT.TrackRightSubMaterialID = 2
|
||||
ENT.TrackRightSubMaterialMul = Vector(0,0.0065,0)
|
||||
|
||||
ENT.TrackPoseParameterLeft = "spin_wheels_left"
|
||||
ENT.TrackPoseParameterLeftMul = -1.252
|
||||
|
||||
ENT.TrackPoseParameterRight = "spin_wheels_right"
|
||||
ENT.TrackPoseParameterRightMul = -1.252
|
||||
|
||||
ENT.TrackSounds = "lvs/vehicles/sherman/tracks_loop.wav"
|
||||
ENT.TrackHull = Vector(20,20,20)
|
||||
ENT.TrackData = {}
|
||||
for i = 1, 6 do
|
||||
for n = 0, 1 do
|
||||
local LR = n == 0 and "l" or "r"
|
||||
local LeftRight = n == 0 and "left" or "right"
|
||||
local data = {
|
||||
Attachment = {
|
||||
name = "vehicle_suspension_"..LR.."_"..i,
|
||||
toGroundDistance = 41,
|
||||
traceLength = 100,
|
||||
},
|
||||
PoseParameter = {
|
||||
name = "suspension_"..LeftRight.."_"..i,
|
||||
rangeMultiplier = -1,
|
||||
lerpSpeed = 25,
|
||||
}
|
||||
}
|
||||
table.insert( ENT.TrackData, data )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret.lua")
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret_ballistics.lua")
|
||||
|
||||
ENT.TurretBallisticsPredicted = false -- sherman optics are not adjustable
|
||||
|
||||
ENT.TurretBallisticsProjectileVelocity = 10000
|
||||
ENT.TurretBallisticsMuzzleAttachment = "turret_machinegun"
|
||||
ENT.TurretBallisticsViewAttachment = "turret_machinegun"
|
||||
|
||||
ENT.TurretAimRate = 25
|
||||
|
||||
ENT.TurretRotationSound = "vehicles/tank_turret_loop1.wav"
|
||||
|
||||
ENT.TurretPitchPoseParameterName = "turret_pitch"
|
||||
ENT.TurretPitchMin = -15
|
||||
ENT.TurretPitchMax = 15
|
||||
ENT.TurretPitchMul = 1
|
||||
ENT.TurretPitchOffset = 0
|
||||
|
||||
ENT.TurretYawPoseParameterName = "turret_yaw"
|
||||
ENT.TurretYawMul = 1
|
||||
ENT.TurretYawOffset = 0
|
||||
@@ -0,0 +1,308 @@
|
||||
|
||||
ENT.Base = "lvs_tank_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Sherman Zippo"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Tanks"
|
||||
ENT.VehicleSubCategory = "Medium"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/blu/tanks/sherman_lvs.mdl"
|
||||
ENT.MDL_DESTROYED = "models/blu/tanks/sherman_gib_1.mdl"
|
||||
|
||||
ENT.GibModels = {
|
||||
"models/blu/tanks/sherman_gib_2.mdl",
|
||||
"models/blu/tanks/sherman_gib_3.mdl",
|
||||
"models/blu/tanks/sherman_gib_4.mdl",
|
||||
"models/blu/tanks/sherman_gib_6.mdl",
|
||||
"models/blu/tanks/sherman_gib_7.mdl",
|
||||
}
|
||||
|
||||
ENT.AITEAM = 2
|
||||
|
||||
ENT.MaxHealth = 1200
|
||||
|
||||
--damage system
|
||||
ENT.DSArmorIgnoreForce = 3000
|
||||
ENT.CannonArmorPenetration = 9200
|
||||
ENT.FrontArmor = 2000
|
||||
ENT.FrontArmorExtra = 4500
|
||||
ENT.SideArmor = 800
|
||||
ENT.TurretArmor = 3000
|
||||
ENT.RoofArmor = 100
|
||||
|
||||
ENT.SteerSpeed = 1
|
||||
ENT.SteerReturnSpeed = 2
|
||||
|
||||
ENT.PhysicsWeightScale = 2
|
||||
ENT.PhysicsDampingSpeed = 1000
|
||||
ENT.PhysicsInertia = Vector(6000,6000,1500)
|
||||
|
||||
ENT.MaxVelocity = 450
|
||||
ENT.MaxVelocityReverse = 150
|
||||
|
||||
ENT.EngineCurve = 0.1
|
||||
ENT.EngineTorque = 200
|
||||
|
||||
ENT.TransMinGearHoldTime = 0.1
|
||||
ENT.TransShiftSpeed = 0
|
||||
|
||||
ENT.TransGears = 3
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.MouseSteerAngle = 45
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/sherman/eng_idle_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 70,
|
||||
PitchMul = 30,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/sherman/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 20,
|
||||
PitchMul = 90,
|
||||
SoundLevel = 85,
|
||||
SoundType = LVS.SOUNDTYPE_NONE,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-90.47,17.01,52.77),
|
||||
ang = Angle(180,0,0)
|
||||
},
|
||||
{
|
||||
pos = Vector(-90.47,-17.01,52.77),
|
||||
ang = Angle(180,0,0)
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
-- flamethrower
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/flamethrower.png")
|
||||
weapon.Ammo = 4000
|
||||
weapon.Delay = 0.05
|
||||
weapon.HeatRateUp = 0.25
|
||||
weapon.HeatRateDown = 0.5
|
||||
weapon.Attack = function( ent )
|
||||
ent:TakeAmmo( 1 )
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.WPNFlameThrower ) then return end
|
||||
ent.WPNFlameThrower:SetAttacker( ent:GetDriver() )
|
||||
ent.WPNFlameThrower:Enable()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.WPNFlameThrower ) then return end
|
||||
ent.WPNFlameThrower:Disable()
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "turret_cannon" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairOuter( MuzzlePos2D, COLOR_WHITE )
|
||||
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
-- smoke
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/smoke_launcher.png")
|
||||
weapon.Ammo = 6
|
||||
weapon.Delay = 1
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 0.2
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "turret_cannon" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
ent:EmitSound("lvs/vehicles/sherman/cannon_reload.wav", 75, 100, 1, CHAN_WEAPON )
|
||||
ent:EmitSound("lvs/smokegrenade.wav")
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( Muzzle.Pos )
|
||||
grenade:SetAngles( Muzzle.Ang )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:GetPhysicsObject():SetVelocity( Muzzle.Ang:Forward() * 2000 )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "turret_cannon" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairSquare( MuzzlePos2D, COLOR_WHITE )
|
||||
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
-- turret rotation disabler
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/tank_noturret.png")
|
||||
weapon.Ammo = -1
|
||||
weapon.Delay = 0
|
||||
weapon.HeatRateUp = 0
|
||||
weapon.HeatRateDown = 0
|
||||
weapon.OnSelect = function( ent, old, new )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( false )
|
||||
end
|
||||
end
|
||||
weapon.OnDeselect = function( ent, old, new )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( true )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
self:AddGunnerWeapons()
|
||||
end
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 60
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local ID = base:LookupAttachment( "machinegun" )
|
||||
|
||||
local Muzzle = base:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( Muzzle.Ang:Forward() )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("machinegun_yaw", Angles.y )
|
||||
base:SetPoseParameter("machinegun_pitch", Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
self:AddWeapon( weapon, 2 )
|
||||
end
|
||||
@@ -0,0 +1,59 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_attachable_playermodels.lua")
|
||||
|
||||
function ENT:DrawDriver()
|
||||
local pod = self:GetDriverSeat()
|
||||
|
||||
if not IsValid( pod ) then self:RemovePlayerModel( "driver" ) return end
|
||||
|
||||
local plyL = LocalPlayer()
|
||||
local ply = pod:GetDriver()
|
||||
|
||||
if not IsValid( ply ) or (ply == plyL and not pod:GetThirdPersonMode()) then self:RemovePlayerModel( "driver" ) return end
|
||||
|
||||
local ID = self:LookupAttachment( "seat1" )
|
||||
local Att = self:GetAttachment( ID )
|
||||
|
||||
if not Att then self:RemovePlayerModel( "driver" ) return end
|
||||
|
||||
local Pos,Ang = LocalToWorld( Vector(10,-5,0), Angle(0,20,-90), Att.Pos, Att.Ang )
|
||||
|
||||
local model = self:CreatePlayerModel( ply, "driver" )
|
||||
|
||||
model:SetSequence( "sit" )
|
||||
model:SetRenderOrigin( Pos )
|
||||
model:SetRenderAngles( Ang )
|
||||
model:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:DrawGunner()
|
||||
local pod = self:GetGunnerSeat()
|
||||
|
||||
if not IsValid( pod ) then self:RemovePlayerModel( "passenger" ) return end
|
||||
|
||||
local plyL = LocalPlayer()
|
||||
local ply = pod:GetDriver()
|
||||
|
||||
if not IsValid( ply ) or (ply == plyL and not pod:GetThirdPersonMode()) then self:RemovePlayerModel( "passenger" ) return end
|
||||
|
||||
local ID = self:LookupAttachment( "seat2" )
|
||||
local Att = self:GetAttachment( ID )
|
||||
|
||||
if not Att then self:RemovePlayerModel( "passenger" ) return end
|
||||
|
||||
local Pos,Ang = LocalToWorld( Vector(10,-5,0), Angle(0,20,-90), Att.Pos, Att.Ang )
|
||||
|
||||
local model = self:CreatePlayerModel( ply, "passenger" )
|
||||
|
||||
model:SetSequence( "sit" )
|
||||
model:SetRenderOrigin( Pos )
|
||||
model:SetRenderAngles( Ang )
|
||||
model:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:PreDraw()
|
||||
self:DrawDriver()
|
||||
self:DrawGunner()
|
||||
|
||||
return true
|
||||
end
|
||||
@@ -0,0 +1,47 @@
|
||||
include("shared.lua")
|
||||
include("sh_turret.lua")
|
||||
include("cl_tankview.lua")
|
||||
include("cl_attached_playermodels.lua")
|
||||
|
||||
function ENT:OnFrame()
|
||||
local Heat1 = 0
|
||||
if self:GetSelectedWeapon() == 2 then
|
||||
Heat1 = self:QuickLerp( "cannon_heat", self:GetNWHeat(), 10 )
|
||||
else
|
||||
Heat1 = self:QuickLerp( "cannon_heat", 0, 0.25 )
|
||||
end
|
||||
local name = "spaehwagen_cannonglow_"..self:EntIndex()
|
||||
if not self.TurretGlow1 then
|
||||
self.TurretGlow1 = self:CreateSubMaterial( 3, name )
|
||||
|
||||
return
|
||||
end
|
||||
if self._oldGunHeat1 ~= Heat1 then
|
||||
self._oldGunHeat1 = Heat1
|
||||
|
||||
self.TurretGlow1:SetFloat("$detailblendfactor", Heat1 ^ 7 )
|
||||
|
||||
self:SetSubMaterial(3, "!"..name)
|
||||
end
|
||||
|
||||
|
||||
local Heat2 = 0
|
||||
if self:GetSelectedWeapon() == 1 then
|
||||
Heat2 = self:QuickLerp( "mg_heat", self:GetNWHeat(), 10 )
|
||||
else
|
||||
Heat2 = self:QuickLerp( "mg_heat", 0, 0.25 )
|
||||
end
|
||||
local name = "spaehwagen_mgglow_"..self:EntIndex()
|
||||
if not self.TurretGlow2 then
|
||||
self.TurretGlow2 = self:CreateSubMaterial( 2, name )
|
||||
|
||||
return
|
||||
end
|
||||
if self._oldGunHeat2 ~= Heat2 then
|
||||
self._oldGunHeat2 = Heat2
|
||||
|
||||
self.TurretGlow2:SetFloat("$detailblendfactor", Heat2 ^ 7 )
|
||||
|
||||
self:SetSubMaterial(2, "!"..name)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,30 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:TankViewOverride( ply, pos, angles, fov, pod )
|
||||
if ply == self:GetDriver() and not pod:GetThirdPersonMode() then
|
||||
local ID = self:LookupAttachment( "seat1" )
|
||||
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
pos = Muzzle.Pos - Muzzle.Ang:Right() * 25
|
||||
end
|
||||
end
|
||||
|
||||
return pos, angles, fov
|
||||
end
|
||||
|
||||
function ENT:CalcViewPassenger( ply, pos, angles, fov, pod )
|
||||
if pod == self:GetGunnerSeat() and not pod:GetThirdPersonMode() then
|
||||
local ID = self:LookupAttachment( "seat2" )
|
||||
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
pos = Muzzle.Pos - Muzzle.Ang:Right() * 25
|
||||
end
|
||||
end
|
||||
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
@@ -0,0 +1,100 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "cl_tankview.lua" )
|
||||
AddCSLuaFile( "cl_attached_playermodels.lua" )
|
||||
AddCSLuaFile( "sh_turret.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_turret.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local DriverSeat = self:AddDriverSeat( Vector(0,-15,30), Angle(0,0,0) )
|
||||
DriverSeat.HidePlayer = true
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(0,-15,30), Angle(0,0,0) )
|
||||
GunnerSeat.HidePlayer = true
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle_mg" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMG = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMG:SetSoundLevel( 95 )
|
||||
self.SNDTurretMG:SetParent( self, ID )
|
||||
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle_turret" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurret = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/222/cannon_fire.wav", "lvs/vehicles/222/cannon_fire_interior.wav" )
|
||||
self.SNDTurret:SetSoundLevel( 95 )
|
||||
self.SNDTurret:SetParent( self, ID )
|
||||
|
||||
|
||||
self:AddEngine( Vector(0,-60,51), Angle(0,-90,0) )
|
||||
self:AddFuelTank( Vector(0,-63,25), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
|
||||
local WheelModel = "models/diggercars/222/222_wheel.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,90,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 22,
|
||||
TorqueFactor = 0.4,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-35,70,18),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,-90,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(35,70,18),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,90,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,90,0),
|
||||
SteerType = LVS.WHEEL_STEER_REAR,
|
||||
SteerAngle = 8,
|
||||
TorqueFactor = 0.6,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-35,-45,14),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,-90,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(35,-45,14),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,90,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:AddTrailerHitch( Vector(0,-85,25), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret.lua")
|
||||
|
||||
ENT.TurretAimRate = 50
|
||||
|
||||
ENT.TurretRotationSound = "vehicles/tank_turret_loop1.wav"
|
||||
|
||||
ENT.TurretPitchPoseParameterName = "turret_pitch"
|
||||
ENT.TurretPitchMin = -20
|
||||
ENT.TurretPitchMax = 40
|
||||
ENT.TurretPitchMul = -1
|
||||
ENT.TurretPitchOffset = 0
|
||||
|
||||
ENT.TurretYawPoseParameterName = "turret_yaw"
|
||||
ENT.TurretYawMul = -1
|
||||
ENT.TurretYawOffset = 90
|
||||
@@ -0,0 +1,301 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Panzerspaehwagen"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Armored"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/222/222.mdl"
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.MaxHealth = 750
|
||||
ENT.MaxHealthEngine = 400
|
||||
ENT.MaxHealthFuelTank = 100
|
||||
|
||||
--damage system
|
||||
ENT.DSArmorIgnoreForce = 1200
|
||||
ENT.CannonArmorPenetration = 3900
|
||||
|
||||
|
||||
ENT.MaxVelocity = 1000
|
||||
|
||||
ENT.EngineCurve = 0.2
|
||||
ENT.EngineTorque = 200
|
||||
|
||||
ENT.TransGears = 5
|
||||
ENT.TransGearsReverse = 5
|
||||
|
||||
ENT.FastSteerAngleClamp = 5
|
||||
ENT.FastSteerDeactivationDriftAngle = 12
|
||||
|
||||
ENT.PhysicsWeightScale = 1.5
|
||||
ENT.PhysicsDampingForward = true
|
||||
ENT.PhysicsDampingReverse = true
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/222/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/222/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 70,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(-21.76,92.74,44.5),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(21.76,92.74,44.5),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(-21.76,92.74,44.5),
|
||||
ang = Angle(0,90,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(21.76,92.74,44.5),
|
||||
ang = Angle(0,90,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(-21.76,92.74,44.5),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(21.76,92.74,44.5),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(-21.76,92.74,44.5),
|
||||
ang = Angle(0,90,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(21.76,92.74,44.5),
|
||||
ang = Angle(0,90,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "muzzle_mg" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Stop()
|
||||
end
|
||||
weapon.OnOverheat = function( ent ) ent:EmitSound("lvs/overheat.wav") end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "muzzle_mg" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairCenter( MuzzlePos2D, COLOR_WHITE )
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/bullet_ap.png")
|
||||
weapon.Ammo = 250
|
||||
weapon.Delay = 0.25
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.2
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "muzzle_turret" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_autocannon"
|
||||
bullet.Force = ent.CannonArmorPenetration
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 100
|
||||
bullet.Velocity = 14000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:PlayAnimation( "turret_fire" )
|
||||
|
||||
local PhysObj = ent:GetPhysicsObject()
|
||||
if IsValid( PhysObj ) then
|
||||
PhysObj:ApplyForceOffset( -bullet.Dir * 10000, bullet.Src )
|
||||
end
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( ent.SNDTurret ) then return end
|
||||
|
||||
ent.SNDTurret:PlayOnce( 100 + math.cos( CurTime() + ent:EntIndex() * 1337 ) * 5 + math.Rand(-1,1), 1 )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "muzzle_turret" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairOuter( MuzzlePos2D, COLOR_WHITE )
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/vehicles/222/cannon_overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/tank_noturret.png")
|
||||
weapon.Ammo = -1
|
||||
weapon.Delay = 0
|
||||
weapon.HeatRateUp = 0
|
||||
weapon.HeatRateDown = 0
|
||||
weapon.OnSelect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( false )
|
||||
end
|
||||
end
|
||||
weapon.OnDeselect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( true )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
end
|
||||
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-20.98,-56.09,17.55),
|
||||
ang = Angle(90,0,0),
|
||||
},
|
||||
{
|
||||
pos = Vector(20.98,-56.09,17.55),
|
||||
ang = Angle(90,0,0),
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
include("cl_optics.lua")
|
||||
include("cl_tankview.lua")
|
||||
|
||||
local switch = Material("lvs/weapons/change_ammo.png")
|
||||
local AP = Material("lvs/weapons/bullet_ap.png")
|
||||
local HE = Material("lvs/weapons/tank_cannon.png")
|
||||
function ENT:DrawWeaponIcon( PodID, ID, x, y, width, height, IsSelected, IconColor )
|
||||
local Icon = self:GetUseHighExplosive() and HE or AP
|
||||
|
||||
surface.SetMaterial( Icon )
|
||||
surface.DrawTexturedRect( x, y, width, height )
|
||||
|
||||
local ply = LocalPlayer()
|
||||
|
||||
if not IsValid( ply ) or self:GetSelectedWeapon() ~= 2 then return end
|
||||
|
||||
surface.SetMaterial( switch )
|
||||
surface.DrawTexturedRect( x + width + 5, y + 7, 24, 24 )
|
||||
|
||||
local buttonCode = ply:lvsGetControls()[ "CAR_SWAP_AMMO" ]
|
||||
|
||||
if not buttonCode then return end
|
||||
|
||||
local KeyName = input.GetKeyName( buttonCode )
|
||||
|
||||
if not KeyName then return end
|
||||
|
||||
draw.DrawText( KeyName, "DermaDefault", x + width + 17, y + height * 0.5 + 7, Color(0,0,0,IconColor.a), TEXT_ALIGN_CENTER )
|
||||
end
|
||||
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/tiger/engine_start.wav", 75, 100, LVS.EngineVolume )
|
||||
else
|
||||
self:EmitSound( "lvs/vehicles/tiger/engine_stop.wav", 75, 100, LVS.EngineVolume )
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,152 @@
|
||||
|
||||
ENT.OpticsFov = 30
|
||||
ENT.OpticsEnable = true
|
||||
ENT.OpticsZoomOnly = true
|
||||
ENT.OpticsFirstPerson = true
|
||||
ENT.OpticsThirdPerson = false
|
||||
ENT.OpticsPodIndex = {
|
||||
[1] = true,
|
||||
}
|
||||
|
||||
ENT.OpticsCrosshairMaterial = Material( "lvs/circle_filled.png" )
|
||||
ENT.OpticsCrosshairColor = Color(0,0,0,150)
|
||||
ENT.OpticsCrosshairSize = 4
|
||||
|
||||
ENT.OpticsProjectileSize = 7.5
|
||||
|
||||
local OldTargetOffset = 0
|
||||
local RotationOffset = 0
|
||||
local circle = Material( "lvs/circle_hollow.png" )
|
||||
local tri1 = Material( "lvs/triangle1.png" )
|
||||
local tri2 = Material( "lvs/triangle2.png" )
|
||||
local pointer = Material( "gui/point.png" )
|
||||
local scope = Material( "lvs/scope_viewblocked.png" )
|
||||
|
||||
function ENT:PaintOpticsCrosshair( Pos2D )
|
||||
surface.SetDrawColor( 255, 255, 255, 5 )
|
||||
surface.SetMaterial( tri1 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 17, Pos2D.y - 1, 32, 32 )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 16, Pos2D.y, 32, 32 )
|
||||
|
||||
for i = -3, 3, 1 do
|
||||
if i == 0 then continue end
|
||||
|
||||
surface.SetMaterial( tri2 )
|
||||
surface.SetDrawColor( 255, 255, 255, 5 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 11 + i * 32, Pos2D.y - 1, 20, 20 )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - 10 + i * 32, Pos2D.y, 20, 20 )
|
||||
end
|
||||
|
||||
local ScrH = ScrH()
|
||||
|
||||
local Y = Pos2D.y + 64
|
||||
local height = ScrH - Y
|
||||
|
||||
surface.SetDrawColor( 0, 0, 0, 100 )
|
||||
surface.DrawRect( Pos2D.x - 2, Y, 4, height )
|
||||
end
|
||||
|
||||
function ENT:PaintOptics( Pos2D, Col, PodIndex, Type )
|
||||
|
||||
if Type == 1 then
|
||||
self:DrawRotatedText( "MG", Pos2D.x + 30, Pos2D.y + 30, "LVS_FONT_PANEL", Color(0,0,0,220), 0)
|
||||
else
|
||||
self:DrawRotatedText( Type == 3 and "HE" or "AP", Pos2D.x + 30, Pos2D.y + 30, "LVS_FONT_PANEL", Color(0,0,0,220), 0)
|
||||
end
|
||||
|
||||
local size = self.OpticsCrosshairSize
|
||||
|
||||
surface.SetMaterial( self.OpticsCrosshairMaterial )
|
||||
surface.SetDrawColor( self.OpticsCrosshairColor )
|
||||
surface.DrawTexturedRect( Pos2D.x - size * 0.5, Pos2D.y - size * 0.5, size, size )
|
||||
|
||||
local ScrW = ScrW()
|
||||
local ScrH = ScrH()
|
||||
|
||||
surface.SetDrawColor( 0, 0, 0, 200 )
|
||||
|
||||
local TargetOffset = self:GetSelectedWeapon() == 1 and 150 or 0
|
||||
|
||||
if OldTargetOffset ~= TargetOffset then
|
||||
OldTargetOffset = TargetOffset
|
||||
surface.PlaySound( "lvs/optics.wav" )
|
||||
end
|
||||
|
||||
RotationOffset = RotationOffset + (TargetOffset + math.max( self:GetTurretCompensation() / 15, -130 ) - RotationOffset) * RealFrameTime() * 8
|
||||
|
||||
local R = ScrH * 0.5 - 64
|
||||
local R0 = R + 30
|
||||
local R1 = R - 8
|
||||
local R2 = R - 23
|
||||
local R3 = R - 30
|
||||
local R4 = R - 18
|
||||
|
||||
for i = 0, 40 do
|
||||
local ang = -90 + (180 / 40) * i + RotationOffset
|
||||
|
||||
local x = math.cos( math.rad( ang ) )
|
||||
local y = math.sin( math.rad( ang ) )
|
||||
|
||||
if i == 2 then
|
||||
self:DrawRotatedText( self.OpticsProjectileSize, Pos2D.x + x * R0, Pos2D.y + y * R0, "LVS_FONT", Color(0,0,0,200), 90 + ang)
|
||||
end
|
||||
if i == 3 then
|
||||
self:DrawRotatedText( "cm", Pos2D.x + x * R0, Pos2D.y + y * R0, "LVS_FONT", Color(0,0,0,200), 90 + ang)
|
||||
end
|
||||
if i == 5 then
|
||||
self:DrawRotatedText( "Pzgr", Pos2D.x + x * R0, Pos2D.y + y * R0, "LVS_FONT", Color(0,0,0,200), 90 + ang)
|
||||
end
|
||||
|
||||
surface.SetMaterial( circle )
|
||||
surface.DrawTexturedRectRotated( Pos2D.x + x * R, Pos2D.y + y * R, 16, 16, 0 )
|
||||
|
||||
surface.DrawLine( Pos2D.x + x * R1, Pos2D.y + y * R1, Pos2D.x + x * R2, Pos2D.y + y * R2 )
|
||||
|
||||
self:DrawRotatedText( i, Pos2D.x + x * R3, Pos2D.y + y * R3, "LVS_FONT_PANEL", Color(0,0,0,255), ang + 90)
|
||||
|
||||
if i == 40 then continue end
|
||||
|
||||
local ang = - 90 + (180 / 40) * (i + 0.5) + RotationOffset
|
||||
|
||||
local x = math.cos( math.rad( ang ) )
|
||||
local y = math.sin( math.rad( ang ) )
|
||||
|
||||
surface.DrawLine( Pos2D.x + x * R1, Pos2D.y + y * R1, Pos2D.x + x * R4, Pos2D.y + y * R4 )
|
||||
end
|
||||
|
||||
for i = 0, 13 do
|
||||
local ang = 120 + (120 / 13) * i + RotationOffset
|
||||
|
||||
local x = math.cos( math.rad( ang ) )
|
||||
local y = math.sin( math.rad( ang ) )
|
||||
|
||||
if i == 1 then
|
||||
self:DrawRotatedText( "MG", Pos2D.x + x * R0, Pos2D.y + y * R0, "LVS_FONT", Color(0,0,0,200), 90 + ang)
|
||||
end
|
||||
|
||||
surface.SetMaterial( circle )
|
||||
surface.DrawTexturedRectRotated( Pos2D.x + x * R, Pos2D.y + y * R, 16, 16, 0 )
|
||||
|
||||
surface.DrawLine( Pos2D.x + x * R1, Pos2D.y + y * R1, Pos2D.x + x * R2, Pos2D.y + y * R2 )
|
||||
|
||||
self:DrawRotatedText( i, Pos2D.x + x * R3, Pos2D.y + y * R3, "LVS_FONT_PANEL", Color(0,0,0,255), ang + 90)
|
||||
end
|
||||
|
||||
surface.SetDrawColor( 0, 0, 0, 100 )
|
||||
surface.SetMaterial( pointer )
|
||||
surface.DrawTexturedRect( Pos2D.x - 16, 0, 32, 64 )
|
||||
|
||||
local diameter = ScrH + 64
|
||||
local radius = diameter * 0.5
|
||||
|
||||
surface.SetMaterial( scope )
|
||||
surface.SetDrawColor( 0, 0, 0, 255 )
|
||||
surface.DrawTexturedRect( Pos2D.x - radius, Pos2D.y - radius, diameter, diameter )
|
||||
|
||||
-- black bar left + right
|
||||
surface.DrawRect( 0, 0, Pos2D.x - radius, ScrH )
|
||||
surface.DrawRect( Pos2D.x + radius, 0, Pos2D.x - radius, ScrH )
|
||||
end
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:TankViewOverride( ply, pos, angles, fov, pod )
|
||||
if ply == self:GetDriver() and not pod:GetThirdPersonMode() then
|
||||
local vieworigin, found = self:GetTurretViewOrigin()
|
||||
|
||||
if found then pos = vieworigin end
|
||||
end
|
||||
|
||||
return pos, angles, fov
|
||||
end
|
||||
@@ -0,0 +1,86 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "sh_tracks.lua" )
|
||||
AddCSLuaFile( "sh_turret.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "cl_optics.lua" )
|
||||
AddCSLuaFile( "cl_tankview.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("sh_turret.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
local ID = self:LookupAttachment( "muzzle_machinegun" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurret = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/tiger/cannon_fire.wav", "lvs/vehicles/tiger/cannon_fire.wav" )
|
||||
self.SNDTurret:SetSoundLevel( 95 )
|
||||
self.SNDTurret:SetParent( self, ID )
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMG = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos - Muzzle.Ang:Up() * 140 - Muzzle.Ang:Forward() * 15 ), "lvs/vehicles/sherman/mg_loop.wav", "lvs/vehicles/sherman/mg_loop_interior.wav" )
|
||||
self.SNDTurretMG:SetSoundLevel( 95 )
|
||||
self.SNDTurretMG:SetParent( self, ID )
|
||||
|
||||
local DriverSeat = self:AddDriverSeat( Vector(0,0,60), Angle(0,-90,0) )
|
||||
DriverSeat.HidePlayer = true
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(103,-24,41), Angle(0,-90,0) )
|
||||
GunnerSeat.HidePlayer = true
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
self:AddEngine( Vector(-79.66,0,72.21), Angle(0,180,0) )
|
||||
self:AddFuelTank( Vector(-80,0,60), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL, Vector(-12,-50,-12),Vector(12,50,0) )
|
||||
|
||||
-- turret
|
||||
local TurretArmor = self:AddArmor( Vector(0,0,88), Angle(0,0,0), Vector(-52,-52,-18), Vector(52,52,18), 4000, self.TurretArmor )
|
||||
TurretArmor:SetLabel( "Turret" )
|
||||
self:SetTurretArmor( TurretArmor )
|
||||
|
||||
-- front upper plate
|
||||
self:AddArmor( Vector(105,0,62), Angle(0,0,0), Vector(-8,-65,-12), Vector(8,65,12), 4000, self.FrontArmor )
|
||||
|
||||
-- front mid plate
|
||||
self:AddArmor( Vector(122,0,49), Angle(8,0,0), Vector(-10,-37,-1), Vector(10,37,1), 1200, self.RearArmor )
|
||||
|
||||
-- front lower plate
|
||||
self:AddArmor( Vector(127,0,35), Angle(-67,0,0), Vector(-15,-37,-1), Vector(15,37,1), 4000, self.FrontArmor )
|
||||
|
||||
-- front bottom plate
|
||||
self:AddArmor( Vector(111,0,18), Angle(-22,0,0), Vector(-11,-37,-1), Vector(11,37,1), 1200, self.RearArmor )
|
||||
|
||||
--left up
|
||||
self:AddArmor( Vector(-8,64,56), Angle(0,0,0), Vector(-105,-1,-18), Vector(105,1,18), 1600, self.SideArmor )
|
||||
--right up
|
||||
self:AddArmor( Vector(-8,-64,56), Angle(0,0,0), Vector(-105,-1,-18), Vector(105,1,18), 1600, self.SideArmor )
|
||||
|
||||
--left down
|
||||
self:AddArmor( Vector(12,37,35), Angle(0,0,0), Vector(-120,-1,-22), Vector(120,1,22), 1200, self.RearArmor )
|
||||
--right down
|
||||
self:AddArmor( Vector(12,-37,35), Angle(0,0,0), Vector(-120,-1,-22), Vector(120,1,22), 1200, self.RearArmor )
|
||||
|
||||
-- rear
|
||||
self:AddArmor( Vector(-105,0,42), Angle(0,0,0), Vector(-8,-65,-29), Vector(8,65,29), 1600, self.SideArmor )
|
||||
|
||||
--top
|
||||
self:AddArmor( Vector(0,0,69), Angle(0,0,0), Vector(-97,-63,-1), Vector(97,63,1), 500, self.RoofArmor )
|
||||
--bottom
|
||||
self:AddArmor( Vector(2,0,14), Angle(0,0,0), Vector(-99,-36,-1), Vector(99,36,1), 500, self.RoofArmor )
|
||||
|
||||
-- hole
|
||||
self:AddArmor( Vector(82,0,52), Angle(0,0,0), Vector(-15,-63,-2), Vector(15,63,2), 500, self.RoofArmor )
|
||||
|
||||
-- ammo rack weakspot
|
||||
self:AddAmmoRack( Vector(0,50,55), Vector(0,0,65), Angle(0,0,0), Vector(-54,-12,-6), Vector(54,12,6) )
|
||||
self:AddAmmoRack( Vector(0,-50,55), Vector(0,0,65), Angle(0,0,0), Vector(-54,-12,-6), Vector(54,12,6) )
|
||||
self:AddAmmoRack( Vector(0,30,30), Vector(0,0,65), Angle(0,0,0), Vector(-30,-6,-12), Vector(30,6,12) )
|
||||
self:AddAmmoRack( Vector(0,-30,30), Vector(0,0,65), Angle(0,0,0), Vector(-30,-6,-12), Vector(30,6,12) )
|
||||
|
||||
-- trailer hitch
|
||||
self:AddTrailerHitch( Vector(-112,0,22), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,189 @@
|
||||
|
||||
if SERVER then
|
||||
ENT.PivotSteerEnable = true
|
||||
ENT.PivotSteerByBrake = false
|
||||
ENT.PivotSteerWheelRPM = 25
|
||||
|
||||
ENT.TrackGibs = {
|
||||
["left"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/tiger_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,54.7,0),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
},
|
||||
["right"] = {
|
||||
{
|
||||
mdl = "models/blu/tanks/tiger_tracks_ragdoll.mdl",
|
||||
pos = Vector(0,-54.7,0),
|
||||
ang = Angle(-90,-90,0),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function ENT:OnLeftTrackRepaired()
|
||||
self:SetBodygroup(3,0)
|
||||
end
|
||||
|
||||
function ENT:OnLeftTrackDestroyed()
|
||||
self:SetBodygroup(3,1)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackRepaired()
|
||||
self:SetBodygroup(4,0)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackDestroyed()
|
||||
self:SetBodygroup(4,1)
|
||||
end
|
||||
|
||||
function ENT:TracksCreate( PObj )
|
||||
self:CreateTrackPhysics( "models/blu/tanks/tiger_tracks_col.mdl" )
|
||||
|
||||
local WheelModel = "models/props_vehicles/tire001b_truck.mdl"
|
||||
|
||||
local L1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(115,55,45), mdl = WheelModel } )
|
||||
local L2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(75,55,25), mdl = WheelModel } )
|
||||
local L3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(35,55,35), mdl = WheelModel } )
|
||||
local L4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-5,55,35), mdl = WheelModel } )
|
||||
local L5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-45,55,35), mdl = WheelModel } )
|
||||
local L6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_LEFT, pos = Vector(-85,55,35), mdl = WheelModel } )
|
||||
local LeftWheelChain = self:CreateWheelChain( {L1, L2, L3, L4, L5, L6} )
|
||||
self:SetTrackDriveWheelLeft( L4 )
|
||||
|
||||
local R1 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(115,-55,45), mdl = WheelModel } )
|
||||
local R2 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(75,-55,25), mdl = WheelModel } )
|
||||
local R3 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(35,-55,35), mdl = WheelModel } )
|
||||
local R4 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-5,-55,35), mdl = WheelModel } )
|
||||
local R5 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-45,-55,35), mdl = WheelModel } )
|
||||
local R6 = self:AddWheel( { hide = true, wheeltype = LVS.WHEELTYPE_RIGHT, pos = Vector(-85,-55,35), mdl = WheelModel} )
|
||||
local RightWheelChain = self:CreateWheelChain( {R1, R2, R3, R4, R5, R6} )
|
||||
self:SetTrackDriveWheelRight( R4 )
|
||||
|
||||
local LeftTracksArmor = self:AddArmor( Vector(11,55,8), Angle(0,0,0), Vector(-123,-17,-42), Vector(123,17,42), 700, self.FrontArmor )
|
||||
self:SetTrackArmorLeft( LeftTracksArmor, LeftWheelChain )
|
||||
|
||||
local RightTracksArmor = self:AddArmor( Vector(11,-55,8), Angle(0,0,0), Vector(-123,-17,-42), Vector(123,17,42), 700, self.FrontArmor )
|
||||
self:SetTrackArmorRight( RightTracksArmor, RightWheelChain )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R1, L1, R2, L2 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R3, L3, L4, R4 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_REAR,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R5, L5, R6, L6 },
|
||||
Suspension = {
|
||||
Height = 20,
|
||||
MaxTravel = 15,
|
||||
ControlArmLength = 150,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 1000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
ENT.TrackSystemEnable = true
|
||||
|
||||
ENT.TrackScrollTexture = "models/blu/tiger/track"
|
||||
ENT.ScrollTextureData = {
|
||||
["$bumpmap"] = "models/blu/tiger/track_nm",
|
||||
["$phong"] = "1",
|
||||
["$phongboost"] = "0.02",
|
||||
["$phongexponent"] = "3",
|
||||
["$phongfresnelranges"] = "[1 1 1]",
|
||||
["$translate"] = "[0.0 0.0 0.0]",
|
||||
["$colorfix"] = "{255 255 255}",
|
||||
["Proxies"] = {
|
||||
["TextureTransform"] = {
|
||||
["translateVar"] = "$translate",
|
||||
["centerVar"] = "$center",
|
||||
["resultVar"] = "$basetexturetransform",
|
||||
},
|
||||
["Equals"] = {
|
||||
["srcVar1"] = "$colorfix",
|
||||
["resultVar"] = "$color",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENT.TrackLeftSubMaterialID = 1
|
||||
ENT.TrackLeftSubMaterialMul = Vector(0,-0.075,0)
|
||||
|
||||
ENT.TrackRightSubMaterialID = 2
|
||||
ENT.TrackRightSubMaterialMul = Vector(0,-0.075,0)
|
||||
|
||||
ENT.TrackPoseParameterLeft = "spin_wheels_left"
|
||||
ENT.TrackPoseParameterLeftMul = -1.252
|
||||
|
||||
ENT.TrackPoseParameterRight = "spin_wheels_right"
|
||||
ENT.TrackPoseParameterRightMul = -1.252
|
||||
|
||||
ENT.TrackSounds = "lvs/vehicles/tiger/tracks_loop.wav"
|
||||
ENT.TrackHull = Vector(20,20,20)
|
||||
ENT.TrackData = {}
|
||||
for i = 1, 8 do
|
||||
for n = 0, 1 do
|
||||
local LR = n == 0 and "l" or "r"
|
||||
local LeftRight = n == 0 and "left" or "right"
|
||||
local data = {
|
||||
Attachment = {
|
||||
name = "vehicle_suspension_"..LR.."_"..i,
|
||||
toGroundDistance = 40,
|
||||
traceLength = 100,
|
||||
},
|
||||
PoseParameter = {
|
||||
name = "suspension_"..LeftRight.."_"..i,
|
||||
rangeMultiplier = 1,
|
||||
lerpSpeed = 25,
|
||||
}
|
||||
}
|
||||
table.insert( ENT.TrackData, data )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret.lua")
|
||||
include("entities/lvs_tank_wheeldrive/modules/sh_turret_ballistics.lua")
|
||||
|
||||
ENT.TurretBallisticsProjectileVelocity = ENT.ProjectileVelocityCoaxial
|
||||
ENT.TurretBallisticsMuzzleAttachment = "muzzle_coax"
|
||||
ENT.TurretBallisticsViewAttachment = "sight"
|
||||
|
||||
ENT.TurretAimRate = 15
|
||||
|
||||
ENT.TurretRotationSound = "vehicles/tank_turret_loop1.wav"
|
||||
|
||||
ENT.TurretPitchPoseParameterName = "turret_pitch"
|
||||
ENT.TurretPitchMin = -15
|
||||
ENT.TurretPitchMax = 15
|
||||
ENT.TurretPitchMul = 1
|
||||
ENT.TurretPitchOffset = 0
|
||||
|
||||
ENT.TurretYawPoseParameterName = "turret_yaw"
|
||||
ENT.TurretYawMul = 1
|
||||
ENT.TurretYawOffset = 0
|
||||
@@ -0,0 +1,522 @@
|
||||
|
||||
ENT.Base = "lvs_tank_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Panzer VI Tiger"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Tanks"
|
||||
ENT.VehicleSubCategory = "Heavy"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/blu/tanks/tiger_lvs.mdl"
|
||||
ENT.MDL_DESTROYED = "models/blu/tanks/tiger_lvs_gib_1.mdl"
|
||||
|
||||
ENT.GibModels = {
|
||||
"models/blu/tanks/tiger_lvs_gib_2.mdl",
|
||||
"models/blu/tanks/tiger_lvs_gib_3.mdl",
|
||||
"models/blu/tanks/tiger_lvs_gib_4.mdl",
|
||||
}
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.MaxHealth = 1500
|
||||
|
||||
--damage system
|
||||
ENT.DSArmorIgnoreForce = 4000
|
||||
ENT.CannonArmorPenetration = 14500
|
||||
ENT.FrontArmor = 6000
|
||||
ENT.SideArmor = 4000
|
||||
ENT.TurretArmor = 6000
|
||||
ENT.RearArmor = 2000
|
||||
ENT.RoofArmor = 100
|
||||
|
||||
|
||||
-- ballistics
|
||||
ENT.ProjectileVelocityCoaxial = 15000
|
||||
ENT.ProjectileVelocityHighExplosive = 13000
|
||||
ENT.ProjectileVelocityArmorPiercing = 16000
|
||||
|
||||
ENT.SteerSpeed = 1
|
||||
ENT.SteerReturnSpeed = 2
|
||||
|
||||
ENT.PhysicsWeightScale = 2
|
||||
ENT.PhysicsDampingSpeed = 1000
|
||||
ENT.PhysicsInertia = Vector(6000,6000,1500)
|
||||
|
||||
ENT.MaxVelocity = 450
|
||||
ENT.MaxVelocityReverse = 150
|
||||
|
||||
ENT.EngineCurve = 0.1
|
||||
ENT.EngineTorque = 200
|
||||
|
||||
ENT.TransMinGearHoldTime = 0.1
|
||||
ENT.TransShiftSpeed = 0
|
||||
|
||||
ENT.TransGears = 3
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.MouseSteerAngle = 45
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/tiger/eng_idle_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 70,
|
||||
PitchMul = 30,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/tiger/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 30,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 85,
|
||||
SoundType = LVS.SOUNDTYPE_NONE,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-116.7,-16.67,68.88),
|
||||
ang = Angle(-90,0,0),
|
||||
},
|
||||
{
|
||||
pos = Vector(-116.7,16.67,68.88),
|
||||
ang = Angle(-90,0,0),
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
self:AddDT( "Bool", "UseHighExplosive" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "muzzle_coax" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = ent.ProjectileVelocityCoaxial
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
if not IsValid( ent.SNDTurretMG ) then return end
|
||||
ent.SNDTurretMG:Stop()
|
||||
end
|
||||
weapon.OnOverheat = function( ent ) ent:EmitSound("lvs/overheat.wav") end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "muzzle_coax" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local Start = Muzzle.Pos
|
||||
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Start,
|
||||
endpos = Start + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
ent:PaintCrosshairCenter( MuzzlePos2D, COLOR_WHITE )
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnSelect = function( ent )
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityCoaxial, "muzzle_coax" )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = true
|
||||
weapon.Ammo = 30
|
||||
weapon.Delay = 3.2
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 0.33
|
||||
weapon.OnThink = function( ent )
|
||||
if ent:GetSelectedWeapon() ~= 2 then return end
|
||||
|
||||
local ply = ent:GetDriver()
|
||||
|
||||
if not IsValid( ply ) then return end
|
||||
|
||||
local SwitchType = ply:lvsKeyDown( "CAR_SWAP_AMMO" )
|
||||
|
||||
if ent._oldSwitchType ~= SwitchType then
|
||||
ent._oldSwitchType = SwitchType
|
||||
|
||||
if SwitchType then
|
||||
ent:SetUseHighExplosive( not ent:GetUseHighExplosive() )
|
||||
ent:EmitSound("lvs/vehicles/tiger/cannon_unload.wav", 75, 100, 1, CHAN_WEAPON )
|
||||
ent:SetHeat( 1 )
|
||||
ent:SetOverheated( true )
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityHighExplosive )
|
||||
else
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityArmorPiercing )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
weapon.Attack = function( ent )
|
||||
local ID = ent:LookupAttachment( "muzzle" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = Muzzle.Ang:Forward()
|
||||
bullet.Spread = Vector(0,0,0)
|
||||
bullet.EnableBallistics = true
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
bullet.Force = 500
|
||||
bullet.HullSize = 15
|
||||
bullet.Damage = 250
|
||||
bullet.SplashDamage = 1000
|
||||
bullet.SplashDamageRadius = 250
|
||||
bullet.SplashDamageEffect = "lvs_bullet_impact_explosive"
|
||||
bullet.SplashDamageType = DMG_BLAST
|
||||
bullet.Velocity = ent.ProjectileVelocityHighExplosive
|
||||
else
|
||||
bullet.Force = ent.CannonArmorPenetration
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 1250
|
||||
bullet.Velocity = ent.ProjectileVelocityArmorPiercing
|
||||
end
|
||||
|
||||
bullet.TracerName = "lvs_tracer_cannon"
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
local PhysObj = ent:GetPhysicsObject()
|
||||
if IsValid( PhysObj ) then
|
||||
PhysObj:ApplyForceOffset( -bullet.Dir * 150000, bullet.Src )
|
||||
end
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
ent:PlayAnimation("shot")
|
||||
|
||||
if not IsValid( ent.SNDTurret ) then return end
|
||||
|
||||
ent.SNDTurret:PlayOnce( 100 + math.cos( CurTime() + ent:EntIndex() * 1337 ) * 5 + math.Rand(-1,1), 1 )
|
||||
|
||||
ent:EmitSound("lvs/vehicles/tiger/cannon_reload.wav", 75, 100, 1, CHAN_WEAPON )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local ID = ent:LookupAttachment( "muzzle" )
|
||||
|
||||
local Muzzle = ent:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
local traceTurret = util.TraceLine( {
|
||||
start = Muzzle.Pos,
|
||||
endpos = Muzzle.Pos + Muzzle.Ang:Forward() * 50000,
|
||||
filter = ent:GetCrosshairFilterEnts()
|
||||
} )
|
||||
|
||||
local MuzzlePos2D = traceTurret.HitPos:ToScreen()
|
||||
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:PaintCrosshairSquare( MuzzlePos2D, COLOR_WHITE )
|
||||
else
|
||||
ent:PaintCrosshairOuter( MuzzlePos2D, COLOR_WHITE )
|
||||
end
|
||||
|
||||
ent:LVSPaintHitMarker( MuzzlePos2D )
|
||||
end
|
||||
end
|
||||
weapon.OnSelect = function( ent )
|
||||
if ent:GetUseHighExplosive() then
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityHighExplosive, "muzzle" )
|
||||
else
|
||||
ent:TurretUpdateBallistics( ent.ProjectileVelocityArmorPiercing, "muzzle" )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/smoke_launcher.png")
|
||||
weapon.Ammo = 3
|
||||
weapon.Delay = 1
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 0.05
|
||||
weapon.Attack = function( ent )
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
local ID1 = ent:LookupAttachment( "muzzle_smoke_right" )
|
||||
local ID2 = ent:LookupAttachment( "muzzle_smoke_left" )
|
||||
|
||||
local Muzzle1 = ent:GetAttachment( ID1 )
|
||||
local Muzzle2 = ent:GetAttachment( ID2 )
|
||||
|
||||
if not Muzzle1 or not Muzzle2 then return end
|
||||
|
||||
local Up = self:GetUp()
|
||||
|
||||
ent:EmitSound("lvs/smokegrenade.wav")
|
||||
|
||||
local Ang1 = Muzzle1.Ang
|
||||
Ang1:RotateAroundAxis( Up, -5 )
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( Muzzle1.Pos )
|
||||
grenade:SetAngles( Ang1 )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:GetPhysicsObject():SetVelocity( Ang1:Forward() * 1000 )
|
||||
|
||||
local Ang2 = Muzzle2.Ang
|
||||
Ang2:RotateAroundAxis( Up, 5 )
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( Muzzle2.Pos )
|
||||
grenade:SetAngles( Ang2 )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:GetPhysicsObject():SetVelocity( Ang2:Forward() * 1000 )
|
||||
|
||||
local Ang3 = Muzzle1.Ang
|
||||
Ang3:RotateAroundAxis( Up, -15 )
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( Muzzle1.Pos )
|
||||
grenade:SetAngles( Ang3 )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:GetPhysicsObject():SetVelocity( Ang3:Forward() * 1000 )
|
||||
|
||||
|
||||
local Ang4 = Muzzle2.Ang
|
||||
Ang4:RotateAroundAxis( Up, 15 )
|
||||
local grenade = ents.Create( "lvs_item_smoke" )
|
||||
grenade:SetPos( Muzzle2.Pos )
|
||||
grenade:SetAngles( Ang4 )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:GetPhysicsObject():SetVelocity( Ang4:Forward() * 1000 )
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/grenade_launcher.png")
|
||||
weapon.Ammo = 1
|
||||
weapon.Delay = 1
|
||||
weapon.HeatRateUp = 1
|
||||
weapon.HeatRateDown = 1
|
||||
weapon.Attack = function( ent )
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
ent:EmitSound("lvs/smokegrenade.wav")
|
||||
|
||||
local nades = {
|
||||
[1] = {
|
||||
pos = Vector(82.52,61.27,74.75),
|
||||
ang = Angle(-60,45,0),
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(82.52,-61.27,74.75),
|
||||
ang = Angle(-60,-45,0),
|
||||
},
|
||||
[3] = {
|
||||
pos = Vector(-46.24,61.77,75.63),
|
||||
ang = Angle(-60,90,0),
|
||||
},
|
||||
[4] = {
|
||||
pos = Vector(-46.24,-61.77,75.63),
|
||||
ang = Angle(-60,-90,0),
|
||||
},
|
||||
}
|
||||
|
||||
for _, data in pairs( nades ) do
|
||||
timer.Simple( math.Rand(0,0.2), function()
|
||||
if not IsValid( ent ) then return end
|
||||
|
||||
local pos = ent:LocalToWorld( data.pos )
|
||||
local ang = ent:LocalToWorldAngles( data.ang )
|
||||
|
||||
local grenade = ents.Create( "lvs_item_explosive" )
|
||||
grenade:SetPos( pos )
|
||||
grenade:SetAngles( ang )
|
||||
grenade:Spawn()
|
||||
grenade:Activate()
|
||||
grenade:SetAttacker( ent:GetDriver() )
|
||||
grenade:GetPhysicsObject():SetVelocity( ang:Forward() * 300 )
|
||||
end )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/tank_noturret.png")
|
||||
weapon.Ammo = -1
|
||||
weapon.Delay = 0
|
||||
weapon.HeatRateUp = 0
|
||||
weapon.HeatRateDown = 0
|
||||
weapon.OnSelect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( false )
|
||||
end
|
||||
end
|
||||
weapon.OnDeselect = function( ent )
|
||||
if ent.SetTurretEnabled then
|
||||
ent:SetTurretEnabled( true )
|
||||
end
|
||||
end
|
||||
self:AddWeapon( weapon )
|
||||
|
||||
self:AddGunnerWeapons()
|
||||
end
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 60
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local ID = base:LookupAttachment( "muzzle_machinegun" )
|
||||
|
||||
local Muzzle = base:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( Muzzle.Ang:Forward() )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("machinegun_yaw", -Angles.y )
|
||||
base:SetPoseParameter("machinegun_pitch", Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
self:AddWeapon( weapon, 2 )
|
||||
end
|
||||
@@ -0,0 +1 @@
|
||||
include("shared.lua")
|
||||
@@ -0,0 +1,79 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
self:AddDriverSeat( Vector(-29,17.5,21), Angle(0,-90,-10) )
|
||||
self:AddPassengerSeat( Vector(-11,-17.5,24), Angle(0,-90,10) )
|
||||
self:AddPassengerSeat( Vector(-45,0,24), Angle(0,-90,10) )
|
||||
|
||||
self:AddEngine( Vector(38,0,37) )
|
||||
self:AddFuelTank( Vector(-42.36,0,13.8), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
|
||||
local WheelModel = "models/diggercars/willys/wh.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0.3,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(49.5,-27,16),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(49.5,27,16),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.7,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-37,-27,12),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(-37,27,12),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
-- trailer hitch
|
||||
self:AddTrailerHitch( Vector(-68,0,17), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,164 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Willys Jeep"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Military"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/willys/willys.mdl"
|
||||
|
||||
ENT.AITEAM = 2
|
||||
|
||||
ENT.MaxVelocity = 1200
|
||||
|
||||
ENT.EngineCurve = 0.25
|
||||
ENT.EngineTorque = 150
|
||||
|
||||
ENT.TransGears = 4
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.HornSound = "lvs/horn2.wav"
|
||||
ENT.HornPos = Vector(40,0,35)
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/willy/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/willy/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 50,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 0,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[3] = {
|
||||
pos = Vector(-63.41,-20.49,21.1),
|
||||
colorG = 0,
|
||||
colorB = 0,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 3,
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Trigger = "brake",
|
||||
SubMaterialID = 2,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(-63.41,20.49,21.1),
|
||||
colorG = 0,
|
||||
colorB = 0,
|
||||
colorA = 150,
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
Trigger = "fog",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(61.03,14.6,28.6),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(61.03,-14.6,28.6),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[3] = {
|
||||
pos = Vector(53.09,26.85,35.88),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-59.32,13.07,12.77),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:CalcViewPassenger( ply, pos, angles, fov, pod )
|
||||
|
||||
if pod ~= self:GetGunnerSeat() then
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
|
||||
if pod:GetThirdPersonMode() then
|
||||
local view = {}
|
||||
view.fov = fov
|
||||
view.drawviewer = true
|
||||
|
||||
local mn = self:OBBMins()
|
||||
local mx = self:OBBMaxs()
|
||||
local radius = ( mn - mx ):Length()
|
||||
local radius = radius + radius * pod:GetCameraDistance()
|
||||
|
||||
local clamped_angles = pod:WorldToLocalAngles( angles )
|
||||
clamped_angles.p = math.max( clamped_angles.p, -20 )
|
||||
clamped_angles = pod:LocalToWorldAngles( clamped_angles )
|
||||
|
||||
local StartPos = pos
|
||||
local EndPos = StartPos - clamped_angles:Forward() * radius + clamped_angles:Up() * (radius * pod:GetCameraHeight())
|
||||
|
||||
local WallOffset = 4
|
||||
|
||||
local tr = util.TraceHull( {
|
||||
start = StartPos,
|
||||
endpos = EndPos,
|
||||
filter = function( e )
|
||||
local c = e:GetClass()
|
||||
local collide = not c:StartWith( "prop_physics" ) and not c:StartWith( "prop_dynamic" ) and not c:StartWith( "prop_ragdoll" ) and not e:IsVehicle() and not c:StartWith( "gmod_" ) and not c:StartWith( "lvs_" ) and not c:StartWith( "player" ) and not e.LVS
|
||||
|
||||
return collide
|
||||
end,
|
||||
mins = Vector( -WallOffset, -WallOffset, -WallOffset ),
|
||||
maxs = Vector( WallOffset, WallOffset, WallOffset ),
|
||||
} )
|
||||
|
||||
view.angles = angles + Angle(5,0,0)
|
||||
view.origin = tr.HitPos + pod:GetUp() * 65
|
||||
|
||||
if tr.Hit and not tr.StartSolid then
|
||||
view.origin = view.origin + tr.HitNormal * WallOffset
|
||||
end
|
||||
|
||||
return view
|
||||
end
|
||||
|
||||
local ZoomAttach = self:GetAttachment( self:LookupAttachment( "zoom" ) )
|
||||
local EyeAttach = self:GetAttachment( self:LookupAttachment( "eye" ) )
|
||||
|
||||
if ZoomAttach and EyeAttach then
|
||||
local ZOOM = ply:lvsKeyDown( "ZOOM" )
|
||||
|
||||
local TargetZoom = ZOOM and 1 or 0
|
||||
|
||||
pod.smZoom = pod.smZoom and (pod.smZoom + (TargetZoom - pod.smZoom) * RealFrameTime() * 12) or 0
|
||||
|
||||
local Zoom = pod.smZoom
|
||||
local invZoom = 1 - Zoom
|
||||
|
||||
pos = ZoomAttach.Pos * Zoom + EyeAttach.Pos * invZoom
|
||||
end
|
||||
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
@@ -0,0 +1,96 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
self:AddDriverSeat( Vector(-29,17.5,21), Angle(0,-90,-10) )
|
||||
self:AddPassengerSeat( Vector(-11,-17.5,24), Angle(0,-90,10) )
|
||||
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(-55,0,29), Angle(0,-90,0) )
|
||||
self:SetGunnerSeat( GunnerSeat )
|
||||
|
||||
local ID = self:LookupAttachment( "muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sherman/mg_loop.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "^mg_shot", Vector(0,0,0), Angle(0,0,0), Vector(0,0,0), Vector(0,0,0), Vector(0,0,0), Vector(0,0,0) )
|
||||
DoorHandler:SetRate( 20 )
|
||||
DoorHandler.PlayOnce = function( ent )
|
||||
ent:Open()
|
||||
ent.sm_pp = 0
|
||||
end
|
||||
|
||||
self.MgShot = DoorHandler
|
||||
|
||||
self:AddEngine( Vector(38,0,37) )
|
||||
self:AddFuelTank( Vector(-42.36,0,13.8), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
|
||||
local WheelModel = "models/diggercars/willys/wh.mdl"
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0.3,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(49.5,-27,16),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(49.5,27,16),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.7,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-37,-27,12),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,180,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(-37,27,12),
|
||||
mdl = WheelModel,
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
-- trailer hitch
|
||||
self:AddTrailerHitch( Vector(-68,0,17), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
@@ -0,0 +1,369 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Willys Jeep M1919"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Military"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/willys/willys_mg.mdl"
|
||||
|
||||
ENT.AITEAM = 2
|
||||
|
||||
ENT.MaxVelocity = 1200
|
||||
|
||||
ENT.EngineCurve = 0.25
|
||||
ENT.EngineTorque = 150
|
||||
|
||||
ENT.TransGears = 4
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.HornSound = "lvs/horn2.wav"
|
||||
ENT.HornPos = Vector(40,0,35)
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/willy/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/willy/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 50,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.Lights = {
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 0,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[3] = {
|
||||
pos = Vector(-63.41,-20.49,21.1),
|
||||
colorG = 0,
|
||||
colorB = 0,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Trigger = "main",
|
||||
SubMaterialID = 7,
|
||||
},
|
||||
{
|
||||
Trigger = "high",
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
ProjectedTextures = {
|
||||
[1] = {
|
||||
pos = Vector(60.34,-17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(60.34,17.52,34.46),
|
||||
ang = Angle(0,0,0),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
shadows = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Trigger = "brake",
|
||||
SubMaterialID = 2,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(-63.41,20.49,21.1),
|
||||
colorG = 0,
|
||||
colorB = 0,
|
||||
colorA = 150,
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
Trigger = "fog",
|
||||
SubMaterialID = 1,
|
||||
Sprites = {
|
||||
[1] = {
|
||||
pos = Vector(61.03,14.6,28.6),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[2] = {
|
||||
pos = Vector(61.03,-14.6,28.6),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
[3] = {
|
||||
pos = Vector(53.09,26.85,35.88),
|
||||
colorB = 200,
|
||||
colorA = 150,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-59.32,13.07,12.77),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "GunnerSeat" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
self:AddGunnerWeapons()
|
||||
end
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
local pod = self:GetGunnerSeat()
|
||||
|
||||
if IsValid( pod ) and not pod:GetThirdPersonMode() then
|
||||
local ply = pod:GetDriver()
|
||||
|
||||
if IsValid( ply ) and ply:lvsKeyDown( "ZOOM" ) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 50
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.12
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local Muzzle = base:GetAttachment( base:LookupAttachment( "muzzle" ) )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
|
||||
local ply = ent:GetDriver()
|
||||
|
||||
if IsValid( ply ) and ply:lvsKeyDown( "ZOOM" ) then
|
||||
local pod = ply:GetVehicle()
|
||||
|
||||
if IsValid( pod ) and not pod:GetThirdPersonMode() then
|
||||
bullet.Dir = Muzzle.Ang:Up()
|
||||
else
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
end
|
||||
else
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
end
|
||||
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ply
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( bullet.Dir )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
if not IsValid( base.MgShot ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.MgShot:PlayOnce() -- shoot anim
|
||||
base.SNDTurretMGf:Play() -- sound
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not ent:GetAI() and not IsValid( ent:GetDriver() ) then
|
||||
base:SetPoseParameter("f_pitch", 15 )
|
||||
base:SetPoseParameter("f_yaw", 0 )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("f_yaw", -Angles.y )
|
||||
base:SetPoseParameter("f_pitch", -Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
local pod = ply:GetVehicle()
|
||||
|
||||
if not IsValid( pod ) then return end
|
||||
|
||||
if not ply:lvsKeyDown( "ZOOM" ) or pod:GetThirdPersonMode() then
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
end
|
||||
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon, 3 )
|
||||
end
|
||||
|
||||
|
||||
function ENT:CalcMainActivityPassenger( ply )
|
||||
local GunnerSeat = self:GetGunnerSeat()
|
||||
|
||||
if not IsValid( GunnerSeat ) then return end
|
||||
|
||||
if GunnerSeat:GetDriver() ~= ply then return end
|
||||
|
||||
if ply.m_bWasNoclipping then
|
||||
ply.m_bWasNoclipping = nil
|
||||
ply:AnimResetGestureSlot( GESTURE_SLOT_CUSTOM )
|
||||
|
||||
if CLIENT then
|
||||
ply:SetIK( true )
|
||||
end
|
||||
end
|
||||
|
||||
ply.CalcIdeal = ACT_STAND
|
||||
ply.CalcSeqOverride = ply:LookupSequence( "cwalk_revolver" )
|
||||
|
||||
return ply.CalcIdeal, ply.CalcSeqOverride
|
||||
end
|
||||
|
||||
function ENT:UpdateAnimation( ply, velocity, maxseqgroundspeed )
|
||||
ply:SetPlaybackRate( 1 )
|
||||
|
||||
if CLIENT then
|
||||
local GunnerSeat = self:GetGunnerSeat()
|
||||
|
||||
if ply == self:GetDriver() then
|
||||
ply:SetPoseParameter( "vehicle_steer", self:GetSteer() / self:GetMaxSteerAngle() )
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
if IsValid( GunnerSeat ) and GunnerSeat:GetDriver() == ply then
|
||||
local Pitch = math.Remap( self:GetPoseParameter( "f_pitch" ),0,1,-15,10)
|
||||
local Yaw = math.Remap( self:GetPoseParameter( "f_yaw" ),0,1,-5,5)
|
||||
|
||||
ply:SetPoseParameter( "aim_pitch", Pitch * 1.5 )
|
||||
ply:SetPoseParameter( "aim_yaw", Yaw * 1.5 )
|
||||
|
||||
ply:SetPoseParameter( "head_pitch", -Pitch * 2 )
|
||||
ply:SetPoseParameter( "head_yaw", -Yaw * 3 )
|
||||
|
||||
ply:SetPoseParameter( "move_x", 0 )
|
||||
ply:SetPoseParameter( "move_y", 0 )
|
||||
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
GAMEMODE:GrabEarAnimation( ply )
|
||||
GAMEMODE:MouthMoveAnimation( ply )
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
include("cl_tankview.lua")
|
||||
|
||||
function ENT:OnSpawn()
|
||||
self:CreateBonePoseParameter( "hatch1", 59, Angle(0,0,0), Angle(0,60,0), Vector(0,0,0), Vector(0,0,0) )
|
||||
self:CreateBonePoseParameter( "hatch2", 60, Angle(0,0,0), Angle(0,60,0), Vector(0,0,0), Vector(0,0,0) )
|
||||
end
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
include("entities/lvs_tank_wheeldrive/modules/cl_tankview.lua")
|
||||
|
||||
function ENT:TankViewOverride( ply, pos, angles, fov, pod )
|
||||
if pod == self:GetFrontGunnerSeat() and not pod:GetThirdPersonMode() then
|
||||
local ID = self:LookupAttachment( "f_eye" )
|
||||
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
pos = Muzzle.Pos
|
||||
end
|
||||
end
|
||||
|
||||
if pod == self:GetRearGunnerSeat() and not pod:GetThirdPersonMode() then
|
||||
local ID = self:LookupAttachment( "r_eye" )
|
||||
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
|
||||
if Muzzle then
|
||||
pos = Muzzle.Pos
|
||||
end
|
||||
end
|
||||
|
||||
return pos, angles, fov
|
||||
end
|
||||
@@ -0,0 +1,97 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "sh_tracks.lua" )
|
||||
AddCSLuaFile( "cl_tankview.lua" )
|
||||
include("shared.lua")
|
||||
include("sh_tracks.lua")
|
||||
|
||||
-- since this is based on a tank we need to reset these to default var values:
|
||||
ENT.DSArmorDamageReductionType = DMG_BULLET + DMG_CLUB
|
||||
ENT.DSArmorIgnoreDamageType = DMG_SONIC
|
||||
|
||||
|
||||
function ENT:OnSpawn( PObj )
|
||||
|
||||
local ID = self:LookupAttachment( "f_muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGf = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sdkfz250/mg_loop.wav" )
|
||||
self.SNDTurretMGf:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGf:SetParent( self, ID )
|
||||
|
||||
local ID = self:LookupAttachment( "r_muzzle" )
|
||||
local Muzzle = self:GetAttachment( ID )
|
||||
self.SNDTurretMGt = self:AddSoundEmitter( self:WorldToLocal( Muzzle.Pos ), "lvs/vehicles/sdkfz250/mg_loop.wav" )
|
||||
self.SNDTurretMGt:SetSoundLevel( 95 )
|
||||
self.SNDTurretMGt:SetParent( self, ID )
|
||||
|
||||
local DriverSeat = self:AddDriverSeat( Vector(-10,16,15), Angle(0,-90,0) )
|
||||
local GunnerSeat = self:AddPassengerSeat( Vector(-30,0,25), Angle(0,-90,0) )
|
||||
local TopGunnerSeat = self:AddPassengerSeat( Vector(-35,0,23), Angle(0,90,0) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(0,-16,22), Angle(0,-90,10) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(-43,-14,24), Angle(0,-90,10) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(-50,14,32), Angle(0,180,0) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(-35,14,32), Angle(0,180,0) )
|
||||
local PassengerSeat = self:AddPassengerSeat( Vector(-20,14,32), Angle(0,180,0) )
|
||||
|
||||
self:SetFrontGunnerSeat( GunnerSeat )
|
||||
self:SetRearGunnerSeat( TopGunnerSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "trunk", Vector(-81.17,11.74,44.44), Angle(19,0,0), Vector(-1,-15,-15), Vector(1,15,15), Vector(-30,-15,-15), Vector(1,15,15) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
DoorHandler:LinkToSeat( DriverSeat )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "hatch", Vector(53.89,0.17,47.28), Angle(-80,0,0), Vector(-1,-15,-15), Vector(1,15,15), Vector(-30,-15,-15), Vector(1,15,15) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
|
||||
local Engine = self:AddEngine( Vector(50,0,45) )
|
||||
Engine:SetDoorHandler( DoorHandler )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "!hatch1", Vector(9.55,13.84,55.75), Angle(0,0,0), Vector(-3,-10,-3), Vector(3,10,3), Vector(-3,-10,-3), Vector(3,10,3) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
|
||||
local DoorHandler = self:AddDoorHandler( "!hatch2", Vector(9.55,-13.84,55.75), Angle(0,0,0), Vector(-3,-10,-3), Vector(3,10,3), Vector(-3,-10,-3), Vector(3,10,3) )
|
||||
DoorHandler:SetSoundOpen( "lvs/vehicles/generic/car_hood_open.wav" )
|
||||
DoorHandler:SetSoundClose( "lvs/vehicles/generic/car_hood_close.wav" )
|
||||
|
||||
self:AddFuelTank( Vector(55,0,18), Angle(0,0,0), 600, LVS.FUELTYPE_DIESEL )
|
||||
|
||||
self.SNDTurretMG = self:AddSoundEmitter( Vector(-63,0,85), "lvs/vehicles/halftrack/mc_loop.wav" )
|
||||
self.SNDTurretMG:SetSoundLevel( 95 )
|
||||
|
||||
local WheelModel = "models/diggercars/sdkfz250/250_wheel.mdl"
|
||||
|
||||
local FLWheel = self:AddWheel( { pos = Vector(67,32,16.5), mdl = WheelModel, mdl_ang = Angle(0,0,0), width = 2 } )
|
||||
local FRWheel = self:AddWheel( { pos = Vector(67,-32,16.5), mdl = WheelModel, mdl_ang = Angle(0,180,0), width = 2} )
|
||||
|
||||
self:CreateRigControler( "fl", FLWheel, 10, 17.7 )
|
||||
self:CreateRigControler( "fr", FRWheel, 10, 17.7 )
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0.5,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = { FLWheel, FRWheel },
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
self:AddTrailerHitch( Vector(-92.9,-0.04,23.19), LVS.HITCHTYPE_MALE )
|
||||
end
|
||||
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/sdkfz250/engine_start.wav" )
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,119 @@
|
||||
|
||||
if SERVER then
|
||||
function ENT:OnLeftTrackRepaired()
|
||||
self:SetBodygroup(1,0)
|
||||
end
|
||||
|
||||
function ENT:OnLeftTrackDestroyed()
|
||||
self:SetBodygroup(1,1)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackRepaired()
|
||||
self:SetBodygroup(2,0)
|
||||
end
|
||||
|
||||
function ENT:OnRightTrackDestroyed()
|
||||
self:SetBodygroup(2,1)
|
||||
end
|
||||
|
||||
function ENT:TracksCreate( PObj )
|
||||
local WheelModel = "models/diggercars/sdkfz250/250_wheel.mdl"
|
||||
|
||||
local L1 = self:AddWheel( { hide = true, pos = Vector(-0,32,20), mdl = WheelModel } )
|
||||
local L2 = self:AddWheel( { hide = true, pos = Vector(-30,32,20), mdl = WheelModel } )
|
||||
local L3 = self:AddWheel( { hide = true, pos = Vector(-60,32,20), mdl = WheelModel } )
|
||||
local LeftWheelChain = self:CreateWheelChain( {L1, L2, L3} )
|
||||
self:SetTrackDriveWheelLeft( L1 )
|
||||
|
||||
local R1 = self:AddWheel( { hide = true, pos = Vector(-0,-32,20), mdl = WheelModel, mdl_ang = Angle(0,180,0) } )
|
||||
local R2 = self:AddWheel( { hide = true, pos = Vector(-30,-32,20), mdl = WheelModel, mdl_ang = Angle(0,180,0) } )
|
||||
local R3 = self:AddWheel( { hide = true, pos = Vector(-60,-32,20), mdl = WheelModel, mdl_ang = Angle(0,180,0) } )
|
||||
local RightWheelChain = self:CreateWheelChain( {R1, R2, R3} )
|
||||
self:SetTrackDriveWheelRight( R1 )
|
||||
|
||||
local LeftTracksArmor = self:AddArmor( Vector(-25,30,20), Angle(0,0,0), Vector(-50,-10,-15), Vector(50,10,15), 200, 0 )
|
||||
self:SetTrackArmorLeft( LeftTracksArmor, LeftWheelChain )
|
||||
|
||||
local RightTracksArmor = self:AddArmor( Vector(-25,-30,20), Angle(0,0,0), Vector(-50,-10,-15), Vector(50,10,15), 200, 0 )
|
||||
self:SetTrackArmorRight( RightTracksArmor, RightWheelChain )
|
||||
|
||||
self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.5,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { R1, L1, L2, R2, R3, L3 },
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
end
|
||||
else
|
||||
ENT.TrackSystemEnable = true
|
||||
|
||||
ENT.TrackScrollTexture = "models/diggercars/sdkfz250/tracks"
|
||||
ENT.ScrollTextureData = {
|
||||
["$bumpmap"] = "models/diggercars/shared/skin_nm",
|
||||
["$phong"] = "1",
|
||||
["$phongboost"] = "0.04",
|
||||
["$phongexponent"] = "3",
|
||||
["$phongfresnelranges"] = "[1 1 1]",
|
||||
["$translate"] = "[0.0 0.0 0.0]",
|
||||
["$colorfix"] = "{255 255 255}",
|
||||
["Proxies"] = {
|
||||
["TextureTransform"] = {
|
||||
["translateVar"] = "$translate",
|
||||
["centerVar"] = "$center",
|
||||
["resultVar"] = "$basetexturetransform",
|
||||
},
|
||||
["Equals"] = {
|
||||
["srcVar1"] = "$colorfix",
|
||||
["resultVar"] = "$color",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENT.TrackLeftSubMaterialID = 4
|
||||
ENT.TrackLeftSubMaterialMul = Vector(0,0.0325,0)
|
||||
|
||||
ENT.TrackRightSubMaterialID = 5
|
||||
ENT.TrackRightSubMaterialMul = Vector(0,0.0325,0)
|
||||
|
||||
ENT.TrackPoseParameterLeft = "spin_wheels_left"
|
||||
ENT.TrackPoseParameterLeftMul = -1.8
|
||||
|
||||
ENT.TrackPoseParameterRight = "spin_wheels_right"
|
||||
ENT.TrackPoseParameterRightMul = -1.8
|
||||
|
||||
ENT.TrackSounds = "lvs/vehicles/halftrack/tracks_loop.wav"
|
||||
ENT.TrackHull = Vector(5,5,5)
|
||||
ENT.TrackData = {}
|
||||
|
||||
for i = 1, 4 do
|
||||
for n = 0, 1 do
|
||||
local LR = n == 0 and "l" or "r"
|
||||
local LeftRight = n == 0 and "left" or "right"
|
||||
local data = {
|
||||
Attachment = {
|
||||
name = "vehicle_suspension_"..LR.."_"..i,
|
||||
toGroundDistance = 29,
|
||||
traceLength = 150,
|
||||
},
|
||||
PoseParameter = {
|
||||
name = "suspension_"..LeftRight.."_"..i,
|
||||
rangeMultiplier = -1.25,
|
||||
lerpSpeed = 25,
|
||||
}
|
||||
}
|
||||
table.insert( ENT.TrackData, data )
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,397 @@
|
||||
|
||||
ENT.Base = "lvs_tank_wheeldrive"
|
||||
|
||||
ENT.PrintName = "Schuetzenpanzerwagen"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Information = "Luna's Vehicle Script"
|
||||
ENT.Category = "[LVS] - Cars"
|
||||
|
||||
ENT.VehicleCategory = "Cars"
|
||||
ENT.VehicleSubCategory = "Armored"
|
||||
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.MDL = "models/diggercars/sdkfz250/2501.mdl"
|
||||
ENT.MDL_DESTROYED = "models/diggercars/sdkfz250/250_dead.mdl"
|
||||
|
||||
ENT.AITEAM = 1
|
||||
|
||||
ENT.DSArmorIgnoreForce = 1000
|
||||
|
||||
ENT.MaxHealth = 650
|
||||
ENT.MaxHealthEngine = 400
|
||||
ENT.MaxHealthFuelTank = 100
|
||||
|
||||
--damage system
|
||||
ENT.CannonArmorPenetration = 2700
|
||||
|
||||
ENT.MaxVelocity = 700
|
||||
ENT.MaxVelocityReverse = 250
|
||||
|
||||
ENT.EngineCurve = 0.7
|
||||
ENT.EngineTorque = 100
|
||||
|
||||
ENT.PhysicsWeightScale = 1.5
|
||||
ENT.PhysicsInertia = Vector(2500,2500,850)
|
||||
|
||||
ENT.TransGears = 3
|
||||
ENT.TransGearsReverse = 1
|
||||
|
||||
ENT.lvsShowInSpawner = true
|
||||
|
||||
ENT.HornSound = "lvs/horn1.wav"
|
||||
ENT.HornPos = Vector(70,0,40)
|
||||
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "lvs/vehicles/sdkfz250/eng_idle_loop.wav",
|
||||
Volume = 0.5,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/sdkfz250/eng_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 20,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 85,
|
||||
SoundType = LVS.SOUNDTYPE_REV_UP,
|
||||
UseDoppler = true,
|
||||
},
|
||||
{
|
||||
sound = "lvs/vehicles/sdkfz250/eng_revdown_loop.wav",
|
||||
Volume = 1,
|
||||
Pitch = 20,
|
||||
PitchMul = 100,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_REV_DOWN,
|
||||
UseDoppler = true,
|
||||
},
|
||||
}
|
||||
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(35.31,39.22,26.35),
|
||||
ang = Angle(0,90,0),
|
||||
},
|
||||
}
|
||||
|
||||
function ENT:OnSetupDataTables()
|
||||
self:AddDT( "Entity", "FrontGunnerSeat" )
|
||||
self:AddDT( "Entity", "RearGunnerSeat" )
|
||||
self:AddDT( "Bool", "UseHighExplosive" )
|
||||
end
|
||||
|
||||
function ENT:InitWeapons()
|
||||
self:AddGunnerWeapons()
|
||||
self:AddTopGunnerWeapons()
|
||||
end
|
||||
|
||||
|
||||
function ENT:GunnerInRange( Dir )
|
||||
return self:AngleBetweenNormal( self:GetForward(), Dir ) < 35
|
||||
end
|
||||
|
||||
function ENT:AddGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:GunnerInRange( ent:GetAimVector() ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return true end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local ID = base:LookupAttachment( "f_muzzle" )
|
||||
|
||||
local Muzzle = base:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( Muzzle.Ang:Forward() )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
base:PlayAnimation( "shot_f" )
|
||||
|
||||
if not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGf ) then return end
|
||||
|
||||
base.SNDTurretMGf:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not ent:GetAI() and not IsValid( ent:GetDriver() ) then
|
||||
base:SetPoseParameter("f_pitch", 15 )
|
||||
base:SetPoseParameter("f_yaw", 0 )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local Angles = base:WorldToLocalAngles( ent:GetAimVector():Angle() )
|
||||
Angles:Normalize()
|
||||
|
||||
base:SetPoseParameter("f_yaw", -Angles.y )
|
||||
base:SetPoseParameter("f_pitch", -Angles.p )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:GunnerInRange( ent:GetAimVector() ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon, 2 )
|
||||
end
|
||||
|
||||
function ENT:TopGunnerInRange( ent )
|
||||
local AimPos = ent:GetEyeTrace().HitPos
|
||||
local AimAng = (AimPos - self:LocalToWorld( Vector(-72.27,0.06,66.07) )):Angle()
|
||||
|
||||
local _, Ang = WorldToLocal( AimPos, AimAng, Vector(-72.27,0,66), self:LocalToWorldAngles( Angle(0,180,0) ) )
|
||||
|
||||
return math.abs( Ang.y ) < 35 and Ang.p < 10 and Ang.p > -80
|
||||
end
|
||||
|
||||
function ENT:AddTopGunnerWeapons()
|
||||
local COLOR_RED = Color(255,0,0,255)
|
||||
local COLOR_WHITE = Color(255,255,255,255)
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/mg.png")
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
weapon.Attack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not base:TopGunnerInRange( ent ) then
|
||||
|
||||
if not IsValid( base.SNDTurretMGt ) then return true end
|
||||
|
||||
base.SNDTurretMGt:Stop()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local ID = base:LookupAttachment( "r_muzzle" )
|
||||
|
||||
local Muzzle = base:GetAttachment( ID )
|
||||
|
||||
if not Muzzle then return end
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = Muzzle.Pos
|
||||
bullet.Dir = (ent:GetEyeTrace().HitPos - bullet.Src):GetNormalized()
|
||||
bullet.Spread = Vector(0.01,0.01,0.01)
|
||||
bullet.TracerName = "lvs_tracer_yellow_small"
|
||||
bullet.Force = 10
|
||||
bullet.EnableBallistics = true
|
||||
bullet.HullSize = 0
|
||||
bullet.Damage = 25
|
||||
bullet.Velocity = 15000
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( bullet.Src )
|
||||
effectdata:SetNormal( Muzzle.Ang:Forward() )
|
||||
effectdata:SetEntity( ent )
|
||||
util.Effect( "lvs_muzzle", effectdata )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
|
||||
base:PlayAnimation( "shot_r" )
|
||||
|
||||
if not IsValid( base.SNDTurretMGt ) then return end
|
||||
|
||||
base.SNDTurretMGt:Play()
|
||||
end
|
||||
weapon.StartAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGt ) then return end
|
||||
|
||||
base.SNDTurretMGt:Play()
|
||||
end
|
||||
weapon.FinishAttack = function( ent )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) or not IsValid( base.SNDTurretMGt ) then return end
|
||||
|
||||
base.SNDTurretMGt:Stop()
|
||||
end
|
||||
weapon.OnThink = function( ent, active )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
if not ent:GetAI() and not IsValid( ent:GetDriver() ) then
|
||||
base:SetPoseParameter("r_pitch", 80 )
|
||||
base:SetPoseParameter("r_yaw", 0 )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local AimPos = ent:GetEyeTrace().HitPos
|
||||
local AimAng = (AimPos - base:LocalToWorld( Vector(-72.27,0.06,66.07) )):Angle()
|
||||
|
||||
local Pos, Ang = WorldToLocal( AimPos, AimAng, Vector(-72.27,0,66), base:LocalToWorldAngles( Angle(0,180,0) ) )
|
||||
|
||||
base:SetPoseParameter("r_pitch", -Ang.p )
|
||||
base:SetPoseParameter("r_yaw", -Ang.y )
|
||||
end
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
local base = ent:GetVehicle()
|
||||
|
||||
if not IsValid( base ) then return end
|
||||
|
||||
local Pos2D = ent:GetEyeTrace().HitPos:ToScreen()
|
||||
|
||||
local Col = base:TopGunnerInRange( ent ) and COLOR_WHITE or COLOR_RED
|
||||
|
||||
base:PaintCrosshairCenter( Pos2D, Col )
|
||||
base:LVSPaintHitMarker( Pos2D )
|
||||
end
|
||||
weapon.OnOverheat = function( ent )
|
||||
ent:EmitSound("lvs/overheat.wav")
|
||||
end
|
||||
self:AddWeapon( weapon, 3 )
|
||||
end
|
||||
|
||||
|
||||
function ENT:CalcMainActivityPassenger( ply )
|
||||
local FrontGunnerSeat = self:GetFrontGunnerSeat()
|
||||
local RearGunnerSeat = self:GetRearGunnerSeat()
|
||||
|
||||
if not IsValid( FrontGunnerSeat ) or not IsValid( RearGunnerSeat ) then return end
|
||||
|
||||
if FrontGunnerSeat:GetDriver() ~= ply and RearGunnerSeat:GetDriver() ~= ply then return end
|
||||
|
||||
if ply.m_bWasNoclipping then
|
||||
ply.m_bWasNoclipping = nil
|
||||
ply:AnimResetGestureSlot( GESTURE_SLOT_CUSTOM )
|
||||
|
||||
if CLIENT then
|
||||
ply:SetIK( true )
|
||||
end
|
||||
end
|
||||
|
||||
ply.CalcIdeal = ACT_STAND
|
||||
ply.CalcSeqOverride = ply:LookupSequence( "cwalk_revolver" )
|
||||
|
||||
return ply.CalcIdeal, ply.CalcSeqOverride
|
||||
end
|
||||
|
||||
function ENT:UpdateAnimation( ply, velocity, maxseqgroundspeed )
|
||||
ply:SetPlaybackRate( 1 )
|
||||
|
||||
if CLIENT then
|
||||
local FrontGunnerSeat = self:GetFrontGunnerSeat()
|
||||
local RearGunnerSeat = self:GetRearGunnerSeat()
|
||||
|
||||
if ply == self:GetDriver() then
|
||||
ply:SetPoseParameter( "vehicle_steer", self:GetSteer() / self:GetMaxSteerAngle() )
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
if IsValid( FrontGunnerSeat ) and FrontGunnerSeat:GetDriver() == ply then
|
||||
local Pitch = math.Remap( self:GetPoseParameter( "f_pitch" ),0,1,-15,15)
|
||||
local Yaw = math.Remap( self:GetPoseParameter( "f_yaw" ),0,1,-35,35)
|
||||
|
||||
ply:SetPoseParameter( "aim_pitch", Pitch * 1.5 )
|
||||
ply:SetPoseParameter( "aim_yaw", Yaw * 1.5 )
|
||||
|
||||
ply:SetPoseParameter( "head_pitch", -Pitch * 2 )
|
||||
ply:SetPoseParameter( "head_yaw", -Yaw * 3 )
|
||||
|
||||
ply:SetPoseParameter( "move_x", 0 )
|
||||
ply:SetPoseParameter( "move_y", 0 )
|
||||
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
if IsValid( RearGunnerSeat ) and RearGunnerSeat:GetDriver() == ply then
|
||||
local Pitch = math.Remap( self:GetPoseParameter( "r_pitch" ),0,1,-15,15)
|
||||
local Yaw = math.Remap( self:GetPoseParameter( "r_yaw" ),0,1,-35,35)
|
||||
|
||||
ply:SetPoseParameter( "aim_pitch", Pitch * 3 - 10 )
|
||||
ply:SetPoseParameter( "aim_yaw", Yaw * 1.5 )
|
||||
|
||||
ply:SetPoseParameter( "head_pitch", -Pitch * 2 )
|
||||
ply:SetPoseParameter( "head_yaw", -Yaw * 3 )
|
||||
|
||||
ply:SetPoseParameter( "move_x", 0 )
|
||||
ply:SetPoseParameter( "move_y", 0 )
|
||||
|
||||
ply:InvalidateBoneCache()
|
||||
end
|
||||
|
||||
GAMEMODE:GrabEarAnimation( ply )
|
||||
GAMEMODE:MouthMoveAnimation( ply )
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:UpdatePoseParameters( steer, speed_kmh, engine_rpm, throttle, brake, handbrake, clutch, gear, temperature, fuel, oil, ammeter )
|
||||
self:SetPoseParameter( "vehicle_steer", steer ) -- keep default behavior
|
||||
|
||||
--[[ add your gauges:
|
||||
|
||||
self:SetPoseParameter( "tacho_gauge", engine_rpm / 8000 )
|
||||
self:SetPoseParameter( "temp_gauge", temperature )
|
||||
self:SetPoseParameter( "fuel_gauge", fuel )
|
||||
self:SetPoseParameter( "oil_gauge", oil )
|
||||
self:SetPoseParameter( "alt_gauge", ammeter )
|
||||
self:SetPoseParameter( "vehicle_gauge", speed_kmh / 240 )
|
||||
self:SetPoseParameter( "throttle_pedal", throttle )
|
||||
self:SetPoseParameter( "brake_pedal", brake )
|
||||
self:SetPoseParameter( "handbrake_pedal", handbrake )
|
||||
self:SetPoseParameter( "clutch_pedal", clutch )
|
||||
]]
|
||||
-- no need to call invalidatebonecache. Its called automatically after this function.
|
||||
end
|
||||
|
||||
--[[
|
||||
|
||||
function ENT:OnSpawn()
|
||||
end
|
||||
|
||||
-- use this instead of ENT:OnRemove
|
||||
function ENT:OnRemoved()
|
||||
end
|
||||
|
||||
-- use this instead of ENT:Think()
|
||||
function ENT:OnFrame()
|
||||
end
|
||||
|
||||
function ENT:LVSPreHudPaint( X, Y, ply )
|
||||
return true -- return false to prevent original hud paint from running
|
||||
end
|
||||
|
||||
-- called when the engine is turned on or off
|
||||
function ENT:OnEngineActiveChanged( Active )
|
||||
if Active then
|
||||
self:EmitSound( "lvs/vehicles/generic/engine_start1.wav", 75, 100, LVS.EngineVolume )
|
||||
else
|
||||
self:EmitSound( "vehicles/jetski/jetski_off.wav", 75, 100, LVS.EngineVolume )
|
||||
end
|
||||
end
|
||||
|
||||
-- called when either an ai is activated/deactivated or when a player is sitting/exiting the driver seat
|
||||
function ENT:OnActiveChanged( Active )
|
||||
end
|
||||
|
||||
function ENT:CalcViewOverride( ply, pos, angles, fov, pod )
|
||||
return pos, angles, fov
|
||||
end
|
||||
|
||||
function ENT:CalcViewDirectInput( ply, pos, angles, fov, pod )
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
|
||||
function ENT:CalcViewMouseAim( ply, pos, angles, fov, pod )
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
|
||||
function ENT:CalcViewPassenger( ply, pos, angles, fov, pod )
|
||||
return LVS:CalcView( self, ply, pos, angles, fov, pod )
|
||||
end
|
||||
]]
|
||||
@@ -0,0 +1,348 @@
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
include("shared.lua")
|
||||
|
||||
--[[
|
||||
ENT.WaterLevelPreventStart = 1 -- at this water level engine can not start
|
||||
ENT.WaterLevelAutoStop = 2 -- at this water level (on collision) the engine will stop
|
||||
ENT.WaterLevelDestroyAI = 2 -- at this water level (on collision) the AI will self destruct
|
||||
]]
|
||||
|
||||
--ENT.PivotSteerEnable = false -- uncomment and set to "true" to enable pivot steering (tank steering on the spot)
|
||||
--ENT.PivotSteerWheelRPM = 40 -- how fast the wheels rotate during pivot steer
|
||||
|
||||
-- use this instead of ENT:Initialize()
|
||||
function ENT:OnSpawn( PObj )
|
||||
--[[ basics ]]
|
||||
self:AddDriverSeat( Vector(-10,0,-15), Angle(0,-90,0) ) -- self:AddDriverSeat( Position, Angle ) -- add a driver seat (max 1)
|
||||
-- Pod.ExitPos = Vector(0,0,100) -- change exit position
|
||||
-- Pod.HidePlayer = true -- should the player in this pod be invisible?
|
||||
|
||||
-- local Pod = self:AddPassengerSeat( Position, Angle ) -- add a passenger seat (no limit)
|
||||
-- Pod.ExitPos = Vector(0,0,100) -- change exit position
|
||||
-- Pod.HidePlayer = true -- should the player in this pod be invisible?
|
||||
|
||||
|
||||
--[[ engine sound / effects ]]
|
||||
self:AddEngine( Vector(0,0,0) ) -- add a engine. This is used for sounds and effects and is required to get accurate RPM for the gauges.
|
||||
--local Engine = self:AddEngine( vector_pos, angle_ang, mins, maxs )
|
||||
--Engine:SetDoorHandler( DoorHandler ) -- link it to a doorhandler as requirement for the repair tool
|
||||
|
||||
--[[ fuel system ]]
|
||||
-- self:AddFuelTank( pos, ang, tanksize, fueltype, mins, maxs ) -- adds a fuel tank.
|
||||
--[[
|
||||
fueltypes:
|
||||
LVS.FUELTYPE_PETROL
|
||||
LVS.FUELTYPE_DIESEL
|
||||
LVS.FUELTYPE_ELECTRIC
|
||||
|
||||
tanksize is how many seconds@fullthrottle you can drive. Not in liter.
|
||||
]]
|
||||
--Example:
|
||||
self:AddFuelTank( Vector(0,0,0), Angle(0,0,0), 600, LVS.FUELTYPE_PETROL )
|
||||
|
||||
|
||||
--[[ damage system ]]
|
||||
--[[
|
||||
-- The fuel tank internally registers a critical hitpoint that catches the vehicle on fire when damaged. You can use this same system to create your own damage behaviors like this:
|
||||
self:AddDS( {
|
||||
pos = Vector(0,0,0),
|
||||
ang = Angle(0,0,0),
|
||||
mins = Vector(-40,-20,-30),
|
||||
maxs = Vector(40,20,30),
|
||||
Callback = function( tbl, ent, dmginfo )
|
||||
--dmginfo:ScaleDamage( 15 ) -- this would scale damage *15 when this critical hitpoint has been hit
|
||||
end
|
||||
} )
|
||||
|
||||
-- you can also add armor spots using this method. If the bullet trace hits this box first, it will not hit the critical hit point:
|
||||
self:AddDSArmor( {
|
||||
pos = Vector(-70,0,35),
|
||||
ang = Angle(0,0,0),
|
||||
mins = Vector(-10,-40,-30),
|
||||
maxs = Vector(10,40,30),
|
||||
Callback = function( tbl, ent, dmginfo )
|
||||
-- armor also has a callback. You can set damage to 0 here for example:
|
||||
dmginfo:ScaleDamage( 0 )
|
||||
end
|
||||
} )
|
||||
|
||||
NOTE: !!DS parts are inactive while the vehicle has shield!!
|
||||
|
||||
|
||||
|
||||
-- in addition to DS-parts LVS-Cars has a inbuild Armor system:
|
||||
|
||||
self:AddArmor( pos, ang, mins, maxs, health, num_force_ignore )
|
||||
|
||||
-- num_force_ignore is the bullet force. Value here gets added to general immunity variable ENT.DSArmorIgnoreForce (see shared.lua)
|
||||
]]
|
||||
|
||||
|
||||
|
||||
--[[ sound emitters ]]
|
||||
-- self.SoundEmitter = self:AddSoundEmitter( Position, string_path_exterior_sound, string_path_interior_sound ) -- add a sound emitter
|
||||
-- self.SoundEmitter:SetSoundLevel( 95 ) -- set sound level (95 is good for weapons)
|
||||
|
||||
-- self.SoundEmitter:Play() -- start looping sound (use this in weapon start attack for example)
|
||||
-- self.SoundEmitter:Stop() -- stop looping sound (use this in weapon stop attack for example)
|
||||
|
||||
-- self.SoundEmitter:PlayOnce( pitch, volume ) -- or play a non-looped sound in weapon attack (do not use looped sound files with this, they will never stop)
|
||||
|
||||
|
||||
--[[ items ]]
|
||||
--self:AddTurboCharger() -- equip a turbo charger?
|
||||
--self:AddSuperCharger() -- equip a super charger?
|
||||
|
||||
|
||||
--[[ wheels ]]
|
||||
--[[
|
||||
-- add a wheel:
|
||||
local WheelEntity1 = self:AddWheel( {
|
||||
-- radius = 12, -- (leave this commented-out to let the system figure this out by itself)
|
||||
-- width = 3, -- tire witdh used for skidmarks
|
||||
pos = Vector(0,0,0),
|
||||
mdl = "path/to/model.mdl",
|
||||
mdl_ang = Angle(0,0,0), -- use this to match model orientation with wheel rotation
|
||||
|
||||
MaxHealth = 100, -- changes max health of wheel
|
||||
DSArmorIgnoreForce = 0, -- changes the damage force that is needed to damage this wheel
|
||||
|
||||
--camber = 0, -- camber alignment
|
||||
--caster = 0, -- caster alignment
|
||||
--toe = 0, -- toe alignment
|
||||
|
||||
--hide = false, -- hide this wheel?, NOTE: if developer convar is set to 1 this will have no effect for debugging purposes.
|
||||
|
||||
-- wheeltype = LVS.WHEELTYPE_NONE -- this is only used when ENT.PivotSteerEnable is set to true. It can be either LVS.WHEELTYPE_LEFT or LVS.WHEELTYPE_RIGHT depending on which direction you want it to spin
|
||||
} ),
|
||||
|
||||
!!NOTE!!
|
||||
adding a wheel will not make the vehicle functional. It requires to be linked to an axle using self:DefineAxle()
|
||||
]]
|
||||
|
||||
|
||||
--[[ axles ]]
|
||||
--[[
|
||||
local Axle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0), -- angle which is considered "forward" with this axle. Use this to fix misaligned body props.
|
||||
|
||||
SteerType = STEER_TYPE,
|
||||
-- STEER_TYPE:
|
||||
-- LVS.WHEEL_STEER_NONE -- non steering wheel
|
||||
-- LVS.WHEEL_STEER_FRONT -- a wheel that turns left when left key is pressed
|
||||
-- LVS.WHEEL_STEER_REAR -- ..turns right when left key is pressed
|
||||
|
||||
SteerAngle = 30, -- max steer angle, unused in steer type LVS.WHEEL_STEER_NONE
|
||||
|
||||
TorqueFactor = 0.3, -- TorqueFactor is how much torque is applied to this axle. 1 = all power, 0 = no power. Ideally all Axis combined equal 1.
|
||||
--So if you make front wheels have TorqueFactor 0.3 you set rear axle to 0.7
|
||||
--If Front Axle 0 set Rear Axle 1 ect.. you get the idea
|
||||
|
||||
BrakeFactor = 1, -- how strong the brakes on this axle are. Just leave it at 1
|
||||
|
||||
--UseHandbrake = true, -- is this axle using the handbrake?
|
||||
},
|
||||
|
||||
Wheels = {WheelEntity1, WheelEntity2, ... ect }, -- link wheels to this axle. Can be any amount in any order
|
||||
|
||||
Suspension = {
|
||||
Height = 6, -- suspension height. Ideally less than MaxTravel so the suspension doesnt always bump into its limiter. If it sags into the limiter you need more SpringConstant
|
||||
MaxTravel = 7, -- limits the suspension travel.
|
||||
ControlArmLength = 25, -- changes the size of the control arm. (changes the arc in which the axle is rotating)
|
||||
SpringConstant = 20000, -- the strength of the spring. Max value is 50000 everything above has no effect. This is the reason you should NOT use realistic mass but instead change INERTIA ONLY to simulate heavier vehicles.
|
||||
SpringDamping = 2000, -- damping of the spring, same as what you set in your elastic tool.
|
||||
SpringRelativeDamping = 2000, -- relative damping of the spring, same as what you set in your elastic tool. If you dont know what it does just set it to the same as SpringDamping
|
||||
},
|
||||
} )
|
||||
]]
|
||||
|
||||
-- example:
|
||||
local WheelModel = "models/props_vehicles/tire001c_car.mdl"
|
||||
|
||||
local WheelFrontLeft = self:AddWheel( { pos = Vector(60,30,-15), mdl = WheelModel } )
|
||||
local WheelFrontRight = self:AddWheel( { pos = Vector(60,-30,-15), mdl = WheelModel } )
|
||||
|
||||
local WheelRearLeft = self:AddWheel( {pos = Vector(-60,30,-15), mdl = WheelModel} )
|
||||
local WheelRearRight = self:AddWheel( {pos = Vector(-60,-30,-15), mdl = WheelModel} )
|
||||
|
||||
local SuspensionSettings = {
|
||||
Height = 6,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
}
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0.3,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = { WheelFrontLeft, WheelFrontRight },
|
||||
Suspension = SuspensionSettings,
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.7,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = { WheelRearLeft, WheelRearRight },
|
||||
Suspension = SuspensionSettings,
|
||||
} )
|
||||
|
||||
-- example 2 (rear axle only). If this looks cleaner to you:
|
||||
--[[
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = Angle(0,0,0),
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 0.7,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {
|
||||
self:AddWheel( {
|
||||
pos = Vector(-60,30,-15),
|
||||
mdl = "models/props_vehicles/tire001c_car.mdl",
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
|
||||
self:AddWheel( {
|
||||
pos = Vector(-60,-30,-15),
|
||||
mdl = "models/props_vehicles/tire001c_car.mdl",
|
||||
mdl_ang = Angle(0,0,0),
|
||||
} ),
|
||||
},
|
||||
Suspension = {
|
||||
Height = 6,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
)
|
||||
]]
|
||||
|
||||
|
||||
-- example 3, prop_vehicle_jeep rigged model method using
|
||||
--[[
|
||||
local FrontRadius = 15
|
||||
local RearRadius = 15
|
||||
local FL, FR, RL, RR, ForwardAngle = self:AddWheelsUsingRig( FrontRadius, RearRadius )
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = ForwardAngle,
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {FL,FR},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = ForwardAngle,
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {RL,RR},
|
||||
Suspension = {
|
||||
Height = 15,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
]]
|
||||
|
||||
-- example 4, rigged wheels with visible prop wheels:
|
||||
--[[
|
||||
local data = {
|
||||
mdl_fr = "models/diggercars/dodge_charger/wh.mdl",
|
||||
mdl_ang_fr = Angle(0,0,0),
|
||||
mdl_fl = "models/diggercars/dodge_charger/wh.mdl",
|
||||
mdl_ang_fl = Angle(0,180,0),
|
||||
mdl_rl = "models/diggercars/dodge_charger/wh.mdl",
|
||||
mdl_ang_rl = Angle(0,0,0),
|
||||
mdl_rr = "models/diggercars/dodge_charger/wh.mdl",
|
||||
mdl_ang_rr = Angle(0,180,0),
|
||||
}
|
||||
|
||||
local FrontRadius = 15
|
||||
local RearRadius = 15
|
||||
local FL, FR, RL, RR, ForwardAngle = self:AddWheelsUsingRig( FrontRadius, RearRadius, data )
|
||||
|
||||
local FrontAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = ForwardAngle,
|
||||
SteerType = LVS.WHEEL_STEER_FRONT,
|
||||
SteerAngle = 30,
|
||||
TorqueFactor = 0,
|
||||
BrakeFactor = 1,
|
||||
},
|
||||
Wheels = {FL,FR},
|
||||
Suspension = {
|
||||
Height = 10,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
|
||||
local RearAxle = self:DefineAxle( {
|
||||
Axle = {
|
||||
ForwardAngle = ForwardAngle,
|
||||
SteerType = LVS.WHEEL_STEER_NONE,
|
||||
TorqueFactor = 1,
|
||||
BrakeFactor = 1,
|
||||
UseHandbrake = true,
|
||||
},
|
||||
Wheels = {RL,RR},
|
||||
Suspension = {
|
||||
Height = 15,
|
||||
MaxTravel = 7,
|
||||
ControlArmLength = 25,
|
||||
SpringConstant = 20000,
|
||||
SpringDamping = 2000,
|
||||
SpringRelativeDamping = 2000,
|
||||
},
|
||||
} )
|
||||
]]
|
||||
end
|
||||
|
||||
--[[
|
||||
function ENT:OnSuperCharged( enabled )
|
||||
-- called when supercharger is equipped/unequipped
|
||||
end
|
||||
|
||||
function ENT:OnTurboCharged( enabled )
|
||||
-- called when turbocharger is equipped/unequipped
|
||||
end
|
||||
]]
|
||||
@@ -0,0 +1,362 @@
|
||||
|
||||
ENT.Base = "lvs_base_wheeldrive"
|
||||
|
||||
ENT.PrintName = "template script"
|
||||
ENT.Author = "*your name*"
|
||||
ENT.Information = ""
|
||||
ENT.Category = "[LVS] *your category*"
|
||||
|
||||
ENT.Spawnable = false -- set to "true" to make it spawnable
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.SpawnNormalOffset = 40 -- spawn normal offset, raise to prevent spawning into the ground
|
||||
--ENT.SpawnNormalOffsetSpawner = 0 -- offset for ai vehicle spawner
|
||||
|
||||
ENT.MDL = "models/props_interiors/Furniture_Couch02a.mdl"
|
||||
--ENT.MDL_DESTROYED = "models/props_interiors/Furniture_Couch02a.mdl"
|
||||
--[[
|
||||
ENT.GibModels = {
|
||||
"models/gibs/manhack_gib01.mdl",
|
||||
"models/gibs/manhack_gib02.mdl",
|
||||
"models/gibs/manhack_gib03.mdl",
|
||||
"models/gibs/manhack_gib04.mdl",
|
||||
"models/props_c17/canisterchunk01a.mdl",
|
||||
"models/props_c17/canisterchunk01d.mdl",
|
||||
"models/props_c17/oildrumchunk01a.mdl",
|
||||
"models/props_c17/oildrumchunk01b.mdl",
|
||||
"models/props_c17/oildrumchunk01c.mdl",
|
||||
"models/props_c17/oildrumchunk01d.mdl",
|
||||
"models/props_c17/oildrumchunk01e.mdl",
|
||||
}
|
||||
]]
|
||||
|
||||
ENT.AITEAM = 1
|
||||
--[[
|
||||
TEAMS:
|
||||
0 = FRIENDLY TO EVERYONE
|
||||
1 = FRIENDLY TO TEAM 1 and 0
|
||||
2 = FRIENDLY TO TEAM 2 and 0
|
||||
3 = HOSTILE TO EVERYONE
|
||||
]]
|
||||
|
||||
ENT.MaxHealth = 400 -- max health
|
||||
--ENT.MaxHealthEngine = 100 -- max health engine
|
||||
--ENT.MaxHealthFuelTank = 100 -- max health fuel tank
|
||||
|
||||
--ENT.DSArmorDamageReduction = 0.1 -- damage reduction multiplier. Damage is clamped to a minimum of 1 tho
|
||||
--ENT.DSArmorDamageReductionType = DMG_BULLET + DMG_CLUB -- which damage type to damage reduce
|
||||
|
||||
--ENT.DSArmorIgnoreDamageType = DMG_SONIC -- ignore this damage type completely
|
||||
--ENT.DSArmorIgnoreForce = 1000 -- add general immunity against small firearms, 1000 = 10mm armor thickness
|
||||
--ENT.DSArmorBulletPenetrationAdd = 250 -- changes how far bullets can cheat through the body to hit critical hitpoints and armor
|
||||
|
||||
|
||||
--[[
|
||||
PLEASE READ:
|
||||
Ideally you only need change:
|
||||
|
||||
ENT.MaxVelocity -- to change top speed
|
||||
ENT.EngineTorque -- to change acceleration speed
|
||||
ENT.EngineIdleRPM -- optional: only used for rpm gauge. This will NOT change engine sound.
|
||||
ENT.EngineMaxRPM -- optional: only used for rpm gauge. This will NOT change engine sound.
|
||||
|
||||
ENT.TransGears -- in a sane range based on maxvelocity. Dont set 10 gears for a car that only does 10kmh this will sound like garbage. Ideally use a total of 3 - 6 gears
|
||||
|
||||
I recommend keeping everything else at default settings.
|
||||
(leave them commented-out or remove them from this script)
|
||||
]]
|
||||
|
||||
ENT.MaxVelocity = 1400 -- max velocity in forward direction in gmod-units/second
|
||||
--ENT.MaxVelocityReverse = 700 -- max velocity in reverse
|
||||
|
||||
--ENT.EngineCurve = 0.65 -- value goes from 0 to 1. Get into a car and type "developer 1" into the console to see the current engine curve
|
||||
--ENT.EngineCurveBoostLow = 1 -- first gear torque boost multiplier
|
||||
ENT.EngineTorque = 150
|
||||
ENT.EngineIdleRPM = 1000
|
||||
ENT.EngineMaxRPM = 6000
|
||||
|
||||
--ENT.ThrottleRate = 3.5 -- modify the throttle update rate, see it as the speed with which you push the pedal
|
||||
|
||||
--ENT.ForceLinearMultiplier = 1 -- multiply all linear forces (such as downforce, wheel side force, ect)
|
||||
--ENT.ForceAngleMultiplier = 0.5 -- multiply all angular forces such turn stability / inertia. Exception: Wheel/Engine torque. Those remain unchanged.
|
||||
|
||||
ENT.TransGears = 4 -- amount of gears in forward direction. NOTE: the engine sound system calculates the gear ratios based on topspeed and amount of gears. This can not be changed.
|
||||
--ENT.TransGearsReverse = 1 -- amount of gears in reverse direction
|
||||
--ENT.TransMinGearHoldTime = 1 -- minimum time the vehicle should stay in a gear before allowing it to shift again.
|
||||
--ENT.TransShiftSpeed = 0.3 -- in seconds. How fast the transmission handles a shift. The transmission mimics a manual shift by applying clutch, letting off throttle, releasing clutch and applying throttle again even tho it is automatic.
|
||||
--ENT.TransWobble = 40 -- basically how much "play" is in the drivedrain.
|
||||
--ENT.TransWobbleTime = 1.5 -- in seconds. How long after a shift or after applying throttle the engine will wobble up and down in rpm
|
||||
--ENT.TransWobbleFrequencyMultiplier = 1 -- changes the frequency of the wobble
|
||||
--ENT.TransShiftSound = "lvs/vehicles/generic/gear_shift.wav" change gear shift sound
|
||||
|
||||
--ENT.SteerSpeed = 3 -- steer speed
|
||||
--ENT.SteerReturnSpeed = 10 -- steer return speed to neutral steer
|
||||
|
||||
--ENT.FastSteerActiveVelocity = 500 -- at which velocity the steering will clamp the steer angle
|
||||
--ENT.FastSteerAngleClamp = 10 -- to which the steering angle is clamped to when speed is above ENT.FastSteerActiveVelocity
|
||||
--ENT.FastSteerDeactivationDriftAngle = 7 -- allowed drift angle until ENT.FastSteerActiveVelocity is ignored and the steering becomes unclamped
|
||||
|
||||
--ENT.SteerAssistDeadZoneAngle = 1 -- changes how much drift the counter steer system allows before interfering. 1 = 1° of drift without interfering
|
||||
--ENT.SteerAssistMaxAngle = 15 -- max steering angle the counter steer system is allowed to help the player
|
||||
--ENT.SteerAssistExponent = 1.5 -- an exponent to the counter steering curve. Just leave it at 1.5
|
||||
--ENT.SteerAssistMultiplier = 3 -- how "quick" the counter steer system is steering
|
||||
|
||||
--ENT.MouseSteerAngle = 20 -- smaller value = more direct steer bigger value = smoother steer, just leave it at 20
|
||||
--ENT.MouseSteerExponent = 2 -- just leave it at 2. Fixes wobble.
|
||||
|
||||
--ENT.PhysicsWeightScale = 1 -- this is the value you need to change in order to make a vehicle feel heavier. Just leave it at 1 unless you really need to change it
|
||||
--ENT.PhysicsMass = 1000 -- do not mess with this unless you can balance everything yourself again.
|
||||
--ENT.PhysicsInertia = Vector(1500,1500,750) -- do not mess with this unless you can balance everything yourself again.
|
||||
--ENT.PhysicsDampingSpeed = 4000 -- do not mess with this unless you can balance everything yourself again.
|
||||
|
||||
--ENT.PhysicsDampingForward = true -- internal physics damping to reduce wobble. Just keep it enabled in forward direction.
|
||||
--ENT.PhysicsDampingReverse = false -- disabling this in reverse allows for a reverse 180° turn. If you want to go fast in reverse you should set this to true in order to get good stability
|
||||
|
||||
--ENT.WheelPhysicsMass = 100 -- do not mess with this unless you can balance everything yourself again.
|
||||
--ENT.WheelPhysicsInertia = Vector(10,8,10) -- do not mess with this unless you can balance everything yourself again.
|
||||
--ENT.WheelPhysicsTireHeight = 4 -- changes the tire height. If tire is blown the wheel sink this amount into the ground. Set to 0 to disable tire damage
|
||||
--[[
|
||||
-- physics friction lookup table. The default used one is 10, jeeptire
|
||||
ENT.WheelPhysicsMaterials = {
|
||||
[0] = "friction_00", -- 0
|
||||
[1] = "friction_10", -- 0.1
|
||||
[2] = "friction_25", -- 0.25
|
||||
[3] = "popcan", -- 0.3
|
||||
[4] = "glassbottle", -- 0.4
|
||||
[5] = "glass", -- 0.5
|
||||
[6] = "snow", -- 0.6
|
||||
[7] = "roller", -- 0.7
|
||||
[8] = "rubber", -- 0.8
|
||||
[9] = "slime", -- 0.9
|
||||
[10] = "jeeptire", -- 1.337 -- i don't believe friction in havok can go above 1, however other settings such as bouncyness and elasticity are affected by it as it seems. We use jeeptire as default even tho it technically isn't the "best" choice, but rather the most common one
|
||||
[11] = "jalopytire", -- 1.337
|
||||
[12] = "phx_tire_normal", -- 3
|
||||
}
|
||||
]]
|
||||
|
||||
--ENT.AutoReverseVelocity = 50 -- below this velocity the transmission is allowed to automatically shift into reverse when holding the brake button
|
||||
|
||||
--ENT.WheelBrakeLockupRPM = 20 -- below this wheel rpm it will engage the auto brake when the throttle is 0
|
||||
|
||||
--ENT.WheelBrakeForce = 400 -- how strong the brakes are. Just leave at 400. Allows for good braking while still allowing some turning. It has some build in ABS but it isnt perfect because even tho velocities say it isnt sliding the wheel will still visually slide in source...
|
||||
|
||||
--ENT.WheelSideForce = 800 -- basically a sideways cheatforce that gives you better stability in turns. You shouldn't have to edit this.
|
||||
--ENT.WheelDownForce = 500 -- wheels use jeeptire as physprop. To this a downward force is applied to increase traction. You shouldn't have to edit this.
|
||||
|
||||
--ENT.AllowSuperCharger = true -- allow this vehicle to equip a supercharger?
|
||||
--ENT.SuperChargerVolume = 1 -- change superchager sound volume
|
||||
--ENT.SuperChargerSound = "lvs/vehicles/generic/supercharger_loop.wav" -- change supercharger sound file
|
||||
|
||||
--ENT.AllowTurbo = true -- allow this vehilce to equip a turbocharger?
|
||||
--ENT.TurboVolume = 1 -- change turbocharger sound volume
|
||||
--ENT.TurboSound = "lvs/vehicles/generic/turbo_loop.wav" -- change turbo sound file
|
||||
--ENT.TurboBlowOff = {"lvs/vehicles/generic/turbo_blowoff1.wav","lvs/vehicles/generic/turbo_blowoff1.wav"} -- change blowoff sound. If you only have one file you can just pass it as a string instead of a table.
|
||||
|
||||
--ENT.DeleteOnExplode = false -- remove the vehicle when it explodes?
|
||||
|
||||
--ENT.lvsAllowEngineTool = true -- alow the engine tool to be used on this vehicle?
|
||||
--ENT.lvsShowInSpawner = false -- show this vehicle in vehicle spawner entity?
|
||||
|
||||
--[[
|
||||
--ENT.RandomColor = {} -- table with colors to set on spawn
|
||||
-- accepts colors and skin+color combo:
|
||||
|
||||
-- example variant1:
|
||||
ENT.RandomColor = {
|
||||
Color(255,255,255),
|
||||
Color(255,255,255),
|
||||
Color(255,255,255),
|
||||
Color(255,255,255),
|
||||
Color(255,255,255),
|
||||
Color(255,255,255),
|
||||
}
|
||||
|
||||
|
||||
-- example variant2:
|
||||
ENT.RandomColor = {
|
||||
{
|
||||
Skin = 1,
|
||||
Color = Color(255,255,255),
|
||||
BodyGroups = {
|
||||
[1] = 3, -- set bodygroup 1 to 3
|
||||
[5] = 7, -- set bodygroup 5 to 7
|
||||
},
|
||||
},
|
||||
{
|
||||
Skin = 2,
|
||||
Color = Color(255,255,255),
|
||||
},
|
||||
{
|
||||
Skin = 3,
|
||||
Color = Color(255,255,255),
|
||||
},
|
||||
{
|
||||
Skin = 4,
|
||||
Color = Color(255,255,255),
|
||||
},
|
||||
{
|
||||
Skin = 5,
|
||||
Color = Color(255,255,255),
|
||||
},
|
||||
{
|
||||
Skin = 6,
|
||||
Color = Color(255,255,255),
|
||||
Wheels = { -- can also color wheels in this variant
|
||||
Skin = 0,
|
||||
Color = Color(255,255,0),
|
||||
},
|
||||
},
|
||||
}
|
||||
]]
|
||||
|
||||
--ENT.HornSound = "lvs/horn2.wav" add a horn sound
|
||||
--ENT.HornSoundInterior = "lvs/horn2.wav" -- leave it commented out, that way it uses the same as ENT.HornSound
|
||||
--ENT.HornPos = Vector(40,0,35) -- horn sound position
|
||||
|
||||
|
||||
--[[weapons]]
|
||||
function ENT:InitWeapons()
|
||||
-- add a weapon:
|
||||
|
||||
local weapon = {}
|
||||
weapon.Icon = Material("lvs/weapons/bullet.png")
|
||||
|
||||
-- overheat system:
|
||||
weapon.Ammo = 1000
|
||||
weapon.Delay = 0.1
|
||||
weapon.HeatRateUp = 0.2
|
||||
weapon.HeatRateDown = 0.25
|
||||
|
||||
-- clip system example:
|
||||
--[[
|
||||
weapon.Clip = 20
|
||||
weapon.Ammo = 60
|
||||
weapon.Delay = 0.1
|
||||
weapon.ReloadSpeed = 2
|
||||
weapon.OnReload = function( ent )
|
||||
ent:EmitSound("lvs/vehicles/sherman/cannon_reload.wav" )
|
||||
end
|
||||
]]
|
||||
|
||||
weapon.Attack = function( ent )
|
||||
-- "ent" can be either the weapon handler or the vehicle(which has a integrated weapon handler)
|
||||
-- "ent" is where ent:SetHeat, ent:GetHeat, ent:GetAmmo ect functions are called on.
|
||||
-- for seat 1 (which is the driver), ent is equal to self (the vehicle), passenger seats usually return the weapon handler and not self.
|
||||
-- if you want to be 100% sure to get the actual vehicle, just call ent:GetVehicle() it will always return the base vehicle.
|
||||
|
||||
local bullet = {}
|
||||
bullet.Src = ent:LocalToWorld( Vector(25,0,30) )
|
||||
bullet.Dir = ent:GetForward()
|
||||
bullet.Spread = Vector( 0.015, 0.015, 0 )
|
||||
bullet.TracerName = "lvs_tracer_orange"
|
||||
bullet.Force = 10 -- this divided by 100 = penetration in mm
|
||||
--bullet.Force1km = 5 -- bullet force at 1km
|
||||
--bullet.EnableBallistics = true -- enable ballistics?
|
||||
bullet.HullSize = 15
|
||||
bullet.Damage = 10
|
||||
bullet.Velocity = 30000
|
||||
bullet.SplashDamage = 100
|
||||
bullet.SplashDamageRadius = 25
|
||||
--bullet.SplashDamageEffect = "lvs_bullet_impact"
|
||||
--bullet.SplashDamageType = DMG_SONIC
|
||||
--bullet.SplashDamageForce = 500
|
||||
bullet.Attacker = ent:GetDriver()
|
||||
bullet.Callback = function(att, tr, dmginfo) end
|
||||
|
||||
ent:LVSFireBullet( bullet )
|
||||
|
||||
ent:TakeAmmo( 1 )
|
||||
end
|
||||
weapon.StartAttack = function( ent ) end
|
||||
weapon.FinishAttack = function( ent ) end
|
||||
weapon.OnSelect = function( ent ) end
|
||||
weapon.OnDeselect = function( ent ) end
|
||||
weapon.OnThink = function( ent, active ) end
|
||||
weapon.OnOverheat = function( ent ) ent:EmitSound("lvs/overheat.wav") end
|
||||
weapon.OnRemove = function( ent ) end
|
||||
--[[
|
||||
weapon.CalcView = function( ent, ply, pos, angles, fov, pod )
|
||||
|
||||
-- build view yourself:
|
||||
local view = {}
|
||||
view.origin = pos
|
||||
view.angles = angles
|
||||
view.fov = fov
|
||||
view.drawviewer = false
|
||||
|
||||
return view
|
||||
|
||||
--or use inbuild camera system:
|
||||
--if pod:GetThirdPersonMode() then
|
||||
-- pos = pos + ent:GetUp() * 100 -- move camera 100 units up in third person
|
||||
--end
|
||||
--return LVS:CalcView( ent, ply, pos, angles, fov, pod )
|
||||
end
|
||||
]]
|
||||
--[[
|
||||
weapon.HudPaint = function( ent, X, Y, ply )
|
||||
-- hud paint that is only active when the weapon is selected
|
||||
-- draw stuff like crosshair here
|
||||
end
|
||||
]]
|
||||
--self:AddWeapon( weapon ) -- add weapon to driver seat. Uncomment to make it useable.
|
||||
|
||||
--self:AddWeapon( weapon, 2 ) -- this would register to weapon to seat 2
|
||||
--self:AddWeapon( weapon, 3 ) -- seat 3.. ect
|
||||
|
||||
--[[
|
||||
-- or use presets (defined in "lvs_base\lua\lvs_framework\autorun\lvs_defaultweapons.lua"):
|
||||
self.PosLMG = Vector(25,0,30) -- this is used internally as variable in LMG script
|
||||
self.DirLMG = 0 -- this is used internally as variable in LMG script
|
||||
self:AddWeapon( LVS:GetWeaponPreset( "LMG" ) )
|
||||
]]
|
||||
end
|
||||
|
||||
--[[ engine sounds ]]
|
||||
-- valid SoundType's are:
|
||||
-- LVS.SOUNDTYPE_IDLE_ONLY -- only plays in idle
|
||||
-- LVS.SOUNDTYPE_NONE -- plays all the time except in idle
|
||||
-- LVS.SOUNDTYPE_REV_UP -- plays when revving up
|
||||
-- LVS.SOUNDTYPE_REV_DOWN -- plays when revving down
|
||||
-- LVS.SOUNDTYPE_ALL -- plays all the time
|
||||
ENT.EngineSounds = {
|
||||
{
|
||||
sound = "vehicles/apc/apc_idle1.wav",
|
||||
Volume = 1,
|
||||
Pitch = 85,
|
||||
PitchMul = 25,
|
||||
SoundLevel = 75,
|
||||
SoundType = LVS.SOUNDTYPE_IDLE_ONLY,
|
||||
},
|
||||
{
|
||||
sound = "vehicles/airboat/fan_motor_fullthrottle_loop1.wav",
|
||||
--sound_int = "path/to/interior/sound.wav",
|
||||
Volume = 1, -- adjust volume
|
||||
Pitch = 50, -- start pitch value
|
||||
PitchMul = 100, -- value that gets added to Pitch at max engine rpm
|
||||
SoundLevel = 75, -- if too quiet, adjust soundlevel.
|
||||
SoundType = LVS.SOUNDTYPE_NONE,
|
||||
UseDoppler = true, -- use doppler system?
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
--[[ exhaust ]]
|
||||
--[[
|
||||
ENT.ExhaustPositions = {
|
||||
{
|
||||
pos = Vector(-100.04,14.72,4.84),
|
||||
ang = Angle(0,180,0),
|
||||
},
|
||||
{
|
||||
pos = Vector(-100.04,-14.72,4.84),
|
||||
ang = Angle(0,180,0),
|
||||
}
|
||||
}
|
||||
]]
|
||||
|
||||
|
||||
--[[ lights ]]
|
||||
ENT.Lights = {}
|
||||
-- see: https://raw.githubusercontent.com/SpaxscE/lvs_cars/main/zzz_ENT_lights_info.lua
|
||||
-- or https://discord.com/channels/1036581288653627412/1140195565368508427/1140195750207291403
|
||||
Reference in New Issue
Block a user