Files
2025-07-09 01:08:35 +08:00

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)