mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
180 lines
4.2 KiB
Lua
180 lines
4.2 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
-- Variables that are used on both client and server
|
||
|
|
|
||
|
|
SWEP.Instructions = "Shoot a prop to attach a Manhack.\nRight click to attach a rollermine."
|
||
|
|
SWEP.Author = "Facepunch"
|
||
|
|
|
||
|
|
SWEP.Spawnable = true
|
||
|
|
SWEP.AdminOnly = true
|
||
|
|
SWEP.UseHands = true
|
||
|
|
|
||
|
|
SWEP.ViewModel = "models/weapons/c_pistol.mdl"
|
||
|
|
SWEP.WorldModel = "models/weapons/w_pistol.mdl"
|
||
|
|
|
||
|
|
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 = false
|
||
|
|
SWEP.Secondary.Ammo = "none"
|
||
|
|
|
||
|
|
SWEP.Weight = 5
|
||
|
|
SWEP.AutoSwitchTo = false
|
||
|
|
SWEP.AutoSwitchFrom = false
|
||
|
|
|
||
|
|
SWEP.PrintName = "#GMOD_ManhackGun"
|
||
|
|
SWEP.Slot = 3
|
||
|
|
SWEP.SlotPos = 1
|
||
|
|
SWEP.DrawAmmo = false
|
||
|
|
SWEP.DrawCrosshair = true
|
||
|
|
SWEP.UseHands = true
|
||
|
|
|
||
|
|
local ShootSound = Sound( "Metal.SawbladeStick" )
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
Reload does nothing
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function SWEP:Reload()
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
Think does nothing
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function SWEP:Think()
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
PrimaryAttack
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function SWEP:PrimaryAttack()
|
||
|
|
|
||
|
|
local owner = self:GetOwner()
|
||
|
|
|
||
|
|
local tr = util.TraceLine( util.GetPlayerTrace( owner ) )
|
||
|
|
--if ( tr.HitWorld ) then return end
|
||
|
|
|
||
|
|
if ( IsFirstTimePredicted() ) then
|
||
|
|
local effectdata = EffectData()
|
||
|
|
effectdata:SetOrigin( tr.HitPos )
|
||
|
|
effectdata:SetNormal( tr.HitNormal )
|
||
|
|
effectdata:SetMagnitude( 8 )
|
||
|
|
effectdata:SetScale( 1 )
|
||
|
|
effectdata:SetRadius( 16 )
|
||
|
|
util.Effect( "Sparks", effectdata )
|
||
|
|
end
|
||
|
|
|
||
|
|
self:EmitSound( ShootSound )
|
||
|
|
|
||
|
|
self:ShootEffects()
|
||
|
|
|
||
|
|
-- The rest is only done on the server
|
||
|
|
if ( CLIENT ) then return end
|
||
|
|
|
||
|
|
-- Make a manhack
|
||
|
|
local ent = ents.Create( "npc_manhack" )
|
||
|
|
if ( !IsValid( ent ) ) then return end
|
||
|
|
|
||
|
|
ent:SetPos( tr.HitPos + owner:GetAimVector() * -16 )
|
||
|
|
ent:SetAngles( tr.HitNormal:Angle() )
|
||
|
|
ent:Spawn()
|
||
|
|
|
||
|
|
local weld = nil
|
||
|
|
|
||
|
|
if ( tr.HitWorld ) then
|
||
|
|
|
||
|
|
-- freeze it in place
|
||
|
|
ent:GetPhysicsObject():EnableMotion( false )
|
||
|
|
|
||
|
|
else
|
||
|
|
|
||
|
|
-- Weld it to the object that we hit
|
||
|
|
weld = constraint.Weld( tr.Entity, ent, tr.PhysicsBone, 0, 0 )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( owner:IsPlayer() ) then
|
||
|
|
undo.Create( "Manhack" )
|
||
|
|
undo.AddEntity( weld )
|
||
|
|
undo.AddEntity( ent )
|
||
|
|
undo.SetPlayer( owner )
|
||
|
|
undo.Finish()
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
SecondaryAttack
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function SWEP:SecondaryAttack()
|
||
|
|
|
||
|
|
local owner = self:GetOwner()
|
||
|
|
|
||
|
|
local tr = util.TraceLine( util.GetPlayerTrace( owner ) )
|
||
|
|
--if ( tr.HitWorld ) then return end
|
||
|
|
|
||
|
|
self:EmitSound( ShootSound )
|
||
|
|
self:ShootEffects()
|
||
|
|
|
||
|
|
if ( IsFirstTimePredicted() ) then
|
||
|
|
local effectdata = EffectData()
|
||
|
|
effectdata:SetOrigin( tr.HitPos )
|
||
|
|
effectdata:SetNormal( tr.HitNormal )
|
||
|
|
effectdata:SetMagnitude( 8 )
|
||
|
|
effectdata:SetScale( 1 )
|
||
|
|
effectdata:SetRadius( 16 )
|
||
|
|
util.Effect( "Sparks", effectdata )
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
-- The rest is only done on the server
|
||
|
|
if ( CLIENT ) then return end
|
||
|
|
|
||
|
|
-- Make a manhack
|
||
|
|
local ent = ents.Create( "npc_rollermine" )
|
||
|
|
if ( !IsValid( ent ) ) then return end
|
||
|
|
|
||
|
|
ent:SetPos( tr.HitPos + owner:GetAimVector() * -16 )
|
||
|
|
ent:SetAngles( tr.HitNormal:Angle() )
|
||
|
|
ent:Spawn()
|
||
|
|
|
||
|
|
local weld = nil
|
||
|
|
|
||
|
|
if ( !tr.HitWorld ) then
|
||
|
|
|
||
|
|
-- Weld it to the object that we hit
|
||
|
|
weld = constraint.Weld( tr.Entity, ent, tr.PhysicsBone, 0, 0 )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( owner:IsPlayer() ) then
|
||
|
|
undo.Create( "Rollermine" )
|
||
|
|
undo.AddEntity( weld )
|
||
|
|
undo.AddEntity( ent )
|
||
|
|
undo.SetPlayer( owner )
|
||
|
|
undo.Finish()
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
Name: ShouldDropOnDie
|
||
|
|
Desc: Should this weapon be dropped when its owner dies?
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function SWEP:ShouldDropOnDie()
|
||
|
|
return false
|
||
|
|
end
|