---@class UGCPlayerPawn_C:BP_UGCPlayerPawn_C ---@field StartItemID TArray --Edit Below-- local UGCPlayerPawn = {} -- 关闭盒子掉落 function UGCPlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater) return true end function UGCPlayerPawn:ReceiveBeginPlay() UGCPlayerPawn.SuperClass.ReceiveBeginPlay(self) if UGCGameSystem.IsServer() then self.OnDeath:Add(self.OnDeathCallBack, self) UGCEventSystem.SetTimer(self, function() if UE.IsValid(self) then for i, v in pairs(self.StartItemID) do UGCLogSystem.Log("[UGCPlayerPawn_ReceiveBeginPlay] ID:%s", tostring(v)) UGCBackPackSystem.AddItem(self, v, 1) end end end, 5) else end if not UGCGameSystem.IsServer() and self.CheckFXHandle == nil then -- 这里防止未设置成功做的校验 self.CheckFXHandle = UGCEventSystem.SetTimerLoop(self, self.UpdateFX, 2) -- 绑定粒子颜色改变的函数 UGCEventSystem.AddListener(EventEnum.OverrideFXColor, self.OverrideFXColor, self) -- 绑定粒子改变 UGCEventSystem.AddListener(EventEnum.ChangeFX, self.ChangeFX, self) end local TempRescueOtherComp = self:GetCharacterRescueOtherComponent() if UE.IsValid(TempRescueOtherComp) and UE.IsValid(TempPreViewActor) then -- 配置倒地粒子 没有用这个方法 --TempRescueOtherComp.ShouldAddParticleWhenEnterLastBreath = true --TempRescueOtherComp.ParticleTemplateToAddWhenEnterLastBreath = TempPreViewActor.KillParticle UGCLogSystem.Log("[UGCPlayerPawn_ReceiveBeginPlay] Succeed") end end --[[ function UGCPlayerPawn:ReceiveTick(DeltaTime) UGCPlayerPawn.SuperClass.ReceiveTick(self, DeltaTime) end --]] function UGCPlayerPawn:ReceiveEndPlay() if UGCGameSystem.IsServer() then self.OnDeath:Remove(self.OnDeathCallBack, self) end if self.CheckFXHandle then UGCEventSystem.StopTimer(self.CheckFXHandle) self.CheckFXHandle = nil end UGCPlayerPawn.SuperClass.ReceiveEndPlay(self) end --[[ function UGCPlayerPawn:GetReplicatedProperties() return end --]] --[[ function UGCPlayerPawn:GetAvailableServerRPCs() return end --]] -- 射击枪械槽类型 ShootWeaponEnums = { ESurviveWeaponPropSlot.SWPS_MainShootWeapon1, ESurviveWeaponPropSlot.SWPS_MainShootWeapon2, ESurviveWeaponPropSlot.SWPS_SubShootWeapon, }; function UGCPlayerPawn:OnPostGetWeapon(Weapon) -- self:UpdateFX() UGCLogSystem.Log("[UGCPlayerPawn_OnPostGetWeapon]") self:WeaponAttachEffect(Weapon) end -- 覆盖拖尾特效的颜色 function UGCPlayerPawn:OverrideFXColor(FXType) --UGCLogSystem.Log("[UGCPlayerPawn_OverrideFXColor] FXType:%s", tostring(FXType)) if FXType ~= EFXType.MuzzleTailed then return end if not UE.IsValid(self.MuzzleTailedParticleComp) then return end local TempPreViewActor = UGCGameSystem.GameState:GetPreViewFXActor() if UE.IsValid(TempPreViewActor) then TempPreViewActor:SetParticleCompColor(self.MuzzleTailedParticleComp, EFXType.MuzzleTailed) end end -- 替换FX function UGCPlayerPawn:ChangeFX(FXType) UGCLogSystem.Log("[UGCPlayerPawn_ChangeFX] FXType:%s", tostring(FXType)) if FXType ~= EFXType.MuzzleTailed then return end if not UE.IsValid(self.MuzzleTailedParticleComp) then return end local TempPreViewActor = UGCGameSystem.GameState:GetPreViewFXActor() if UE.IsValid(TempPreViewActor) then local Particle = TempPreViewActor:GetNowFXFromFXType(FXType) self.MuzzleTailedParticleComp:SetTemplate(Particle) self:OverrideFXColor(EFXType.MuzzleTailed) UGCLogSystem.Log("[UGCPlayerPawn_ChangeFX] Succeed") end end UGCPlayerPawn.BoundOnceEffectWeapons = {} function UGCPlayerPawn:UpdateFX() UGCLogSystem.Log("[UGCPlayerPawn_UpdateFX] PawnName:%s", KismetSystemLibrary.GetObjectName(self)) local TempPreViewActor = UGCGameSystem.GameState:GetPreViewFXActor() if UE.IsValid(TempPreViewActor) then for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(self, v); self:WeaponAttachEffect(Weapon) end end end function UGCPlayerPawn:WeaponAttachEffect(Weapon) if UGCGameSystem.IsServer() then return end local TempPreViewActor = UGCGameSystem.GameState:GetPreViewFXActor() if UE.IsValid(TempPreViewActor) then if UE.IsValid(Weapon) then local Effect = Weapon:GetShootWeaponEffectComponent() UGCLogSystem.Log("[UGCPlayerPawn_WeaponAttachEffect] WeaponName:%s", KismetSystemLibrary.GetObjectName(Weapon)) -- 枪口特效 local MuzzleFXParamName = { "MuzzleFX", "MuzzleFXOverride", --"RemoteMuzzleFX", --"ScopeMuzzleFX", } local MuzzleParticle = TempPreViewActor:GetNowFXFromFXType(EFXType.Muzzle) if UE.IsValid(Effect) and UE.IsValid(MuzzleParticle) then for i, v in pairs(MuzzleFXParamName) do Effect[v] = MuzzleParticle end UGCLogSystem.Log("[UGCPlayerPawn_WeaponAttachEffect] Succeed") end if not UGCGameSystem.IsServer() and not table.hasValue(self.BoundOnceEffectWeapons, Weapon) then local SKMesh = Weapon:GetWeaponSkeletalMeshComponent() if not UE.IsValid(SKMesh) then SKMesh = Weapon:GetWeaponStaticMeshComponent() end -- 枪口拖尾特效 local MuzzleTailedParticle = TempPreViewActor:GetNowFXFromFXType(EFXType.MuzzleTailed) if UE.IsValid(MuzzleTailedParticle) then UGCLogSystem.Log("[UGCPlayerPawn_WeaponAttachEffect] 11111111111111111111111111") if UE.IsValid(SKMesh) then UGCLogSystem.Log("[UGCPlayerPawn_WeaponAttachEffect] 22222222222222222222222222222") UGCLogSystem.Log("[UGCPlayerPawn_WeaponAttachEffect] Bind TailedMuzzle") self.BoundOnceEffectWeapons[#self.BoundOnceEffectWeapons + 1] = Weapon self.MuzzleTailedParticleComp = GameplayStatics.SpawnEmitterAttached(MuzzleTailedParticle, SKMesh, "MuzzleEffect", {X=0,Y=0,Z=0}, {Roll = 0, Pitch = 0, Yaw = 0}, {X=1,Y=1,Z=1}, EAttachLocation.SnapToTarget, true) self:OverrideFXColor(EFXType.MuzzleTailed) end end -- 子弹拖尾特效 if TempPreViewActor:GetNowFXFromFXType(EFXType.Bullet) then Weapon.OnBulletBeforeShootDelegate:Add(self.BindBulletTailFX, self) end end end end end ---@param Bullet ASTExtraShootWeaponBulletBase function UGCPlayerPawn:BindBulletTailFX(Bullet) local TempPreViewActor = UGCGameSystem.GameState:GetPreViewFXActor() if UE.IsValid(TempPreViewActor) then if UE.IsValid(Bullet) then local BulletTailFXActor = UGCGameSystem.GameState:GetBulletFXActor() local InitialSpeed = Bullet:GetMaxBulletFlySpeed() local Velocity = VectorHelper.MulNumber(Bullet:GetActorForwardVector(), InitialSpeed) BulletTailFXActor:ActiveFly(Bullet:K2_GetActorRotation(), Bullet:K2_GetActorLocation(), Velocity, TempPreViewActor:GetNowFXFromFXType(EFXType.Bullet)) UGCLogSystem.Log("[UGCPlayerPawn_BindBulletTailFX] InitialSpeed:%s", tostring(InitialSpeed)) end end end ---@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) UGCLogSystem.LogTree("[UGCPlayerPawn_PlayerDead] DamageInfo:", UE.ToTable(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) UGCEventSystem.SendEvent(EventEnum.PlayerInjuryInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue) UGCSendRPCSystem.RPCEvent(CauserKey, EventEnum.PlayerInjuryInfo, VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue) end function UGCPlayerPawn:OnDeathCallBack(DeadCharacter,Killer,DamageCauser,KillingHitInfo,KillingHitImpulseDir,KillingHitDamageTypeID,DamageTypeClass,IsHeadShotDamage) local CauserKey = Killer and Killer.PlayerKey local WeaponID = -1 local DamageType = EDamageType.UGCCustomDamageType + 1 UGCLogSystem.Log("[UGCPlayerPawn_TestOnDeath] PlayerKey:%s, CauserKey:%s", tostring(self.PlayerKey), tostring(CauserKey)) UGCSendRPCSystem.RPCEvent(nil, EventEnum.PlayerDeathInfo, self.PlayerKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, 0, 0) UGCEventSystem.SendEvent(EventEnum.PlayerDeathInfo, self.PlayerKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, 0, 0) -- 发送RPC倒地粒子 local SelfPos = self:K2_GetActorLocation() SelfPos = { X = SelfPos.X, Y = SelfPos.Y, Z = SelfPos.Z, } UnrealNetwork.CallUnrealRPC_Multicast(UGCGameSystem.GameState, "SpawnParticleAtPos", SelfPos); end return UGCPlayerPawn