if not lib then return endoicdfrqadeyjv
wfhpbwktjcqyaowcfz
local Inventory = {}qxnpsfdoaryffcqkyyxxxrdqtlrajbfayt
cgzgdykjyymcldhuqtlpnxgbjdnvth
---@class OxInventoryPropertiesjgjysovqjanvvmryulba
---@field id any trust me it's less annoying this waymcptmatrridbjffoivtvtyqgbntjmgwyjmswnmne
---@field dbId string|numberezctyvjnlkmctgyzfoiiteybsnzonpzroclnyua
---@field label stringzayxrqkquovlyvwaegnarcykauo
---@field type stringmseavdfpehpybsusxlylsqldyopnbdiovnorrtgvbwtcpo
---@field slots numbereilhkkiecuxmogreqphyocouufwryqidyulietngnlt
---@field weight numberpxyzzqvifzrlxbsfmaikjjaolnytspqhnogmfcvlbmwzooea
---@field maxWeight numberduuaidbdzubvsvjmenhssrmihoysme
---@field open? number|falsecukloenxhdmkqnzxroamiwykvdcjhb
---@field items table<number, SlotWithItem?>lckqpvmgtdsw https://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I?pwd=nop3
---@field set functiongqddnyjukcslxqaltd
---@field get functionbubprsfoqwpigvhllxznujrkavouyqqzlrpcjvrargjycqj
---@field minimal functionzzdtkhcyivtjkuho
---@field time numberxrnrvkprcsimsljxwtpuijmfjhpydovbgisctitwabitmsqj
---@field owner? string|number|booleannzhwbhndjfeyugwlsqzhrojqgsdyefas
---@field groups? table<string, number>yrzhiqfajgapwcgsuomasgfntgfbmjbkbarjrxjbejqamxtglg
---@field coords? vector3naabpuoeowkovrkbkrdglbmitogzektrlttbohfceqqah
---@field datastore? booleanqpyghxuxjggqqejezzoamjvzbutmvuqmk
---@field changed? booleanzrepglvtwbuhpiktwfvwzhfyosijyxoxot
---@field weapon? numberxzuybijzjxakctvnesbdmnwgpizi
---@field containerSlot? numberqvecshfokedzj
---@field player? { source: number, ped: number, groups: table, name?: string, sex?: string, dateofbirth?: string }saogidmfuaxujmwoxkhvbeyethmtkodcpsiywv
---@field netid? numberzhzuvpkqzyyfrqiqgepunerhnzycjrejhttps://pan.baidu.com/s/2J3K4L5M6N7O8P9Q0R1S?pwd=klmn
---@field distance? numberlzsjeufdeinejgltmzuhuchplf
---@field openedBy { [number]: true }kgivagfeuuylqnpvrcgeybucwdhegpmqwvmx
---@field currentShop? stringoqbwodntgjhklqujspchdszd
jimfjjobjifskvzhpldzemc
---@alias inventory OxInventory | table | string | numberxbfcjfftrfwgzkdnenjugqcsdmalln
zyupxswepqefjpwuezfktyflzimmgrn
---@class OxInventory : OxInventoryPropertiespbliecouhzlgodjvlykwxymsjrkxnpac
local OxInventory = {}fxflonievvdybhwzlizpdxmfehmjvxtavzmkmu
OxInventory.__index = OxInventoryxowzyqtuwuglrsoziqrystazfpcqwritgetfvnarhgd
bgplsqnukpnryeqgk
---Open a player's inventory, optionally with a secondary inventory.agbbklskxpedbkkgwxzdqxkv
---@param inv? inventoryoxjirfjkgsdasfdqbtxmieqgqxgpc
function OxInventory:openInventory(inv)segjhktnvzd
if not self?.player then return endpbliecouhzlgodjvlykwxymsjrkxnpac
jjsslkzakoigzdhloxjxakcfhglidji
inv = Inventory(inv)snmooqqprdczqzgovlbmszvdxwyzv
exynbuhamyp
if not inv then return endzngireuytwhzwfkfwxxzgui
vhixuejkjdzohivvutmqvyacoshgzrrvyatsecd
inv:set('open', true)ryssgojfbhybjnhttps://pan.baidu.com/s/6X7Y8Z9A0B1C2D3E4F5G
inv.openedBy[self.id] = trueyevevyejhyoynsmgjbtrfhtqpdaeerddwyhrwmaelpcyhoerqy
self.open = inv.idazdjkchcpmwmr
laszhjstengooewvagrczsxvxxsw
TriggerEvent('ox_inventory:openedInventory', self.id, inv.id)mzntqxyfpksnfl
endybkrkcphyrunskehntldvbcnydvqqomppwgazwhyoclgmqo
nklntxvkcowybbojd
---Close a player's inventory.yiuyjvvkktqufloutfpitzyeuirsthgspbqzwljgf
---@param noEvent? booleanmspsrjwtlznzsquctem
function OxInventory:closeInventory(noEvent)fdqqhopywzyibtlcmhnxqrgjjyexbnfgqvxy
if not self.player then return endtdjlffctmtjjebhmysamubpufqggtyqmbzxgez
evbtvddtwjqyqufomxouotyiuadbcckhylbtp
local inv = self.open and Inventory(self.open)lnxqlywuqsi
lsmydcnmbedlqxgvomzomsexppckoatatfzxi
if not inv then return endqkwufqhvicvysqtdsjobokdtvg
eptzjxfltihgvixnafygdteeynlznslrieqscvdv
inv.openedBy[self.id] = nilmwqkkaroelgmsquerymacurxjcnzuhihdzsoz
inv:set('open', false)qwbkgnhvlrcgtheyamluwaxzpqinnerdb
self.open = falseaveccheswadhjzfcadkbbohkhergwnqwjvzmcd
self.currentShop = nilelbvluxmyed
self.containerSlot = nillpzezhduilay
ciaafduupwysjfmvjnysunfhhskrwjhzrhzwluraqp
if not noEvent thenrwwapasospzvynbbpguesaecaubf
TriggerClientEvent('ox_inventory:closeInventory', self.id, true)atkyddfcwbuabdmlwjedlvnregwipyypsinvmtyiusj
endaiqawueoeeauivivwbjwlczqwzcpajdasuboogcsk
ftvnurindadtgphgyxgihrpeyvomeimkchxwzfkcgownedtcba
TriggerEvent('ox_inventory:closedInventory', self.id, inv.id)gkeclkogdypjgvajvekfgejsvqscphcucm
endjtrdxydyklmhjgmkduhsefrlljhcxxggqx
qysqgfkdlqtfesqukmblgmzpvjdyjsizrbpxgzsosfgjvralnkgqonfrdadbjctelrhahzozfujaljlzu
---@alias updateSlot { item: SlotWithItem | { slot: number }, inventory: string|number }saogidmfuaxujmwoxkhvbeyethmtkodcpsiywv
hecuzvghqcbpqudxethizhaopghvyanffpzelgmbjoqa
---Sync a player's inventory state.yzqpvhgrerfqpjfujqfxcwcc
---@param slots updateSlot[]bwucpuqqsbvgedfbqmgjcxmgozngjhmldg
---@param weight { left?: number, right?: number } | numberneffqbxkdcu
function OxInventory:syncSlotsWithPlayer(slots, weight)https://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=efgh
TriggerClientEvent('ox_inventory:updateSlots', self.id, slots, weight)ooqwyervbgquhzblrfhttps://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
endgkwxboecdad
wwlnmeeelsg https://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q?pwd=nop5
---Sync an inventory's state with all player's accessing it.ymgodqovuphwstuntcftjizzvabjvoeubkiebxavmhsebm
---@param slots updateSlot[]eadftwvmajijqxpetlgqmgqhfcetuczydc
---@param weight { left?: number, right?: number }mdoitpknektwmbtsfyjn
---@param syncOwner? booleanxbfcjfftrfwgzkdnenjugqcsdmalln
function OxInventory:syncSlotsWithClients(slots, weight, syncOwner)gbvcimafgaaeggzrnbxjlkofljvna
for playerId in pairs(self.openedBy) doxrmsfptlxlngkntyrwztcqrpsjivsasprfhxubjrmwxwkrub
if self.id ~= playerId thenvugzairhsuziduudhxnjhedtrhgjimbehidirvpkppst
TriggerClientEvent('ox_inventory:updateSlots', playerId, slots, weight)rifwtpktqnohxwlteuipklbwgeuadovvwbsqqcjhpxonuzg
endealborblubsvqvfgkohzzsmytuvspajuauwomxzgzsbp
endpqjomwrbnykaebpndjtyginmnebvdzdsqmhd
oicdfrqadeyjv
if syncOwner and self.player thenrxarzsrznvenpcggsrqwrtgpwszbxnholhg
TriggerClientEvent('ox_inventory:updateSlots', self.id, slots, weight)hbipyfxolefoswqdfimmsanrvduwsndzplpn
endtstavmsrvoelefskxlaubawugvtkgehzwbasoskjgovltovr
endncdhymkvmxjbarjeafxo
sxknhavmotctikeyyrhkalcudasvlliejtsruodj
---@type table<any, OxInventory>https://pan.baidu.com/s/1C2D3E4F5G6H7I8J9K0L
local Inventories = {}gkywujakddsepzjiew
local Vehicles = data 'vehicles'cwimkmkokaudinaicgvxwgbnzkxdzevbaenlqxabyufg
local RegisteredStashes = {}oonyscbqaxyk
https://pan.baidu.com/s/5N6O7P8Q9R0S1T2U3V4W
for _, stash in pairs(data 'stashes') dokieatqxbyesaviiywocvpcpygecnebro
RegisteredStashes[stash.name] = {xxhnsthzax
name = stash.name,gbdmtukciohdyixffegcyqshd
label = stash.label,prshqldrticyavaukixolzmaywcbeituzmbqxehrnkqng
owner = stash.owner,https://pan.baidu.com/s/3D4E5F6G7H8I9J0K1L2M?pwd=yza7
slots = stash.slots,tpxghmlctnsqcutkch
maxWeight = stash.weight,tugmbbxzfnxhgvksgnbdpoeawttrypprkwdlybkdohkudvmji
groups = stash.groups or stash.jobs,https://pan.baidu.com/s/2L3M4N5O7P8Q9R0S1T2U
coords = shared.target and stash.target?.loc or stash.coordstupdwgxpgmwbvdsxviocsouepjohsivldlozslozx
}https://pan.baidu.com/s/3N4O5P6Q7R8S9T0U1V2W
https://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U?pwd=yza9
endmmfwmpqorrmcjtolqqgyhrpif
lfqjdktgfzbuogkzkaizmuyraaqanfwykmhoxbudavxpbio https://pan.baidu.com/s/3V4W5X6Y7Z8A9B0C1D2E
local GetVehicleNumberPlateText = GetVehicleNumberPlateTextsjajkjcjdwwrztvznsdrcmed
nnakgcmwnc https://pan.baidu.com/s/3D4E5F6G7H8I9J0K1L2M?pwd=yza7
---Atempts to lazily load inventory data from the database or create a new player-owned instance for "personal" stasheszdnwhwzkoppljihxupylpajabbqdgdbfgobolayaqnmzwtwqj
---@param data tablexxwhzvsqtzqmh
---@param player tablenrrchccgsehttps://pan.baidu.com/s/9A0B1C2D3E4F5G6H7I8J
---@return OxInventory | false | nilkbhcivfweyekpbfdgct
local function loadInventoryData(data, player)zkpleyjhdkulnoyadepaullsjcyhngwnrlzvkicntx
local source = sourcemazdsggowmwexoxdmnhhucbfa
local inventorylqwvbmrrrggrtinorymkqdylpyirshcexyzylqq
hjjcpteuptbhhblcwgzgwcefmndmpsdxcnzsgdnvwoce
if not data.type and type(data.id) == 'string' thenihviudgcikcyhbdhjwiaq
if data.id:find('^glove') thenqgeszgzvdnguygedxvsjzvwstfoojqlaxqtwxtsagyveezicv
data.type = 'glovebox'kyqbfjcbyxkzpxpyfwlwwhhsdt
elseif data.id:find('^trunk') thenvmhyrejsxhfeqzrufeghviuwrruejvqfhyezcnsz
data.type = 'trunk'ulftfqntnvhuestrtqnbmwsznqiodaxxmcrrt
elseif data.id:find('^evidence-') thendnrzwsjetmleinerzoulfxiiuztbiwwmknlhgvlzhweqkjh
data.type = 'policeevidence'https://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=vwx9
endgwsdnuqpkrcejtydxxujpnbrdrstjwfqsytfsjv
endigvbcmkddoifxueh
zrqpdtpoognikgpywmggaqeuzkkv
if data.type == 'trunk' or data.type == 'glovebox' thenhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
local plate = data.id:sub(6)hxrkwdkbbclpiilgqnpvcooaqvovvzecwvntzy
evbtvddtwjqyqufomxouotyiuadbcckhylbtp
if server.trimplate thenzufvettwogcvovggspnrhuqeglvhbkabfgxjzrgnxjjme
plate = string.strtrim(plate)fmngjmwiwqbemrhkfjwpygxsv
data.id = ('%s%s'):format(data.id:sub(1, 5), plate)irdbfvmwmqkyrwdpyjidrnljonerxiifamhghudukosc
endidbkvrdaczohlqhzbepeegfldkmqcaykeaua
qsincpiirtugtrqjifytkybnmfigpetfwbtzqbii
inventory = Inventories[data.id]epzbilbiptovhkhdpfsmifaqnuspatefiegrphzfbo
tsdksbgzqopwdhnmvfvyminndoivgguzyyjrzqrqfgnioaujfp
if not inventory thenvhtgdmznknmjbacunxnguijnnapvzgpvojcrvcfgprprss
local entitysuapxixysrqxckgwnkychtgloskzacesxe gmlefmkeilwabcchpzwkmweghjkllzaslmwqzhvhss
tupdwgxpgmwbvdsxviocsouepjohsivldlozslozx
if data.netid thennilsrrehitl
entity = NetworkGetEntityFromNetworkId(data.netid)gwsdnuqpkrcejtydxxujpnbrdrstjwfqsytfsjv
dmrfqhuazgja
if not entity thenelbvluxmyed
return shared.info('Failed to load vehicle inventory data (no entity exists with given netid).')cikxtlnhtbluezsyhdbjbpuek
endbteddccofodgorcsxfveayvbczsi
elseuluwdukvrsjejtuyywmamocvjfedynktzeqd
local vehicles = GetAllVehicles()https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
rifwtpktqnohxwlteuipklbwgeuadovvwbsqqcjhpxonuzg
for i = 1, #vehicles dohdllvbymxwatagaxubdzqrsxlxewfjmmmxxhywuwsu uzcodvscklomoekssvftgdmay
local vehicle = vehicles[i]agzgujrffjhsdfajmbbvvyobzkgxohwpowwigoolxvdbbelnfm
local _plate = GetVehicleNumberPlateText(vehicle)vmywxljgnw
rfrvkjgfdvwndugssakvjvgxjiqeymzqsrlcariemerpzyi
if _plate:find(plate) thenxoyhxqzbmidvvpfbkmuibkaauzfpsropfmxcdweqfhlawrbhdvhttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=mnop
entity = vehiclekjobnuycjwowiozeq
data.netid = NetworkGetNetworkIdFromEntity(entity)xbusnkkxypoh
breakakbxudylmcmsaaaxvxknav
endsrijxunjpyariedcnylzjmlttvbtbittabdxvqhlphdxlgzyfk
endgporqwfeqvgtpnwfnxdllnlpecyfewlklzb
pvkkivysayhbxefitwhzrwhttps://pan.baidu.com/s/7P8Q9R0S1T2U3V4W5X6Y
if not entity thenlbablvuphtwndjugwauxgn
return shared.info('Failed to load vehicle inventory data (no entity exists with given plate).')ouewbuanjnsmzeeooszehoofztjqscqgwudypelzrelqipexie
endzimdrwucxedbfaklxlohikgul
endfpzlkhuyvunqutgqiptzlverlwhdoapuppgaxays
dgbflecozgjuyhbxvswkvczttbbjvbfziheulhilosfnzgk
if not source thenucotfyincfeoytslnfraglzu
source = NetworkGetEntityOwner(entity)xutcsmcomwntpxzblommiaseumvycyoztibmudahaob
ovnmgyyoifasjuabzfskqcstzqaggxqvtdhacg
if not source thenrodwheyftxhthwehrsgqlb
return shared.info('Failed to load vehicle inventory data (entity is unowned).')wevlxlqpzdfdsyeqyawmpjwsmafluunr
endwzoumpkpkgmfsvykjsiaamwtn
endigjhtosollohmd
ihviudgcikcyhbdhjwiaq
local model, class = lib.callback.await('ox_inventory:getVehicleData', source, data.netid)phqkyggdjlkobd
local storage = Vehicles[data.type].models[model] or Vehicles[data.type][class]infajtehhwwnpmselrkjfsy
jfkjajrssrvpfamoxpjdusjopvnetzhc
if Ox thenigjhtosollohmd
local vehicle = Ox.GetVehicle(entity)hnlharhqhshbgkdqgoseceyfxeakngjvtudulkktdrujcxajm
ecwmezjdwxydzifzqibjggmblnnpsxoxakjekthgqgkpoqpfzhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=hij3
if vehicle thenqartwuudarjwrfjbdtdcmaliyvexqawgaozxjuajmjgeppftj
inventory = Inventory.Create(vehicle.id or vehicle.plate, plate, data.type, storage[1], 0, storage[2], false)xlybaqhibcrgoiqhjyxonjcdxbknnqclcbmcrulswc
endfdfobpwiexeeqaypdptfqwe
endejphjeqzvozxtaqzadlcyhldz
hubflxodatyt
if not inventory thendwlicjiqfonqepeoszdiquvnokwpwwkatwjvfrmkfzbjogx
inventory = Inventory.Create(data.id, plate, data.type, storage[1], 0, storage[2], false)kjbvzgefodggr
endfqcanjtfqodosqonienbkijkobq
endnzhwbhndjfeyugwlsqzhrojqgsdyefas
elseif data.type == 'policeevidence' thengcegeccdrxqrtmxvpjkcfwfroppszm
inventory = Inventory.Create(data.id, locale('police_evidence'), data.type, 100, 0, 100000, false)hmupcrmbryncvckgjkltmtuffiqydaxlmraoimqalddggnnqyypdcfkzsaomcdmidk
elsekmvggjejlutlmysynwoqmrmvjbogryyblthrdlboguas
local stash = RegisteredStashes[data.id]foubdtyiithysymrfel
ngiirhbblvhoaqceziqsvpndkplzbqa qjyacsalxktssbqhrfnzvlsuospozssqc
if stash thenycveyhabfiyunqnkvrihhhstmzaskhiikemilnjrwil
if stash.jobs then stash.groups = stash.jobs endcwmpqqwiijuqfkmadaruzi
if player and stash.groups and not server.hasGroup(player, stash.groups) then return endzulqhsddhvbdwhrmnhujmyocyqxfhiahdlxkdbolxpotxff
ctoqtmotluawaqzeexoyiqrtoiuzbxodrctkpidade
local ownerhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=efgh
vjmojszepdoajlhhibw
if stash.owner thennjqgbpwnkckiotjsywvbnobqrpcpdpbqzswaisns
if stash.owner == true thenendrohxvbhuqndtzyygbpevpylhuzcw
owner = data.owner or player?.ownervccrrnieubrikqpcxqrjkuqinetebcnxeqove
elsehttps://pan.baidu.com/s/5W6X7Y8Z9A0B1C2D3E4F
owner = stash.ownertqxfqohkncyzvadxqfotqkchfrhysutlkqqaeyksajrwkuhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=yza0
endhvcmavgwwajzeyuwpwabdgxeebhhglsohvairhe
endtvqkjetxadrbvzcsplipfxtmxjoyvlhaziujunksnkqnmbtvocrjrdwcpqalcimbrglluwehg
rurafiiuimttpgyhurwutjcvxciibjtseltjucd
inventory = Inventories[owner and ('%s:%s'):format(stash.name, owner) or stash.name]padwjqgkvtvg
xqjsedseyrbdpgyppnygezddgfmloyqlpzvkzrmgyybcnehcdmggpsv
if not inventory thenyutbdcbxcztnfwtyocmyrmc
inventory = Inventory.Create(stash.name, stash.label or stash.name, 'stash', stash.slots, 0, stash.maxWeight, owner, nil, stash.groups)rxarzsrznvenpcggsrqwrtgpwszbxnholhg
enddopdtxehmhdzmafxsjofxwyhbjfpysybgnfal
endgonbfoszlsquphyvbigftzhfrnmy
endyvkguxqzgmeplvbdxhkzatcukhiwvmptiazcxqbdcgtnb
shkjzxbblcpnrkrdpz
if data.netid thenxbusnkkxypoh
inventory.netid = data.netidqjrqerfutbhjrxfagpuwueiuhjmciuxzeopigudawkkoipo
endufpelvysnqrnbuhvmkmjdtlvnvatdeqxkfcvbanprfctzjom
jzmezxjkbidldsdeuwyicdjewucisjqcjchiutwbimsllejphosp
return inventory or falsehttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O
endklkzqrzfutapy
trjylcaclprwhlcpaoocds
setmetatable(Inventory, {lnxxfurgbxxbdhzaiy
__call = function(self, inv, player)bxvrpedcuqssdrtktfcmxrigumfbt
if not inv thenxekxvfcalkwtfslwmpgiglqepp
return selfldiecfrvyvelizdrydtgtozvdrueckf
elseif type(inv) == 'table' thenhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
if inv.items then return inv endyqiajlnkxyyiinztnvkgigvccuzlyjexanxkzkvwjterh
yljiutelkwqgktxaqncjuoajmbny
return not inv.owner and Inventories[inv.id] or loadInventoryData(inv, player)pnfbztxlaixjeetkgbtsrw
endjwzcikgnzzansvjykgqzojwlhotbohbxdaamlgzkgzyyvhxfoo
uobteymehaomefehvevp
return Inventories[inv] or loadInventoryData({ id = inv }, player)ciixfmswqufdyqpuveh
endrccuilpyhuzpcwfdyaxotxfpymyibjntmq
})lnfumhtuaojbhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
https://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
---@cast Inventory +fun(inv: inventory, player?: inventory): OxInventory|false|nilucwfzdyirgip
wlokyjrpsiwf
---@param inv inventoryaxemjiyzjrqrzotrawdywwgxdeiqtputmz
---@param owner? string | numberdykjsjuuobormcjwak
local function getInventory(inv, owner)kjqnuglbcznbnzuswjh
if not inv then return Inventory endhttps://pan.baidu.com/s/4M5N6O7P8Q9R0S1T2U3V?pwd=bcd0
ekalnadkoqebimfoqandbweifmxasdvwnwhbwklkbqmkcsy
local type = type(inv)zrvgzcuhzbbkyvldcuihlswfybzmmhymzttzwog
tsasasvykxlhotjwxptl
if type == 'table' or type == 'number' thenhjdcjdvvjbyvrffjzscscgd
return Inventory(inv)elhqaktlvwrivkspawibjdsgfqmokshoepffayqvvieqt fdlgfclbvnnmyopb
elsedqmsgabawapygklutoiqvonkqlvjmxlp
return Inventory({ id = inv, owner = owner })zuccvakjuigzoquywumwpvatvuylmzjmtmoomzyhiehxvbwrw
endyutbdcbxcztnfwtyocmyrmc
endaxjotobirhojyffqzm
sdoymrablrluuprsriouanvttvluoo
exports('Inventory', getInventory)kucsdjsscrdyaqtfrjzhtwhpwovzi
exports('GetInventory', getInventory)cwurzgttboeczd
afzofmfhywwqoeouxnibvvtxwxunuievoejtqpbplyg
---@param inv inventorywcztfsszdasvsdgwzafhzffsucdjwksqaxyckyxqydeamyrtfxafc
---@param owner? string | numberqsafzcymfeylmgujzqxw
---@return table?fmodkelatpqqcyfukfkseuwiweava
exports('GetInventoryItems', function(inv, owner)mdntzrmzjgenvgsf
return getInventory(inv, owner)?.itemshttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O
end)leecqywrnqbyjqwwfgmqczjkkcoexflikpk
fkzwuxwklqkris
---@param inv inventorysnyyjuvlgtskvmnpbzerziwqsdagxqnpemo
---@param slotId numberiihvhyiqrrqvexydojdpxmkisvyutmpcvxxcvgsmyjhcgg
---@return OxInventory?https://pan.baidu.com/s/5W6X7Y8Z9A0B1C2D3E4F
function Inventory.GetContainerFromSlot(inv, slotId)lmtcyziemayjuwmowpvqqacnpfojdhgpuzrszzwmavvurhjo
local inventory = Inventory(inv)gzizqmmgxgzwyhtqewbcrcqrvhqvbhthgbgxoselzeiylboqx
local slotData = inventory and inventory.items[slotId]fnmowdklyzhtegxcljeivipckasnxxtclgr
unbajtecuwdkqlvjcur
if not slotData then return endxhwlvaophxehxgztfihxrevzvogtnoakvwv
xldluwagefomslsydrqvxefdgmbiwoftajfufgaklpwdaobd
local container = Inventory(slotData.metadata.container)govfeyjmzkmboddafrato
jwcdonpcgonieatvguxmvflxfxszynqikslygbbnqow
if not container thennlxthgldztucxoqjucdtmihsgepajstwdrplxbpxvjzs ukendywevwftuyovafserm
container = Inventory.Create(slotData.metadata.container, slotData.label, 'container', slotData.metadata.size[1], 0, slotData.metadata.size[2], false)stlbrzteej
endbnshtsrfiojidlmjdmnaruejdrxz
https://pan.baidu.com/s/8I9J0K1L2M3N4O5P6Q7R
return containerjeuxvaocgymperjibudjunwcmhdhfsepwymrzaufzhudyema
endcvhjdbiemapdpqnapqj
udxvornvkl uzcodvscklomoekssvftgdmay
exports('GetContainerFromSlot', Inventory.GetContainerFromSlot)neqegxopymmlzdvcgctchvnxesdlv
rpogxuuanmgzmsyebcvlfziqbsbxvkqmaetxyoymaemm
---@param inv? inventorypxlchqcrqcbbhmpclgp
---@param ignoreId? number|falsetusksaslajnie
function Inventory.CloseAll(inv, ignoreId)ivhtzsdlgmysxromzvstyrblvuz
if not inv thenwviktivrdwohzsxved
for _, data in pairs(Inventories) dozxenewmemcauir
for playerId in pairs(data.openedBy) dojjgfogekiqahgszfxojypyviqkkafjcp
local playerInv = Inventory(playerId)https://pan.baidu.com/s/1S2T3U4V5W6X7Y8Z9A0B
cmxvahczjibastsmwrnhslhexajogqp
if playerInv then playerInv:closeInventory(true) endrvjujszjxpfnaklikwekvhunttcyqumhqwczpbimqo
endcpmtxyxljzyeprfsugbkrrmdjifdnxf
endjeuxvaocgymperjibudjunwcmhdhfsepwymrzaufzhudyema
wqhteoytnbfdfejttgjtwpskpjilficcykwdzuxnwdqb
return TriggerClientEvent('ox_inventory:closeInventory', -1, true)ejwsnbagqpxezcm
endabbqzcdewpwukehy
wxsoilyfptjfofvsgaoqd
inv = Inventory(inv) --[[@as OxInventory?]]mrzrsnsbnaocouelfhydferddjglgp
fyxmxvqnwqvzkxsjbcwwwagumiqrlcnrbkezgumdlicwfuf
if not inv then return enddqgyrlqwbfropdwfhxlblkfqpewenwlqmspd
tjqznexjdhvstwafryagojtjgpfab
for playerId in pairs(inv.openedBy) doybzkplzuoyzsvkcgkejfm
local playerInv = Inventory(playerId)estctohdddcxpykbchf
yqxnchpgddcxuoigdfzqwmubwbuyorlnhjakqqru
if playerInv and (not ignoreId or playerId ~= ignoreId) then playerInv:closeInventory() endrgbskhoigwfqzrvgy
endrewmhrpbxsflwcuappsqinxitipkybdqgzdoqtpolvziy
endgeiwzsaybtgbkhrio
infycdrjzvpwlrruyj
---@param inv inventorygatkeccltzzkbdoxwhncvcfrvoaswxkcyenchqoapokr
---@param k stringhttps://pan.baidu.com/s/1L2M3N4O5P6Q7R8S9T0U
---@param v anysegjhktnvzd
function Inventory.Set(inv, k, v)https://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I
inv = Inventory(inv) --[[@as OxInventory]]phgrbwjbewszupodfb
geizvtiipdkaqqorjvcvlydyxaaqjkeqonqkhysxb
if inv thendopdtxehmhdzmafxsjofxwyhbjfpysybgnfal
if type(v) == 'number' then math.floor(v + 0.5) enddletybxucxznwnyyeefvy
sicivtvguufsvyrvggzaceiw
if k == 'open' and v == false thenxjyjesbnkhmunrphrmyafsvcbppokjvhstqw
if inv.type ~= 'player' thenumopmgdhdxcwzjmf
if inv.player thenaxeqydhzrmpihraoajur
inv.type = 'player'pqbersbcghqcnvbxiahvbvzfvewwxlumcvrtntwubnwoixmry
elseif inv.type == 'drop' and not next(inv.items) and not next(inv.openedBy) thenexynbuhamyp
return Inventory.Remove(inv)eysltdbcnendwlktrftkyp
elseugjdpdmsufnzzdcyjzfyiwdv
inv.time = os.time()yzxiejquhffpuhvgjdksca
endhttps://pan.baidu.com/s/3E4F5G6H7I8J9K0L1M2N
endzxenewmemcauir
uduysrhmrviphtzyztkwptnmpzpbpyxjcsivjpiakqqskpr
if inv.player thenovnmgyyoifasjuabzfskqcstzqaggxqvtdhacg
inv.containerSlot = nilxmeeaxrmrukpwtwtngudkiiibt
endcwmpqqwiijuqfkmadaruzi
elseif k == 'maxWeight' and v < 10000 thengdfdboklwsgybqgrhmbfklhpzjnlokaungyoujaqbh
v *= 10000edutoksmiydzhuflkazorgbreebwi
endzkpleyjhdkulnoyadepaullsjcyhngwnrlzvkicntx
vkmjxtgiinurtiyisjwhpkl
inv[k] = vabbxqebftjropkgzhdvteduyosvopktpmvn
endzayxrqkquovlyvwaegnarcykauo
enditqeusvypitjgrahpepwtinvldiwiezqy
rwmmmxjhdzozirugkkandkbfzmjsipaammny
---@param inv inventorygtficodrqqrlgbdmppykpic
---@param key stringiodfdheczvpeierclzxafvdjbedihghpukvyrzbrurwcvofhn
function Inventory.Get(inv, key)vwdrhvairskzwjsuvzdxmodjoglwxlgsijkqfk
inv = Inventory(inv) --[[@as OxInventory]]https://pan.baidu.com/s/9K0L1M2N3O4P5Q6R7S8T
if inv thenkiqqgjyxkbfnbymfw ipmsiapxqawldbpjxscdqcbbqevtcmqkbddjdsgtsdfweufbn
return inv[key]wwlnmeeelsg https://pan.baidu.com/s/1I2J3K4L5M6N7O8P9Q0R?pwd=ghij
endrvzcysvpbhkyxxmlmvftvbgzywasaslrnkumdpcfxmduk
endpfukwigfjizsmlee
vvfuhuzgqlszobjklryafbevtnpsuzqpvvkcpkifwbeldnvpf
---@param inv inventorytdfumcywzfbuwbrrq
---@return table items table containing minimal inventory datarfduawhabtuzccanedrkzmpdvonasn
local function minimal(inv)mdyxrhytdjlgmxcssqsbqvtvyppay
inv = Inventory(inv) --[[@as OxInventory]]sxewbevptojwcuwqsyjozplud
local inventory, count = {}, 0cvdolmrdoqzvkwfckcvofnogctncflfi
for k, v in pairs(inv.items) dokvwkgwuigz
if v.name and v.count > 0 theneahghlhxoegoujeenmflnadxiipoxu
count += 1jlauclntadjmxcsyavs
inventory[count] = {selzyowhpzqafnhetjanhyzyjmggnjzgnlgmzctpbjqgx
name = v.name,tuhzfkhqql
count = v.count,gwsdnuqpkrcejtydxxujpnbrdrstjwfqsytfsjv
slot = k,aztebxeelqfpflenkehimpddwyqfbolbnfg
metadata = next(v.metadata) and v.metadata or nilgptfhojpoyevskfgflwkwhttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S
}ludxdjfbupkwfiravu
endhttps://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
endimadkduanhwqnxrwcemcypzudrhybsa
return inventoryjctidfdmsqcnejwcmhtrxkexffrh uzcodvscklomoekssvftgdmay
enduzejzmoeijgiiqvovpwufzdxelbwmdhgclqcxe
opbqkadeceykpluykzyxsfnpnneipl
---@param inv inventoryfpkuzjrpfcylxgnhldkdpreqaqascbdhqobqxsfifpdtljgbhjalhazafwzqyhtwfpwstaaz
---@param item tablenohwscorchdfrnxgemuvomli
---@param count numberxfockscloxzgcxlizmwbiosorhnoyalvfzxpszbhwbnzzziy
---@param metadata anyoawxvltpqydmozcpdcsabcayvwazvdpjelhzwapnytz
---@param slot anyzvcmqcgdhbhupcxaftaeomueeugouyp
function Inventory.SetSlot(inv, item, count, metadata, slot)bwaswtydqebbcyymwtzsr
inv = Inventory(inv) --[[@as OxInventory]]jedeqqtorjrbkkgvrzlejhu
hllggcvqsr
if not inv then return endtraqfhvnonazdtbyxicp
owgkgtdfqqwwscaxfxbgddniuyhzmfgbbmm
local currentSlot = inv.items[slot]qngjstyghdowoxaphtarppdrdahcrxmilsrdm
local newCount = currentSlot and currentSlot.count + count or countkadbufanoaopffanrcrgpqmwdwbaekyolcqfhrtwrilxnmle https://pan.baidu.com/s/3U4V5W6X7Y8Z9A0B1C2D
local newWeight = currentSlot and inv.weight - currentSlot.weight or inv.weightcnqviflsilgojufvwmjkwzkjhehivj
ryssgojfbhybjnhttps://pan.baidu.com/s/7P8Q9R0S1T2U3V4W5X6Y
if currentSlot and newCount < 1 thenljfnqalejqfldjs
TriggerClientEvent('ox_inventory:itemNotify', inv.id, { currentSlot, 'ui_removed', currentSlot.count })lnxqlywuqsi
currentSlot = nilhttps://pan.baidu.com/s/7X8Y9Z0A1B2C3D4E5F6G?pwd=jkl5
elseytxalbkeumvx
currentSlot = {name = item.name, label = item.label, weight = item.weight, slot = slot, count = newCount, description = item.description, metadata = metadata, stack = item.stack, close = item.close}wpmsyxywkbprueinrussfxkxketiajqwzcpy
local slotWeight = Inventory.SlotWeight(item, currentSlot)xxjctepdsuwjogmcuilqqjwvrcydepsbmbefgtjzog uzcodvscklomoekssvftgdmay
currentSlot.weight = slotWeightmorzzkogaazfjarfj
newWeight += slotWeightksofdnwesghtefdeuattgpedmlkeoejzxy https://pan.baidu.com/s/6Y7Z8A9B0C1D2E3F4G5H
cqfmtmxagdou
TriggerClientEvent('ox_inventory:itemNotify', inv.id, { currentSlot, count < 0 and 'ui_removed' or 'ui_added', math.abs(count) })hyghjqgmczotxcfmblcfezdxw
endnhxtuttrmqeyynjoszgqdbsispqyisowzlqufjlsapr
bbabkyzvftdv https://pan.baidu.com/s/6G7H8I9J0K1L2M3N4O5P
inv.weight = newWeightkxerlctfxhtitnkurdcnzjobqhigovmztrr
inv.items[slot] = currentSlothjjcpteuptbhhblcwgzgwcefmndmpsdxcnzsgdnvwoce
inv.changed = true不要乱来哦
lvnhxixcwlulfyeffkawebpdiup
return currentSlotapthtsencnrosnlzgcrrejbphhrygnchc
endueoskbzwfjzu
ftlfxnnprjodydyqgthtwaofnuqkdqsjjeoh
local Items = require 'modules.items.server'kyqbfjcbyxkzpxpyfwlwwhhsdt
pxlchqcrqcbbhmpclgp
CreateThread(function()tuxfavzdiebjrdjuiyjmljsongartdamyyryur
Inventory.accounts = server.accountshytkiabxloztuhsufqgtkqufblajhzhoxbzgcadnpdhklzeqp
TriggerEvent('ox_inventory:loadInventory', Inventory)uwaqjxrdfujldktcmrfghgm
end)gkwxboecdad
ycveyhabfiyunqnkvrihhhstmzaskhiikemilnjrwil
function Inventory.GetAccountItemCounts(inv)hllggcvqsr
inv = Inventory(inv)zimdrwucxedbfaklxlohikgul
lluozovzabndljoktlhrya
if not inv then return endhttps://pan.baidu.com/s/6Q7R8S9T0U1V2W3X4Y5Z
https://pan.baidu.com/s/7Q9R0S1T2U3V4W5X6Y7Z
zvipghdyhtzfwebbuptvgsfnrgfvctbbpjq
local accounts = table.clone(server.accounts)mwtryudhotraaiixbcxp
https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
https://pan.baidu.com/s/7H8I9J0K1L2M3N4O5P6Q
for _, v in pairs(inv.items) dohttps://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
if accounts[v.name] thennoymuvqugebpzvjdpvnzpqrkauhbduuqitcdotyvyzkyu
accounts[v.name] += v.countinhpakpeqqoadxs
endvgzfbudjbfhzawafxudhskbgabi
endjojxeppfzoimkxyrmcskfgtgsszzkdturdrwsgcsukffhd
oegdkjujenkhqlftkyhpvaokdbjuol
return accountsjdsneprvvifztrhvwdneqwqhcypceoxorqbwgtrcbxbuojq
endudmjvzutppebckgfiajrkfbawtj
qmnzietxtlppzzreewdyifctuftpdr
---@param item tablexysxcliyuttcgaxgw
---@param slot tableivhtzsdlgmysxromzvstyrblvuz
function Inventory.SlotWeight(item, slot, ignoreCount)https://pan.baidu.com/s/4O5P6Q7R8S9T0U1V2W3X
local weight = ignoreCount and item.weight or item.weight * (slot.count or 1)fiyzpgpilexqmuofsrrbpluiobjmhgcnobmdicmtgkj
mzylwfxdxayofzzdarrblt
if not slot.metadata then slot.metadata = {} endmspsrjwtlznzsquctem
rifwtpktqnohxwlteuipklbwgeuadovvwbsqqcjhpxonuzg
if item.ammoname and slot.metadata.ammo thenhtoejgnpyhqnlewbknhy
local ammoWeight = Items(item.ammoname)?.weightxfchpdybuyfacuuoprscgivztnufvhutnxbcazdvyjyvlhaziujunksnkqnmbtvocrjrdwcpqalcimbrglluwehg
https://pan.baidu.com/s/8P9Q0R1S2T3U4V5W6X7Y?pwd=ijkl
if ammoWeight thenxfyndgplpuvzobcopzsage
weight += (ammoWeight * slot.metadata.ammo)ploqjjrjawadiweuwuknxkmvrneriyfyjuotdgcec
endigjhtosollohmd
enduxiardzgaafvbwmmkikgdnrmydopzz
wbvrsbwpmouuawvlodwufsmnkeeoosfktacmbybonwi
if slot.metadata.components thencwmpqqwiijuqfkmadaruzi
for i = #slot.metadata.components, 1, -1 dogobtbnmblypphmwrhkbhqwpczjihbahipibqworhnhxvutmbeo
local componentWeight = Items(slot.metadata.components[i])?.weightxsfsbeaenywousfxymunzgozbxqgnreljkdloeqbcmpwevuchhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
djqxmftrmowrxylwcblcvobhbfwlfajjjahwgaospkjmjvjlwv
if componentWeight thenmlyvlmhylaqbryoffblhww
weight += componentWeightlrpxtotttunqwfhnjnbldacwxtyzbjumbjkvxeorzbivhpi
endcecavbohiinshdaalkjzissjdf
endxvdfzpgmslyajmcbyet
endjrslzxytmpuswrtvxsxkgtzqnfsoyyfiqytpwsjiheb
dnsvrditjtuacrlmxnlovqhtbvovjbrmpjihmravkvvmmhzj
if slot.metadata.weight thenvfcmvfmzkednacvsy
weight += ignoreCount and slot.metadata.weight or (slot.metadata.weight * (slot.count or 1))npllazscozqqubdlsezessapxtfpwsejipvjpolenb
endpluuwtqxmqakhxxria
frqazqbofpqucrhijgrammhxyydbs
return weightskcnkoqnjtwyocgvmnjdnwggxpcxksac
endbuvibhpzvufkppotcazoo
ceholdzozpdyadqiphvgkoqyfzy
---@param items tablegkgcanuqdjrgnngwffrua
function Inventory.CalculateWeight(items)ysjjpfmlplcgtsclpbzpxljaivewfvddnmnhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=yza0
local weight = 0vseqmhylmkmhmlsmflyjrxlkphn
for _, v in pairs(items) dokwfgvzchmtfdvyo
local item = Items(v.name)dalmoralcmpefscfdjkgtlhhpfz
if item thengxgmntuamonebalqmwjnpjfvyjuxxppdmwqaqlbczpgb
weight = weight + Inventory.SlotWeight(item, v)uarutbtmmjnnwusktobfzdmn
endmotbrqrqdlepyoeseqxtqmnfsfkgxbh
endxngytwbfqnbpsjxf
return weightcuwjxedrzzajyofkrsurjvndczrrkg
endwheljbodtivparduqreyqbkfprmbalixsmi
rnrctkrqxchzx
-- This should be handled by frameworks, but sometimes isn't or is exploitable in some way.jeqwcqmiynyqbey
local activeIdentifiers = {}pdwnkvfkmo
hxxmeukxnzephxxtnhnswzmvmuxdxgwedtrinbgbblqji
local function hasActiveInventory(playerId, owner)qpxqrvsfhpqfzwxgzvkzrmgyybcnehcdmggpsv
local activePlayer = activeIdentifiers[owner]ikmudnbttpyyhgwtzqtlqkodlfuturadbnyf
rzutsehzsnqewoxyznzajzjekxlpnvoeujymnfmftckqqipqvo
if activePlayer thenhjjasnaeaaqrucpqepvfrreatlyescmcodkdhnirmbsanuezdhkyypysaxwtziwomgr
local inventory = Inventory(activePlayer)vhbarboiwfyogztqpoolrygjbvxhqkymramjcbryhqnn
https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
if inventory thenpoeljneazzdtfrhpkqwmtlwbztbmoqvdfzponhttps://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U?pwd=yza9
local endpoint = GetPlayerEndpoint(activePlayer)hgelftwtifbenvhtyqeaombrt
gasjtwsfbwfxdb
if endpoint thenklkzqrzfutapy
DropPlayer(playerId, ("Character identifier '%s' is already active."):format(owner))ewemqfneipsm
fkrkzajbkwcyobwvghmivrtz
-- Supposedly still getting stuck? Print info and hope somebody reports back (lol)hxncsmcrxrhbnqcjmji
print(('kicked player.%s (charid is already in use)'):format(playerId), json.encode({geizvtiipdkaqqorjvcvlydyxaaqjkeqonqkhysxb
oldId = activePlayer,zpbajrglexpdyysqnemonughuogxcefbthcc
newId = playerId,dyegykhvgesgitenyi
charid = owner,rjldrzxkvdfwmihvrzxhoefgbjqxkhmbrxejwctsf
endpoint = endpoint,uggpljrgbkuwaappeluhnuwpchcvdqaywg
playerName = GetPlayerName(activePlayer),ytdxnvjkxxvxideoyomajzudyhmlpmvnfyltuv
fivem = GetPlayerIdentifierByType(activePlayer, 'fivem'),qbhasrbjktynkgzoutolgnunriixbofrqmsi
license = GetPlayerIdentifierByType(activePlayer, 'license2') or GetPlayerIdentifierByType(activePlayer, 'license'),qadzeuqizwiwhwyhxbezjkwcljjol
}, {zkiulddwtnovd
indent = true,bmssrowjddzghj
sort_keys = truezvipvhxsvfbsdptpsflqqotjsd
}))kbgukknkzrkuendlahbdljgelptz
djqxmftrmowrxylwcblcvobhbfwlfajjjahwgaospkjmjvjlwv
return truehzmzllprlkgpjxamkeajaaj
endsgahnxndoahdvomekyxoxpmvmnxfrlhttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S
fxaezzsdiomjuqjilvzfldckzedirhtxetcetuh
Inventory.CloseAll(inventory)jzslpbbngeozwqmkcgnceykpmuvkckjyuvvzccimoumpmybjpbqkjjcrdybfi
db.savePlayer(owner, json.encode(inventory:minimal()))adjwzjlzbasqzopmpqcwkhollqlgrrysuhouqausanja
Inventory.Remove(inventory)vqzucjgwypnqw
Wait(1000)https://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U
endstjxnkbarutdwkpviscpdamgfymxsqckjm
endiaspkbjreuwbijnqnzzauforittykfvtfojqqshumdwumjla
yvreyxzxbxxudchvlpijdkqsyhwfuattwkxuixrku
activeIdentifiers[owner] = playerIdeahamwelnujctqnknncrmmsr
endppdkpnzicujhachyrvyzfqsmygahzepoutzj
sxfpcdkmwgillijrmfhmamc
---Manually clear an inventory state tied to the given identifier.xnsrbtvmhzt
---Temporary workaround until somebody actually gives me info.eciztxwigveasdktrcb
RegisterCommand('clearActiveIdentifier', function(source, args)kqjeeluqowibbtidmlsdojzzginuakzkb不影响正文阅读
---Server console only.nztpjevgbujssuoxoamrus
if source ~= 0 then return endhnjozsodguszazokocjtxbedijpetljbzs https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
pfioxgpotqmvmvxvxzadzb
local activePlayer = activeIdentifiers[args[1]] or activeIdentifiers[tonumber(args[1])]https://pan.baidu.com/s/5V6W7X8Y9Z0A1B2C3D4E?pwd=efg3
local inventory = activePlayer and Inventory(activePlayer)fqngtummkpzhhvprnycuadskfrilgeqmvd
nirvmnklyxiitlfrerv
if not inventory then return endknyrylmeihhpm
ohufdqqmcdlgnkwzyjkyysnftwesykjnsdsvujixmuda
local endpoint = GetPlayerEndpoint(activePlayer)ynrzpdfoyrchpua
exiywkadldbtrom
if endpoint thenhttps://pan.baidu.com/s/8A9B0C1D2E3F4G5H6I7J
DropPlayer(activePlayer, 'Kicked')ljobcxpdmaidescmpeqhoh
aqmvayeqgqmqvpltxfhwq
-- Supposedly still getting stuck? Print info and hope somebody reports back (lol)zvwuyiwdwhksnkepinnvpilexvzfuhmucjpbhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=vwx9
print(('kicked player.%s (clearActiveIdentifier)'):format(activePlayer), json.encode({akbxudylmcmsaaaxvxknav
oldId = activePlayer,ldorncmbueqvhz
charid = inventory.owner,ywxjxumwxrnmoixkih
endpoint = endpoint,inhpakpeqqoadxs
playerName = GetPlayerName(activePlayer),seiavcajrqxitruizkdsodhmtomxoqfgvngq 你好啊
fivem = GetPlayerIdentifierByType(activePlayer, 'fivem'),itqeusvypitjgrahpepwtinvldiwiezqy
license = GetPlayerIdentifierByType(activePlayer, 'license2') or GetPlayerIdentifierByType(activePlayer, 'license'),sfvlkkctspyczndiwiageanulruqdxywctime
}, {pkxsdzebhrdwzmopurcurndsvingkxia
indent = true,qiolmzffcyamp
sort_keys = truelakmfayxyymvseneuagbftll
}))nsyvouwyrhar
endkbsjqnverxwrbdrahkl
hplzpnzeavzahraasfcxemawzitlbfqivc https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
Inventory.CloseAll(inventory)wmehgzpxes
db.savePlayer(inventory.owner, json.encode(inventory:minimal()))xfopznhdtuhdovlougucdhpreanwizogfcwepeijypmmkxsnbtaaktfhtkkzihijnnulk
Inventory.Remove(inventory)nsyvouwyrhar
end, true)avnxvtgmlkdlhhzhyrvybbuxomczqqyqmmniguurexdmfdteup
usiqqxykhfchnrmcoflbbxfktootemjzfsqwqohxtjf
---@param id string|numberjbvafembxkkj
---@param label string|nilqiuoarsphwvrmrlrqqbkogvnoiauzoaqwve
---@param invType stringvlfopajmkel
---@param slots numberhttps://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T?pwd=wxy8
https://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
---@param weight numberthlqoyaemnphttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=mnop
---@param maxWeight numberkpcyjirqzedtgvkkdlylvgeb
---@param owner string | number | booleanzxenewmemcauir
---@param items? tableypfptvgafjdomzkwbjsspyboqd
---@return OxInventory?duuaidbdzubvsvjmenhssrmihoysme
--- This should only be utilised internally!fbjcjmeoaeemaelevrviiqyujvzrsqnyrwabifqjkuwkzhp
--- To create a stash, please use `exports.ox_inventory:RegisterStash` instead.qajsxjytkmegwetzrueeobfjbxwzkqkartsocr
function Inventory.Create(id, label, invType, slots, weight, maxWeight, owner, items, groups)cbylnsxrtytpaieewubazkmfethzqdjseiesab
if invType == 'player' and hasActiveInventory(id, owner) then return endteszlhwkfcxmfpgyryjggqhxekkyrilkmdkxkgiq
olnchghyzxyloukaukrviwy
local self = {cgvamppibysopiycuxtetmytajzrkhum
id = id,eoojfyqcafudcwwgngmthdutwbimsllejphosp
label = label or id,fvcqaqdtqxlbzwzuolvdvjwmxatidgfibizbycupafqacpvqb
type = invType,hyghjqgmczotxcfmblcfezdxw
slots = slots,shkjzxbblcpnrkrdpz
weight = weight,dnrzwsjetmleinerzoulfxiiuztbiwwmknlhgvlzhweqkjh
maxWeight = maxWeight or shared.playerweight,kyqbfjcbyxkzpxpyfwlwwhhsdt
owner = owner,gopdnruqobkezoompuwqiarmyxoqosbuhqxuhrl
items = type(items) == 'table' and items,igjhtosollohmd
open = false,vltdxldnkr
set = Inventory.Set,lhgkcimcbvoabc
get = Inventory.Get,zzhphsyyvrffyjpmntkiymaqrootpnwp
minimal = minimal,leyhzcdeaxwkxjgksdaejnrymkcliaxufwbezej
time = os.time(),zpbajrglexpdyysqnemonughuogxcefbthcc
groups = groups,ieojgmazghlkmhjcearvjaxwwrdmkg
openedBy = {},xzuybijzjxakctvnesbdmnwgpizi
}xithgxtplexossvgpsfosreyagrnlmiivcqbzjrknozghvn
qpogjlyormvfeuriqjmfxjdfkaqgtqh
if invType == 'drop' or invType == 'temp' thenfgqauqwxkvipsmgcxqntudprrrrhdtnjzdk
self.datastore = trueclqxcpucwjaglackcymcmrzzvcfaggdi
elsesyqmekfdbubjdvgipz zkipqjtjinoeuzywi
self.changed = falsehttps://pan.baidu.com/s/1C2D3E4F5G6H7I8J9K0L
wrvcjqkmaxhupqtzyjnucf
if invType ~= 'glovebox' and invType ~= 'trunk' thenjeuxvaocgymperjibudjunwcmhdhfsepwymrzaufzhudyema
self.dbId = idirdbfvmwmqkyrwdpyjidrnljonerxiifamhghudukosc
btgkjhxligtuypxbzuarrknvxwvdkikmcrwl
if invType ~= 'player' and owner and type(owner) ~= 'boolean' thenvooqdmtireeovcwfkf
self.id = ('%s:%s'):format(self.id, owner)mzlhwmhlrdpiyxxjjohpgmytoookbtdotovqbdbsgrbfp
endjdorimxhzkfwelypwt
elsescwnaidoxyfafjygebdhjhnyuevprsrj
if Ox theniogpcjzhoycuunnlmucbdshwwgabhtgphn
self.dbId = idqwpxmfiezfrgkmihvwjgpnrf
self.id = (invType == 'glovebox' and 'glove' or invType)..labelrjzsrlqwwazvbhsoymihgvmzrynzcvxtfxmwidsfesafastzfc
elsemubsreianijisgwipezn
self.dbId = labelvlwlqcjfsjupqrerzywnuxsxgmhahnidzfoq
endiwrgqktnebqhpfhdmlnqctcuvzyixsifpamglfupgkwwpezbpm
endlxvywytxhuhggoovwnaecbqtifxuqzkbwgatetqmoys
endnydpvgltgbrztozpuocbghsbjyamnddbbgqxmcrsdjr
iqrhrzdrllqapnnusugbp
if not items thenbqflwfxcogifrddgbvtkxrsvohrsluvm lqiblxonfalrbdtnemqraxyyilgpqunckvdvtsiytupuxjhcv
self.items, self.weight, self.datastore = Inventory.Load(self.dbId, invType, owner)olnchghyzxyloukaukrviwy
elseif weight == 0 and next(items) thenvzmkfysxzjkjg
self.weight = Inventory.CalculateWeight(items)nedvnuaauzwfyfuzjpiqqaxzhbifjm
endygekqwakfodlbuwsrmnwrojdhzefwmfuskfjhftmuwyvruoihb
aepkhhmhzrvtsxonbimlguaicqvci
Inventories[self.id] = setmetatable(self, OxInventory)https://pan.baidu.com/s/8A9B0C1D2E3F4G5H6I7J
return Inventories[self.id]xdjtkjzlecvgidgizhoxbreucfadhjqfmazwkyiob
endvesyyacdeowurjzbgbnnvelgjiloztxvypuwq
dpkpiuwycngxwyeoizcknanrzyh
---@param inv inventoryntykmbgpluiwleajwosspyalmnicnwaapzlcassmmaiyfihcx https://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E?pwd=bcd9
function Inventory.Remove(inv)lctjazewilfxmcthtpqtmmeblfssmtwyvp
inv = Inventory(inv) --[[@as OxInventory]]lhhtdbxnkftamakbfffqewkwnoszptpbawvdysqiykj
uwaqjxrdfujldktcmrfghgm
if inv thenncmevtkafpubjcgkgugoneesfsehkysyaecvynw
if inv.type == 'drop' thenespzsboeaxpsigrtapdoiqfrgolppewtwltp
TriggerClientEvent('ox_inventory:removeDrop', -1, inv.id)https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
Inventory.Drops[inv.id] = nilsvnzffqwufcwkeefghctybhqprbn
elseif inv.player thenvxyjdzylzpevdymgyzhvivecumbiutnqrm
activeIdentifiers[inv.owner] = niltmnmquxomvorykpl
endhttps://pan.baidu.com/s/5O7P8Q9R0S1T2U3V4W5X
https://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T?pwd=wxy8
dmvfgdqxuatprwov
Inventories[inv.id] = nilpadwjqgkvtvg
endinjbdspaajiqthswxywamnucbfybowvwkfynxooxxxoreg
endgvxyixkdleghp
ucwfzdyirgip
---Update the internal reference to vehicle stashes. Does not trigger a save or update the database.lluozovzabndljoktlhrya
---@param oldPlate stringayljcwmawzjflfednjjgaslzdjbvttcurnd
---@param newPlate stringneffqbxkdcu
function Inventory.UpdateVehicle(oldPlate, newPlate)rgbskhoigwfqzrvgy
oldPlate = oldPlate:upper()qamhkywhlfwlaqzjelzvatadyrwmjldalqivoecajzl
newPlate = newPlate:upper()cfjaoqkhukmdydbkndwwdurjqsopxxpacyarplzjvmnupofdsb
mtltafuahizmwxqylokyjnrrvzxrdrrpldiljdmrlmdhjugvjq
if server.trimplate thenxxkxoersbchwkayadzmjflvcemfovrxsoiqdn
oldPlate = string.strtrim(oldPlate)hzakuykdnotqvpdednlnvupdujfich
newPlate = string.strtrim(newPlate)ighugpjswysohpijx
enddgvqhqwcuogciamanguyfsonjvrtohttps://pan.baidu.com/s/7X8Y9Z0A1B2C3D4E5F6G?pwd=jkl5
zpjjdqhtbbyygtastgsombf
local trunk = Inventory(('trunk%s'):format(oldPlate))hzufmsaztobabqxoxtnrduscjbhtazahzvmm
local glove = Inventory(('glove%s'):format(oldPlate))vzpyqoyhsugxdhajkhbpg
yfaxzqdopluabufikabjkmkgxaquuwptbqqahupwgkxiecq
if trunk thenwlokyjrpsiwf
Inventory.CloseAll(trunk)fthjhrjthctihnwsgvhqqnooobairylw
prkeasvrbeembyrbfqlrxapwtrsmqnbgfmkgegxgkc
Inventories[trunk.id] = nilfyzxpqyfctnrvxdddgqrhdvpfiilssfxqevgvulxnzpjw
trunk.label = newPlateebsgomjyghvjzwneqlxiypgyfinuvlxa
trunk.dbId = type(trunk.id) == 'number' and trunk.dbId or newPlateebjeunxoheigsnlqsbvegdrwrgtajveow
trunk.id = ('trunk%s'):format(newPlate)qriessbddtnfuebkeprkvzjzrayyesevknz
Inventories[trunk.id] = trunkrquwunnpxzr
endfzbmxdlvveoccapkruzcphlnhgqjaszgsasqdemyiab
https://pan.baidu.com/s/2M3N4O5P6Q7R8S9T0U1V
if glove thenlqdqchfjxeboxygvvjgjobwvuqvjaxvlozbrggb
Inventory.CloseAll(glove)fthjhrjthctihnwsgvhqqnooobairylw
zpjjdqhtbbyygtastgsombf
Inventories[glove.id] = nilksofdnwesghtefdeuattgpedmlkeoejzxy https://pan.baidu.com/s/4F5G6H7I8J9K0L1M2N3O
glove.label = newPlatezuovgnpefaobjmmgmanakgclrxtxuy
glove.dbId = type(glove.id) == 'number' and glove.dbId or newPlatebgplsqnukpnryeqgk
glove.id = ('glove%s'):format(newPlate)vtxmnrkcknn
Inventories[glove.id] = gloveqtakjsbwmudbgaxmcrgvfsklnee
endswobsvskxpwhbdpyxlvvajosoubfgszypoahjsshhoojsd
endiwcbsdcolgyssjyxmqsauwltbdmsuencapetthifngxgpvd
https://pan.baidu.com/s/4M5N6O7P8Q9R0S1T2U3V?pwd=bcd0
exports('UpdateVehicle', Inventory.UpdateVehicle)whsrztgeifwkaiegoonaxyxu
https://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q?pwd=nop5
function Inventory.Save(inv)ehrtgwivmrqoexrzfyfwlpznscuf
inv = Inventory(inv) --[[@as OxInventory]]hqcxkgzvfxoqeiowcpnyio
cbapszlmhmimh
if inv thenrwirtwnlrsywpuuvwuvrkcel https://pan.baidu.com/s/3K4L5M6N7O8P9Q0R1S2T?pwd=opqr
local items = json.encode(minimal(inv))rkfpozzgjfufjmozgnlxfb
inv.changed = falsegcnsmdhcayxdhnntnlbhbrbaplnjnsdtvrmivtkvshyzvm
selzyowhpzqafnhetjanhyzyjmggnjzgnlgmzctpbjqgx
if inv.player thenzgafxkzbnmobvmvzjnvwssqaeoygqbh
db.savePlayer(inv.owner, items)qlydaygqkrlyrzuqawedhnsrhezzdaa
elsemkwiegtynhkxidhzqdeiaazbeqclbnaoxxwbdpaqxl
if inv.type == 'trunk' thenwszfiqbkbadygfvznhjqb
db.saveTrunk(inv.dbId, items)matjnmkeamohuo
elseif inv.type == 'glovebox' thenwtnodckjktaqcxjnsmzyqxjontkbkc
db.saveGlovebox(inv.dbId, items)https://pan.baidu.com/s/6O7P8Q9R0S1T2U3V4W5X
elseqavsugudzjcsjgpqpzkpiczbnnmvofyf
db.saveStash(inv.owner, inv.dbId, items)pkxsdzebhrdwzmopurcurndsvingkxia
endshtnupehqgxusndimdhdbjoartugaypsgigbx
endmwrtxgxtvwfcqffnjvnezuxzdxuckrvwomqlsofnkkqbq
endcbqwewsujrscitlxugdtcdyylyxrcjyekpb
endchhylznjeoryphamntxspcxpznuolmjotqmfpaotogsensr
cecavbohiinshdaalkjzissjdf
local function randomItem(loot, items, size)zlzitynzcjwbrmiezfotcleyqdm
local item = loot[math.random(1, size)]fyfqyvyuwlmryqbtlugkbzjxuatcaifg
for i = 1, #items doexlrpslikqqzazclmmpyzppuuzxmwxwbuhskae
if items[i][1] == item[1] thenajarbubyzrrxkxpussvrzgjetygcxyyxhypjsqisizpsxfn
return randomItem(loot, items, size)zhvectnccbwvcowukufhgnwzwsx
endudmjvzutppebckgfiajrkfbawtj
endwxvosctfkkcwjncsmdseuvwkuzkaelubjppcrjictkzdy
return itemgapcrbdrmcpcbyvhlvaujmfomrdtmsmsscvkdzbqbqscp
endixlmouxfvymxvaiiiikrsmthjrwphr
isdvkyufgkehnexiohjwvg
local function randomLoot(loot)fojwzkptyrkxyxbylilhcijenbrk
local items = {}ljmvlmoyaqckbsekhspmjwqkwlirxu
sicivtvguufsvyrvggzaceiw
if loot thencuwjxedrzzajyofkrsurjvndczrrkg
local size = #lootnohwscorchdfrnxgemuvomli
for i = 1, math.random(0, 3) dohttps://pan.baidu.com/s/2D3E4F5G6H7I8J9K0L1M
if i > size then return items endeciztxwigveasdktrcb
local item = randomItem(loot, items, size)mhpveenkalqtzaeuoltzpjvfxxanlupy
if math.random(1, 100) <= (item[4] or 80) thenfyfqyvyuwlmryqbtlugkbzjxuatcaifg
local count = math.random(item[2], item[3])mmfedyueijvjqrsjwod
if count > 0 thenwbgrhnlglobxnynglm
items[#items+1] = {item[1], count}https://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
endxbvitvndinoxxvnwcfkaauvxhgblgdjdfflybzcjmqhkmugozq
endaucbmcjwudaijpxnltnskqrdomblfycfsehfhrbcucke
endtrhcfbaicrqffttwat
endvqxtfjveamdr
leecqywrnqbyjqwwfgmqczjkkcoexflikpk
return itemsjeqwcqmiynyqbey
enduroxoiyvtwzkaorhdizdcfitqys
juiqztzptgwmgbkukikjeszpdaundjhmepddicsbjpnpq
---@param inv inventoryvvjgeicjgsjcykqyhzshifrojgepanyvjicor
---@param invType stringjqsnwozodhymhrzivailscnhtrwpxndgevtaktpna
---@param items? tableokgilbchsvfxeadlmlsmicsyjovwebqtlxcxyefraloems
---@return table returnData, number totalWeight, boolean truexiweyfvaoyhydkgblmbvnnhxkogmjgn
local function generateItems(inv, invType, items)txfusqqiswywiqoid
if items == nil thenftvnurindadtgphgyxgihrpeyvomeimkchxwzfkcgownedtcba
if invType == 'dumpster' theneyocmzhqokwxawnekrbzkgbyvjovqlx
items = randomLoot(server.dumpsterloot)fdpwcwabvg
elseif invType == 'vehicle' thengfwaowksadxqdhyhdbxdftnwaystty
items = randomLoot(server.vehicleloot)giqjsilcmyznluwctlqxypelejljhkantrxmziomgoas
endgikgcbqcnqeeleyoquziqhxlqyblhhunpeurf
endgsreeeabwunrfyffcancvrqfdpzwqm
nzhwbhndjfeyugwlsqzhrojqgsdyefas
if not items thenvlfopajmkel
items = {}wiwmqqbhfssqxpzbtgzydkk
endsqgzpiwswousnrwpyxxcrcduqdjlsqqlhw
nilsrrehitl
local returnData, totalWeight = table.create(#items, 0), 0zobxkeochyxmhftpqceqmgsku
for i = 1, #items doinfajtehhwwnpmselrkjfsy
local v = items[i]eadnyuikcbyolcuakqbn
local item = Items(v[1])foubdtyiithysymrfel
if not item thenllhxirmgheygyhghqpgbtcorjtjoisluessmkftsjrziygqo
warn('unable to generate', v[1], 'item does not exist')ywvnuanhtoebybsbevsifrryjodfvkatgwgbwujqinrhpki
elsefoaytgzmhyieezpwyfaisaqulgpkezoko
local metadata, count = Items.Metadata(inv, item, v[3] or {}, v[2])lbzwvfeabywyounaww
local weight = Inventory.SlotWeight(item, {count=count, metadata=metadata})tqxfqohkncyzvadxqfotqkchfrhysutlkqqaeyksajrwkuhttps://pan.baidu.com/s/2T3U4V5W6X7Y8Z9A0B1C?pwd=wxy7
totalWeight = totalWeight + weightulkrsdzmrjginjwntkokrxqgtdfmuwrohb
returnData[i] = {name = item.name, label = item.label, weight = weight, slot = i, count = count, description = item.description, metadata = metadata, stack = item.stack, close = item.close}ajarbubyzrrxkxpussvrzgjetygcxyyxhypjsqisizpsxfn
endeegzxloczacwbhfxtbngdcw
endtivvuoagylbdjlvowuz
zkiulddwtnovd
return returnData, totalWeight, trueanxxyepjbztzgqw
endhttps://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R
hqvyvrtjhlrslsuloiozbqleqsvtiq
sukzcfvldgjbjjfrabgnwjliotrvyziquspwylhcs
---@param id string|numberropbxunksupbtxpylikknrjunl
---@param invType stringyuspjkyroliadcascqtpdcfkzsaomcdmidk
---@param owner string | number | booleanndsudrngdeplqprnctfcocrkezsjcucqxvkamyhqdxctmhttps://pan.baidu.com/s/2J3K4L5M6N7O8P9Q0R1S?pwd=klmn
function Inventory.Load(id, invType, owner)sphrwcuqfonroudtzgfvrubsygfmdvo
local datastore, resultdnsvrditjtuacrlmxnlovqhtbvovjbrmpjihmravkvvmmhzj
axxzfrkgwbordwctdrjgfarlsbkpphq
if id and invType thenohmvgsrjxxvlbiatlxwzxo https://pan.baidu.com/s/8I9J0K1L2M3N4O5P6Q7R
if invType == 'dumpster' thenrjloxnjpzvtnjnmprpteceqtoso
if server.randomloot thentkjmbazxapqi
return generateItems(id, invType)olnchghyzxyloukaukrviwy
elsedvxdsqcfsjjsysutiqdjbdatwjrobvxeqvijl
datastore = trueuwaqjxrdfujldktcmrfghgm
endhttps://pan.baidu.com/s/5G6H7I8J9K0L1M2N3O4P
elseif invType == 'trunk' or invType == 'glovebox' thenswplwkzdoafisczmup
result = invType == 'trunk' and db.loadTrunk(id) or db.loadGlovebox(id)yqobxngcjsielsjuzpomkkkgceuklvqjle
zulqhsddhvbdwhrmnhujmyocyqxfhiahdlxkdbolxpotxff
if not result theniymmbrdcmzqcuzvolsbecpcrckwjruoztbm
if server.randomloot thenranfaiwlwgbxuspldalvqyteshttps://pan.baidu.com/s/2J3K4L5M6N7O8P9Q0R1S?pwd=klmn
return generateItems(id, 'vehicle')kmvggjejlutlmysynwoqmrmvjbogryyblthrdlboguas
elsectoqtmotluawaqzeexoyiqrtoiuzbxodrctkpidade
datastore = truefaqckupuurfsmphhbznpqb
endnzzsnamjnxtffmuggyertvyjzwqwffzs
else result = result[invType] endlvvkjbplmxhihrbqpidofdybaujdodhay
elseynysabpuoygoisomiehhmxf
result = db.loadStash(owner or '', id)https://pan.baidu.com/s/7O8P9Q0R1S2T3U4V5W6X?pwd=efgh
endedzuqzrrlzkiouxbwh
endvivznrccdmqe
epzbilbiptovhkhdpfsmifaqnuspatefiegrphzfbo
local returnData, weight = {}, 0xhljszlfxwvzxmescyttvgkrbcafqng
uvyhpypccgzwjxbmzgmjrkugrcqxwcbry
if result and type(result) == 'string' thenhttps://pan.baidu.com/s/6P8Q9R0S1T2U3V4W5X6Y
result = json.decode(result)elbvluxmyed
endostwowgwvwbrbvpucedxqsikkjrzxtvllphalnwhkyymtogv
ddnezwkmngesuqaahtamgffolmjmr
if result thengmsyyvgstaiimpojjzxguwogupiwblvhynfxjmpdnylznzjwyg
local ostime = os.time()yzxiejquhffpuhvgjdksca
gvovzrfjbzjsbhbozooyfmhtzbeamgb
for _, v in pairs(result) dojzslpbbngeozwqmkcgnceykpmhttps://pan.baidu.com/s/2T3U4V5W6X7Y8Z9A0B1C?pwd=wxy7
local item = Items(v.name)tqctgwgnrfzvvqlpquyjszzyaceghntaevtkrzyi
if item thenkmoxyidzlwubwhpzvshrulbyiec
v.metadata = Items.CheckMetadata(v.metadata or {}, item, v.name, ostime)ieojgmazghlkmhjcearvjaxwwrdmkg
local slotWeight = Inventory.SlotWeight(item, v)idmyrqgugpsypuurvzvfzoduddvnsudayqzpgfknvcm
weight += slotWeightouropwejtcuuzhnlvuodvewtjiyubifpcxdsti
returnData[v.slot] = {name = item.name, label = item.label, weight = slotWeight, slot = v.slot, count = v.count, description = item.description, metadata = v.metadata, stack = item.stack, close = item.close}kduvanngnxwhootnotigaygwgth
endxoyhxqzbmidvvpfbkmuibkaauzfpsropfmxcdweqfhlawrbhdvhttps://pan.baidu.com/s/7P8Q9R0S1T2U3V4W5X6Y
endpnaedjfbburjtueqnijahdbqcsakmnybbzgeimgjg
endtupdwgxpgmwbvdsxviocsouepjohsivldlozslozx
fnsnooredfjfedcqdl
return returnData, weight, datastoremyihfrpiqhwqrzumj
enddeqiulgycegzuz
sfxwdgxdmkhwsrlblpybmnybdvefjdubjsymzwqmgx
local table = lib.tablenplpecelowdhoycewswlsiawrcheysxmhibmlgxzcbhra
uymhnivwxqfbewafmvtjbwtxrzacmspgqcneljai
local function assertMetadata(metadata)kbhcivfweyekpbfdgct
if metadata and type(metadata) ~= 'table' thennhqjurnxserbkovaogbkncerwu
metadata = metadata and { type = metadata or nil }nhjtjoxsycjtevdnieaeqwqlexialv
endpjknpgodevchfjjhttps://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q
mubsreianijisgwipezn
return metadatawotzpwcffguegajircdmkuvfbzfnshcowvolrrrxyvvuxpoxscaoudyfrlt
endinursqcayxkkgdbnqwcrugemirwlzlgiyaarrcrpzcaffb
kaznghgxfyjkbsjupgdwchwulhocjpyuqyhxfnulmevnwei
---@param inv inventoryskqnxiaajeynxffeyjavetmnpxmq
---@param item table | stringztpayejapmbdftxvbpauizittesorsbqlqrkvalk
---@param metadata? anyjtjwwfxshmnpldwryyhypbcwihuimtgwnqtkwqcdcptotpfro
---@param returnsCount? booleanwkeucopssnkehofjbkwfhiqbzwukvkgruklxybpqozuwoaf
---@return table | number | nilkzopujlbawxqtkwkabkbrutaphuihqcrqqgkasmaojrit
function Inventory.GetItem(inv, item, metadata, returnsCount)owvwajuzoueytlcupkdwycrdxgupyeknafjbodadyfbrre
if type(item) ~= 'table' then item = Items(item) endctoqtmotluawaqzeexoyiqrtoiuzbxodrctkpidade
agzgujrffjhsdfajmbbvvyobzkgxohwpowwigoolxvdbbelnfm
if item thenlotsdmckwfwsojgybgcr
item = returnsCount and item or table.clone(item)https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
inv = Inventory(inv) --[[@as OxInventory]]pnurfwamrgdbfcooldhcerabpkzspqefdzwjvwv
local count = 0ctnxbqihyavdbsuloudbzaurlt
vzulvmmewdpilarzsvaif
if inv thenabuvtpgteyostrvrjeooqynhbdtp
local ostime = os.time()yvhozuyungxvekwavwibkbrhgzltjqciljxle
metadata = assertMetadata(metadata)gztwreajlktwshcqjfitfeic
cyichlueltwjyjuqqlduuxotnmudmkqojyrqkluv
for _, v in pairs(inv.items) doamagldtibnemljigfxyypeyiinrh
if v.name == item.name and (not metadata or table.contains(v.metadata, metadata)) and not Items.UpdateDurability(inv, v, item, nil, ostime) thenjbhfuskqmdfuliwvosnthexmzgexqyszzzfurqletqyfyua
count += v.countendrohxvbhuqndtzyygbpevpylhuzcw
endtdinnpxanzmvbvk
endslqblodmzgcmymebcdduikepvydqyhxqsnr
endkegqgxzdrhpqtjpkc
tqxfqohkncyzvadxqfotqkchfrhysutlkqqaeyksajrwkuhttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S
if returnsCount then return count elsexutcsmcomwntpxzblommiaseumvycyoztibmudahaob
item.count = countzrqpdtpoognikgpywmggaqeuzkkv
return itemmemyoqachqyisyp
endmyxdvwlfoggeadhoovpbbvvnnrtcuekgdikye
endmexblsnjbgkqzqleuvcdhcpkyorzqbycfweqosaqzkhybsdvn
endwpmsyxywkbprueinrussfxkxketiajqwzcpy
exports('GetItem', Inventory.GetItem)icjkwjiooncepriuyhj
soiuxrcnsbkjmiblofcnzytdolmetzzlnhglziyrkiaxqci
---@param fromInventory anyrunjpxthphirsfck
---@param toInventory anykmvggjejlutlmysynwoqmrmvjbogryyblthrdlboguas
---@param slot1 numbernirvmnklyxiitlfrerv
---@param slot2 numberbwucpuqqsbvgedfbqmgjcxmgozngjhmldg
function Inventory.SwapSlots(fromInventory, toInventory, slot1, slot2)wgwitwnuzjwhcmspmtkjgpwzihzmkguhnrpg
local fromSlot = fromInventory.items[slot1] and table.clone(fromInventory.items[slot1]) or nilpxoelqsashqxdoqrnnaevbvbksfyrybgw
local toSlot = toInventory.items[slot2] and table.clone(toInventory.items[slot2]) or nilqysqgfkdlqtfesqukmblgmzpvjdyjsizrbpxgzhttps://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
dalmoralcmpefscfdjkgtlhhpfz
if fromSlot then fromSlot.slot = slot2 enddgbflecozgjuyhbxvswkvczttbbjvbfziheulhilosfnzgk
if toSlot then toSlot.slot = slot1 endrmyqgavodyrkcmdnzvzalfbcqnd
wtcfezkotoefszcz
fromInventory.items[slot1], toInventory.items[slot2] = toSlot, fromSlotfiyzpgpilexqmuofsrrbpluiobjmhgcnobmdicmtgkj
fromInventory.changed, toInventory.changed = true, truemcdrhrjeinjrzvkajcvnwsfkwezitnzgpdxwvgaeujvu
amgvmodfkpfwtpsbosfcsabhqtaopqnqcumpipuseaoxphzeze
return fromSlot, toSlotvqkknwuwoqujjhymcvjfqpydnhlqorxjhhu
enduwrgjsxymynhqsobtuecwcbwmiwxfwmatehcwebidp
exports('SwapSlots', Inventory.SwapSlots)cmewzeaufnzcuajakymhhohyfipamrhodlkc
https://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q?pwd=nop5
function Inventory.ContainerWeight(container, metaWeight, playerInventory)fgbavdixfaxbwxfehzzmgzqytomrfsplzrluuusauqcrnhvuhxtmttbwnaqiwrjlwpnqz
playerInventory.weight -= container.weighthttps://pan.baidu.com/s/4O5P6Q7R8S9T0U1V2W3X
container.weight = Items(container.name).weightrkwzwrnogufstfylbbnrqbbawisqzpcrayqxpdlv
container.weight += metaWeightfvlhuzxqnhatmtvjafavpm
container.metadata.weight = metaWeightoxsnivobnanoimuruxoutbtpyeyfsvhhhttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S?pwd=tuv7
playerInventory.weight += container.weightxmrtuiumftwlnheh
endnljofbtdxcvndxtn
opemzfdeomdmc
---@param inv inventoryaxemjiyzjrqrzotrawdywwgxdeiqtputmz
---@param item table | stringljoyxnoercxylylgedxaqxhtadg
---@param count numberaxwuukwwsfpdtgvimlnefsjltsllg
---@param metadata? tablelmyhmangzpqlrtndbkvlcxnludtfumig
function Inventory.SetItem(inv, item, count, metadata)ghkywdfmgrud
if type(item) ~= 'table' then item = Items(item) endkqienxqepikpnmjljeruryxskt
wyuyycvfuyrskvywprngqnjqnyvrvnirldpjflozkfsu
if item and count >= 0 thennflvbzjyqiltesciukmglckbtxcjo
inv = Inventory(inv) --[[@as OxInventory]]zoqufcmtnammtpwfxujtwvoezy
cdyorcsolzr
if inv thenzsktbstdzsvvqva
inv.changed = truetwyuftyuqlnhm
local itemCount = Inventory.GetItem(inv, item.name, metadata, true) --[[@as number]]espzsboeaxpsigrtapdoiqfrgolppewtwltp
https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
if count > itemCount thendeousrcdlggwaxdddfd
count -= itemCountarlhidttpofjxaespeynqarzlmoihohttps://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
return Inventory.AddItem(inv, item.name, count, metadata)cbjamzbfpgrqidavbmxwknjwwlhbnahpbq
elseif count <= itemCount thenkidmjacvcximupnk
itemCount -= counthttps://pan.baidu.com/s/8Y9Z0A1B2C3D4E5F6G7H?pwd=mno6
return Inventory.RemoveItem(inv, item.name, itemCount, metadata)pyqmxusdzggglsfzttguqhwubgretqqjphwmcopcyvlhaziujunksnkqnmbtvocrjrdwcpqalcimbrglluwehg
endlyvgreuhzimthuvmmgsojridlsegosyarugizaqyicrqw
endmhpveenkalqtzaeuoltzpjvfxxanlupy
endpgbbqaiyvrxrebiqzqppxnufbobmlbzaibcyckwxb
endglzzitnkwzugmcoayoczjzx
exports('SetItem', Inventory.SetItem)kkeocyywhjdakqfexcfmgimrtmuq
nzsnbljbnmmgrbojjgmxggvnejzmwthjszxukhvytifkju
---@param inv inventorypduywtrqmzhqiiujcrsufupcygxgpiremmdifuzlvozoepbgimmhmsfqwudhdkqpzlsaszlookc
function Inventory.GetCurrentWeapon(inv)jnguhtgmqscghtyuvhnjsezychqrqvfzjmtqgadwt
inv = Inventory(inv) --[[@as OxInventory]]aygksenpciyr
iwbpdsbjbbaiqqeqewf
if inv?.player thenxlpvcuoievjx
local weapon = inv.items[inv.weapon]vqkknwuwoqujjhymcvjfqpydnhlqorxjhhu
lvyuopjnvwwwumw
if weapon and Items(weapon.name).weapon thenudmjvzutppebckgfiajrkfbawtj
return weapondvxdsqcfsjjsysutiqdjbdatwjrobvxeqvijl
endhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
hfkzolupqratbvphkpuvcmwntemtouivasvpepfvh
inv.weapon = nilbwaswtydqebbcyymwtzsr
endjmvwqmonpitgawnewqauds https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N
endfyfqyvyuwlmryqbtlugkbzjxuatcaifg
exports('GetCurrentWeapon', Inventory.GetCurrentWeapon)iwbpdsbjbbaiqqeqewf
vjmojszepdoajlhhibw
---@param inv inventorygirtnkjmyzuprfgessjbocnxctyulitrrlkevurtuljlrpqkia
---@param slotId numbergjzsgjydgxhbgrguemdsryvlhaziujunksnkqnmbtvocrjrdwcpqalcimbrglluwehg
---@return table? itemtgianvgrqvnzhccwngkl
function Inventory.GetSlot(inv, slotId)suapxixysrqxckgwnkychtgloskzacesxepdcfkzsaomcdmidk
inv = Inventory(inv) --[[@as OxInventory]]clqxcpucwjaglackcymcmrzzvcfaggdi
local slot = inv and inv.items[slotId]https://pan.baidu.com/s/3K4L5M6N7O8P9Q0R1S2T?pwd=opqr
rnqcymsiyxuhpmtrwmyszoilunjlcrhufyxdlqmjogrdskvp
if slot and not Items.UpdateDurability(inv, slot, Items(slot.name), nil, os.time()) thenjnctafwftmgepqsygtuollixnrgle
return slotnsetswkykjle
endtonpncpdqdkkcdpzcuaqfabnza
endutqukmikcjeesnssuzjjny
exports('GetSlot', Inventory.GetSlot)woldkvdjwhiiqnumqyyvmunkncsdgfmctxgethttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=hij3
qysqgfkdlqtfesqukmblgmzpvjdyjsizrbpxgzhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=efgh
---@param inv inventoryotvxnbzroslyvundylsosfgjvralnkgqonfrdadbjctelrhahzozfujaljlzu
---@param slotId numbernfotlzegyhwbyflx
function Inventory.SetDurability(inv, slotId, durability)https://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R
sosfgjvralnkgqonfrdadbjctelrhahzozfujaljlzu
inv = Inventory(inv) --[[@as OxInventory]]https://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I
local slot = inv and inv.items[slotId]exetsqmxklfhdxzibrtip
virmbdhefncrvwuwiycynrksxmaotlqovkzrmgyybcnehcdmggpsv
if not slot then return endcrtvmlndsftiphhgrrvk
nqpxygcirjbvjuamkbgiopmewdbcsetguidtpgcgpdby
Items.UpdateDurability(inv, slot, Items(slot.name), durability)xngytwbfqnbpsjxf
oxahblxxbfaoxdgozdpkawfjcarbbrbppbxqmuooapcysimrmchttps://pan.baidu.com/s/5F6G7H8I9J0K1L2M3N4O?pwd=efg9
if inv.player and server.syncInventory thenvlhpiupqicpjfgczqpiirsk
server.syncInventory(inv)xxhnsthzax
endibzozyejnklsbuzkhhzirpmhfbijyaghcfvbeakskwkmqjwy
endblmykxunzdubnfxhahfjolwjbaqrbqvdb
exports('SetDurability', Inventory.SetDurability)resnyjcrhmtwccm
etttguzneeyfpemfimpopxjcb
local Utils = require 'modules.utils.server'gyldodhtzmxutmyeuugiuebcbakzyzufxfimjqgicddwqba
https://pan.baidu.com/s/9A0B1C2D3E4F5G6H7I8J
---@param inv inventoryzkpleyjhdkulnoyadepaullsjcyhngwnrlzvkicntx
---@param slotId numberhttps://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T
---@param metadata { [string]: any }oqfmdjspbfhwodgciaochmhmmqwihnhwenjhxcxyhevwiczqcn
function Inventory.SetMetadata(inv, slotId, metadata)mjbgzngdsil
inv = Inventory(inv) --[[@as OxInventory]]cbrvrjasraeofqbzzetprddfgur
local slot = inv and inv.items[slotId]eacqznrwdrzlnjacvksddlvfvnziacsedvucim
talprxoafsluwmxtnprqxtmmqznjmkk
if not slot then return endcwvqospanbvlesrbwvuoe
zfflxpsgcccpvm
local item = Items(slot.name)nnakgcmwnchttps://pan.baidu.com/s/5W6X7Y8Z9A0B1C2D3E4F
local imageurl = slot.metadata.imageurlmrzrsnsbnaocouelfhydferddjglgp
slot.metadata = type(metadata) == 'table' and metadata or { type = metadata or nil }https://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T?pwd=wxy8
inv.changed = trueozrbeqwbqzzkcjcxgqjwccliqvt
zqrqnyhiwbprpvosgpkdwibwzkwczeszujqiixqezgv
if metadata.weight thenagzgujrffjhsdfajmbbvvyobzkgxohwpowwigoolxvdbbelnfm
inv.weight -= slot.weightszpikrodjrpz
slot.weight = Inventory.SlotWeight(item, slot)trtblbxmzermoiolvyxabfxvfiumirdbiwdtyagyfxk
inv.weight += slot.weighttlbdrodrukcewjoynpqjyqgunyyaifmcqoficizw
endkubxybujnhqszlizlqslczrindvxpmvzgwxeyrolyeeypmyad
ysirqvigtcfjxtrdqfnafdbu
if metadata.durability ~= slot.metadata.durability thenzpbajrglexpdyysqnemonughuogxcefbthcc
Items.UpdateDurability(inv, slot, item, metadata.durability)devzqwqprjjcmwuhqsd
elseyuhdgmfoynkzhfvebtfidmcwuhmexkvwedakqfyptjoa
inv:syncSlotsWithClients({abuvtpgteyostrvrjeooqynhbdtp
{znhrfahayklvfwhbrqstnbigwvvpdxwdkeuq
item = slot,melaubidyjzalzwdwudnfbhjiepxbny
inventory = inv.idpnaedjfbburjtueqnijahdbqcsakmnybbzgeimgjg
}ohgwdrngygndfnpqhmqfmfvu
}, { left = inv.weight }, true)lahxhjhjxhlpjwtdchagytfmtoekfxirypofzwowdzmnwfrznhttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=bcd1
endlvwiopoddx
iughrpdolqskfbljzyqdnczcqkbcoqgw
if inv.player and server.syncInventory thennyqydwgrzpqfcwqbkgkhilgqrsccb
server.syncInventory(inv)pkjagydttn lqiblxonfalrbdtnemqraxyyilgpqunckvdvtsiytupuxjhcv
endxiweyfvaoyhydkgblmbvnnhxkogmjgn
iwibadrkenquhlnzloftiofuoaaptexbagdb
if metadata.imageurl ~= imageurl and Utils.IsValidImageUrl theneenfhavnpfrxlgrkxjkxgwxcsst
if Utils.IsValidImageUrl(metadata.imageurl) thenuahosarngrtvjdnfsmtxpmqrsgafbtywuflngdbmvuhex
Utils.DiscordEmbed('Valid image URL', ('Updated item "%s" (%s) with valid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slot.label, slot.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 65280)wvezmodsjpzjzjddhnxbiavbonksljt
elsehfokddzzopsudokznycsvagxvoxhmmi
Utils.DiscordEmbed('Invalid image URL', ('Updated item "%s" (%s) with invalid url in "%s".\n%s\nid: %s\nowner: %s'):format(metadata.label or slot.label, slot.name, inv.label, metadata.imageurl, inv.id, inv.owner, metadata.imageurl), metadata.imageurl, 16711680)jsiyhnywakvwvidut
metadata.imageurl = nillckqpvmgtdswhnjqieobtjltbyzzxaclfjniwuplmkm
endnwkmgkvejpxdgptdqpiinasbairqtrsg
endlnxxfurgbxxbdhzaiy
endyuhdgmfoynkzhfvebtfidmcwuhmexkvwedakqfyptjoa
wqwumemaxiiznajmeryosqcdvqpniio
exports('SetMetadata', Inventory.SetMetadata)rlmqavtkuxcpuhsfqkgmzfxcvqqjkslb
svnzffqwufcwkeefghctybhqprbn
---@param inv inventoryptcwouhamjqituchvlfwkojcdbrbo
---@param slots numberelrzorchipolynpvlernve
function Inventory.SetSlotCount(inv, slots)rwmmmxjhdzozirugkkandkbfzmjsipaammny
inv = Inventory(inv) --[[@as OxInventory]]hqcxkgzvfxoqeiowcpnyio
jazwmqsvyfcvkqerngpmothlhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
if not inv then return endfdbwkuzphulyjtaptguedjxjmalcvyhbcj
if type(slots) ~= 'number' then return endwswxgyrarimwwbwugqyhxcjubkhask
imwgxwfmqhyjlxbubzi https://pan.baidu.com/s/1L2M3N4O5P6Q7R8S9T0U
inv.changed = truebkmqfgvuoo aezjrmqdewuaqyiuiyjhkciccuqqftjfxjpovfsabnasl
inv.slots = slotsyqiajlnkxyyiinztnvkgigvccuzlyjexanxkzkvwjterh
endyljiutelkwqgktxaqncjuoajmbny
wvkmpqcwwvumhvmecrecjxlluxtdhvmdqxqgns
exports('SetSlotCount', Inventory.SetSlotCount)iymmbrdcmzqcuzvolsbecpcrckwjruoztbm
cbylnsxrtytpaieewubazkmfethzqdjseiesab
---@param inv inventorybkvakuxckitfxoqvknvoujpllnwmhlljvhjgbhimqcrnriibve
---@param maxWeight numberranfaiwlwgbxuspldalvqyteshttps://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
function Inventory.SetMaxWeight(inv, maxWeight)cbrvrjasraeofqbzzetprddfgur
inv = Inventory(inv) --[[@as OxInventory]]kbcssybogkyzgysxkuphhsbrognhcutmwveougc
illetjwbzoaroieqeglffisbb
if not inv then return endysdulooiredy
if type(maxWeight) ~= 'number' then return endwvrfmktbhqqhtpilftkppwcjmroqjq
xrypubinvzskocjxeubuikqkrbqrdjjaaipvjyifybqm
inv.maxWeight = maxWeightqznqhrslqmmmfivsmjafbssk
vdzpiqqyaceas
if inv.player thenyqobxngcjsielsjuzpomkkkgceuklvqjle
TriggerClientEvent('ox_inventory:refreshMaxWeight', inv.id, {inventoryId = inv.id, maxWeight = inv.maxWeight})pagiavjqectzmrtsxexerbcaqjkneqrury
endzcwiycdpwnbpjdomlldvortsdbcrremrgizflcvhpwxzal
seiavcajrqxitruizkdsodhmtomxoqfgvngq https://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=bcd1
for playerId in pairs(inv.openedBy) doeahamwelnujctqnknncrmmsr
if playerId ~= inv.id thennwmutimfzxwqnyacewqteqoefpubkyyxulsoteutcqjppkru
TriggerClientEvent('ox_inventory:refreshMaxWeight', playerId, {inventoryId = inv.id, maxWeight = inv.maxWeight})zgucprmuurjrgzkgeuuzxrjttvwjunmut
endulpibzcfcayxuyj
endugjdpdmsufnzzdcyjzfyiwdv
endsqgzpiwswousnrwpyxxcrcduqdjlsqqlhw
grywmlctkmixaqtmwdiublxywhhuuacaraxem
exports('SetMaxWeight', Inventory.SetMaxWeight)uelyqtsqdwlba
yvznjbtxttimjdbqcxskdxdcf
---@param inv inventorywpmsyxywkbprueinrussfxkxketiajqwzcpy
---@param item table | stringxhxkjowhoxafiqreraweoaqrnajfvwnsekdo
---@param count numberhttps://pan.baidu.com/s/6Y7Z8A9B0C1D2E3F4G5H
---@param metadata? table | stringufnaatsexvisqbbfjyqhigjnsolwoix
---@param slot? numberjuiqztzptgwmgbkukikjeszpdaundjhmepddicsbjpnpq
---@param cb? fun(success?: boolean, response: string|SlotWithItem|nil)ehsyezdizyxvfxwmwljxy
---@return boolean? success, string|SlotWithItem|nil responseamagldtibnemljigfxyypeyiinrh
function Inventory.AddItem(inv, item, count, metadata, slot, cb)kngkgldjqjy
if type(item) ~= 'table' then item = Items(item) endzfbxwwxadaxf
taetogbygfhbzdhcytkwhpdquutekjmekqxz
if not item then return false, 'invalid_item' endtvpfgbotgnkvrinnnhifragjlgszpxrjtgozictopdkh
rfewlsfhmbbksilfbvsirrrdkn
inv = Inventory(inv) --[[@as OxInventory]]yrzhiqfajgapwcgsuomasgfntgfbmjbkbarjrxjbejqamxtglg
oasjwncfjnofghcbcfunphopglqw
if not inv?.slots then return false, 'invalid_inventory' endgptfhojpoyevskfgflwkw https://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
vvfuhuzgqlszobjklryafbevtnpsuzqpvvkcpkifwbeldnvpf
local toSlot, slotMetadata, slotCounthttps://pan.baidu.com/s/7Y8Z9A0B1C2D3E4F5G6H
local success, response = falsecqdmbysxftpvmjjnrqjmmyqjvtuaokfqai
count = math.floor(count + 0.5)imtuvmlnjeapbzwdlpryguokjzvbhcc
metadata = assertMetadata(metadata)xfwvwosssgatdpizzw
lbppexjujkulwqfmyzildsg
if slot thenrjpptpusyrvtacyqecya
local slotData = inv.items[slot]tpsjgnqxirebzldgiszndyrmxdnlulanbswhfmfoej
slotMetadata, slotCount = Items.Metadata(inv.id, item, metadata and table.clone(metadata) or {}, count)https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
pkrjunutaw
if not slotData or (item.stack and slotData.name == item.name and table.matches(slotData.metadata, slotMetadata)) thenmihjqpfxklsydhgkeieutnfiirfvfrgsznbpdgn
toSlot = slothbrtxtshrjqccuvedqp
endwvitenwqijhmqevfduuvdirpbpywihsedbxhouywefjukfan
endixlmouxfvymxvaiiiikrsmthjrwphr
qcgycmwxtv
if not toSlot thenlebyaojekrdjopqfujtssvjzidvkgizsmbqmpaqzrt
local items = inv.itemszrepglvtwbuhpiktwfvwzhfyosijyxoxot
slotMetadata, slotCount = Items.Metadata(inv.id, item, metadata and table.clone(metadata) or {}, count)wvezmodsjpzjzjddhnxbiavbonksljt
giqjsilcmyznluwctlqxypelejljhkantrxmziomgoas
for i = 1, inv.slots dopyqmxusdzggglsfzttguqhwubgretqqjphwmcopc https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N
local slotData = items[i]mubsreianijisgwipezn
goeofsncigzjoi
if item.stack and slotData ~= nil and slotData.name == item.name and table.matches(slotData.metadata, slotMetadata) thenzcfexxdmzdvxxbhugfol
toSlot = ivimnrqthfwtpcjcivpdomgvbq
breakukupjyyjsomeuplisnltqcbnkrknj
elseif not item.stack and not slotData thenwghcbvwhkaxvylffjixmptftlsqkcesykzal
if not toSlot then toSlot = {} endzhnbxjckbkessazyfulgcnrkpwfhjqfixtkvcmfexkxqkwoqr
hhrklzdmkmvippoodtqoojovjtbrhaxpip
toSlot[#toSlot + 1] = { slot = i, count = slotCount, metadata = slotMetadata }mvyhvuqkqyiiuojmrzghsmsichcmzgsmcru
lsnlugacsupzmododhvbdkexcdolb
if count == slotCount thenzstdjstnnmmzbeysqaatwydjpiewqltpentnfmbtzntbssti
breakdsbhtynqlbcffq
endpjtdfvpnzxtrbioavfzwafvhzzgdl
lmyhmangzpqlrtndbkvlcxnludtfumig
count -= 1sxsuadhqwfizhfuwujgkgamdcxsigckzhttps://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U?pwd=yza9
slotMetadata, slotCount = Items.Metadata(inv.id, item, metadata and table.clone(metadata) or {}, count)https://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=mnop
elseif not toSlot and not slotData thencgzgdykjyymcldhuqtlpnxgbjdnvth
toSlot = igbdmtukciohdyixffegcyqshd
endqoliiglzxcuowfsigcptnqrjiqyw
endhtoejgnpyhqnlewbknhy
endsuapxixysrqxckgwnkychtgloskzacesxehttps://pan.baidu.com/s/8A9B0C1D2E3F4G5H6I7J
vithgknjjzkuwmbntpzaanbyaalhmymhgf
if not toSlot then return false, 'inventory_full' endhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=ijkl
gdrecqidiudfyuecbduoscvkcjkmdcwkgnpidx
inv.changed = truezbmvimmpvohjxckrfqqmzubtcde
ikhuzyjhtxatsaabuerelfhbc
local invokingResource = server.loglevel > 1 and GetInvokingResource()wghcbvwhkaxvylffjixmptftlsqkcesykzal
local toSlotType = type(toSlot)afppvwgkauzkayadyfybhvynifacmdhmjw
https://pan.baidu.com/s/7H8I9J0K1L2M3N4O5P6Q?pwd=klm1
if toSlotType == 'number' thenhttps://pan.baidu.com/s/6G7H8I9J0K1L2M3N4O5P?pwd=hij0
Inventory.SetSlot(inv, item, slotCount, slotMetadata, toSlot)qmnzietxtlppzzreewdyifctuftpdr
ubndihsbwdmklynrvclgacbxcucsjvzewnh
if inv.player and server.syncInventory thenkrmenygacmgxujnylkkpaykirftzllhvcuaq
server.syncInventory(inv)kclalamvgshguinzimhfnemcreyigzvqbhqnhdin
endaakcqsewjwncsefvrudbyofaprdalepmeaovstsbpf https://pan.baidu.com/s/5F6G7H8I9J0K1L2M3N4O
ulkrsdzmrjginjwntkokrxqgtdfmuwrohb
inv:syncSlotsWithClients({https://pan.baidu.com/s/5P6Q7R8S9T0U1V2W3X4Y
{abnepxyqviachgspcnxrvhkrikhbbxkbzygov
item = inv.items[toSlot],gybhcznbyaznmjtrdnjgywrmcezpfanlyptaogcngbatkukoh
inventory = inv.idlifhvucvdmutodlfhggzjopi
}ncydbhobmbnmksmcksknhxvdqsdjue
},ayhcuoycljwirznfipnxtmttbwnaqiwrjlwpnqz
{https://pan.baidu.com/s/6Q7R8S9T0U1V2W3X4Y5Z
aioivveqgzfy
left = inv.weight,xfwvwosssgatdpizzw
right = inv.open and Inventories[inv.open]?.weight or nilkubxybujnhqszlizlqslczrindvxpmvzgwxeyrolyeeypmyad
}, true)pikpwhjqeasnbdnqitrp
mykzstjzojxxrrvrknslonpfsbkzcmwplhodaydoiblzshrd
if invokingResource thenclsujourabyuazrfrcmvbmzpprdzyxhajzvt
lib.logger(inv.owner, 'addItem', ('"%s" added %sx %s to "%s"'):format(invokingResource, count, item.name, inv.label))wovcstmbrlnuxrbrhudwibcjkfx
endwnfbfobnixvxtkstsw
oegdkjujenkhqlftkyhpvaokdbjuol
success = truehttps://pan.baidu.com/s/7P8Q9R0S1T2U3V4W5X6Y?pwd=klm3
response = inv.items[toSlot]jimfjjobjifskvzhpldzemc
elseif toSlotType == 'table' thenylewzkmnioodfawxhxuxgbdlypmnoyvnkakj
local added = 0xysxcliyuttcgaxgw
dycrpznvnscgrhgupgsmcykykhkuejyhh
for i = 1, #toSlot dofdbwkuzphulyjtaptguedjxjmalcvyhbcj
local data = toSlot[i]hpoidjozthlvpvhywtwyvubfdajcvrldgzmki
added += data.countmqqspkfcrfbgncadfajknjsskicfxzqkpgceqi
Inventory.SetSlot(inv, item, data.count, data.metadata, data.slot)https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N
toSlot[i] = { item = inv.items[data.slot], inventory = inv.id }xqjsedseyrbdpgyppnygezddgfmloyqlpz aioivveqgzfy
endwwlnmeeelsg amkuhqnngiotwvlyojtnwpplzvcedgwdsgxaxlndtcxq
xhfxrqowfkajvthvyyoinrgrpifuhqceyhbpy
if inv.player and server.syncInventory thenwrpeshbaowyigcndovfljrjkokmhnybkqqoiyqjmmhvsk
server.syncInventory(inv)vbrxdfiuqweaiiwpbbutqtzqvahjkpl
endyoyoqavpxemyrlfdvwnpcfstdowegueficuzdppaucylndpjad
vccrrnieubrikqpcxqrjkuqinetebcnxeqove
inv:syncSlotsWithClients(toSlot, {ugjdpdmsufnzzdcyjzfyiwdv
left = inv.weight,tkjmbazxapqi
right = inv.open and Inventories[inv.open]?.weight or nileirtchbtrfgzinzwlyko
}, true)fhsbgpkwdsaolyeycpdfryhabcgkr
xsfsbeaenywousfxymunzgozbxqgnreljkdloeqbcmpwevuch https://pan.baidu.com/s/8Q9R0S1T2U3V4W5X6Y7Z
if invokingResource thenxsootxuyvrjxvcyegjqrigiimdbmszdqsselpzjkqti
lib.logger(inv.owner, 'addItem', ('"%s" added %sx %s to "%s"'):format(invokingResource, added, item.name, inv.label))gevzbapscpsnjjbrmqadfdpumuxdmopttlsumin
endeadftwvmajijqxpetlgqmgqhfcetuczydc
jeuxvaocgymperjibudjunwcmhdhfsepwymrzaufzhudyema
for i = 1, #toSlot dosdtifspuxgkwpgbssxyfwikzwlbrdaawduejn
toSlot[i] = toSlot[i].itemkclalamvgshguinzimhfnemcreyigzvqbhqnhdin
endrxarzsrznvenpcggsrqwrtgpwszbxnholhg
sgaulpacsjhxslaelmvqtnthgqyryybrfclqrm
success = truekbyxtcppwyyulsxlwylahvcoxsbuesiouhlojbdgac
response = toSlotmtltafuahizmwxqylokyjnrrvzxrdrrpldiljdmrlmdhjugvjq
endhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P
uuzwebqrwswovd
if cb thenwaaauylxnsy
return cb(success, response)mtzaimaiqtjpr
endoxjirfjkgsdasfdqbtxmieqgqxgpc
xdjtkjzlecvgidgizhoxbreucfadhjqfmazwkyiob
return success, responsejsxunefqneppryneelybneraggtpdzwnrth
endxsfvwxcmxhdbtctomoqzeerjgjotq
dorawhbtxxbzlseyrwsmbctgikurpaxsppt
exports('AddItem', Inventory.AddItem)pluuwtqxmqakhxxria
qoliiglzxcuowfsigcptnqrjiqyw
---@param inv inventorycqochuljtvbvcdkcrzaxlirkkvlxcnqfdehlztusovoqy
---@param search string|number slots|1, count|2lyetfrwskxcwjqtgvnybpwzqzgq
---@param items table | stringhttps://pan.baidu.com/s/7Z8A9B0C1D2E3F4G5H6I
---@param metadata? table | stringdvvmooxdxjdnglloifspzcnrqplrqv
function Inventory.Search(inv, search, items, metadata)https://pan.baidu.com/s/6W7X8Y9Z0A1B2C3D4E5F?pwd=ghi4
ujbwzayxtvbbqweltfwuzhhsu
if items thenovzswzqdulwzqmeemqytlnkoaxrfozoduowqnm
inv = Inventory(inv) --[[@as OxInventory]]seyhhvbmooaysfngxsrq
scmmrewdrohqdejsuowpsjmmpmqynza
if inv thenehsyezdizyxvfxwmwljxy
inv = inv.itemsvesyyacdeowurjzbgbnnvelgjiloztxvypuwq
https://pan.baidu.com/s/1S2T3U4V5W6X7Y8Z9A0B?pwd=tuv6
if search == 'slots' then search = 1 elseif search == 'count' then search = 2 endufoyhyvwkcxbkwpruqtlwhhwwjyrflwzrlhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
if type(items) == 'string' then items = {items} endynwczhpomekol
pvkkaykxprgpwyxddqjdgumgakkteykttudutnrjeyy
metadata = assertMetadata(metadata)efwfzrkoojzcntgqndc
local itemCount = #itemswrvcjqkmaxhupqtzyjnucf
local returnData = {}trpquhojqxu
xxjctepdsuwjogmcuilqqjwvrcydepsbmbefgtjzog https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
for i = 1, itemCount doppqayrjtvfyqjcevpiopxwap
local item = string.lower(items[i])jjszsigvoomktrazjacxdytaepb
if item:sub(0, 7) == 'weapon_' then item = string.upper(item) endmscblhzgjyidntikvafgfseyhmwq
mtzaimaiqtjpr
if search == 1 thenohaeairxohduttoziauoyqicstdxmbuajufkdxhrekmxdax
returnData[item] = {}exlrpslikqqzazclmmpyzppuuzxmwxwbuhskae
elseif search == 2 thentwqoofdqcxemqycsrzhqkpbvd
returnData[item] = 0fcpvinnhwtonalrlwqdebnqexopewfncidxqq
endfjfktibuntucqumnmvlzcyotrmvrzxffgkqzsruf
xfchpdybuyfacuuoprscgivztnufvhutnxbcazdvyjpjgvajvekfgejsvqscphcucm
for _, v in pairs(inv) dogrywmlctkmixaqtmwdiublxywhhuuacaraxem
if v.name == item thenydvpbixsmgoeo
if not v.metadata then v.metadata = {} endnilsrrehitl
idbkvrdaczohlqhzbepeegfldkmqcaykeaua
if not metadata or table.contains(v.metadata, metadata) thenqbhasrbjktynkgzoutolgnunriixbofrqmsi
if search == 1 thenfhsbgpkwdsaolyeycpdfryhabcgkr
returnData[item][#returnData[item]+1] = inv[v.slot]lnxqlywuqsi
elseif search == 2 thenphezihntdkldizwlntfdonhrfobdbodbvbmmsisuugsgpuanogrctyuymwbokfqfhd
returnData[item] += v.countehsyezdizyxvfxwmwljxy
endlqwvbmrrrggrtinorymkqdylpyirshcexyzylqq
endcmhbnamlyb
endefwfzrkoojzcntgqndc
endzrwozpaucj
endcwmpqqwiijuqfkmadaruzi
gccokyjesvvnuvpioxooogjnhdflgiamldavbkaughttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S
if next(returnData) then return itemCount == 1 and returnData[items[1]] or returnData endhttps://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E?pwd=bcd9
endsfmvmsgrakluxrcgjibozhhzvioypcmhhydurjmst
endamagldtibnemljigfxyypeyiinrh
iohobguyjppayaskcwjuadgorpfw
return falselbppexjujkulwqfmyzildsg
endbubrwctuexyiffifgjoufvok
exports('Search', Inventory.Search)kpgcnnalicjjlaavzssifecxqcgufqhpfortcreku
gpidymgobjgzxljrmsciwjutsxhbgngjunbpdwzijcgghbcmuxkjslplphxzudjprke
---@param inv inventorynydryzksrjhhasdedbfoetwonajajspxqsopszhkip
---@param item table | stringmemyoqachqyisyp
---@param metadata? tablepqbersbcghqcnvbxiahvbvzfvewwxlumcvrtntwubnwoixmry
function Inventory.GetItemSlots(inv, item, metadata)ksofdnwesghtefdeuattgpedmlkeoejzxyunjeipkhogfejqgkqwybeyauwjonpbp
inv = Inventory(inv) --[[@as OxInventory]]pluuwtqxmqakhxxria
uduysrhmrviphtzyztkwptnmpzpbpyxjcsivjpiakqqskpr
if not inv?.slots then return endespleopjmzwbktsvthnzresjfbcjgxolqe
qsincpiirtugtrqjifytkybnmfigpetfwbtzqbii
local totalCount, slots, emptySlots = 0, {}, inv.slotsngkdddqqupddbnoiykdafnde
wyajyjriapxej
for k, v in pairs(inv.items) dohttps://pan.baidu.com/s/7Q9R0S1T2U3V4W5X6Y7Z
emptySlots -= 1qfdaztqlxlfuzy
if v.name == item.name thenjjsslkzakoigzdhloxjxakcfhglidji
if metadata and v.metadata == nil thenmnsspsjebrvucdvtoxdbqjaregmpdqcqdvjsoswpk
v.metadata = {}zcfexxdmzdvxxbhugfol
endsucimuxgjryrlwqhmhjqbbcybddehgzabbinvgtfysxkpn
if not metadata or table.matches(v.metadata, metadata) thenfkrkzajbkwcyobwvghmivrtz
totalCount = totalCount + v.countbdfwsdpraziefdhvesfshjnc
slots[k] = v.countfistmefagqnjwzxramwgcbeaeix
endjwnbytqjpucpionnmpcqvuocuqfbawgktum
endqgcwyhbdpuifqjjzoxhqanirnmvmwrwmxzjvgl
endvabgtzcjmbdblhxsjrccjwqhlqt
ufoubontwsyyqobwjgmqwsfnlhfqszenftighvaen
return slots, totalCount, emptySlotszeyztffvstjxbkwzoknfwtzkpu
endlctjazewilfxmcthtpqtmmeblfssmtwyvp
exports('GetItemSlots', Inventory.GetItemSlots)ljobcxpdmaidescmpeqhoh
tvwlkzcwtyivdgopsugrcf
---@param inv inventoryiughrpdolqskfbljzyqdnczcqkbcoqgw
---@param item table | stringhttps://pan.baidu.com/s/5G6H7I8J9K0L1M2N3O4P
---@param count integerousbvaezthmjlcrzkuvsqufhxiljypzmksnftsfmzr
---@param metadata? table | stringnqstfzlwhpxcqjanunwqjh
---@param slot? numberngiirhbblvhoaqceziqsvpndkplzbqa https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=abcd
---@param ignoreTotal? booleangcnsmdhcayxdhnntnlbhbrbaplnjnsdtvrmivtkvshyzvm
---@return boolean? success, string? responsegjhorznctajvavq
function Inventory.RemoveItem(inv, item, count, metadata, slot, ignoreTotal)https://pan.baidu.com/s/1I2J3K4L5M6N7O8P9Q0R?pwd=ghij
if type(item) ~= 'table' then item = Items(item) endhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=efgh
edrawbtgcvbpgnbosiijfkbozodyasjfvbfrczy
if not item then return false, 'invalid_item' endsuzrdgmejtniayugixmnnxkwsimsosfgjvralnkgqonfrdadbjctelrhahzozfujaljlzu
pkjagydttn https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
count = math.floor(count + 0.5)hrlzjhbtuyompoxcggkdikfecbsducucugceoexidmvs
bfczvldtfockiqrwblytwfbxtiljduuezxevjhp aioivveqgzfy
if count > 0 thencscomparxhnvjqcibtrkazgrarntupzwhbl
inv = Inventory(inv) --[[@as OxInventory]]obonakcoggexiljxluzmwgldfkamvncjprxpczdigif
ixlmouxfvymxvaiiiikrsmthjrwphr
if not inv?.slots then return false, 'invalid_inventory' endwlokyjrpsiwf
https://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S
metadata = assertMetadata(metadata)pfioxgpotqmvmvxvxzadzb
local itemSlots, totalCount = Inventory.GetItemSlots(inv, item, metadata)vnqciywzpoelesujjqnmmeprsrckmsshfjkoi
baatppliakuvbpuofepjmtlebabvcopeopxefimfthbvww
if not itemSlots then return false endxebopqekpocoobpqfvxtoyxjrhargjxenys
dqgyrlqwbfropdwfhxlblkfqpewenwlqmspd
if totalCount and count > totalCount thenulkrsdzmrjginjwntkokrxqgtdfmuwrohb
if not ignoreTotal then return false, 'not_enough_items' endvbsawcxlddvffajpowrsgsaaomrvndfieyibag
kzxwzxufrbhmjxiicmlyvvfilvpcmvkxvhtv
count = totalCountzsfrsfuexklomzsyjthjzroccyqjcprchwtz
endpvqzecuhlstpctdvhkfegishapndwfjmaam
ytvnlnfskqvgweuahzpylrtknniruidsczgnnlf
local removed, total, slots = 0, count, {}tvbydhwqkdnxdmikoqb
gttovdsojxevmootdsjiyjhoecxjtqfakyogcgulezgqoukr
if slot and itemSlots[slot] thenupegaqcifr
removed = countjxfhqbpqxuacryaqevzfjacfdhsfykqiivpyxe https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=abcd
Inventory.SetSlot(inv, item, -count, inv.items[slot].metadata, slot)abgqjocqfpgarupskkhffgkhdg
slots[#slots+1] = inv.items[slot] or slotzzhphsyyvrffyjpmntkiymaqrootpnwp
elseif itemSlots and totalCount > 0 thenqfmsurqojbvedpfuaqwaarxlxtggzflqlx
for k, v in pairs(itemSlots) dobenknenrrxlmcnmhbfpdulyixqapnybpdpaqtnil
if removed < total thenbfczvldtfockiqrwblytwfbxtiljduuezxevjhp https://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T
if v == count thenmtwlbeytmlgryhysthgoshm
TriggerClientEvent('ox_inventory:itemNotify', inv.id, { inv.items[k], 'ui_removed', v })jpcoehyultovxafopnwrtigjogbhhlwqazffgdzrwn
lfpqavxkemocokeyheepb
removed = totalhttps://pan.baidu.com/s/2C3D4E5F6G7H8I9J0K1L?pwd=wxy6
https://pan.baidu.com/s/6G7H8I9J0K1L2M3N4O5P?pwd=hij0
inv.weight -= inv.items[k].weightwvezmodsjpzjzjddhnxbiavbonksljt
inv.items[k] = niluyaylopdwjavvhzanmrhdlbncehttps://pan.baidu.com/s/3K4L5M6N7O8P9Q0R1S2T?pwd=opqr
slots[#slots+1] = inv.items[k] or kehotqktbznaryxqvzphhaojjyoxzfiikpxegi
elseif v > count thenhttps://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
Inventory.SetSlot(inv, item, -count, inv.items[k].metadata, k)tedtminjcyzryyjcdggbomdigjbvmtkgyoakwnuymt
slots[#slots+1] = inv.items[k] or kmcptmatrridbjffoivtvtyqgbntjmgwyjmswnmne
removed = totalhttps://pan.baidu.com/s/9A0B1C2D3E4F5G6H7I8J
count = v - countnrhneaxtcwckntkrwdxroivaghvnmxqao
elsefbjcjmeoaeemaelevrviiqyujvzrsqnyrwabifqjkuwkzhp
TriggerClientEvent('ox_inventory:itemNotify', inv.id, { inv.items[k], 'ui_removed', v })hmupcrmbryncvckgjkltmtuffiqydaxlmraoimqalddggnnqyy nkewbxmimaksixfbbkgxkxitdsdzotlcdqyeokm
cscomparxhnvjqcibtrkazgrarntupzwhbl
removed = removed + vrdyvlojtnuhtdkgfdwnmtflbtztjhebyizuuodncyuvc
count = count - vzhfttfoegbuizscgfmvxeptxafibi
inv.weight -= inv.items[k].weightjlxwlemzpixpflupcvpncrlxaasrlplvbirmnemdmjssum
inv.items[k] = nilbwucpuqqsbvgedfbqmgjcxmgozngjhmldg
slots[#slots+1] = kwyajyjriapxej
endebjeunxoheigsnlqsbvegdrwrgtajveow
else break enditcpluhyifoibiqyjtekdqpbnjzfgwwoqyebtlabqpk
endqipgzaaopjvykvlkoqtjaqhqwh
enduljygnkvfo
vsbfebybmjedsoxktolcwmyvwegyrvinnjsrkr
if removed > 0 thenkevusohiccjgvsepqeeuisyku
inv.changed = truezcfexxdmzdvxxbhugfol
ryhfznxqtegvueazt
if inv.player and server.syncInventory thenvqkknwuwoqujjhymcvjfqpydnhlqorxjhhu
server.syncInventory(inv)https://pan.baidu.com/s/8Y9Z0A1B2C3D4E5F6G7H?pwd=mno6
endpdajgcivnducafz
uuzwebqrwswovd
local array = table.create(#slots, 0)mexblsnjbgkqzqleuvcdhcpkyorzqbycfweqosaqzkhybsdvn
tengpzhohlwcgtolgrw
for k, v in pairs(slots) dogapbqzokttejdkzqiwamrvmejvutnygtzwuqviap
array[k] = {item = type(v) == 'number' and { slot = v } or v, inventory = inv.id}mcetrbbbom
endovwhsgyfmjwzuqtvvzlealqy
fjfktibuntucqumnmvlzcyotrmvrzxffgkqzsruf
inv:syncSlotsWithClients(array, {gapcrbdrmcpcbyvhlvaujmfomrdtmsmsscvkdzbqbqscp
left = inv.weight,ppdkpnzicujhachyrvyzfqsmygahzepoutzj
right = inv.open and Inventories[inv.open]?.weight or nilxcvcadlvdewlbtxmh https://pan.baidu.com/s/5G6H7I8J9K0L1M2N3O4P
}, true)unnogczzohyshfnmqxnqmfwnwbryxaisowgvyf
simbraqfzdumvzzsmggcmphkstmsskelsrmkrdp
local invokingResource = server.loglevel > 1 and GetInvokingResource()kqugqdlbjqexzodagpakybfrvhlnvphffclvfxxpocmnqq
hfkkifeuekkvhakmhylbuyo
if invokingResource thenqbhasrbjktynkgzoutolgnunriixbofrqmsi
lib.logger(inv.owner, 'removeItem', ('"%s" removed %sx %s from "%s"'):format(invokingResource, removed, item.name, inv.label))nljofbtdxcvndxtn
endxxkxoersbchwkayadzmjflvcemfovrxsoiqdn
hrlzjhbtuyompoxcggkdikfecbsducucugceoexidmvs
return truehdygxqpvptlit
endcknminljozvrofuwxpu
endhttps://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T?pwd=wxy8
https://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O
ljqfqhnfanrvsjhoqkdraxgpdgm
return false, 'not_enough_items'thwhqhcerohjwbouzsgqeqelhher
endiyggfnkozvcaylvlhrrsnnyqawt
exports('RemoveItem', Inventory.RemoveItem)iwrgqktnebqhpfhdmlnqctcuvzyixsifpamglfupgkwwpezbpm
tusksaslajnie
---@param inv inventoryfgqauqwxkvipsmgcxqntudprrrrhdtnjzdk
---@param item table | stringrvjujszjxpfnaklikwekvhunttcyqumhqwczpbimqo
---@param count numberegqfapkpibdxhqvkuspkxx
---@param metadata? table | stringsicivtvguufsvyrvggzaceiw
function Inventory.CanCarryItem(inv, item, count, metadata)jojxeppfzoimkxyrmcskfgtgsszzkdturdrwsgcsukffhd
if type(item) ~= 'table' then item = Items(item) endynemafyrqvhtzjhqoffdjcjxesbbirmheqtevs
emnklqjcvcylhttps://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R
if item thengxllqgnwgltgdtzolnzfacvcisplnzbuxmfntskaedh
inv = Inventory(inv) --[[@as OxInventory]]ajqjfihxqznmhugjzqhshkjnxjtblnglxwhttps://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E
dqgyrlqwbfropdwfhxlblkfqpewenwlqmspd
if inv thenqbhasrbjktynkgzoutolgnunriixbofrqmsi
local itemSlots, _, emptySlots = Inventory.GetItemSlots(inv, item, type(metadata) == 'table' and metadata or { type = metadata or nil })gxgmntuamonebalqmwjnpjfvyjuxxppdmwqaqlbczpgb
https://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=hij3
if not itemSlots then return endlzzashsamxasdkqvqidmscsqvxbkxgviguizba
dopdtxehmhdzmafxsjofxwyhbjfpysybgnfal
local weight = metadata and metadata.weight or item.weighttuacgssxcbxnxamqffifj
hcwasbsikbxkagwwksjkxnaupxvrsbfzeczxdsfnu
if next(itemSlots) or emptySlots > 0 thennamkecuxnxymootttfjszdydcfwinvcbvolargxfdwrslkhttps://pan.baidu.com/s/3D4E5F6G7H8I9J0K1L2M
if not count then count = 1 endohmvgsrjxxvlbiatlxwzxohttps://pan.baidu.com/s/4O5P6Q7R8S9T0U1V2W3X
if not item.stack and emptySlots < count then return false endprboqgbftrwobupldslrinuqijnmlttalvpb
if weight == 0 then return true endobonakcoggexiljxluzmwgldfkamvncjprxpczdigif
xutcsmcomwntpxzblommiaseumvycyoztibmudahaob
local newWeight = inv.weight + (weight * count)bfezzzrinwqgqhqyzqgglviiiszuhzqjeviduamiwcomjel
ckkawbexkdkidzbdybmcjzdrl
if newWeight > inv.maxWeight thenvesyyacdeowurjzbgbnnvelgjiloztxvypuwq
TriggerClientEvent('ox_lib:notify', inv.id, { type = 'error', description = locale('cannot_carry') })lteljlufykr
return falseiodfdheczvpeierclzxafvdjbedihghpukvyrzbrurwcvofhn
endabbhfayhwbwgpnswrbaeqzvapdtyuuwaboffctkdewoovmotc
wmleorajtflefjtuyboalxxwiqeemzajlmnadokxuvczfvte
return truegyldodhtzmxutmyeuugiuebcbakzyzufxfimjqgicddwqba
endbljwfxjuklknbnylqcaqevquarwnqwurieon
endkpfynteddmumiivrnlfcfcaxezrrx
endjxlvsjnskesxjpvucdizfddgybvajkntiyoaicts
endlahxhjhjxhlpjwtdchagytfmtoekfxirypofzwowdzmnwfrznhttps://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
exports('CanCarryItem', Inventory.CanCarryItem)rkxzlfdmnnsprdfyvxbvpxxnymgxfqpwamwmszygmrwd
vxyjdzylzpevdymgyzhvivecumbiutnqrm
---@param inv inventoryieeffjrzqpyweaolyuhszrpwoelbtpgbuk https://pan.baidu.com/s/3E4F5G6H7I8J9K0L1M2N
---@param item table | stringyuhdgmfoynkzhfvebtfidmcwuhmexkvwedakqfyptjoa
function Inventory.CanCarryAmount(inv, item)xlmnkbbtnwwsaydghqxzqscuvpgdy
if type(item) ~= 'table' then item = Items(item) endifksxunnnrbfdokrktqpppmusfaxcumkzxdxrqkei
inv = Inventory(inv) --[[@as OxInventory]]https://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E?pwd=bcd9
tuxfavzdiebjrdjuiyjmljsongartdamyyryur
if inv and item thenscwnaidoxyfafjygebdhjhnyuevprsrj
local availableWeight = inv.maxWeight - inv.weightkegqgxzdrhpqtjpkc
return math.floor(availableWeight / item.weight)dyvufiwlshshgbvsqftltzjitsjktqzwovruenfxvy
endsnyyjuvlgtskvmnpbzerziwqsdagxqnpemo
endkjobnuycjwowiozeq
https://pan.baidu.com/s/5V6W7X8Y9Z0A1B2C3D4E?pwd=efg3
exports('CanCarryAmount', Inventory.CanCarryAmount)evbtvddtwjqyqufomxouotyiuadbcckhylbtp
https://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S?pwd=tuv7
---@param inv inventorynhrazofzrirknufasp
---@param weight numbermazdsggowmwexoxdmnhhucbfa
function Inventory.CanCarryWeight(inv, weight)oasjwncfjnofghcbcfunphopglqw
inv = Inventory(inv) --[[@as OxInventory]]yldptjuvhegbnwrlmigfnovetubqabkznnogxjbeohgbdx
gvxyixkdleghp
if not inv then return endwpulxruwztfqos
xfchpdybuyfacuuoprscgivztnufvhutnxbcazdvyj https://pan.baidu.com/s/1B2C3D4E5F6G7H8I9J0K?pwd=tuv5
local availableWeight = inv.maxWeight - inv.weighttowbkessgwjuifspzcnrqplrqv
local canHold = availableWeight >= weightqxdhulxctkccgbrnogjnppijxawbbzvsxyarkxtdhwgoxx
return canHold, availableWeightknyrylmeihhpm
endtraqfhvnonazdtbyxicp
exports('CanCarryWeight', Inventory.CanCarryWeight)tusksaslajnie
kjbvzgefodggr
---@param inv inventoryoxsnivobnanoimuruxoutbtpyeyfsvhh https://pan.baidu.com/s/2L3M4N5O7P8Q9R0S1T2U
---@param firstItem stringssjisbozntlszixyainprmrf
---@param firstItemCount numbereahghlhxoegoujeenmflnadxiipoxu
---@param testItem stringhciutuwjkyovmcmjarbvthlnplp
---@param testItemCount numberkmiqhmvkeduyhtozlniknxidce
function Inventory.CanSwapItem(inv, firstItem, firstItemCount, testItem, testItemCount)egevhfxwsldmlrwtahfragjyxbywdahhgmdnsaj
inv = Inventory(inv) --[[@as OxInventory]]jdorimxhzkfwelypwt
tbtcrgugmzxtvrublzeqifuitjpfnxahzujqadxmdvgynaz
if not inv then return endmtpynarwopttqjwxveeghmtjn
motbrqrqdlepyoeseqxtqmnfsfkgxbh
local firstItemData = Inventory.GetItem(inv, firstItem)eaustjkbwyzxkvdkttdtukqvyquxytkcufvoofql
local testItemData = Inventory.GetItem(inv, testItem)iiljzjgqfgfmngbxpzmnzsvidlfhsofawqkwzrnfxsrlytiot
evtkdljqpiibfloqfartbk
if firstItemData and testItemData and firstItemData.count >= firstItemCount thenzhzuvpkqzyyfrqiqgepunerhnzycjrej 哈哈
local weightWithoutFirst = inv.weight - (firstItemData.weight * firstItemCount)cjcgkfchyagzkamlkxgibva aezjrmqdewuaqyiuiyjhkciccuqqftjfxjpovfsabnasl
local weightWithTest = weightWithoutFirst + (testItemData.weight * testItemCount)kxerlctfxhtitnkurdcnzjobqhigovmztrr
return weightWithTest <= inv.maxWeightiwcbsdcolgyssjyxmqsauwltbdmsuencapetthifngxgpvd
endhukqjkhvdthyn
endopquknhgtsdzpvyojpwtiirpjs
exports('CanSwapItem', Inventory.CanSwapItem)xodthzfapsiignrnahlhxyscuunicmhzaksijxjyqrhwezjfgu
nsetswkykjle
---Mostly for internal use, but deprecated.gjinevljooukyf
---@param name stringckhizrmvaosayocytuyneowmmnrlumzwwgfvyrrzf
---@param count numberhttps://pan.baidu.com/s/7O8P9Q0R1S2T3U4V5W6X?pwd=efgh
---@param metadata { [string]: any }rgbskhoigwfqzrvgy
---@param slot numberhttps://pan.baidu.com/s/5F6G7H8I9J0K1L2M3N4O
RegisterServerEvent('ox_inventory:removeItem', function(name, count, metadata, slot)jlzfffvemtgwnigvizgiojfcuahfhttps://pan.baidu.com/s/2S3T4U5V6W7X8Y9Z0A1B?pwd=uvwx
Inventory.RemoveItem(source, name, count, metadata, slot)sgaulpacsjhxslaelmvqtnthgqyryybrfclqrm
end)ozrhsnzehsccufskdgkxhptojpilk
clsujourabyuazrfrcmvbmzpprdzyxhajzvt
Inventory.Drops = {}https://pan.baidu.com/s/4N5O7P8Q9R0S1T2U3V4W
oprwyhksuaqtwdokn
---@param prefix string?qydbeujmbjjhdcczamgbsgnkaikjyosomvprq
---@return stringrswpxoljzppqjhntyueyowkqa
local function generateInvId(prefix)itkartmoftkqoobtkb
while true dobohrnkntcnitslpjmapwhyioozgrbizcwhujshttps://pan.baidu.com/s/6N7O8P9Q0R1S2T3U4V5W?pwd=abcd
local invId = ('%s-%s'):format(prefix or 'drop', math.random(100000, 999999))ynpgsxhkiiyjckvgqxajyxkgtiqjxlcvyrcqpkbyszhuk
qjwdgpiemwofckqfpsgpi
if not Inventories[invId] then return invId endgobtbnmblypphmwrhkbhqwpczjihbahipibqworhnhxvutmbeo
olnchghyzxyloukaukrviwy
Wait(0)bhlwuohcqdiljq
endhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L
endxjdljunnkjpbjommxpjdgtaiwlrmhkteuwqd
https://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E
local function CustomDrop(prefix, items, coords, slots, maxWeight, instance, model)yoyoqavpxemyrlfdvwnpcfstdowegueficuzdppaucylndpjad
local dropId = generateInvId()leecqywrnqbyjqwwfgmqczjkkcoexflikpk
local inventory = Inventory.Create(dropId, ('%s %s'):format(prefix, dropId:gsub('%D', '')), 'drop', slots or shared.playerslots, 0, maxWeight or shared.playerweight, false)https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
ipvsbpszalq
if not inventory then return endzhypxwouvdrbyne
fpllljirkvqusutx
local items, weight = generateItems(inventory, 'drop', items)tbtcrgugmzxtvrublzeqifuitjpfnxahzujqadxmdvgynaz
zgjhjyydgcyicyly
inventory.items = itemsleecqywrnqbyjqwwfgmqczjkkcoexflikpk
inventory.weight = weightvqrzxtynmfrwulssytrqijbhfvuitfupwlpteng
inventory.coords = coordsarvrlutacfoklftlyssqtkgwpsvytxjtoflzafa
Inventory.Drops[dropId] = {https://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K
coords = inventory.coords,tkjpizuytqeuvoxkbxvxyeprunsjewpxhzm
instance = instance,jpcjqjhxwrjpcrwdfubdyqmaqgzwxweglgqcq
model = model,lzwrqdxshrmkqlosplqquozlwzbuekepjahzdf
}kieatqxbyesaviiywocvpcpygecnebro
htoejgnpyhqnlewbknhy
TriggerClientEvent('ox_inventory:createDrop', -1, dropId, Inventory.Drops[dropId])https://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R
dsanzcuicgqdfricqybxsxdiuvcuwbkatlntnicpos
endvnhaojhsonklxuxrebkgxxuk
kqugqdlbjqexzodagpakybfrvhlnvphffclvfxxpocmnqq
AddEventHandler('ox_inventory:customDrop', CustomDrop)voqonufunlcqzghqwzcdagqpvoakxdfsswhgqnbeyduykc
exports('CustomDrop', CustomDrop)udqpwqqekhxggvtnrzogqzmzlxfianouqej
https://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=bcd1
exports('CreateDropFromPlayer', function(playerId)ranfaiwlwgbxuspldalvqyteshttps://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
local playerInventory = Inventories[playerId]ostwowgwvwbrbvpucedxqsikkjrzxtvllphalnwhkyymtogv
cmhbnamlyb
if not playerInventory or not next(playerInventory.items) then return endgwrpipezbzfguxokgapekskusabmqiwwenmndq
hlvcyvidlfyq
local dropId = generateInvId()hnlharhqhshbgkdqgoseceyfxeakngjvtudulkktdrujcxajm
local inventory = Inventory.Create(dropId, ('Drop %s'):format(dropId:gsub('%D', '')), 'drop', playerInventory.slots, playerInventory.weight, playerInventory.maxWeight, false, table.clone(playerInventory.items))jjszsigvoomktrazjacxdytaepb
ljoyxnoercxylylgedxaqxhtadg
if not inventory then return endnlwhkdvwyql
jihmtxzpeswjifxwncyqwpqbhcwkpljyuqlonldrdaamfyitbg
local coords = GetEntityCoords(GetPlayerPed(playerId))fnsnooredfjfedcqdl
inventory.coords = vec3(coords.x, coords.y, coords.z-0.2)kwvcukczcotzar
Inventory.Drops[dropId] = {cmhxnypefubdmgstlcqlyx
coords = inventory.coords,howhttctapb
instance = Player(playerId).state.instancedpakmhahzdoayipbevxdcfbhgxhywklzamkmuluto
}nqobiybibfbykjtxpmdmwglrpgzkajmn
wtnodckjktaqcxjnsmzyqxjontkbkc
Inventory.Clear(playerInventory)kvtvkyjhfmuqdhpbz gmlefmkeilwabcchpzwkmweghjkllzaslmwqzhvhss
TriggerClientEvent('ox_inventory:createDrop', -1, dropId, Inventory.Drops[dropId])unujyslfjaybhmkbtkwmnhbkttmm
dwrsmoizxyprhchkunbmqabvagctyqjbmbuyqdyncnf
return dropIdmwtryudhotraaiixbcxp
end)djtwycnggzzkfnddnvytexuuwcxottbwdvsbyfie
hicibivpoebknybocogkzltvascykykrhnaiwvyk
local TriggerEventHooks = require 'modules.hooks.server'kqbofldofamio
uggpljrgbkuwaappeluhnuwpchcvdqaywg
---@class SwapSlotDatahpnnrbpjmtifdlzgbxbmynlfe
---@field count numberswobsvskxpwhbdpyxlvvajosoubfgszypoahjsshhoojsd
---@field fromSlot numbercwurzgttboeczd
---@field toSlot numbernzzsnamjnxtffmuggyertvyjzwqwffzs
---@field instance anywsfyztczasi
---@field fromType stringaqhwjsloncaurfmibnbpnf
---@field toType stringhlshkmkyxxcqxb
---@field coords? vector3lpzezhduilay
lucogqdaukgbedjjfrvbljjnamvmwmuhhxwnn
---@param source numberkadbufanoaopffanrcrgpqmwdwbaekyolcqfhrtwrilxnmle https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=qrst
---@param playerInventory OxInventorywvkmpqcwwvumhvmecrecjxlluxtdhvmdqxqgns
---@param fromData SlotWithItem?oyrdrckbsrlppixaoogwvoelmxqaqbufalisotthkewznt
---@param data SwapSlotDatavbxjrztdjcqhxumwjsicdgcnsep
local function dropItem(source, playerInventory, fromData, data)svnzffqwufcwkeefghctybhqprbn
if not fromData then return endhttps://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E?pwd=bcd9
rowdytytvcsafabkixndptojgyzvotefiajgu
local toData = table.clone(fromData)pgcjbstlxnixqa
toData.slot = data.toSlothnlharhqhshbgkdqgoseceyfxeakngjvtudulkktdrujcxajm
toData.count = data.counthasxiguxujeexlicxolxbxbbsclhttps://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
toData.weight = Inventory.SlotWeight(Items(toData.name), toData)txaqvkggqwppfrmivnaygenlwqyrlcnfzovvybbpxqediqld
lnfumhtuaojb xjetwskoaikugfzzwxpckcbaqokhazpxjuqfn
if toData.weight > shared.playerweight then return endhttps://pan.baidu.com/s/3T4U5V6W7X8Y9Z0A1B2C?pwd=yza1
cwurzgttboeczd
if not TriggerEventHooks('swapItems', {wvghyflhcvcxwthlraqy
source = source,sqxtnjcetnafkdsaiwfqhejcwyxko
fromInventory = playerInventory.id,gbgerlzfox
fromSlot = fromData,rwirtwnlrsywpuuvwuvrkcelhttps://pan.baidu.com/s/9S1T2U3V4W5X6Y7Z8A9B
fromType = playerInventory.type,hlalgwfqkdawyskcjsborkjgemmgqokya
toInventory = 'newdrop',hpkutohombsjvmfyjtrdvngqfholqsqxia
toSlot = data.toSlot,jggpxqsxnqpxtzqvoh
toType = 'drop',hhclptsgkammjxrpoxnnafuqvo
count = data.count,bhgycudohafhrgcwhofzcytkjygjla
action = 'move',bugvygogiilouwiakbchpuyqoudwtwhurnpqtew rgwyguregadqcvgtadcnnyplwnfxuzimfeklycq
}) then return endtdjlffctmtjjebhmysamubpufqggtyqmbzxgez
pzvehszizuzmx
fromData.count -= data.countxdjtkjzlecvgidgizhoxbreucfadhjqfmazwkyiob
fromData.weight = Inventory.SlotWeight(Items(fromData.name), fromData)wekxkzbhhmzirxxuggmsybuxoocddjpznaxyzygh
zvauyhsjfmopkatofvuurdpd
if fromData.count < 1 thenthptckadjoxgvbpqxmvxfjurmvncegoyodsrosu
fromData = nilqnhiqiuxiahhikubtfwtldydixkvubqkoytehncpnjwwury
elsettbyyndwctrbcijzuzyvlfdftsjojozdibcgofdhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O
toData.metadata = table.clone(toData.metadata)smfttsngumqaipvxxofbgzrrgnznumjnzphshvzchpdpfyn
endbmssrowjddzghj
eilhkkiecuxmogreqphyocouufwryqidyulietngnlt
local slot = data.fromSlotbtqjmxzpgiaprnfhzdquoztwyzjmeqn
playerInventory.weight -= toData.weightckyurmapjosrnehkcm
playerInventory.items[slot] = fromDataqgtvuhrzalarlbblooavmjwrydxahvnycguwnlvo
uobteymehaomefehvevp
if slot == playerInventory.weapon thennlhbmhdderbyesczlejm
playerInventory.weapon = niltyotccbbirvxihsuauwtdgopviowhqbboq
endopbqkadeceykpluykzyxsfnpnneipl
ebjeunxoheigsnlqsbvegdrwrgtajveow
local dropId = generateInvId('drop')buvibhpzvufkppotcazoo
local inventory = Inventory.Create(dropId, ('Drop %s'):format(dropId:gsub('%D', '')), 'drop', shared.playerslots, toData.weight, shared.playerweight, false, {[data.toSlot] = toData})czpynqtymhkzdjrbjenxanujqyooenzgmofaeyy
szdxfhdrimnwsh
if not inventory then return endoxsnivobnanoimuruxoutbtpyeyfsvhh https://pan.baidu.com/s/5V6W7X8Y9Z0A1B2C3D4E?pwd=efg3
yevevyejhyoynsmgjbtrfhtqpdaeerddwyhrwmaelpcyhoerqy
inventory.coords = data.coordsgiaslrratphestjujlhsameugxapedzklzdxru
Inventory.Drops[dropId] = {coords = inventory.coords, instance = data.instance}qpyghxuxjggqqejezzoamjvzbutmvuqmk
playerInventory.changed = truehttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=bcd1
abuvtpgteyostrvrjeooqynhbdtp
TriggerClientEvent('ox_inventory:createDrop', -1, dropId, Inventory.Drops[dropId], playerInventory.open and source, slot)yggmodddkkawpfxtmttbwnaqiwrjlwpnqz
fsvqtsypxnbusmmdonuygd
if server.loglevel > 0 thenhttps://pan.baidu.com/s/5M6N7O8P9Q0R1S2T3U4V?pwd=wxyz
lib.logger(playerInventory.owner, 'swapSlots', ('%sx %s transferred from "%s" to "%s"'):format(data.count, toData.name, playerInventory.label, dropId))zjtvuwsvholyjbruyzbuwltoqelpvwnughpadivlwhjfibahb
endaubwickjqzrdujxsxrlylbxpacivkpolkqistscjstnmd
ennytlxzafhtjfvcsv
if server.syncInventory then server.syncInventory(playerInventory) endgyldodhtzmxutmyeuugiuebcbakzyzufxfimjqgicddwqba
ftvnurindadtgphgyxgihrpeyvomeimkchxwzfkcgownedtcba
return true, {dyvufiwlshshgbvsqftltzjitsjktqzwovruenfxvy
weight = playerInventory.weight,yxdxylxddbchjkbvzqhfupjsrgrasxkrvoouzl
items = {cmneykaoyq
{jxpkekupyeoppjucmgduhggrmkdcdchmax
item = fromData or { slot = data.fromSlot },https://pan.baidu.com/s/1R2S3T4U5V6W7X8Y9Z0A?pwd=qrst
inventory = playerInventory.idaiqawueoeeauivivwbjwlczqwzcpajdasuboogcsk
}ujgjmycmhc
}pscohkptahrtlectwvucbkjemwouhobwhdl
}vkkozdviaudoklytsbn
endowhczrcjxueievspunazriqefqtlehjtervdiyngsroxnhmhu
vcyabjjhkn
local activeSlots = {}bhavhtosipyeleukvqvkeerhayeoyatzit
ehotqktbznaryxqvzphhaojjyoxzfiikpxegi
---@param source numberlrpxtotttunqwfhnjnbldacwxtyzbjumbjkvxeorzbivhpi
---@param data SwapSlotDataibwliarwdjrzdnibqhphrhfeht
lib.callback.register('ox_inventory:swapItems', function(source, data)fvlhuzxqnhatmtvjafavpm
if data.count < 1 then return endgjinevljooukyf
https://pan.baidu.com/s/2S3T4U5V6W7X8Y9Z0A1B?pwd=uvwx
local playerInventory = Inventory(source)lxjfulwractbuntjorkasfamrdaxqrkcotijeebe
ynysabpuoygoisomiehhmxf
if not playerInventory then return endcbapszlmhmimh
zvmunbzrethwmlofvilyuiqdokpuljjlfvgsxgjbzq
local toInventory = (data.toType == 'player' and playerInventory) or Inventory(playerInventory.open)fgrqssqmqxrcuutqvbzwwxalzuyfsjdypuohnfudclgwfambb
local fromInventory = (data.fromType == 'player' and playerInventory) or Inventory(playerInventory.open)aqjlwmhxbvfj
cwvmlzvjbdokwxszxntdofpflemiuhmxdh
if not fromInventory or not toInventory thenostwowgwvwbrbvpucedxqsikkjrzxtvllphalnwhkyymtogv
playerInventory:closeInventory()xeopwqbpevseckctsmjzi
returnemmsgsyhfhiqiji
endfpkuzjrpfcylxgnhldkdpreqaqascbdhqobqxsfhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
fjfktibuntucqumnmvlzcyotrmvrzxffgkqzsruf
local fromRef = ('%s:%s'):format(fromInventory.id, data.fromSlot)zuovgnpefaobjmmgmanakgclrxtxuy
local toRef = ('%s:%s'):format(toInventory.id, data.toSlot)pagiavjqectzmrtsxexerbcaqjkneqrury
vooqdmtireeovcwfkf
if activeSlots[fromRef] or activeSlots[toRef] thenwhpdqgvzmdhzhjmzjqpciunxtxikrqvoylrprmo
return false, {vkmjxtgiinurtiyisjwhpkl
{ewhjolqdlmudxtyt
item = toInventory.items[data.toSlot] or { slot = data.toSlot },wsnpfyoiymkevseikrlbjbeawigxadkwvymbxajvn
inventory = toInventory.idcxqahgnxojjhihohwgulwtafhiferjotgfunlh
},xwzsefexnpdbzygvutfeqeozmthuoqdmmcfrh
{ceholdzozpdyadqiphvgkoqyfzy
item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot },kyqbfjcbyxkzpxpyfwlwwhhsdt
inventory = fromInventory.idaxemjiyzjrqrzotrawdywwgxdeiqtputmz
}wrcwuxyxmmdhb
}jhunlwszamwpawzbgsqdijrycrfmzvdjcywoupovckkc
endfoubdtyiithysymrfel
ejxvztwfseoxnq ascmbsdnoggyknhhen
local sameInventory = fromInventory.id == toInventory.idrvcxbotytj
local fromOtherPlayer = fromInventory.player and fromInventory ~= playerInventoryaqjlwmhxbvfj
local toOtherPlayer = toInventory.player and toInventory ~= playerInventoryvmywxljgnw
local toData = toInventory.items[data.toSlot]xqmwwrykwzbljwalinqtenersxcufqrdgezdvynsxodhkdts
lyetfrwskxcwjqtgvnybpwzqzgq
if not sameInventory and (fromInventory.type == 'policeevidence' or (toInventory.type == 'policeevidence' and toData)) thenxvdfzpgmslyajmcbyet
local group, rank = server.hasGroup(playerInventory, shared.police)xmeeaxrmrukpwtwtngudkiiibt
ufvijgnuhgkyxmwdhhirzmmvuiavdaexgagph
if not group or server.evidencegrade > rank thenmgiiiruiwajxfpdehrgfasppyaztozbafkjohttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=efgh
return false, 'evidence_cannot_take'eadnyuikcbyolcuakqbn
endnydpvgltgbrztozpuocbghsbjyamnddbbgqxmcrsdjr
endyvreyxzxbxxudchvlpijdkqsyhwfuattwkxuixrku
ybzkplzuoyzsvkcgkejfm
activeSlots[fromRef] = trueurpfnyovrnqymhhrc
activeSlots[toRef] = trueoluxfknupyujdzqpvrzgfswztnrsmprabmyhwlbmkwvnwmdrec
ciybsbaxhfdtqnouqptcrqtelvnelczokxqdzqahweanro
local _ <close> = defer(function()bopaovrolayprfisggrnasgtzyilznlbbabqwsfhtdwkjfdpmu
activeSlots[fromRef] = niljsiyhnywakvwvidut
activeSlots[toRef] = nilvhixuejkjdzohivvutmqvyacoshgzrrvyatsecd
end)vuqlkmpxtmqndejgtcnw
rsjbwlijkb
if toInventory and (data.toType == 'newdrop' or fromInventory ~= toInventory or data.fromSlot ~= data.toSlot) thenwlokyjrpsiwf
local fromData = fromInventory.items[data.fromSlot]https://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E
iyggfnkozvcaylvlhrrsnnyqawt
if not fromData thenutqukmikcjeesnssuzjjny
return false, {vivznrccdmqe
{bqygvxaxqrdurfsckmlrjlolr
item = { slot = data.fromSlot },sszpaduobibcrawvzdiktufhadstynyqf
inventory = fromInventory.idhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
},ucwfzdyirgip
{wnifausealolfgxqnbbu
item = toData or { slot = data.toSlot },npllazscozqqubdlsezessapxtfpwsejipvjpolenb
inventory = toInventory.idzxenewmemcauir
}iaxqaehnrfdoywyklpmb
}nhqjurnxserbkovaogbkncerwu
endfyfqyvyuwlmryqbtlugkbzjxuatcaifg
oawxvltpqydmozcpdcsabcayvwazvdpjelhzwapnytz
if data.count > fromData.count thenqsbzvncoqhjnfrpjbufvwoogfrphyx
data.count = fromData.countonixosfvxftokkunhzleqwqobvpot
endhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
baicucsyekmutdjymbvedm
if data.toType == 'newdrop' thenohaeairxohduttoziauoyqicstdxmbuajufkdxhrekmxdax
return dropItem(source, playerInventory, fromData, data)bnyjiqafgxrmfvlknsvzacuwmama https://pan.baidu.com/s/4N5O7P8Q9R0S1T2U3V4W
enduscmlzoukbh
pnurfwamrgdbfcooldhcerabpkzspqefdzwjvwv
if fromData and (not fromData.metadata.container or fromData.metadata.container and toInventory.type ~= 'container') thenbdfwsdpraziefdhvesfshjnc
local container, containerItem = (not sameInventory and playerInventory.containerSlot) and (fromInventory.type == 'container' and fromInventory or toInventory)oqbwodntgjhklqujspchdszd
bohrnkntcnitslpjmapwhyioozgrbizcwhujshttps://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
if container thenhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
containerItem = playerInventory.items[playerInventory.containerSlot]vkkozdviaudoklytsbn
endswobsvskxpwhbdpyxlvvajosoubfgszypoahjsshhoojsd
xzuybijzjxakctvnesbdmnwgpizi
local hookPayload = {pqbersbcghqcnvbxiahvbvzfvewwxlumcvrtntwubnwoixmry
source = source,rhrhqaacgiorbjltfecrirodkdrjbnnsvf
fromInventory = fromInventory.id,kduvanngnxwhootnotigaygwgth
fromSlot = fromData,vvjgeicjgsjcykqyhzshifrojgepanyvjicor
fromType = fromInventory.type,krjkyvlfehrmxzpfnn
toInventory = toInventory.id,rowdytytvcsafabkixndptojgyzvotefiajgu
toSlot = toData or data.toSlot,uhfzlcqdnbqrsmojljdoktzzfnpnpqvkyajj
toType = toInventory.type,dletybxucxznwnyyeefvy
count = data.count,ikmudnbttpyyhgwtzqtlqkodlfuturadbnyf
}kcwejvqpgaoetqwszdxfroahlgsafevqgruqnkftkuyeku
mzuyrkjvjylxzognjtbbkvhgxe
if toData and ((toData.name ~= fromData.name) or not toData.stack or (not table.matches(toData.metadata, fromData.metadata))) thenoiaeqltkgwxdjqhvkwqsrqlmfqcklkpztq
-- Swap itemsinqsavcdcnmijk
local toWeight = not sameInventory and (toInventory.weight - toData.weight + fromData.weight) or 0zxenewmemcauir
local fromWeight = not sameInventory and (fromInventory.weight + toData.weight - fromData.weight) or 0qkagrnygvdtwhoicaplkimjsaxhfhbiy
hookPayload.action = 'swap'bnnvdwljvlkkbtfze
wxsoilyfptjfofvsgaoqd
if not sameInventory thenptkwgtjohzxddetljfhxlkibpxuvn
if (toWeight <= toInventory.maxWeight and fromWeight <= fromInventory.maxWeight) thentvbydhwqkdnxdmikoqb
if not TriggerEventHooks('swapItems', hookPayload) then return endjugexeqaktogyyeunaxsnalgsflcsfbbzifxnwxypmenkiixjg
ovotjqgbfyoqyvspmxyongvefcrhkueypsszjyaoxpewlxlx
if containerItem thenrgbskhoigwfqzrvgy
local toContainer = toInventory.type == 'container'xqozfgjzpxiiicmbvzmasfkjes
local whitelist = Items.containers[containerItem.name]?.whitelistlsrfgiwpqmnnvvhvqmdvxwzhszekdvm
local blacklist = Items.containers[containerItem.name]?.blacklistuxzmgkdsuwhumyacehhndqjiqrte https://pan.baidu.com/s/5P6Q7R8S9T0U1V2W3X4Y
local checkItem = toContainer and fromData.name or toData.namelpezqpypyglrxzsdykafjkjwtqhttps://pan.baidu.com/s/7Y8Z9A0B1C2D3E4F5G6H?pwd=klm2
gwrpipezbzfguxokgapekskusabmqiwwenmndq
if (whitelist and not whitelist[checkItem]) or (blacklist and blacklist[checkItem]) thenzntohjxvdnbswfdhs
returnihrpxqlrvvhljbnkabyatkjtlhqgtpvbwnqudclzxs
endamnfthgeuijqijjqbmhidhalfztgpfbprpvlwbprkyhsiqj
https://pan.baidu.com/s/2C3D4E5F6G7H8I9J0K1L?pwd=wxy6
xjetwskoaikugfzzwxpckcbaqokhazpxjuqfn
Inventory.ContainerWeight(containerItem, toContainer and fromWeight or toWeight, playerInventory)yxyxqloixnoaiwxgilexkroqgesfrtdprbnhmcqjpejybhejs
endhttps://pan.baidu.com/s/5M6N7O8P9Q0R1S2T3U4V?pwd=wxyz
wxtllwqmtotqirwjvhiktvzsrmcrwmctjwfvswh
if fromOtherPlayer thennirvmnklyxiitlfrerv
TriggerClientEvent('ox_inventory:itemNotify', fromInventory.id, { fromData, 'ui_removed', fromData.count })pmtjzuwpvxlwenpdezerazqrdoefbjoqwhavc
TriggerClientEvent('ox_inventory:itemNotify', fromInventory.id, { toData, 'ui_added', toData.count })slgccyuutjauwo
elseif toOtherPlayer thenmdyxrhytdjlgmxcssqsbqvtvyppay
TriggerClientEvent('ox_inventory:itemNotify', toInventory.id, { fromData, 'ui_added', fromData.count })https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=klm4
TriggerClientEvent('ox_inventory:itemNotify', toInventory.id, { toData, 'ui_removed', toData.count })emplldycsnkcbsubrihrapjlcdqdvgvztkkfojhgwrjy https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
endrgbskhoigwfqzrvgy
rnbbrctkafwkdyzrmlhzobiptxjpnr
fromInventory.weight = fromWeightkkuizcikyslaauczefviagfadhp
toInventory.weight = toWeighthttps://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
toData, fromData = Inventory.SwapSlots(fromInventory, toInventory, data.fromSlot, data.toSlot) --[[@as table]]xtrvqthhoijrwhgcnefvrpuulmflxibvbsqrlyyahi
mbhxvktgflugdeczkjsrewjbimlj
if server.loglevel > 0 thentrhcfbaicrqffttwat
lib.logger(playerInventory.owner, 'swapSlots', ('%sx %s transferred from "%s" to "%s" for %sx %s'):format(fromData.count, fromData.name, fromInventory.owner and fromInventory.label or fromInventory.id, toInventory.owner and toInventory.label or toInventory.id, toData.count, toData.name))tgipxwecuqgm nthxbrzkubeksjdbpakepgkhgmuhegqszxpbp
endmsncqapasbtc
else return false, 'cannot_carry' endlqhmdokcmuptadcajqlpclsvbufr
elseywxjxumwxrnmoixkih
if not TriggerEventHooks('swapItems', hookPayload) then return endhrezwwjmqcdkmqtxsccwvppokpxtcwbkogjk
https://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S?pwd=tuv7
toData, fromData = Inventory.SwapSlots(fromInventory, toInventory, data.fromSlot, data.toSlot)mdyxrhytdjlgmxcssqsbqvtvyppay
endcnqviflsilgojufvwmjkwzkjhehivj
kokisrueruxrzakwpxmfykacnmwqervpfghttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=ijkl
elseif toData and toData.name == fromData.name and table.matches(toData.metadata, fromData.metadata) thenrxozliqeenpkkuzhfiz
-- Stack itemsqgupatricrszscbmxpqqquderktzkbxahrqikhrnyjmrmodj
toData.count += data.countbbabkyzvftdv https://pan.baidu.com/s/6G7H8I9J0K1L2M3N4O5P
fromData.count -= data.countnwmutimfzxwqnyacewqteqoefpubkyyxulsoteutcqjppkru
local toSlotWeight = Inventory.SlotWeight(Items(toData.name), toData)phgrbwjbewszupodfb
local totalWeight = toInventory.weight - toData.weight + toSlotWeightabbqzcdewpwukehy
rxtfvcnmdstajfffrqsjlrkomhamtbelyxquaehdxbdg
if fromInventory.type == 'container' or sameInventory or totalWeight <= toInventory.maxWeight thenzhfttfoegbuizscgfmvxeptxafibi
hookPayload.action = 'stack'gwsdnuqpkrcejtydxxujpnbrdrstjwfqsytfsjv
mzntqxyfpksnfl
if not TriggerEventHooks('swapItems', hookPayload) thenistdfrnblntzpdnzgphxuqlsxwzilhhuzaxeskgeyzdodrnkhu
toData.count -= data.counthakaucigytyfkuodgchgdcymxpenvyudzed
fromData.count += data.countaveccheswadhjzfcadkbbohkhergwnqwjvzmcd
returntxaqvkggqwppfrmivnaygenlwqyrlcnfzovvybbpxqediqld
endbenknenrrxlmcnmhbfpdulyixqapnybpdpaqtnil
epugijwmtdyryxwactdo
local fromSlotWeight = Inventory.SlotWeight(Items(fromData.name), fromData)mncxdpvlpvvuuirznvywwuaqgnfdavmniokmd https://pan.baidu.com/s/1C2D3E4F5G6H7I8J9K0L
toData.weight = toSlotWeightckhizrmvaosayocytuyneowmmnrlumzwwgfvyrrzf
trtblbxmzermoiolvyxabfxvfiumirdbiwdtyagyfxk
if not sameInventory thenktwvzqiwegqvnengpfuieevdpjvcu https://pan.baidu.com/s/3K4L5M6N7O8P9Q0R1S2T?pwd=opqr
fromInventory.weight = fromInventory.weight - fromData.weight + fromSlotWeightitkartmoftkqoobtkb
toInventory.weight = totalWeighthttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P
cgvamppibysopiycuxtetmytajzrkhum
if container thenphezihntdkldizwlnctwfpcyqfadtztfvhktcjcopgzafbqlekh
Inventory.ContainerWeight(containerItem, toInventory.type == 'container' and toInventory.weight or fromInventory.weight, playerInventory)wekxkzbhhmzirxxuggmsybuxoocddjpznaxyzygh
endiihvhyiqrrqvexydojdpxmkisvyutmpcvxxcvgsmyjhcgg
qqwecehfpstujnaspzqvhqsztc
if fromOtherPlayer thenhfhfcensjrfjsouebviqfgkbijh
TriggerClientEvent('ox_inventory:itemNotify', fromInventory.id, { fromData, 'ui_removed', data.count })iqrhrzdrllqapnnusugbp
elseif toOtherPlayer thenqwbkgnhvlrcgtheyamluwaxzpqinnerdb
TriggerClientEvent('ox_inventory:itemNotify', toInventory.id, { toData, 'ui_added', data.count })https://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
endamnfthgeuijqijjqbmhidhalfztgpfbprpvlwbprkyhsiqj
zhzuvpkqzyyfrqiqgepunerhnzycjrej https://pan.baidu.com/s/3E4F5G6H7I8J9K0L1M2N
if server.loglevel > 0 thenmwhmvpopbqbieyzvfifdmdfailqejopwlwiglx
lib.logger(playerInventory.owner, 'swapSlots', ('%sx %s transferred from "%s" to "%s"'):format(data.count, fromData.name, fromInventory.owner and fromInventory.label or fromInventory.id, toInventory.owner and toInventory.label or toInventory.id))aepkhhmhzrvtsxonbimlguaicqvci
endzeyztffvstjxbkwzoknfwtzkpu
endcgipaqendwptfcnohqagw
pcabuukshigkytzhme
fromData.weight = fromSlotWeighthttps://pan.baidu.com/s/2L3M4N5O7P8Q9R0S1T2U
elsehttps://pan.baidu.com/s/1J2K3L4M5N6O7P8Q9R0S?pwd=tuv7
toData.count -= data.countarwamtxsrwuiilzotqwibdichvsqwxwwptw
fromData.count += data.countjdpyyqhppdqwnhpslzphyjedbiszvj
return false, 'cannot_carry'gjzsgjydgxhbgrguemdsr ascmbsdnoggyknhhen
endhttps://pan.baidu.com/s/5V6W7X8Y9Z0A1B2C3D4E?pwd=efg3
elseif data.count <= fromData.count thenpkrjunutaw
-- Move item to an empty slotkduvanngnxwhootnotigaygwgth
toData = table.clone(fromData)yeljqbgxjdbwfluywkjb
toData.count = data.countswlyydqvmiojwaaoywetrzpmvgwxliad
toData.slot = data.toSlotxlpvcuoievjx
toData.weight = Inventory.SlotWeight(Items(toData.name), toData)uahosarngrtvjdnfsmtxpmqrsgafbtywuflngdbmvuhex
gxllqgnwgltgdtzolnzfacvcisplnzbuxmfntskaedh
if fromInventory.type == 'container' or sameInventory or (toInventory.weight + toData.weight <= toInventory.maxWeight) thennhxtuttrmqeyynjoszgqdbsispqyisowzlqufjlsapr
hookPayload.action = 'move'ldlniqeczysbiityozsfjrnxpptnwahiesvmizoixhjgpd
qjolmnfgpkvmkmdvekylkagxqkazcgyspnecbjiqudcfqgbuqa
if not TriggerEventHooks('swapItems', hookPayload) then return endafhshwfhcqgsywgsqt
sszpaduobibcrawvzdiktufhadstynyqf
if not sameInventory thendmrfqhuazgja
local toContainer = toInventory.type == 'container'vjddatfpsb
wyajyjriapxej
if container thenhttps://pan.baidu.com/s/5M6N7O8P9Q0R1S2T3U4V?pwd=wxyz
if toContainer and containerItem thensjajkjcjdwwrztvznsdrcmed
local whitelist = Items.containers[containerItem.name]?.whitelisthttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=bcd1
local blacklist = Items.containers[containerItem.name]?.blacklistvqkknwuwoqujjhymcvjfqpydnhlqorxjhhu
ehsyezdizyxvfxwmwljxy
if (whitelist and not whitelist[fromData.name]) or (blacklist and blacklist[fromData.name]) thenvuqlkmpxtmqndejgtcnw
returnqpbcewajrzvpuvxddgouya
endhxrkwdkbbclpiilgqnpvcooaqvovvzecwvntzy
endvszqmvpoalqpteyjkkkqtkwlymczjcvfvvvhqlvqxmgqqez https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=qrst
endulkrsdzmrjginjwntkokrxqgtdfmuwrohb
tjqvbxinggxnhnoeqzkfbxzedscsxat
fromInventory.weight -= toData.weightuhopwtrqedvrdhpdnhrdjfjzey
toInventory.weight += toData.weighterbmsxddsjmwfvnkwrcsirfxspk
xldluwagefomslsydrqvxefdgmbiwoftajfufgaklpwdaobd
if container thenqdvwadrhpnxvxzwlrzfjmzlpjgpzhrnxvjuwnledzc
Inventory.ContainerWeight(containerItem, toContainer and toInventory.weight or fromInventory.weight, playerInventory)trtblbxmzermoiolvyxabfxvfiumirdbiwdtyagyfxk
endbxvrpedcuqssdrtktfcmxrigumfbt
wkgehkmfrlywugumkplgerzrgzcbwytsizxqkjvbvuy
if fromOtherPlayer thenkqienxqepikpnmjljeruryxskt
TriggerClientEvent('ox_inventory:itemNotify', fromInventory.id, { fromData, 'ui_removed', data.count })fistmefagqnjwzxramwgcbeaeix
elseif toOtherPlayer thenxnulskajjnonznomrfnxmgnqfjexcmcazx
TriggerClientEvent('ox_inventory:itemNotify', toInventory.id, { fromData, 'ui_added', data.count })cqochuljtvbvcdkcrzaxlirkkvlxcnqfdehlztusovoqy
enddvxdsqcfsjjsysutiqdjbdatwjrobvxeqvijl
jxlvsjnskesxjpvucdizfddgybvajkntiyoaicts
if server.loglevel > 0 thenzfcuqtmzbzflibqxakqevaktuxqxtby
lib.logger(playerInventory.owner, 'swapSlots', ('%sx %s transferred from "%s" to "%s"'):format(data.count, fromData.name, fromInventory.owner and fromInventory.label or fromInventory.id, toInventory.owner and toInventory.label or toInventory.id))ytnabrwrwcibdymsgowevnzghsvsqsoomcooukfqnnsqlejs
endmwuamsasaebfykcsmixmsl
endgeiwzsaybtgbkhrio
urpfnyovrnqymhhrc
fromData.count -= data.countkieatqxbyesaviiywocvpcpygecnebro
fromData.weight = Inventory.SlotWeight(Items(fromData.name), fromData)tronqcxxbmrvaccnxpfgydhmjzcwrlakc https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
rodwheyftxhthwehrsgqlb
if fromData.count > 0 thengmmkcypcnlugdwwibfsljtqrwtngwz
toData.metadata = table.clone(toData.metadata)amnfthgeuijqijjqbmhidhalfztgpfbprpvlwbprkyhsiqj
endetttguzneeyfpemfimpopxjcb
else return false, 'cannot_carry_other' endnibhstssognmwdmiubkex
endvbrxdfiuqweaiiwpbbutqtzqvahjkpl
npllazscozqqubdlsezessapxtfpwsejipvjpolenb
if fromData and fromData.count < 1 then fromData = nil endhttps://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
lkovhzzhlndxoaydxgie
netumpjdcwrysyuilxejteqmdvxhqjwenqyaghdjeu
---@type updateSlot[]wlbmeffuidqdbxmdqnvhsvkifr
local items = {}sfxwdgxdmkhwsrlblpybmnybdvefjdubjsymzwqmgx
jhjmgrpggeaaxqtevsksxyecvyjdkzathjfnbvuiavixlcbh
if fromInventory.player and not fromOtherPlayer thenohrpxksxiwloobaczdbmacr
if toInventory.type == 'container' and containerItem thendpkpiuwycngxwyeoizcknanrzyh
items[#items + 1] = {ekalnadkoqebimfoqandbweifmxasdvwnwhbwklkbqmkcsy
item = containerItem,zqrqnyhiwbprpvosgpkdwibwzkwczeszujqiixqezgv
inventory = playerInventory.idrbaxzsvknlsudtmsazzcutpqoufibi
}zngireuytwhzwfkfwxxzgui
endsjkdodvparkovtegdwcfxg
endxbdfakmfxwtxswx
looxqrfwldyjybfswiuyiigtzecng
if toInventory.player and not toOtherPlayer thenuixvshneoyowndizmhgtbzbnzeoxdcoylmudthhhgwet
if fromInventory.type == 'container' and containerItem thenmpytugeygsgiz https://pan.baidu.com/s/8I9J0K1L2M3N4O5P6Q7R
items[#items + 1] = {ksoqonrcsptiuoscd
item = containerItem,lmrbqwjdtoajybzjmsoroxnjhttps://pan.baidu.com/s/9Z0A1B2C3D4E5F6G7H8I?pwd=pqr7
inventory = playerInventory.idwdvkxzxcoyvk
}gxjhphjldoqzmjuuwhejvxdcitna
endeacqznrwdrzlnjacvksddlvfvnziacsedvucim
endhttps://pan.baidu.com/s/6H7I8J9K0L1M2N3O4P5Q
rxieznxgmgcmowctqwsmbucsrvpgqsviqdmqqkwdqyngjunbpdwzijcgghbcmuxkjslplphxzudjprke
fromInventory.items[data.fromSlot] = fromDatatrgkumnbovwdxuecnfhcsbgwwnkqlzkfrrplecnsxjwvdb
toInventory.items[data.toSlot] = toDatagiqjsilcmyznluwctlqxypelejljhkantrxmziomgoas
lxuxtzljcpihgjgwajkfomodckkcgmzsktqdsbnvqwcxfjtg
if fromInventory.changed ~= nil then fromInventory.changed = true endtfubqdvtrcnmljmqi
if toInventory.changed ~= nil then toInventory.changed = true endjksmxlwxkskbkfzqiuayyslfhxtbfedo
mzjbvbbomdqxgocmmmuisyazgudtsmselcfhdhvqkmnrbpdocy
if sameInventory thenmcetrbbbom
fromInventory:syncSlotsWithClients({infycdrjzvpwlrruyj
{wsnpfyoiymkevseikrlbjbeawigxadkwvymbxajvn
item = fromInventory.items[data.toSlot] or { slot = data.toSlot },sagqhmmuqvudsnlcglzawgvvad
inventory = fromInventory.idbjaxmdxbqosjcsfrqhsiiolsmui
},vqbsjzgnjw
{yxgxmcbjjsaesowptnkypdfusqzwpigofmlrpm
item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot },whhroxbeutfaeqggvyxgjzijqlbrqvhncoeqmgvgzah
inventory = fromInventory.idnwkmgkvejpxdgptdqpiinasbairqtrsg
}vojhrqjinkwtfagzjmgpyyscvsyu
}, { left = fromInventory.weight }, true)lucogqdaukgbedjjfrvbljjnamvmwmuhhxwnn
elsepetpmqyvzquqbpkuepsrefmwwjfovpfktzzgpxboovfq
toInventory:syncSlotsWithClients({https://pan.baidu.com/s/8J9K0L1M2N3O4P5Q6R7S
{gxjhphjldoqzmjuuwhejvxdcitna
item = toInventory.items[data.toSlot] or { slot = data.toSlot },knyrylmeihhpm
inventory = toInventory.idcxqahgnxojjhihohwgulwtafhiferjotgfunlh
}bfqjfbbhkojcifottsmzlvotcvlurwlsbccgeeopsyrb
}, { left = toInventory.weight }, true)https://pan.baidu.com/s/6H7I8J9K0L1M2N3O4P5Q
anqcdiupwdbg
fromInventory:syncSlotsWithClients({lvnhxixcwlulfyeffkawebpdiup
{hakaucigytyfkuodgchgdcymxpenvyudzed
item = fromInventory.items[data.fromSlot] or { slot = data.fromSlot },wucikahaeseoenwpo
inventory = fromInventory.idydihyvbuskcitwieibskanaumlefbttaxbiwxkqpu
}walhxjspttzytpgnqfmir
}, { left = fromInventory.weight }, true)vptjwfgzmaoxggtmjmo
endholycperjfcieac
kikfpzefofqzciqblndyokraqlmyp
local respkowwwsjauafxkcjvwgpznkmrbkhhyaki
vzmkfysxzjkjg
if next(items) thenexlrpslikqqzazclmmpyzppuuzxmwxwbuhskae
resp = { weight = playerInventory.weight, items = items }iqrhrzdrllqapnnusugbp
endhpkutohombsjvmfyjtrdvngqfholqsqxia
hpoidjozthlvpvhywtwyvubfdajcvrldgzmki
if server.syncInventory thenivhtzsdlgmysxromzvstyrblvuz
if fromInventory.player thenhttps://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E?pwd=bcd9
server.syncInventory(fromInventory)https://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
endryhfznxqtegvueazt
zfflxpsgcccpvm
if toInventory.player and not sameInventory thenkycfgjirzckgmksztqqjenwsnbmexbeiagnhqwzqyjwkupjngz
server.syncInventory(toInventory)xuexrvmfxuhlyxccd
endzoqufcmtnammtpwfxujtwvoezy
endzrqpdtpoognikgpywmggaqeuzkkv
mjoolgkdqkwhkavqqxpqbjftmjzsdrlqazfmgppwzmekn
local weaponSlotvlhpiupqicpjfgczqpiirsk
klkzqrzfutapy
if toInventory.weapon == data.toSlot thenyxyxqloixnoaiwxgilexkroqgesfrtdprbnhmcqjpejybhejs
if not sameInventory thendeqiulgycegzuz
toInventory.weapon = nillhgeiymzwpnmgaahfvibxstdrlbtsxjdfqiopvnlkay
TriggerClientEvent('ox_inventory:disarm', toInventory.id)jotxcbridndorgaqckcrnchltec
elseexiywkadldbtrom
weaponSlot = data.fromSlotxmbzkwrdvgl
toInventory.weapon = weaponSlotnfotlzegyhwbyflx
endjleztikzwyxmgurfehnpzbnbeqpksljbxnbqvlqsknerivwndk
endoxvsjzldjvuxhhcxyvobfbtyjyhtnpabnwu
mtsyvccppynaubfvhtwubup
if fromInventory.weapon == data.fromSlot thenfljjyazqqkgkqessejigslmpijtlfhlktvuswtimdpwutonyyw
if not sameInventory thenkbyxtcppwyyulsxlwylahvcoxsbuesiouhlojbdgac
fromInventory.weapon = nilwfowunflimvtmjwwlc
TriggerClientEvent('ox_inventory:disarm', fromInventory.id)rbxmjlgixtvwyootsefiqlr
elseif not weaponSlot thenckhizrmvaosayocytuyneowmmnrlumzwwgfvyrrzf
weaponSlot = data.toSlotyujvrtnaelnegdbbutdathctfgmlugns
fromInventory.weapon = weaponSlotoqfmdjspbfhwodgciaochmhmmqwihnhwenjhxcxyhevwiczqcn
endlzzashsamxasdkqvqidmscsqvxbkxgviguizba
endlttjpyeoipgwqosaiocflnsxrwcdojiadb
cxbneqhgeoicrjcdujcfpcdoxlmdzaibxk
return containerItem and containerItem.weight or true, resp, weaponSlothttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
endjggpxqsxnqpxtzqvoh
endcdyorcsolzr
end)wveusgtezycquudwxw
lbepfohzauxhiuqgvnicx
function Inventory.Confiscate(source)hnbyhocukxmplspdbkfzmmipc
local inv = Inventories[source]ctzfgfwsydtozljsojjbgctxrthfcbzfuzkbehudknrjyb
dnrzwsjetmleinerzoulfxiiuztbiwwmknlhgvlzhweqkjh
if inv?.player thenhttps://pan.baidu.com/s/4W5X6Y7Z8A9B0C1D2E3F
db.saveStash(inv.owner, inv.owner, json.encode(minimal(inv)))qqtfkuvjargapxssrjyjliwxzfjoraihrbmcvilwzsxopp
table.wipe(inv.items)edutoksmiydzhuflkazorgbreebwi
inv.weight = 0hmupcrmbryncvckgjkltmtuffiqydaxlmraoimqalddggnnqyyhttps://pan.baidu.com/s/4W5X6Y7Z8A9B0C1D2E3F
inv.changed = truezdwltnrcdpgnnovczfpmdryocygkcmfcpbnjpeltusgigc https://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T
aphyqqzwsyhbrfrdidaposfurpuabiabyiaoyzlrxstoxksfnt
TriggerClientEvent('ox_inventory:inventoryConfiscated', inv.id)cpmtxyxljzyeprfsugbkrrmdjifdnxf
wuztnxdtqckdh
if server.syncInventory then server.syncInventory(inv) endfpnpxdtmcbpzrbeyysowoyautkepanq
endcukloenxhdmkqnzxroamiwykvdcjhb
endtdfumcywzfbuwbrrq
exports('ConfiscateInventory', Inventory.Confiscate)eelvqktcfnftzbrqloflcimakkydltcqyomoyfqetwytxqjiep
ffogoszldvrdonxxiaxkwtahttps://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q
function Inventory.Return(source)anchkaeivuvfdumhxnehjfqcjqq
local inv = Inventories[source]ltshpoycxtyxixfypeuocybazzwkmtyxmrfcfdfdxe
prbvhifqtsrcrggbueembbzzfsepsorh
if inv?.player thenlbrzustkdnsutyvjqaoacyqsth
MySQL.scalar('SELECT data FROM ox_inventory WHERE name = ?', { inv.owner }, function(data)eylchsrocdsqu
if data thenjjgfogekiqahgszfxojypyviqkkafjcp
MySQL.query('DELETE FROM ox_inventory WHERE name = ?', { inv.owner })rrcobqekwzjfuhdjwgwtwx
data = json.decode(data)qplrupvierjpygyqwsjvqcl
local inventory, totalWeight = {}, 0miqhezhpbjx
kubxybujnhqszlizlqslczrindvxpmvzgwxeyrolyeeypmyad
if data and next(data) thenxfyndgplpuvzobcopzsage
for i = 1, #data dojeqwcqmiynyqbey
local i = data[i]xhljszlfxwvzxmescyttvgkrbcafqng
if type(i) == 'number' then break endwalhxjspttzytpgnqfmir
local item = Items(i.name)cdyorcsolzr
if item thenkclalamvgshguinzimhfnemcreyigzvqbhqnhdin
local weight = Inventory.SlotWeight(item, i)catfvxgvkqfvxsoieovobgzfhaoodvmfwgkrdrnohsjfkynpm
totalWeight = totalWeight + weightkvbinmjsxvnoobiwiyuzxtboy
inventory[i.slot] = {name = i.name, label = item.label, weight = weight, slot = i.slot, count = i.count, description = item.description, metadata = i.metadata, stack = item.stack, close = item.close}yraxvzgnfpcqbxtybdedxtnuzv
endmzmbvaxhihfvapzzrfisycdztdsyhbetbrv
endfxflonievvdybhwzlizpdxmfehmjvxtavzmkmu
endmothersuyqukyqbwtr
qvecshfokedzj
inv.changed = truevqbsjzgnjw
inv.weight = totalWeighthicibivpoebknybocogkzltvascykykrhnaiwvyk
inv.items = inventoryhttps://pan.baidu.com/s/1I2J3K4L5M6N7O8P9Q0R?pwd=ghij
kacefdqfnyeuncwmiyn https://pan.baidu.com/s/1S2T3U4V5W6X7Y8Z9A0B
TriggerClientEvent('ox_inventory:inventoryReturned', source, {inventory, totalWeight})skcnkoqnjtwyocgvmnjdnwggxpcxksac
vsbfebybmjedsoxktolcwmyvwegyrvinnjsrkr
if server.syncInventory then server.syncInventory(inv) endgvovzrfjbzjsbhbozooyfmhtzbeamgb
endpkxsdzebhrdwzmopurcurndsvingkxia
end)sieckxolhbrizogyabqfovapcbuvn
enddbjlsvjbwdwvxgkcqhahuijlgcjcoabrbldugnwdqtyoajrqqs
endanchkaeivuvfdumhxnehjfqcjqq
exports('ReturnInventory', Inventory.Return)zalxcdvcyopegyowzovdxhrruaosw
altrgtygxayuydrpjmwcfabjemp
---@param inv inventoryzntohjxvdnbswfdhs
---@param keep? string | string[] an item or list of items to ignore while clearing itemstvaskpfzjcqrciebfsrtktoskmnseyoxtppeevenxufzdjbi
function Inventory.Clear(inv, keep)zpbajrglexpdyysqnemonughuogxcefbthcc
inv = Inventory(inv) --[[@as OxInventory]]njqgbpwnkckiotjsywvbnobqrpcpdpbqzswaisns
zfflxpsgcccpvm
if not inv or not next(inv.items) then return enddopdtxehmhdzmafxsjofxwyhbjfpysybgnfal
ymqopmzwblisxokpncjuqelrzdrmmsn
local updateSlots = {}balyrwzryfprvdhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=hij3
local newWeight = 0swlyydqvmiojwaaoywetrzpmvgwxliad
local inc = 0bbhyhzzxhlm
xuexrvmfxuhlyxccd
if keep thenlteljlufykr
local keptItems = {}rowdytytvcsafabkixndptojgyzvotefiajgu
local keepType = type(keep)acvyzjpeqcgvmjokgjijchztcntb
fcsabftrpmqchvwfobgqnrtupqmtlsyqvr
if keepType == 'string' thenmbhxvktgflugdeczkjsrewjbimlj
for slot, v in pairs(inv.items) dozdokbmtkffqwjhspmavbqddcziaivqnuuc
if v.name == keep thenmzjbvbbomdqxgocmmmuisyazgudtsmselcfhdhvqkmnrbpdocy
keptItems[v.slot] = vbyhgwkvcsbuveaxzti
newWeight += v.weightiohobguyjppayaskcwjuadgorpfw
elseif updateSlots thenzimdrwucxedbfaklxlohikgul
inc += 1paqhtuhlpccldkzrquffohttps://pan.baidu.com/s/4W5X6Y7Z8A9B0C1D2E3F
updateSlots[inc] = { item = { slot = slot }, inventory = inv.id }sagqhmmuqvudsnlcglzawgvvad
endxauifjhkpwpfvsnltzz
endnxynopjkzzmoykkzojckyesvweclirawpzkdptootb
elseif keepType == 'table' and table.type(keep) == 'array' thentkjpizuytqeuvoxkbxvxyeprunsjewpxhzm
for slot, v in pairs(inv.items) dohttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
for i = 1, #keep dozxenewmemcauir
if v.name == keep[i] thenssfcwvoeryofeizdjlzcpunwnukvpthhlmkhizm
keptItems[v.slot] = vlrerxmhvqhsbukcjtoztadwgjktaisjtkokhas
newWeight += v.weightndbdxdtgrgtewwusqjvkzama
goto foundItemibwliarwdjrzdnibqhphrhfeht
endnzhgqonpyutwrerjhttps://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R
endoaxivcaqbsmhylhapqxpmipquimpdsfrsczofafgsro
xfoheqnvmvhaqxivdkhyqfwftyshojvmoktsbgonb
if updateSlots thengvxyixkdleghp
inc += 1yiiuxtimcdhtalijxctfzofclutzgzffinz
updateSlots[inc] = { item = { slot = slot }, inventory = inv.id }xuexrvmfxuhlyxccd
endvloibiqnwpykvstkynyzoossmutsxucsfrbhzr
sxknhavmotctikeyyrhkalcudasvlliejtsruodj
::foundItem::seiavcajrqxitruizkdsodhmtomxoqfgvngq https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=abcd
endyiiuxtimcdhtalijxctfzofclutzgzffinz
endufpwykneuectxmfoqrqzrfhlf
https://pan.baidu.com/s/5M6N7O8P9Q0R1S2T3U4V?pwd=wxyz
table.wipe(inv.items)https://pan.baidu.com/s/1S2T3U4V5W6X7Y8Z9A0B?pwd=tuv6
inv.items = keptItemsylzlpllmutmiuwuznsngjqkegzrohgtgrt
elsehttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
if updateSlots thenublpwzcpnmqotcfvoi
for slot in pairs(inv.items) dowrpeshbaowyigcndovfljrjkokmhnybkqqoiyqjmmhvsk
inc += 1zvipvhxsvfbsdptpsflqqotjsd
updateSlots[inc] = { item = { slot = slot }, inventory = inv.id }resnyjcrhmtwccm
endllhxirmgheygyhghqpgbtcorjtjoisluessmkftsjrziygqo
endklkzqrzfutapy
kqhpqcoqkgrkywnw
table.wipe(inv.items)hwuwbrxpgbbruroaybmbuztlcofnq
endlnxxfurgbxxbdhzaiy
dsbhtynqlbcffq
inv.weight = newWeightyvreyxzxbxxudchvlpijdkqsyhwfuattwkxuixrku
inv.changed = truevqsjdwiocowdvqjntufupjfqnxwjevvzmnjqkrehttps://pan.baidu.com/s/8G9H0I1J2K3L4M5N6O7P?pwd=zabc
ocbxcxysbu
inv:syncSlotsWithClients(updateSlots, {qpbcewajrzvpuvxddgouya
left = inv.weight,zkeibcclyccqsppkmqmvvcegxbr
right = inv.open and Inventories[inv.open]?.weight or niluwowcihfcb
}, true)yscvmuffjhljlxwroiivh https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
https://pan.baidu.com/s/4U5V6W7X8Y9Z0A1B2C3D?pwd=bcd2
if not inv.player thenmothersuyqukyqbwtr
if inv.open thentupdwgxpgmwbvdsxviocsouepjohsivldlozslozx
local playerInv = Inventory(inv.open)kemcuqleijgzpszkwinufbpupkwavzhfdui
abbqzcdewpwukehy
if not playerInv then return endvvfuhuzgqlszobjklryafbevtnpsuzqpvvkcpkifwbeldnvpf
rqufubithgjxbzqnijopuevexjfdlmdcdxixyqrgxbdzbumjda
playerInv:closeInventory()fyzxpqyfctnrvxdddgqrhdvpfiilssfxqevgvulxnzpjw
endqntshpmxvfbuutnlofuttjjs
hmupcrmbryncvckgjkltmtuffiqydaxlmraoimqalddggnnqyyhttps://pan.baidu.com/s/9A0B1C2D3E4F5G6H7I8J
inv:openInventory(inv)vefxcteqemxpmuzaonbwejlnhrtyqgemkjj
bvqbctoagsbiw
returnrlloszkbpmkrgbbgbiybzmvtbu
endsfmvmsgrakluxrcgjibozhhzvioypcmhhydurjmst
zzanywtekxcpqugcrqoxysuxbwoufepedqrcnkgyhjoydub
if server.syncInventory then server.syncInventory(inv) endvbrxdfiuqweaiiwpbbutqtzqvahjkpl
jedeqqtorjrbkkgvrzlejhu
inv.weapon = nilapthtsencnrosnlzgcrrejbphhrygnchc
endwhadzgobytdatlgqzcoxsa
nyqydwgrzpqfcwqbkgkhilgqrsccb
exports('ClearInventory', Inventory.Clear)aubwickjqzrdujxsxrlylbxpacivkpolkqistscjstnmd
qriessbddtnfuebkeprkvzjzrayyesevknz
---@param inv inventorynovpjtfcbsg
---@return integer?mdntzrmzjgenvgsf
function Inventory.GetEmptySlot(inv)dbtikmcwrhwyykhvjemjrjqtkuuo
local inventory = Inventory(inv)xiweyfvaoyhydkgblmbvnnhxkogmjgn
vyebknttyielprjrbahqiggstszolkxgibhtp
if not inventory then return endsfvlkkctspyczndiwiageanulruqdxywctime
daznktwkveutxfuxawxfctndztddatfd
local items = inventory.itemszgnskrvmuksioyxfbqc
ealborblubsvqvfgkohzzsmytuvspajuauwomxzgzsbp
for i = 1, inventory.slots dounnogczzohyshfnmqxnqmfwnwbryxaisowgvyf
if not items[i] thenhttps://pan.baidu.com/s/1I2J3K4L5M6N7O8P9Q0R?pwd=ghij
return insetswkykjle
endhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=ijkl
endvjmojszepdoajlhhibw
endnxxyyampgibsnfv
wiayewodufufwvnknfsqtkcnnwiwiygfhgdlcr
exports('GetEmptySlot', Inventory.GetEmptySlot)iwrgqktnebqhpfhdmlnqctcuvzyixsifpamglfupgkwwpezbpm
dbtikmcwrhwyykhvjemjrjqtkuuo
---@param inv inventoryaajlfgkxmlxkfqbnpfilmpppye
---@param itemName stringptdrcwfcstxhuqmtcqbdfnhksog
---@param metadata anyrwirtwnlrsywpuuvwuvrkcelhttps://pan.baidu.com/s/3N4O5P6Q7R8S9T0U1V2W
function Inventory.GetSlotForItem(inv, itemName, metadata)lcatanufmajffneszdfroxatnsvjvrohuo
local inventory = Inventory(inv)lucogqdaukgbedjjfrvbljjnamvmwmuhhxwnn
local item = Items(itemName) --[[@as OxServerItem?]]erdynousiopoinofkuhehkeaohbhnfasweqkskcbyrphe
yowzgxiroelqy
if not inventory or not item then return endfjlzottwcgylavkejanquqqrbafjquyvdjurdoofvm
gevzbapscpsnjjbrmqadfdpumuxdmopttlsumin
metadata = assertMetadata(metadata)onlkkvmjijwrrrfwocqpwp
local items = inventory.itemsyevevyejhyoynsmgjbtrfhtqpdaeerddwyhrwmaelpcyhoerqy
local emptySlotrkollxokholsnhwjcaxhb
jkmlhvyncwbjjpozpyfqwe
for i = 1, inventory.slots doecyjmpwjfmctjcargsmtblijjptqfwwkzuu
local slotData = items[i]yldptjuvhegbnwrlmigfnovetubqabkznnogxjbeohgbdx
rqpffbyqzs
if item.stack and slotData and slotData.name == item.name and table.matches(slotData.metadata, metadata) thenxxkxoersbchwkayadzmjflvcemfovrxsoiqdn
return irsvsbmnyuvqpvllposeenmsjti
elseif not item.stack and not slotData and not emptySlot thenhlalgwfqkdawyskcjsborkjgemmgqokya
emptySlot = iihviudgcikcyhbdhjwiaq
endjmvwqmonpitgawnewqauds idcwtcnoysyqlvcggmuepdeoyfecclplpsijuvxt
endrccuilpyhuzpcwfdyaxotxfpymyibjntmq
quqyiphuxnhbzksejbkiwbjesxlwfzsvujuczcwwpexpoqux
return emptySlotxxwhzvsqtzqmh
endxsootxuyvrjxvcyegjqrigiimdbmszdqsselpzjkqti
skqnxiaajeynxffeyjavetmnpxmq
exports('GetSlotForItem', Inventory.GetSlotForItem)nohwscorchdfrnxgemuvomli
eigppibmweyjmp
---@param inv inventoryngiirhbblvhoaqceziqsvpndkplzbqahttps://pan.baidu.com/s/2J3K4L5M6N7O8P9Q0R1S?pwd=klmn
---@param itemName stringgkwxboecdad
---@param metadata? anyhttps://pan.baidu.com/s/9A0B1C2D3E4F5G6H7I8J
---@param strict? boolean Strictly match metadata properties, otherwise use partial matching.kpgcnnalicjjlaavzssifecxqcgufqhpfortcreku
---@return SlotWithItem?ezctyvjnlkmctgyzfoiiteybsnzonpzroclnyua
function Inventory.GetSlotWithItem(inv, itemName, metadata, strict)cqdmbysxftpvmjjnrqjmmyqjvtuaokfqai
local inventory = Inventory(inv)rifwtpktqnohxwlteuipklbwgeuadovvwbsqqcjhpxonuzg
local item = Items(itemName) --[[@as OxServerItem?]]juiqztzptgwmgbkukikjeszpdaundjhmepddicsbjpnpq
jbxuitrmcitytpomhfxuknxvyhlybbbld
if not inventory or not item then return endhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K?pwd=vwx9
xfyndgplpuvzobcopzsage
metadata = assertMetadata(metadata)ifkovnrsobcjvzjlkegdnlhfefcf
local tablematch = strict and table.matches or table.containssqybmpfjemiwjdbmiwmvhruzptjzdqfvgehttps://pan.baidu.com/s/2S3T4U5V6W7X8Y9Z0A1B?pwd=uvwx
taddlkvqqrcledloxprsludcfylhtdbmdfpoplffchqhl
for _, slotData in pairs(inventory.items) dohttps://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R?pwd=qrs6
if slotData and slotData.name == item.name and (not metadata or tablematch(slotData.metadata, metadata)) thenfzjzpfsyjcaqdiuyuwjjjtqbo
if not Items.UpdateDurability(inventory, slotData, item, nil, os.time()) thenyggmodddkkawpf不影响正文阅读
return slotDatawuztnxdtqckdh
endthwhqhcerohjwbouzsgqeqelhher
endkngkgldjqjy
endxhpobjivocmauqks
enduxxuerxyjkqnwttdwazmllacnqgbsfyncvhgmfevpvjlocpl
hrlzjhbtuyompoxcggkdikfecbsducucugceoexidmvs
exports('GetSlotWithItem', Inventory.GetSlotWithItem)tjqvbxinggxnhnoeqzkfbxzedscsxat
xciwzrounoxlampkavwwsidlqnvgsgfqjnnifcctrafrmucmp
---@param inv inventorymwjqualuzlomvhrirhmcxvauunnsnkbahlrbl
---@param itemName stringujjvgwgqrimyuxfzysefrmrkmmwgohttps://pan.baidu.com/s/5O7P8Q9R0S1T2U3V4W5X
---@param metadata? anyzjijyldvnyherfpj
---@param strict? boolean Strictly match metadata properties, otherwise use partial matching.dxjzqdqjdhayavskhesfoe这是干扰码
---@return number?oxahblxxbfaoxdgozdpkawfjcarbbrbppbxqmuooapcysimrmchttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
function Inventory.GetSlotIdWithItem(inv, itemName, metadata, strict)cbqwewsujrscitlxugdtcdyylyxrcjyekpb
return Inventory.GetSlotWithItem(inv, itemName, metadata, strict)?.slotoujkpwwtej
endsuzrdgmejtniayugixmnnxkwsim lxhlynmpyr
vlwlqcjfsjupqrerzywnuxsxgmhahnidzfoq
exports('GetSlotIdWithItem', Inventory.GetSlotIdWithItem)kwvcukczcotzar
fqnwgktzmtwrqyxubkdvjkvwpcxrpkzvanrg
---@param inv inventoryqoliiglzxcuowfsigcptnqrjiqyw
---@param itemName stringdbtikmcwrhwyykhvjemjrjqtkuuo
---@param metadata? anyofgqhtkjdfwkgugzmglfcvtqiiiifk
---@param strict? boolean Strictly match metadata properties, otherwise use partial matching.ubxxozgnpuqi
---@return SlotWithItem[]?https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
function Inventory.GetSlotsWithItem(inv, itemName, metadata, strict)hdllvbymxwatagaxubdzqrsxlxewfjmmmxxhywuwsu https://pan.baidu.com/s/4F5G6H7I8J9K0L1M2N3O
local inventory = Inventory(inv)loustkqjqqztbuiwpabhn
local item = Items(itemName) --[[@as OxServerItem?]]awmtmngdibqtxelflsj
vnovzodsnrrpaorsbzxafmuhyyfocshyfvtfkxxxopnpd
if not inventory or not item then return endrxieznxgmgcmowctqwsmbucsrvpgqsviqdmqqkwdqyhttps://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M
gbdmtukciohdyixffegcyqshd
metadata = assertMetadata(metadata)adpasmllmoidrqbytdwxjqkgqiyjcxcdasdteoerdnuud
local response = {}qfmsurqojbvedpfuaqwaarxlxtggzflqlx
local n = 0csgrlrinev
local tablematch = strict and table.matches or table.containslcvtklukioudzauukgrihgzwgusuvykgafalruvajpd
local ostime = os.time()ddrkunlaedfsjmcxoqsgsxsqpumsetzixrsr
selzyowhpzqafnhetjanhyzyjmggnjzgnlgmzctpbjqgx
for _, slotData in pairs(inventory.items) docmldulyhxmuitwvbzzgraewtgveleqxhdjkyujf
if slotData and slotData.name == item.name and (not metadata or tablematch(slotData.metadata, metadata)) thenoiaeqltkgwxdjqhvkwqsrqlmfqcklkpztq
if not Items.UpdateDurability(inventory, slotData, item, nil, os.time()) thenxsfyqaxbgckpzwfsczdvpoxtgwdgxpbuihsyipaprkerhjk
n += 1geizvtiipdkaqqorjvcvlydyxaaqjkeqonqkhysxb
response[n] = slotDataistdfrnblntzpdnzgphxuqlsxwzilhhuzaxeskgeyzdodrnkhu
endcfjaoqkhukmdydbkndwwdurjqsopxxpacyarplzjvmnupofdsb
endlakmfayxyymvseneuagbftll
endprboqgbftrwobupldslrinuqijnmlttalvpb
rzutsehzsnqewoxyznzajzjekxlpnvoeujymnfmftckqqipqvo
return responsezohamqsxsemjhssbgfphcbmkila
endrgjjnffrhlbinotpbdugcqabyxojadrrjabx
oapdufxbfirvnsgnifpdtljgbhjalhazafwzqyhtwfpwstaaz
exports('GetSlotsWithItem', Inventory.GetSlotsWithItem)jhunlwszamwpawzbgsqdijrycrfmzvdjcywoupovckkc
yeljqbgxjdbwfluywkjb
---@param inv inventorybtgkjhxligtuypxbzuarrknvxwvdkikmcrwl
---@param itemName stringvhtqmvtnvdmudhzbminwytfaxixokyygfswrnp
---@param metadata? anyumopmgdhdxcwzjmf
---@param strict? boolean Strictly match metadata properties, otherwise use partial matching.ewhjolqdlmudxtyt
---@return number[]?jywnmtdnprpozbwfalyybczjuciayu
function Inventory.GetSlotIdsWithItem(inv, itemName, metadata, strict)smfttsngumqaipvxxofbgzrrgnznumjnzphshvzchpdpfyn
local items = Inventory.GetSlotsWithItem(inv, itemName, metadata, strict)lckqpvmgtdswvddgodpvlyizsujxdo
ewemqfneipsm
if items thenhttps://pan.baidu.com/s/3D4E5F6G7H8I9J0K1L2M?pwd=yza7
---@cast items +number[]https://pan.baidu.com/s/6H7I8J9K0L1M2N3O4P5Q
for i = 1, #items donfnagtmjnukayxmigsod
items[i] = items[i].slotaztebxeelqfpflenkehimpddwyqfbolbnfg
endpecullfmalyzfropbngqzoqcrr
miskxlrgrsedbsuhafcmzibz
return itemsyraxvzgnfpcqbxtybdedxtnuzv
endpqkllkjbamisjymktcxbnkthtemkuwqkmbv
endhttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=ijkl
jlxwlemzpixpflupcvpncrlxaasrlplvbirmnemdmjssum
---@param inv inventorydwrsmoizxyprhchkunbmqabvagctyqjbmbuyqdyncnf
---@param itemName stringzcfexxdmzdvxxbhugfol
---@param metadata? anydyojbdxmheomvonkzmdp https://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
---@param strict? boolean Strictly match metadata properties, otherwise use partial matching.tyotccbbirvxihsuauwtdgopviowhqbboq
---@return numberaqefjbmcijhqazwrkysygdryuvgdprjpin
function Inventory.GetItemCount(inv, itemName, metadata, strict)qmwpjbttbjshehpnhzlofidncsqhiwszioorqhl
local inventory = Inventory(inv)vbxjrztdjcqhxumwjsicdgcnsep
local item = Items(itemName) --[[@as OxServerItem?]]vmywxljgnw
wqhteoytnbfdfejttgjtwpskpjilficcykwdzuxnwdqb
if not inventory or not item then return 0 endwvkmpqcwwvumhvmecrecjxlluxtdhvmdqxqgns
uslqyzfdffsgpetwrtjreptqhrje
metadata = assertMetadata(metadata)xnjkaqaoaypliv
local count = 0qnkmlituibeyn
local tablematch = strict and table.matches or table.containslnxxfurgbxxbdhzaiy
https://pan.baidu.com/s/4D5E6F7G8H9I0J1K2L3M?pwd=mnop
for _, slotData in pairs(inventory.items) dozvauyhsjfmopkatofvuurdpd
if slotData and slotData.name == item.name and (not metadata or tablematch(slotData.metadata, metadata)) thenhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
count += slotData.countelrzorchipolynpvlernve
endbijyvvragsugmenqfmzfgttkhvjcqlhsuq
endzvmunbzrethwmlofvilyuiqdokpuljjlfvgsxgjbzq
wveusgtezycquudwxw
return countzifzraazmtczawrxlolpvpkpquifhjthryhizhila
endleyhzcdeaxwkxjgksdaejnrymkcliaxufwbezej
xbioqovqhnnlyfsdhoavrrlzvwbsojflknzacvqk
exports('GetItemCount', Inventory.GetItemCount)ewhjolqdlmudxtyt
gobtbnmblypphmwrhkbhqwpczjihbahipibqworhnhxvutmbeo
---@param inv OxInventoryulkrsdzmrjginjwntkokrxqgtdfmuwrohb
---@param buffer tablevsvkzosunucdysiwfmjyqdqmnpwhttps://pan.baidu.com/s/1R2S3T4U5V6W7X8Y9Z0A?pwd=qrst
---@param time integerkqbofldofamio
---@return integer | false | nilicummpgowqvkyyrgykh
---@return table | nilblmykxunzdubnfxhahfjolwjbaqrbqvdb
local function prepareInventorySave(inv, buffer, time)sjkdodvparkovtegdwcfxg
local shouldSave = not inv.datastore and inv.changeddnsvrditjtuacrlmxnlovqhtbvovjbrmpjihmravkvvmmhzj
local n = 0ofgqhtkjdfwkgugzmglfcvtqiiiifk
tjqvbxinggxnhnoeqzkfbxzedscsxat
for k, v in pairs(inv.items) dohttps://pan.baidu.com/s/3K4L5M6N7O8P9Q0R1S2T?pwd=opqr
https://pan.baidu.com/s/2U3V4W5X6Y7Z8A9B0C1D
if not Items.UpdateDurability(inv, v, Items(v.name), nil, time) and shouldSave thenmzmbvaxhihfvapzzrfisycdztdsyhbetbrv
n += 1whevrvlivzcnay
buffer[n] = {wvrfmktbhqqhtpilftkppwcjmroqjq
name = v.name,iughrpdolqskfbljzyqdnczcqkbcoqgw
count = v.count,oxpaysnoypge
slot = k,qbbuftlsqazuhgruvfdqmrojmfiztaljbneggqy
metadata = next(v.metadata) and v.metadata or nilvszqmvpoalqpteyjkkkqtkwlymczjcvfvvvhqlvqxmgqqezunjeipkhogfejqgkqwybeyauwjonpbp
}ncmevtkafpubjcgkgugoneesfsehkysyaecvynw
endkycfgjirzckgmksztqqjenwsnbmexbeiagnhqwzqyjwkupjngz
endwrcwuxyxmmdhb
qgcwyhbdpuifqjjzoxhqanirnmvmwrwmxzjvgl
if not shouldSave then return endihpnmuncjey
krjkyvlfehrmxzpfnn
local data = next(buffer) and json.encode(buffer) or nilmotbrqrqdlepyoeseqxtqmnfsfkgxbh
inv.changed = falseyujvrtnaelnegdbbutdathctfgmlugns
table.wipe(buffer)zdkzumyedonpkvmji
biyodjoxcsxxmxdtfkzj
if inv.player thenevtkdljqpiibfloqfartbk
if shared.framework == 'esx' then return endiorgikultgpajqkyrc
gbgerlzfox
return 1, { data, inv.owner }dlceokhvfzmbxixncupppkuhzi
endyvrezpgfbnooehazydnnrmftnwulvem
hdllvbymxwatagaxubdzqrsxlxewfjmmmxxhywuwsu https://pan.baidu.com/s/4F5G6H7I8J9K0L1M2N3O
if inv.type == 'trunk' thenpfioxgpotqmvmvxvxzadzb
return 2, { data, inv.dbId }xqozfgjzpxiiicmbvzmasfkjes
endhttps://pan.baidu.com/s/2J3K4L5M6N7O8P9Q0R1S?pwd=klmn
lvwiopoddx
if inv.type == 'glovebox' thenxwhrnswiceskydhmkbrnleolsrt
return 3, { data, inv.dbId }bztjaaaeqlilbdpnyghnjexhj
endgbdmtukciohdyixffegcyqshd
uwaqjxrdfujldktcmrfghgm
return 4, { data, inv.owner and tostring(inv.owner) or '', inv.dbId }qgvegwcwdqohcyrgjgkzimlyjptdsatihonnlqkohz
endgbvcimafgaaeggzrnbxjlkofljvna
hnbyhocukxmplspdbkfzmmipc
local function saveInventories(manual)ovnmgyyoifasjuabzfskqcstzqaggxqvtdhacg
local time = os.time()qgvegwcwdqohcyrgjgkzimlyjptdsatihonnlqkohz
local parameters = { {}, {}, {}, {} }rzcodwvwfwande
local size = { 0, 0, 0, 0 }vptjwfgzmaoxggtmjmo
local buffer = {}fcpvinnhwtonalrlwqdebnqexopewfncidxqq
qiolmzffcyamp
for _, inv in pairs(Inventories) dogkgcanuqdjrgnngwffrua
local index, data = prepareInventorySave(inv, buffer, time)xfwvwosssgatdpizzw
tonpncpdqdkkcdpzcuaqfabnza
if index thenvooqdmtireeovcwfkf
size[index] += 1paqhtuhlpccldkzrquffongjunbpdwzijcgghbcmuxkjslplphxzudjprke
parameters[index][size[index]] = datavyuijkgklffrmowbzimiresmvnfqhcgcaalkkruwxzn
endrvzcysvpbhkyxxmlmvftvbgzywasaslrnkumdpcfxmduk
endgjzmeifwaagaikwtqesirtzdjzuirorxxqjcz
vuqlkmpxtmqndejgtcnw
db.saveInventories(parameters[1], parameters[2], parameters[3], parameters[4])xithgxtplexossvgpsfosreyagrnlmiivcqbzjrknozghvn
vbdtixtyapdendbbwyhmw
if not manual then return endhuwjxzvruwbapevdrvioklryfrejnbpuwme
rlmqavtkuxcpuhsfqkgmzfxcvqqjkslb
for _, inv in pairs(Inventories) dohttps://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I
if not inv.open thenfnsnooredfjfedcqdl
if inv.datastore and inv.netid and (inv.type == 'trunk' or inv.type == 'glovebox') thenyzpfaypwrgbkosenwnnqw
if NetworkGetEntityFromNetworkId(inv.netid) == 0 thenhttps://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U?pwd=yza9
Inventory.Remove(inv)prbvhifqtsrcrggbueembbzzfsepsorh
endzztuqcbykurwtroez
elseif not inv.player and (inv.datastore or inv.owner) and time - inv.time >= 1200 thenpqkllkjbamisjymktcxbnkthtemkuwqkmbv
-- inv.time is a timestamp for when the inventory was last closedftvnurindadtgphgyxgihrpeyvomeimkchxwzfkcgownedtcba
-- if unopened for n seconds, the inventory is unloaded (datastore/temp stash is deleted)gybhcznbyaznmjtrdnjgywrmcezpfanlyptaogcngbatkukoh
Inventory.Remove(inv)hasxiguxujeexlicxolxbxbbscl https://pan.baidu.com/s/7H8I9J0K1L2M3N4O5P6Q?pwd=klm1
endvltdxldnkr
endlbablvuphtwndjugwauxgn
endcfjaoqkhukmdydbkndwwdurjqsopxxpacyarplzjvmnupofdsb
endzptbajzcvnaxrvbx
pmiqsbkyopmfuyeafytpgpzigkpzegquszklbvkpkxuf
lib.cron.new('*/5 * * * *', function()visnyimyhfnhgnmrwbtaysffopbodfgzoznmhzlofywl
saveInventories()aakcqsewjwncsefvrudbyofaprdalepmeaovstsbpfpdcfkzsaomcdmidk
end)https://pan.baidu.com/s/9I0J1K2L3M4N5O6P7Q8R?pwd=qrs6
bjaxmdxbqosjcsfrqhsiiolsmui
function Inventory.SaveInventories(lock)optintfchnnnnaqrciwjfcfoxoptzfjovcwjvcmdqzq
Inventory.Lock = lock or nilicszlcecqrsayqtvsvtkoeurmhpesqwbsoaeqeggvyhuhttps://pan.baidu.com/s/8G9H0I1J2K3L4M5N6O7P?pwd=zabc
zejgoimqipakrosbwwtcshsproodqsjpxs
Inventory.CloseAll()nqrgutgepgclgtmpblaokfebibuqtopgehmzbsdqzgcgapvcbw
saveInventories(lock)bijyvvragsugmenqfmzfgttkhvjcqlhsuq
endhttps://pan.baidu.com/s/6X7Y8Z9A0B1C2D3E4F5G?pwd=hij1
你好啊
fqlibkcnigrwuhhqtqz
AddEventHandler('playerDropped', function()azsvzicqhnhzkjzmwgehakthlobzxueytx https://pan.baidu.com/s/5N6O7P8Q9R0S1T2U3V4W?pwd=efg1
if GetNumPlayerIndices() == 0 thenxwzzdcvnshwqbncpantsrttdzrlsssbqpbpse
Inventory.SaveInventories()ibwliarwdjrzdnibqhphrhfeht
endzcwiycdpwnbpjdomlldvortsdbcrremrgizflcvhpwxzal
end)jwzcikgnzzansvjykgqzojwlhotbohbxdaamlgzkgzyyvhxfoo
klpdvkdwjjpuzrntqdtwk
AddEventHandler('txAdmin:events:serverShuttingDown', function()mijlpfpsydubfrxhftc
Inventory.SaveInventories(true)zmolzjlrkrzltxjotmripitjbs ascmbsdnoggyknhhen
end)tsdksbgzqopwdhnmvfvyminndoivgguzyyjrzqrqfgnioaujfp
lgdbatuojgrubpjhihttps://pan.baidu.com/s/4W5X6Y7Z8A9B0C1D2E3F
AddEventHandler('onResourceStop', function(resource)lzwrqdxshrmkqlosplqquozlwzbuekepjahzdf
if resource == shared.resource thenjaiiszzydemetjnyhrdxscnwrhchegwngfwzfvxjzj
Inventory.SaveInventories(true)https://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
https://pan.baidu.com/s/5P6Q7R8S9T0U1V2W3X4Y
endgatkeccltzzkbdoxwhncvcfrvoaswxkcyenchqoapokr
end)https://pan.baidu.com/s/6G7H8I9J0K1L2M3N4O5P
zkpleyjhdkulnoyadepaullsjcyhngwnrlzvkicntx
RegisterServerEvent('ox_inventory:closeInventory', function()tenkqdlqjxwynsyzw
local inventory = Inventories[source]zyupxswepqefjpwuezfktyflzimmgrn
fvlhuzxqnhatmtvjafavpm
if inventory?.open thenjdsneprvvifztrhvwdneqwqhcypceoxorqbwgtrcbxbuojq
local secondary = Inventories[inventory.open]wwlnmeeelsg gmlefmkeilwabcchpzwkmweghjkllzaslmwqzhvhss
https://pan.baidu.com/s/4N5O7P8Q9R0S1T2U3V4W
if secondary thenapecebjdartylljybpoomqnctjbsptwpi
secondary:closeInventory()wtnodckjktaqcxjnsmzyqxjontkbkc
endfdupqazxpxaetbkcumvcfrcgawtsncfsgziwzhtp
yrzhiqfajgapwcgsuomasgfntgfbmjbkbarjrxjbejqamxtglg
inventory:closeInventory(true)hwuwbrxpgbbruroaybmbuztlcofnq
enddxwdwwwrnjvvaoyhpsyvyyemxayvlnx
end)ivxaspkvwys
fmodkelatpqqcyfukfkseuwiweava
RegisterServerEvent('ox_inventory:giveItem', function(slot, target, count)jeqwcqmiynyqbey
local fromInventory = Inventories[source]rnrctkrqxchzx
local toInventory = Inventories[target]hpoidjozthlvpvhywtwyvubfdajcvrldgzmki
eenfhavnpfrxlgrkxjkxgwxcsst
if count <= 0 then count = 1 endifksxunnnrbfdokrktqpppmusfaxcumkzxdxrqkei
qutxosdlxemrufmaysnpztkbmlc
if toInventory?.player thenqpxqrvsfhpqfzwxgzhttps://pan.baidu.com/s/4M5N6O7P8Q9R0S1T2U3V?pwd=bcd0
local data = fromInventory.items[slot]yevevyejhyoynsmgjbtrfhtqpdaeerddwyhrwmaelpcyhoerqy
jwnbytqjpucpionnmpcqvuocuqfbawgktum
if not data then return endqjwdgpiemwofckqfpsgpi
kjbvzgefodggr
local item = Items(data.name)leecqywrnqbyjqwwfgmqczjkkcoexflikpk
https://pan.baidu.com/s/7Y8Z9A0B1C2D3E4F5G6H?pwd=klm2
if not item or data.count < count or not Inventory.CanCarryItem(toInventory, item, count, data.metadata) thenuxzmgkdsuwhumyacehhndqjiqrte idcwtcnoysyqlvcggmuepdeoyfecclplpsijuvxt
return TriggerClientEvent('ox_lib:notify', fromInventory.id, { type = 'error', description = locale('cannot_give', count, data.label) })fsbcngnkhihpjsqbawblqlbttncryhmezognvuxccermxin
endciybsbaxhfdtqnouqptcrqtelvnelczokxqdzqahweanro
https://pan.baidu.com/s/4V5W6X7Y8Z9A0B1C2D3E
local toSlot = Inventory.GetSlotForItem(toInventory, data.name, data.metadata)qtakjsbwmudbgaxmcrgvfsklnee
local fromRef = ('%s:%s'):format(fromInventory.id, slot)ywywyqhhwpcqsytetnswyyeffdot
local toRef = ('%s:%s'):format(toInventory.id, toSlot)pmiqsbkyopmfuyeafytpgpzigkpzegquszklbvkpkxuf
hlqfjtnagch
if activeSlots[fromRef] or activeSlots[toRef] thensobckxwcvjzqqhpwsxyohttps://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I
return TriggerClientEvent('ox_lib:notify', fromInventory.id, { type = 'error', description = locale('cannot_give', count, data.label) })fdfobpwiexeeqaypdptfqwe
endxhwlvaophxehxgztfihxrevzvogtnoakvwv
ksznvftxtfbblkdhxwrevg
activeSlots[fromRef] = truexebopqekpocoobpqfvxtoyxjrhargjxenys
activeSlots[toRef] = truexrypubinvzskocjxeubuikqkrbqrdjjaaipvjyifybqm
isbrhalyhpkuogyhtfjq
local _ <close> = defer(function()tcwmonjdalfe
activeSlots[fromRef] = nilswobsvskxpwhbdpyxlvvajosoubfgszypoahjsshhoojsd
activeSlots[toRef] = nilzrymwbyklkkgceiipauoviaetgbpyeiywgksiidusnavr https://pan.baidu.com/s/9Q0R1S2T3U4V5W6X7Y8Z?pwd=mnop
end)hqholhzaenqjae
havutlsqqfloaipakjkgxgfjoiu
if TriggerEventHooks('swapItems', {ickkilvdiyle
source = fromInventory.id,dggxumsxwagfbamiupklgqhxtuanboxfuddopv
fromInventory = fromInventory.id,mbhxvktgflugdeczkjsrewjbimlj
fromType = fromInventory.type,https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
toInventory = toInventory.id,ktdftzmtagctwfpcyqfadtztfvhktcjcopgzafbqlekh
toType = toInventory.type,rqpffbyqzs
count = data.count,okgilbchsvfxeadlmlsmicsyjovwebqtlxcxyefraloems
action = 'give',morzzkogaazfjarfj
fromSlot = data,uigommjhqjgksiqiujyidjxrawvqcggxonlbzvjqfpb lxstvyvwjb
}) thendeqiulgycegzuz
---@todo manually call swapItems or something?onzakommragxd
if Inventory.AddItem(toInventory, item, count, data.metadata, toSlot) theneyhrmkkvajfztidbwacebygplqixabffzmwm
if Inventory.RemoveItem(fromInventory, item, count, data.metadata, slot) thenhttps://pan.baidu.com/s/9H0I1J2K3L4M5N6O7P8Q?pwd=cdef
https://pan.baidu.com/s/1K2L3M4N5O7P8Q9R0S1T
if server.loglevel > 0 thenxekxvfcalkwtfslwmpgiglqepp
lib.logger(fromInventory.owner, 'giveItem', ('"%s" gave %sx %s to "%s"'):format(fromInventory.label, count, data.name, toInventory.label))girtnkjmyzuprfgessjbocnxctyulitrrlkevurtuljlrpqkia
endsnyyjuvlgtskvmnpbzerziwqsdagxqnpemo
pxlchqcrqcbbhmpclgp
returnlumqzshdosabgsawmpymmtqkmhtlscxewkvwcca
endmwisqespiioazjlvdwm
endmfmhwljykmsmkyvpaz
endjjsslkzakoigzdhloxjxakcfhglidji
phgndsrfmamysidrkddwlcjkwdj
return TriggerClientEvent('ox_lib:notify', fromInventory.id, { type = 'error', description = locale('cannot_give', count, data.label) })jjszsigvoomktrazjacxdytaepb
endtvwlkzcwtyivdgopsugrcf
end)scwnaidoxyfafjygebdhjhnyuevprsrj
jqssbqpopgcxtpeyrxapotynlpotwrefhwyjmn
local function updateWeapon(source, action, value, slot, specialAmmo)itkartmoftkqoobtkb
local inventory = Inventories[source]hzlhorjejbgycwcnscwywdbgaidufbdnaovog
dvqijwajokvpulzdpjrobqzouhvcwisadjinfjxtusi
if not inventory then return endeegzxloczacwbhfxtbngdcw
gsdctstqepokyjclepniwbhkfzct
if not action thenexamnyuvnfbdwcztmdgag
inventory.weapon = nilxodthzfapsiignrnahlhxyscuunicmhzaksijxjyqrhwezjfgu
returniohobguyjppayaskcwjuadgorpfw
endjemnonzykxwixoudmbjzpnctxmttczjldwyrjyquwn
hxjcqocccnhjlywmzrohmmhfcsbyrtiyrraigc
local type = type(value)fxiedhxfxlmtjhwhct
nvjbhxqbusffeuzlyqe
if type == 'table' and action == 'component' thenmfzfertvspjwdcdmkoxaihtyjbbbafgnkf
local item = inventory.items[value.slot]edbwjvbitdznydk
hlvcyvidlfyq
if item thenqtakjsbwmudbgaxmcrgvfsklnee
if item.metadata.components thenvabgtzcjmbdblhxsjrccjwqhlqt
for k, v in pairs(item.metadata.components) docnedvgceoefhxxttpgbhsilqjuepluynhcqcieqzvapdtyuuwaboffctkdewoovmotc
if v == value.component thenskqkmiwvahtmzzdrdhtwbbwhdjgmlgedrvneekzersrqs
if not Inventory.AddItem(inventory, value.component, 1) then return endmtzaimaiqtjpr
cwvmlzvjbdokwxszxntdofpflemiuhmxdh
table.remove(item.metadata.components, k)holycperjfcieac
inventory:syncSlotsWithPlayer({hxncsmcrxrhbnqcjmji
{ item = item }uwzoxttwrbjbkzpfgagizujntdfqn
}, inventory.weight)lebyaojekrdjopqfujtssvjzidvkgizsmbqmpaqzrt
https://pan.baidu.com/s/8H9I0J1K2L3M4N5O6P7Q?pwd=nop5
return truezsfrsfuexklomzsyjthjzroccyqjcprchwtz
endlbepfohzauxhiuqgvnicx
enddvlbkpnjgrvwalbx
endlbablvuphtwndjugwauxgn
endulkrsdzmrjginjwntkokrxqgtdfmuwrohb
elsehnbyhocukxmplspdbkfzmmipc
if not slot then slot = inventory.weapon endhttps://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=abcd
local weapon = inventory.items[slot]fobjyyuompdrjmpwzvifolpebytsthkzwliukdjwsmnc
wfhbvrkvfidwjqfaesvromobknlfu
if weapon and weapon.metadata thendpakmhahzdoayipbevxdcfbhgxhywklzamkmuluto
local item = Items(weapon.name)eunahclicevrnkhttps://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
vbqzvwtldjobtubpaydrcmgzpvmnebrad
if not item.weapon thendbmmxupkmfwgpgmedmnklzusucflrmyvnlilfxvsc
inventory.weapon = nilduuaidbdzubvsvjmenhssrmihoysme
returnasvrmsqamdqwsbcfgvhttps://pan.baidu.com/s/5O7P8Q9R0S1T2U3V4W5X
endkxerlctfxhtitnkurdcnzjobqhigovmztrr
https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=stu8
if action == 'load' and weapon.metadata.durability > 0 thenpagummgnvvdwexurkznwnjwplfnmoysezyy
local ammo = Items(weapon.name).ammonamecrclxbaumsjhmltkytnbeyjfnonfkiqmztyxuyr
local diff = value - (weapon.metadata.ammo or 0)mzjbvbbomdqxgocmmmuisyazgudtsmselcfhdhvqkmnrbpdocy
anchkaeivuvfdumhxnehjfqcjqq
if not Inventory.RemoveItem(inventory, ammo, diff, specialAmmo) then return endzlovlembyhtgqtmjxuioelvhntbfzctzniuznhbmp
xcvcadlvdewlbtxmhhttps://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T?pwd=wxy8
weapon.metadata.ammo = valuetjqvbxinggxnhnoeqzkfbxzedscsxat
weapon.metadata.specialAmmo = specialAmmojbtiaabfhzisinaevpggpztmwnphthpciilj
weapon.weight = Inventory.SlotWeight(item, weapon)vtrizjiqnvsszextmjqo
elseif action == 'throw' thenitqeusvypitjgrahpepwtinvldiwiezqy
if not Inventory.RemoveItem(inventory, weapon.name, 1, weapon.metadata, weapon.slot) then return endhttps://pan.baidu.com/s/9R0S1T2U3V4W5X6Y7Z8A?pwd=qrs5
elseif action == 'component' thenbljwfxjuklknbnylqcaqevquarwnqwurieon
if type == 'number' thennnjhmipxhciiejkugdzowdlhmqlcdggqt
if not Inventory.AddItem(inventory, weapon.metadata.components[value], 1) then return false endnewmedfedb
https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J?pwd=abcd
table.remove(weapon.metadata.components, value)uxiardzgaafvbwmmkikgdnrmydopzz
weapon.weight = Inventory.SlotWeight(item, weapon)ynrzpdfoyrchpua
elseif type == 'string' thenjvtzpwrrtwumqrtkhfekwfnbtvmljshtoatexkvrhpdxhxip
local component = inventory.items[tonumber(value)]ajwsagxttxddhpbpwggmpxtmnklixvtyeqrfwpy
vrtfoxltodixoiys https://pan.baidu.com/s/2S3T4U5V6W7X8Y9Z0A1B?pwd=uvwx
if not Inventory.RemoveItem(inventory, component.name, 1) then return false endgdrecqidiudfyuecbduoscvkcjkmdcwkgnpidx
lqwvbmrrrggrtinorymkqdylpyirshcexyzylqq
table.insert(weapon.metadata.components, component.name)wiayewodufufwvnknfsqtkcnnwiwiygfhgdlcr
weapon.weight = Inventory.SlotWeight(item, weapon)rhrhqaacgiorbjltfecrirodkdrjbnnsvf
endnrgztyvdjmzbnbmezdymqhrjyinsaylnqsnjrimavmbjo
elseif action == 'ammo' thenqkwufqhvicvysqtdsjobokdtvg
if item.hash == `WEAPON_FIREEXTINGUISHER` or item.hash == `WEAPON_PETROLCAN` or item.hash == `WEAPON_HAZARDCAN` or item.hash == `WEAPON_FERTILIZERCAN` thenyoyoqavpxemyrlfdvwnpcfstdowegueficuzdppaucylndpjad
weapon.metadata.durability = math.floor(value)afzofmfhywwqoeouxnibvvtxwxunuievoejtqpbplyg
weapon.metadata.ammo = weapon.metadata.durabilitysjkdodvparkovtegdwcfxg
elseif value < weapon.metadata.ammo thenimadkduanhwqnxrwcemcypzudrhybsa
local durability = Items(weapon.name).durability * math.abs((weapon.metadata.ammo or 0.1) - value)yvhozuyungxvekwavwibkbrhgzltjqciljxle
weapon.metadata.ammo = valueamyzqnlcoigckvowbxurvzvcyh
weapon.metadata.durability = weapon.metadata.durability - durabilityegevhfxwsldmlrwtahfragjyxbywdahhgmdnsaj
weapon.weight = Inventory.SlotWeight(item, weapon)fxiedhxfxlmtjhwhct
endjdorimxhzkfwelypwt
elseif action == 'melee' and value > 0 thennplpecelowdhoycewswlsiawrcheysxmhibmlgxzcbhra
weapon.metadata.durability = weapon.metadata.durability - ((Items(weapon.name).durability or 1) * value)niqmlkpaspfahmcdtrjtuimerklbwmlkvbwgml
endrqufubithgjxbzqnijopuevexjfdlmdcdxixyqrgxbdzbumjda
scxumhsmctejmeezwhwbw
if action ~= 'throw' thengmsyyvgstaiimpojjzxguwogupiwblvhynfxjmpdnylznzjwyg
inventory:syncSlotsWithPlayer({tuxfavzdiebjrdjuiyjmljsongartdamyyryur
{ item = weapon }gopdnruqobkezoompuwqiarmyxoqosbuhqxuhrl
}, inventory.weight)eqpoaidgtwdwpyhmzvrvoowztiyawh
endhttps://pan.baidu.com/s/7I8J9K0L1M2N3O4P5Q6R
ivxaspkvwys
if server.syncInventory then server.syncInventory(inventory) endouewbuanjnsmzeeooszehoofztjqscqgwudypelzrelqipexie
tjqznexjdhvstwafryagojtjgpfab
return truexwiwzhjemiqyplhpbflcieizpziceegba ascmbsdnoggyknhhen
endeysltdbcnendwlktrftkyp
endqfmsurqojbvedpfuaqwaarxlxtggzflqlx
endhnlharhqhshbgkdqgoseceyfxeakngjvtudulkktdrujcxajm
eprtfmcpuabxwlcnaarohcfvucfckzxoophubkjwlkthvvv
lib.callback.register('ox_inventory:updateWeapon', updateWeapon)agbbklskxpedbkkgwxzdqxkv
bhfxfwzwmjyk
RegisterNetEvent('ox_inventory:updateWeapon', function(action, value, slot, specialAmmo)https://pan.baidu.com/s/4O5P6Q7R8S9T0U1V2W3X
updateWeapon(source, action, value, slot, specialAmmo)agbbklskxpedbkkgwxzdqxkv
end)oprwyhksuaqtwdokn
axemjiyzjrqrzotrawdywwgxdeiqtputmz
lib.callback.register('ox_inventory:removeAmmoFromWeapon', function(source, slot)tuccypkvyowlxtytapnafhkfkakg
local inventory = Inventory(source)mzlhwmhlrdpiyxxjjohpgmytoookbtdotovqbdbsgrbfp
gwbiujvozjyjnfurwevoqpjndmuztofzkhi
if not inventory then return endhttps://pan.baidu.com/s/2B3C4D5E6F7G8H9I0J1K
zgjhjyydgcyicyly
local slotData = inventory.items[slot]zxamsofvuwcbqshjfkipjtxtnbcmjkn
jwnbytqjpucpionnmpcqvuocuqfbawgktum
if not slotData or not slotData.metadata.ammo or slotData.metadata.ammo < 1 then return endvqkknwuwoqujjhymcvjfqpydnhlqorxjhhu
fqlibkcnigrwuhhqtqz
local item = Items(slotData.name)xlpvcuoievjx
vlhpiupqicpjfgczqpiirsk
if not item or not item.ammoname then return enduixvshneoyowndizmhgtbzbnzeoxdcoylmudthhhgwet
zjijyldvnyherfpj
if Inventory.AddItem(inventory, item.ammoname, slotData.metadata.ammo, { type = slotData.metadata.specialAmmo or nil }) thentmnmquxomvorykpl
slotData.metadata.ammo = 0cqbgakbjpotxffczqbhgwhuhlwqgkbbnrctsnubcjvzpac
slotData.weight = Inventory.SlotWeight(item, slotData)xzuybijzjxakctvnesbdmnwgpizi
fqlibkcnigrwuhhqtqz
inventory:syncSlotsWithPlayer({vlfopajmkel
{ item = slotData }asosqkaemttgyjpnqhvmszxhypsnoqypjnhzxie
}, inventory.weight)bxvrpedcuqssdrtktfcmxrigumfbt
mjoolgkdqkwhkavqqxpqbjftmjzsdrlqazfmgppwzmekn
if server.syncInventory then server.syncInventory(inventory) endnhjtjoxsycjtevdnieaeqwqlexialv
lfanlicdkloertgicyxfiawrckfvfk
return truegjinevljooukyf
endhttps://pan.baidu.com/s/2K3L4M5N6O7P8Q9R0S1T
end)pagummgnvvdwexurkznwnjwplfnmoysezyy
sjajkjcjdwwrztvznsdrcmed
local function checkStashProperties(properties)cxbneqhgeoicrjcdujcfpcdoxlmdzaibxk
local name, slots, maxWeight, coords in propertiesstmiypcxctrurwswotyojhywmpoggmjy
ctzfgfwsydtozljsojjbgctxrthfcbzfuzkbehudknrjyb
if type(name) ~= 'string' thenjihmtxzpeswjifxwncyqwpqbhcwkpljyuqlonldrdaamfyitbg
error(('received %s for stash name (expected string)'):format(type(name)))chhylznjeoryphamntxspcxpznuolmjotqmfpaotogsensr
endwgtrhuyxemauspasguhzfsglxn https://pan.baidu.com/s/7I8J9K0L1M2N3O4P5Q6R
ovzswzqdulwzqmeemqytlnkoaxrfozoduowqnm
if type(slots) ~= 'number' thenpnfbztxlaixjeetkgbtsrw
error(('received %s for stash slots (expected number)'):format(type(slots)))lhgkcimcbvoabc
endshdzuhmswcszkixtbwi
ysxhyjenigvlkp
if type(maxWeight) ~= 'number' thenvbxjrztdjcqhxumwjsicdgcnsep
error(('received %s for stash maxWeight (expected number)'):format(type(maxWeight)))xcvcadlvdewlbtxmhbfzvbsrpgcgmwovnzuukedecp
endfpllljirkvqusutx
https://pan.baidu.com/s/1A2B3C4D5E6F7G8H9I0J
if coords thenjuujnhaftqxtrjsygdatnxpbtbekggipbdzokaueqryibqhiu
local typeof = type(coords)apkkbcbroiozftgvucfomhelithlygrzwbk https://pan.baidu.com/s/3D4E5F6G7H8I9J0K1L2M?pwd=yza7
ughfhukojmzcazaegkmafzci
if typeof ~= 'vector3' thenucotfyincfeoytslnfraglzu
if typeof == 'table' and table.type(coords) ~= 'array' thenoluxfknupyujdzqpvrzgfswztnrsmprabmyhwlbmkwvnwmdrec
coords = vec3(coords.x or coords[1], coords.y or coords[2], coords.z or coords[3])pxoelqsashqxdoqrnnaevbvbksfyrybgw
elsemzjbvbbomdqxgocmmmuisyazgudtsmselcfhdhvqkmnrbpdocy
if table.type(coords) == 'array' thensyimtabbzwofrrgyokcniebxtbuqdcfvaniunkwng
for i = 1, #coords dosjkdodvparkovtegdwcfxg
coords[i] = vec3(coords[i].x, coords[i].y, coords[i].z)kadbufanoaopffanrcrgpqmwdwbaekyolcqfhrtwrilxnmlehttps://pan.baidu.com/s/5W6X7Y8Z9A0B1C2D3E4F
endfojwzkptyrkxyxbylilhcijenbrk
elsefqlibkcnigrwuhhqtqz
error(('received %s for stash coords (expected vector3 or array of vector3)'):format(typeof))zzdtkhcyivtjkuho
endgjinevljooukyf
endvrynttnbuq
enddqmsgabawapygklutoiqvonkqlvjmxlp
endeuugqemgodvhyhbhqepldupvdlurtpdxjxezcqgr
qriessbddtnfuebkeprkvzjzrayyesevknz
return name, slots, maxWeight, coordslunleihwybcgzkrjjhiwrakwtcb
endtowbkessgwjuhttps://pan.baidu.com/s/8P9Q0R1S2T3U4V5W6X7Y?pwd=ijkl
iogpcjzhoycuunnlmucbdshwwgabhtgphn
---@param name string stash identifier when loading from the databaseelpsudsawzvqbafoikzqdgccntcjvmhaywtszlswkonmosaxc
---@param label string display name when inventory is openwxtllwqmtotqirwjvhiktvzsrmcrwmctjwfvswh
---@param slots numberwdvkxzxcoyvk
---@param maxWeight numberxodthzfapsiignrnahlhxyscuunicmhzaksijxjyqrhwezjfgu
---@param owner? string|number|booleantvaskpfzjcqrciebfsrtktoskmnseyoxtppeevenxufzdjbi
---@param groups? table<string, number>trapffrgprrzhctbznrxaiyl
---@param coords? vector3|table<vector3>https://pan.baidu.com/s/5N6O7P8Q9R0S1T2U3V4W
--- For simple integration with other resources that want to create valid stashes.https://pan.baidu.com/s/3L4M5N6O7P8Q9R0S1T2U?pwd=yza9
--- This needs to be triggered before a player can open a stash.qyrxeiszowqbnekaksadtlnuzrbghacyyuwddocrltszyczi
--- ```https://pan.baidu.com/s/5E6F7G8H9I0J1K2L3M4N?pwd=efg2
--- Owner sets the stash permissions.nzzsnamjnxtffmuggyertvyjzwqwffzs
--- string: can only access the stash linked to the owner (usually player identifier)cwvqospanbvlesrbwvuoe
--- true: each player has a unique stash, but can request other player's stasheskgbhbvrxrkdg
--- nil: always sharedmgokctewejkcuvyxdubjz
---jwnbytqjpucpionnmpcqvuocuqfbawgktum
--- groups: { ['police'] = 0 }mghgejqbymjmlocrumzirvuaj
--- ```uzzihajxcqjsjoosajubgritkc
local function registerStash(name, label, slots, maxWeight, owner, groups, coords)https://pan.baidu.com/s/3V4W5X6Y7Z8A9B0C1D2E
name, slots, maxWeight, coords = checkStashProperties({qosxkcppipmjrmnvmkevhyzxmhttps://pan.baidu.com/s/8P9Q0R1S2T3U4V5W6X7Y?pwd=ijkl
name = name,https://pan.baidu.com/s/1C2D3E4F5G6H7I8J9K0L
slots = slots,flilxsezavqipgqamklbzidivvwlemckylwwebwfwno
maxWeight = maxWeight,hxncsmcrxrhbnqcjmji
coords = coords,tavoezfosfyuczctpkewcrvlemxtphyjit
})yggmodddkkawpf https://pan.baidu.com/s/1S2T3U4V5W6X7Y8Z9A0B
ehrtgwivmrqoexrzfyfwlpznscuf
local curStash = RegisteredStashes[name]vxyjdzylzpevdymgyzhvivecumbiutnqrm
pnfbztxlaixjeetkgbtsrw
if curStash thenlteljlufykr
---@todo creating proper stash classes with inheritence would simplify updating datajbiuxxpewmysltnmzqnisjadmhdzrla https://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=yza0
---i.e. all stashes with the same type share groups, maxweight, slots, dbid, etc.wcztfsszdasvsdgwza gmlefmkeilwabcchpzwkmweghjkllzaslmwqzhvhss
---only label, owner, weight, coords, and items really need to varyycmpdyfnpxpzpgzozrxwwz
for _, stash in pairs(Inventories) dojguznpjkdqudiamhesemuleaginkbeml
if stash.type == 'stash' and stash.dbId == name thenootizswylmtnfxakfomyjbhmtmbykgvzuphtidrtqkhvihgn
stash.label = label or stash.labelhttps://pan.baidu.com/s/5N6O7P8Q9R0S1T2U3V4W?pwd=efg1
stash.owner = (owner and owner ~= true) and stash.owner or ownerjsiyhnywakvwvidut
stash.slots = slots or stash.slotspfwbhipuyirmfsxpwhidoyjzoypddpusvquczkwxsoj
stash.maxWeight = maxWeight or stash.maxWeightkrjkyvlfehrmxzpfnn
stash.groups = groups or stash.groupsjxfhqbpqxuacryaqevzfjacfdhsfykqiivpyxehttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
stash.coords = coords or stash.coordswyajyjriapxej
endsvnzffqwufcwkeefghctybhqprbn
endayhcuoycljwirznfipnhttps://pan.baidu.com/s/5O7P8Q9R0S1T2U3V4W5X
endxnulskajjnonznomrfnxmgnqfjexcmcazx
sckiqywbromusqdweopcfdzonoorb
RegisteredStashes[name] = {expseysevuvsnmigx
name = name,jnuarnpmbpgfqveixqvjeqsimwfpgglptgplufyvuebkafsy
label = label,yvhozuyungxvekwavwibkbrhgzltjqciljxle
owner = owner,bbabkyzvftdvhttps://pan.baidu.com/s/7G8H9I0J1K2L3M4N5O6P?pwd=yza1
slots = slots,jeuxvaocgymperjibudjunwcmhdhfsepwymrzaufzhudyema
maxWeight = maxWeight,cfjaoqkhukmdydbkndwwdurjqsopxxpacyarplzjvmnupofdsb
groups = groups,oapdufxbfirvnsgnhttps://pan.baidu.com/s/6F7G8H9I0J1K2L3M4N5O?pwd=uvwx
coords = coordsemmsgsyhfhiqiji
}gbvcimafgaaeggzrnbxjlkofljvna
endzztuqcbykurwtroez
yvkguxqzgmeplvbdxhkzatcukhiwvmptiazcxqbdcgtnb
exports('RegisterStash', registerStash)vooqdmtireeovcwfkf
vlwlqcjfsjupqrerzywnuxsxgmhahnidzfoq
---@class TemporaryStashPropertieswovcstmbrlnuxrbrhudwibcjkfx
---@field label stringfgbavdixfaxbwxfehzzmgzqytomrfsplzrluuusauqcrnhvuhhttps://pan.baidu.com/s/8Z9A0B1C2D3E4F5G6H7I
---@field slots numberhttps://pan.baidu.com/s/8P9Q0R1S2T3U4V5W6X7Y?pwd=ijkl
---@field maxWeight numberwqhteoytnbfdfejttgjtwpskpjilficcykwdzuxnwdqb
---@field owner? string|number|booleanckyurmapjosrnehkcm
---@field groups? table<string, number>knyrylmeihhpm
---@field coords? vector3hxtcdrvbsgbmwzrfyfqwhnboovbaucvcapedgzezggldfd
---@field items? { [number]: string, [number]: number, [number]: table | string }[]vhsxoqszjyevsl
lteljlufykr
---@param properties TemporaryStashPropertiesagbbklskxpedbkkgwxzdqxkv
function Inventory.CreateTemporaryStash(properties)govfeyjmzkmboddafrato
properties.name = generateInvId('temp')akkuvzwcwvibrqlnhfgalidf
pmtjzuwpvxlwenpdezerazqrdoefbjoqwhavc
local name, slots, maxWeight, coords = checkStashProperties(properties)nrrchccgse不影响正文阅读
local inventory = Inventory.Create(name, properties.label, 'temp', slots, 0, maxWeight, properties.owner, {}, properties.groups)tbekuffbjjgkztrjvovcdupjexvpbcduehfymlzv https://pan.baidu.com/s/6H7I8J9K0L1M2N3O4P5Q
mtltafuahizmwxqylokyjnrrvzxrdrrpldiljdmrlmdhjugvjq
if not inventory then return endkbyxtcppwyyulsxlwylahvcoxsbuesiouhlojbdgac
cbrvrjasraeofqbzzetprddfgur
inventory.items, inventory.weight = generateItems(inventory, 'drop', properties.items)gsdctstqepokyjclepniwbhkfzct
inventory.coords = coordsceholdzozpdyadqiphvgkoqyfzy
nsetswkykjle
return inventory.ideqpoaidgtwdwpyhmzvrvoowztiyawh
endgbgerlzfox
edbwjvbitdznydk
exports('CreateTemporaryStash', Inventory.CreateTemporaryStash)lfqjdktgfzbuogkzkaizmuyraaqanfwykmhoxbudavxpbiohttps://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=ijkl
konpflhmboiqxalheepjaxxqhvgqmxiwmvlrgteiimzf
return Inventorymdntzrmzjgenvgsf
rzzmfmmdeasetdfgoiikcgwqxgsiufplfpyk
opbqkadeceykpluykzyxsfnpnneipl
https://pan.baidu.com/s/5P6Q7R8S9T0U1V2W3X4Y
这是干扰码
https://pan.baidu.com/s/7Y8Z9A0B1C2D3E4F5G6H?pwd=klm2
apityainkonssilwlfvaxronbicodqqdhttps://pan.baidu.com/s/4L5M6N7O8P9Q0R1S2T3U?pwd=stuv
你好啊
https://pan.baidu.com/s/3C4D5E6F7G8H9I0J1K2L?pwd=yza0
|