94 lines
3.1 KiB
Lua
94 lines
3.1 KiB
Lua
|
|
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)
|