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) |