196 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | // local GameplayStatics = import("GameplayStatics") | |||
|  | // local AbilitySystemBlueprintLibrary = import("AbilitySystemBlueprintLibrary") | |||
|  | // local BusyGameplayLibrary = import("BusyGameplayLibrary") | |||
|  | 
 | |||
|  | // --- @class FoxUltimate | |||
|  | // --- @field RecastWindow number | |||
|  | // local FoxUltimate = {} | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:ctor() | |||
|  | //     self.ultimate_phase = 1  -- 大招阶段 | |||
|  | //     self.active_recast_handle = nil | |||
|  | //     self.active_accelerate_handle = nil | |||
|  | 
 | |||
|  | //     self.overlap_delegate_handle = nil | |||
|  | //     self.tag_add_or_remove_delegate = nil | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:K2_ActivateAbilityFromEvent(EventData) | |||
|  | //     print("FoxUltimate:K2_ActivateAbilityFromEvent", self.ultimate_phase) | |||
|  | 
 | |||
|  | //     if not self:K2_CommitAbilityCost(false) then | |||
|  | //         return self:K2_EndAbility() | |||
|  | //     end | |||
|  | 
 | |||
|  | //     local owner = self:GetOwningActorFromActorInfo() | |||
|  | //     self.movement =  owner.MovementComponent | |||
|  | //     self.animation = owner.SpineAnimationComponent | |||
|  | //     self.asc = AbilitySystemBlueprintLibrary.GetAbilitySystemComponent(owner) | |||
|  | //     self.recast_tag = BusyGameplayLibrary.RequestGameplayTag("Ability.Flags.Recast") | |||
|  | //     self.owner = owner | |||
|  | 
 | |||
|  | 
 | |||
|  | //     local asc = self.asc | |||
|  | 
 | |||
|  | //     if self.tag_add_or_remove_delegate == nil then | |||
|  | //         self.tag_add_or_remove_delegate = slua.createDelegate(function(tag, is_add) | |||
|  | //             if is_add == 0 and not self.bIsActive then | |||
|  | //                 self.ultimate_phase = 1 | |||
|  | //                 self:K2_CommitAbilityCooldown(false, false) | |||
|  | //             end | |||
|  | //         end) | |||
|  | //         owner:BindGameplayTagAddOrRemove(self.recast_tag, self.tag_add_or_remove_delegate) | |||
|  | //     end | |||
|  | 
 | |||
|  | //     if self.ultimate_phase == 1 or asc:HasMatchingGameplayTag(self.recast_tag) then | |||
|  | //         self:TriggerUltimate(asc) | |||
|  | //     else | |||
|  | //         self:K2_EndAbility() | |||
|  | //     end | |||
|  | 
 | |||
|  | 
 | |||
|  | // end | |||
|  | 
 | |||
|  | // function FoxUltimate:TriggerUltimate(asc) | |||
|  | //     if self.ultimate_phase == 1 then | |||
|  | //         -- 第一次释放大招,添加一个可以再次释放的Tag | |||
|  | //         local _, recast_effect = self:GetAbilityEffectSpecHandle("Recast", asc, 1, nil) | |||
|  | //         self.active_recast_handle = asc:BP_ApplyGameplayEffectSpecToSelf(recast_effect) | |||
|  | //     elseif self.ultimate_phase == 2 then | |||
|  | //         -- 第二次激活,移除可重复释放的tag | |||
|  | //         self.asc:RemoveActiveGameplayEffect(self.active_recast_handle, -1) | |||
|  | //     elseif self.ultimate_phase == 3 then | |||
|  | //         self.asc:RemoveActiveGameplayEffect(self.active_recast_handle, -1) | |||
|  | //     end | |||
|  | 
 | |||
|  | //     -- 播放动画,并监听动画完成的事件 | |||
|  | //     self:PlayAnimation() | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:GetAnimationName(direction) | |||
|  | //     local animation_name_prefix | |||
|  | //     if direction.X >= 0 then | |||
|  | //         animation_name_prefix = "Ultimate/Right/" | |||
|  | //     else | |||
|  | //         animation_name_prefix = "Ultimate/Left/" | |||
|  | //     end | |||
|  | 
 | |||
|  | //     if self.ultimate_phase == 1 then | |||
|  | //         return animation_name_prefix .. "UltimateStage1" | |||
|  | //     elseif self.ultimate_phase == 2 then | |||
|  | //         return animation_name_prefix .. "UltimateStage2" | |||
|  | //     elseif self.ultimate_phase == 3 then | |||
|  | //         return animation_name_prefix .. "UltimateStage3" | |||
|  | //     end | |||
|  | //     return nil | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:K2_OnEndAbility(bWasCancelled) | |||
|  | //     print("FoxUltimate:K2_OnEndAbility") | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:GetSprintSpeedFactor() | |||
|  | //     if self.ultimate_phase == 1 then | |||
|  | //         return 2.5 | |||
|  | //     elseif self.ultimate_phase == 2 then | |||
|  | //         return 2.8 | |||
|  | //     elseif self.ultimate_phase == 3 then | |||
|  | //         return 3.0 | |||
|  | //     end | |||
|  | // end | |||
|  | 
 | |||
|  | // function FoxUltimate:PlayAnimation() | |||
|  | 
 | |||
|  | //     local animation = self.animation | |||
|  | //     local PC = GameplayStatics.GetPlayerController(self, 0) | |||
|  | 
 | |||
|  | //     local result, ability_direction = PC:GetCursorDirection(nil)  -- 获取技能的朝向 | |||
|  | //     if not result then | |||
|  | //         print("FoxUltimate:TriggerPrimaryPhase can't find direction") | |||
|  | //         return | |||
|  | //     end | |||
|  | //     local anim_name = self:GetAnimationName(ability_direction)  -- 获取技能动画名称 | |||
|  | //     if not anim_name then | |||
|  | //         print("FoxUltimate:TriggerPrimaryPhase can't get animation", self.ultimate_phase) | |||
|  | //         return | |||
|  | //     end | |||
|  | 
 | |||
|  | //     local anim_entry = animation:SetAnimation(0, anim_name, false) | |||
|  | //     anim_entry.AnimationComplete:Add(function(entry) self:OnAnimationComplete(entry) end) | |||
|  | //     anim_entry.AnimationEvent:Add(function(entry, event) self:OnAnimationEvent(entry, event) end) | |||
|  | 
 | |||
|  | //     local anim_total_time = anim_entry:GetAnimationEnd()  -- 获取技能动画时长 | |||
|  | 
 | |||
|  | //     -- 附加加速buff | |||
|  | //     self:MakeAccelerate(self:GetSprintSpeedFactor(), anim_total_time) | |||
|  | //     self.movement:ActivateSprint(ability_direction, anim_total_time) | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:MakeAccelerate(speed_factor, total_time) | |||
|  | //     local _, accelerate_effect = self:GetAbilityEffectSpecHandle("Accelerate", self.asc, 1, nil) | |||
|  | //     AbilitySystemBlueprintLibrary.AssignTagSetByCallerMagnitude( | |||
|  | //         accelerate_effect, | |||
|  | //         BusyGameplayLibrary.RequestGameplayTag("Effect.Factor"), | |||
|  | //         speed_factor | |||
|  | //     ) | |||
|  | 
 | |||
|  | //     AbilitySystemBlueprintLibrary.AssignTagSetByCallerMagnitude( | |||
|  | //         accelerate_effect, | |||
|  | //         BusyGameplayLibrary.RequestGameplayTag("Effect.Duration"), | |||
|  | //         total_time | |||
|  | //     ) | |||
|  | //     return self.asc:BP_ApplyGameplayEffectSpecToSelf(accelerate_effect) | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | // function FoxUltimate:OnAnimationComplete(entry) | |||
|  | //     local new_phase = self.ultimate_phase + 1 | |||
|  | //     if new_phase > 3 then | |||
|  | //         self.ultimate_phase = 1 | |||
|  | //     else | |||
|  | //         self.ultimate_phase = new_phase | |||
|  | //     end | |||
|  | //     print("FoxUltimate:OnAnimationComplete", self.ultimate_phase) | |||
|  | 
 | |||
|  | //     if not self.asc:HasMatchingGameplayTag(self.recast_tag) then | |||
|  | //         self.ultimate_phase = 1 | |||
|  | //         self:K2_CommitAbilityCooldown(false, false) | |||
|  | //     end | |||
|  | 
 | |||
|  | //     entry.AnimationComplete:Clear() | |||
|  | //     entry.AnimationEvent:Clear() | |||
|  | //     self:K2_EndAbility() | |||
|  | // end | |||
|  | 
 | |||
|  | // function FoxUltimate:OnAnimationEvent(entry, event) | |||
|  | //     if event.Name == "OnSpeedChange" then | |||
|  | //         self.active_accelerate_handle = self:MakeAccelerate(8.0, 0.5) | |||
|  | //     elseif event.Name == "OnSpeedReset" then | |||
|  | //         self.asc:RemoveActiveGameplayEffect(self.active_accelerate_handle, -1) | |||
|  | //     elseif event.Name == "OnDamageBegin" then | |||
|  | //         local collision = self.owner["TailCollision"] | |||
|  | //         collision:SetCollisionEnabled(1) | |||
|  | //         self.overlap_delegate_handle = collision.OnComponentBeginOverlap:Add(function() | |||
|  | //             if not self.asc:HasMatchingGameplayTag(self.recast_tag) then | |||
|  | //                 local _, recast_effect = self:GetAbilityEffectSpecHandle("Recast", self.asc, 1, nil) | |||
|  | //                 self.active_recast_handle = self.asc:BP_ApplyGameplayEffectSpecToSelf(recast_effect) | |||
|  | //             end | |||
|  | //         end) | |||
|  | //     elseif event.Name == "OnDamageEnd" then | |||
|  | //         self.owner["TailCollision"]:SetCollisionEnabled(0) | |||
|  | //         if self.overlap_delegate_handle ~= nil then | |||
|  | //             self.owner["TailCollision"].OnComponentBeginOverlap:Remove(self.overlap_delegate_handle) | |||
|  | //             self.overlap_delegate_handle = nil | |||
|  | //         end | |||
|  | //     end | |||
|  | // end | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // return Class(nil, nil, FoxUltimate) |