• Bullet Penetration (Basic)
    2 replies, posted
Hello, I wanted to get some feedback on this penetration script I made up (well more like a series of functions), it works but I'm not exactly sure how efficient the whole thing is. Using it with http://steamcommunity.com/sharedfiles/filedetails/?id=122666302 [code] -- Have the bullet penetrate -- End recursion if the max distance is reached or if it hits an empty space function BulletPenetrate(start, maxDistance, angle, distance) if distance > maxDistance then return false end local tr = GetBulletTrace(start, angle, 10) local newBulletOrigin if tr.Entity ~= NULL then if tr.Entity:GetClass() == "prop_physics" then end end if tr.Entity == NULL then newBulletOrigin = start return newBulletOrigin else newBulletOrigin = BulletPenetrate(BulletForward(start, angle), maxDistance, angle, distance + 1) end if newBulletOrigin == false then return false end return newBulletOrigin end -- Checks how far the bullet will travel function CheckBulletDistance(origin, angle) local tr = GetBulletTrace(origin, angle, 10000) local endDest = tr.HitPos local hitdist = origin:Distance(endDest) return hitdist end -- Get the trace of the bullet path function GetBulletTrace(origin, angle, distance) local tr = util.TraceLine( { start = origin, endpos = origin + angle:Forward() * distance, filter = function( ent ) if ( ent:GetClass() == "prop_physics" ) then return true end end} ) return tr end -- Move the bullet forward through the entity function BulletForward(origin, angle) return origin + angle:Forward() end function MaterialStrength(matEnum) materialStrengths = { [MAT_CONCRETE] = 5, [MAT_GLASS] = 45, [MAT_METAL] = 5, [MAT_PLASTIC] = 30, [MAT_WOOD] = 30 } return materialStrengths[matEnum] end function PenPowerLoss(matEnum) materialModifiers = { [MAT_CONCRETE] = 80, [MAT_GLASS] = 5, [MAT_METAL] = 80, [MAT_PLASTIC] = 20, [MAT_WOOD] = 40 } return materialModifiers[matEnum] end -- START HERE -- Fire a bullet function FirePenBullet(bullet, owner, maxPenDist) if maxPenDist < 0 then return false end print("Strength left: ", maxPenDist) CheckBulletDistance(bullet.Src, bullet.Dir:Angle()) local tr = GetBulletTrace(bullet.Src, bullet.Dir:Angle(), 10000) owner:FireBullets( bullet ) if MaterialStrength(tr.MatType) == nil then return false else maxPenDist = maxPenDist - PenPowerLoss(tr.MatType) end local penTest = BulletPenetrate(tr.HitPos, MaterialStrength(tr.MatType), bullet.Dir:Angle(), 0) if penTest ~= false then bullet.Src = penTest owner:FireBullets( bullet ) end if maxPenDist > 0 then FirePenBullet(bullet, owner, maxPenDist) end return true end [/code]
[lua] function MaterialStrength(matEnum) materialStrengths = { [MAT_CONCRETE] = 5, [MAT_GLASS] = 45, [MAT_METAL] = 5, [MAT_PLASTIC] = 30, [MAT_WOOD] = 30 } return materialStrengths[matEnum] end function PenPowerLoss(matEnum) materialModifiers = { [MAT_CONCRETE] = 80, [MAT_GLASS] = 5, [MAT_METAL] = 80, [MAT_PLASTIC] = 20, [MAT_WOOD] = 40 } return materialModifiers[matEnum] end [/lua] In these functions, you can move the table definitions to the start of your file, so you don't constantly have to rebuild the table with each call. Apart from that, looks alright if you ask me. Also, here, you can merge the 2 if statements: [lua] if tr.Entity ~= NULL then if tr.Entity:GetClass() == "prop_physics" then end end if tr.Entity == NULL then newBulletOrigin = start return newBulletOrigin else newBulletOrigin = BulletPenetrate(BulletForward(start, angle), maxDistance, angle, distance + 1) end [/lua] would become [lua] if tr.Entity == NULL then newBulletOrigin = start return newBulletOrigin else if tr.Entity:GetClass() == "prop_physics" then end newBulletOrigin = BulletPenetrate(BulletForward(start, angle), maxDistance, angle, distance + 1) end [/lua]
[QUOTE=James xX;47650704][lua] function MaterialStrength(matEnum) materialStrengths = { [MAT_CONCRETE] = 5, [MAT_GLASS] = 45, [MAT_METAL] = 5, [MAT_PLASTIC] = 30, [MAT_WOOD] = 30 } return materialStrengths[matEnum] end function PenPowerLoss(matEnum) materialModifiers = { [MAT_CONCRETE] = 80, [MAT_GLASS] = 5, [MAT_METAL] = 80, [MAT_PLASTIC] = 20, [MAT_WOOD] = 40 } return materialModifiers[matEnum] end [/lua] In these functions, you can move the table definitions to the start of your file, so you don't constantly have to rebuild the table with each call. Apart from that, looks alright if you ask me. Also, here, you can merge the 2 if statements: [/QUOTE] Thanks for this one, don't know why I didn't think about doing that earlier. 2nd part I was a bit silly with, it had a little message that popped up on console if I hit a prop, but I don't really need to do that anymore.
Sorry, you need to Log In to post a reply to this thread.