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

Подкиньте мысль, не могу сообразить

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

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
Есть 2 модификатора 1 проигрывает анимацию, другой фризит её через опред. время если произошло условие. Проблема заключается в том что если я пытаюсь "добыть дерево" по таргету применяю на дерево(система у меня работает через toggle автомаитеский) и если это условие выполняется пока идёт "добыча ресурсов" через скилл то анимация сбивается и не проигрывается, пытался через Stop() делать, накладывать модификатор до того момента пока не активируется основной не получается всё равно анимация не проигрывается

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Не очень понял, чего ты хочешь.

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
Мне нужно как то остановить использование скилла, если есть модификатор(анимации по условию) я делал проверку в скрипте где идёт непосредственно добыча ресурсов с дерева и со скилла где активируется по условию модификатор анимации а затем фриза, не получается анимация не проигрывается

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Опиши что должно быть. И не используя термины.
Типа: мне надо, чтобы когда чувак рубил дерево, что-то там происходило...

И код скинь.

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
2 модификатора 1 - анимка + стан(сонова) 2- фриз анимки 3 модификатор пустышка(делал проверки)
Спойлер
Код
die_chance = class({})

function die_chance:IsHidden()
return false
end

function die_chance:DeclareFunctions()
    local ch = {
    MODIFIER_PROPERTY_OVERRIDE_ANIMATION
    }
    return ch
end

function die_chance:GetTexture()
    return "cold"
end

function die_chance:GetOverrideAnimation()
return ACT_DOTA_DIE
end

function die_chance:CheckState()
local state = {
[MODIFIER_STATE_NOT_ON_MINIMAP] = true,
[MODIFIER_STATE_LOW_ATTACK_PRIORITY] = true,
[MODIFIER_STATE_STUNNED] = true,
    }
    return state
end

function die_chance:RemoveOnDeath()
return true
end

die_freeze = class({})

function die_freeze:IsHidden()
return false
end

function die_freeze:CheckState()
    local state = {
    [MODIFIER_STATE_FROZEN] = true,
    }
    return state
end

function die_freeze:RemoveOnDeath()
return true
end

die_check = class({})

function die_check:IsHidden()
return false
end

function die_check:RemoveOnDeath()
return true
end
[свернуть]

Основа - проверяет каждую сек через OnIntervalThink в npc_abil, добавляет модификаторы если происходит условие - local mana.  Проигрывается анимация и станится герой через 2.6 сек фризит её чтобы анимка не сбилась. Модификаторы определяются через гл. файл gg (LinkLuaModifier)
Спойлер
Код
function Check(keys)
local player = keys.caster:GetPlayerOwner()
local pID = player:GetPlayerID()
local hero = player:GetAssignedHero()
local caster = keys.caster
local target = keys.target
local ability = keys.ability
local mana = caster:GetMana() / caster:GetMaxMana() 

-- if mana < 0.91 then
-- hero:AddNewModifier(hero, nil, "die_check", {})
-- caster:Stop()
-- end
if mana <= 0.95 then
   -- if hero:HasModifier("die_check") then
--if not hero:HasModifier("modifier_gathering_lumber") then
if not hero:HasModifier("die_chance") then
hero:AddNewModifier(hero, nil, "die_chance", {})
Timers:CreateTimer(2.6,function()
hero:AddNewModifier(hero, nil, "die_freeze", {})
return nil
end)
end
--end
elseif mana > 0.95 then
if hero:HasModifier("die_freeze") then
hero:RemoveModifierByName("die_freeze")
if hero:HasModifier("die_chance") then
hero:RemoveModifierByName("die_chance")
--if hero:HasModifier("die_check") then
--hero:RemoveModifierByName("die_check")
--end
end
end
end
end
[свернуть]
Тут происходит "баг" (всё работает нормально до того момента пока я не начинаю использовать этот скилл на деревья). Основная функция GetLumber.

Спойлер
Код
function Gather( event )
local caster = event.caster
local target = event.target
local ability = event.ability
local target_class = target:GetClassname()

if not caster.lumber_gathered then
caster.lumber_gathered = 0
end

caster.manual_order = false

if target_class == "ent_dota_tree" then
caster:MoveToTargetToAttack(target)
if Debug_Peasant then
print("Moving to ", target_class)
end
caster.target_tree = target



end

caster:RemoveModifierByName("get_lumber")
ability:ApplyDataDrivenModifier(caster, caster, "get_lumber", {})

-- fake toggle
if ability:GetToggleState() == false then
ability:ToggleAbility()
end

-- Hide Return
--local return_ability = caster:FindAbilityByName("return_resources")
--return_ability:SetHidden(true)
--ability:SetHidden(false)

--caster:SwapAbilities("gather_lumber", "return_resources" , true, false)

end

function ToggleOffGather( event )
local caster = event.caster
local gather_ability = caster:FindAbilityByName("gather_lumber")

caster.target_tree.worker = nil

if gather_ability:GetToggleState() == true then
gather_ability:ToggleAbility()

if Debug_Peasant then
print("Toggled Off Gather")
end
end
end

function ToggleOffReturn( event )
local caster = event.caster
local return_ability = caster:FindAbilityByName("return_resources")

if return_ability:GetToggleState() == true then
return_ability:ToggleAbility()
if Debug_Peasant then
print("Toggled Off Return")
end
end
caster.skip_order = false
end

function CheckTreePos( event )

local caster = event.caster
local target = caster.target_tree
local ability = event.ability
local target_class = target:GetClassname()

if target_class == "ent_dota_tree" then
caster:MoveToTargetToAttack(target)
--print("Moving to "..target_class)
end

local distance = (target:GetAbsOrigin() - caster:GetAbsOrigin()):Length()
local collision = distance < 150
if not collision then
--print("Moving to tree, distance: ",distance)
elseif not caster:HasModifier("chop_wood") then
caster:RemoveModifierByName("get_lumber")
ability:ApplyDataDrivenModifier(caster, caster, "chop_wood", {})
if Debug_Peasant then
print("Reached tree")
end
end
end

function GetLumber( event )
local player = event.caster:GetPlayerOwner()
local pID = player:GetPlayerID()
--local hero = player:GetAssignedHero()
-- --local hero = PlayerResource:GetSelectedHeroEntity(pID)

local caster = event.caster
local ability = event.ability
local max_lumber_carried = 20

local return_ability = caster:FindAbilityByName("return_resources")

local target = caster.target_tree
local target_class = target:GetClassname()

-- if target_class == "ent_dota_tree" then
-- target:CutDown(event.caster:GetTeam())
-- caster:Stop()
-- end

-- if hero:HasModifier("die_chance") then
-- caster:Stop()
-- caster:RemoveModifierByName("get_lumber")
-- caster:RemoveModifierByName("chop_wood")
-- caster:RemoveModifierByName("modif_return_resources")
-- end

if not hero:HasItemInInventory("item_axe_tree") then
caster.lumber_gathered = caster.lumber_gathered + math.random (2, 4)
elseif hero:HasItemInInventory("item_axe_tree") then
caster.lumber_gathered = caster.lumber_gathered + math.random (4, 6)
end

if Debug_Peasant then
print("Gathered "..caster.lumber_gathered)
end

if not caster:HasModifier("modif_return_resources") then
        return_ability:ApplyDataDrivenModifier( caster, caster, "modif_return_resources", nil)
    end

caster:SetModifierStackCount("modif_return_resources", caster, caster.lumber_gathered)

if caster.lumber_gathered < max_lumber_carried then

if return_ability:GetToggleState() == false or return_ability:IsHidden() then
if Debug_Peasant then
print("Gather OFF, Return ON")
end

if return_ability:GetToggleState() == false then
return_ability:ToggleAbility()
end
--ability:SetHidden(true)

caster:SwapAbilities("gather_lumber", "return_resources", false, true)
end
else
local player = caster:GetPlayerOwner():GetPlayerID()

caster:RemoveModifierByName("chop_wood")

caster:CastAbilityNoTarget(return_ability, player)
return_ability:ToggleAbility()


end
end


function ReturnResources( event )

local caster = event.caster
local ability = event.ability

if caster.lumber_gathered and caster.lumber_gathered > 0 then
local building = FindClosestResourceDeposit( caster )
if building == nil then return end
if Debug_Peasant then
print("Returning "..caster.lumber_gathered.." Lumber back to "..building:GetUnitName())
end

Timers:CreateTimer(0.03, function()
if ability:GetToggleState() == false then
ability:ToggleAbility()
if Debug_Peasant then
print("Return Ability Toggled On")
end
end
end)

local dist = (caster:GetAbsOrigin()-building:GetAbsOrigin()):Length() - 300
local fixed_position = (building:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized() * dist

ExecuteOrderFromTable({ UnitIndex = caster:GetEntityIndex(), OrderType = DOTA_UNIT_ORDER_MOVE_TO_TARGET, TargetIndex = building:GetEntityIndex(), Position = fixed_position, Queue = false})
caster.skip_order = true
caster.target_building = building
end
end

function ReleaseTree( event )
local caster = event.caster
print("atykk")
if caster.target_tree.worker ~= nil then
print("aytjkkyyk")
caster.target_tree.worker = nil
end
end
[свернуть]

Надо как то сделать так чтобы модификатор с анимцией запустился корректно, без проблем и остановил использование абилки - "добычи дерева" у которого есть 3 исполнительных модификатора 1- get_lumber 2- chop_wood() 3- modif_return_resources которые отвечают за "добычу"



« Последнее редактирование: 19-07-2017, 21:55:33 от den4iccc »

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
То есть что, у тебя какая-то абилка "убивает" своего носителя, если у того уровень маны падает ниже определенного значения? (ну, заставляет его проигрывать анимацию смерти и замораживает в последний момент).

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
То есть что, у тебя какая-то абилка "убивает" своего носителя, если у того уровень маны падает ниже определенного значения? (ну, заставляет его проигрывать анимацию смерти и замораживает в последний момент).

Да, если маны меньше по условию то проигрывается анимация и замораживается

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Так. И что там дальше не так? Ты пытаешься "мертвым" деревья порубить и он вдруг оживает?

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
когда я рублю деревья и происходит условие, активируются модификаторы анимации и фриза, но сама анимация не проигрывается
« Последнее редактирование: 20-07-2017, 15:25:06 от den4iccc »

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Ммм, наконец-то я понял. То есть, чувак как бы может умереть во время рубки дерева? Но у тебя он в этот момент умирает без анимации?

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
Re: Подкиньте мысль, не могу сообразить
« Ответ #10 : 20-07-2017, 22:01:40 »
Да

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Re: Подкиньте мысль, не могу сообразить
« Ответ #11 : 20-07-2017, 23:48:39 »
Может тебе станить его перед смертью?

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
Re: Подкиньте мысль, не могу сообразить
« Ответ #12 : 21-07-2017, 01:26:53 »
Пробовал не получается, даже делал через отдельный модификатор и запускал через 1 сек анимацию смерти всё равно ни в какую

Оффлайн Илья

  • Супермодератор
  • 2142
  • Мощь: 21
Re: Подкиньте мысль, не могу сообразить
« Ответ #13 : 21-07-2017, 10:21:20 »
Ну тебе надо выключать/остановить запущенную абилку вырубки леса. Как это сделать - ты по идеи должен сам догадываться, ибо код писал ты, знаешь что у тебя там происходит, он здоровенный, а сторонним лезть туда вникать не охота.

Посиди, реализуй похожую кнопку/абилку, что будет вырубать все текущие.

Оффлайн den4iccc

  • Продвинутый
  • 400
  • Мощь: 7
Re: Подкиньте мысль, не могу сообразить
« Ответ #14 : 21-07-2017, 21:21:03 »
Есть ли функция которая отключает/останавливает анимацию ?
« Последнее редактирование: 21-07-2017, 21:30:08 от den4iccc »