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

den4iccc

Друзья CG
20 Сен 2014
440
1
Проект
Survival in Taiga XE
Есть 2 модификатора 1 проигрывает анимацию, другой фризит её через опред. время если произошло условие. Проблема заключается в том что если я пытаюсь "добыть дерево" по таргету применяю на дерево(система у меня работает через toggle автомаитеский) и если это условие выполняется пока идёт "добыча ресурсов" через скилл то анимация сбивается и не проигрывается, пытался через Stop() делать, накладывать модификатор до того момента пока не активируется основной не получается всё равно анимация не проигрывается
 
Последнее редактирование модератором:
Мне нужно как то остановить использование скилла, если есть модификатор(анимации по условию) я делал проверку в скрипте где идёт непосредственно добыча ресурсов с дерева и со скилла где активируется по условию модификатор анимации а затем фриза, не получается анимация не проигрывается
 
Опиши что должно быть. И не используя термины.
Типа: мне надо, чтобы когда чувак рубил дерево, что-то там происходило...

И код скинь.
 
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 которые отвечают за "добычу"
 
Последнее редактирование модератором:
То есть что, у тебя какая-то абилка "убивает" своего носителя, если у того уровень маны падает ниже определенного значения? (ну, заставляет его проигрывать анимацию смерти и замораживает в последний момент).
 
Последнее редактирование модератором:
То есть что, у тебя какая-то абилка "убивает" своего носителя, если у того уровень маны падает ниже определенного значения? (ну, заставляет его проигрывать анимацию смерти и замораживает в последний момент).

Да, если маны меньше по условию то проигрывается анимация и замораживается
 
Последнее редактирование модератором:
Так. И что там дальше не так? Ты пытаешься "мертвым" деревья порубить и он вдруг оживает?
 
Последнее редактирование модератором:
когда я рублю деревья и происходит условие, активируются модификаторы анимации и фриза, но сама анимация не проигрывается
 
Ммм, наконец-то я понял. То есть, чувак как бы может умереть во время рубки дерева? Но у тебя он в этот момент умирает без анимации?
 
Пробовал не получается, даже делал через отдельный модификатор и запускал через 1 сек анимацию смерти всё равно ни в какую
 
Ну тебе надо выключать/остановить запущенную абилку вырубки леса. Как это сделать - ты по идеи должен сам догадываться, ибо код писал ты, знаешь что у тебя там происходит, он здоровенный, а сторонним лезть туда вникать не охота.

Посиди, реализуй похожую кнопку/абилку, что будет вырубать все текущие.
 
Есть ли функция которая отключает/останавливает анимацию ?
 
Спасибо, но уже эта функция не пригодилась, сделал всё через 3 модификатор
 
Реклама: