В указанной категории будут скрыты все предметы, кроме нескольких рандомных. Каждый рестарт эти предметы меняются.
Реальный кейс использования
У вас категория “Оружие”, в ней 30 предметов. У людей глаза разбегаются, некоторые окрестили проект “Донат помойкой”. Скрипт делает, чтобы отображалось только несколько предметов из категории и они менялись после каждого рестарта сервера
Что дает
Меньше визуальная нагрузка на глаза хейтеров “донат помоек”
Повышается ценность предмета за счет редкости его доступности
Возможны “перекупы”, которые будут покупать какие-то предметы и перепродавать их дороже тем, кому они реально нужны. Или продать не получится, но деньги уже потрачены
Игроку проще сделать выбор среди меньшего количества предметов
После одной покупки в следующий день может появиться предмет, который игрок захочет еще больше, но не знал, что такой есть и тоже купит его
Установка
Создать файл addons/igs-modification/lua/igs/modules/daily_items/_main.lua с таким содержимым:
Код
-- addons/igs-modification/lua/igs/modules/daily_items/_main.lua
-- https://forum.gm-donate.net/t/kupi-poka-ne-propalo/1511
local CAT_NAME = "Оружие"
local SHOW_ITEMS = 3
IGS.nw.Register("igs_visible_category_items")
:Write(function(list)
net.WriteUInt(#list, 8)
for _,uid in ipairs(list) do
net.WriteString(uid)
end
end)
:Read(function()
local list = {}
local count = net.ReadUInt(8)
for i = 1,count do
local uid = net.ReadString()
list[i] = uid
end
return list
end)
:SetGlobal():SetHook("IGS.ReceivedVisibleCategoryItems")
hook.Add("IGS.Initialized", "daily_guns", function()
local weapons_cat_items = {} -- {item1, item2, ...}
for _,ITEM in ipairs(IGS.GetItems()) do
if ITEM:Category() == CAT_NAME and ITEM:IsHidden() == nil then -- если менялось IsHidden, то не управляем автоматически
table.insert(weapons_cat_items, ITEM)
end
end
assert(#weapons_cat_items > 0, "Нет итемов в категории для выбора рандомных. Указана правильная категория?")
for _,ITEM in ipairs(weapons_cat_items) do
ITEM:SetHidden(true) -- по умолчанию все скрываем
end
if CLIENT then return end
local random_uids = {}
for i = 1,math.min(#weapons_cat_items, SHOW_ITEMS) do -- выбирает до 3 рандом пушек
local ITEM = table.remove(weapons_cat_items, math.random(1, #weapons_cat_items))
table.insert(random_uids, ITEM:UID())
ITEM:SetHidden(false)
end
IGS.nw.SetGlobal("igs_visible_category_items", random_uids)
end)
if SERVER then return end
hook.Add("IGS.ReceivedVisibleCategoryItems", "igs_visible_category_items", function(random_uids)
for _,uid in ipairs(random_uids) do
local ITEM = IGS.GetItem(uid)
if ITEM then
ITEM:SetHidden(false)
end
end
end)
Круто, но я бы лучше сделал ротацию зависящую от времени а не рестартов + списками а не рандомом.
Впрочем рандом с рестартами более универсальнен и удобен в установке.
Сделал. Протестируйте кто-то и скажите, работает ли. Если работает, обновлю главный пост
-- addons/igs-modification/lua/igs/modules/daily_items/_main.lua
-- https://forum.gm-donate.net/t/kupi-poka-ne-propalo/1511
local CAT_NAMES = {}
CAT_NAMES["Оружие"] = 3 -- будет видно 3 предмета из категории
CAT_NAMES["Наборы"] = 2 -- 2 предмета
IGS.nw.Register("igs_visible_category_items")
:Write(function(list)
net.WriteUInt(#list, 8)
for _,uid in ipairs(list) do
net.WriteString(uid)
end
end)
:Read(function()
local list = {}
local count = net.ReadUInt(8)
for i = 1,count do
local uid = net.ReadString()
list[i] = uid
end
return list
end)
:SetGlobal():SetHook("IGS.ReceivedVisibleCategoryItems")
hook.Add("IGS.Initialized", "daily_guns", function()
local group_by_cat = {} -- {["group"] = {item1, item2, ...}, ["group2"] = ...}
for _,ITEM in ipairs(IGS.GetItems()) do
local cat = ITEM:Category()
if CAT_NAMES[ cat ] and ITEM:IsHidden() == nil then -- если менялось IsHidden, то не управляем автоматически
group_by_cat[cat] = group_by_cat[cat] or {}
table.insert(group_by_cat[cat], ITEM)
ITEM:SetHidden(true) -- по умолчанию все из категорий скрываем
end
end
if CLIENT then return end
local random_uids = {}
for cat,items in ipairs(group_by_cat) do
local cat_limit = CAT_NAMES[cat]
for i = 1,math.min(#items, cat_limit) do
local ITEM = table.remove(items, math.random(1, #items))
table.insert(random_uids, ITEM:UID())
ITEM:SetHidden(false)
end
end
IGS.nw.SetGlobal("igs_visible_category_items", random_uids)
end)
if SERVER then return end
hook.Add("IGS.ReceivedVisibleCategoryItems", "igs_visible_category_items", function(random_uids)
for _,uid in ipairs(random_uids) do
local ITEM = IGS.GetItem(uid)
if ITEM then
ITEM:SetHidden(false)
end
end
end)