diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index af392548834a96fbd92aff3a63642d6f836510df..bd89e1e22593b8134a9535d65c2863095c9ce9bf 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -3895,12 +3895,7 @@ function _M:onWear(o, inven_id, bypass_set) end -- Callbacks! - if not o.carrier_callbacks then for event, store in pairs(sustainCallbackCheck) do - if o[event] then - self[store] = self[store] or {} - self[store][o] = "object" - end - end end + if not o.carrier_callbacks then self:registerCallbacks(o, o, "object") end self:breakReloading() @@ -3997,12 +3992,7 @@ function _M:onTakeoff(o, inven_id, bypass_set) end -- Callbacks - if not o.carrier_callbacks then for event, store in pairs(sustainCallbackCheck) do - if o[event] then - self[store][o] = nil - if not next(self[store]) then self[store] = nil end - end - end end + if not o.carrier_callbacks then self:unregisterCallbacks(o, o) end self:checkMindstar(o) @@ -4082,12 +4072,7 @@ function _M:onAddObject(o) end -- Callbacks! - if o.carrier_callbacks then for event, store in pairs(sustainCallbackCheck) do - if o[event] then - self[store] = self[store] or {} - self[store][o] = "object" - end - end end + if o.carrier_callbacks then self:registerCallbacks(o, o, "object") end self:checkEncumbrance() @@ -4111,12 +4096,7 @@ function _M:onRemoveObject(o) end -- Callbacks - if o.carrier_callbacks then for event, store in pairs(sustainCallbackCheck) do - if o[event] then - self[store][o] = nil - if not next(self[store]) then self[store] = nil end - end - end end + if o.carrier_callbacks then self:unregisterCallback(o, o) end self:checkEncumbrance() end @@ -4191,13 +4171,8 @@ function _M:learnTalent(t_id, force, nb, extra) -- If we learned a spell, get mana, if you learned a technique get stamina, if we learned a wild gift, get power local t = _M.talents_def[t_id] - if just_learnt then - for event, store in pairs(sustainCallbackCheck) do - if t[event] and t.mode ~= "sustained" then - self[store] = self[store] or {} - self[store][t_id] = "talent" - end - end + if just_learnt and t.mode ~= "sustained" then + self:registerCallbacks(t, t_id, "talent") end extra = extra or {} @@ -4358,13 +4333,8 @@ function _M:unlearnTalent(t_id, nb, no_unsustain, extra) local t = _M.talents_def[t_id] - if not self:knowTalent(t_id) then - for event, store in pairs(sustainCallbackCheck) do - if t[event] and t.mode ~= "sustained" then - self[store][t_id] = nil - if not next(self[store]) then self[store] = nil end - end - end + if not self:knowTalent(t_id) and t.mode ~= "sustained" then + self:unregisterCallbacks(t, t_id) end extra = extra or {} @@ -4912,6 +4882,24 @@ local sustainCallbackCheck = { } _M.sustainCallbackCheck = sustainCallbackCheck +function _M:registerCallbacks(objdef, objid, objtype) + for event, store in pairs(sustainCallbackCheck) do + if objdef[event] then + self[store] = self[store] or {} + self[store][objid] = objtype + end + end +end + +function _M:unregisterCallbacks(objdef, objid) + for event, store in pairs(sustainCallbackCheck) do + if self[store] and self[store][objid] then + self[store][objid] = nil + if not next(self[store]) then self[store] = nil end + end + end +end + function _M:fireTalentCheck(event, ...) local store = sustainCallbackCheck[event] local ret = false @@ -5061,12 +5049,7 @@ function _M:postUseTalent(ab, ret, silent) self.sustain_slots[slot] = ab.id end end - for event, store in pairs(sustainCallbackCheck) do - if ab[event] then - self[store] = self[store] or {} - self[store][ab.id] = "talent" - end - end + self:registerCallbacks(ab, ab.id, "talent") else if ab.sustain_mana then self:incMaxMana(util.getval(ab.sustain_mana, self, ab)) @@ -5110,12 +5093,7 @@ function _M:postUseTalent(ab, ret, silent) end end end - for event, store in pairs(sustainCallbackCheck) do - if ab[event] then - self[store][ab.id] = nil - if not next(self[store]) then self[store] = nil end - end - end + self:unregisterCallbacks(ab, ab.id) end elseif not self:attr("force_talent_ignore_ressources") and not ab.fake_ressource then if ab.mana and not self:attr("zero_resource_cost") then @@ -5996,21 +5974,11 @@ function _M:on_set_temporary_effect(eff_id, e, p) end function _M:on_temporary_effect_added(eff_id, e, p) - for event, store in pairs(sustainCallbackCheck) do - if e[event] then - self[store] = self[store] or {} - self[store][eff_id] = "effect" - end - end + self:registerCallbacks(e, eff_id, "event") end function _M:on_temporary_effect_removed(eff_id, e, p) - for event, store in pairs(sustainCallbackCheck) do - if e[event] then - self[store][eff_id] = nil - if not next(self[store]) then self[store] = nil end - end - end + self:unregisterCallbacks(e, eff_id) end --- Called when we are initiating a projection