71 lines
2.7 KiB
Lua
71 lines
2.7 KiB
Lua
local Ability = {}
|
|
local Reactive = require("Core.Reactive")
|
|
local GetGameplayTag = require("GamePlay.Utils").GetGameplayTag
|
|
local AbilitySystemBlueprintLibrary = import("AbilitySystemBlueprintLibrary")
|
|
|
|
local hunger_consume_tag_name = "Buff.RoleConsume.Hunger"
|
|
local health_consume_tag_name = "Buff.RoleConsume.Health"
|
|
|
|
function Ability:K2_ActivateAbilityFromEvent(_)
|
|
print("Role Consume Ability:K2_ActivateAbility")
|
|
if self.hunger_watcher ~= nil then
|
|
self.hunger_watcher:Destroy()
|
|
end
|
|
self.hunger_watcher = Reactive.Watcher(function() self:ConsumeWatcher() end)
|
|
end
|
|
|
|
function Ability:ConsumeWatcher()
|
|
local owner = self:GetOwningActorFromActorInfo()
|
|
local asc = owner["RoleAbility"]
|
|
if owner.LuaRoleAttribute.Hunger > 0 then
|
|
if not asc:IsGameplayCueActive(GetGameplayTag(hunger_consume_tag_name)) then
|
|
self:ApplyHungerConsume(asc)
|
|
end
|
|
if asc:IsGameplayCueActive(GetGameplayTag(health_consume_tag_name)) then
|
|
if self.health_consume_handle ~= nil then
|
|
asc:RemoveActiveGameplayEffect(self.health_consume_handle, -1)
|
|
end
|
|
self.health_consume_handle = nil
|
|
end
|
|
elseif owner.LuaRoleAttribute.Hunger <= 0 then
|
|
if not asc:IsGameplayCueActive(GetGameplayTag(health_consume_tag_name)) then
|
|
self:ApplyHealthConsume(asc)
|
|
end
|
|
if asc:IsGameplayCueActive(GetGameplayTag(hunger_consume_tag_name)) then
|
|
if self.hunger_consume_handle ~= nil then
|
|
asc:RemoveActiveGameplayEffect(self.hunger_consume_handle, -1)
|
|
end
|
|
self.hunger_consume_handle = nil
|
|
owner.LuaRoleAttribute.Hunger = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
function Ability:ApplyConsumeEffect(asc, effect_tag_name, value)
|
|
local spec_handle = asc:MakeOutgoingSpec(
|
|
self.EffectConfigs:Get(GetGameplayTag(effect_tag_name)),
|
|
1, asc:MakeEffectContext()
|
|
)
|
|
AbilitySystemBlueprintLibrary.AssignTagSetByCallerMagnitude(
|
|
spec_handle, GetGameplayTag(effect_tag_name), value
|
|
)
|
|
return asc:BP_ApplyGameplayEffectSpecToSelf(spec_handle)
|
|
end
|
|
|
|
function Ability:ApplyHungerConsume(asc)
|
|
local owner = asc:GetOwner()
|
|
local consume_speed_peer_second = owner.RoleConfig.HungerConsumeSpeed
|
|
self.hunger_consume_handle = self:ApplyConsumeEffect(
|
|
asc, hunger_consume_tag_name, -consume_speed_peer_second / 10
|
|
)
|
|
end
|
|
|
|
function Ability:ApplyHealthConsume(asc)
|
|
local owner = asc:GetOwner()
|
|
local consume_speed_peer_second = owner.RoleConfig.HungerConsumeSpeed
|
|
self.health_consume_handle = self:ApplyConsumeEffect(
|
|
asc, health_consume_tag_name, -consume_speed_peer_second/10
|
|
)
|
|
end
|
|
|
|
return Class(nil, nil, Ability) |