Оригинальный мод SA:MP Reinforce RP

В теме 28 сообщений

danya_white
Старожил

Оригинальный мод SA:MP Reinforce RP

Скачать файл

Доброго времени суток, хочу выставить на продажу уникального игровой мод проекта Reinforce RP
Игровой мод написан с нуля, мод по своему уникальный так как полностью состоит из TextDrawax.
Из паблика ничего не используется. На момент открытие проект держал онлайн в 800+ человек беспроблемно.

На момент продажи все найденные баги/недоработки были исправлены.

 

Информация о моде:

Версия MYSQL - R39-6

Античит - Самописный античит

Стример - Streamer Plugin v2.9.4 by Incognito

Командный процессор - ZCMD

Хэширование паролей - MD5

Остальное Все плагины обновлены до последней версии


Функционал, интерфейс можно посмотреть по скриншотам и видеообзорам ниже.

 

Видеообзоры/скриншоты:

 


Почти всё реализовано на текстдравах, с возможностью смены цвета интерфейса под игрока. Цвета можно без проблем добавлять.
Количество копий на продажу ограничено. 


  • Добавил
  • Добавлено
    21.02.2025
  • Категория
  • Автор
    danya_white

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

flashback из кислой юности силуэт. Сколько лет этому моду.. Насчет того что "мод держал такой онлайн" по факту в сампе все решает больше грамотный подход к выбору хостинга и защите, а не оптимизации/коду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Зависеть так же может и от самого мода, как он оптимизирован. При онлайне в 100 он может просто упасть, если мод не оптимизирован.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 2/21/2025 в 11:13, angel_sinvays сказал:

@Web Зависеть так же может и от самого мода, как он оптимизирован. При онлайне в 100 он может просто упасть, если мод не оптимизирован.

Читать далее...  

 

Конкретику можно?)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.
Создатель WayDev

@Web, какая конкретика тебе нужна? Взять среднестатистический хостинг, по типу адвенса или ру-хостера и поставить мод, который не оптимизирован от слова совсем (чрезмерное использование макроса MAX_PLAYERS, как пример) и потом преплачивать за ВДС просто потому, что какой-то олень неудосужился нормально поработать над своим кодом? Как ты заявляешь, что твой опыт 10+ лет - уже становится байкой на форуме. Перестань набивать сообщения, боже.

Отредактировано пользователем 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Web
null
  В 2/22/2025 в 20:49, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

@Web, какая конкретика тебе нужна? Взять среднестатистический хостинг, по типу адвенса или ру-хостера и поставить мод, который не оптимизирован от слова совсем (чрезмерное использование макроса MAX_PLAYERS, как пример) и потом преплачивать за ВДС просто потому, что какой-то олень неудосужился нормально поработать над своим кодом? Как ты заявляешь, что твой опыт 10+ лет - уже становится байкой на форуме. Перестань набивать сообщения, боже.

Читать далее...  

 

Откуда столько негатива? Никто из действительно крупных проектов не использует подобных хостеров. У всех свои выделанные машины. Как правило у react.su

Если вы правы, то как люди жили до изобретения foreach инклуда под самп? Ваши слова про оптимизацию ничем не обоснованы и не подкреплены. С радостью посмотрел бы тесты и профилирования кода соответствующим плагином. Теперь к самому интересному. Если я что то забыл, потому что несколько месяцев не работал с данным языком и мультиплеером. Не значит, что я не имею опыта. Могу очень многое рассказать. Уж поверьте. Что про самп, что про крмп (в которое я играю чуть ли не с появления мультиплеера (именно CRMP, а не MTA), а именно с 2010 года. Скриптить стал где то как раз к 2012 году. Есть учетки на павн форумах, есть старые исходники. Так же я очень хорошо известен по первому RolePlay проекту в CR-MP, а именно urm-roleplay. Вопросы?

Отредактировано пользователем Web

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Ты сам себе противоречишь. Ты говоришь, что занимаешься этим с 2012 года, но при этом забыл базовые вещи за несколько месяцев? Это как минимум звучит абсурдно. Люди годами могут не писать моды, но всё равно помнят основы. Если ты реально столько лет в теме, то такие пробелы в знаниях просто странны. Абсолютно не согласен что у всех свои выделенные машины. Есть крупные проекты, такие как MONSER DM, который спокойно стоит на Advens. Не всем нужны выделенные машины. Выделенная машина — это выбор, но не показатель уровня проекта. Если мод написан грамотно, он может стабильно работать и на хорошем VPS. А если код кривая помойка, то и на топовом железе сервер будет лагать и вылетать.

 

Что доказывают твои учётки? У тебя есть учётки на форумах и старые исходники — ну окей, но это никак не подтверждает твои аргументы. Факт в том, что неоптимизированный код роняет сервер, и примеров этому куча. А то, что ты «очень хорошо известен» по URM RolePlay, тоже ничего не меняет.

 

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

Отредактировано пользователем angel_sinvays
Причина: Дописал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 3/8/2025 в 18:54, angel_sinvays сказал:

@Web Ты сам себе противоречишь. Ты говоришь, что занимаешься этим с 2012 года, но при этом забыл базовые вещи за несколько месяцев? Это как минимум звучит абсурдно. Люди годами могут не писать моды, но всё равно помнят основы. Если ты реально столько лет в теме, то такие пробелы в знаниях просто странны. Абсолютно не согласен что у всех свои выделенные машины. Есть крупные проекты, такие как MONSER DM, который спокойно стоит на Advens. Не всем нужны выделенные машины. Выделенная машина — это выбор, но не показатель уровня проекта. Если мод написан грамотно, он может стабильно работать и на хорошем VPS. А если код кривая помойка, то и на топовом железе сервер будет лагать и вылетать.

 

Что доказывают твои учётки? У тебя есть учётки на форумах и старые исходники — ну окей, но это никак не подтверждает твои аргументы. Факт в том, что неоптимизированный код роняет сервер, и примеров этому куча. А то, что ты «очень хорошо известен» по URM RolePlay, тоже ничего не меняет.

 

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

Читать далее...  

 

На каком хостинге аризона? Я так и не увидел примеров кода и профилирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Работаешь с 2012 года, но отрицаешь, что неоптимизированный код с MAX_PLAYERS может положить сервер, я тебя услышал, ты решил после долгого окончания этой темы её восстановить, ладно, тогда - запусти профайлер на цикле в OnPlayerUpdate с 100 игроками (примерное кол-во) — увидишь, как сервер ляжет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Michov Andr
Освоившийся

@Web Хостинге? не ну все тут можно было тебе рот не открывать, у них полюбому своя серверная где много вдс)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 5/25/2025 в 22:07, watson сказал:

@Web Работаешь с 2012 года, но отрицаешь, что неоптимизированный код с MAX_PLAYERS может положить сервер, я тебя услышал, ты решил после долгого окончания этой темы её восстановить, ладно, тогда - запусти профайлер на цикле в OnPlayerUpdate с 100 игроками (примерное кол-во) — увидишь, как сервер ляжет.

Читать далее...  

 

Что за чушь я сейчас прочитал? Никто в здравом уме не будет писать подобный код. Либо я вас не понимаю. Можно конкретный пример?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.
Создатель WayDev

@Web, странно, что ты до сих пор так и не понял, что именно мы пытаемся до тебя донести. Представим Васю Пупкина, который вообще не в курсе про существование функций GetPlayerPoolSize и GetVehiclePoolSize, и уж тем более, не в курсе про существование итераторов. Представим кусок кода (порядка 500 строк), в котором будут циклы ИСКЛЮЧИТЕЛЬНО с MAX_PLAYERS. Если уж такая пляска, то разжую конкретно, как именно вредит чрезмерное использование MAX_PLAYERS. Чрезмерное использование глобальных переменных с использованием MAX_PLAYERS как минимум забивает стэк. Да, кто-то может сказать, что стэк всегда можно расширить при помощи препроцессора, но давай будем честны, его бы и без тебя расширили свыше 16834 байта из коробки. Средний хостинг не выдержит нагрузки и в 150 игроков с подобным кодом. Как уже сказал выше @watson - напиши обычный код, который будет обрабатывать информацию об игроке (изменение значений переменных, выгрузка данных с базы данных) и все это в цикле с использованием MAX_PLAYERS со значением в 1000 (стандартным значением, ибо не каждый удосужится изменить значение) и посмотри статистику профайлера. Больше оффтопить я не буду, ибо это уже не имеет никакого смысла.

Отредактировано пользователем 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Конкретно в OnPlayerUpdate допустим ты поставишь цикл по MAX_PLAYERS, который, например, шлет всем сообщения о позициях игроков или пишет логи в файл. При 50+ онлайне это дает жуткие лаги, потому что функция вызывается 20–30 раз в секунду на игрока. На среднестатистическом хостинге или даже бюджетном - сервер просто ляжет. Не веришь — запусти с профайлером, увидишь, как OnPlayerUpdate съедает 90% ресурсов. Опять же я тоже не вижу смысла дальше оффтопить и засорять тему, если ты не поймёшь базовый пример Эмперора и мой, с тобою уже не о чем будет говорить.

Отредактировано пользователем watson

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Web
null
  В 5/26/2025 в 20:06, 𝙡𝙖𝙨𝙩 𝙚𝙢𝙥𝙚𝙧𝙤𝙧. сказал:

@Web, странно, что ты до сих пор так и не понял, что именно мы пытаемся до тебя донести. Представим Васю Пупкина, который вообще не в курсе про существование функций GetPlayerPoolSize и GetVehiclePoolSize, и уж тем более, не в курсе про существование итераторов. Представим кусок кода (порядка 500 строк), в котором будут циклы ИСКЛЮЧИТЕЛЬНО с MAX_PLAYERS. Если уж такая пляска, то разжую конкретно, как именно вредит чрезмерное использование MAX_PLAYERS. Чрезмерное использование глобальных переменных с использованием MAX_PLAYERS как минимум забивает стэк. Да, кто-то может сказать, что стэк всегда можно расширить при помощи препроцессора, но давай будем честны, его бы и без тебя расширили свыше 16834 байта из коробки. Средний хостинг не выдержит нагрузки и в 150 игроков с подобным кодом. Как уже сказал выше @watson - напиши обычный код, который будет обрабатывать информацию об игроке (изменение значений переменных, выгрузка данных с базы данных) и все это в цикле с использованием MAX_PLAYERS со значением в 1000 (стандартным значением, ибо не каждый удосужится изменить значение) и посмотри статистику профайлера. Больше оффтопить я не буду, ибо это уже не имеет никакого смысла.

Читать далее...  

 

Представьте, я — Вася Пупкин. Ничего не знающий о существовании GetPlayerPoolSize и GetVehiclePoolSize, потому что я в 2012 году, а GetPlayerPoolSize и GetVehiclePoolSize появились только в 0.3.7 — в 2015 году.

Как я жил раньше? Писал качественный код? Или, может быть, меня выручал foreach? Так он тоже не сразу появился.

Давайте представим код порядка 500 строк. И что? Нужна конкретика. Не каждый код забивает стек, если что. А если забьёт — в чём проблема расширить? Это вполне нормальная практика, а не так, как некоторые думают.

Про средний хостинг и 150 игроков — это натягивать сову на глобус. Важно железо. О чём я вам с самого начала говорил: важны соседи по хостингу, ведутся ли атаки на вас или соседей. Если у вас серьёзный подход к проекту, какой бюджетный хостинг?

И код, конечно, важен. Но не так фатально.

Отдельное "ха-ха" я словил, почитав на вашем же форуме ваши рассуждения об архитектуре написания лаунчера.

 

  В 5/26/2025 в 20:54, watson сказал:

@Web Конкретно в OnPlayerUpdate допустим ты поставишь цикл по MAX_PLAYERS, который, например, шлет всем сообщения о позициях игроков или пишет логи в файл. При 50+ онлайне это дает жуткие лаги, потому что функция вызывается 20–30 раз в секунду на игрока. На среднестатистическом хостинге или даже бюджетном - сервер просто ляжет. Не веришь — запусти с профайлером, увидишь, как OnPlayerUpdate съедает 90% ресурсов. Опять же я тоже не вижу смысла дальше оффтопить и засорять тему, если ты не поймёшь базовый пример Эмперора и мой, с тобою уже не о чем будет говорить.

Читать далее...  

 

OnPlayerUpdate в любом случае будет самым нагруженным коллбэком из-за частого вызова, представьте? И его имеет смысл использовать только для античитов, с чем он успешно справляется.

Для логов лучше всего использовать:
https://github.com/maddinat0r/samp-log
или писать в СУБД. Это тоже важный и отдельный момент — как к этому подходить.

С радостью послушаю экспертов.

А ещё вам по секрету: foreach (который, напоминаю, появился не сразу) работает только до небольшого онлайна. Когда онлайн достигает 1000 человек, производительность будет примерно такая же, как у обычного цикла. Даже с JIT-плагином.

И еще одному:

Все крупные проекты переехали/переезжают на https://github.com/openmultiplayer как SA-MP так и CR-MP.

Где исправили многие пробелемы и повысили производительность. Не говоря уже про возможность использования других языков программирования не в виде плагина как это было в SA-MP и CR-MP

 

Такие дела.

 

 

Отредактировано пользователем Web

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Тебе был приведён письменно простой пример с MAX_PLAYERS в OnPlayerUpdate — цикл на 1000 итераций с логами в файл, чтобы показать, как сервер ложится при 100+ онлайна, раз ты утверждал что это каким то образом - невозможно. Эмперор тебе дал вполне дельный и чётко разжёванный ответ, факт в том что профайлер тебе покажет о том что 90% CPU улетает на этот шлак, даже на бюджетном хостинге. Хочешь — бери дорогостоящий хостинг и проверяй, результат будет тот же что я тебе и описываю на протяжении 20 часов. OpenMP, samp-log и foreach — круто, но твой тезис всё равно мимо кассы, не числится в базовый пример который я тебе преподношу, прежде всего я тебе в письменном формате объясняю как из за чрезмерного использования MAX_PLAYERS можно положить сервер даже на дорогостоящем хостинге, те способы оптимизации и кода о которых ты мне пытаешься писать в целом не идут в уклад с примером который я тебе давал выше. Дальше на твои тезисы отвечать я не намерен, странно что ты до сих пор так и не понял то о чём мы пытаемся тебе донести на протяжении долгого времени, тема не несёт смысловой нагрузки, всё что я хотел тебе объяснил.

Отредактировано пользователем watson

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 5/27/2025 в 19:50, watson сказал:

@Web Тебе был приведён письменно простой пример с MAX_PLAYERS в OnPlayerUpdate — цикл на 1000 итераций с логами в файл, чтобы показать, как сервер ложится при 100+ онлайна, раз ты утверждал что это каким то образом - невозможно. Эмперор тебе дал вполне дельный и чётко разжёванный ответ, факт в том что профайлер тебе покажет о том что 90% CPU улетает на этот шлак, даже на бюджетном хостинге. Хочешь — бери дорогостоящий хостинг и проверяй, результат будет тот же что я тебе и описываю на протяжении 20 часов. OpenMP, samp-log и foreach — круто, но твой тезис всё равно мимо кассы, не числится в базовый пример который я тебе преподношу, прежде всего я тебе в письменном формате объясняю как из за чрезмерного использования MAX_PLAYERS можно положить сервер даже на дорогостоящем хостинге, те способы оптимизации и кода о которых ты мне пытаешься писать в целом не идут в уклад с примером который я тебе давал выше. Дальше на твои тезисы отвечать я не намерен, странно что ты до сих пор так и не понял то о чём мы пытаемся тебе донести на протяжении долгого времени, тема не несёт смысловой нагрузки, всё что я хотел тебе объяснил.

Читать далее...  

 

И как по вашему жили люди когда отсутствовали итераторы, плагины. А были только файлы и стандартные циклы? А какой онлайн на геймворолде / адвансе / самп рп был в те года? Как же они так успешно работали без существования итераторов? Писали качественный код? А как его писать правильно если в те времена все писали как умели и не было каких то раскрытых общих практик и стандартов? Я все еще жду примера с кодом и главное падение сервера в результате.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Ты не понимаешь мысль которую я до тебя доношу. В 2012–2015 сервера типа Advance RP держали 200–300 игроков, но кодеры избегали спама в OnPlayerUpdate и не писали логов каждый тик. Твой тезис, что сервер нельзя завалить MAX_PLAYERS, — мимо, профайлер покажет 90% CPU на таком коде при 100+ онлайне. Я не буду ради тебя писать точный код — всё уже разжёвано в письменном виде. Мы с Эмперором объяснили - цикл с MAX_PLAYERS в OnPlayerUpdate, спамящий логи в файл, валит сервер при 50+ онлайне, профайлер покажет 90% CPU. Хочешь доказательств — возьми мои слова, напиши код сам и проверь. Хватит оффтопить, ещё раз повторюсь.

Если ты не будешь писать по сути дела и будешь отвечать мне одним и тем же лепетом, по просту я буду игнорировать твои сообщения, опять же, для меня они не несут никакой смысловой нагрузки. Будешь ждать в таком случае ответ Эмперора, всё что у меня было на уме я тебе разжевал, твоя проблема то что ты почему то до сих пор не понимаешь о мои сообщения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А нафига логи в OnPlayerUpdate писать? Логи чего? Это ж глупость изначально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Конечно никто в здравом уме не будет пихать логи в OnPlayerUpdate, но я дал этот базовый пример, чтобы показать, как MAX_PLAYERS может завалить сервер — исключительно для понимания. Есть куча способов, как НЕ надо работать с MAX_PLAYERS, и это лишь один, самый простой. Эмперор дал более свежий пример. Повторюсь, цикл с MAX_PLAYERS в OnPlayerUpdate, спамящий логи в файл, валит сервер при 50+ онлайне, профайлер покажет 90% CPU. Опять же, если ты хочешь проверить, возьми пример моих изложений и напиши код который тебе и положит сервер, либо возьми пример тезисов Эмперора да и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Web
null
  В 5/27/2025 в 20:59, watson сказал:

@Web Конечно никто в здравом уме не будет пихать логи в OnPlayerUpdate, но я дал этот базовый пример, чтобы показать, как MAX_PLAYERS может завалить сервер — исключительно для понимания. Есть куча способов, как НЕ надо работать с MAX_PLAYERS, и это лишь один, самый простой. Эмперор дал более свежий пример. Повторюсь, цикл с MAX_PLAYERS в OnPlayerUpdate, спамящий логи в файл, валит сервер при 50+ онлайне, профайлер покажет 90% CPU. Опять же, если ты хочешь проверить, возьми пример моих изложений и напиши код который тебе и положит сервер, либо возьми пример тезисов Эмперора да и всё.

Читать далее...  

 

Его пример ещё более обтекаем и необъективен. Всё зависит от конкретного кода и действий. И это в любом случае будет давать нагрузку. Это нормально. И не уверен, что приведёт к крашу.

Отредактировано пользователем Web

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
watson
Завсегдатый

@Web Обтекаемый? По сути он, как и мой, чётко показывает, как MAX_PLAYERS  с тяжёлыми операциями по типу записи в файл перегружает сервер, только мой выдан в базовом примере, у него дано в более профессиональном примере работы с обычным кодом без всяких глупых логов. Да, любой код даёт нагрузку, но дело в том, что такие или похожие ошибки — могут быть проблемой, особенно на слабых хостингах. Цикл на 1000 итераций при 50+ онлайне может легко задрать CPU до 90%, а то и крашнуть сервер. Это не нормально, если таков код будет давать тебе мощную нагрузку на хостинг, как минимум если у тебя 90% CPU займёт весь этот код обработками ну и посуди сам, 50+ человек он не в состоянии будет выдержать, даже если тот хостинг откуда ты берёшь очень мощный, даже тот же Ru-Hoster, Advens, MyArena, они не выдержат обработку твоего сервера, не от хостера зависит а от того какой код ты пишешь. Мой пример это самый базовый, пример Эмперора выдан более развёрнутым и как мне кажется выдан более конструктивным, понятным и логичным нежели чем мой. Не пойму чего ты до сих пор не можешь понять.

Отредактировано пользователем watson

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • breznov
      От breznov
      Доброго времени суток уважаемые форумчане !
      Я начинающий Pawn-кодер, немного влился в функционал, шарю за диалоги, актеров, и прочего, сейчас занялся автошколой, 
      создал актеров, добавил маппинг, добавил 1 диалог на актера встречающего игрока при входе, ну и преподавателя, вот теперь дело дошло до системы вопросов на тесте и самой практики, много думал по этому делу, думал через switch вопросы писать, потом думал через отдельные диалоги, но всё-таки не додумался, хочу попросить помощи у специалистов данного языка, с реализацией данной системы, желательно на базе MySQL, с плеча попрошу не рубить, у меня код предельно не стандартный, на примере диалогов, чтобы создать сам диалог, надо его объявить в enum dialogs, после переходить в респонс и писать кейс, начинал делать мод по урокам Леона, где 41 серия, дошел до шахты, потом стало в падлу смотреть и начал самостоятельно изучать язык, пока-что в процессе, горю огромным желанием научиться, и всё-же, прошу помощи у специалистов языка.
    • breznov
      От breznov
      Доброго времени суток уважаемые форумчане !
      Хочу попросить помощь у вас, у меня проблемы с сохранением лидерки в базу данных, код:
       
      new FactionName[32] = "Скинхеды"; new Float:FactionHQX = 123.45, Float:FactionHQY = 678.90, Float:FactionHQZ = 10.11; new FactionMembers[MAX_PLAYERS]; new FactionRank[MAX_PLAYERS]; new FactionLeader = -1; // ID лидера (-1 означает, что лидера нет) new FactionDeputy = -1; // ID заместителя (-1 означает, что заместителя нет)

       
      #define FACTION_SKINHEDS 1 #define LEADER_INFO_DIALOG 1


       
      new const FactionRankNames[][] = {     "Новичок",     "Боец",     "Стрелок",     "Головорез",     "Бригадир",     "Доверенное лицо",     "Советник",     "Заместитель",     "Консильери",     "Дон" };  
      public OnGameModeInit():

       
      public OnGameModeInit() {     ConnectMySQL();     DisableInteriorEnterExits();     EnableStuntBonusForAll(0);     SetGameModeText("Armade RP v2.0");     SendRconCommand("hostname "SERVER_NAME" by Didenko");     LoadMapping();     Iter_Clear(Admins_ITER);     Iter_Clear(Question_ITER);     actor1 = CreateActor(159, 1800.0490, 2506.0791, 15.8725, 269.5358);     ApplyActorAnimation(actor1, "PED", "ROADROSS_FEMALE", 4.1, 1, 1, 1, 0, 0);     Create3DTextLabel("{FFFFFF}Нажмите {ffff00}L.ALT{FFFFFF} чтобы начать взаимодействие", COLOR_GREEN, 1800.0490, 2506.0791, 15.8725, 10.0, 0, 1);     //======================[ Пикапы ]==================================     magazvhod1 = CreatePickup(1318, 23, 2074.3257,1838.3256,12.5391, -1);     magazvihod1 = CreatePickup(1318, 23, -25.5779,-184.9357,1003.5469, -1);     SetTimer("SecondUpdate", 1000, true);     SetTimer("MinuteUpdate", 60000, true);     LoadFactionsData(); // Загружаем данные о фракциях и лидерах     return 1; }
       
      Стоки:

       
      stock LoadFactionsData() {     print("LoadFactionsData: Starting to load factions data...");     new query[64];     format(query, sizeof(query), "SELECT id, FactionLeader FROM factions");     mysql_tquery(dbHandle, query, "LoadFactionsData_Callback");     print("LoadFactionsData: Query sent.");     return 1; } forward LoadFactionsData_Callback(MySQL:handle, Cache:result); public LoadFactionsData_Callback(MySQL:handle, Cache:result) {     new rows = cache_num_rows();     printf("LoadFactionsData_Callback: Number of rows loaded: %d", rows);     if(rows > 0)     {         for(new i = 0; i < rows; i++)         {             cache_set_result(0);             new factionID, factionLeaderID;             if (!cache_get_value_name_int(i, "id", factionID)) {                 printf("[ERROR] LoadFactionsData_Callback: Failed to get 'id' for row %d", i);                 continue; // Переходим к следующей итерации, если не удалось получить ID             }             if (!cache_get_value_name_int(i, "FactionLeader", factionLeaderID)) {                 printf("[ERROR] LoadFactionsData_Callback: Failed to get 'FactionLeader' for row %d", i);                 continue; // Переходим к следующей итерации, если не удалось получить FactionLeader             }             printf("LoadFactionsData_Callback: Row %d: factionID = %d, factionLeaderID = %d", i, factionID, factionLeaderID);             if(factionLeaderID != 0)             {                 FactionLeader = factionLeaderID;                 FactionRank[factionLeaderID] = 10;                 printf("LoadFactionsData_Callback: Setting FactionLeader to %d and rank to 10.", factionLeaderID);                 // Не вызываем здесь SetPlayerSkin, пока не подключится игрок                 //if(IsPlayerConnected(factionLeaderID))                 //{                 //    SetPlayerSkin(factionLeaderID, 115);                 //    PlayerSkin[factionLeaderID] = 115;                 //}             }         }     }     else {         print("LoadFactionsData_Callback: No factions data found in the database.");     }     return 1; } stock SetFactionLeader(playerid, targetid) {     if(player_info[playerid][ADMIN] < 5)     {         SendClientMessage(playerid, CG, "Вы не являетесь администратором!");         return 1;     }     // Убираем старого лидера     if(FactionLeader != -1)     {         FactionRank[FactionLeader] = 1; // Понижаем ранг старого лидера     }     // Назначаем нового лидера     FactionLeader = targetid;     FactionRank[targetid] = 10;     // Сохраняем ID лидера в базу данных     new query[128];     format(query, sizeof(query), "UPDATE factions SET FactionLeader = '%d' WHERE id = '1'", targetid); // Замените '1' на ID вашей фракции, если у вас их несколько     mysql_tquery(dbHandle, query);     new szString[128];     format(szString, sizeof(szString), "Игрок %s назначен лидером фракции!", targetid);     SendClientMessage(playerid, 0x00FF00AA, szString);     SendClientMessage(targetid, 0x00FF00AA, "Вы назначены лидером фракции!");     // Выдаем скин 115     SetPlayerSkin(targetid, 115);     PlayerSkin[targetid] = 115; // Обновляем массив PlayerSkin     SPD(playerid, DLG_LEADERINFO1, DIALOG_STYLE_LIST, "Информация необходимая к прочтению", "{FF0000}!!!ПРОЧИТАТЬ!!!\n{0089ff}[1]{ffffff} Команды лидера", "Выбрать", "Закрыть");     return 1; } stock SetFactionDeputy(playerid, targetid) {     // Проверка на то, является ли игрок админом     if(player_info[playerid][ADMIN] > 5)     {         SendClientMessage(playerid, CG, "Вы не являетесь администратором!");         return 1;     }     // Убираем старого заместителя     if(FactionDeputy != -1) FactionRank[FactionDeputy] = 1; // Понижаем ранг старого заместителя     // Назначаем нового заместителя     FactionDeputy = targetid;     FactionRank[targetid] = 9; // Устанавливаем ранг 9 (Консильери)     new szString[128];     format(szString, sizeof(szString), "Игрок %d назначен заместителем фракции!", targetid);     SendClientMessage(playerid, 0x00FF00AA, szString);     SendClientMessage(targetid, 0x00FF00AA, "Вы назначены заместителем фракции!");     return 1; } // Функция проверки, является ли игрок лидером stock IsPlayerLeader(playerid) {     if(playerid == FactionLeader)     {         return 1;     }     return 0; } // Функция проверки, является ли игрок заместителем stock IsPlayerDeputy(playerid) {     if(playerid == FactionDeputy)     {         return 1;     }     return 0; } // Функция вступления во фракцию stock JoinFaction(playerid, inviterid) {     // Проверяем, состоит ли игрок уже в какой-либо фракции     for(new i = 0; i < MAX_PLAYERS; i++)     {         if(FactionMembers[playerid] != 0)         {             SendClientMessage(playerid, 0xFF0000AA, "Вы уже состоите в другой фракции!");             return 1;         }     }     // Добавляем игрока во фракцию     FactionMembers[playerid] = FACTION_SKINHEDS;     FactionRank[playerid] = 1; // Рядовой (Новичок) - Устанавливаем ранг     new szString[128];     format(szString, sizeof(szString), "Вы вступили в '%s' по приглашению игрока %d!", FactionName, inviterid);     SendClientMessage(playerid, 0x00FF00AA, szString);     format(szString, sizeof(szString), "Игрок %d вступил в '%s' по вашему приглашению!", playerid, FactionName);     SendClientMessage(inviterid, 0x00FF00AA, szString);     return 1; } stock LeaveFaction(playerid) {     if(!IsPlayerInFaction(playerid, FACTION_SKINHEDS))     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не состоите в этой фракции!");         return 1;     }     FactionMembers[playerid] = 0; // Обнуляем ID фракции (0 - значит, не состоит)     FactionRank[playerid] = 0;     SendClientMessage(playerid, 0x00FF00AA, "Вы покинули Семью Рейес!");     return 1; } stock GetFactionRank(playerid) {     return FactionRank[playerid]; } stock SetFactionRank(playerid, targetid, rank) {     // Проверка на то, является ли игрок лидером или заместителем     if(!IsPlayerLeader(playerid) && !IsPlayerDeputy(playerid))     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не имеете права устанавливать ранги!");         return 1;     }     // Проверка на то, чтобы ранг не был слишком высоким     if(rank > 10 || rank < 1)     {         SendClientMessage(playerid, 0xFF0000AA, "Неверный ранг!");         return 1;     }     FactionRank[targetid] = rank;     new szString[128];     format(szString, sizeof(szString), "Вы установили ранг '%s' для игрока %d", FactionRankNames[rank - 1], targetid); // Получаем название из массива     SendClientMessage(playerid, 0x00FF00AA, szString);     format(szString, sizeof(szString), "Вам установлен ранг '%s' игроком %d", FactionRankNames[rank - 1], playerid); // Получаем название из массива     SendClientMessage(targetid, 0x00FF00AA, szString);     return 1; } // Функция проверки, состоит ли игрок во фракции stock IsPlayerInFaction(playerid, factionid) {     if(FactionMembers[playerid] == factionid)     {         return 1;     }     return 0; }
      Ну и команды естественно:

       
      // Команда для установки ранга (пример, только для лидеров) CMD:setrank(playerid, cmdtext[]) {     new targetid, rank;     if(sscanf(cmdtext, "dd", targetid, rank))     {         SendClientMessage(playerid, 0xFF0000AA, "Используйте: /setrank [ID игрока] [Ранг]");         return 1;     }     SetFactionRank(playerid, targetid, rank);     return 1; } // Команда информации о фракции CMD:factioninfo(playerid, cmdtext[]) {     new szString[256];     format(szString, sizeof(szString), "Название: %s, Штаб-квартира: %.2f %.2f %.2f", FactionName, FactionHQX, FactionHQY, FactionHQZ);     SendClientMessage(playerid, 0x00FF00AA, szString);     return 1; } CMD:setleader(playerid, cmdtext[]) {     new targetid;     if(sscanf(cmdtext, "d", targetid))     {         SendClientMessage(playerid, 0xFF0000AA, "Используйте: /setleader [ID игрока]");         return 1;     }     SetFactionLeader(playerid, targetid);     return 1; } CMD:setdeputy(playerid, cmdtext[]) {     new targetid;     if(sscanf(cmdtext, "d", targetid))     {         SendClientMessage(playerid, 0xFF0000AA, "Используйте: /setdeputy [ID игрока]");         return 1;     }     SetFactionDeputy(playerid, targetid);     return 1; } // -------------------------------------------------------------------------- // Команда для приглашения игрока во фракцию (только для лидеров и заместителей) // -------------------------------------------------------------------------- CMD:invite(playerid, cmdtext[]) {     new targetid;     if(!IsPlayerLeader(playerid) && !IsPlayerDeputy(playerid))     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не имеете права приглашать игроков!");         return 1;     }     if(sscanf(cmdtext, "d", targetid))     {         SendClientMessage(playerid, 0xFF0000AA, "Используйте: /invite [ID игрока]");         return 1;     }     // Добавим проверку на приглашение самого себя     if(playerid == targetid)     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не можете пригласить самого себя!");         return 1;     }     JoinFaction(targetid, playerid);     return 1; } // -------------------------------------------------------------------------- // Команда для исключения игрока из фракции (только для лидеров и заместителей) // -------------------------------------------------------------------------- CMD:uninvite(playerid, cmdtext[]) {     new targetid;     if(!IsPlayerLeader(playerid) && !IsPlayerDeputy(playerid))     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не имеете права исключать игроков!");         return 1;     }     if(sscanf(cmdtext, "d", targetid))     {         SendClientMessage(playerid, 0xFF0000AA, "Используйте: /uninvite [ID игрока]");         return 1;     }     // Добавим проверку на исключение самого себя     if(playerid == targetid)     {         SendClientMessage(playerid, 0xFF0000AA, "Вы не можете увольнять самого себя!");         return 1;     }     if(!IsPlayerInFaction(targetid, FACTION_SKINHEDS))     {         SendClientMessage(playerid, 0xFF0000AA, "Этот игрок не состоит в вашей фракции!");         return 1;     }     LeaveFaction(targetid);     return 1; }

      Ребят, не судите строго пожалуйста, делал с помощью ChatGPT, помогите пожалуйста сохранение лидерки и заместителя сделать
    • breznov
      От breznov
      Всем доброго времени суток ! Я пишу мод с нуля, дело дошло до подключения cef интерфейсов, я от слова совсем не понимаю как в моде прописать подключения cef.
      Пробовал конечно же подключать, создавал браузер через "cef_create_browser(playerid, 0x12345, "ссылка", false, false);", но ничего не получалось.
      Я только начинаю изучать работу данного языка, извиняюсь за то что я тупоголовый. Хочу попросить помощи у специалистов, будьте добры объяснить написание данной системы с отображением cef пожалуйста =(
      Если нужен будет мой код, я могу его предоставить. 
    • Fanatik2025)
      От Fanatik2025)
      Какие системы прикольные иобно вырезать из мода ETRP[2024-2025]
      В мод Arizona 
    • Adam_Pawno
      От Adam_Pawno
      https://ibb.co/ycsKnjhx Вот когда сажест взрывается машины я не понимаю как работает систему не могу предоставить код, какие могут быть причины? Это исключительно созданные машины через мод  тиn addveh..