Библиотека орб эффектов

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Есть у кого готовая, рабочая библиотека и кому не жалко ее сюда скинуть, или идеи по улучшению моей?)

Вот кусок моей версии, но она немного баганая
Код:
if orb_effect == nil then 
	print("[Orb Effects Library] Creating OEL")
	orb_effect = {} 
end

lifesteal = Lifesteal_Orb
skadi = Skadi_Orb
mana_burn = Mana_Burn_Orb
lightning = Hyper_Ligh_Orb
venom = Venom_Orb
disarmor = Desolator_Orb
mana_steal = Mana_Steal_Orb

function orb_effect:Disarmor( target ) --[[( target, type ) type - потом добавлю типы для орб эффектов]]--
	if not target.skadi and not target.lifesteal and not target.mana_burn and not target.lightning and not target.venom then
		if not target.disarmor then
			target.disarmor = true
			return true
		end
	end

	target.disarmor = false
	return false
end
В коде предмета должно быть премерно так
Код:
function modifier_deso2_passive:OnCreated( )
	self:GetCaster().disarmor = true
end

function modifier_deso2_passive:OnDestroy( )
	self:GetCaster().disarmor = false
end

function modifier_deso2_passive:OnAttackLanded( params )
	local caster = self:GetCaster()
	local ability = self:GetAbility()
	local target = params.target

	if target ~= caster and params.attacker == caster and not target:IsMagicImmune() and orb_effect:Disarmor(caster) then
		target:AddNewModifier(caster,ability,"deso2_modifier_corrupt",{duration = ability:GetSpecialValueFor("corrupt_duration")})
	end
end
Баганая она тем, что при ударе с предметом того же лайфстила 1 удар - работает, 2 удар - срабатывает другой орб эффект или другой предмет лайфстила, 3 удар так же как и второй, а потом снова по кругу.

P.S. Для тех кому интересно помочь, орбы 1го типа не должны складываться.
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Lua:
function my_modifier:GetModifierOrbPriority() --такую функцию объявляем в каждом модификаторе с орбом
	return DOTA_ORB_PRIORITY_ABILITY
end

function my_modifier:OnAttackLanded(event)
	if self:IsActiveOrb() then
		--делаем свое грязное дело
	end
end

-- Все что дальше вставляем в отдельный файл и подключаем его к моду с помощью require

_G.DOTA_ORB_PRIORITY_ABILITY = 1
_G.DOTA_ORB_PRIORITY_ITEM = 2

function CDOTA_Modifier_Lua:IsActiveOrb()
	local modifierList = self:GetParent():FindAllModifiers()
	local selfPriority = self:GetModifierOrbPriority()
	for _,modifier in pairs(modifierList) do
		if modifier.GetModifierOrbPriority then --проверяем содержит ли модификатор орб
			if selfPriority > modifier:GetModifierOrbPriority() then --если приоритет self модификатора ниже то возвращаем false и он не сработает
				return false
			elseif selfPriority == modifier:GetModifierOrbPriority() then --если приоритеты равны, то определяем рабочий орб по времени создания модификатора
				return self:GetCreationTime() > modifier:GetCreationTime()
		end
	end
	return true
end

Что-то такое
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Еще можно прикрутить фильтр целей и тому подобные штуки.
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
ZLOY, а для того чтобы сделать сочитание с другими модификаторами-орбами, надо делать такой фильтр? Или какие условия надо еще прописывать?
Код:
if self:GetName() == "modifier_demon_lifesteal_aura" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
[quote author=Danis link=topic=1145.msg6774#msg6774 date=1478152305]
ZLOY, а для того чтобы сделать сочитание с другими модификаторами-орбами, надо делать такой фильтр? Или какие условия надо еще прописывать?
Код:
if self:GetName() == "modifier_demon_lifesteal_aura" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
[/quote]
Ну в принципе да, но если таких модификаторов много, то лучше придумать более универсальный метод.
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Ну в принципе да, но если таких модификаторов много, то лучше придумать более универсальный метод.
Странно, сейчас пробовал с такой штукой, работал все так же 1 модификатор, хотя думаю что это дичь вообще не может работать.
Код:
function CDOTA_Modifier_Lua:IsActiveOrb()
	local modifierList = self:GetParent():FindAllModifiers()
	local selfPriority = self:GetModifierOrbPriority()
	for _,modifier in pairs(modifierList) do
		if modifier.GetModifierOrbPriority then --проверяем содержит ли модификатор орб

			if self:GetName() == "modifier_demon_lifesteal_aura" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
			if self:GetName() == "modifier_demonic_axe_passive" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
			if self:GetName() == "modifier_dominator_passive" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
			if self:GetName() == "modifier_lifesteal_custom_passive" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
			print("First modifier name: "..self:GetName())
			print("Second modifier name: "..self:GetName())
			if selfPriority > modifier:GetModifierOrbPriority() then --если приоритет self модификатора ниже то возвращаем false и он не сработает
				return false
			elseif selfPriority == modifier:GetModifierOrbPriority() then --если приоритеты равны, то определяем рабочий орб по времени создания модификатора
				if self:GetCreationTime() > modifier:GetCreationTime() then
					return true
				else
					return false
				end
			end
		end
	end
	return true
end
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Все делается проще, и почти одной строкой
Код:
local worked_modifiers = {
	["modifier_skadi"] = "modifier_vampire1",
	["another_modifier"] = "another_modifier_2",
}

Код:
if worked_modifiers[this_modifier_name] == another_modifier_name] then
	return true;
end
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
еще 1 вопрос, как сделать чтобы разные модификаторы сочитались и не сочитались? у меня не получается ни в какую.
 

I_Explorer

Друзья CG
30 Июл 2016
318
16
Проект
Жизнь в тюрьме
еще 1 вопрос, как сделать чтобы разные модификаторы сочитались и не сочитались? у меня не получается ни в какую.
Как новичек, я могу посоветовать тебе посмотреть на эти орб-эффекты у Noya в футах или дотакрафте, мб что-то и отыщешь.
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
I_Explorer, похоже что там ничего нужного мне нет, но это только мое мнение.
 

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
оно тупо не хочет фильтровать модификаторы,
Код:
function CDOTA_Modifier_Lua:IsActiveOrb()
	local combinable_modifiers = {
	--["modifier_skadi_custom_passive"] = "modifier_demon_lifesteal_aura" or "modifier_demonic_axe_passive" or "modifier_lifesteal_custom_passive" or "modifier_dominator_passive" or "modifier_satanic_passive",
	["modifier_satanic_passive"] = "modifier_skadi_custom_passive",
	["modifier_dominator_passive"] = "modifier_skadi_custom_passive",
	["modifier_lifesteal_custom_passive"] = "modifier_skadi_custom_passive",
	["modifier_demonic_axe_passive"] = "modifier_skadi_custom_passive",
	["modifier_demon_lifesteal_aura"] = "modifier_skadi_custom_passive"
}


	local modifierList = self:GetParent():FindAllModifiers()
	local selfPriority = self:GetModifierOrbPriority()
	for _,modifier in pairs(modifierList) do
		if modifier.GetModifierOrbPriority then --проверяем содержит ли модификатор орб
			if modifier then 
			end

			if combinable_modifiers[self] == combinable_modifiers[modifier] then 
				return true; 
			else
				if selfPriority > modifier:GetModifierOrbPriority() then --если приоритет self модификатора ниже то возвращаем false и он не сработает
					return false;
				elseif selfPriority == modifier:GetModifierOrbPriority() then --если приоритеты равны, то определяем рабочий орб по времени создания модификатора
					if self:GetCreationTime() < modifier:GetCreationTime() then
						return false;
					end
				end
			end
		end
	end
	return true;
end
Я уже не знаю что делать серьезно.
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
оно тупо не хочет фильтровать модификаторы,
Я уже не знаю что делать серьезно.
Ты чутка не понимаешь как работает or, он выбирает ОДИН из элементов при создании таблицы. Так как вычисления ленивы, то выберет самый первый элемент.
Код:
["modifier_skadi_custom_passive"] = {
	["modifier_demon_lifesteal_aura"] = 1, 
	["modifier_demonic_axe_passive"] = 1,
	<etc>
}
А проверять тогда
Код:
if table[first_modifier][second_modifier] then return true end
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
[quote author=CryDeS link=topic=1145.msg6834#msg6834 date=1478274571]
Ты чутка не понимаешь как работает or, он выбирает ОДИН из элементов при создании таблицы. Так как вычисления ленивы, то выберет самый первый элемент.
Код:
["modifier_skadi_custom_passive"] = {
	["modifier_demon_lifesteal_aura"] = 1, 
	["modifier_demonic_axe_passive"] = 1,
	<etc>
}
А проверять тогда
Код:
if table[first_modifier][second_modifier] then return true end
[/quote]
Вопрос, table это то что в верху ты написал?
Код:
["modifier_skadi_custom_passive"] = {
	["modifier_demon_lifesteal_aura"] = 1, 
	["modifier_demonic_axe_passive"] = 1,
	<etc>
}
или типа такого?
Код:
 table = {["modif"] = {["modif2"] = 1}}
И что за <ect>?
Код:
["modifier_demonic_axe_passive"] = 1,
	<etc>
 
Последнее редактирование модератором:

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Похоже на то что разобрался, спасибо.
 
Реклама: