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

196 lines
No EOL
5.1 KiB
Lua

--[[-------------------------------------------------------------------------
Point and click
---------------------------------------------------------------------------]]
AddCSLuaFile()
SWEP.PrintName = "Mjölnir Gun"
SWEP.Instructions = "The power of Thor!"
SWEP.Spawnable = true
SWEP.AdminOnly = true
SWEP.UseHands = true
SWEP.ViewModel = Model( "models/weapons/c_pistol.mdl") --"models/weapons/w_eq_tablet.mdl") -- )
SWEP.WorldModel = Model( "models/weapons/w_pistol.mdl" )
-- No ammo
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = true
SWEP.Secondary.Ammo = "none"
SWEP.Slot = 5
SWEP.SlotPos = 1
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = false
SWEP.Spawnable = true
SWEP.UseHands = true
SWEP.Selected = 1
if ( SERVER ) then
SWEP.AutoSwitchTo = true
SWEP.AutoSwitchFrom = true
end
function SWEP:Initialize()
self:SetHoldType( "pistol" )
self:SendWeaponAnim( 1 )
self.power = 0
self._bUsed = true
self._bGlow = -1
end
function SWEP:HasPower()
return self:GetPower() >= 1
end
function SWEP:GetPower()
local a = (CurTime() - self.power) / 1.2
if a >= 1 then return 1 end
return math.max(0, a)
end
function SWEP:UsePower( t )
self.power = CurTime() + t
self._bUsed = true
timer.Simple(0.5, function()
if not IsValid( self ) then return end
self._bGlow = -1
self:SendWeaponAnim( ACT_VM_IDLE_LOWERED )
end)
end
-- SF commands
local function Strike( self, bAlt )
if CLIENT then return end
local tr = util.TraceLine( util.GetPlayerTrace( self:GetOwner() ) )
if not tr.HitPos then return end
if bAlt then
StormFox2.Thunder.CreateAt( tr.HitPos + vector_up * 4 )
else
StormFox2.Thunder.Strike( tr.HitPos, true )
end
end
local function Rumble( self )
if CLIENT then return end
local tr = util.TraceLine( util.GetPlayerTrace( self:GetOwner() ) )
if not tr.HitPos then return end
StormFox2.Thunder.Rumble(tr.HitPos,true)
end
function SWEP:CanPrimaryAttack()
return self:HasPower()
end
function SWEP:PrimaryAttack()
if not IsFirstTimePredicted() then return end
if not self:CanPrimaryAttack() then return end
local Owner = self:GetOwner()
Owner:MuzzleFlash()
self.Weapon:SendWeaponAnim( 186 )
Owner:SetAnimation( ACT_GLOCK_SHOOTEMPTY )
self._bGlow = CurTime() + 0.1
self:UsePower( ( 0.5 + CurTime()%0.5 ) )
if SERVER then
Strike(self, Owner:KeyDown(IN_SPEED))
else
--self:EmitSound("weapons/physcannon/energy_disintegrate4.wav", 75, 100, 0.2)
local hitPos = Owner:GetEyeTrace().HitPos or Owner:GetShootPos()
end
end
function SWEP:SecondaryAttack()
if not IsFirstTimePredicted() then return end
if not self:CanPrimaryAttack() then return end
self:UsePower( 0.25 )
self.Weapon:SendWeaponAnim( ACT_VM_IDLE_TO_LOWERED ) -- View model animation
if SERVER then
Rumble(self)
else
self:EmitSound("weapons/slam/mine_mode.wav")
end
end
function SWEP:Think()
if self._bUsed and self:HasPower() then
self:SendWeaponAnim( ACT_VM_IDLE_TO_LOWERED )
self._bUsed = false
self:EmitSound("weapons/physcannon/superphys_small_zap1.wav", 75, 100, 0.2)
end
end
function SWEP:Deploy()
self.Weapon:SendWeaponAnim( 172 )
return true
end
function SWEP:ShouldDropOnDie() return false end
if ( SERVER ) then return end -- Only clientside lua after this line
function SWEP:Holster()
end
SWEP.WepSelectIcon = surface.GetTextureID( "vgui/gmod_camera" )
-- Don't draw the weapon info on the weapon selection thing
function SWEP:DrawHUD() end
function SWEP:PrintWeaponInfo( x, y, alpha ) end
--[[-------------------------------------------------------------------------
function SWEP:CalcView(ply,pos,ang,fov)
--pos = pos + ang:Forward() * -50
return pos,ang,fov
end
---------------------------------------------------------------------------]]
-- CL swep rendering
function SWEP:CalcViewModelView( vm, _,_,pos, ang)
--pos = pos + ang:Forward() * 10 + ang:Right() * 30 + ang:Up()*5
--ang:RotateAroundAxis(ang:Up(),80)
return pos,ang
end
function SWEP:DrawWorldModel()
self:DrawModel()
cam.Start3D2D(self:LocalToWorld(Vector(1,-0.4,0.4)),self:LocalToWorldAngles(Angle(0,0,80)),0.1)
local w,h,s = 20,4,1
surface.SetDrawColor(0,0,0)
surface.DrawRect(0,0,w,h)
surface.SetDrawColor(0,255,0)
surface.DrawRect(s,s,w - s*2,h - s*2)
cam.End3D2D()
end
local g_mat = Material("sprites/glow04_noz")
function SWEP:PostDrawViewModel(vm,wep,ply)
if not vm then return end
local pos, ang = vm:GetBonePosition(39)
if self._bGlow > -1 then
local time = (self._bGlow - CurTime()) * 4
if time > 0 then
local t = (1 - time)
render.SetMaterial(g_mat)
render.DrawSprite(pos + ang:Up() * (3 + t * 2.1 ), 8 * t, 8 * t, color_white)
end
end
local pow = wep:GetPower()
ang:RotateAroundAxis(ang:Right(), 90)
cam.Start3D2D(pos - ang:Up() + ang:Forward() * -3,ang,0.1)
local w,h,s = 20,4,1
local w2 = w * pow
surface.SetDrawColor(0,0,0)
surface.DrawRect(0,0,w,h)
if pow < 1 then
surface.SetDrawColor(255,255 * pow,0)
else
surface.SetDrawColor(55,55,255)
end
surface.DrawRect(s,s,(w2 - s * 2),h - s*2)
cam.End3D2D()
end