2025-01-04 23:00:19 +08:00

654 lines
24 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@class UGCPlayerPawn_C:BP_UGCPlayerPawn_C
---@field JumpCamera2 UCameraComponent
---@field JumpArm2 USpringArmComponent
---@field P_PointTo UParticleSystemComponent
---@field JumpCamera UCameraComponent
---@field JumpArm USpringArmComponent
---@field TopCamera UCustomCameraComponent
--Edit Below--
---@type UGCPlayerPawn_C
local UGCPlayerPawn = {
---@field ModifyDamageDelegation fun(DamageAmount:float, PlayerPawn:BP_UGCPlayerPawn_C, CauserPC:APlayerController, DamageCauser:AActor, Hit:FHitResult):float
ModifyDamageDelegation = {};
-- MechanismEnergy = 0; -- 玩家拥有的能量
CachedSTCharacterMovementGravityScale = 1.0;
BaseCapsuleHalfHeight = 88.0;
BaseCapsuleRadius = 40;
CachedSTCharacterMovementGravityScale = 1.;
DashDuration = -1;
VelocityClampBase = 1200;
VelocityClamp = 1200;
bCanActiveSkill = false;
NowCameraType = 1;
CameraList = {};
CustomJumpZVelocity = 443;
};
function UGCPlayerPawn:GetReplicatedProperties()
return
"DashImpulseEnergy",
"NowCameraType",
"CustomJumpZVelocity"
end
-- 关闭盒子掉落
function UGCPlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater)
return true
end
function UGCPlayerPawn:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
--- 设置翻墙功能
self.bVaultIsOpen = true
--- 设置滑铲功能
self.IsOpenShovelAbility = true
self.CachedSTCharacterMovementGravityScale = self.STCharacterMovement.GravityScale;
UGCEventSystem.SendEvent(EventEnum.PlayerBeginPlay, self)
--- 获取初始胶囊体信息
self.BaseCapsuleHalfHeight = self.CapsuleComponent.CapsuleHalfHeight
self.BaseCapsuleRadius = self.CapsuleComponent.CapsuleRadius
if self:HasAuthority() then
self:AddEvent()
self:InitParam()
--- 循环判断当前武器配置是否正确,多则删、少则补
if UGCGameSystem.GameState:GetGameStateType() == CustomEnum.EGameState.Playing then
-- self.LoopCheckGradientWeaponHandle = UGCEventSystem.SetTimerLoop(self, self.CheckGradientWeapon, 1.)
--- 循环判断是否给予初始近战武器有则移除Handle没有则进行循环
-- self.AddDefaultMeleeWeaponHandle = UGCEventSystem.SetTimerLoop(self, self.AddDefaultMeleeWeapon, 1.)
end
if UE.IsValid(self:GetController()) then
self:ReceivePossessed(self:GetController())
UGCLogSystem.Log("[UGCPlayerPawn_ReceiveBeginPlay] Controller Is Valid")
end
--- 技能的初始化
self:SkillInit()
else
end
end
function UGCPlayerPawn:ReceiveEndPlay()
self:RemoveEvent()
self:SkillEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
function UGCPlayerPawn:CheckGradientWeapon()
WeaponGradientManager.UpdatePlayerGradientWeaponMatching(
self.PlayerKey,
UGCGameSystem.GameState:GetPlayerWeaponGrade(self.PlayerKey),
UGCGameSystem.GameState:GetPlayerDefaultMeleeWeaponByPlayerKey(self.PlayerKey)
)
end
function UGCPlayerPawn:AddDefaultMeleeWeapon()
local MeleeWeaponID = UGCGameSystem.GameState:GetPlayerDefaultMeleeWeaponByPlayerKey(self.PlayerKey)
if UGCBackPackSystem.GetItemCount(self, MeleeWeaponID) > 0 then
UGCEventSystem.StopTimer(self.AddDefaultMeleeWeaponHandle)
self.AddDefaultMeleeWeaponHandle = nil
else
UGCBackPackSystem.AddItem(self, MeleeWeaponID, 1)
end
end
function UGCPlayerPawn:InitParam()
-- self:SetMechanismEnergy(GlobalConfigs.GameSetting.InitEnergy)
end
function UGCPlayerPawn:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
-- UGCLogSystem.Log("[UGCPlayerPawn_ReceiveTick] bUseControllerRotationYaw:%s", tostring(self.bUseControllerRotationYaw))
self:TickSkill(DeltaTime)
if not UGCGameSystem.IsServer() then
self:ClientMustBeExeBeginPlay()
end
self.CharacterMovement.Velocity = KismetMathLibrary.ClampVectorSize(self.CharacterMovement.Velocity, 0, self:GetVelocityClamp())
end
function UGCPlayerPawn:GetVelocityClamp()
return self.VelocityClamp
end
function UGCPlayerPawn:SetVelocityClamp(NewVelocityClamp)
self.VelocityClamp = NewVelocityClamp
end
--- 客户端必定执行的BeginPlay
function UGCPlayerPawn:ClientMustBeExeBeginPlay()
if self.DoOnceMustBeExeBeginPlay then return end
self.DoOnceMustBeExeBeginPlay = true
--- 技能的初始化
self:SkillInit()
self:AddEvent()
UGCPawnAttrSystem.SetCanSwitchFPP(self, true)
self:InitCamera()
self.P_PointTo:SetHiddenInGame(true)
end
function UGCPlayerPawn:AddEvent()
UGCEventSystem.AddListener(EventEnum.SetSceneCameraControl, self.SetSceneCameraControl, self)
if self:HasAuthority() then
self.DeadNotifyDelegate:Add(self.PlayerDeadCallBack, self)
self.DamageNotifyDelegate:Add(self.PlayerInjury, self)
else
end
end
function UGCPlayerPawn:RemoveEvent()
UGCEventSystem.RemoveListener(EventEnum.SetSceneCameraControl, self.SetSceneCameraControl, self)
if self:HasAuthority() then
self.DeadNotifyDelegate:Remove(self.PlayerDeadCallBack, self)
self.DamageNotifyDelegate:Remove(self.PlayerInjury, self)
if self.LoopCheckGradientWeaponHandle then
UGCEventSystem.StopTimer(self.LoopCheckGradientWeaponHandle)
self.LoopCheckGradientWeaponHandle = nil
end
if self.AddDefaultMeleeWeaponHandle then
UGCEventSystem.StopTimer(self.AddDefaultMeleeWeaponHandle)
self.AddDefaultMeleeWeaponHandle = nil
end
else
end
end
function UGCPlayerPawn:ReceivePossessed(NewController)
self.SuperClass.ReceivePossessed(self, NewController);
UGCLogSystem.Log("[UGCPlayerPawn_ReceivePossessed] PlayerKey:%s", tostring(NewController.PlayerKey))
UGCEventSystem.SendEvent(EventEnum.PlayerPossessed, NewController.PlayerKey)
--UGCSendRPCSystem.RPCEvent(NewController.PlayerKey, EventEnum.PlayerPossessed, NewController.PlayerKey)
if GlobalConfigs.GameSetting.ReadyCanNotMove and UGCGameSystem.GameState:GetIsReadyState() then
self:SetCanActionable(false)
else
self:SetCanActionable(true)
end
end
function UGCPlayerPawn:SetCanActionable(IsActionable)
UGCSystemLibrary.SetPlayerPawnMovable(self, IsActionable)
end
function UGCPlayerPawn:SetCanActiveSkill(IsActive)
self.bCanActiveSkill = IsActive
end
-------------------------------------------------- Delegate --------------------------------------------------
---@param DamageInfo FDamageInfoCollection
---@return VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue uint, uint, int, EDamageType, bool, float, float
function UGCPlayerPawn:GetDamageInfoCollectionInfo(DamageInfo)
local CauserController = DamageInfo.Instigator
local WeaponID = -1
local CauserKey = CauserController and CauserController.PlayerKey or -1
local VictimKey = self.PlayerKey
local CauserItemID = DamageInfo.CauserItemID
--- 近战投掷、投掷手雷
if CauserItemID then
WeaponID = CauserItemID
end
UGCLogSystem.Log("[UGCPlayerPawn_GetDamageInfoCollectionInfo] WeaponID:%d", WeaponID)
local Distance = 0.
if CauserController and CauserController.Pawn then
Distance = VectorHelper.GetDistance(self:K2_GetActorLocation(), CauserController.Pawn:K2_GetActorLocation())
end
local IsHeadShotDamage = (DamageInfo.Hit.BoneName == "head")
return VictimKey, CauserKey, WeaponID, DamageInfo.DamageType, IsHeadShotDamage, Distance, DamageInfo.Damage
end
---@param DamageInfo FDamageInfoCollection
function UGCPlayerPawn:PlayerDeadCallBack(DamageInfo)
UGCLogSystem.Log("[UGCPlayerPawn_PlayerDeadCallBack] PlayerKey:%s", tostring(self.PlayerKey))
local VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue = self:GetDamageInfoCollectionInfo(DamageInfo)
UGCLogSystem.LogTree("[UGCPlayerPawn_PlayerDeadCallBack] DeadInfo", {VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue})
local DeadPS = UGCGameSystem.GetPlayerStateByPlayerKey(VictimKey)
local Assister = -1
if DeadPS then
Assister = DeadPS:GetAssister(CauserKey, GlobalConfigs.GameSetting.AssistDamage)
end
UGCSendRPCSystem.RPCEvent(nil, EventEnum.PlayerDeathInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue, Assister)
UGCEventSystem.SendEvent(EventEnum.PlayerDeathInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue, Assister)
UGCLogSystem.Log("[UGCPlayerPawn_PlayerDeadCallBack] Succeed")
end
---@param DamageInfo FDamageInfoCollection
---@param ReturnValue float
function UGCPlayerPawn:PlayerInjury(DamageInfo)
local VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue = self:GetDamageInfoCollectionInfo(DamageInfo)
self.PlayerState:UpdatePlayerInjuryInfo(VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue)
UGCEventSystem.SendEvent(EventEnum.PlayerInjuryInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue)
UGCSendRPCSystem.RPCEvent(CauserKey, EventEnum.PlayerInjuryInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue)
end
------------------------------------------------ Delegate End ------------------------------------------------
function UGCPlayerPawn:AddMechanismEnergy(InEnergy)
self:SetMechanismEnergy(self:GetMechanismEnergy() + InEnergy)
end
function UGCPlayerPawn:GetMechanismEnergy()
return self.MechanismEnergy
end
function UGCPlayerPawn:SetMechanismEnergy(NewEnergy)
self.MechanismEnergy = (NewEnergy > 0 and NewEnergy or 0)
end
------------------------------------------------ ModifyDamage ------------------------------------------------
function UGCPlayerPawn:UGC_TakeDamageOverrideEvent(Damage, DamageType, EventInstigator, DamageCauser, Hit)
local DamageAmount = Damage
UGCLogSystem.Log("[UGCPlayerPawn_UGC_TakeDamageOverrideEvent] InDamageAmount:%s", tostring(DamageAmount))
for i, v in pairs(self.ModifyDamageDelegation) do
if v.Obj then
DamageAmount = v.DelegationFun(v.Obj, Damage, self, EventInstigator, DamageCauser, Hit)
else
DamageAmount = v.DelegationFun(Damage, self, EventInstigator, DamageCauser, Hit)
end
end
UGCLogSystem.Log("[UGCPlayerPawn_UGC_TakeDamageOverrideEvent] ModifyDamageAmount:%s", tostring(DamageAmount))
return DamageAmount
end
function UGCPlayerPawn:RemoveModifyDamageDelegation(InDelegationFun, InObj)
for i = #self.ModifyDamageDelegation, 1, -1 do
if self.ModifyDamageDelegate[i].DelegationFun == InDelegationFun and self.ModifyDamageDelegate[i].Obj == InObj then
self.ModifyDamageDelegate[i] = nil
end
end
end
function UGCPlayerPawn:AddModifyDamageDelegationFun(InDelegationFun, InObj)
self.ModifyDamageDelegation[#self.ModifyDamageDelegation + 1] = {DelegationFun = InDelegationFun, Obj = InObj}
end
---------------------------------------------- ModifyDamage End ----------------------------------------------
function UGCPlayerPawn:ScalePlayer(NewScale)
if UGCGameSystem.IsServer() then
self:SetPlayerScale_N(NewScale)
UGCLogSystem.Log("[UGCPlayerPawn_ScalePlayer]")
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetPlayerScale_N", NewScale)
UGCLogSystem.Log("[UGCPlayerPawn_ScalePlayer] Finish")
end
end
function UGCPlayerPawn:SetPlayerScale_N(NewScale)
UGCLogSystem.Log("[UGCPlayerPawn_SetPlayerScale_N]")
local HalfHeight = self.BaseCapsuleHalfHeight * NewScale
self.Mesh:SetWorldScale3D({X = NewScale, Y = NewScale, Z = NewScale})
self.CapsuleComponent:SetCapsuleHalfHeight(HalfHeight, true)
self.CapsuleComponent:SetCapsuleRadius(self.BaseCapsuleRadius * NewScale, true)
self.Mesh:K2_SetRelativeLocation({X = 0, Y = 0, Z = HalfHeight})
UGCLogSystem.Log("[UGCPlayerPawn_SetPlayerScale_N] Finish")
end
function UGCPlayerPawn:SetPlayerState(PawnState)
UGCPawnSystem.EnterPawnState(self, PawnState)
end
function UGCPlayerPawn:SetPawnTF(Pos, Rot)
self:K2_SetActorLocation(Pos)
self:K2_SetActorRotation(Rot)
self.CharacterMovement.Velocity = VectorHelper.VectorZero()
if UGCGameSystem.IsServer() then
self.bShouldDumpCallstackWhenMovingfast = false
self:SetClientLocationOrRotation(Pos, Rot, true, false)
self.bShouldDumpCallstackWhenMovingfast = true
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetPawnTF", VectorHelper.ToLuaTable(Pos), VectorHelper.RotToLuaTable(Rot))
UGCLogSystem.Log("[UGCPlayerPawn_SetPawnTF] Succeed")
end
end
------------------------------------- ChangeCamera -------------------------------------
function UGCPlayerPawn:InitCamera()
self.CameraList = {
[CustomEnum.EPlayerPawnCameraType.Default] = {}, -- 默认摄像机
[CustomEnum.EPlayerPawnCameraType.TopCamera] = {Camera = self.TopCamera, Arm = nil, CameraRot = {Pitch=-30,Yaw=0.000000,Roll=0.000000}},
[CustomEnum.EPlayerPawnCameraType.JumpCamera] = {Camera = self.JumpCamera, Arm = self.JumpArm},
[CustomEnum.EPlayerPawnCameraType.JumpCamera2] = {Camera = self.JumpCamera2, Arm = self.JumpArm2}
}
if self.NowCameraType ~= 1 then
self:OnRep_NowCameraType()
end
UGCLogSystem.Log("[UGCPlayerPawn_InitCamera] Finish")
end
function UGCPlayerPawn:SetNowCameraType(NewCameraType)
self.NowCameraType = NewCameraType
--if UGCGameSystem.IsServer() then
-- UGCSendRPCSystem.ActorRPCNotify(self.PlayerKey, self, "SetNowCameraType", NewCameraType)
--else
-- self:OnRep_NowCameraType()
--end
end
function UGCPlayerPawn:OnRep_NowCameraType()
if self.CameraList[self.NowCameraType] == nil then return end
local TargetCamera = self.CameraList[self.NowCameraType].Camera
local TargetArm = self.CameraList[self.NowCameraType].Arm
local CameraRot = self.CameraList[self.NowCameraType].CameraRot
if TargetCamera then
UGCSystemLibrary.ActivePlayerCameraByName(self, TargetCamera, TargetArm)
if CameraRot then
TargetCamera:K2_SetRelativeRotation(CameraRot)
end
else
UGCSystemLibrary.ActivePlayerDefaultCamera(self)
end
UGCLogSystem.Log("[UGCPlayerPawn_OnRep_NowCameraType] Succeed")
end
function UGCPlayerPawn:SetSceneCameraControl(bIsSet)
UGCLogSystem.Log("[UGCPlayerPawn_SetSceneCameraControl] bIsSet:%s", tostring(bIsSet))
if bIsSet then
self:SceneCameraControlPlayer()
else
self:ResetControlSetting()
end
end
--- 场景摄像机控制玩家时的设置
function UGCPlayerPawn:SceneCameraControlPlayer()
self.bUseControllerRotationYaw = false
self.CharacterMovement.bOrientRotationToMovement = true
self.CharacterMovement.bUseControllerDesiredRotation = false;
self.CharacterMovement.RotationRate = {Pitch=0.000000,Yaw=-1.000000,Roll=0.000000}
UGCLogSystem.Log("[UGCPlayerPawn_SceneCameraControlPlayer] bUseControllerRotationYaw%s", tostring(self.bUseControllerRotationYaw))
end
--- 默认控制玩家时的设置
function UGCPlayerPawn:ResetControlSetting()
self.bUseControllerRotationYaw = true
self.CharacterMovement.bOrientRotationToMovement = false
self.CharacterMovement.bUseControllerDesiredRotation = true;
self.CharacterMovement.RotationRate = {Pitch=0.000000,Yaw=360.000000,Roll=0.000000}
UGCLogSystem.Log("[UGCPlayerPawn_ResetControlSetting]")
end
function UGCPlayerPawn:SetTopCamera(On)
if On then
UGCSystemLibrary.ActivePlayerCameraByName(self, self.TopCamera, nil)
self.TopCamera:K2_SetRelativeRotation({Pitch=-30,Yaw=0.000000,Roll=0.000000})
else
UGCSystemLibrary.ActivePlayerDefaultCamera(self)
end
end
function UGCPlayerPawn:SetJumpCamera(On)
if On then
UGCSystemLibrary.ActivePlayerCameraByName(self, self.JumpCamera, self.JumpArm)
-- self.JumpCamera:K2_SetRelativeRotation({Pitch=-10,Yaw=0.000000,Roll=0.000000})
else
UGCSystemLibrary.ActivePlayerDefaultCamera(self)
end
end
----------------------------------- ChangeCamera End -----------------------------------
------------------------------------- ShowPointToSelf -------------------------------------
function UGCPlayerPawn:ShowPointToSelf(IsShow)
if self.PlayerKey == UGCSystemLibrary.GetLocalPlayerKey() then
self.P_PointTo:SetHiddenInGame(not IsShow)
end
end
----------------------------------- ShowPointToSelf End -----------------------------------
---------------------------------------------------------- TurnOffGravityScale ----------------------------------------------------------
--- 关闭重力影响
---@param On bool
function UGCPlayerPawn:TurnOffGravityScale(On)
if On then
self.STCharacterMovement.GravityScale = 0;
else
self.STCharacterMovement.GravityScale = self.CachedSTCharacterMovementGravityScale;
end
end
-------------------------------------------------------- TurnOffGravityScale End --------------------------------------------------------
function UGCPlayerPawn:SetCustomJumpZVelocity(InJumpZVelocity)
--UGCPawnAttrSystem.SetJumpZVelocity(self, InJumpZVelocity)
if self then
self.CustomJumpZVelocity = InJumpZVelocity
self.CharacterMovement.JumpZVelocity = self.CustomJumpZVelocity
if UGCGameSystem.IsServer() then
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetCustomJumpZVelocity", InJumpZVelocity)
end
end
end
function UGCPlayerPawn:OnRep_CustomJumpZVelocity()
self:SetCustomJumpZVelocity(self.CustomJumpZVelocity)
end
------------------------------------------------------- DashImpulseSkill -------------------------------------------------------
UGCPlayerPawn.MinDashVelocity = 2400
UGCPlayerPawn.MaxDashVelocity = 3600
--- 冲量强度 /s
UGCPlayerPawn.ImpulseStrength = 10000
--- 移动范围(帧计算会有一点偏差)超过范围自动停止
UGCPlayerPawn.TargetDashLength = 1500
--- 最大冲刺时长
UGCPlayerPawn.DashMaxTime = 0.5
--- Dash的消耗限制
UGCPlayerPawn.DashImpulseEnergy = 0.
UGCPlayerPawn.DashImpulseEnergyCost = 100.
UGCPlayerPawn.EnergyRecoverySpeed = 20.
UGCPlayerPawn.DashImpulseMaxEnergy = 200
function UGCPlayerPawn:InitDashImpulse()
if (self.bInitedDashImpulse == nil or (not self:GetDashImpulseOverlapComponent():IsActive()) ) and UGCGameSystem.IsServer() then
self.bInitedDashImpulse = true
self.BP_PawnAuxiliaryOverlapCap:SetActive(true)
self:GetDashImpulseOverlapComponent():SetActive(true)
-- Pawn增加的碰撞盒都没效果
self:GetDashImpulseOverlapComponent().OnComponentBeginOverlap:Add(self.DashCollisionCapsuleBeginOverlap, self)
UGCLogSystem.Log("[UGCPlayerPawn_InitDashImpulse] Finish DashCollisionCapsuleIsActive:%s", tostring(self:GetDashImpulseOverlapComponent():IsActive()))
end
end
function UGCPlayerPawn:GetDashImpulseOverlapComponent()
return self.BP_PawnAuxiliaryOverlapCap.ChildActor.Capsule
end
function UGCPlayerPawn:DashCollisionCapsuleBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
UGCLogSystem.Log("[UGCPlayerPawn_DashCollisionCapsuleBeginOverlap] OtherActor:%s", KismetSystemLibrary.GetObjectName(OtherActor))
self:StopDashImpulse()
end
--- 冲量冲刺
---@param ForwardDir FVector 为nil则使用玩家向前向量作为方向
---@param InStartDashPos FVector 调用时无需传入
function UGCPlayerPawn:DashImpulse(ForwardDir, InStartDashPos)
--local CameraForward = self:GetController().PlayerCameraManager:GetActorForwardVector()
if self.ImpulseDashing then
return
end
if UGCGameSystem.IsServer() then
if not self.bCanActiveSkill then
return
end
end
if self:CheckDashImpulse() then
self.DashImpulseEnergy = self.DashImpulseEnergy - self.DashImpulseEnergyCost
else
return
end
-- self:InitDashImpulse()
self:SetCanActiveSkill(false)
self.ImpulseDashing = true
self:TurnOffGravityScale(true)
self:SetVelocityClamp(self.MaxDashVelocity)
if ForwardDir == nil then
self.ImpulseDir = VectorHelper.ToLuaTable(self:GetActorForwardVector())
else
self.ImpulseDir = ForwardDir
end
-- 给予一个初始冲量
UGCLogSystem.Log("[UGCPlayerPawn_DashImpulse] ImpulseDir:%s", VectorHelper.ToString(self.ImpulseDir))
self.CharacterMovement.Velocity = VectorHelper.MulNumber(self.ImpulseDir, VectorHelper.Length(self.CharacterMovement.Velocity))
self.CharacterMovement:AddImpulse(VectorHelper.MulNumber(self.ImpulseDir, self.ImpulseStrength * 0.4), true)
-- 给予一个初始速度
-- self.CharacterMovement.Velocity = VectorHelper.MulNumber(self.ImpulseDir, 1200)
if UGCGameSystem.IsServer() then
self.StartDashPos = VectorHelper.ToLuaTable(self:K2_GetActorLocation())
else
-- self.StartDashPos = InStartDashPos
self:DashEffect()
end
--self.StopImpulseDashHandle = UGCEventSystem.SetTimer(self, self.StopDashImpulse, self.DashMaxTime)
if UGCGameSystem.IsServer() then
UGCSendRPCSystem.ActorRPCNotify(nil, self, "DashImpulse", self.ImpulseDir)
self.StopImpulseDashHandle = UGCEventSystem.SetTimer(self, function()
self.StopImpulseDashHandle = nil
self:StopDashImpulse()
end, self.DashMaxTime)
end
end
function UGCPlayerPawn:DashEffect()
if self.PlayerKey == UGCSystemLibrary.GetLocalPlayerKey() then
SoundSystem.PlaySound(SoundSystem.ESound.Impulse)
end
end
function UGCPlayerPawn:StopDashImpulse()
if not self.ImpulseDashing then
return
end
self:TurnOffGravityScale(false)
self.CharacterMovement.Velocity = VectorHelper.VectorZero()
self:SetVelocityClamp(self.VelocityClampBase)
if UGCGameSystem.IsServer() then
if self.StopImpulseDashHandle then
UGCEventSystem.StopTimer(self.StopImpulseDashHandle)
self.StopImpulseDashHandle = nil
end
UGCSendRPCSystem.ActorRPCNotify(nil, self, "StopDashImpulse")
end
self.ImpulseDashing = false
self:SetCanActiveSkill(true)
end
function UGCPlayerPawn:AddDashImpulseEnergy(DeltaTime)
self.DashImpulseEnergy = math.clamp(self.DashImpulseEnergy + DeltaTime * self.EnergyRecoverySpeed, 0, self.DashImpulseMaxEnergy)
end
function UGCPlayerPawn:CheckDashImpulse()
return self.DashImpulseEnergy >= self.DashImpulseEnergyCost
end
function UGCPlayerPawn:DashImpulseTick(DeltaTime)
self:AddDashImpulseEnergy(DeltaTime)
if self.ImpulseDashing then
self.CharacterMovement:AddImpulse(VectorHelper.MulNumber(self.ImpulseDir, self.ImpulseStrength * DeltaTime), true)
if self.CharacterMovement.MovementMode ~= EMovementMode.MOVE_Falling then
self.CharacterMovement:SetMovementMode(EMovementMode.MOVE_Falling);
end
-- self.CharacterMovement.Velocity = KismetMathLibrary.ClampVectorSize(self.CharacterMovement.Velocity, self.MinDashVelocity, self.MaxDashVelocity)
self.CharacterMovement.Velocity = VectorHelper.MulNumber(self.ImpulseDir, math.clamp(VectorHelper.Length(self.CharacterMovement.Velocity), self.MinDashVelocity, self.MaxDashVelocity))
if UGCGameSystem.IsServer() then
if VectorHelper.Length(VectorHelper.Sub(self:K2_GetActorLocation(), self.StartDashPos)) > self.TargetDashLength then
self:StopDashImpulse()
end
end
end
end
----------------------------------------------------- DashImpulseSkill End -----------------------------------------------------
--- 测试按键按下在服务器触发的函数
function UGCPlayerPawn:TestButtonFun(CameraForwardVector)
-- self:PlayerDashSkill(self:GetActorForwardVector(), 1, 5000)
-- self:PlayerDashSkill(CameraForwardVector, 1, 5000)
-- self:DashImpulse(CameraForwardVector, 8000, 1500, 0.8)
-- self:TestMoveComponentTo(CameraForwardVector)
end
function UGCPlayerPawn:TestButtonPressed(CameraForwardVector)
end
function UGCPlayerPawn:TestButtonReleased()
end
--- Server的BeginPlay触发及Client的ClientMustBeExeBeginPlay触发
function UGCPlayerPawn:SkillInit()
if UGCGameSystem.IsServer() then
-- self:InitDashImpulse()
else
end
end
function UGCPlayerPawn:SkillEndPlay()
if UGCGameSystem.IsServer() then
else
end
end
function UGCPlayerPawn:TickSkill(DeltaTime)
--self:DashImpulseTick(DeltaTime)
---- self:TickDash(DeltaTime)
--if UGCGameSystem.IsServer() then
--else
-- if UGCSystemLibrary.GetLocalPlayerPawn() == self then
-- end
--
--end
end
function UGCPlayerPawn:GetAvailableServerRPCs()
return
end
return UGCPlayerPawn;