local Ability = {} local EBusyRoleState = import("EBusyRoleState") local ERoleMoveDirection = import("ERoleMoveDirection") local EBusyAnimationPhase = import("EBusyAnimationPhase") local KismetSystemLibrary = import("KismetSystemLibrary") local AbilitySystemBlueprintLibrary = import("AbilitySystemBlueprintLibrary") local GetGameplayTag = require("GamePlay.Utils").GetGameplayTag local item_pick_tag = "Change.LevelItem.Health" local role_pick_cost_health_tag = "Change.Role.Health" local role_pick_cost_hunger_tag = "Change.Role.Hunger" local function GetSelfPickConsume(item_id) end function Ability:ctor() self.target = nil self.pick_phase = nil self.delay_timer = nil self.event_data = nil end function Ability:K2_ActivateAbilityFromEvent(EventData) print("Pick Ability:K2_ActivateAbility") self.pick_phase = EBusyAnimationPhase.PrepareCast self:ProcessAbilityPhase() self.event_data = EventData self.target = EventData.Target end function Ability:K2_OnEndAbility() local owner = self:GetOwningActorFromActorInfo() if self.target:IsAlive() then owner:TryActiveAbility("Ability.Role.Pick", self.event_data) else owner.proxy.state = EBusyRoleState.PickFinished owner:UpdateRoleState() end end function Ability:ProcessAbilityPhase() local owner = self:GetOwningActorFromActorInfo() local Animation = owner["RoleAnimation"] Animation:PlayPickAnimation("Tree", Animation:GetMoveDirection(), self.pick_phase, 1.0) if self.delay_timer ~= nil then KismetSystemLibrary.K2_ClearTimerHandle(self, self.delay_timer) end if self.pick_phase == EBusyAnimationPhase.PrepareCast then local delegate = slua.createDelegate(function() self.pick_phase = EBusyAnimationPhase.Casting self:ProcessAbilityPhase() end) self.delay_timer = KismetSystemLibrary.K2_SetTimerDelegate(delegate, 0.5, false, true, 0, 0) elseif self.pick_phase == EBusyAnimationPhase.Casting then self.pick_phase = EBusyAnimationPhase.PostCast self:ProcessAbilityPhase() self:ApplayEffect(owner.RoleAbility) else local delegate = slua.createDelegate(function() self:K2_EndAbility() end) self.delay_timer = KismetSystemLibrary.K2_SetTimerDelegate(delegate, 0.2, false, true, 0, 0) end end function Ability:ApplayEffect(asc) local RoleUtils = require("GamePlay.Utils.RoleUtils") local owner = self:GetOwningActorFromActorInfo() -- 物品的采集效果 local item_asc = AbilitySystemBlueprintLibrary.GetAbilitySystemComponent(self.target) local pick_handle = asc:MakeOutgoingSpec( self.AbilityEffectConfigs:Get("LevelItem"), 1, asc:MakeEffectContext() ) AbilitySystemBlueprintLibrary.AssignTagSetByCallerMagnitude( pick_handle, GetGameplayTag(item_pick_tag), -owner.RoleConfig.PickEffect ) -- 自己的消耗 RoleUtils.ChangeHunger(owner,-self.target.LevelItemConfig.PickHungerCost) asc:BP_ApplyGameplayEffectSpecToTarget(pick_handle, item_asc) end return Class(nil, nil, Ability)