Initial Commit
This commit is contained in:
335
entities/weapons/weapon_jb_fists.lua
Normal file
335
entities/weapons/weapon_jb_fists.lua
Normal file
@@ -0,0 +1,335 @@
|
||||
-- ####################################################################################
|
||||
-- ## ##
|
||||
-- ## ##
|
||||
-- ## CASUAL BANANAS CONFIDENTIAL ##
|
||||
-- ## ##
|
||||
-- ## __________________________ ##
|
||||
-- ## ##
|
||||
-- ## ##
|
||||
-- ## Copyright 2014 (c) Casual Bananas ##
|
||||
-- ## All Rights Reserved. ##
|
||||
-- ## ##
|
||||
-- ## NOTICE: All information contained herein is, and remains ##
|
||||
-- ## the property of Casual Bananas. The intellectual and technical ##
|
||||
-- ## concepts contained herein are proprietary to Casual Bananas and may be ##
|
||||
-- ## covered by U.S. and Foreign Patents, patents in process, and are ##
|
||||
-- ## protected by trade secret or copyright law. ##
|
||||
-- ## Dissemination of this information or reproduction of this material ##
|
||||
-- ## is strictly forbidden unless prior written permission is obtained ##
|
||||
-- ## from Casual Bananas ##
|
||||
-- ## ##
|
||||
-- ## _________________________ ##
|
||||
-- ## ##
|
||||
-- ## ##
|
||||
-- ## Casual Bananas is registered with the "Kamer van Koophandel" (Dutch ##
|
||||
-- ## chamber of commerce) in The Netherlands. ##
|
||||
-- ## ##
|
||||
-- ## Company (KVK) number : 59449837 ##
|
||||
-- ## Email : info@casualbananas.com ##
|
||||
-- ## ##
|
||||
-- ## ##
|
||||
-- ####################################################################################
|
||||
|
||||
|
||||
-- NOTE: Loosely based on the default Garry's Mod hands.
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
SWEP.PrintName = "Fists";
|
||||
|
||||
SWEP.UseHands = true;
|
||||
|
||||
SWEP.Author = "Excl"
|
||||
SWEP.Purpose = ""
|
||||
|
||||
SWEP.ViewModel = "models/weapons/c_arms_citizen.mdl"
|
||||
SWEP.WorldModel = ""
|
||||
|
||||
SWEP.ViewModelFOV = 52
|
||||
SWEP.Slot = 0
|
||||
SWEP.SlotPos = 5
|
||||
|
||||
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 = true
|
||||
SWEP.Secondary.Ammo = "none"
|
||||
|
||||
local SwingSound = Sound( "weapons/slam/throw.wav" )
|
||||
local HitSound = Sound( "Flesh.ImpactHard" )
|
||||
|
||||
function SWEP:PreDrawViewModel( vm, wep, ply )
|
||||
if not self:GetRaised() then
|
||||
self.Correct = true;
|
||||
render.SetBlend(0);
|
||||
else
|
||||
self.Corrent = false;
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:PostDrawViewModel( vm, wep, ply )
|
||||
if self.Corrent then
|
||||
render.SetBlend(1);
|
||||
self.Correct = false;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
SWEP.HitDistance = 48
|
||||
|
||||
function SWEP:SetupDataTables()
|
||||
|
||||
self:NetworkVar( "Float", 0, "NextMeleeAttack" )
|
||||
self:NetworkVar( "Float", 1, "NextIdle" )
|
||||
self:NetworkVar( "Int", 0, "Combo" )
|
||||
self:NetworkVar( "Bool", 0, "Raised" );
|
||||
|
||||
end
|
||||
|
||||
function SWEP:UpdateNextIdle()
|
||||
|
||||
local vm = self.Owner:GetViewModel()
|
||||
self:SetNextIdle( CurTime() + vm:SequenceDuration() )
|
||||
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack( right )
|
||||
if not self:GetRaised() then
|
||||
if CLIENT and IsFirstTimePredicted() and !self.Owner.DoNotNotify then
|
||||
notification.AddLegacy("Press R to raise your fists",NOTIFY_HINT);
|
||||
self:SetNextPrimaryFire( CurTime() + 1.8 )
|
||||
self:SetNextSecondaryFire( CurTime() + 1.8 )
|
||||
self.Owner.DoNotNotify = true;
|
||||
end
|
||||
return;
|
||||
end
|
||||
|
||||
self.Owner:SetAnimation( PLAYER_ATTACK1 )
|
||||
|
||||
local anim = "fists_left"
|
||||
if ( right ) then anim = "fists_right" end
|
||||
if ( self:GetCombo() >= 2 ) then
|
||||
anim = "fists_uppercut"
|
||||
end
|
||||
|
||||
local vm = self.Owner:GetViewModel()
|
||||
vm:SendViewModelMatchingSequence( vm:LookupSequence( anim ) )
|
||||
|
||||
self:EmitSound( SwingSound )
|
||||
|
||||
self:UpdateNextIdle()
|
||||
self:SetNextMeleeAttack( CurTime() + 0.2 )
|
||||
|
||||
self:SetNextPrimaryFire( CurTime() + 0.6 )
|
||||
self:SetNextSecondaryFire( CurTime() + 0.6 )
|
||||
|
||||
end
|
||||
|
||||
function SWEP:Reload()
|
||||
if self.NextReload and self.NextReload > CurTime() then return end
|
||||
|
||||
self:SetRaised(not self:GetRaised());
|
||||
if CLIENT then
|
||||
if self:GetRaised() and IsFirstTimePredicted() then
|
||||
local vm = self.Owner:GetViewModel()
|
||||
vm:SendViewModelMatchingSequence( vm:LookupSequence( "fists_draw" ) )
|
||||
end
|
||||
end
|
||||
self.NextReload = CurTime() + 1;
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
self:PrimaryAttack( true )
|
||||
end
|
||||
|
||||
function SWEP:DealDamage()
|
||||
|
||||
local anim = self:GetSequenceName(self.Owner:GetViewModel():GetSequence())
|
||||
|
||||
self.Owner:LagCompensation( true )
|
||||
|
||||
local tr = util.TraceLine( {
|
||||
start = self.Owner:GetShootPos(),
|
||||
endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * self.HitDistance,
|
||||
filter = self.Owner
|
||||
} )
|
||||
|
||||
if ( !IsValid( tr.Entity ) ) then
|
||||
tr = util.TraceHull( {
|
||||
start = self.Owner:GetShootPos(),
|
||||
endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * self.HitDistance,
|
||||
filter = self.Owner,
|
||||
mins = Vector( -10, -10, -8 ),
|
||||
maxs = Vector( 10, 10, 8 )
|
||||
} )
|
||||
end
|
||||
|
||||
if ( tr.Hit ) then self:EmitSound( HitSound ) end
|
||||
|
||||
local hit = false
|
||||
|
||||
if ( SERVER && IsValid( tr.Entity ) && ( tr.Entity:IsNPC() || tr.Entity:IsPlayer() || tr.Entity:Health() > 0 ) ) then
|
||||
local dmginfo = DamageInfo()
|
||||
|
||||
local attacker = self.Owner
|
||||
if ( !IsValid( attacker ) ) then attacker = self end
|
||||
dmginfo:SetAttacker( attacker )
|
||||
|
||||
dmginfo:SetInflictor( self )
|
||||
dmginfo:SetDamage( math.random( 8,12 ) )
|
||||
|
||||
if ( anim == "fists_left" ) then
|
||||
dmginfo:SetDamageForce( self.Owner:GetRight() * 49125 + self.Owner:GetForward() * 99984 ) -- Yes we need those specific numbers
|
||||
elseif ( anim == "fists_right" ) then
|
||||
dmginfo:SetDamageForce( self.Owner:GetRight() * -49124 + self.Owner:GetForward() * 99899 )
|
||||
elseif ( anim == "fists_uppercut" ) then
|
||||
dmginfo:SetDamageForce( self.Owner:GetUp() * 51589 + self.Owner:GetForward() * 100128 )
|
||||
dmginfo:SetDamage( math.random( 10, 40 ) )
|
||||
end
|
||||
|
||||
tr.Entity:TakeDamageInfo( dmginfo )
|
||||
hit = true
|
||||
|
||||
end
|
||||
|
||||
if ( SERVER && IsValid( tr.Entity ) ) then
|
||||
local phys = tr.Entity:GetPhysicsObject()
|
||||
if ( IsValid( phys ) ) then
|
||||
phys:ApplyForceOffset( self.Owner:GetAimVector() * 80 * phys:GetMass(), tr.HitPos )
|
||||
end
|
||||
end
|
||||
|
||||
if ( SERVER ) then
|
||||
if ( hit && anim ~= "fists_uppercut" ) then
|
||||
self:SetCombo( self:GetCombo() + 1 )
|
||||
else
|
||||
self:SetCombo( 0 )
|
||||
end
|
||||
end
|
||||
|
||||
self.Owner:LagCompensation( false )
|
||||
|
||||
end
|
||||
|
||||
function SWEP:OnRemove()
|
||||
|
||||
if ( IsValid( self.Owner ) ) then
|
||||
local vm = self.Owner:GetViewModel()
|
||||
if ( IsValid( vm ) ) then vm:SetMaterial( "" ) end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function SWEP:Holster( wep )
|
||||
|
||||
self:OnRemove()
|
||||
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
function SWEP:Deploy()
|
||||
|
||||
local vm = self.Owner:GetViewModel()
|
||||
vm:SendViewModelMatchingSequence( vm:LookupSequence( "fists_draw" ) )
|
||||
|
||||
self:UpdateNextIdle()
|
||||
|
||||
if ( SERVER ) then
|
||||
self:SetCombo( 0 )
|
||||
end
|
||||
|
||||
self:SetRaised(false);
|
||||
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
function SWEP:Think()
|
||||
if self:GetRaised() then
|
||||
|
||||
local vm = self.Owner:GetViewModel()
|
||||
local curtime = CurTime()
|
||||
local idletime = self:GetNextIdle()
|
||||
|
||||
if ( idletime > 0 && CurTime() > idletime ) then
|
||||
|
||||
vm:SendViewModelMatchingSequence( vm:LookupSequence( "fists_idle_0" .. math.random( 1, 2 ) ) )
|
||||
|
||||
self:UpdateNextIdle()
|
||||
|
||||
end
|
||||
|
||||
local meleetime = self:GetNextMeleeAttack()
|
||||
|
||||
if ( meleetime > 0 && CurTime() > meleetime ) then
|
||||
|
||||
self:DealDamage()
|
||||
|
||||
self:SetNextMeleeAttack( 0 )
|
||||
|
||||
end
|
||||
|
||||
if ( SERVER && CurTime() > self:GetNextPrimaryFire() + 0.1 ) then
|
||||
|
||||
self:SetCombo( 0 )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
local index;
|
||||
|
||||
index = ACT_HL2MP_IDLE;
|
||||
|
||||
SWEP.ActivityTranslateNotRaised = {}
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_STAND_IDLE ] = index
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_WALK ] = index+1
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_RUN ] = index+2
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_CROUCH_IDLE ] = index+3
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_CROUCHWALK ] = index+4
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index+5
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index+5
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_RELOAD_STAND ] = index+6
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_RELOAD_CROUCH ] = index+6
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_JUMP ] = ACT_HL2MP_IDLE_DUEL+7
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_RANGE_ATTACK1 ] = index+8
|
||||
SWEP.ActivityTranslateNotRaised [ ACT_MP_SWIM ] = index+9
|
||||
|
||||
index=ACT_HL2MP_IDLE_FIST;
|
||||
|
||||
SWEP.ActivityTranslateRaised = {}
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_STAND_IDLE ] = index
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_WALK ] = index+1
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_RUN ] = index+2
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_CROUCH_IDLE ] = index+3
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_CROUCHWALK ] = index+4
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index+5
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index+5
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_RELOAD_STAND ] = index+6
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_RELOAD_CROUCH ] = index+6
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_JUMP ] = index+7
|
||||
SWEP.ActivityTranslateRaised [ ACT_RANGE_ATTACK1 ] = index+8
|
||||
SWEP.ActivityTranslateRaised [ ACT_MP_SWIM ] = index+9
|
||||
|
||||
index=nil;
|
||||
|
||||
function SWEP:TranslateActivity( act )
|
||||
|
||||
if self:GetRaised() then
|
||||
if ( self.ActivityTranslateRaised[ act ] ~= nil ) then
|
||||
return self.ActivityTranslateRaised[ act ]
|
||||
end
|
||||
else
|
||||
if ( self.ActivityTranslateNotRaised[ act ] ~= nil ) then
|
||||
return self.ActivityTranslateNotRaised[ act ]
|
||||
end
|
||||
end
|
||||
return -1
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user