Page 1 of 1

Actor:takeHit Hook

Posted: Sat Mar 14, 2015 4:41 pm
by Razakai
I'm trying to create a talent that works in a similar manner to bloated oozes, namely summoning a few NPCs that while active will split damage among the player. The talent itself seems ok, but I just can't seem to get the hook working:

Code: Select all

class:bindHook("Actor:takeHit", function(self,data)		
		if value > 0 and self:hasEffect(self.EFF_LIFELINK) then
			local acts = {}
			if game.party:hasMember(self) then
				for act, def in pairs(game.party.members) do
					if act.summoner and act.summoner == self and act.cghoul then acts[#acts+1] = act end
				end
			else
				for _, act in pairs(game.level.entities) do
					if act.summoner and act.summoner == self and act.cghoul then acts[#acts+1] = act end
				end
			end
			if #acts > 0 then
				game:delayedLogMessage(self, nil, "lifelink_damage", "#DARK_GREEN##Source# shares damage with %s ghouls!", string.his_her(self))
				value = value / (#acts+1)
				for _, act in ipairs(acts) do
					act:takeHit(value, src)
				end
			end
		end
end)
Using this gives the following error:

Code: Select all

stack traceback:
	[C]: in function 'error'
	/engine/interface/ActorTalents.lua:248: in function </engine/interface/ActorTalents.lua:232>
Lua Error: /engine/interface/ActorTalents.lua:271: /engine/interface/ActorTalents.lua:248: /engine/interface/ActorTalents.lua:148: /hooks/deathknight/load.lua:27: attempt to compare number with nil
stack traceback:
	/hooks/deathknight/load.lua:27: in function </hooks/deathknight/load.lua:25>
	[string "return function(l, self, data) local ok=false..."]:1: in function <[string "return function(l, self, data) local ok=false..."]:1>
	/mod/class/Actor.lua:2669: in function 'onTakeHit'
	/mod/class/Player.lua:683: in function 'onTakeHit'
	/mod/class/interface/ActorLife.lua:40: in function 'takeHit'
	/mod/class/Actor.lua:2708: in function 'takeHit'
	/data/damage_types.lua:448: in function 'defaultProjector'
	/data/damage_types.lua:660: in function 'projector'
	/mod/class/interface/Combat.lua:540: in function 'attackTargetWith'
	/mod/class/interface/Combat.lua:206: in function 'attackTarget'
	/data/talents/misc/misc.lua:75: in function </data/talents/misc/misc.lua:54>
	[C]: in function 'xpcall'
	/engine/interface/ActorTalents.lua:145: in function </engine/interface/ActorTalents.lua:138>
	At [C]:-1 
	At [C]:-1 error
	At /engine/interface/ActorTalents.lua:271 bumpInto
	At /mod/class/Actor.lua:3342 attack
	At /engine/interface/ActorLife.lua:41 check
	At [string "return function(self, x, y, what, ...) local ..."]:1 checkAllEntities
	At /engine/interface/ActorAI.lua:63 aiCanPass
	At /engine/interface/ActorAI.lua:85 runAI
	At /engine/ai//simple.lua:205 runAI
	At /engine/ai//talented.lua:64 doAI
	At /mod/class/NPC.lua:72 act
	At /engine/GameEnergyBased.lua:126 tickLevel
	At /engine/GameEnergyBased.lua:62 tick
	At /engine/GameTurnBased.lua:46 tick
	At /mod/class/Game.lua:1255 

Re: Actor:takeHit Hook

Posted: Sat Mar 14, 2015 5:49 pm
by grayswandir
Don't you need data.value instead of value?

Re: Actor:takeHit Hook

Posted: Sat Mar 14, 2015 8:18 pm
by Razakai
If it's something that simple I'll feel rather silly. Thanks for the advice, I'll try it out when I get back to my main PC.