I am making a SWEP that increases the players jump power when the left click and sets it back to normal when they right click. After doing this I wanted to disable fall damage when the SWEP is in the hands of the player. I have found this: [url]http://maurits.tv/data/garrysmod/wiki/wiki.garrysmod.com/index5fc8.html[/url] and I got this code out of it:
[CODE]function SWEP:Deploy()
self.Owner.ShouldReduceFallDamage = true
return true
end
function SWEP:Holster()
self.Owner.ShouldReduceFallDamage = false
return true
end
local function ReduceFallDamage(ent, inflictor, attacker, amount, dmginfo)
if ent:IsPlayer() and ent.ShouldReduceFallDamage and dmginfo:IsFallDamage() then
dmginfo:SetDamage(1)
end
end
hook.Add("EntityTakeDamage", "ReduceFallDamage", ReduceFallDamage)
[/CODE]
I placed this at the bottom of my SWEP shared.lua script.
I get this error every time I hit the ground after jumping really high:
[CODE][Gravity Minimizer] lua/weapons/gravity minimizer/shared.lua:69: attempt to index local 'dmginfo' (a nil value)
1. v - lua/weapons/gravity minimizer/shared.lua:69
2. unknown - lua/includes/modules/hook.lua:84
[/CODE]
Anyone have any ideas on how to fix this error? Also it does not turn off fall damage. Which should be common sense.
I think you should change the "local function ReduceFallDamage" to this:
[code]SWEP:Think()
local Newdamage=dmginfo:GetDamage
if ent:IsPlayer() and self.Owner.ShouldReduceFallDamage = true and dmginfo:IsFallDamage() then
dmginfo:SetDamage(1)
elseif ent:IsPlayer() and self.Owner.ShouldReduceFallDamage = false and dmginfo:IsFallDamage() then
dmginfo:SetDamage(Newdamage)
[/code]
I believe that should work.
Why do you disagree lolcats?
I should replace this:
[CODE]local function ReduceFallDamage(ent, inflictor, attacker, amount, dmginfo)
if ent:IsPlayer() and ent.ShouldReduceFallDamage and dmginfo:IsFallDamage() then
dmginfo:SetDamage(1)
end
end[/CODE]
with this, correct?:
[CODE]function SWEP:Think()
local Newdamage=dmginfo:GetDamage
if ent:IsPlayer() and self.Owner.ShouldReduceFallDamage = true and dmginfo:IsFallDamage() then
dmginfo:SetDamage(1)
elseif ent:IsPlayer() and self.Owner.ShouldReduceFallDamage = false and dmginfo:IsFallDamage() then
dmginfo:SetDamage(Newdamage)
end
end[/CODE]
Edit: Does not work
Because that's not how you code. In any language. Ever. :v:
[code]
if (SERVER) then
local function nofalldam(target, dmginfo)
if (dmginfo:IsFallDamage() and target:GetActiveWeapon():GetClass() == "your_swep_name_here") then
dmginfo:SetDamage(0)
end
return dmginfo
end
hook.Add("EntityTakeDamage", "donotfalldamage", nofalldam)
end
[/code]
Ok this is my code currently:
[CODE]//This makes sure clients download the file
AddCSLuaFile()
//How heavy the SWEP is
SWEP.Weight = 1
//Allow automatic switching to/from this weapon when weapons are picked up
SWEP.AutoSwitchTo = false
SWEP.AutoSwitchFrom = false
SWEP.PrintName = "Jump Enhancer"
SWEP.Slot = 1
SWEP.SlotPos = 3
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = false
SWEP.Author = "Praesdynamite"
SWEP.Contact = "amrcommunity.com"
SWEP.Purpose = "Increases Jump Height"
SWEP.Instructions = "Right click to jump higher. Left click to set to normal"
SWEP.Category = "Praesdynamite's Schit Scripts"
SWEP.Spawnable = true -- Whether regular players can see it
SWEP.AdminSpawnable = true -- Whether Admins/Super Admins can see it
SWEP.ViewModel = "models/weapons/v_hands.mdl" -- What the player with the gravity minimizer sees
SWEP.WorldModel = "models/weapons/w_hands.mdl" -- What other players see.
//Left click information
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Ammo = "none"
SWEP.Primary.Delay = 10
SWEP.Primary.Automatic = false
//Right click stuff
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"
local GravitySound = Sound("sound/weapons/gravity minimizer/gravitychange.wav")
function SWEP:PrimaryAttack()
self.Owner:SetJumpPower(1000)
self.Owner:EmitSound(GravitySound)
end
function SWEP:SecondaryAttack()
self.Owner:SetJumpPower(200)
self.Owner:EmitSound(GravitySound)
end
////---This is the bit you told me to put in. It does not work, though there are no script errors.
if (SERVER) then
local function nofalldam(ply, hitgroup, dmginfo)
if (dmginfo:IsFallDamage() and ply:GetActiveWeapon():GetClass() == "gravity_minimizer") then
dmginfo:SetDamage(0)
end
end
hook.Add("ScalePlayerDamage", "donotfalldamage", nofalldam)
end
[/CODE]
[editline]29th August 2014[/editline]
I still take 10 health damage when I hit the ground
Use my edited code I posted above. Apparantly ScalePlayerDamage doesn't detect fall damage (reasonable).
I have been frustrated with this addon all day. Thank you it worked.
To reduce fall damage you'd need to use the hook for it, not EntityScaleDamage because ALL damage will be removed OR you're adding additional logic checks that aren't necessary.
[code]//
// Logic to give a SWEP a perk of reducing fall damage to 0 - Josh 'Acecool' Moser
// When we use a hook, make sure we only return data for our specific logic
//
//
// Remove Fall-Damage if holding a special swep...
//
hook.Add( "GetFallDamage", "SwepRemovesFallDamage", function( _p, _fallspeed )
if ( !IsValid( _p ) ) then return; end
// Make sure the weapon is valid, and that it is a swep
local _w = _p:GetActiveWeapon( );
if ( !IsValid( _w ) || !_w.Clip1 ) then return; end
// Make sure the swep table exists..
local _tab = _w:GetTable( );
if ( !istable( _tab ) ) then return; end
// Now, if SWEP.KillFallDamagePERK = true; then we have 0 fall damage.
if ( _tab.KillFallDamagePERK ) then
return 0;
end
end );[/code]
In your SWEP, set SWEP.KillFallDamagePERK = true; for weapons that you should have 0 falldamage with.
[url]https://dl.dropboxusercontent.com/u/26074909/tutoring/weapons/weapon_perks.lua.html[/url]
[b]Hopefully these tutorials and information helps. As always, to view the Lua from any of my tutorials to enable copy/pasting ( HTML doesn't copy/paste well in terms of HTML / CSS Highlighted Lua ), remove .html from the url.[/b]
Sorry, you need to Log In to post a reply to this thread.