dobrograd-13-06-2022/garrysmod/addons/feature-cars/lua/weapons/weapon_simfillerpistol.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

394 lines
11 KiB
Lua

AddCSLuaFile()
SWEP.Category = "simfphys"
SWEP.Spawnable = false
SWEP.AdminSpawnable = false
SWEP.ViewModel = "models/weapons/v_slam.mdl"
SWEP.WorldModel = "models/props_equipment/gas_pump_p13.mdl"
SWEP.UseHands = false
SWEP.ViewModelFlip = false
SWEP.ViewModelFOV = 10
SWEP.Weight = 42
SWEP.AutoSwitchTo = true
SWEP.AutoSwitchFrom = true
SWEP.HoldType = "slam"
SWEP.RefilAmount = 0.95
SWEP.MaxDistance = 120
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = true
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"
local inv_time = 0
function SWEP:SetupDataTables()
self:NetworkVar( "Int",0, "FuelType" )
end
function SWEP:IsAimingAt( vpos )
if not IsValid( self.Owner ) then return false end
local dir = self.Owner:GetAimVector()
local pos = self.Owner:GetShootPos()
local des_dir = (vpos - pos):GetNormalized()
local dist = (pos - vpos):Length()
local ang = math.acos( math.Clamp( dir:Dot(des_dir) ,-1,1) ) * (180 / math.pi)
local IsAimingAt = ang < 5 and dist < self.MaxDistance
return IsAimingAt
end
if SERVER then
util.AddNetworkString( "simfphys_gasspill" )
net.Receive( "simfphys_gasspill", function( length, ply )
local Pos = net.ReadVector()
local Dir = net.ReadVector()
if not ply:HasWeapon('weapon_simfillerpistol') then
ply:addExploitAttempt(0.25)
return
end
timer.Simple(0.2, function()
util.Decal("beersplash", Pos - Dir, Pos + Dir)
for i = 0,8 do
local sc = math.Rand(0.1,0.15)
local effectdata = EffectData()
effectdata:SetOrigin( Pos )
--effectdata:SetAngles( angle )
effectdata:SetNormal( Dir * 2 )
effectdata:SetMagnitude( sc )
effectdata:SetScale( sc )
effectdata:SetRadius( sc )
util.Effect( "StriderBlood", effectdata )
end
sound.Play( Sound( "ambient/water/water_spray"..math.random(1,3)..".wav" ), Pos, 55)
end)
end )
end
if CLIENT then
SWEP.PrintName = "Fuel filler pistol"
SWEP.Slot = 1
SWEP.SlotPos = 12
SWEP.IconLetter = "k"
--SWEP.WepSelectIcon = surface.GetTextureID( "weapons/s_repair" )
SWEP.DrawWeaponInfoBox = false
function SWEP:OnRemove()
if IsValid(self.pViewModel) then
self.pViewModel:Remove()
end
end
function SWEP:CreateModel()
if self.creatingModel or IsValid(self.pViewModel) then return end
self.creatingModel = true
timer.Simple(0, function()
if not IsValid(self) then return end
self.pViewModel = octolib.createDummy("models/props_equipment/gas_pump_p13.mdl", RENDERGROUP_OPAQUE)
self.pViewModel:SetNoDraw(true)
self.creatingModel = nil
end)
end
function SWEP:ViewModelDrawn()
if IsValid( self.Owner ) then
local ZOOM = self.Owner:KeyDown( IN_ZOOM )
self.ViewModelFOV = ZOOM and 30 or 10
if ZOOM then return end
local vm = self.Owner:GetViewModel()
local bm = vm:GetBoneMatrix(0)
local pos = bm:GetTranslation()
local ang = bm:GetAngles()
pos = pos + ang:Up() * 220
pos = pos + ang:Right() * 2
pos = pos + ang:Forward() * -12
ang:RotateAroundAxis(ang:Forward(), -85)
ang:RotateAroundAxis(ang:Right(), -20)
ang:RotateAroundAxis(ang:Up(), -70)
if not IsValid(self.pViewModel) then
return self:CreateModel()
end
self.pViewModel:SetPos(pos)
self.pViewModel:SetAngles(ang)
self.pViewModel:DrawModel()
end
end
function SWEP:DrawWorldModel()
if not IsValid( self.Owner ) then return end
local id = self.Owner:LookupAttachment("anim_attachment_rh")
local attachment = self.Owner:GetAttachment( id )
if not attachment then return end
local pos = attachment.Pos + attachment.Ang:Forward() * 6 + attachment.Ang:Right() * -1.5 + attachment.Ang:Up() * 2.2
local ang = attachment.Ang
ang:RotateAroundAxis(attachment.Ang:Up(), 20)
ang:RotateAroundAxis(attachment.Ang:Right(), -30)
ang:RotateAroundAxis(attachment.Ang:Forward(), 0)
self:SetRenderOrigin( pos )
self:SetRenderAngles( ang )
self:DrawModel()
end
local fuelposmat = Material( "sprites/fuelfiller_icon" )
local wrong_type = Material( "conquest/aim_friendly" )
function SWEP:DrawHUD()
if LocalPlayer():InVehicle() then return end
local screenw = ScrW()
local screenh = ScrH()
local Widescreen = (screenw / screenh) > (4 / 3)
local sizex = screenw * (Widescreen and 1 or 1.32)
local sizey = screenh
local xpos = sizex * 0.02
local ypos = sizey * 0.85
local dia = screenw * 0.025
local radius = dia * 0.5
local Trace = self.Owner:GetEyeTrace()
local ent = Trace.Entity
surface.SetDrawColor( 255, 0, 0,255 * math.Clamp(inv_time + 0.5 - CurTime(),0,1) )
surface.SetMaterial( wrong_type )
surface.DrawTexturedRect( screenw * 0.5 - radius, screenh * 0.5 - radius, dia, dia )
surface.SetDrawColor( 0, 0, 0, 80 )
surface.DrawRect( xpos, ypos, sizex * 0.118, sizey * 0.02 )
if not IsValid( ent ) then
draw.SimpleText( "0 / 0", "simfphysfont", xpos + sizex * 0.059, ypos + sizey * 0.01, Color( 238,238,238, 255 ), 1, 1 )
return
end
if simfphys.IsCar( ent ) then
local fuelpos = ent:GetFuelPos()
local IsAimingAt = self:IsAimingAt( fuelpos )
local col = IsAimingAt and Color(0,255,0,50) or Color(255,255,255,255)
local size = IsAimingAt and 4 or 8
cam.Start3D()
render.SetMaterial( fuelposmat )
render.DrawSprite( fuelpos, size, size, col )
cam.End3D()
local MaxFuel = math.Round( ent:GetMaxFuel() , 1)
local Fuel = math.Round( ent:GetFuel() , 1 )
local fueltype = ent:GetFuelType()
if fueltype == FUELTYPE_ELECTRIC then
MaxFuel = MaxFuel * 0.5
Fuel = Fuel * 0.5
end
local fueltype_color = Color(102,170,170,150)
if fueltype == 1 then
fueltype_color = Color(102,170,170,150)
elseif fueltype == 2 then
fueltype_color = Color(170,119,102,150)
end
surface.SetDrawColor( fueltype_color.r, fueltype_color.g, fueltype_color.b, fueltype_color.a )
surface.DrawRect( xpos, ypos, ((sizex * 0.118) / MaxFuel) * Fuel, sizey * 0.02, fueltype_color )
draw.SimpleText( Fuel.." / "..MaxFuel, "simfphysfont", xpos + sizex * 0.059, ypos + sizey * 0.01, Color( 238, 238, 238, 255 ), 1, 1 )
else
draw.SimpleText( "0 / 0", "simfphysfont", xpos + sizex * 0.059, ypos + sizey * 0.01, Color( 238, 238, 238, 255 ), 1, 1 )
end
end
end
function SWEP:Initialize()
self.Weapon:SetHoldType( self.HoldType )
if IsValid( self.Owner ) then
self.Owner.usedFuel = 0
end
end
function SWEP:OwnerChanged()
end
function SWEP:Think()
if CLIENT then
self.nextThink = self.nextThink or 0
if self.nextThink > CurTime() then return end
self.nextThink = CurTime() + 0.02
if not IsValid( self.Owner ) then return end
if not self.Owner:KeyDown( IN_ATTACK ) then return end
if self:GetNetVar('NoFuel') then return end
local Trace = self.Owner:GetEyeTrace()
local ent = Trace.Entity
local InRange = (Trace.HitPos - self.Owner:GetPos()):Length() < self.MaxDistance
local HIT = IsValid( ent ) and simfphys.IsCar( ent ) and InRange
if HIT then
if self:GetFuelType() ~= ent:GetFuelType() then inv_time = CurTime() return end
end
if self:GetFuelType() == FUELTYPE_ELECTRIC then return end
local id = self.Owner:LookupAttachment("anim_attachment_rh")
local attachment = self.Owner:GetAttachment( id )
if not attachment then return end
local Pos = (attachment.Pos + attachment.Ang:Forward() * 14 + attachment.Ang:Right() * -5 + attachment.Ang:Up() * 7 )
local FirstPerson = self.Owner == LocalPlayer() and self.Owner:GetViewEntity() == self.Owner
if FirstPerson then
Pos = self.Owner:GetShootPos() + self.Owner:EyeAngles():Forward() * 10 + self.Owner:EyeAngles():Right() * 3 - self.Owner:EyeAngles():Up() * 2
end
local emitter = ParticleEmitter( Pos, false )
local particle = emitter:Add( "effects/slime1", Pos )
if not HIT and InRange or (IsValid( ent ) and simfphys.IsCar( ent ) and ent:GetFuel() >= ent:GetMaxFuel()) or (IsValid( ent ) and simfphys.IsCar( ent ) and not self:IsAimingAt( ent:GetFuelPos() ) ) then
self.NextSplash = self.NextSplash or 0
if self.NextSplash < CurTime() then
self.NextSplash = CurTime() + math.Rand(0.05,0.2)
net.Start( "simfphys_gasspill" )
net.WriteVector( Trace.HitPos )
net.WriteVector( Trace.HitNormal )
net.SendToServer()
end
end
if particle then
local dir = attachment.Ang
dir:RotateAroundAxis(attachment.Ang:Up(), 20)
if FirstPerson then
dir = self.Owner:EyeAngles() + Angle(-15,10,0)
end
particle:SetVelocity( dir:Forward() * 320 )
particle:SetDieTime( HIT and 0.1 or 0.3 )
particle:SetAirResistance( 400 )
particle:SetStartAlpha( 100 )
particle:SetStartSize( 1 )
particle:SetEndSize( HIT and 1 or 2 )
particle:SetRoll( math.Rand( -1, 1 ) )
particle:SetColor( 240,200,0,255 )
particle:SetGravity( Vector( 0, 0, -600 ) )
particle:SetCollide( true )
end
emitter:Finish()
end
end
function SWEP:CanPrimaryAttack()
self.NextFire = self.NextFire or 0
if self.NextFire > CurTime() then
return false
end
return true
end
function SWEP:SetNextPrimaryFire( time )
self.NextFire = time
end
function SWEP:PrimaryAttack()
if not self:CanPrimaryAttack() then return end
local Trace = self.Owner:GetEyeTrace()
local ent = Trace.Entity
local InRange = (Trace.HitPos - self.Owner:GetPos()):Length() < self.MaxDistance
local HIT = IsValid( ent ) and simfphys.IsCar( ent ) and InRange
if SERVER then
self.Owner.usedFuel = self.Owner.usedFuel or 0
if self.Owner.usedFuel >= self.Owner.usedFuelMax then
self:SetNetVar('NoFuel', true)
return
end
local fuelUse = math.min(self.RefilAmount, self.Owner.usedFuelMax - self.Owner.usedFuel)
if HIT then
local Fuel = ent:GetFuel()
local MaxFuel = ent:GetMaxFuel()
if self:IsAimingAt( ent:GetFuelPos() ) and Fuel < MaxFuel then
timer.Simple(0.2, function()
if not IsValid( ent ) or not IsValid( self ) or not IsValid( self.Owner ) then return end
if self:GetFuelType() ~= ent:GetFuelType() then return end
local newFuel = Fuel + fuelUse
ent:SetFuel(newFuel)
ent:SetNetVar('Fuel', newFuel)
timer.Simple(0.2, function()
if self:GetFuelType() == FUELTYPE_ELECTRIC then
sound.Play( Sound( "items/battery_pickup.wav" ), Trace.HitPos, 50)
local effectdata = EffectData()
effectdata:SetOrigin( Trace.HitPos )
effectdata:SetNormal( Trace.HitNormal * 3 )
effectdata:SetMagnitude( 2 )
effectdata:SetRadius( 8 )
util.Effect( "Sparks", effectdata, true, true )
self.Owner.usedFuel = self.Owner.usedFuel + fuelUse
else
sound.Play( Sound( "vehicles/jetski/jetski_no_gas_start.wav" ), Trace.HitPos, 65)
end
end)
end)
end
end
if self:GetFuelType() ~= FUELTYPE_ELECTRIC then
self.Owner.usedFuel = self.Owner.usedFuel + fuelUse
end
end
self:SetNextPrimaryFire( CurTime() + 0.5 )
end
function SWEP:SecondaryAttack()
return false
end
function SWEP:Deploy()
self.Weapon:SendWeaponAnim( ACT_VM_DRAW )
return true
end
function SWEP:Holster()
return true
end