UGCProjects/GZJ/Script/Blueprint/Player/BP_PlayerPawn.lua

697 lines
26 KiB
Lua
Raw Normal View History

2025-01-08 22:46:12 +08:00
---@class BP_PlayerPawn_C:BP_UGCPlayerPawn_C
---@field BreachWidget UWidgetComponent
---@field ParticleSystem UParticleSystemComponent
---@field CameraSocket USceneComponent
---@field WeaponActorSocket USceneComponent
---@field WeaponParticleArray TMap:TEnumAsByte<EWeaponClassType>,UParticleSystem
--Edit Below--
UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom')
UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom')
UGCGameSystem.UGCRequire('Script.Global.Global')
local BP_PlayerPawn = {
IsRunOnServer = false,
WeaponActor = nil,
IsInArena = false, --是否在场内
IsInTrueDamage = false, --是否在真实伤害状态
DashDuration = -1, --冲刺持续时间
CachedCharacterMovementGravityScale = 1.5, --缓存玩家重力参数
IsDashTo = false, --冲刺状态开关
LaunchCharacterForce = 10000, --冲刺力度 决定要冲刺多远
LaunchDir = nil, --冲刺方向
EnergyData = { Max = 0, Cur = 0 }, --能量值(为了同一帧同步所以合并)
bHasApplyedAttribute = false, --是否已有初始属性
AttributeUpdateInterval = 0, --属性更新计时器
bCanBeControlledByMonsters = true, --可被怪物控制
WeaponParticles = {}, --武器特效
BossAttackCount = 0, --Boss被攻击次数用作播放特效
bIsAlive = true, --玩家是否活着
SkillSystemComponent = nil, --技能系统
TestTimerHandler = nil;
ItemActorClass = nil,
};
BP_PlayerPawn.OnReceiveDamageDelegate = Delegate.New()
BP_PlayerPawn.OnWeaponSpawnedDelegate = Delegate.New()
--设置同步的属性
function BP_PlayerPawn:GetReplicatedProperties()
return
"WeaponActor",
"EnergyData",
"BossAttackCount",
"IsInArena"
end
function BP_PlayerPawn:GetAvailableServerRPCs()
return
-- "DrawDebugSphere",
-- "DrawDebugLine",
-- "DrawDebugBox",
-- "Client_MulticastRPC_PlaySkillEffect",
-- "Client_MulticastRPC_PlayEffect",
-- "Client_MulticastRPC_PlayDirectionalEffect",
-- "Client_MulticastRPC_PlayEffectAtLocation",
-- "Client_MulticastRPC_RemoveSkillEffect",
-- "Client_MulticastRPC_RemoveAllSkillEffect"
end
function BP_PlayerPawn:ReceiveBeginPlay()
BP_PlayerPawn.SuperClass.ReceiveBeginPlay(self)
self.IsRunOnServer = UGCGameSystem.IsServer()
--禁止掉落伤害
self.bTemperoryDisableFallingDamage = true
--缓存当前重力
self.CachedCharacterMovementGravityScale = self.STCharacterMovement.GravityScale
self.ItemActorClass = UE.LoadClass(BPClassPath.PickupItemClass)
EventSystem.SetTimer(self, function()
--self:TestPawn();
end, 30)
if self:HasAuthority() then
self:BindServerEvent()
if self.SkillSystemComponent == nil then
local SkillSystemComponentClass = require("Script.SimpleSkill.SkillSystemComponent")
self.SkillSystemComponent = SkillSystemComponentClass.New(self)
end
else
self:BindClientEvent()
local CommandManager = require('Script.Manager.CommandQueneManager')
CommandManager:AddInitCommand(self, self.Client_Init)
end
end
function BP_PlayerPawn:TestPawn()
if self:HasAuthority() == false then
end
--local PlayerState = self:GetPlayerStateSafety()
--PlayerState:AddExp(10000)
end
function BP_PlayerPawn:ReceiveEndPlay()
if self:HasAuthority() then
self:UnbindServerEvent()
else
self:UnbindClientEvent()
end
BP_PlayerPawn.SuperClass.ReceiveEndPlay(self)
end
function BP_PlayerPawn:ReceiveTick(DeltaTime)
BP_PlayerPawn.SuperClass.ReceiveTick(self, DeltaTime)
if self.IsRunOnServer then
self:ServerTick(DeltaTime)
self.SkillSystemComponent:OnTick(DeltaTime)
else
if self.bHasInitClient == nil and self.PlayerKey ~= 0 then
local CommandManager = require('Script.Manager.CommandQueneManager')
CommandManager.bPlayerPawnReady = true
self.bHasInitClient = true
UE.Log("[BP_PlayerPawn] *** BP_PlayerPawn Tick Init Ready PlayerKey:%s", self.PlayerKey)
end
self:ClientTick(DeltaTime)
end
end
function BP_PlayerPawn:Client_Init()
self:ClientOnHPChanged(UGCPawnAttrSystem.GetHealth(self), UGCPawnAttrSystem.GetHealthMax(self), 0)
self:OnRep_EnergyData()
end
---@field UGC_PreTakeDamageEvent:fun(Damage:float,EventInstigator:AController,DamageEvent:FDamageEvent,DamageCauser:AActor):float
function BP_PlayerPawn:UGC_PreTakeDamageEvent(Damage, EventInstigator, DamageEvent, DamageCauser)
UE.Log("[BP_PlayerPawn:UGC_PreTakeDamageEvent] Damage = %d", Damage)
return Damage
end
function BP_PlayerPawn:ServerTick(DeltaTime)
--自动回复逻辑
if UGCGameSystem.GameState.bHasApplyedAttribute then
self.AttributeUpdateInterval = self.AttributeUpdateInterval + DeltaTime
if self.AttributeUpdateInterval >= 1.0 then
local PlayerState = self:GetPlayerStateSafety()
--成长属性
PlayerState:GrowthAttributes()
--每秒增加杀敌点
PlayerState:GrowthKillPoint()
--刷新战斗力计算结果
PlayerState:RefreshCombatPoint()
--每秒回复
PlayerState:RecoverPlayerPawn()
--每秒杀敌点
PlayerState:AttributeAdditionPerSecond()
self.AttributeUpdateInterval = 0
end
end
--冲刺逻辑
if self.DashDuration > 0 then
self.DashDuration = self.DashDuration - DeltaTime
if self.DashDuration <= 0 then
self.DashDuration = -1
self.LaunchDir = nil
self:EnableDashTo(false)
end
if self.LaunchDir then
self:LaunchCharacter(VectorHelper.MulNumber(self.LaunchDir, self.LaunchCharacterForce * DeltaTime), true, false)
if self.CharacterMovement.MovementMode ~= EMovementMode.MOVE_Falling then
self.CharacterMovement:SetMovementMode(EMovementMode.MOVE_Falling)
end
end
end
end
function BP_PlayerPawn:ClientTick(DeltaTime)
end
function BP_PlayerPawn:BindServerEvent()
self.OnCharacterHpChange:Add(BP_PlayerPawn.ServerOnHPChanged, self)
self.OnDeath:Add(BP_PlayerPawn.ServerOnSelfDeath, self)
end
function BP_PlayerPawn:BindClientEvent()
EventSystem:AddListener(EventType.ClientUpdateWeapon, BP_PlayerPawn.OnUpdateWeapon, self)
self.OnCharacterHpChange:Add(BP_PlayerPawn.ClientOnHPChanged, self)
end
function BP_PlayerPawn:UnbindServerEvent()
self.OnDeath:Remove(BP_PlayerPawn.ServerOnSelfDeath, self)
self.OnCharacterHpChange:Remove(BP_PlayerPawn.ServerOnHPChanged, self)
end
function BP_PlayerPawn:UnbindClientEvent()
EventSystem:RemoveListener(EventType.ClientUpdateWeapon, BP_PlayerPawn.OnUpdateWeapon, self)
self.OnCharacterHpChange:Remove(BP_PlayerPawn.ClientOnHPChanged, self)
end
function BP_PlayerPawn:ServerOnSelfDeath(DeadPawn, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage)
if DeadPawn.PlayerKey == self.PlayerKey then
if UE.IsValid(KillerController) and UE.IsValid(KillerController.Pawn) then
EventSystem:SendEvent(EventType.PlayerPawnDead, self.PlayerKey, KillerController.Pawn)
end
UE.Log("[BP_PlayerPawn:ServerOnSelfDeath] PlayerKey=%d",self.PlayerKey)
local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(self)
local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey)
local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey)
PlayerState.BackupEnergyData = TableHelper.DeepCopyTable(self.EnergyData)
self.bIsAlive = false
if self.SkillSystemComponent then
self.SkillSystemComponent:RemoveAllSkill()
UnrealNetwork.CallUnrealRPC_Multicast(self, "Client_MulticastRPC_RemoveAllSkillEffect", self)
end
if DamageCauser and UE.IsValid(DamageCauser) then
local MonsterType = GameDataManager.GetMonsterTypeByID(DamageCauser.ID)
if MonsterType == EMonsterType.Boss or MonsterType == EMonsterType.Common then
if MonsterType == EMonsterType.Boss then
DamageCauser.KilledPlayerNum = DamageCauser.KilledPlayerNum + 1
end
PlayerController.IsDeadInArena = true
else
PlayerController.IsDeadInArena = false
end
end
end
end
function BP_PlayerPawn:ServerOnHPChanged(CurHP, MaxHP, PrevHP)
UE.Log("[BP_PlayerPawn:ServerOnHPChanged] PlayerKey = %d, CurHP = %.1f, MaxHP = %.1f, PrevHP = %.1f", UGCPawnAttrSystem.GetPlayerKeyInt64(self), CurHP, MaxHP, PrevHP)
end
function BP_PlayerPawn:ClientOnHPChanged(CurHP, MaxHP, PrevHP)
local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(self)
EventSystem:SendEvent(EventType.OnPlayerHPChanged, PlayerKey, CurHP, MaxHP, PrevHP)
UE.Log("[BP_PlayerPawn:ClientOnHPChanged] PlayerKey = %d, CurHP = %.1f, MaxHP = %.1f, PrevHP = %.1f", PlayerKey, CurHP, MaxHP, PrevHP)
end
function BP_PlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater)
return true
end
function BP_PlayerPawn:GetPickupCollision()
return self.PickupCollision
end
-- 获取武器组件
function BP_PlayerPawn:GetWeaponComponent()
return self.WeaponActor
end
function BP_PlayerPawn:IsFullHealth()
local MaxHP = UGCPawnAttrSystem.GetHealthMax(self)
local CurHP = UGCPawnAttrSystem.GetHealth(self)
return math.isNearlyEqual(MaxHP, CurHP) and MaxHP > 0
end
function BP_PlayerPawn:IsFullEnergy()
local MaxEnergy = self.EnergyData.Max
local CurEnergy = self.EnergyData.Cur
return math.isNearlyEqual(MaxEnergy, CurEnergy) and MaxEnergy > 0
end
function BP_PlayerPawn:IsSelfAlive()
return self.bIsAlive
end
function BP_PlayerPawn:OnRep_EnergyData()
if EventSystem and EventType then
local Cur = self.EnergyData.Cur
local Max = self.EnergyData.Max
UE.Log("[BP_PlayerPawn:OnRep_Energy] Cur = %2.2f, Max = %2.2f", Cur, Max)
EventSystem:SendEvent(EventType.OnPlayerEnergyChanged, self.PlayerKey, Cur, Max)
end
end
function BP_PlayerPawn:OnRep_WeaponActor()
UE.Log("[BP_PlayerPawn:OnRep_WeaponActor] PlayerKey=%d, Changed", self.PlayerKey)
EventSystem.SetTimer(self, function()
if self.WeaponActor ~= nil and UE.IsValid(self.WeaponActor) then
self.WeaponActor:OnRep_CurrentWeaponId()
end
end, 0.2)
end
function BP_PlayerPawn:OnRep_BossAttackCount()
if self.WeaponActor == nil then
return
end
local WeaponId = self.WeaponActor.CurrentWeaponId
local WT = self.WeaponActor:GetWeaponTypeByWeaponId(WeaponId)
if WT == EWeaponClassType.WT_ShooterRifle
or WT == EWeaponClassType.WT_AssaultRifle
or WT == EWeaponClassType.WT_ShotGun
or WT == EWeaponClassType.WT_MachineGun
then
self:PlaySingleWeaponEffect(self.PlayerKey, WT)
end
end
function BP_PlayerPawn:DashTo(Dir, Duration, DashForce)
self.LaunchCharacterForce = DashForce
self.DashDuration = Duration
self.LaunchDir = Dir
self:EnableDashTo(true)
end
function BP_PlayerPawn:EnableDashTo(IsOn)
if IsOn then
self.STCharacterMovement.GravityScale = 0
else
self.STCharacterMovement.GravityScale = self.CachedCharacterMovementGravityScale
end
end
--- 玩家处理伤害函数
---@param DamageAmount float
---@param DamageEvent FDamageEvent
---@param EventInstigator AController
---@param DamageCauser AActor
function BP_PlayerPawn:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser)
self.OnReceiveDamageDelegate(self, DamageAmount, EventInstigator, DamageCauser)
local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(UGCPawnAttrSystem.GetPlayerKeyInt64(self))
-- 获取 闪避
if PlayerState:Dodge() > 0 then
math.randomseed(KismetSystemLibrary.GetGameTimeInSeconds(self))
local Val = math.random() -- (0, 1)
if Val <= PlayerState:Dodge() then
-- 此时闪避
UE.Log("[BP_PlayerPawn:BP_CharacterModifyDamage] 闪避了一次")
return 0
end
end
local Val = BP_PlayerPawn.SuperClass:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser)
-- 处理玩家的 defence
DamageAmount = PlayerState:GetDamage(DamageCauser, Val)
UE.Log("[BP_PlayerPawn:BP_CharacterModifyDamage] PlayerKey=%d, 当前受到伤害=%.2f", self.PlayerKey, DamageAmount)
-- 处理反弹伤害
PlayerState:GetReverseDamage(DamageCauser, DamageAmount)
-- 检查是否有护盾
local Amount = PlayerState:DealShield(DamageAmount)
return Amount
end
--玩家进行吸血
function BP_PlayerPawn:VampBlood(InNum)
if InNum <= 0 then
return
end
-- 获取玩家吸血效率
local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(UGCPawnAttrSystem.GetPlayerKeyInt64(self))
local Val = PlayerState:SuckBlood(InNum)
-- 回复血量
self:RecoverCurHP(Val, 0)
UE.Log("[BP_PlayerPawn:VampBlood] Vamp = %.2f", Val)
end
--传过来一个怪物收到的真实伤害
function BP_PlayerPawn:DealRealDamage(InMonster, InNum)
-- 处理吸血
self:VampBlood(InNum)
-- 可以处理飘字等
-- 飘字 UGC_GetDamageNumberConfigIndex可以检查一下
if GameDataManager.GetMonsterTypeByID(InMonster.ID) == EMonsterType.Boss then
self.BossAttackCount = self.BossAttackCount + 1
end
end
-- Server
function BP_PlayerPawn:SetMaxHealth(InMaxHealth)
UGCPawnAttrSystem.SetHealthMax(self, InMaxHealth)
UE.Log("[BP_PlayerPawn:SetMaxHealth] PlayerKey = %d, InMaxHP = %2.2f", self.PlayerKey, InMaxHealth)
end
-- Server
function BP_PlayerPawn:SetMaxEnergy(InMaxEnergy)
self.EnergyData.Max = InMaxEnergy
self.EnergyData.Cur = InMaxEnergy
UE.Log("[BP_PlayerPawn:SetMaxEnergy] PlayerKey = %d, Max = %2.2f, Cur = %2.2f", self.PlayerKey, self.EnergyData.Max, self.EnergyData.Cur)
end
-- Server & Client
function BP_PlayerPawn:GetCurEnergy()
return self.EnergyData.Cur
end
-- Server
function BP_PlayerPawn:ConsumeEnergy(InDelta)
local CurEnergy = math.clamp(self.EnergyData.Cur - InDelta, 0, self.EnergyData.Cur)
self.EnergyData.Cur = CurEnergy
end
-- Server 回复血量
function BP_PlayerPawn:RecoverCurHP(Value, Percent)
local MaxHP = UGCPawnAttrSystem.GetHealthMax(self)
local CurHP = UGCPawnAttrSystem.GetHealth(self)
if math.isNearlyEqual(MaxHP, CurHP) then
UE.Log("[BP_PlayerPawn:RecoverCurHP] Full HP")
return
end
local Delta = Value + MaxHP * Percent
local NewCurHP = CurHP + Delta
NewCurHP = math.clamp(NewCurHP, 0, MaxHP)
UE.Log("[BP_PlayerPawn:RecoverCurHP] PlayerKey = %d, Value = %2.2f, CurHP = %2.2f, Real = %2.2f", self.PlayerKey, Delta, CurHP, MaxHP - NewCurHP)
UGCPawnAttrSystem.SetHealth(self, NewCurHP)
end
-- Server
function BP_PlayerPawn:RecoverCurEnergy(Value, Percent)
if UE.IsValid(self) == false then
print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 本身就有问题'))
end
if self.EnergyData == nil then
print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Energy == nil'))
end
if self.EnergyData.Max == nil then
print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Max Energy == nil'))
end
if self.EnergyData.Cur == nil then
print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Cur Energy == nil'))
end
local MaxEnergy = self.EnergyData.Max
local CurEnergy = self.EnergyData.Cur
if math.isNearlyEqual(MaxEnergy, CurEnergy) and MaxEnergy > 0 then
UE.Log("[BP_PlayerPawn:RecoverCurEnergy] PlayerKey = %d, Full Energy", self.PlayerKey)
return
end
local Delta = Value + MaxEnergy * Percent
local NewCurEnergy = CurEnergy + Delta
NewCurEnergy = math.clamp(NewCurEnergy, 0, MaxEnergy)
UE.Log("[BP_PlayerPawn:RecoverCurEnergy] PlayerKey = %d, Value = %2.2f, CurHP = %2.2f, Real = %2.2f", self.PlayerKey, Delta, CurEnergy, MaxEnergy - NewCurEnergy)
self.EnergyData.Cur = NewCurEnergy
end
---玩家重生后初始化数据的逻辑
function BP_PlayerPawn:OnPlayerRespawned(OwnerPlayerState, OwnerPlayerController)
if (not UE.IsValid(OwnerPlayerState)) or (not UE.IsValid(OwnerPlayerController)) then
UE.LogError("[BP_PlayerPawn:OnPlayerRespawned] invalid PS or PC")
return
end
---Attribute init
print(string.format('[BP_PlayerPawn:OnPlayerRespawned] 设置玩家 Energy 的值'))
self:SetMaxEnergy(OwnerPlayerState.BackupEnergyData.Max)
OwnerPlayerState:ApplyAttributes()
---SkillSystem init
if self.SkillSystemComponent == nil then
local SkillSystemComponentClass = require("Script.SimpleSkill.SkillSystemComponent")
self.SkillSystemComponent = SkillSystemComponentClass.New(self)
end
local SkillListCopy = TableHelper.DeepCopyTable(OwnerPlayerController.ActiveSkillNameList)
for Slot, SkillInfo in pairs(SkillListCopy) do
self:GiveSkill(SkillInfo.SkillName, Slot, SkillInfo.SkillLevel)
end
---清空上次死亡上传的备份数据
OwnerPlayerState.BackupEnergyData = {}
---Weapon init
local OwnedWeapons = OwnerPlayerState:GetWeapons()
local CurWeaponId = -1
if not table.isEmpty(OwnedWeapons) then
CurWeaponId = OwnedWeapons[1].WeaponId
end
if self.WeaponActor == nil then
AsyncLoadTools:LoadObject(BPClassPath.WeaponBaseActor,
function(WeaponClass)
if UE.IsValid(self) and UE.IsValid(WeaponClass) and UE.IsValid(OwnerPlayerState) then
local Weapon = UGCGameSystem.SpawnActor(self, WeaponClass, self:K2_GetActorLocation(), self:K2_GetActorRotation(), VectorHelper.ScaleOne(), nil)
Weapon:SetWeaponID(CurWeaponId)
Weapon:SetOwnerCharacter(self)
self.WeaponActor = Weapon
self.OnWeaponSpawnedDelegate(self)
end
end)
else
self.WeaponActor:SetWeaponID(CurWeaponId)
end
end
--仅切换枪的时候再做操作
function BP_PlayerPawn:OnUpdateWeapon(InWeaponId, InOldId, InPlayerKey)
-- 因为不需要重复播放
if InOldId == InWeaponId then
return
end
if InPlayerKey ~= self.PlayerKey then
return
end
local WeaponType = GameDataManager.GetWeaponType(InWeaponId)
if WeaponType == nil then
UE.Log("[BP_WeaponPawnBase:CheckWeaponByWeaponId] Data is nil")
return
else
self:ClearParticles()
self:ShowParticle(false)
-- 选择对应的特效,并在玩家身上播放
local WeaponParticle = self.WeaponParticleArray[WeaponType]
if WeaponParticle ~= nil then
self.ParticleSystem:SetTemplate(WeaponParticle)
if WeaponType == EWeaponClassType.WT_SubmachineGun or WeaponType == EWeaponClassType.WT_Sniper then
-- 持久显示
local Text = ''
if WeaponType == EWeaponClassType.WT_ShooterRifle then
Text = 'spine_03'
end
self.WeaponParticles[WeaponType] = GameplayStatics.SpawnEmitterAttached(WeaponParticle, self.Mesh, Text, Vector.New(0, 0, 0), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, false)
else
--当攻击的时候显示一次,因此不在这里显示
end
UE.Log("[BP_PlayerPawn:OnUpdateWeapon] 播放特效, Type = %d", WeaponType)
end
self:ShowParticle(true)
end
end
function BP_PlayerPawn:PlaySingleWeaponEffect(InPlayerKey, InWeaponType)
UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 开始播放特效")
if InPlayerKey ~= self.PlayerKey then
return
end
UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 当前武器类型:%d", InWeaponType)
if InWeaponType == nil then
UE.Log("[BP_WeaponPawnBase:CheckWeaponByWeaponId] 找不到 WeaponType 请检查一下")
return
else
local WeaponParticle = self.WeaponParticleArray[InWeaponType]
if WeaponParticle ~= nil then
UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 有武器特效")
local EffectParticle = GameplayStatics.SpawnEmitterAttached(WeaponParticle, self.Mesh, "", Vector.New(0, 0, 0), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true)
EventSystem.SetTimer(self, function()
if UE.IsValid(EffectParticle) then
EffectParticle:K2_DestroyComponent()
end
end, 1)
else
UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 找不到武器特效")
end
end
end
-- 清除玩家身上的特效
function BP_PlayerPawn:ShowParticle(InShow)
-- 设置隐藏即可
self.ParticleSystem:SetHiddenInGame(InShow, false)
end
function BP_PlayerPawn:ClearParticles()
for _, v in pairs(self.WeaponParticles) do
v:K2_DestroyComponent(self)
end
self.WeaponParticles = {}
end
function BP_PlayerPawn:IsInMainArea()
return self.IsInArena
end
function BP_PlayerPawn:IsInExerciseRoom()
return not self.IsInArena
end
function BP_PlayerPawn:OnRep_IsInArena()
-- 进行
if UE.IsValid(self.WeaponActor) then
self.WeaponActor:PlayerInArena(self.IsInArena)
end
end
------------------------------- **************** 技能激活 **************** -----------------------------------
---@param SkillNameList ESkillName[]
function BP_PlayerPawn:GiveSkillWithSkillNameList(SkillNameList)
self.SkillSystemComponent:GiveSkillWithList(SkillNameList)
end
---@param SkillName ESkillName
---@param SlotID ESkillSlot
---@param SkillLevel int
---@return number 返回-1则添加技能失败返回0则代表当前slot无技能其余正常情况返回技能ID
function BP_PlayerPawn:GiveSkill(SkillName, SlotID, SkillLevel)
return self.SkillSystemComponent:GiveSkill(SkillName, SlotID, SkillLevel)
end
function BP_PlayerPawn:TryActiveSkillBySlot(SkillSlot)
if self.SkillSystemComponent ~= nil then
self.SkillSystemComponent:TryActiveSkillBySlot(SkillSlot)
else
UE.Log("SkillSystemComponent of PlayerPawn is nil")
end
end
function BP_PlayerPawn:RemoveSkill(SkillName)
if self.SkillSystemComponent ~= nil then
self.SkillSystemComponent:RemoveSkill(SkillName)
end
end
function BP_PlayerPawn:Client_MulticastRPC_PlayEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName)
if (not UE.IsValid(CasterActor)) then
UE.Log("[Client_MulticastRPC_PlayEffect] invalid CasterActor")
return
end
local EffectSystemManager = require('Script.Manager.EffectSystemManager')
EffectSystemManager.PlayEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName)
end
function BP_PlayerPawn:Client_MulticastRPC_PlayDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation)
if (not UE.IsValid(CasterActor)) then
UE.Log("[Client_MulticastRPC_PlayDirectionalEffect] invalid CasterActor")
return
end
local EffectSystemManager = require('Script.Manager.EffectSystemManager')
EffectSystemManager.PlayDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation)
end
function BP_PlayerPawn:Client_MulticastRPC_PlayEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration)
if (not UE.IsValid(CasterActor)) then
UE.Log("[Client_MulticastRPC_PlayEffectAtLocation] invalid CasterActor")
return
end
local EffectSystemManager = require('Script.Manager.EffectSystemManager')
EffectSystemManager.PlayEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration)
end
function BP_PlayerPawn:Client_MulticastRPC_RemoveSkillEffect(SkillName, InstanceId, CasterActor)
if (not UE.IsValid(CasterActor)) then
UE.Log("[Client_MulticastRPC_RemoveSkillEffect] invalid CasterActor")
return
end
local EffectSystemManager = require('Script.Manager.EffectSystemManager')
EffectSystemManager.RemoveSkillEffectByInstanceId(SkillName, InstanceId, CasterActor)
end
function BP_PlayerPawn:Client_MulticastRPC_RemoveAllSkillEffect(CasterActor)
if (not UE.IsValid(CasterActor)) then
UE.Log("[Client_MulticastRPC_RemoveAllSkillEffect] invalid CasterActor")
return
end
local EffectSystemManager = require('Script.Manager.EffectSystemManager')
EffectSystemManager.RemoveAllEffectOfActor(CasterActor)
end
------------------------------- **************** Debug **************** -----------------------------------
function BP_PlayerPawn:DrawDebugSphere(Center, Color, Radius)
STExtraGameplayStatics.ClientDrawDebugSphere(Center, Radius, 10, Color, 10, 1)
end
function BP_PlayerPawn:DrawDebugLine(Start, End, Color)
STExtraGameplayStatics.ClientDrawDebugLine(Start, End, Color, 10, 1)
end
function BP_PlayerPawn:DrawDebugBox(Center, Extent, Color, Rotation)
STExtraGameplayStatics.ClientDrawDebugBox(Center, Extent, Color, Rotation, 1, 2)
end
return BP_PlayerPawn;