196 lines
No EOL
5.1 KiB
Lua
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 |