Help with scale damage.

I have a problem with a particular piece of code which until a few weeks ago has been working fine.


local function ReduceDamage(ent, dmginfo)
			local infl =dmginfo:GetInflictor()
			local att =dmginfo:GetAttacker()
			local amount =dmginfo:GetDamage()
			if activator:IsPlayer() and ent.ShouldReduceDamage and dmginfo:GetDamage() then
				dmginfo:ScaleDamage(.1)
			end
		end
						 
		hook.Add("EntityTakeDamage", "ReduceDamage", ReduceDamage)
	
		end

It was working fine so i don’t know if an update broke it or not.

Any help is appreciated.

The whole file is here.


AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include('shared.lua')

//Initialize
function ENT:Initialize()

	//Precache sounds
	util.PrecacheSound("plats/train_use1.wav")
	util.PrecacheSound("common/null.wav")

	//Draw model
	self.Entity:SetModel("models/props_phx/construct/plastic/plastic_angle_360.mdl")
	self.Entity:SetMaterial("models/props_lab/cornerunit_cloud")
	self.Entity:PhysicsInit( SOLID_VPHYSICS )
	self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
	self.Entity:SetSolid( SOLID_VPHYSICS )
	local phys = self.Entity:GetPhysicsObject()
	if (phys:IsValid()) then	
	phys:Wake()
	end

	//Default values
	self.charged = true
	self.auxcharged = true
	self.othercharged = true
	self.used = false
	self.disabled = false
	self.pickedup = false
	self.player = nil
	self.touched = false

end

//Spawn module
function ENT:SpawnFunction(ply, tr)

//Create this sent
if !tr.Hit then return end
local SpawnPos = tr.HitPos + tr.HitNormal * 16
local ent = ents.Create("sent_Magic")
ent:SetPos(SpawnPos)
ent:Spawn()
ent:Activate()
return ent

end

//Equip when touched
function ENT:Touch(activator)
if !self.touched then
	if activator:IsPlayer() then
		local a = ents.FindByClass("sent_Magic")
		local found = false
		local n = nil
		for k,v in ipairs(a) do
		if (v.player == activator) then
		found = true
		end
	end

	//Don't let anyone have more than one pack at the time
	if !found then
		self.Entity:SetOwner(activator)
		self.Entity:SetPos(activator:GetPos())
		self.Entity:SetGravity(1)
		self.Entity:SetParent(activator)
		self.Entity:SetCollisionGroup( COLLISION_GROUP_NONE )
		self.player = activator
		self.pickedup = true
		self.touched = true
		self.player.ShouldReduceDamage = true
		self.player:Give("Magic")

		//This part is dumb, but how else do you make it invisible?
		self.Entity:SetModel("models/dav0r/hoverball.mdl")
		self.Entity:SetMaterial("freezenade/freezenade_red")
		self.Entity:SetRenderMode(1)
		self.Entity:SetColor(Color(0,0,0,0))

		self.Entity:EmitSound("ambient/atmosphere/cave_hit1.wav")
	else
		self.Entity:EmitSound( "common/null.wav", 500, 100 ) //Bug
		end
	
	if math.Rand(1,2) <= 1 then
		local function ReduceDamage(ent, dmginfo)
			local infl =dmginfo:GetInflictor()
			local att =dmginfo:GetAttacker()
			local amount =dmginfo:GetDamage()
			if activator:IsPlayer() and ent.ShouldReduceDamage and dmginfo:GetDamage() then
				dmginfo:ScaleDamage(.1)
			end
		end
						 
		hook.Add("EntityTakeDamage", "ReduceDamage", ReduceDamage)
	
		end
	end

end
end

//Helper function
function ENT:Enable()
self.disabled = false
end

//Main function
function ENT:Think()

	//Remove if player isn't there
	if !self.pickedup and self.touched then
	self.Entity:Remove()
	end
end

Move the hook outside of any of other functions.

Like this?


AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include('shared.lua')

//Initialize
function ENT:Initialize()

	//Precache sounds
	util.PrecacheSound("plats/train_use1.wav")
	util.PrecacheSound("common/null.wav")

	//Draw model
	self.Entity:SetModel("models/props_phx/construct/plastic/plastic_angle_360.mdl")
	self.Entity:SetMaterial("models/props_lab/cornerunit_cloud")
	self.Entity:PhysicsInit( SOLID_VPHYSICS )
	self.Entity:SetMoveType( MOVETYPE_VPHYSICS )
	self.Entity:SetSolid( SOLID_VPHYSICS )
	local phys = self.Entity:GetPhysicsObject()
	if (phys:IsValid()) then	
	phys:Wake()
	end

	//Default values
	self.charged = true
	self.auxcharged = true
	self.othercharged = true
	self.used = false
	self.disabled = false
	self.pickedup = false
	self.player = nil
	self.touched = false

end

//Spawn module
function ENT:SpawnFunction(ply, tr)

//Create this sent
if !tr.Hit then return end
local SpawnPos = tr.HitPos + tr.HitNormal * 16
local ent = ents.Create("sent_Magic")
ent:SetPos(SpawnPos)
ent:Spawn()
ent:Activate()
return ent

end

hook.Add("EntityTakeDamage", "ReduceDamage", ReduceDamage)

//Equip when touched
function ENT:Touch(activator)
if !self.touched then
	if activator:IsPlayer() then
		local a = ents.FindByClass("sent_Magic")
		local found = false
		local n = nil
		for k,v in ipairs(a) do
		if (v.player == activator) then
		found = true
		end
	end

	//Don't let anyone have more than one pack at the time
	if !found then
		self.Entity:SetOwner(activator)
		self.Entity:SetPos(activator:GetPos())
		self.Entity:SetGravity(1)
		self.Entity:SetParent(activator)
		self.Entity:SetCollisionGroup( COLLISION_GROUP_NONE )
		self.player = activator
		self.pickedup = true
		self.touched = true
		self.player.ShouldReduceDamage = true
		self.player:Give("Magic")

		//This part is dumb, but how else do you make it invisible?
		self.Entity:SetModel("models/dav0r/hoverball.mdl")
		self.Entity:SetMaterial("freezenade/freezenade_red")
		self.Entity:SetRenderMode(1)
		self.Entity:SetColor(Color(0,0,0,0))

		self.Entity:EmitSound("ambient/atmosphere/cave_hit1.wav")
	else
		self.Entity:EmitSound( "common/null.wav", 500, 100 ) //Bug
		end

	if math.Rand(1,2) <= 1 then
		local function ReduceDamage(ent, dmginfo)
			local infl =dmginfo:GetInflictor()
			local att =dmginfo:GetAttacker()
			local amount =dmginfo:GetDamage()
			if activator:IsPlayer() and ent.ShouldReduceDamage and dmginfo:GetDamage() then
				dmginfo:ScaleDamage(.1)
			end
		end
	end

end
end
end

//Helper function
function ENT:Enable()
self.disabled = false
end

//Main function
function ENT:Think()

	//Remove if player isn't there
	if !self.pickedup and self.touched then
	self.Entity:Remove()
	end
end

Are you talking about moving the whole scale damage piece outside of the Ent:touch function then i cant.

I am sure i have done something wrong. I only know some gmod lua basics.