Как настроить gm donate gmod

Как мы gm-donate.ru открывали

_AMD_

Основатель trigon.im и gm-donate.ru. Интересуюсь айти, текстами, продажами. Меломан, интроверт, альтруист

_AMD_

gm-donate.ru — система автоматического приема и обработки донатов (пожертвований) для Garry’s Mod серверов. Простыми словами – автодонат для гмод серверов.

GMD — это вторая попытка сделать качественный сервис для автоматизации донатов и мне кажется, она удалась.

Зарождение идеи

Идея автоматизировать прием донатов и выдачу услуг пришла после общения с очередным человеком, которому пришлось пол часа объяснять, что его не обманут и как пользоваться услугой. Я человек нервный, подобные разговоры нередко выводили меня из себя, а когда я прикидывал, сколько времени на них потратил и сколько еще потрачу, то решил процесс автоматизировать

Неудачная попытка автоматизации

Когда-то я даже пытался делать что-то вроде купонов для пополнения счета и продавать их через plati.ru, но вскоре понял, что я идиот. Это не только увеличило количество вопросов, но и забрало еще больше времени на создание этих кодов и их обработку

Первый шаг в нужном направлении

Пока игроки каждые пол часа наяривали мне в личку, я занимался поиском платежного агрегатора.

Это такой сервис, который предоставляет удобный интерфейс для работы сразу с множеством платежных систем за процент от транзакций.

Убив не один день на поиски, пришел к выводу, что без персонального аттестата WebMoney согласны работать только какие-то бомжегрегаторы.

Кстати говоря, получал я его достаточно долго. Там возникали какие-то проблемы с документами, оплатой, а также поездками для встречи с самим аттестатором, чтобы выслушать устрашающие (правда устрашающие) морали об ответственности. Кататься пришлось не один раз, но не помню почему.

1 апреля 2016, пока другие смеялись над белыми спинами, я наблюдал надпись «Одобрено» в панели управления unitpay.ru — агрегаторе, с которым я решил работать. upd. позже мы заключили договора сразу с несколькими другими агрегаторами, чтобы выбрать у каждого лучшие из условий

Начало работы

Пошла жара. Все идеи, которые я месяцами вынашивал в своей голове или записывал на задних страницах своих тетрадей начали превращаться в строки говнокода.

Тогда я был слишком глуп, чтобы осознать, что пишу код скрипта, который не поддается дальнейшей поддержке. Это был практически монолитный кусок говна, который я гордо называл «автодонат». Добавить в него новые услуги или информацию без моего мозга было нереально, но зато это работало и приносило реальную прибыль.

Кстати, о прибыли

Спустя пару месяцев вместе с осознанием ущербности своего творения, я заметил, что донаты выросли в среднем в 2-3 раза, при этом я практически перестал общаться на эту тему с игроками, ведь все происходило на автомате. И почему я раньше так не сделал? Был бы на пару сотен тыщ богаче.

Автодонат — говно

Код первого автодоната был настолько «крут», что когда очередной раз потребовалось добавление новой категории услуг, то я решил, что мне проще будет написать новый продукт, чем тыкать палкой этот.

Кстати, вот некоторые моменты с разработки его интерфейса:

Отложив новые услуги на потом, я начал рожать идеи для второй версии. Они должны были решить туеву хучу ошибок первой, а также иметь плюшки для еще большего увеличения профитов.

Заняло это «всего-то лишь 2 месяца», из которых одна лишь неделя на продумывание технической части и плюшек, а остальное на интерфейс, который в день начала работ был переосмыслен и к окончанию стал совсем не похож на то, что я понавыдумывал ? В общем, со сроками я справился на «ура». Ненавижу UI.

Я уже не помню, сколько времени потратил на написание первоначального кода, но точно помню, как матерился, пока писал интерфейс. Все это помнят. Он, как и во время придумывания, занял 90% времени разработки.

И так неделя, вторая, третья, продукт становится пригодным к употреблению. Переношу конфиг, добавляю новые задуманные услуги, последние тесты, фанфары, обратный отсчет, релиз на мастер-сервер. Работает! Можно и выпить минералки.

Я зря работал?

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

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

Думать долго не пришлось — вторая версия автодоната начала затачиваться под широкую аудиторию.

Я теперь не один

К этому времени я неплохо разбирался в lua, но ужасно в веб разработке. Мне нужен был человек, который займется этим. Я начал работать с тем, кого за несколько лет до этого банил перманентным баном на совсем чужом проекте, совсем не зная, кто это и уж точно не предполагая, что когда-то мы будем работать вместе :). Так GMD превратился в командный проект.

Проблемы работы в команде

Хочешь идти быстро — иди один. Хочешь идти далеко — идите вместе

Будущее проекта вставало под вопрос каждый раз, когда надо было что-то делать.

Сотрудничество началось с того, что мы с шаблоном сайта посрались (никто не хотел иметь дела с фронт-ендом), а потом срались «просто потому что должны» (с)

Так бывает, когда члены команды не знают кто и за что отвечает или когда нет начальника, но есть разногласия.

Конфликты, кстати, происходят до сих пор, но все же меньше, поскольку мы кое-как да распределили сферы своей деятельности. Хотя из-за них много амбициозных идей остаются лишь идеями — у напарника редко есть желание делать что-то новое, а у меня ругаться и платить фрилансерам или учиться самому. Замкнутый круг. Возможно, нам нужен тим лид?

Окей, поехали!

Все началось с того, что я перевел своих прошлых знакомых, которые использовали IGS #1 на IGS #2 (InGameShop. Так называлась часть автодоната (плагин), которую владельцы серверов должны были установить у себя на проектах)

Все шло хорошо, а что не хорошо, то быстро устранялось. Становилось ясно, что пора набирать клиентскую базу.

Сообщения некоторым знакомым, а также владельцам неизвестных серверов и у нас есть клиенты! Хорошие и плохие..

«Че ты мне тут втираешь?»

Я ненавижу общаться с владельцами гмод серверов (конечно же, не со всеми). Это просто толпа народа, каждый член которой живет на своем острове и не хочет принимать ничье мнение, кроме своего. «Я тут главный. Я лучше знаю, что мне нужно»

Навскидку 80% тех, кому я писал насчет автодоната сразу или не сразу грубо или деликатно, но посылали меня на@@й. Я уже писал об этом здесь, поэтому не буду повторяться.

Очень трудно (невозможно) найти общий язык с многими из них, а те, с кем удалось — исключение из исключений. Эти «исключения» готовы доверить нам свои деньги и платить за повышение личной прибыли и сокращение временных расходов на обслуживание донатеров, но пока на таких наткнешься, то на голове уже не останется волос.

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

Эпилог

Скоро наш автодонат будет праздновать свой первый День Рождения.

За этот год было проделано не мало работы и решено не мало конфликтов, включая личные. Мы успели сделать порядка 1800 выплат на общую сумму, превышающую несколько миллионов рублей и ни разу никто не обвинил нас в обмане или снижении прибыли.

Пока другие принимают платежи вручную, тратя свои силы и время на общения с донатерами, наши клиенты радуются повышенной доходности и полной автоматизации. Для этого был создан gm-donate.ru и с задачей он справляется лучше всех

Subscribe to Блог _AMD_

Get the latest posts delivered right to your inbox

Источник

Как настроить gm donate gmod

Итемы — основа этого скрипта. Каждый итем является отдельной донат услугой и имеет свой уникальный идентификатор (UID)

IGS(«Имя»,»unique_id») — добавляет услугу (итем) под названием «Имя» и с УНИКАЛЬНЫМ id «unique_id«. К этому итему применяются методы, которые описаны ниже

Метод Описание
:SetDescription(«Блабла«) Устанавливает текст, который будет виден при открытии подробной информации об услуге
:SetPrice(19.95) Устанавливает стоимось услуги в рублях
:SetTerm(0) Устанавливает срок действия услуги в днях. Если указать 0 — услуга единоразовая. Если не указать — бесконечная
:SetCategory(«Категория«) Устанавливает в какой категории будет отоброжатья услуга в главном меню. Если не указать услуга будет отображаться в категории «разное»
Метод Описание
:SetImage(«http://site/img.png«) Устаналивает ссылку на «баннер» услуги. Рекомендуемый размер 1000х400 или в этом соотношении. Отобразиться в инфе о товаре
:SetIcon(«http://site/img.png«) Устанавливает Иконку в соотношении 1:1. Рекомендуемый размер 100 px
:SetHighlightColor(col) Устанавливает цвет текста названию услуги
:SetStackable(true) Разрешает покупку нескольких штук (например, накопительные услуги, типа лимита пропов). Использовать с SetTerm()

= 0 :SetNetworked(true) Если игрок купил итем с этим методом, то он будет виден в IGS.PlayerPurchases(LocalPlayer()) для этого игрока (другие итем не увидят. Для этого другое средство) :SetCanBuy(function(pl, bGlobal) end) Позволяет установить условие при котором игроки не смогут покупать товар.

Пример:

:SetCanBuy(function(pl, bGlobal)
if not pl:isPremium() then
return «Чтобы купить это нужен премиум!»
end
end) :SetOnBuy(function(pl, bGlobal, iInvID) end) Выполняется на сервере после покупки итема в инвентарь :SetCanActivate(function(pl, global, invDbID) end) Позволяет установить условие при котором игроки не смогут активировать товар из инвентаря. :SetOnActivate(function(pl) end) Выполняется на сервере перед активацией итема из инвентаря :SetValidator(function(pl) end) Выполняется при входе игрока на сервер.

Если условие возращает false выполняется :SetOnActivate :SetMaxPurchases(num) Устанавливает максимальное количество покупок услуги для игрока.

Пример:
При SetMaxPurchases(1) игрок сможет купить эту услугу только один раз.

Методы связанные с ULX

Метод Описание
:SetULXGroup(group, weight) Нужно указать, если итем является донат группой в ULX.

В weight можно указать число. Если у игрока куплено несколько групп, то будет выдана группа с самым большим weight :SetULXCommandAccess(cmd) Дает доступ к ULX команде на определенный срок.

Пример:
:SetULXCommandAccess(«ulx model»)

Методы связанные с FAdmin

Метод Описание
:SetFAdminGroup(group, weight) Нужно указать, если итем является донат группой в FAdmin.

В weight можно указать число. Если у игрока куплено несколько групп, то будет выдана группа с самым большим weight

Методы связанные с Evolve

Метод Описание
:SetEvolveRank(group) Нужно указать, если итем является донат группой в Evolve.

Методы связанные с DarkRP

Метод Описание
:SetDarkRPItem(sEntClass) Если указать класс шипмента или энтити, итем станет доступным только за донат
:SetDarkRPTeam(iTeamID) Если указать ID профы (пример: TEAM_MAYOR, TEAM_CP), профа станет доступна только тем, кто купил её за донат.
:SetDarkRPMoney(iSum) При активации игроку будет выдана указанная сумма денег.

Методы связанные с PointShop 2

Метод Описание
:SetPoints(iAmount) Выдает обычные поинты
:SetPremiumPoints(iAmount) Выдает премиум поинты

Методы связанные с Leveling System

Метод Описание
:SetLevels(iAmount) Добавляет указанное количество уровней
:SetEXP(iAmount) Выдает опыт

Методы которые работают на всех гейммодах

Метод Описание
:SetTool(sToolName) Разрешает юзать определенный tool (rope, winch, advdupe2) только донатерам и админам
:SetEntity(sEntClass) Позволяет спавнить указанную энтити через спавн меню (Q)
:SetWeapon(sWepClass) То же, но для пушек
:SetVehicle(sVehClass) А это для машин

Пример простой можно увидеть в базовом настройщике скрипта

От категории отличается тем, что в главном меню отображается, как единый элемент.
Сам группированый итем, как отдельный отображаться перестанет, чтобы не мозолить глаза чем особо полезна эта «штука».

IGS.NewGroup(«Имя группы») — Создает объект группы или возвращает существующую

Метод Описание
:SetIcon(«http://site/img.png») Устанавливает ссылку на иконку в соотношении 1:1. Будет отображена на главном фрейме на кнопке группы
:AddItem(ITEM_OBJECT,»Имя в группе») Добавляет предмет в группу под определённым именем. Если не указать имя в группе, то будет использовано стандартное название предмета.
:SetHighlightColor(col) Устанавливает цвет текста названию группы
Хук Аргументы Описание
IGS.OnServersLoaded Без аргументов Вызывается после получения информации о серверах вашего проекта, где еще работает автодонат. Если хук не вызовется, скрипт не загрузится
IGS.Initialized Без аргументов Вызывается после полной загрузки скрипта
IGS.OnSuccessPurchase player client
table ITEM
boolean isGlobal
int itemID
Вызывается после успешной покупки предмета в магазине
IGS.OnFailedPurchase player client
table ITEM
boolean isGlobal
string error
Вызывается после неудачной покупки предмета в магазине. Например, недостаточно денег или не прошла проверка :CanBuy
IGS.PaymentStatusUpdated player client
table status
Вызывается после обновления статуса пополнения счета.
На клиенте первый аргумент (игрок) не передается.

pay — Деньги переведены.
error — Какая-то ошибка.
check — Игрок перешел к оплате IGS.PlayerPurchasesLoaded player client
table purchases После входа игрока на сервер с нашей системы начинают загружаться его покупки.
После завершения вызывается этот хук.
На клиенте первый аргумент (игрок) не передается. IGS.OnSettingsUpdated Без аргументов Вызывается после получения или обновления данных для корректной работы функций IGS.GetMinCharge() и IGS.GetCurrencyPrice()

Хук Аргументы Описание
IGS.OnActivate player client
table ITEM
Вызывается после успешной активации итема с инвентаря. Можно использовать для выдачи дополнительных бонусов
IGS.OnError. + method string error
table parameters
Для опытных.
Вызывается в fetch.lua.
Предназначен для перехвата ошибок с определенных методов.

Пример перехвата:

hook.Add(«IGS.OnError.servers.get», «servers.get.catchError», function(error, parameters)
print(«Ошибка: » .. error .. «\n Переданные параметры: » .. parameters .. «\n»);
end) IGS.CanPlayerActivateItem player client
table ITEM
boolean global
int invID Вызывается при активации игроком услуги. Должен возвращать true или false в зависимости от того, может ли игрок активировать услугу. Если возвращен false, надо указать причину.

Пример:
hook.Add(«IGS.CanPlayerActivateItem», «OnlyAdminActivate», function(pl, item, global, invid)
if item:UID() == «admin_super_item» and !pl:IsAdmin() then
return false, «Активация возможна только для админов!»
end
end) IGS.CanPlayerBuyItem player client
table ITEM
boolean global
int invID Вызывается при покупки игроком услуги. Должен возвращать true или false в зависимости от того, может ли игрок купить услугу. Если возвращен false, надо указать причину.

Пример:
hook.Add(«IGS.CanPlayerBuyItem», «OnlyAdminBuy», function(pl, item, global, invid)
if item:UID() == «admin_super_item» and !pl:IsAdmin() then
return false, «Покупка возможна только для админов!»
end
end)

Хук Аргументы Описание
IGS.OnDepositWinOpen int depositAmount Вызывается при открытии окошка пополнения счета (Вот этого: https://img.qweqwe.ovh/1493842563826.png).
depositAmount — сумма для пополнения на которую открылась менюшка
IGS.OnItemInfoOpen table ITEM Вызывается при открытии этого окошка: https://img.qweqwe.ovh/1493843276142.png
IGS.CatchActivities panel activity
panel sidebar
В хуке должен вызываться метод activity:AddTab(«Название вкладки»,Панель вкладки,»Путь к материалу иконки 32*32″)

Если не хватает какого-то хука — скажите нам. Не добавляйте его сами

  • В транзакциях покупки начинаются с «P: » (purchase)
  • Активации купонов с «C: » (coupon)
  • Пополнения счета с «A: » (add funds)
  • Все операции с игроками проводятся по SteamID64 идентификатору (Никаких pl:SteamID())
  • Избегай InitPostEntity и других хуков вроде loadCustomDarkRPItems при добавлении итемов в additems.lua, так как эти хуки могут проскочить из-за особенности загрузки скрипта.

Вся остальная информация находится в комментариях к методам и функциям в коде, но я постараюсь вскоре перенести сюда.

Источник

Читайте также:  Не работает qr код hex код
Оцените статью