Купоны в виде чат-команд

У меня не поворачивается язык назвать это модификацией, но про такую штуку слишком часто спрашивают

Настройка

Добавьте свой промокод в таблицу codes. Индекс - команда для активации (включая слеш), значение - сумма, которую получит активировавший игрок

Важно

  • Сохранение происходит в локальной БД, поэтому если у вас несколько серверов с общим донатом, то промокод можно будет активировать на обоих.
  • Чтобы можно было в будущем создать промокод с уже использованным названием, используйте консольную команду igs_freemoney_clear КОД (только в серверной консоли)

Код

if not sql.TableExists('igs_freemoney') then
    sql.Query('CREATE TABLE igs_freemoney (steamid VARCHAR(40), date INTEGER, code TEXT)')
end

local codes = {
    ['/dengi'] = 10,
    ['/gavno'] = 1000,
}

hook.Add('PlayerSay', 'babosiki', function(ply, code)
    local amount = codes[code]
    if not amount then return end

    if ply.codeCD and ply.codeCD > CurTime() then
        DarkRP.notify(ply, 1, 5, 'Ты вводишь промокоды слишком часто!')
        return ''
    end

    ply.codeCD = CurTime()+1
    
    local d = sql.Query('SELECT * FROM igs_freemoney WHERE steamid = "'..ply:SteamID()..'" AND code = '..SQLStr(code))
    
    if d and d[1] then
        DarkRP.notify(ply, 1, 5, 'Ты уже активировал этот промокод')
        return ''
    end
    
    sql.Query('INSERT INTO igs_freemoney (steamid, date, code) VALUES("'..ply:SteamID()..'", '..os.time()..', '..SQLStr(code)..')')
    ply:AddIGSFunds(amount)
    DarkRP.notify(ply, 0, 10, 'Ты получил '..amount..'р по промокоду!')
    return ''
end)

concommand.Add('igs_freemoney_clear', function(ply, cmd, args)
    if IsValid(ply) then return end

    local res = sql.Query('DELETE FROM igs_freemoney WHERE code = "'..args[1]..'"')
    if res == false then
        print('Произошла ошибка при очистке записей')
    else
        print('Успешно очищены все записи с кодом "'..args[1]..'"')
    end
end)
2 лайка

Есть версия без привязки к DarkRP?

Замени

 DarkRP.notify()

на аналог своего режима, или поставь

ply:ChatPrint("Текст")

Не рекомендую! но можно

ply:SendLua( "notification.AddLegacy( 'Текст', 0, 2 )" )
--у этого способа есть большое ограничение.

image
В чем проблема?
где хранится база с игроками?
и как можно вывести сообщение Всем игрокам о том, что кто-то активировал промокод?

1

за место числа(amount) полученно ничего(nil)
2

в sv.db
3

for i, ply in ipairs( player.GetAll() ) do
	ply:ChatPrint( "текст" )
end

Но текст будет светло синий,
для цветного текста нужно использовать так же cl часть

спасибо, а ник игрока, который активировал, как получить?

ply:Nick()
;
ply:Name()

А куда это вставлять?

В любой серверный скрипт (garrysmod/addons/ТВОЙ АДДОН/lua/autorun/sv_coupons.lua)

:warning: На серверах, где установлен этот скрипт можно полностью удалить базу данных сервера, получить всю информацию с нее, выдать админку кому угодно, накрутить себе игровые деньги либо деньги автодоната при помощи sql инъекции

Не рекомендую устанавливать это себе, пока автор не сообщит об исправлении уязвимости

Если серверодержатель сам пропишет эту инъекцию в качестве промокода? Никакие sql-запросы не выполняются до тех пор, пока сообщение, отправленное игроком, полностью не совпадает с каким-нибудь из кодов, указанных в таблице. Или я что-то не понимаю?

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


что делать?

Скачать автодонат :flushed:

Ха-ха, очень смешно. Вот только он у меня скачан давно уже.

Вызывается на клиенте вот и ошибка.

И как решить проблему?

Сделать аналог на серверной стороне.

Частично связано: Продвинутые купоны (бесконечные активации, любые действия)