654 lines
24 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@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;