- 20 Дек 2016
- 892
- 170
Как переопределить конкретный метод для конкретного объекта какого-нибудь класса, с вызовом в этом же методе изначального состояния этого метода?
Так как ни один нормальный человек скорее всего не поймет тот бред, который я изложил выше, задам свой вопрос на таком примере:
Задача: При направлении способности на базовое деревоТретий подряд вопрос про деревья ДА СКОЛЬКО МОЖНО!?7, в точке местоположения вашего героя создается новое дерево, в то время как старое (то, на которое была направлена способность) срубается на неограниченный срок. При ломке нового дерева старое тут же вырастает. (Вообще цель скила - передвинуть дерево, а после его ломки вернуть обратно. Но двигать его через SetOrigin - так себе идея.)
Никому не нужные рассуждения: Если не писать свое дерево с нуля (чего мне бы не хотелось делать), то единственный способ создать дерево в точке - это CreateTempTree( pos, 2283221337 ). А единственный способ убрать такое дерево раньше срока - Kill(). Поэтому я уверен, что все дотовские предметы и скилы расправляются со временным деревом именно так. Соответственно мне нужно переопределить метод Kill() для этого дерева так, чтобы в нем сначала выращивалось старое дерево, а потом уже удалялось новое. Но как мне удалить новое дерево, если единственный способ сделать это - Kill(), а именно его я сейчас и переопределяю?
Я пытался сделать так:
Но это все равно вызвало рекурсивный вызов, заставивший Доту вылететь. Если честно, я вообще не знаю, как работает ".BaseClass"; я случайно нашел его в шаблоне abilities_lua (или как он там называется) и решил попробовать. Был бы очень рад, если бы еще и объяснили, как пользоваться сим изобретением.
Вопрос: Как выполнить задачу? Абстрактный вопрос описан первым предложением темы.
Так как ни один нормальный человек скорее всего не поймет тот бред, который я изложил выше, задам свой вопрос на таком примере:
Задача: При направлении способности на базовое дерево
Никому не нужные рассуждения: Если не писать свое дерево с нуля (чего мне бы не хотелось делать), то единственный способ создать дерево в точке - это CreateTempTree( pos, 2283221337 ). А единственный способ убрать такое дерево раньше срока - Kill(). Поэтому я уверен, что все дотовские предметы и скилы расправляются со временным деревом именно так. Соответственно мне нужно переопределить метод Kill() для этого дерева так, чтобы в нем сначала выращивалось старое дерево, а потом уже удалялось новое. Но как мне удалить новое дерево, если единственный способ сделать это - Kill(), а именно его я сейчас и переопределяю?
Я пытался сделать так:
Код:
--[[
Вырванный кусок кода из тела функции OnSpellStart(). hTarget - старое дерево.
CreateMyTree - созданный мною метод. Делает то же, что и CreateTempTree, но еще и возвращает только что созданное дерево
]]
local model = hTarget:GetModelName()
hTarget:CutDownRegrowAfter( 99999, self:GetCaster():GetTeamNumber() )
local hTree = CreateMyTree( self:GetCaster():GetOrigin(), 99999)
hTree:SetModel( model )
hTree.assigned_tree = hTarget
function hTree:Kill()
if self.assigned_tree then
self.assigned_tree:GrowBack()
end
self.BaseClass.Kill()
end
Вопрос: Как выполнить задачу? Абстрактный вопрос описан первым предложением темы.
Последнее редактирование модератором: