---@class UGCPlayerPawn_C:BP_UGCPlayerPawn_C --Edit Below-- ---@type UGCPlayerPawn_C local UGCPlayerPawn = {}; ---@type int32 UGCPlayerPawn.CameraAddLength = 20; ---@type UCameraComponent UGCPlayerPawn.CurrentCamera = nil; ---@type USpringArmComponent UGCPlayerPawn.CurrentSpringArm = nil; UGCPlayerPawn.Maho = 100;--- 玩家蓝量 UGCPlayerPawn.MaxMaho = 100;--- 玩家蓝量最大值 --- 玩家护甲,计算方式 Damage / (1 + Armor) UGCPlayerPawn.Armor = 0; UGCPlayerPawn.BaseArmor = 0; --- 伤害 Scale Damage = Damage * DamageScaleValue UGCPlayerPawn.DamageScaleValue = 1; UGCPlayerPawn.BaseDamageScaleValue = 1; --- 毒圈伤害修改 SignalHP = SignalHPDelta * PoisonScale / (1 + PoisonScale) UGCPlayerPawn.PoisonScale = 1; UGCPlayerPawn.BasePoisonScale = 1; UGCPlayerPawn.BaseSpeedScale = 0; UGCPlayerPawn.BaseJumpZVelocity = 443.0; UGCPlayerPawn.BaseTargetOffset = { X = 0, Y = 0, Z = 178.000000 }; UGCPlayerPawn.BaseTargetArmLength = 220; UGCPlayerPawn.IgnoreHitTimes = 0; -- 忽略攻击的次数 function UGCPlayerPawn:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); self.bVaultIsOpen = DefaultSettings.OpenVault; self.IsOpenShovelAbility = DefaultSettings.OpenShovel; -- 因为无敌时间是 2 s,因此设置为 1.3 s UGCEventSystem.SetTimer(self, function() self:InitPawn(); end, 1); self.EquipWeaponComplete:Add(self.OnPlayerEquipWeapon, self) self.UnequipWeaponComplete:Add(self.OnPlayerUnequipWeapon, self) self.OnCharacterShootDelegate:Add(self.OnCharacterShoot, self) if IsClient then self.ScopeInComplete:Add(self.OnOpenScope, self) self.OnScopeOutDelegate:Add(self.OnOutScope, self) end self.CachedGravity = self.STCharacterMovement.GravityScale; self.BaseJumpZVelocity = UGCPawnAttrSystem.GetJumpZVelocity(self); self.BaseSpeedScale = UGCPawnAttrSystem.GetSpeedScale(self); if IsClient then UGCEventSystem.SetTimer(self, function() if self.PlayerKey ~= LocalPlayerKey then STExtraBlueprintFunctionLibrary.EnablePlayerAvatarOutline(self, true); UGCGameSystem.GameState:RegisterPostProcessMgr(self); end end, 1); end self.OnPlayerPickUp:Add(self.AfterPlayerPickUp, self) local BackComp = UGCBackPackSystem.GetBackpackComponent(self) if BackComp then BackComp.ItemUpdatedDelegate:Add(self.OnItemUpdate, self) end self.OnCharacterSignalHPChange:Add(self.OnPawnSignalHPChanged, self); end --function UGCPlayerPawn:ReceiveTick(DeltaTime) -- self.SuperClass.ReceiveTick(self, DeltaTime); --end function UGCPlayerPawn:ReceiveEndPlay() self.SuperClass.ReceiveEndPlay(self); if IsClient then self.ScopeInComplete:Remove(self.OnOpenScope, self) self.OnScopeOutDelegate:Remove(self.OnOutScope, self) end self.EquipWeaponComplete:Remove(self.OnPlayerEquipWeapon, self) self.UnequipWeaponComplete:Remove(self.OnPlayerUnequipWeapon, self) if GlobalTickTool then GlobalTickTool:RemoveTick(self) end if self.PickupManagerComponentRef then self.PickupManagerComponentRef.OnPickUpTarger:Remove(self.OnPickUpItem, self); end self.OnPlayerPickUp:Remove(self.AfterPlayerPickUp, self) end function UGCPlayerPawn:GetReplicatedProperties() return "CachedBodySize" , "CachedGravity" , "Armor" , "Maho" , "MaxMaho" , "PoisonScale" , "DamageScaleValue" end function UGCPlayerPawn:GetAvailableServerRPCs() return "OnPickUpItem" , "AfterPlayerPickUp" , "ReplacePartId" , "ApplySkill" , "OnPlayerShoot" , "OnWeaponBulletHit" end function UGCPlayerPawn:ReceivePossessed(NewController) self.SuperClass.ReceivePossessed(self, NewController); PluginManager:OnPlayerPossessed(self, NewController); end function UGCPlayerPawn:InitPawn() if IsServer then self:EnablePickUp(DefaultSettings.EnableAutoPickUp); -----@type PlayerKDAItem1 --self:AddInitItems(); --self:TestPawn(); else self:SetCurrentCamera(self.Camera, self.CustomSpringArm); end end ---@return bool 是否开启掉落盒子 function UGCPlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater) return true; end ----------------------------------------- Camera ----------------------------------------- ---获取当前正在使用的 Camera ---@return UCameraComponent function UGCPlayerPawn:GetCamera() return self.CurrentCamera; end ---@return USpringArmComponent function UGCPlayerPawn:GetCurrentSpringArm() if self.CurrentSpringArm == nil then return self.CustomSpringArm; end return self.CurrentSpringArm; end ---@param InCamera UCameraComponent ---@param InArm USpringArmComponent function UGCPlayerPawn:SetCurrentCamera(InCamera, InArm) self.CurrentCamera = InCamera; self.CurrentSpringArm = InArm; end function UGCPlayerPawn:OnOpenScope() UGCLogSystem.Log("[UGCPlayerPawn:OnOpenScope] 开镜!") end function UGCPlayerPawn:OnOutScope(bIsBegin) UGCLogSystem.Log("[UGCPlayerPawn:OnOutScope] 关镜 bIsBegin = %s", tostring(bIsBegin)) end ----------------------------------------- 玩家伤害处理 ----------------------------------------- function UGCPlayerPawn:PreInstigatedDamage(DamageAmount, DamageEvent, DamageCauser, Victim) UGCLogSystem.Log("[UGCPlayerPawn:PreInstigatedDamage] DamageAmount = %f", DamageAmount); return DamageAmount; end ---@param Damage float ---@param DamageType EDamageType ---@param Causer AActor function UGCPlayerPawn:ClientReceiveDamage(Damage, DamageType, EventInstigator, Causer) end --- 应用毒圈伤害 function UGCPlayerPawn:ApplyPoisonDamage(InDamage) -- 检查体型是否已经很大 return InDamage; end UGCPlayerPawn.LastTakeDamageLocation = nil; --- 服务器/客户端收到伤害数据 ---@param Damage float ---@param DamageType UDamageType ---@param InstigatedBy UGCPlayerController_C ---@param DamageCauser AActor function UGCPlayerPawn:BPReceiveDamage(Damage, DamageType, InstigatedBy, DamageCauser) PluginManager:BPReceiveDamage(self, Damage, DamageType, InstigatedBy, DamageCauser); PlayerDamageLocation[self.PlayerKey] = VectorHelper.ToLuaTable(self:K2_GetActorLocation()); if Damage > 0 then UGCEventSystem.SendEvent(EventTypes.PlayerInjury, self.PlayerKey, UE.IsValid(InstigatedBy) and InstigatedBy.PlayerKey or nil, Damage) end if DamageType == EDamageType.PoisonDamage then UGCEventSystem.SendEvent(EventTypes.PlayerPoisonDamage, self.PlayerKey, Damage); end end --- 当击杀其他玩家的时候 ---@param InVictimPlayerKey PlayerKey function UGCPlayerPawn:OnKillOther(InVictimPlayerKey) -- 让玩家体型增大 if self:IsAlive() then --self:AddBuff("ApplyKillChange", nil, 1, nil, nil); else end end --- 武器攻击到什么东西的时候 ---@param ShootWeapon ASTExtraShootWeapon ---@param Bullet ASTExtraShootWeaponBulletBase ---@param HitInfo FHitResult function UGCPlayerPawn:UGC_WeaponBulletHitEvent(ShootWeapon, Bullet, HitInfo) PluginManager:OnWeaponBulletHit(self, ShootWeapon, Bullet, HitInfo); --GameState.MiniGameManager:OnWeaponBulletHit(self, ShootWeapon, Bullet, HitInfo); self.SuperClass.UGC_WeaponBulletHitEvent(self, ShootWeapon, Bullet, HitInfo); end ---@param ShootWeapon ASTExtraShootWeapon ---@param Bullet ASTExtraShootWeaponBulletBase function UGCPlayerPawn:UGC_WeaponShootBulletEvent(ShootWeapon, Bullet) self.SuperClass.UGC_WeaponShootBulletEvent(self, ShootWeapon, Bullet); UGCLogSystem.Log("[UGCPlayerPawn:UGC_WeaponShootBulletEvent] 执行") -- 发送 RPC UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "OnPlayerShoot", ShootWeapon, Bullet:GetShootID()); self:OnPlayerShoot(ShootWeapon, Bullet:GetShootID()); end function UGCPlayerPawn:OnPlayerShoot(ShootWeapon, BulletID) PluginManager:OnPlayerShoot(self, ShootWeapon, BulletID); --GameState.MiniGameManager:OnPlayerShoot(self, ShootWeapon, BulletID); end ----------------------------------------- Benefit ----------------------------------------- ---@param InVal float function UGCPlayerPawn:SetMaxHealth(InVal) --UGCLogSystem.Log("[UGCPlayerPawn:SetMaxHealth] 执行 InVal = %f", InVal) if InVal > 20 then InVal = InVal / 100; end local CurrMax = UGCPawnAttrSystem.GetHealthMax(self); local NextMax = InVal * 100; if CurrMax == NextMax then return ; end local Health = UGCPawnAttrSystem.GetHealth(self) local NextHealth = NextMax / CurrMax * Health; UGCPawnAttrSystem.SetHealthMax(self, NextMax); UGCPawnAttrSystem.SetHealth(self, NextHealth); end ---@param InVal float function UGCPlayerPawn:AddHealthMax(InVal) self:SetMaxHealth(UGCPawnAttrSystem.GetHealthMax(self) + InVal); end ---@param InVal float 增长的百分比 ---@param InLimit float 限制的百分比 function UGCPlayerPawn:AddLimitHealth(InVal, InLimit) local HealthMax = UGCPawnAttrSystem.GetHealthMax(self); local Health = UGCPawnAttrSystem.GetHealth(self); local Rate = Health / HealthMax; local UseSuccess = false; if Rate < InLimit then UGCPawnAttrSystem.SetHealth(self, math.min(InLimit * HealthMax)) UseSuccess = true; end return UseSuccess; end function UGCPlayerPawn:OnRep_CachedGravity() if self.CachedGravity ~= 0 then return ; end self.STCharacterMovement.GravityScale = self.CachedGravity; end ---@type bool 是否是满血 function UGCPlayerPawn:IsFullHealth() return UGCPawnAttrSystem.GetHealth(self) == UGCPawnAttrSystem.GetHealthMax(self) end UGCPlayerPawn.CachedBodySize = 1; --- 改变体型,会有问题 function UGCPlayerPawn:ChangeBody(InVal) UGCLogSystem.Log("[UGCPlayerPawn:ChangeBody] InVal = %s", tostring(InVal)) if IsServer then if self:GetActorScale3D().X == InVal then return ; end self.CachedBodySize = InVal; self:SetActorScale3D(VectorHelper.MakeVector1(InVal)); end end function UGCPlayerPawn:OnRep_CachedBodySize() if UGCLogSystem then UGCLogSystem.Log("[UGCPlayerPawn:OnRep_CachedBodySize] CachedBodySize = %s, self.PlayerKey = %d", tostring(self.CachedBodySize), self.PlayerKey); end if self.CachedBodySize ~= nil then self:ClientChangeBody(self.CachedBodySize); else end end function UGCPlayerPawn:ClientChangeBody(InVal) if UGCLogSystem then UGCLogSystem.Log("[UGCPlayerPawn:ClientChangeBody] InVal = %f", InVal) end self:SetActorScale3D({ X = InVal, Y = InVal, Z = InVal, }); --UGCLogSystem.Log("[UGCPlayerPawn:ClientChangeBody] self.BaseTargetOffset = %s", tostring(self.BaseTargetOffset)) self:GetCurrentSpringArm().TargetOffset = { X = self.BaseTargetOffset.X * InVal, Y = self.BaseTargetOffset.Y * InVal, Z = self.BaseTargetOffset.Z * InVal }; self:GetCurrentSpringArm().TargetArmLength = self.BaseTargetArmLength * InVal; end --- 添加能量 function UGCPlayerPawn:AddEnergy(InVal) self:SetEnergy(self:GetEnergyCurrent() + InVal); end --- 设置能量 function UGCPlayerPawn:SetEnergy(InVal) self:SetCharacterEnergy(InVal); end --- 清空能量 function UGCPlayerPawn:ClearEnergy() self:SetCharacterEnergy(0.); end -------------------------------- 玩家物品处理 -------------------------------- --- 添加物品,如果是要添加武器,可以在后面的选项进行配置,可添加选项为 是否需要添加对应的配件 武器无限子弹配置 EFillBulletType (bool&EFillBulletType | EFillBulletType) ---@param InItemId int32 ---@param InItemCount int32 function UGCPlayerPawn:AddItem(InItemId, InItemCount, ...) UGCLogSystem.Log("[UGCPlayerPawn:AddItem] InItemId = %d", InItemId); ItemTool.AddItem(self, InItemId, InItemCount, ...); end --- 清空所有物品 function UGCPlayerPawn:ClearItems() ItemTool.ClearAllWeaponsAndProp(self, true, true, true, true, true); end function UGCPlayerPawn:Test_RemoveAttachment() ItemTool.ClearCurrentWeapon(self, true); end --- 添加初始物品 function UGCPlayerPawn:AddInitItems(Weapons) if table.isEmpty(Weapons) then Weapons = DefaultSettings.PlayerInitEquipment end if not table.isEmpty(Weapons) then for i, v in pairs(Weapons) do local ItemId = -1; if type(v[1]) == 'string' then local Item = EnglishNamedWeapon[v[1]] if Item == nil then ItemId = ItemNameTable[v[1]] == nil and ItemId or ItemNameTable[v[1]] else ItemId = Item.ItemId; end elseif type(v[1]) == 'number' then ItemId = v[1]; end local Params = {}; if #v > 1 then for c = 2, #v do Params[#Params + 1] = v[c]; end end UGCLogSystem.LogTree(string.format("[UGCPlayerPawn:AddInitItems] First = %s, Params =", v[1]), Params) if ItemId ~= -1 then self:AddItem(ItemId, table.unpackTable(Params)); end end end end --- 从列表中添加几个 function UGCPlayerPawn:AddRandomItems(Weapons, Count) local AddTable = {}; local Keys = {}; for i, v in pairs(Weapons) do table.insert(Keys, i); end Count = Count > #Keys and #Keys or Count; for i = 1, Count do local RemoveIndex = math.random(#Keys); local Key = Keys[RemoveIndex] table.insert(AddTable, Weapons[Key]); table.remove(Keys, RemoveIndex); end self:AddInitItems(AddTable); end ---@return EFillBulletType function UGCPlayerPawn:GetInfiniteType() local Type = self.PlayerState:GetInfiniteType(); UGCLogSystem.Log("[UGCPlayerPawn:GetInfiniteType] Type = %s", tostring(Type)) return Type end ---@param InType EFillBulletType function UGCPlayerPawn:SetInfiniteType(InType) UGCLogSystem.Log("[UGCPlayerPawn:SetInfiniteType] 执行 InType = %s", tostring(InType)) self.PlayerState:SetInfiniteType(InType); end --- 换弹 function UGCPlayerPawn:WeaponReload() ItemTool.Reload(self, false) end function UGCPlayerPawn:SetPlayerPickUpEnable(IsEnable) -- 检查默认选项 UGCLogSystem.Log("[UGCPlayerPawn:SetPlayerPickUpEnable] DefaultSettings.EnableAutoPickUp = %s", tostring(DefaultSettings.EnableAutoPickUp)); self:EnablePickUp(IsEnable); end --- ---@param slot ESurviveWeaponPropSlot ---@overload fun(slot:ESurviveWeaponPropSlot) OnEquipWeapon function UGCPlayerPawn:OnEquipWeapon(slot) UGCLogSystem.Log("[UGCPlayerPawn:OnEquipWeapon] slot = %s, ESurviveWeaponPropSlot.SWPS_HandProp = %d", tostring(slot), ESurviveWeaponPropSlot.SWPS_HandProp); if slot == ESurviveWeaponPropSlot.SWPS_HandProp then UGCLogSystem.Log("[UGCPlayerPawn:OnEquipWeapon] 切换成拳头") end local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(self, slot); UGCEventSystem.SendEvent(EventTypes.PlayerChangeWeapon, self, slot, Weapon); end function UGCPlayerPawn:OnWeaponEquipAttachment(AttachmentID) UGCLogSystem.Log("[UGCPlayerPawn:OnWeaponEquipAttachment] Attachment ID = %d", AttachmentID); end --- 当玩家拾取之后调用,这个是无论是怎么添加都会走,但是客户端只会走添加的 function UGCPlayerPawn:UGC_PlayerPickUpEvent() UGCLogSystem.Log("[UGCPlayerPawn:UGC_PlayerPickUpEvent] 执行") local Comp = UGCBackPackSystem.GetBackpackComponent(self) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(self, v); if Weapon then local ItemId = Weapon:GetWeaponItemID() -- 查看之前是否有过 end end end function UGCPlayerPawn:OnPostEquipOrUnEquipWeapon(Weapon, bEquip) UGCLogSystem.Log("[UGCPlayerPawn:OnPostEquipOrUnEquipWeapon] 执行") if bEquip then UGCLogSystem.Log("[UGCPlayerPawn:OnPostEquipOrUnEquipWeapon] 玩家装备上 %s", UE.GetName(Weapon)); end end --- 玩家 ---@overload fun() OnUnEquipWeapon function UGCPlayerPawn:OnUnEquipWeapon() UGCLogSystem.Log("[UGCPlayerPawn:OnUnEquipWeapon] 玩家收起武器"); --GameState:ClearWrappers(); local Weapon = UGCWeaponManagerSystem.GetLastUsedWeapon(self) if Weapon then end end --- 当玩家获取武器之后执行 ---@param Weapon ASTExtraWeapon function UGCPlayerPawn:OnPostGetWeapon(Weapon) PluginManager:OnPlayerGetWeapon(self, Weapon) -- 补满子弹 ItemTool.FillAllWeaponBullets(self); UGCEventSystem.SetTimer(self, function() ItemTool.FillAllWeaponBullets(self); end, 2); end --- 替换配件 ---@param InPartId int32 ---@param InType EWeaponPartType function UGCPlayerPawn:ReplacePartId(InPartId, InType) UGCLogSystem.Log("[UGCPlayerPawn:ReplacePartId] 替换 InPartId = %d", InPartId); -- 移除当前 local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(self); if Weapon == nil then return ; end if not ItemTool.IsShootWeapon(Weapon) then return ; end local DefineID = ItemTool.GetDefineIDBySocketType(Weapon, ItemTool.GetWeaponAttachmentSocketType(InType)); if DefineID then UGCBackPackSystem.DropItemByInstanceID(self, DefineID.InstanceID, 1, true); end if InPartId ~= 0 then ItemTool.AddItem(self, InPartId, 1) end local PS = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey); table.func(PS, "UpdateWeaponAttachment", self, Weapon); end ----------------------------------------- 玩家拾取 ----------------------------------------- ---@type BP_CustomItemBase_C UGCPlayerPawn.InPickSceneObj_Weapon = nil; UGCPlayerPawn.IsPickUping = false; --- 这个的作用是通过绑定 PickUpTarger 用的 function UGCPlayerPawn:SetInPickUp(InPick, InSceneObj) UGCLogSystem.Log("[UGCPlayerPawn:SetInPickUp] InPick = %s", tostring(InPick)) self.InPickSceneObj_Weapon = InPick and InSceneObj or nil; self.IsPickUping = InPick; end --- 开始拾取的回调 ---@param Target APickUpWrapperActor function UGCPlayerPawn:OnPickUpItem(Target) if IsServer then ---@type BP_WeaponItem_C local Owner = Target:GetOwner() if Owner ~= nil then self:SetInPickUp(true, Owner); if Target ~= nil then UGCLogSystem.Log("[UGCPlayerPawn:OnPickUpItem] Owner = %s, Wrapper Id = %d", UE.GetName(Owner), Target.DefineID.TypeSpecificID); end Owner:OnAutoItemUsed(self, Target == nil and nil or Target.DefineID.TypeSpecificID); end else UGCLogSystem.Log("[UGCPlayerPawn:OnPickUpItem] Target = %s", UE.GetName(Target)); -- 发送到服务器 UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "OnPickUpItem", Target); end end -- 这是拾取物品之后调用的了,因此需要清空地面 function UGCPlayerPawn:AfterPlayerPickUp(SelfRef) UGCLogSystem.Log("[UGCPlayerPawn:AfterPlayerPickUp] 拾取之后执行") if IsServer then else UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "AfterPlayerPickUp"); end end -------------------------------- 玩家技能 -------------------------------- --- 添加 Buff ---@param InIndex EBuffType ---@param InPlayerKey PlayerKey function UGCPlayerPawn:ApplyBuff(InIndex, InPlayerKey) if IsServer then if type(InIndex) == 'string' then self:AddBuff(InIndex, nil, 1, nil, nil); UGCLogSystem.Log("[UGCPlayerPawn:ApplyBuff] 执行 InIndex = %s", InIndex) UnrealNetwork.CallUnrealRPC_Multicast(self, "ApplyBuff", BuffTable.EBuffType[InIndex], self.PlayerKey); elseif type(InIndex) == 'number' then self:ApplyBuff(BuffTable.GetBuffName(InIndex)); UGCLogSystem.Log("[UGCPlayerPawn:ApplyBuff] 执行 InIndex = %d", InIndex) UnrealNetwork.CallUnrealRPC_Multicast(self, "ApplyBuff", InIndex, self.PlayerKey); end else if UGCPlayerStateSystem.GetTeamID(InPlayerKey) == LocalTeamId then local Name = UE.GetAccountInfo(InPlayerKey).PlayerName; local BuffName = BuffTable.GetBuffName(InIndex); UITool.ShowTips("%s 获取了 Buff: %s", Name, BuffName); end end end function UGCPlayerPawn:ApplySkill(InSkillId, ...) if IsServer then GameState:AddSkill(InSkillId, self.PlayerKey, ...) else UnrealNetwork.CallUnrealRPC(LocalPlayerController, self, "ApplySkill", InSkillId, ...); end end --- 受到炸弹伤害,击退玩家 function UGCPlayerPawn:EnableInvincible(Enable) self:SetInvincible(Enable) end function UGCPlayerPawn:GetEnableInvincible() return self.bInvincible; end --- 玩家眩晕 ---@param IsOpen bool 是否开启 function UGCPlayerPawn:Stun(IsOpen) self:UseSkill(SkillTable.ESkillType.Stun) end function UGCPlayerPawn:UseSkill(InSkillId) local SkillMgr = self:GetSkillManagerComponent(); SkillMgr:TriggerEvent(InSkillId, UTSkillEventType.SET_KEY_DOWN) end function UGCPlayerPawn:StopSkill(InSkillId) local SkillMgr = self:GetSkillManagerComponent() SkillMgr:StopSkillWithID(InSkillId, UTSkillStopReason.SkillStopReason_Interrupted); end --- 玩家被击退 function UGCPlayerPawn:Repulse(InNum) --- LaunchVelocity:FVector,bXYOverride:bool,bZOverride:bool local Vec = VectorHelper.MulNumber(self:GetActorForwardVector(), InNum) --VectorHelper.Add(Vec, VectorHelper.MakeVector(0, 0, 200)); self.CharacterMovement.MovementMode = EMovementMode.MOVE_Falling; self.CharacterMovement.Velocity = VectorHelper.MakeVector(self.CharacterMovement.Velocity.X, self.CharacterMovement.Velocity.Y, 2000); self:Jump(); self:LaunchCharacter(Vec, true, true); end function UGCPlayerPawn:TransShape(InKey) if self.ShapeTransformation then if InKey == nil then self.ShapeTransformation:TransformBackToHuman(); else UGCLogSystem.Log("[UGCPlayerPawn:TransShape] InKey = %s", tostring(InKey)) self.ShapeTransformation:TransformToRandomShape(); end end end -------------------------------- 属性 -------------------------------- function UGCPlayerPawn:AddDamageScale(InVal) self.DamageScaleValue = self.DamageScaleValue + InVal; end --- 设置伤害大小 function UGCPlayerPawn:SetDamageScale(InVal) self.DamageScaleValue = InVal; end --- 获取受到毒伤害的改变函数 function UGCPlayerPawn:SetPoisonScale(InVal) self.PoisonScale = InVal; end --- 获取伤害大小 function UGCPlayerPawn:GetDamageScale() return self.DamageScaleValue; end ---@param InVal float 接收到的伤害 ---@return float 经过护甲削弱之后的伤害 function UGCPlayerPawn:HandleDamage(InVal) return InVal / (1 + self.Armor); end ---@param InArmor float function UGCPlayerPawn:SetArmor(InArmor) if InArmor < 0 then InArmor = 0; end self.Armor = InArmor; DOREPONCE(self, "Armor") end function UGCPlayerPawn:OnPawnSignalHPChanged(InCurrSignalHP, InPrev) UGCLogSystem.Log("[UGCPlayerPawn:OnPawnSignalHPChanged] CurrSignalHP = %f, PrevSignalHP = %f", InCurrSignalHP, InPrev); if InCurrSignalHP < InPrev and self.PoisonScale > 0 then -- 说明当前是在减少 local Diff = InPrev - InCurrSignalHP; if Diff > 0 then local Add = (Diff * (self.PoisonScale - 1)) / (1 + self.PoisonScale) self:AddSignalHPSafety(Add); -- 再次添加 end end end -------------------------------- 测试 -------------------------------- function UGCPlayerPawn:TestPawn() --self:TransShape(); end function UGCPlayerPawn:ClearAllAttachments() UGCLogSystem.Log("[UGCPlayerPawn:ClearAllAttachments] 执行") local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(self) if Weapon then local PartList = Weapon:GetAvailableWeaponAttachmentSocketTypeList(); local Parts = UE.ToTable(PartList); table.printTable(Parts); end end function UGCPlayerPawn:Test_AddRangeParts() ItemTool.AddRangeItems(self, 202001, 202100); -- 获取当前武器 local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(self); local DefineID = ItemTool.GetDefineIDBySocketType(Weapon, ItemTool.GetWeaponAttachmentSocketType(EWeaponPartType.Magazine)); UGCLogSystem.Log("[UGCPlayerPawn:Test_AddRangeParts] DefineID = %d", DefineID.TypeSpecificID); end function UGCPlayerPawn:Test_LogCurrWeaponAttachment() local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(self); local Table = ItemTool.GetWeaponParts(Weapon); UGCLogSystem.LogTree(string.format("[UGCPlayerPawn:Test_LogCurrWeaponAttachment] Table ="), Table) end function UGCPlayerPawn:OnCharacterShoot(Weapon) UGCLogSystem.Log("[UGCPlayerPawn:OnCharacterShoot] Weapon:%s 发射子弹", UE.GetName(Weapon)); end return UGCPlayerPawn;