[IGS] Покупка определенного предмета через команду / хук

Привет, хотелось бы узнать, как сделать так, чтобы при нажатии кнопки в том же F4 (например, админка), вылазило меню с подтверждением покупки этой самой админки?
Т.е чтобы человек не искал в донат-меню этот предмет, а мог по нажатию кнопки сразу купить этот предмет.

Ооо, достойные вопросы подкатили

Вот, что тебе может пригодиться:

-- CLIENT'ские функции

-- Отправка запроса на покупку предмета
-- sItemUID это UID предмета (С sh_additems.lua)
-- callback это функция, которая выполнится после завершения процесса покупки
--    в callback первым параметром передается строка-ошибка или nil, если покупка успешна
--    вторым параметром передается ID предмета в инвентаре (если инвентарь используется на сервере)
IGS.Purchase(sItemUID, callback)

-- Активирует предмет с инвентаря
-- После первой функции можно сразу выполнить и эту,
-- чтобы игроку не пришлось даже в инвентарь заходить
-- iInvID это ИД предмета в инвентаре. Передается в callback в первой функции
-- в callback идет (bool ok, int iPurchID, string? sMsg_)
IGS.Activate(iInvID, callback)

Пример в коде (написал, но не тестировал)

-- Консольная команда, которая откроет модалку покупки предмета
concommand.Add("foobar", function(pl, _, args)
	local item_uid = args[1]
	if not item_uid then pl:ChatPrint("Не указан UID") return end

	local ITEM = IGS.GetItemByUID(item_uid)

	local price_int = ITEM:GetPrice(pl)
	local price_str = PL_MONEY(price_int)

	Derma_Query(
    "Хочешь купить " .. ITEM:Name() .. " за " .. price_str .. "?",
    "Подтверждение:",
    "Да", function() IGS.Purchase(item_uid, function(_err, _inv_id)
		if _err then
			pl:ChatPrint("Ошибка покупки: " .. _err)
		elseif _inv_id then
			pl:ChatPrint("Купили. Активируем! Если не активируется, то напиши /donate и активируй с инвентаря")
			IGS.Activate(_inv_id, function() pl:ChatPrint("Все, активировали") end)
		else
			pl:ChatPrint("Куплено и активировано!") -- инвентарь отключен в настройках. Ошибки нет, но и inv_id отсутствует
		end
	end) end,
	"Не", function() pl:ChatPrint("В мире загрустел один котик :(") end
	)
end)

-- Пример использования в коде
RunConsoleCommand("foobar", "admin_30d")

Вот тут можно посмотреть, как это обрабатывается сервером:

1 лайк

Можно пути установки?

UPD
Кидал в addons/lua/autorun/server

Тебе виднее. Ты же кнопку где-то хочешь

  1. cl / sv / sh часть?
  2. Куда кидать эти клиентские функции?
  1. Что делать с ошибкой ?
  1. Как узнать ID предмета?

1-2. addons/zakupka/lua/autorun/client/zakup.lua
3. IGS/sh_additems.lua at main · GM-DONATE/IGS (github.com) (2 аргумент)

А куда это закидывать?

Спойлер

Я же написал путь, нет разве?

То путь для

IGS.Purchase(sItemUID, callback)
и
IGS.Activate(iInvID, callback)

Это он рассказывает, как работают функции и их аргументы

[zakupka] addons/zakupka/lua/autorun/client/zakup.lua:7: attempt to call method ‘GetPrice’ (a nil value)

  1. unknown - addons/zakupka/lua/autorun/client/zakup.lua:7
  2. unknown - lua/includes/modules/concommand.lua:54
concommand.Add("foobar", function(pl, _, args)
	local item_uid = args[1]
	if not item_uid then pl:ChatPrint("Не указан UID") return end

	local ITEM = IGS.GetItemByUID(item_uid)

	local price_int = ITEM:Price()

	--[[
		https://github.com/GM-DONATE/IGS/blob/643ad83fff52d99c939523f8b36705265de6632f/addons/igs-core/lua/igs/objects/shop_item.lua#L65

		lua_run_cl print(IGS.GetItemByUID("wep_arbalet"):GetPrice())

		[ERROR] LuaCmd:1: attempt to call method 'GetPrice' (a nil value)
	]]

	local price_str = PL_MONEY(price_int)

	Derma_Query(
    "Хочешь купить " .. ITEM:Name() .. " за " .. price_str .. "?",
    "Подтверждение:",
    "Да", function() IGS.Purchase(item_uid, function(_err, _inv_id)
		if _err then
			pl:ChatPrint("Ошибка покупки: " .. _err)
		elseif _inv_id then
			pl:ChatPrint("Купили. Активируем! Если не активируется, то напиши /donate и активируй с инвентаря")
			IGS.Activate(_inv_id, function() pl:ChatPrint("Все, активировали") end)
		else
			pl:ChatPrint("Куплено и активировано!") -- инвентарь отключен в настройках. Ошибки нет, но и inv_id отсутствует
		end
	end) end,
	"Не", function() pl:ChatPrint("В мире загрустел один котик :(") end
	)
end)

image

2 лайка

работает

:sweat_smile::sweat_smile::sweat_smile:

2 лайка

да, сорри, это в следующей версии уже будет

1 лайк

Забавный получился мем :sweat_smile:

Версия опубликована. Пишу changelog и инструкцию по обновлению