Skip to content

Commit

Permalink
🔧 item id fix
Browse files Browse the repository at this point in the history
Передача на клиент с сервера UID предметов вместо ID. Устраняет баг, который мог возникнуть при создании итемов в некоторых хуках, из-за чего у игрока оказывался ID несуществующего в тот момент на клиенте предмета и получался null
  • Loading branch information
AMD-NICK committed Feb 22, 2022
1 parent 6b88861 commit 2e47079
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 26 deletions.
26 changes: 11 additions & 15 deletions addons/igs-core/lua/igs/core_sv.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,24 @@ function IGS.LoadPlayerPurchases(pl,cb)
end

local purchases = {} -- uid = amount
local networked = {} -- iter = uid
local networked = {} -- uid = amount (было i>id до 16.02.2022, но веб загрузка потребовала перемен)

for i = 1,#dat do
local uid = dat[i]["Item"]
local ITEM = IGS.GetItemByUID(uid) -- TO DO проверка на существование итема. Или не нужно? Время покажет
local uid = dat[i]["Item"]
purchases[uid] = (purchases[uid] or 0) + 1

purchases[uid] = purchases[uid] and (purchases[uid] + 1) or 1

if ITEM:IsNetworked() then
networked[#networked + 1] = ITEM:ID()
if IGS.GetItemByUID(uid).networked then
networked[uid] = (networked[uid] or 0) + 1
end
end

-- UID - Amount Of Purchases
-- UID = Amount Of Purchases
pl:SetVar("igs_purchases",purchases)

-- print("IGS.GetPlayerPurchases processed",pl)
IGS.nw.WaitForPlayer(pl, function()
-- print("IGS.nw.WaitForPlayer INSIDE",pl)
-- if (#networked > 0) then -- закомменчено, чтобы срабатывал клиентский хук в любом случае
pl:SetIGSVar("igs_purchases", networked) -- минус в том, что теперь для ВСЕХ игроков будет сетится
-- end -- а сделано это для тул хайдера
pl:SetIGSVar("igs_purchases", networked)
end)

hook.Run("IGS.PlayerPurchasesLoaded",pl,purchases)
Expand All @@ -70,9 +66,9 @@ function IGS.GivePurchase(pl, sItemUID)

pl:SetVar("igs_purchases",purchases)

if ITEM:IsNetworked() then
if ITEM.networked then
local tab = pl:GetIGSVar("igs_purchases") or {}
tab[#tab + 1] = ITEM:ID()
tab[sItemUID] = (tab[sItemUID] or 0) + 1
pl:SetIGSVar("igs_purchases", tab)
end

Expand All @@ -86,8 +82,8 @@ end
function IGS.PlayerActivateItem(pl, sItemUID, fCallback)
local ITEM = IGS.GetItemByUID(sItemUID)

IGS.StoreLocalPurchase(pl:SteamID64(),ITEM:UID(),ITEM:Term(),function(iPurchID)
IGS.GivePurchase(pl,sItemUID)
IGS.StoreLocalPurchase(pl:SteamID64(), sItemUID, ITEM:Term(), function(iPurchID)
IGS.GivePurchase(pl, sItemUID)
hook.Run("IGS.PlayerActivatedItem", pl, ITEM, iPurchID)
if fCallback then fCallback(iPurchID) end
end)
Expand Down
29 changes: 18 additions & 11 deletions addons/igs-core/lua/igs/network/nw_sh.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,28 @@ IGS.nw.Register("igs_total_transactions")
:Read(net.ReadUInt,17)
:SetLocalPlayer()

-- До 16 фев 2022 передавались чисто ID предметов
-- Но веб лоад приводит к тому, что еще до загрузки самого игрока на сервер ему могли
-- передаваться ID предметов, которые на клиенте не успели создаться (например создавались в хуке IGS.Loaded)
IGS.nw.Register("igs_purchases"):Write(function(networked_purchases)
local flatten = {}
for uid, am in pairs(networked_purchases) do
local s = #flatten
flatten[s + 1] = uid
flatten[s + 2] = am
end

IGS.nw.Register("igs_purchases"):Write(function(v)
net.WriteUInt(#v, 9) -- 511
net.WriteUInt(#flatten / 2, 8) -- 255

for _,id in ipairs(v) do
net.WriteUInt(id,9)
for i = 1,#flatten,2 do
net.WriteString(flatten[i])
net.WriteUInt(flatten[i + 1], 9)
end
end):Read(function()

local res = {}
for _ = 1,net.ReadUInt(9) do
local uid = IGS.GetItemByID( net.ReadUInt(9) ):UID()
res[uid] = res[uid] and (res[uid] + 1) or 1
for _ = 1,net.ReadUInt(8) do
res[net.ReadString()] = net.ReadUInt(9)
end

return res
end):SetLocalPlayer():SetHook("IGS.PlayerPurchasesLoaded")

Expand Down Expand Up @@ -67,8 +74,8 @@ IGS.BIT_TX_ID = 32
--[[--------------
.net Helpers
----------------]]
function net.WriteIGSItem(ITEM) net.WriteUInt(ITEM:ID(),9) end
function net.ReadIGSItem() return IGS.GetItemByID(net.ReadUInt(9)) end
function net.WriteIGSItem(ITEM) net.WriteString(ITEM:UID()) end
function net.ReadIGSItem() return IGS.GetItemByUID(net.ReadString()) end
-- function net.WriteIGSGroup(GROUP) net.WriteString(GROUP:Name()) end
-- function net.ReadIGSGroup() return IGS.GetGroup(net.ReadString()) end

Expand Down

0 comments on commit 2e47079

Please sign in to comment.