Купи, пока не пропало

В указанной категории будут скрыты все предметы, кроме нескольких рандомных. Каждый рестарт эти предметы меняются.

Реальный кейс использования

У вас категория “Оружие”, в ней 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)

Может быть интересно

3 лайка

Круто, но я бы лучше сделал ротацию зависящую от времени а не рестартов + списками а не рандомом.
Впрочем рандом с рестартами более универсальнен и удобен в установке.

Ждем)))

Будет время, мб сделаю.
Тут система не на пять минут работы.

Таким образом можно будет несколько категорий вписать?
local CAT_NAME = {"Оружие", "Донат Группы"}

если доработаешь код напильником то вполне.

Сделаю, если под этим сообщением будет 3 лайка

7 лайков

Сделал. Протестируйте кто-то и скажите, работает ли. Если работает, обновлю главный пост

-- 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)
1 лайк

Дошли руки проверить)
Вписанные категории пропали просто и все

Как пропали? Расскажи подробнее

Ну в списке донат меню просто пропали категории с предметами которые были вписаны в скрипте

Методы IsHidden и SetHidden в пререлизной версии IGS помечены устаревшими и заменены на новые: [IGS] Как отображать предмет при определенном условии? - #6 от пользователя GMD. Код выше может не работать. Если кому-то нужен этот модуль, то напишите сообщение в этой теме и я поправлю код