add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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),
},
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1 @@
include("shared.lua")

View File

@@ -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

View File

@@ -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),
},
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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),
},
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1 @@
include("shared.lua")

View File

@@ -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

View File

@@ -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),
},
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
]]

View File

@@ -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
]]

View File

@@ -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