659 lines
23 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 = {};
---@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;