ItemTool = {}; ----------------------------------- 武器 ----------------------------------- --- 设置玩家所有武器槽武器的子弹属性 ---@param InPawn UGCPlayerPawn_C 玩家 ---@param InfiniteType EFillBulletType 无限子弹类型 ---@param IsEnable bool 是否设置 function ItemTool.SetAllWeaponInfinite(InPawn, InfiniteType, IsEnable) if IsEnable == nil then IsEnable = true; end for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) ItemTool.SetWeaponInfinite(InPawn, Weapon, InfiniteType, IsEnable); end end ---@param InWeapon ASTExtraShootWeapon 射击武器 ---@param InfiniteType EFillBulletType 武器无限子弹类型 ---@param IsEnable bool 是否开启 function ItemTool.SetWeaponInfinite(InPawn, InWeapon, InfiniteType, IsEnable) if UE.IsValid(InWeapon) and ItemTool.IsShootWeapon(InWeapon) then if InfiniteType == EFillBulletType.Infinite then UGCGunSystem.EnableInfiniteBullets(InWeapon, IsEnable); elseif InfiniteType == EFillBulletType.ClipInfinite then UGCGunSystem.EnableClipInfiniteBullets(InWeapon, IsEnable); elseif InfiniteType == EFillBulletType.Fill then ItemTool.FillWeaponBullet(InPawn, InWeapon); end end end --- 填充玩家身上的所有武器子弹 ---@param InPawn UGCPlayerPawn_C function ItemTool.FillAllWeaponBullets(InPawn) if UE.IsValid(InPawn) then InPawn:SetAllWeaponBulletNumToMaxOnServer(true, false) ItemTool.FillCurrentWeaponBullet(InPawn); end end --- 填充对应武器子弹 ---@param InPawn UGCPlayerPawn_C ---@param InWeapon ASTExtraShootWeapon function ItemTool.FillWeaponBullet(InPawn, InWeapon) InPawn:SetTargetWeaponBulletNumToMaxOnServer(InWeapon, true, false); end function ItemTool.FillCurrentWeaponBullet(InPawn) local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(InPawn); if Weapon and UE.IsValid(Weapon) and ItemTool.IsShootWeapon(Weapon) then local MaxCount = UGCGunSystem.GetMaxBulletNumInOneClip(Weapon); Weapon:SetCurrentBulletNumInClipOnServer(MaxCount, true); end end ---@param InPawn UGCPlayerPawn_C 玩家 ---@param InWeaponId int32 武器 ID ---@param FillBulletType EFillBulletType 无限子弹类型 ---@param IsEnable bool 是否设置 function ItemTool.SetWeaponInfiniteById(InPawn, InWeaponId, FillBulletType, IsEnable) if FillBulletType ~= nil then if FillBulletType <= 3 then -- 获取这个武器 local Weapons = ItemTool.GetWeaponsById(InPawn, InWeaponId); for i, Weapon in pairs(Weapons) do ItemTool.SetWeaponInfinite(InPawn, Weapon, FillBulletType, IsEnable); end else if WeaponAmmoIdMap[InWeaponId] and FillBulletType > 0 then UGCBackPackSystem.AddItem(InPawn, WeaponAmmoIdMap[InWeaponId], FillBulletType); end end end end --- 找到玩家身上的一把枪械或者近战武器这些 ---@param InPawn UGCPlayerPawn_C 玩家 ---@return ASTExtraWeapon function ItemTool.GetPlayerFirstWeapon(InPawn) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v); if UE.IsValid(Weapon) then return Weapon; end end return nil; end ---@param InPawn UGCPlayerPawn_C 玩家 ---@param InWeaponId int32 武器 ID ---@return ASTExtraShootWeapon* 射击武器 function ItemTool.GetWeaponsById(InPawn, InWeaponId) local Weapons = {}; for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v); if UE.IsValid(Weapon) then if Weapon:GetWeaponItemID() == InWeaponId then table.insert(Weapons, Weapon); end end end return Weapons; end ---@param InPawn UGCPlayerPawn_C 玩家 ---@param InWeaponId int32 武器 ID ---@param InCount int32 武器数量 ---@param bAppend bool 是否需要添加配件 ---@param FillBulletType EFillBulletType 是否需要添加子弹 function ItemTool.AddWeaponItem(InPawn, InWeaponId, InCount, bAppend, FillBulletType) if not UE.IsValid(InPawn) then return end local bHadAdd = false; local Times = 10; repeat bHadAdd = UGCBackPackSystem.AddItem(InPawn, InWeaponId, InCount) Times = Times - 1; until bHadAdd or Times <= 0; local Weapon = ItemTool.GetLastWeapon(InPawn, InWeaponId); if not bAppend then return Weapon end -- 获取 Parts ItemTool.SetWeaponParts(Weapon, ItemTool.GetWeaponIdParts(InPawn.PlayerKey, InWeaponId)); ItemTool.SetWeaponInfinite(InPawn, Weapon, EFillBulletType.ClipInfinite, true); ItemTool.SetWeaponInfinite(InPawn, Weapon, EFillBulletType.Fill, true); return Weapon; end function ItemTool.GetWeaponIdParts(PlayerKey, InWeaponId) if WeaponSuits[InWeaponId] == nil then return; end if table.isEmpty(WeaponSuits[InWeaponId][EWeaponPartType.Best]) then return; end local Parts = nil; if ArchiveTable[PlayerKey] and not table.isEmpty(ArchiveTable[PlayerKey].Weapons) then Parts = ArchiveTable[PlayerKey].Weapons[InWeaponId]; end return Parts or WeaponSuits[InWeaponId][EWeaponPartType.Best][1]; end --- 移除玩家身上所有的武器 ---@param InPawn UGCPlayerPawn_C function ItemTool.ClearAllWeapon(InPawn) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v); if Weapon and UE.IsValid(Weapon) then ItemTool.ClearWeapon(InPawn, Weapon); end end end ---@param Weapon ASTExtraWeapon ---@param InPawn UGCPlayerPawn_C ---@return table function ItemTool.GetWeaponPartsDefineIDs(InPawn, Weapon) local BackComp = UGCBackPackSystem.GetBackpackComponent(InPawn); local InstanceIds = {}; local CustomList = {}; for i = 0, 5 do local DefineID = Weapon:GetWeaponAttachmentIDBySocketType(i); if DefineID.bValidInstance and DefineID.bValidItem then InstanceIds[DefineID.InstanceID] = DefineID; CustomList[i] = { TypeSpecificID = DefineID.TypeSpecificID, InstanceID = DefineID.InstanceID, Type = DefineID.Type, }; end end return InstanceIds, CustomList; end ---@param Weapon ASTExtraWeapon ---@param InPawn UGCPlayerPawn_C function ItemTool.ClearWeapon(InPawn, Weapon) return ItemTool.RemoveWeapon(InPawn, Weapon); end --- 获取武器的所有配件 ---@param InWeapon ASTExtraWeapon 武器 ---@return table function ItemTool.GetWeaponParts(InWeapon) local Table = {}; if ItemTool.IsShootWeapon(InWeapon) then local List = UGCGunSystem.GetWeaponAllAttachmentIDList(InWeapon); for i, v in pairs(List) do table.insert(Table, v.TypeSpecificID); end end return Table; end --- 射击武器类 ItemTool.ShootWeaponClass = nil; --- 获取武器基类 ---@return UClass 武器基类 function ItemTool.GetShootWeaponClass() if ItemTool.ShootWeaponClass == nil then ItemTool.ShootWeaponClass = UE.GetClassByName("STExtraShootWeapon"); end return ItemTool.ShootWeaponClass; end --- 是否是射击枪械类 ---@param InWeapon ASTExtraWeapon 武器 ---@return bool 是否是射击枪械类 function ItemTool.IsShootWeapon(InWeapon) if InWeapon == nil then return false end return UE.IsA(InWeapon, ItemTool.GetShootWeaponClass()); end ---@param InPawn UGCPlayerPawn_C ---@param InFunc fun(Weapon:ASTExtraWeapon) function ItemTool.ForeachWeapon(InPawn, InFunc) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v); if UE.IsValid(Weapon) then InFunc(Weapon); end end end ---@param InWeaponId int32 ---@return bool 是否是射击武器 function ItemTool.IsShootWeaponById(InWeaponId) return GetWeaponIdType(InWeaponId) ~= EWeaponIdType.Melee; end ---@param InWeaponId int32 ---@return bool 是否是近战武器 function ItemTool.IsMeleeWeaponById(InWeaponId) return GetWeaponIdType(InWeaponId) == EWeaponIdType.Melee; end ----------------------------------- 普通物品 ----------------------------------- ---@return FItemDefineID function ItemTool.AddItem(InPawn, InItemId, InCount, ...) UGCLogSystem.Log("[ItemTool.AddItem] ItemId = %d, Count = %d", InItemId, InCount); if not ItemUtils.IsUGCItem(InItemId) then return ; end if not UE.IsValidPawn(InPawn) then return ; end ---@type FItemDefineID local ItemDefineID = BackpackUtils.GenerateItemDefineIDByItemTableIDWithRandomInstanceID(InItemId); local ItemInfo = CreateStruct("BattleItemPickupInfo") ItemInfo.bAutoEquip = (2 == ItemDefineID.Type) or (8 == ItemDefineID.Type) ItemInfo.Count = InCount; local BackpackComponent = UGCBackPackSystem.GetBackpackComponent(InPawn); BackpackComponent:RegisterItemGenerated(ItemDefineID.TypeSpecificID, ItemInfo.Count, ItemDefineID.InstanceID) BackpackComponent:PickupItem(ItemDefineID, ItemInfo, EBattleItemPickupReason.Initial) local Params = { ... }; if table.isEmpty(Params) then return ; end -- 添加配件,验证是否有配件 local FillBulletType = nil; if WeaponSuits[InItemId] ~= nil then if type(Params[1]) == 'boolean' and type(Params[2]) == 'number' then local bAppend = Params[1]; FillBulletType = Params[2]; -- 那说明要添加进去 ItemTool.AddWeaponParts(InPawn, ItemDefineID, bAppend); elseif type(Params[1]) == 'int32' then FillBulletType = Params[1]; end end if FillBulletType then local Weapon = ItemTool.GetWeaponByInstanceId(InPawn, ItemDefineID.InstanceID); if Weapon then ItemTool.SetWeaponInfinite(InPawn, Weapon, FillBulletType, true); end end end ---@param ItemDefineID FItemDefineID 武器的属性 function ItemTool.AddWeaponParts(InPawn, ItemDefineID, Count) UGCLogSystem.Log("[ItemTool.AddWeaponParts] 开始添加配件") if not UE.IsValidPawn(InPawn) then return ; end local BackpackComponent = UGCBackPackSystem.GetBackpackComponent(InPawn); -- 添加配件 local BattleItemUseTarget = { TargetDefineID = ItemDefineID, TargetAssociationName = "", FilterTargetWhenPickup = true, }; local WeaponItemId = ItemDefineID.TypeSpecificID; -- 获取玩家是否保存过该武器的配置 local Weapons = ArchiveTable[InPawn.PlayerKey].Weapons local AddSubitems = {}; if Weapons and Weapons[WeaponItemId] then AddSubitems = Weapons[WeaponItemId]; end if table.isEmpty(AddSubitems) then UGCLogSystem.LogTree(string.format("[ItemTool.AddWeaponParts] WeaponSuits[WeaponItemId] ="), WeaponSuits[WeaponItemId]) if WeaponSuits[WeaponItemId] then local TheList = WeaponSuits[WeaponItemId][EWeaponPartType.Best]; if not table.isEmpty(TheList) then AddSubitems = TheList[1]; end end end if not table.isEmpty(AddSubitems) then for i, subItemId in pairs(AddSubitems) do local SubItemDefineID = BackpackUtils.GenerateItemDefineIDByItemTableIDWithRandomInstanceID(subItemId) local EquipPickupInfo = CreateStruct("BattleItemPickupInfo") EquipPickupInfo.Count = 1 EquipPickupInfo.bAutoEquip = (2 == SubItemDefineID.Type) or (8 == SubItemDefineID.Type) EquipPickupInfo.AutoEquipTarget = BattleItemUseTarget BackpackComponent:PickupInitialItem(SubItemDefineID, EquipPickupInfo, true) end end end function ItemTool.HasSameItem(InPawn, InItemId) local AllItems = UGCBackPackSystem.GetAllItemData(InPawn); for i, v in pairs(AllItems) do if v.ItemID == InItemId then return true, v.InstanceID; end end return false, nil; end function ItemTool.GetItemInstanceId(InPawn, InItemId, Last) local AllItems = UGCBackPackSystem.GetAllItemData(InPawn); local InstanceIds = {}; for i, v in pairs(AllItems) do if v.ItemID == InItemId then table.insert(InstanceIds, v.InstanceID) end end if #InstanceIds == 1 then return InstanceIds[1]; end if Last then local InstanceId = -1; for i, v in pairs(InstanceIds) do if v > InstanceId then InstanceId = v; end end return InstanceId; end return InstanceIds[1]; end function ItemTool.GetWeaponItemInstanceId(InPawn, InWeaponId, Last) local InstanceIds = {}; for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) if Weapon then if Weapon:GetWeaponItemID() == InWeaponId then table.insert(InstanceIds, Weapon:GetItemDefineID().InstanceID); end end end if #InstanceIds == 1 then return InstanceIds[1]; end if Last then local InstanceId = -1; for i, v in pairs(InstanceIds) do if v > InstanceId then InstanceId = v; end end return InstanceId; end return InstanceIds[1]; end --- 获取最后获得到的武器 function ItemTool.GetLastWeapon(InPawn, InWeaponId) local WeaponRet = nil; local InstanceId = 0; for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) if Weapon then local TheId = Weapon:GetItemDefineID().InstanceID; local ItemId = Weapon:GetWeaponItemID(); if (InWeaponId == nil) or (InWeaponId == ItemId) then if TheId > InstanceId then InstanceId = TheId; WeaponRet = Weapon; end end end end return WeaponRet; end ----------------------------------- 护甲 ----------------------------------- function ItemTool.ReplaceItem(InPawn, InItemId) local Items = UGCBackPackSystem.GetAllItemData(InPawn) local TheId = GetItemIdType(InItemId) for i, v in pairs(Items) do if GetCustomItemType(v.ItemID) == ECustomItemType.Equipment and GetItemIdType(v.ItemID) == TheId then UGCBackPackSystem.DropItem(InPawn, v.ItemID, v.Count, true); end end UGCBackPackSystem.AddItem(InPawn, InItemId, 1); end ---@param InPawn UGCPlayerPawn_C function ItemTool.RemoveArmorItem(InPawn) local Item = UGCBackPackSystem.GetConsumablesInBackpack(InPawn); for i, v in pairs(Item) do local ItemTable = UE.ToTable(v) UGCLogSystem.LogTree(string.format("[ItemTool.RemoveArmorItem] ItemTable ="), ItemTable) end end ---@param InPawn UGCPlayerPawn_C ---@return table function ItemTool.PawnWeaponSlots(InPawn) local Slots = {}; for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v); if Weapon then table.insert(Slots, v); end end return Slots; end function ItemTool.GetWeaponType(InWeaponId) return InWeaponId // 1000; end function ItemTool.CheckPlayerHasWeapon(InPawn, InWeaponId) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) if Weapon then if Weapon:GetWeaponItemID() == InWeaponId then return true, v; end end end return false, nil; end --- 通过 InstanceID 获取武器实例 function ItemTool.GetWeaponByInstanceId(InPawn, InstanceId) for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) if Weapon then if Weapon:GetItemDefineID().InstanceID == InstanceId then return Weapon; end end end return nil; end function ItemTool.ClearAllItems(InPawn) local Comp = UGCBackPackSystem.GetBackpackComponent(InPawn) Comp:ClearItems(); end function ItemTool.GetAllWeaponPartDefineIDs(InPawn) local Ret = {}; for i, v in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(InPawn, v) if Weapon then local DefineIDs = ItemTool.GetWeaponPartsDefineIDs(InPawn, Weapon); for c, d in pairs(DefineIDs) do Ret[c] = d; end end end return Ret; end ---@param InPawn UGCPlayerPawn_C ---@param InList table ---@param bWeaponParts bool 是否清除武器上的配件 function ItemTool.ClearItemsByCustomItemType(InPawn, InList, bWeaponParts) -- 找到武器上面的 local Items = UGCBackPackSystem.GetAllItemData(InPawn) if InList == nil then InList = { ECustomItemType.Bullet, ECustomItemType.Part, } end local BaiMingDan = {}; if bWeaponParts and table.hasValue(InList, ECustomItemType.Part) then BaiMingDan = ItemTool.GetAllWeaponPartDefineIDs(InPawn); UGCLogSystem.LogTree(string.format("[ItemTool.ClearItemsByCustomItemType] BaiMingDan ="), BaiMingDan) end local Func = function(InType) for i, v in pairs(InList) do if v == InType then return true; end end return false; end for i, v in pairs(Items) do local ItemType = GetCustomItemType(v.ItemID) if Func(ItemType) and BaiMingDan[v.InstanceID] == nil then local bSuccess, Times = false, 10; repeat bSuccess = UGCBackPackSystem.DropItemByInstanceID(InPawn, v.InstanceID, v.Count, true) Times = Times - 1; until bSuccess or Times <= 0; end end end --- 添加所有的握把 function ItemTool.AddAllGrip(InPawn, WithoutList) local WithoutTable = {}; if not table.isEmpty(WithoutList) then for i, v in pairs(WithoutList) do WithoutTable[v] = true; end end for i, v in pairs(WeaponTypeParts[EWeaponPartType.Grip]) do if WithoutTable[v] == nil then ItemTool.AddItem(InPawn, v, 1); end end end --- 添加枪口让玩家装备 function ItemTool.AddAllMuzzle(InPawn, InWeaponId, WithoutList) -- 找到 WeaponSuits if table.isEmpty(WeaponSuits[InWeaponId]) then return ; end local Muzzles = WeaponSuits[InWeaponId][EWeaponPartType.Muzzle] if table.isEmpty(Muzzles) then return ; end local WithoutTable = {}; if not table.isEmpty(WithoutList) then for i, v in pairs(WithoutList) do WithoutTable[v] = true; end end for i, v in pairs(Muzzles) do if WithoutTable[v] == nil then ItemTool.AddItem(InPawn, v, 1); end end end ---@param InWeaponPartType EWeaponPartType ---@return EWeaponAttachmentSocketType function ItemTool.GetWeaponAttachmentSocketType(InWeaponPartType) return WeaponTypeName[InWeaponPartType].WeaponAttachmentSocketType; end ---@param Weapon ASTExtraWeapon ---@param InType EWeaponAttachmentSocketType ---@return FItemDefineID function ItemTool.GetDefineIDBySocketType(Weapon, InType) return UGCGunSystem.GetWeaponAttachmentIDBySocketType(Weapon, InType); end function ItemTool.AddRangeItems(InPawn, Begin, End) for i = Begin, End do if UGCItemSystem.IsUGCItem(i) then local Times = 10; local bSuccess = false; repeat bSuccess = UGCBackPackSystem.AddItem(InPawn, i, 1); until bSuccess or Times <= 0; end end end ---@param InWeapon ASTExtraShootWeapon ---@param PartId int32 function ItemTool.WeaponAddPart(InWeapon, PartId) UGCGunSystem.CreateAndAddGunAttachment(InWeapon, PartId); end -- 设置当前武器配件(直接装上,估计需要验证) function ItemTool.CurrWeaponAddPart(InPawn, InPart) local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(InPawn); if Weapon and ItemTool.IsShootWeapon(Weapon) then UGCGunSystem.CreateAndAddGunAttachment(Weapon, InPart); end end ---@param Weapon ASTExtraShootWeapon ---@return int32[] function ItemTool.GetWeaponPartList(Weapon) local Parts = {}; if Weapon and UE.IsValid(Weapon) and ItemTool.IsShootWeapon(Weapon) then local ItemDefineIDs = UGCGunSystem.GetWeaponAllAttachmentIDList(Weapon); for i, ItemDefineID in pairs(ItemDefineIDs) do if ItemDefineID.bValidItem and ItemDefineID.bValidInstance then table.insert(Parts, ItemDefineID.TypeSpecificID); end end end return Parts; end function ItemTool.GetWeaponPartMap(Weapon) local Parts = {}; if Weapon and UE.IsValid(Weapon) and ItemTool.IsShootWeapon(Weapon) then local ItemDefineIDs = UGCGunSystem.GetWeaponAllAttachmentIDList(Weapon); for i, ItemDefineID in pairs(ItemDefineIDs) do if ItemDefineID.bValidItem and ItemDefineID.bValidInstance then Parts[ItemDefineID.TypeSpecificID] = 1; end end end return Parts; end function ItemTool.GetCurrWeaponPartList(Pawn) local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(Pawn); return ItemTool.GetWeaponPartList(Weapon); end --- 武器明确指定使用这些配件 ---@param InWeapon ASTExtraShootWeapon ---@param Parts table function ItemTool.SetWeaponParts(InWeapon, Parts) if not ItemTool.IsShootWeapon(InWeapon) then return ; end ItemTool.RemoveAllParts(InWeapon); if table.isEmpty(Parts) then return ; end for i, v in pairs(Parts) do ItemTool.WeaponAddPart(InWeapon, v); end local Pawn = InWeapon:GetOwnerPawn(); if Pawn and UE.IsValid(Pawn) then ItemTool.SetWeaponInfinite(Pawn, InWeapon, EFillBulletType.Fill, true); end end ---@param InWeapon ASTExtraShootWeapon function ItemTool.GetAllPartTypes(InWeapon) local WeaponID = InWeapon:GetWeaponItemID(); local Parts = {}; if table.isEmpty(WeaponSuits[WeaponID]) then return Parts; end for PartType, v in pairs(WeaponSuits[WeaponID]) do if PartType ~= 0 then table.insert(Parts, PartType); end end return Parts; end ---@param InWeapon ASTExtraShootWeapon function ItemTool.RemoveAllParts(InWeapon) -- 检查是否有配件 local PartTypes = ItemTool.GetAllPartTypes(InWeapon); if table.isEmpty(PartTypes) then return ; end UGCLogSystem.LogTree(string.format("[ItemTool.RemoveAllParts] PartTypes ="), PartTypes) local Pawn = InWeapon:GetOwnerPawn(); local WeaponID = InWeapon:GetWeaponItemID(); local BackComp = UGCBackPackSystem.GetBackpackComponent(Pawn); for i, PartType in pairs(PartTypes) do local SocketType = ItemTool.GetWeaponAttachmentSocketType(PartType); UGCLogSystem.Log("[ItemTool.RemoveAllParts] SocketType = " .. SocketType); local DefineID = UGCGunSystem.GetWeaponAttachmentIDBySocketType(InWeapon, SocketType); -- 移除 UGCLogSystem.Log("[ItemTool.RemoveAllParts] 开始移除"); local bDrop = BackComp:DropItem(DefineID, 1, EBattleItemDropReason.Force); if not bDrop then UGCLogSystem.Log("[ItemTool.RemoveAllParts] 移除配件失败,WeaponID = %d, PartID = %d", WeaponID, DefineID.TypeSpecificID); end end end ---@return ASTExtraShootWeapon function ItemTool.GetLocalPawnCurrWeapon() local Pawn = UE.GetLocalPawn(); if UE.IsValidPawn(Pawn) then return UGCWeaponManagerSystem.GetCurrentWeapon(Pawn); end return nil; end function ItemTool.GetLocalPawnCurrWeaponID() return ItemTool.GetCurrWeaponID(UE.GetLocalPawn()); end function ItemTool.GetCurrWeaponID(InPawn) if UE.IsValidPawn(InPawn) then local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(InPawn); if Weapon and UE.IsValid(Weapon) then return Weapon:GetWeaponItemID() end end return -1; end function ItemTool.RemoveItemByDefineID(Pawn, DefineID) local BackComp = UGCBackPackSystem.GetBackpackComponent(Pawn); if BackComp then return BackComp:DropItem(DefineID, 1, EBattleItemDropReason.Force); end return false; end ---@param Pawn UGCPlayerPawn_C ---@param Weapon ASTExtraShootWeapon function ItemTool.RemoveWeapon(Pawn, Weapon) local DefineID = Weapon:GetItemDefineID(); if ItemTool.IsShootWeapon(Weapon) then local SocketList = UGCGunSystem.GetWeaponAllAttachmentIDList(Weapon); for i, v in pairs(SocketList) do ItemTool.RemoveItemByDefineID(Pawn, v); end -- 删除子弹 ItemTool.RemoveAllBullets(Pawn); end ItemTool.RemoveItemByDefineID(Pawn, DefineID); end ---@param Pawn UGCPlayerPawn_C ---@param WeaponID int32 function ItemTool.RemoveBullet(Pawn, WeaponID) local AmmoID = WeaponAmmoIdMap[WeaponID] if AmmoID == nil then return; end local AllData = UGCBackPackSystem.GetAllItemData(Pawn); for i, v in pairs(AllData) do if v.ItemID == AmmoID then UGCBackPackSystem.DropItemByInstanceID(Pawn, v.InstanceID, v.Count, true); end end end ---@param ItemID int32 function ItemTool.IsBullet(ItemID) return ItemID // 100000 == 3; end ---@param Pawn UGCPlayerPawn_C function ItemTool.RemoveAllBullets(Pawn) local AllData = UGCBackPackSystem.GetAllItemData(Pawn); for i, v in pairs(AllData) do if ItemTool.IsBullet(v.ItemID) then UGCBackPackSystem.DropItemByInstanceID(Pawn, v.InstanceID, v.Count, true); end end end ---@param Pawn UGCPlayerPawn_C ---@param Slot ESurviveWeaponPropSlot ---@param WeaponID int32 function ItemTool.AddWeaponInSlot(Pawn, Slot, WeaponID) local Weapon = ItemTool.AddWeaponItem(Pawn, WeaponID, 1, true, EFillBulletType.ClipInfinite); UGCWeaponManagerSystem.SwitchWeaponBySlot(Pawn, Slot, false); end function ItemTool.GetPlayerEnterWeapons(PlayerKey, Index) if Index == nil then Index = 1; end local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey); local SlotWeapons = nil; if not table.isEmpty(ArchiveTable[PlayerKey].EnterWeapons) then SlotWeapons = ArchiveTable[PlayerKey].EnterWeapons[Index]; end SlotWeapons = SlotWeapons or WeaponSelectionCombinationConfig.WeaponCombinationList.Weapon[Index]; local Weapons = {}; for i, v in pairs(SlotWeapons) do Weapons[WeaponSelectionCombinationConfig.ECombinationType[i]] = v; end return Weapons; end function ItemTool.GetFirstWeaponID(PlayerKey) local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) if Pawn and UE.IsValid(Pawn) then local Weapon = ItemTool.GetPlayerFirstWeapon(Pawn); if Weapon and UE.IsValid(Weapon) then return Weapon:GetWeaponItemID(); end end return nil; end --- 给玩家添加其他倍镜 function ItemTool.GetOtherTelescopes(Pawn) local NeedAdd = {}; for i, Enum in pairs(ShootWeaponEnums) do local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(Pawn, Enum); if ItemTool.IsShootWeapon(Weapon) then local WeaponID = Weapon:GetWeaponItemID(); if WeaponSuits[WeaponID] then if WeaponSuits[WeaponID][EWeaponPartType.Telescope] then for _, PartID in pairs(WeaponSuits[WeaponID][EWeaponPartType.Telescope]) do NeedAdd[PartID] = 1; end local PartList = ItemTool.GetWeaponPartMap(Weapon) for PartID, C in pairs(PartList) do if NeedAdd[PartID] then NeedAdd[PartID] = nil; end end end end end end return NeedAdd; end