2025-01-04 23:00:19 +08:00

129 lines
5.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
--- 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()
if UGCGameSystem.IsServer() then
--- 洗牌梯度列表
WeaponGradientManager.WeaponGradient = table.DeepCopy(WeaponGradientTable.Gradient)
table.Shuffle(WeaponGradientManager.WeaponGradient)
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 = WeaponTable.RecommendedWeaponParts[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
if UGCSystemLibrary.GetItemTypeID(ItemInfo.ItemID) < 300 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)
for k, ShootWeaponEnum in pairs(ShootWeaponEnums) do
local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(PlayerPawn, ShootWeaponEnum)
if UE.IsValid(Weapon) then
UGCGunSystem.SetMaxBulletNumInOneClip(Weapon, 1000)
end
end
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
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