CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Библиотека орб эффектов
« : 02-11-2016, 20:41:25 »
Есть у кого готовая, рабочая библиотека и кому не жалко ее сюда скинуть, или идеи по улучшению моей?)

Вот кусок моей версии, но она немного баганая
Код
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го типа не должны складываться.
« Последнее редактирование: 02-11-2016, 20:54:39 от Danis »
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 396
  • Мощь: 5
Re: Библиотека орб эффектов
« Ответ #1 : 02-11-2016, 21:16:53 »
Код: (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

  • Супермодератор
  • 396
  • Мощь: 5
Re: Библиотека орб эффектов
« Ответ #2 : 02-11-2016, 21:20:52 »
Еще можно прикрутить фильтр целей и тому подобные штуки.

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #3 : 03-11-2016, 05:51:45 »
ZLOY, а для того чтобы сделать сочитание с другими модификаторами-орбами, надо делать такой фильтр? Или какие условия надо еще прописывать?
Код
if self:GetName() == "modifier_demon_lifesteal_aura" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
« Последнее редактирование: 03-11-2016, 07:31:50 от Danis »
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 396
  • Мощь: 5
Re: Библиотека орб эффектов
« Ответ #4 : 03-11-2016, 07:49:22 »
ZLOY, а для того чтобы сделать сочитание с другими модификаторами-орбами, надо делать такой фильтр? Или какие условия надо еще прописывать?
Код
if self:GetName() == "modifier_demon_lifesteal_aura" and modifier:GetName() == "modifier_skadi_custom_passive" then return true end
Ну в принципе да, но если таких модификаторов много, то лучше придумать более универсальный метод.

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #5 : 03-11-2016, 07:57:10 »
Ну в принципе да, но если таких модификаторов много, то лучше придумать более универсальный метод.
Странно, сейчас пробовал с такой штукой, работал все так же 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
« Последнее редактирование: 03-11-2016, 08:10:02 от Danis »
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: Библиотека орб эффектов
« Ответ #6 : 03-11-2016, 09:14:58 »
Все делается проще, и почти одной строкой
Код
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

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #7 : 04-11-2016, 09:46:39 »
еще 1 вопрос, как сделать чтобы разные модификаторы сочитались и не сочитались? у меня не получается ни в какую.
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн I_Explorer

  • 204
  • Мощь: 3
Re: Библиотека орб эффектов
« Ответ #8 : 04-11-2016, 09:58:04 »
еще 1 вопрос, как сделать чтобы разные модификаторы сочитались и не сочитались? у меня не получается ни в какую.
Как новичек, я могу посоветовать тебе посмотреть на эти орб-эффекты у Noya в футах или дотакрафте, мб что-то и отыщешь.
Мой недо-мод для ДотА2 - steamcommunity.com/...ils/?id=765024602

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #9 : 04-11-2016, 10:37:07 »
I_Explorer, похоже что там ничего нужного мне нет, но это только мое мнение.
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #10 : 04-11-2016, 14:59:41 »
оно тупо не хочет фильтровать модификаторы,
Код
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
Я уже не знаю что делать серьезно.
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: Библиотека орб эффектов
« Ответ #11 : 04-11-2016, 15:49:31 »
оно тупо не хочет фильтровать модификаторы,
Я уже не знаю что делать серьезно.
Ты чутка не понимаешь как работает 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

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #12 : 04-11-2016, 16:02:45 »
Ты чутка не понимаешь как работает 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
Вопрос, 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>
« Последнее редактирование: 04-11-2016, 16:06:15 от Danis »
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]

Оффлайн Danis

  • Продвинутый
  • 268
  • Мощь: 2
Re: Библиотека орб эффектов
« Ответ #13 : 04-11-2016, 16:27:06 »
Похоже на то что разобрался, спасибо.
Создай Героя
Мод  - steamcommunity.com/...ils/?id=750146414
[свернуть]