159 lines
7.5 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---
--- 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 = 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
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