659 lines
23 KiB
Lua
659 lines
23 KiB
Lua
|
---@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;
|