function GAMEMODE:MVRicochetCallback( bouncenum, attacker, tr, dmginfo, bulletdmg, bulletforce, tracerfreq, tracer, hiteffect, ricodmgmod, ricoforcemod, ricospread, entity ) local DoDefaultEffect = false; if ( !tr.HitWorld ) then DoDefaultEffect = true end if ( tr.MatType != MAT_METAL && tr.MatType != MAT_CONCRETE && tr.MatType != MAT_VENT && tr.MatType != MAT_TILE && tr.MatType != MAT_COMPUTER) then if ( !tr.HitSky && tr.MatType != MAT_FLESH ) then local effectdata = EffectData() effectdata:SetOrigin( tr.HitPos ) effectdata:SetNormal( tr.HitNormal ) if hiteffect != nil and hiteffect != "" then util.Effect( hiteffect, effectdata ) else util.Effect( "MVhitsmoke", effectdata, true ) end end return end if ( CLIENT ) then return end if ( bouncenum > 7 ) then return end local RicoChance = 1 if ( tr.MatType == MAT_METAL ) then RicoChance = 1 //100% chance of ricochet end if ( tr.MatType == MAT_CONCRETE ) then RicoChance = 3 //33% chance end if ( tr.MatType == MAT_VENT ) then RicoChance = 2 //50% chance end if ( tr.MatType == MAT_TILE ) then RicoChance = 4 //25% chance end if ( tr.MatType == MAT_COMPUTER ) then RicoChance = 2 //50% chance end local DoRicochet = math.floor( math.Rand( 1, RicoChance+1 ) ) if ( DoRicochet != 1 ) then if ( !tr.HitSky && tr.MatType != MAT_FLESH ) then local effectdata = EffectData() effectdata:SetOrigin( tr.HitPos ) effectdata:SetNormal( tr.HitNormal ) if hiteffect != nil and hiteffect != "" then util.Effect( hiteffect, effectdata ) else util.Effect( "MVhitsmoke", effectdata, true ) end end return end local DotProduct = tr.HitNormal:Dot( tr.Normal * -1 ) local bullet = { Num = 1, Src = tr.HitPos, Dir = ( 2 * tr.HitNormal * DotProduct ) + tr.Normal, Spread = Vector( 0, 0, 0 ), //Vector( 0.05, 0.05, 0 ) Tracer = 1, TracerName = "MVricochet_"..tracer, Force = bulletforce * ricoforcemod, Damage = bulletdmg * ricodmgmod, AmmoType = "Pistol" } // Continue bouncing on the server only if entity != nil then bullet.Callback = function ( a, b, c ) GAMEMODE:MVRicochetCallback( bouncenum+1, a, b, c, bulletdmg, bulletforce, tracerfreq, tracer, hiteffect, ricodmgmod, ricoforcemod, ricospread, entity ) end else bullet.Callback = function ( a, b, c ) GAMEMODE:MVRicochetCallback( bouncenum+1, a, b, c, bulletdmg, bulletforce, tracerfreq, tracer, hiteffect, ricodmgmod, ricoforcemod, ricospread ) end end timer.Simple( 0.08 * bouncenum, attacker.FireBullets, attacker, bullet ) // If you don't want to do default damage or // effects you can return false here return { damage = true, effects = DoDefaultEffect } end