How to add a delay between when a weapon is fired and when damage is dealt?
7 replies, posted
I'm sure this question has been asked a thousand times. I just can't find an answer. It's the last part of my swep i need to add before i can upload it to the workshop.
Here is my shared.lua
if (SERVER) then
AddCSLuaFile("shared.lua")
--models
resource.AddFile("models/weapons/combatcross.mdl")
resource.AddFile("models/weapons/combatcross_retracted.mdl")
--materials
resource.AddFile("materials/models/weapons/chain_spike.vtf")
resource.AddFile("materials/models/weapons/chain_spike.vmt")
resource.AddFile("materials/models/weapons/cross.vtf")
resource.AddFile("materials/models/weapons/cross.vmt")
resource.AddFile("materials/models/weapons/pike.vtf")
resource.AddFile("materials/models/weapons/pike.vmt")
end
SWEP.PrintName = ""
SWEP.Slot = 0
SWEP.SlotPos = 0
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = true
SWEP.Author = "Willom"
SWEP.Instructions = "Left click for attack."
SWEP.Contact = "N/A"
SWEP.Purpose = ""
SWEP.Category = ""
SWEP.ViewModelFOV = 70
SWEP.ViewModelFlip = false
SWEP.Spawnable = true
SWEP.AdminSpawnable = true
SWEP.HoldType = "melee"
SWEP.ViewModel = "models/weapons/combatcross.mdl"
SWEP.WorldModel = "models/weapons/combatcross_retracted.mdl"
SWEP.UseHands = true
SWEP.Primary.Sound = Sound( "" )
SWEP.Primary.Delay = 1.8
SWEP.Primary.Recoil = 0
SWEP.Primary.Damage = 1
SWEP.Primary.NumShots = 1
SWEP.Primary.Cone = 0
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.Ammo = "none"
function SWEP:Initialize()
if (SERVER) then
self:SetHoldType( self.HoldType )
end
end
function SWEP:Precache()
util.PrecacheModel( models/weapons/combatcross )
end
function
SWEP:PrimaryAttack()
self.Owner:LagCompensation( true )
self.Weapon:SendWeaponAnim(ACT_VM_HITCENTER)
self.Owner:SetAnimation(PLAYER_ATTACK1)
self.Weapon:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
self.Owner:LagCompensation( false )
--lag compensation added
self.Weapon:EmitSound("Weapon_Knife.Slash")
local trace = self.Owner:GetEyeTrace()
if trace.HitPos:Distance(self.Owner:GetShootPos()) <= 300 then
bullet = {}
bullet.Num = 1
bullet.Src = self.Owner:GetShootPos()
bullet.Dir = self.Owner:GetAimVector()
bullet.Spread = Vector(0, 0, 0)
bullet.Tracer = 0
bullet.Force = 14
bullet.Damage = 50
self.Owner:FireBullets(bullet)
self.Weapon:EmitSound("Weapon_Knife.Slash")
if(trace.Entity:IsPlayer() or trace.Entity:IsNPC() or trace.Entity:GetClass() == "prop_ragdoll") then
self.Weapon:EmitSound(SFleshHit[math.random(1,#SFleshHit)])
else
util.Decal("ManhackCut", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal)
if (trace.MatType == MAT_METAL or trace.MatType == MAT_VENT or trace.MatType == MAT_COMPUTER) then
self.Weapon:EmitSound(SMetalHit[math.random(1,#SMetalHit)])
elseif (trace.MatType == MAT_WOOD or trace.MatType == "MAT_FOLIAGE") then
self.Weapon:EmitSound(SWoodHit[math.random(1,#SWoodHit)])
elseif (trace.MatType == MAT_GLASS) then
self.Weapon:EmitSound(SGlassHit[math.random(1,#SGlassHit)])
elseif (trace.MatType == MAT_DIRT or trace.MatType == MAT_SAND or trace.MatType == MAT_SLOSH or trace.MatType == MAT_TILE or trace.MatType == MAT_PLASTIC or trace.MatType == MAT_CONCRETE) then
self.Weapon:EmitSound(SGroundHit[math.random(1,#SGroundHit)])
else
self.Weapon:EmitSound(SGroundHit[math.random(1,#SGroundHit)])
end
end
if (SERVER) then
local hitposent = ents.Create("info_target")
local trace = self.Owner:GetEyeTrace()
local hitpos = trace.HitPos
end
end
end
function SWEP:SecondaryAttack()
return
end
SWEP.Animations = {
primaryattack = PLAYER_ATTACK1;
vmprimaryattack = ACT_VM_PRIMARYATTACK;
};
-- Animations.
local ActIndex = {}
ActIndex["pistol"] = ACT_HL2MP_IDLE_PISTOL
ActIndex["smg"] = ACT_HL2MP_IDLE_SMG1
ActIndex["grenade"] = ACT_HL2MP_IDLE_GRENADE
ActIndex["ar2"] = ACT_HL2MP_IDLE_AR2
ActIndex["shotgun"] = ACT_HL2MP_IDLE_SHOTGUN
ActIndex["rpg"] = ACT_HL2MP_IDLE_RPG
ActIndex["physgun"] = ACT_HL2MP_IDLE_PHYSGUN
ActIndex["crossbow"] = ACT_HL2MP_IDLE_CROSSBOW
ActIndex["melee"] = ACT_HL2MP_IDLE_MELEE
ActIndex["slam"] = ACT_HL2MP_IDLE_SLAM
ActIndex["normal"] = ACT_HL2MP_IDLE
ActIndex["knife"] = ACT_HL2MP_IDLE_KNIFE
ActIndex["melee2"] = ACT_HL2MP_IDLE_MELEE2
ActIndex["passive"] = ACT_HL2MP_IDLE_PASSIVE
ActIndex["fist"] = ACT_HL2MP_IDLE_FIST
function SWEP:SetHoldType(t)
local index = ActIndex[t]
if (index == nil) then
Msg("SWEP:SetWeaponHoldType - ActIndex[ \""..t.."\" ] isn't set!\n")
return
end
self.ActivityTranslate = {}
self.ActivityTranslate [ ACT_MP_STAND_IDLE ] = index
self.ActivityTranslate [ ACT_MP_WALK ] = index+1
self.ActivityTranslate [ ACT_MP_RUN ] = index+2
self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = index+3
self.ActivityTranslate [ ACT_MP_CROUCHWALK ] = index+4
self.ActivityTranslate [ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index+5
self.ActivityTranslate [ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index+5
self.ActivityTranslate [ ACT_MP_RELOAD_STAND ] = index+6
self.ActivityTranslate [ ACT_MP_RELOAD_CROUCH ] = index+6
self.ActivityTranslate [ ACT_MP_JUMP ] = index+7
self.ActivityTranslate [ ACT_RANGE_ATTACK1 ] = index+8
if t == "normal" then
self.ActivityTranslate [ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM
end
if t == "passive" then
self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_CROUCH_IDLE
end
self:SetupWeaponHoldTypeForAI(t)
end
function SWEP:TranslateActivity(act)
if (self.Owner:IsNPC()) then
if (self.ActivityTranslateAI[act]) then
return self.ActivityTranslateAI[act]
end
return -1
end
if (self.ActivityTranslate[act] != nil) then
return self.ActivityTranslate[act]
end
return -1
end
Use timer.Simple.
Since you're using a bullet which is already doing damage, you'll have to delay the entity from taking that bullet damage using GM/EntityTakeDamage:
hook.Add("EntityTakeDamage", "CombatCrossDamage", function(ent, dmg)
local victim, attacker = ent, dmg:GetAttacker()
if not attacker:GetActiveWeapon():GetClass() == "combat_cross" then return end -- Assuming your weapon is called "combat_cross"
if not (victim:IsPlayer() or victim:IsNPC()) then return end -- Only players and NPCs should take the damage
if dmg:IsDamageType(DMG_DIRECT) then return end -- Don't infinitely loop damage
timer.Simple(1, function()
local d = DamageInfo()
d:SetDamage(dmg:GetDamage())
d:SetAttacker(attacker)
d:SetDamageType(DMG_DIRECT) -- Just take direct damage, but you could make it any of these http://wiki.garrysmod.com/page/Enums/DMG
victim:TakeDamageInfo(d)
end)
if dmg:IsDamageType(DMG_BULLET) then return true end -- Block the bullet damage
end)
I haven't tested this but something like this should work.
It just makes the weapon disappear from the spawn menu. Where should I put one of them in my lua file? I have a feeling i put it in the wrong place when i tried them both (i didnt try them both at the same time)
The first one is just a timer you insert inside your code (and set your bullet damage to zero).
The second one has to be run serverside only, so you would either put it inside your weapon's init.lua file if you are using a folder structure or inside an if SERVER then ... end if your weapon is using a single shared file
i tried the first one again. i get this in the console and the weapon doesnt appear in the spawnmenu
[ERROR] addons/combat cross/lua/weapons/weapon_combat_cross/shared.lua:140: '=' expected near 'IsValid'
1. unknown - addons/combat cross workin anims and third person/lua/weapons/weapon_combat_cross/shared.lua:0
heres my lua
if (SERVER) then
AddCSLuaFile("shared.lua")
--there was stuff here but i removed it because there were too many characters to post, refer to previous post as these parts are unchanged
SWEP.PrintName = "Combat Cross"
SWEP.Slot = 0
SWEP.SlotPos = 0
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = true
SWEP.Author = "Willom"
SWEP.Instructions = "Left click for attack."
SWEP.Contact = "N/A"
SWEP.Purpose = ""
SWEP.Category = ""
SWEP.ViewModelFOV = 70
SWEP.ViewModelFlip = false
SWEP.Spawnable = true
SWEP.AdminSpawnable = true
SWEP.HoldType = "melee"
SWEP.ViewModel = "models/weapons/combatcross.mdl"
SWEP.WorldModel = "models/weapons/combatcross_retracted.mdl"
SWEP.UseHands = true
SWEP.Primary.Sound = Sound( "" )
SWEP.Primary.Delay = 1.8
SWEP.Primary.Recoil = 0
SWEP.Primary.Damage = 1
SWEP.Primary.NumShots = 1
SWEP.Primary.Cone = 0
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.Ammo = "none"
function SWEP:Initialize()
if (SERVER) then
self:SetHoldType( self.HoldType )
end
SWoodHit = {
--sounds removed to post for same reason
}
end
function SWEP:Precache()
util.PrecacheModel( models/weapons/combatcross )
end
function
SWEP:PrimaryAttack()
self.Owner:LagCompensation( true )
self.Weapon:SendWeaponAnim(ACT_VM_HITCENTER)
self.Owner:SetAnimation(PLAYER_ATTACK1)
self.Weapon:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
self.Owner:LagCompensation( false )
--lag compensation added
self.Weapon:EmitSound("Weapon_Knife.Slash")
local trace = self.Owner:GetEyeTrace()
if trace.HitPos:Distance(self.Owner:GetShootPos()) <= 300 then
bullet = {}
bullet.Num = 1
bullet.Src = self.Owner:GetShootPos()
bullet.Dir = self.Owner:GetAimVector()
bullet.Spread = Vector(0, 0, 0)
bullet.Tracer = 0
bullet.Force = 14
bullet.Damage = 50
self.Owner:FireBullets(bullet)
self.Weapon:EmitSound("Weapon_Knife.Slash")
if(trace.Entity:IsPlayer() or trace.Entity:IsNPC() or trace.Entity:GetClass() == "prop_ragdoll") then
self.Weapon:EmitSound(SFleshHit[math.random(1,#SFleshHit)])
timer.Simple(1, function()ifnot IsValid(trace.Entity) thenreturnend
trace.Entity:TakeDamage(50, self.Owner, self)
end) --added
else
util.Decal("ManhackCut", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal)
if (trace.MatType == MAT_METAL or trace.MatType == MAT_VENT or trace.MatType == MAT_COMPUTER) then
self.Weapon:EmitSound(SMetalHit[math.random(1,#SMetalHit)])
elseif (trace.MatType == MAT_WOOD or trace.MatType == "MAT_FOLIAGE") then
self.Weapon:EmitSound(SWoodHit[math.random(1,#SWoodHit)])
elseif (trace.MatType == MAT_GLASS) then
self.Weapon:EmitSound(SGlassHit[math.random(1,#SGlassHit)])
elseif (trace.MatType == MAT_DIRT or trace.MatType == MAT_SAND or trace.MatType == MAT_SLOSH or trace.MatType == MAT_TILE or trace.MatType == MAT_PLASTIC or trace.MatType == MAT_CONCRETE) then
self.Weapon:EmitSound(SGroundHit[math.random(1,#SGroundHit)])
else
self.Weapon:EmitSound(SGroundHit[math.random(1,#SGroundHit)])
end
end
if (SERVER) then
local hitposent = ents.Create("info_target")
local trace = self.Owner:GetEyeTrace()
local hitpos = trace.HitPos
end
end
end
function SWEP:SecondaryAttack()
return
end
SWEP.Animations = {
primaryattack = PLAYER_ATTACK1;
vmprimaryattack = ACT_VM_PRIMARYATTACK;
};
--animation index also removed because too many characters
function SWEP:SetHoldType(t)
local index = ActIndex[t]
if (index == nil) then
Msg("SWEP:SetWeaponHoldType - ActIndex[ \""..t.."\" ] isn't set!\n")
return
end
self.ActivityTranslate = {}
self.ActivityTranslate [ ACT_MP_STAND_IDLE ] = index
self.ActivityTranslate [ ACT_MP_WALK ] = index+1
self.ActivityTranslate [ ACT_MP_RUN ] = index+2
self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = index+3
self.ActivityTranslate [ ACT_MP_CROUCHWALK ] = index+4
self.ActivityTranslate [ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index+5
self.ActivityTranslate [ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index+5
self.ActivityTranslate [ ACT_MP_RELOAD_STAND ] = index+6
self.ActivityTranslate [ ACT_MP_RELOAD_CROUCH ] = index+6
self.ActivityTranslate [ ACT_MP_JUMP ] = index+7
self.ActivityTranslate [ ACT_RANGE_ATTACK1 ] = index+8
if t == "normal" then
self.ActivityTranslate [ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM
end
if t == "passive" then
self.ActivityTranslate [ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_CROUCH_IDLE
end
self:SetupWeaponHoldTypeForAI(t)
end
function SWEP:TranslateActivity(act)
if (self.Owner:IsNPC()) then
if (self.ActivityTranslateAI[act]) then
return self.ActivityTranslateAI[act]
end
return -1
end
if (self.ActivityTranslate[act] != nil) then
return self.ActivityTranslate[act]
end
return -1
end
It looks like you didn't copy the code correctly, you are missing spaces between some of the keywords such as "if not" and "then return end"
You're missing an end after the second line
weird. i copied it right from your post. ill try it now.
Sorry, you need to Log In to post a reply to this thread.