PDA

Просмотр полной версии : [Include] dc_garages.inc - система гаражей



Daniel_Cortez
04.10.2015, 21:48
Всем доброго времени суток.
Хочу поделиться с вами простой системой гаражей, которую я начал делать ещё в 2013 году.
И пусть вас не пугает эта цифра, с того момента код системы был несколько раз пересмотрен и улучшен.
В частности, сделано несколько макросов, благодаря которым систему гаражей можно подстроить практически под любой мод.
Также данные обо всех гаражах записаны в файле garages.cfg (см. в архиве вместе с инклудом). Всего этих гаражей 12 - именно столько свободных мест под гаражи я смог найти на карте Сан-Андреаса (и все они в Лос-Сантосе), но вы можете с помощью маппинга добавить ещё.

Скриншоты:

http://ihost.pro-pawn.ru/image.php?di=C4PZ
http://ihost.pro-pawn.ru/image.php?di=BHVW
http://ihost.pro-pawn.ru/image.php?di=T440
http://ihost.pro-pawn.ru/image.php?di=OD1T
http://ihost.pro-pawn.ru/image.php?di=Y23U
http://ihost.pro-pawn.ru/image.php?di=Z8N6
http://ihost.pro-pawn.ru/image.php?di=HQZJ


Пример использования:


#define GARAGES_FILE "Properties/garages.cfg"
#define MAX_GARAGES 12
#define GARAGES_PINFO PlayerInfo
#define GARAGES_PINFO_GARAGEKEY pGarageKey
#define GARAGES_PINFO_MONEY pMoney
#include "../include/dc_garages.inc"


Требования для работы:
sscanf2/3
DC_CMD
Streamer (опционально)


Список макросов для настройки:

Обязательные настройки:

GARAGES_FILE - название файла для хранения.
MAX_GARAGES - кол-во гаражей в файле, указанном в GARAGES_FILE.
GARAGES_PINFO - название массива с информацией обо всех игроках.
GARAGES_PINFO_GARAGEKEY - название свойства в структуре свойств игрока (обычно это pInfo), в котором будет храниться ID гаража, купленного игроком.
Внимание: вам придётся самостоятельно добавлять это свойство в pInfo.
GARAGES_PINFO_MONEY - название свойства, в котором хранятся деньги игрока.


Необязательные настройки:

GARAGES_OPEN_RADIUS - радиус, с которого можно открыть гараж командой /garage (по умолчанию 10.0).
GARAGES_MSG_COLOR_ERROR - цвет для сообщений об ошибках (по умолчанию серый).
GARAGES_MSG_COLOR_INFO - цвет для обычных сообщений (по умолчанию белый).
GARAGES_UNOCCUPIED_PICKUP_MDL - модель пикапа для продающихся гаражей (по умолчанию взята модель синей дискеты).
GARAGES_OCCUPIED_PICKUP_MDL - модель для пикапов купленных гаражей (по умолчанию та же, что и у продающихся гаражей).



Функции:

LoadGarages() - загружает информацию о гаражах из файла.
SaveGarages() - сохраняет информацию о гаражах в файл.
SellGarage(garageid, sellerid) - продаёт гараж garageid, принадлежащий игроку sellerid. Если вместо ID игрока указать INVALID_PLAYER_ID, гараж будет продан без участия владельца - это может пригодиться, если вы захотите написать админскую команду для продажи гаража (что-то вроде /asellgarage).


Команды:

/buygarage - купить свободный гараж.
/sellgarage - продать гараж по рыночной стоимости.
/garage - открыть/закрыть гараж.


Скачать:

https://www.dropbox.com/s/x0cx0eb3951xyr5/dc_garages.zip?dl=0

Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)

Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Adrenalin :3
04.10.2015, 23:20
Продам гараж ;D Отличная система

Unreal
06.10.2015, 15:50
sscanf2/3

а где найти 3 версию ?

Daniel_Cortez
07.10.2015, 01:47
а где найти 3 версию ?
Она ещё не выпущена официально, но Y_Less перед ещё своим уходом в апреле говорил, что 3-я версия почти готова.

https://github.com/emmet-jones/sscanf-3.0
Остаётся только, чтобы кто-нибудь протестировал плагин и зарелизил его. Произойти это может в любой момент (может быть, завтра, а может только через год), поэтому я заранее записал его в этой теме - в основном синтаксисе там очень мало несовместимостей со 2-й версией.
Правда нужно будет ещё подредактировать dc_garages, там пока что не учитывается возможность подключения sscanf3.inc. Сделаю это сегодня, как только освобожусь с пар.

Daniel_Cortez
07.10.2015, 20:00
Добавил поддержку sscanf3 (стоило лишь немного покопаться между несколькими #if/#endif).

Заодно убрал автоматический вызов LoadGarages, чтобы не вводить пользователей в заблуждение. Буду честен, я и сам однажды попался на эту уловку, когда тестировал систему: вызывал функцию LoadGarages вручную из OnGameModeInit, забыв, что она уже вызывается сама в инклуде, в итоге гаражи загружались дважды и объекты ворот дублировались.
До сих пор не пойму, в чём вообще был смысл автоматически вызывать LoadGarages через перехват OnGameModeInit, если нельзя сделать автоматический вызов SaveGarages в OnGameModeExit (http://pro-pawn.ru/showthread.php?12718) (ну, вообще-то можно, но есть вероятность, что мод окажется выгружен во время выполнения функции, т.к. сервер не дожидается её выполнения, и данные сохранятся неправильно). Наверное это оставалось ещё от старого кода из 2013.

Также сделал функцию UpdateGarage доступной внутри инклуда - всё равно вряд ли есть смысл использовать её из мода.
Вместо неё я добавил функцию SellGarage(garageid, playerid), которая может пригодиться при создания админ-команды для продажи гаража без участия владельца.

Кроме того, я убрал сохранение всей информации в файл при продаже одного из гаражей (/sellgarage).
Иначе была бы возможность перегрузки сервера блокирующими файловыми операциями из-за флуда командами /buygarage и /sellgarage.
Если нужно сохранить гаражи - лучше делайте это при выключении сервера. И если вы боитесь сбоев, можно ещё сделать периодическое сохранение, например, каждые 30 минут.

$continue$
07.10.2015, 20:59
1) Нет желание сделать альтернативу на SQL?
2) А почему сурс кода - нет? :(

Daniel_Cortez
08.10.2015, 05:30
1) Нет желание сделать альтернативу на SQL?
2) А почему сурс кода - нет? :(
1. Могу попробовать, если будет время найти и настроить нужные инструменты для работы с базами данных.
2. Я же выложил инклуд. Какой ещё "сурс код" нужен?

$continue$
08.10.2015, 17:34
Сурс код на gist/pastbin