Ежедневные скидки на случайные предметы

После каждого рестарта сервера будет определяться N случайных предметов, которые получат скидку. Делайте рестарт каждый день и набор будет меняться ежедневно

Установка:

Создайте файл addons/igs-modification/lua/igs/modules/randomdiscounts/_main.lua с следующим содержимым и перезапустите сервер:

local MAX_DISCOUNTS = 3 -- Количество товаров, которые получат скидку
local PERCENT_DISCOUNT = .15 -- Процент скидки. Здесь 15%

local function applyDiscounts(items_ids)
	for _,item_id in ipairs(items_ids) do
		local ITEM = IGS.GetItem(item_id)
		if not ITEM.null then
			local old_price = ITEM.price
			ITEM:SetPrice(old_price * (1 - PERCENT_DISCOUNT))
			ITEM:SetDiscountedFrom(old_price)
		end
	end
end

if SERVER then
	util.AddNetworkString("IGS.RegularDiscounts")

	local items_ids = {}
	for _ = 1, MAX_DISCOUNTS do
		local ITEM = table.Random(IGS.ITEMS.STORED)
		if not ITEM.null and not table.HasValue(items_ids, ITEM.id) then
			table.insert(items_ids, ITEM.id)
		end
	end

	applyDiscounts(items_ids)

	SetGlobalString("igs_discounts", util.TableToJSON(items_ids))

else
	hook.Add("IGS.Loaded", "fetch_discounts", function()
		local items_ids = GetGlobalString("igs_discounts")
		items_ids = util.JSONToTable(items_ids)
		applyDiscounts(items_ids)
	end)
end

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

Я устал босс

Ладно я проверил все работает

1 лайк

Немного обновил код в главном посте темы. Если кто-то использует – обновите(!) заранее

Планируется избавление от метода :Price(). Вместо него получение статичной цены будет через ITEM.price

Также будет добавлен метод ITEM:GetPrice(pl), который подсчитает динамичную цену для отдельного игрока


Строка, которая обновлена:

Просто для заметки. Более полная версия. Больше кода, но немного более оптимизирована (хотя в этом случае это не оправдано. Просто хочу где-то сохранить)

Спойлер
local MAX_DISCOUNTS = 3 -- Максимальное колмчество товаров, каким будет прописывать скидку
local PERC_DISCOUNT = math.random(5, 15) -- Число в процентах, какой будет скидка. В нашем случае - каждый рестарт случайное от 5 до 15

if SERVER then
	util.AddNetworkString("IGS.PostDiscount")

	local DISCOUNTS = {} -- Таблица, в которой хранятся значения на сервере
	local ITEMS_COUNT = IGS.ITEMS.count -- Количество товаров в магазине
	local DISCOUNT_MULT = (100 - PERC_DISCOUNT) * .01 -- Множитель цены ( число от 0 до 1 )

	for i = 1, MAX_DISCOUNTS do
		local item_id = math.random(ITEMS_COUNT)
		local item = IGS.ITEMS.STORED[item_id]

		local price = item.price
		local new_price = math.Round(price * DISCOUNT_MULT)

		item:SetPrice(new_price)
		item:SetDiscountedFrom(price)

		DISCOUNTS[item_id] = new_price
	end

	net.Receive("IGS.PostDiscount", function(_, ply)
		net.Start("IGS.PostDiscount")
		net.WriteTable(DISCOUNTS)
		net.Send(ply)
	end)
else
	local function AssignDiscounts(discounts)
		for id, price in pairs(discounts) do
			local item = IGS.ITEMS.STORED[id]
			local old_price = item.price

			item:SetPrice(price)
			item:SetDiscountedFrom(old_price)
		end
	end

	net.Receive("IGS.PostDiscount", function()
		local discounts = net.ReadTable()
		AssignDiscounts(discounts)
	end)

	hook.Add("IGS.Loaded", "IGS.FetchDiscount", function() -- IGS загрузился. Запрашиваем скидки
		net.Start("IGS.PostDiscount")
		net.SendToServer()
	end)
end