AddCSLuaFile("cl_init.lua")AddCSLuaFile("shared.lua")include("shared.lua")function ENT:SetPlayer(ply) if ply == nil then self:Remove() end self.Founder = ply self:SetPhysicsAttacker(ply) self:SetOwner(ply) self.FounderIndex = ply:UniqueID() self:SetNetworkedString("FounderName", ply:Nick())endfunction ENT:SetDriver(ply) self.Driver = ply if ply != NULL and ply != nil then if ply:IsValid() then local phys = self:GetPhysicsObject() if not phys:IsValid() then return end phys:EnableGravity(true) self.Land = true self.TakeOff = false umsg.Start("CurVehicleOffset", ply) umsg.Angle(self.Offset) umsg.End() end endendfunction ENT:Setup(model, drag, health, color, offset, parts) if self:GetOwner() == NULL then return end self.Model = model self.Drag = drag self.Health = health self.MaxHealth = health self.Color = color self.Offset = offset self.Parts = parts or {}endfunction ENT:Initialize() self:SetModel( self.Model ) self:SetColor( self.Color.r, self.Color.g, self.Color.b, self.Color.a ) self:PhysicsInit( SOLID_VPHYSICS ) self:SetMoveType( MOVETYPE_VPHYSICS ) self:SetSolid( SOLID_VPHYSICS ) self.TakeOff = false self.Land = true self.Launch = .1 self.Crash = false self.BaseSpeed = 100 - self.Drag * 80 //minimum is 20 speed scaled down util.PrecacheSound("doors/doorstop1.wav") util.PrecacheSound("ambient/machines/thumper_startup1.wav")endfunction ENT:MaxVehicleHealth() return self.MaxHealthendfunction ENT:GetTrueForward() local curang = self:GetForward():Angle() curang.yaw = math.NormalizeAngle(curang.yaw + self.Offset.yaw) return curang:Forward()endfunction ENT:GetTrueForwardAngle() local curang = self:GetForward():Angle() curang.yaw = math.NormalizeAngle(curang.yaw + self.Offset.yaw) return curangendfunction ENT:GetTrueRight() local curang = self:GetForward():Angle() curang.roll = math.NormalizeAngle(curang.roll + self.Offset.roll) return curang:Forward()endfunction ENT:GetTrueRightAngle() local curang = self:GetForward():Angle() curang.roll = math.NormalizeAngle(curang.roll + self.Offset.roll) return curangendfunction ENT:GetTrueUp() local curang = self:GetUp():Angle() curang.pitch = math.NormalizeAngle(curang.pitch + self.Offset.pitch) return curang:Forward()endfunction ENT:GetTrueUpAngle() local curang = self:GetUp():Angle() curang.pitch = math.NormalizeAngle(curang.pitch + self.Offset.pitch) return curangendfunction ENT:TestAngles() local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetForward()*60) ) effectdata:SetAngle(Angle(220,0,0)) util.Effect("angle_test", effectdata) local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetRight()*60) ) effectdata:SetAngle(Angle(0,220,0)) util.Effect("angle_test", effectdata) local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetUp()*60) ) effectdata:SetAngle(Angle(0,0,200)) util.Effect("angle_test", effectdata) //modified angles now local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetTrueForward()*60) +Vector(0,0,10)) effectdata:SetAngle(Angle(220,0,0)) util.Effect("angle_test", effectdata) local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetTrueRight()*60) +Vector(0,0,10)) effectdata:SetAngle(Angle(0,220,0)) util.Effect("angle_test", effectdata) local effectdata = EffectData() effectdata:SetOrigin(self:GetPos() + (self:GetTrueUp()*60) +Vector(0,0,10)) effectdata:SetAngle(Angle(0,0,200)) util.Effect("angle_test", effectdata)endlocal v15up = Vector(0, 0, 15)local v20up = Vector(0, 0, 20)function ENT:PhysicsSimulate(phys, frametime) self:TestAngles() local v = self.Driver if not v:IsValid() then return SIM_NOTHING end v:SetPos(self:GetPos() + v15up) if self.Crash then if v:IsValid() then v:DestroyVehicle() end end if self.Launch > CurTime() then phys:ApplyForceCenter(self.BaseSpeed * phys:GetMass() * self:GetTrueUp() + v20up) phys:EnableGravity(false) return elseif self.TakeOff then phys:ApplyForceCenter((self.BaseSpeed / 1.5) * phys:GetMass() * self:GetTrueForward()) end if v:KeyDown( IN_JUMP ) then if self.TakeOff then self.Land = true self.TakeOff = false phys:EnableGravity(true) self:EmitSound("doors/doorstop1.wav", 100, math.random(90, 100)) elseif self.Land then self.TakeOff = true self.Land = false self.Launch = CurTime() + 1.3 self:EmitSound("ambient/machines/thumper_startup1.wav", 100, math.random(90, 100)) end end if self.Launch < CurTime() and self.TakeOff then if v:KeyDown( IN_FORWARD ) then if v.Inverted then phys:AddAngleVelocity(Angle(0, self.BaseSpeed * frametime * -66, 0)) else phys:AddAngleVelocity(Angle(0, self.BaseSpeed * frametime * 66, 0)) end elseif v:KeyDown( IN_BACK ) then if not v.Inverted then phys:AddAngleVelocity(Angle(0, self.BaseSpeed * frametime * -66, 0)) else phys:AddAngleVelocity(Angle(0, self.BaseSpeed * frametime * 66, 0)) end elseif v:KeyDown( IN_SPEED ) then if not self.Land then local forward = phys:GetMass() * self.BaseSpeed * self:GetTrueForward() phys:ApplyForceCenter(forward) end elseif v:KeyDown( IN_MOVELEFT ) then if not self.Land then phys:AddAngleVelocity(Angle(-1 * self.BaseSpeed * 0.5 * self:GetTrueForward():Forward(), 0, 0)) end elseif v:KeyDown( IN_MOVERIGHT ) then if not self.Land then phys:AddAngleVelocity(Angle(1 * self.BaseSpeed * 0.5 * self:GetTrueForward():Forward(), 0, 0)) end end endendfunction ENT:Think()endfunction ENT:OnTakeDamage(dmg) local owner = self:GetOwner() if dmg:GetAttacker():IsPlayer() then if dmg:GetAttacker():Team() == owner:Team() then return end self.Health = self.Health - dmg:GetDamage() end self.Health = self.Health - dmg:GetDamage() if self.Health <= 0 then owner:DestroyVehicle(dmg:GetAttacker()) endendfunction ENT:Destroy() for k, v in pairs(self.Parts) do v:Remove() end self:Remove()endfunction ENT:PhysicsCollide(data, physobj) if self.Land then if data.Speed > 900 and data.DeltaTime > 0.2 then local owner = self:GetOwner() if owner and owner:IsValid() then self.Crash = true end end else if data.Speed > 500 and data.DeltaTime > 0.2 then local owner = self:GetOwner() if owner and owner:IsValid() then self.Crash = true end end endend