312 lines
13 KiB
Lua
Raw Permalink Normal View History

2025-01-04 23:00:19 +08:00
---@class UGCPlayerPawn_C:BP_UGCPlayerPawn_C
--Edit Below--
---@type UGCPlayerPawn_C
local UGCPlayerPawn = {
---@field ModifyDamageDelegation fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float
ModifyDamageDelegation = {};
MechanismEnergy = 0; -- 玩家拥有的能量
CachedSTCharacterMovementGravityScale = 1.0;
BaseCapsuleHalfHeight = 88.0;
BaseCapsuleRadius = 40;
};
function UGCPlayerPawn:GetReplicatedProperties()
return
"MechanismEnergy"
end
-- 关闭盒子掉落
function UGCPlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater)
return true
end
function UGCPlayerPawn:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
--- 设置翻墙功能
self.bVaultIsOpen = true
--- 设置滑铲功能
self.IsOpenShovelAbility = true
UGCEventSystem.SendEvent(EventEnum.PlayerBeginPlay, self)
--- 获取初始胶囊体信息
self.BaseCapsuleHalfHeight = self.CapsuleComponent.CapsuleHalfHeight
self.BaseCapsuleRadius = self.CapsuleComponent.CapsuleRadius
if self:HasAuthority() then
self:AddEvent()
self:InitParam()
--- 循环判断当前武器配置是否正确,多则删、少则补
self.LoopCheckGradientWeaponHandle = UGCEventSystem.SetTimerLoop(self, self.CheckGradientWeapon, 1.)
--- 循环判断是否给予初始近战武器有则移除Handle没有则进行循环
self.AddDefaultMeleeWeaponHandle = UGCEventSystem.SetTimerLoop(self, self.AddDefaultMeleeWeapon, 1.)
--- 循环判断默认装备是否有给予
self.DefaultBackPack = TableHelper.DeepCopy(GlobalConfigs.GameSetting.BeBornItems)
self.CheckBornItemsHandle = UGCEventSystem.SetTimerLoop(self, self.CheckBornItems, 1.)
--end
if UE.IsValid(self:GetController()) then
self:ReceivePossessed(self:GetController())
UGCLogSystem.Log("[UGCPlayerPawn_ReceiveBeginPlay] Controller Is Valid")
end
-- Test
--UGCEventSystem.SetTimer(self, function()
-- local SelfPos = self:K2_GetActorLocation()
-- SelfPos.Z = -700
-- self:SetPawnTF(SelfPos, self:K2_GetActorRotation())
--end
--,10)
-- Test End
else
end
end
--- 客户端必定执行的BeginPlay
function UGCPlayerPawn:ClientMustBeExeBeginPlay()
if self.DoOnceMustBeExeBeginPlay then return end
self.DoOnceMustBeExeBeginPlay = true
end
function UGCPlayerPawn:CheckGradientWeapon()
WeaponGradientManager.UpdatePlayerGradientWeaponMatching(
self.PlayerKey,
UGCGameSystem.GameState:GetPlayerWeaponGrade(self.PlayerKey),
UGCGameSystem.GameState:GetPlayerDefaultMeleeWeaponByPlayerKey(self.PlayerKey)
)
local MainShootWeapon2 = UGCWeaponManagerSystem.GetWeaponBySlot(self, ESurviveWeaponPropSlot.SWPS_MainShootWeapon2)
if MainShootWeapon2 then
local ItemID = UGCWeaponManagerSystem.GetWeaponItemID(MainShootWeapon2)
UGCBackPackSystem.DropItem(self, ItemID, UGCBackPackSystem.GetItemCount(self, ItemID), true)
UGCLogSystem.Log("[UGCPlayerPawn_CheckGradientWeapon] ItemID:%s", tostring(ItemID))
end
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:CheckBornItems()
UGCLogSystem.Log("[UGCPlayerPawn_CheckBornItems] PlayerKey:%s", tostring(self.PlayerKey))
for i = #self.DefaultBackPack, 1, -1 do
local ItemID = self.DefaultBackPack[i].ItemID
local Count = self.DefaultBackPack[i].Count
local InstCount = UGCBackPackSystem.GetItemCount(self, ItemID)
if InstCount >= Count then
self.DefaultBackPack[i] = nil
else
UGCBackPackSystem.AddItem(self, ItemID, Count - InstCount)
end
end
if #self.DefaultBackPack == 0 then
UGCEventSystem.StopTimer(self.CheckBornItemsHandle)
self.CheckBornItemsHandle = nil
UGCLogSystem.Log("[UGCPlayerPawn_CheckBornItems] Succeed PlayerKey:%s", tostring(self.PlayerKey));
end
end
function UGCPlayerPawn:InitParam()
if UGCGameSystem.GameState:GetGameStateType() == CustomEnum.EGameState.Waiting then
self:SetMechanismEnergy(GlobalConfigs.GameSetting.WaitingInitEnergy)
else
self:SetMechanismEnergy(GlobalConfigs.GameSetting.InitEnergy)
end
end
function UGCPlayerPawn:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
if not UGCGameSystem.IsServer() then
self:ClientMustBeExeBeginPlay()
end
end
function UGCPlayerPawn:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
self:RemoveEvent()
end
function UGCPlayerPawn:AddEvent()
if self:HasAuthority() then
self.DeadNotifyDelegate:Add(self.PlayerDead, self)
self.DamageNotifyDelegate:Add(self.PlayerInjury, self)
else
end
end
function UGCPlayerPawn:RemoveEvent()
if self:HasAuthority() then
self.DeadNotifyDelegate:Remove(self.PlayerDead, 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
if self.CheckBornItemsHandle then
UGCEventSystem.StopTimer(self.CheckBornItemsHandle)
self.CheckBornItemsHandle = 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)
UGCGameSystem.GameState:SetPlayerIsAlive(NewController.PlayerKey, self)
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:PlayerDead(DamageInfo)
local VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue = self:GetDamageInfoCollectionInfo(DamageInfo)
UGCSendRPCSystem.RPCEvent(nil, EventEnum.PlayerDeathInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue)
UGCEventSystem.SendEvent(EventEnum.PlayerDeathInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue)
UGCGameSystem.GameState:SetPlayerIsAlive(VictimKey, nil)
end
---@param DamageInfo FDamageInfoCollection
---@param ReturnValue float
function UGCPlayerPawn:PlayerInjury(DamageInfo)
local VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue = self:GetDamageInfoCollectionInfo(DamageInfo)
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))
if EventInstigator and EventInstigator.PlayerKey then
local CauserTeamID = UGCPlayerStateSystem.GetTeamID(EventInstigator.PlayerKey)
local SelfTeamID = UGCPlayerStateSystem.GetTeamID(self.PlayerKey)
if DamageType == EDamageType.UGCPointDamage then
DamageAmount = (CauserTeamID == SelfTeamID and MechanismConfig.MechanismFriendlyInjuryRatio * DamageAmount or DamageAmount)
else
if EventInstigator.PlayerKey == self.PlayerKey and GlobalConfigs.GameSetting.bEnableSelfHarm then
--- 对自己的伤害
DamageAmount = GlobalConfigs.GameSetting.SelfHarmInjuryRatio * DamageAmount
else
--- 伤害设置(友方、敌方)
DamageAmount = (CauserTeamID == SelfTeamID and GlobalConfigs.GameSetting.FriendlyInjuryRatio * DamageAmount or DamageAmount)
end
end
elseif DamageCauser and DamageCauser:GetOwner() then
UGCLogSystem.Log("[UGCPlayerPawn_UGC_TakeDamageOverrideEvent] DamageCauser:GetOwner():%s", KismetSystemLibrary.GetObjectName(DamageCauser:GetOwner()))
local TargetPlayerKey = DamageCauser:GetOwner().PlayerKey
if TargetPlayerKey then
local CauserTeamID = UGCPlayerStateSystem.GetTeamID(TargetPlayerKey)
local SelfTeamID = UGCPlayerStateSystem.GetTeamID(self.PlayerKey)
DamageAmount = (CauserTeamID == SelfTeamID and GlobalConfigs.GameSetting.FriendlyInjuryRatio * DamageAmount or DamageAmount)
end
else
--- 掉落伤害
DamageAmount = GlobalConfigs.GameSetting.bEnableDropDamage and DamageAmount or 0.
end
if DamageType == EDamageType.MeleeDamage then
DamageAmount = DamageAmount * GlobalConfigs.GameSetting.MeleeDamageScale
end
UGCLogSystem.Log("[UGCPlayerPawn_UGC_TakeDamageOverrideEvent] ModifyDamageAmount:%s", tostring(DamageAmount))
return DamageAmount
end
---------------------------------------------- ModifyDamage 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
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:GetAvailableServerRPCs()
return
end
return UGCPlayerPawn;