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