159 lines
7.5 KiB
Lua
159 lines
7.5 KiB
Lua
---
|
||
--- Generated by EmmyLua(https://github.com/EmmyLua)
|
||
--- Created by LT.
|
||
--- DateTime: 2023/12/3 16:48
|
||
---
|
||
|
||
WeaponGradientManager = WeaponGradientManager or {}
|
||
|
||
--- 武器梯度
|
||
WeaponGradientManager.WeaponGradient = {}
|
||
--- 玩家等级 PlayerKey = Grade:uint
|
||
WeaponGradientManager.PlayerGrade = {}
|
||
--- 玩家梯度索引 PlayerKey = GradientIndex:uint
|
||
WeaponGradientManager.PlayerGradientIndex = {}
|
||
--- 玩家更新武器梯度的时间句柄 PlayerKey = TimeHandle
|
||
WeaponGradientManager.UpdateWeaponMatchingHandle = {}
|
||
|
||
|
||
function WeaponGradientManager.Init(InGradient)
|
||
if UGCGameSystem.IsServer() then
|
||
--- 洗牌梯度列表
|
||
if InGradient == nil then
|
||
WeaponGradientManager.WeaponGradient = table.DeepCopy(WeaponGradientTable.Gradient)
|
||
else
|
||
WeaponGradientManager.WeaponGradient = table.DeepCopy(InGradient)
|
||
end
|
||
UGCLogSystem.LogTree("[WeaponGradientManager_Init] WeaponGradient:", WeaponGradientManager.WeaponGradient)
|
||
table.Shuffle(WeaponGradientManager.WeaponGradient)
|
||
WeaponGradientManager.PlayerGradientIndex = {}
|
||
end
|
||
end
|
||
|
||
|
||
|
||
--- 更新玩家武器搭配
|
||
function WeaponGradientManager.UpdatePlayerGradientWeaponMatching(PlayerKey, NewGrade, IgnoreWeaponIDs)
|
||
if IgnoreWeaponIDs == nil then
|
||
IgnoreWeaponIDs = {}
|
||
elseif type(IgnoreWeaponIDs) ~= "table" then
|
||
IgnoreWeaponIDs = {IgnoreWeaponIDs, }
|
||
end
|
||
|
||
local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey)
|
||
if PlayerPawn == nil then
|
||
UGCLogSystem.LogError("[WeaponGradientManager_UpdatePlayerGradientWeaponMatching] Player[%s] is nil or Dead 1,Grade:%s", tostring(PlayerKey), tostring(NewGrade))
|
||
return
|
||
end
|
||
local PlayerGradient = WeaponGradientManager.GetPlayerGradient(PlayerKey)
|
||
|
||
if PlayerGradient == nil then
|
||
UGCLogSystem.LogError("[WeaponGradientManager_UpdatePlayerGradientWeaponMatching] Player[%s], PlayerGradient[NewGrade] is nil ", tostring(PlayerKey), tostring(NewGrade))
|
||
return
|
||
end
|
||
|
||
--- 新的武器ID及配件ID
|
||
local NewWeaponID = PlayerGradient[NewGrade]
|
||
if NewWeaponID == nil then
|
||
UGCLogSystem.LogError("[WeaponGradientManager_UpdatePlayerGradientWeaponMatching] NewGrade 错误 Player[%s], PlayerGradient[%s] is nil ", tostring(PlayerKey), tostring(NewGrade))
|
||
return
|
||
end
|
||
local PartIDs = MyWeaponSystem.GetWeaponBastParts(NewWeaponID)
|
||
|
||
--- 验证玩家当前背包武器及配件是否需要销毁
|
||
---@return ItemDataList LuaTable @LuaTable<ItemData>, ItemData结构:ItemID,InstanceID,Count,Type,SubType,IsAvatar
|
||
local AllItems = UGCBackPackSystem.GetAllItemData(PlayerPawn)
|
||
for i, ItemInfo in pairs(AllItems) do
|
||
local TypeID = UGCSystemLibrary.GetItemTypeID(ItemInfo.ItemID)
|
||
if TypeID < 300 and TypeID > 100 then
|
||
if not table.hasValue(PartIDs, ItemInfo.ItemID) and ItemInfo.ItemID ~= NewWeaponID and not table.hasValue(IgnoreWeaponIDs, ItemInfo.ItemID) then
|
||
--- 销毁背包中的物品
|
||
UGCBackPackSystem.DropItem(PlayerPawn, ItemInfo.ItemID, ItemInfo.Count, true)
|
||
end
|
||
end
|
||
end
|
||
|
||
--- 隔帧给玩家赋予武器及配件
|
||
if WeaponGradientManager.UpdateWeaponMatchingHandle[PlayerKey] then
|
||
UGCEventSystem.StopTimer(WeaponGradientManager.UpdateWeaponMatchingHandle[PlayerKey])
|
||
WeaponGradientManager.UpdateWeaponMatchingHandle[PlayerKey] = nil
|
||
end
|
||
WeaponGradientManager.UpdateWeaponMatchingHandle[PlayerKey] = UGCEventSystem.SetTimer(UGCGameSystem.GameState,
|
||
function()
|
||
WeaponGradientManager.UpdateWeaponMatchingHandle[PlayerKey] = nil
|
||
if UE.IsValid(PlayerPawn) then
|
||
--if NewWeaponID > 0 and UGCBackPackSystem.GetItemCount(PlayerPawn, NewWeaponID) == 0 then
|
||
-- UGCBackPackSystem.AddItem(PlayerPawn, NewWeaponID, 1)
|
||
-- --UGCSystemLibrary.AddItem(PlayerPawn, NewWeaponID, 1)
|
||
--end
|
||
local bGiveWeapon = false
|
||
if NewWeaponID > 0 and UGCBackPackSystem.GetItemCount(PlayerPawn, NewWeaponID) == 0 then
|
||
UGCBackPackSystem.AddItem(PlayerPawn, NewWeaponID, 1)
|
||
-- 玩家离开换弹状态
|
||
UGCPawnSystem.LeavePawnState(PlayerPawn, EPawnState.Roload)
|
||
bGiveWeapon = true
|
||
end
|
||
if PartIDs then
|
||
PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey)
|
||
if PlayerPawn == nil then
|
||
UGCLogSystem.LogError("[WeaponGradientManager_UpdatePlayerGradientWeaponMatching] Player[%s] is nil or Dead 2,Grade:%s", tostring(PlayerKey), tostring(NewGrade))
|
||
return
|
||
end
|
||
for i, PartID in pairs(PartIDs) do
|
||
if UGCBackPackSystem.GetItemCount(PlayerPawn, PartID) == 0 then
|
||
UGCBackPackSystem.AddItem(PlayerPawn, PartID, 1)
|
||
--UGCSystemLibrary.AddItem(PlayerPawn, PartID, 1)
|
||
end
|
||
end
|
||
end
|
||
if bGiveWeapon then
|
||
UGCEventSystem.SetTimer(PlayerPawn, function()
|
||
for i, v in pairs(ShootWeaponEnums) do
|
||
local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(PlayerPawn, v)
|
||
if UE.IsValid(Weapon) then
|
||
UGCGunSystem.EnableClipInfiniteBullets(Weapon, true)
|
||
local MaxBulletNumInOneClip = UGCGunSystem.GetMaxBulletNumInOneClip(Weapon)
|
||
Weapon:SetCurrentBulletNumInClipOnServer(MaxBulletNumInOneClip, true)
|
||
-- 玩家离开换弹状态
|
||
if UE.IsValid(PlayerPawn) then
|
||
UGCPawnSystem.LeavePawnState(PlayerPawn, EPawnState.Roload)
|
||
end
|
||
end
|
||
end
|
||
end,
|
||
1.
|
||
)
|
||
-- local NowWeapon = UGCWeaponManagerSystem.GetCurrentWeapon(PlayerPawn)
|
||
-- UGCGunSystem.Roload(PlayerPawn)
|
||
-- UGCLogSystem.Log("[WeaponGradientManager_UpdatePlayerGradientWeaponMatching]NowWeapon:%s", KismetSystemLibrary.GetObjectName(NowWeapon))
|
||
end
|
||
|
||
end
|
||
end,
|
||
0.1
|
||
)
|
||
end
|
||
|
||
--- 获取玩家当前武器梯度,若玩家没有设置梯度则自动随机获取一个
|
||
---@param PlayerKey uint
|
||
---@return PlayerGradient table WeaponIDs
|
||
function WeaponGradientManager.GetPlayerGradient(PlayerKey)
|
||
if WeaponGradientManager.PlayerGradientIndex[PlayerKey] == nil then
|
||
local GradientIndex = math.random(1, #WeaponGradientManager.WeaponGradient)
|
||
WeaponGradientManager.PlayerGradientIndex[PlayerKey] = GradientIndex
|
||
end
|
||
return WeaponGradientManager.WeaponGradient[WeaponGradientManager.PlayerGradientIndex[PlayerKey]]
|
||
end
|
||
|
||
|
||
|
||
--- 更新玩家下一个武器梯度,返回玩家梯度
|
||
---@param PlayerKey uint
|
||
---@return PlayerGradient table WeaponIDs
|
||
function WeaponGradientManager.UpdatePlayerNextGradient(PlayerKey)
|
||
WeaponGradientManager.PlayerGradientIndex[PlayerKey] = (WeaponGradientManager.PlayerGradientIndex[PlayerKey] % #WeaponGradientManager.WeaponGradient) + 1
|
||
return WeaponGradientManager.GetPlayerGradient(PlayerKey)
|
||
end
|
||
|
||
|
||
return WeaponGradientManager |