• 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.