--- --- 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结构: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