Клановая система

Ядро плагина Клановая система 1.91

Версия Дата выпуска Скачивания Оценка  
1.91 1,057 0.00 звёзд 0 оценок Скачать
1.9 74 5.00 звёзд 1 оценок Скачать
1.882 289 0.00 звёзд 0 оценок Скачать
В тег записывались только 2 символа, теперь все должно быть ок :)
Новое:
- Одни файлы для всех версий игры сразу (наконец-то это пришло)
- Квар на установку тега ядром (если поставить 0, то в начале раунда и при других случаях клан тег обновляться ядром не будет!)
sm_clans_tag_enable "1/0" // 1 - вкл, 0 - выкл
- Подключение к базе теперь происходит асинхронно
- Админ видит клановый чат любого клана
sm_clans_admin_cct "b" //Флаг админский, по умолчанию b
- Украинский перевод (спасибо tohatroha)

Фикс:
- Раньше одно из действий для логов в базу выдавало ошибку (не было экранировано самое действие)

Новые файлы перевода лежат в архиве, а также cfg файл, в который были добавлены 2 новых квара
Предположу, что что-то еще было, но это было давно, поэтому не вспомнится :)
  • Мне нравится
Реакции: Rimmer
Фикс ошибки
Exception reported: Client index -1 is invalid в SayHook()
Поправил одну функцию для доп. опций для ролей.
Фиксы:
[SM] Exception reported: No current result set
[SM] Blaming: clans.smx
[SM] Call stack trace:
[SM] [0] SQL_FetchRow
[SM] [1] Line 62, clans/database.sp::Upgrade1
- Раньше кикало из клана, когда пытаешься сменить роль, находясь в клане один
- Некорректно работала клановая админка через меню (если выбрать, например,
"изменить количество монет", но не выбрать клан, а сразу ввести что-то в чат,
то введенное "съедалось", но никому, конечно, ничего не давалось)
- Вылезала ошибка о невозможности вывести в чат сообщение при вызове админ-команд из консоли. Что-то от этого ломалось, теперь не будет
- Поправил ошибку, что не компилится на SM 1.11

Новое:
То, что заинтересует чуть больше людей, чем какое-то там API ниже:
Но сначала скажу, что добавлено 2 форварда 😄
Для тех, кому это не так интересно, просто скажу, что сейчас можно делать запрет на создание/переименовывания клана по каким-либо критериям. Что насчет фильтра для названий кланов? :)
Но, если кто-то это уже сделал, то сейчас, по идее, должно быть полегче.

Ну а теперь про форварды:
/**
* @param int iLeader - индекс лидера нового клана
* @param const char[] clanName - название клана
* @param int iCreator - индекс того, кто создает (например тут можно увидеть, что создает админ)
*
* @return Plugin_Continue, чтобы разрешить создание клана. Другое значение - запретит
*/
forward Action Clans_PreClanRename(int iClanId, const char[] oldClanName, const char[] newClanName, int iWhoRename);
/**
* @param int iClanId - ИД клана
* @param const char[] oldClanName - старое (текущее) название
* @param const char[] newClanName - желаемое название
* @param int iWhoRename - индекс того, кто меняет название
*
* @return Plugin_Continue чтобы разрешить переименовывание клана. Другое значение - запретит
*/
forward Action Clans_PreClanRename(int iClanId, const char[] oldClanName, const char[] newClanName, int iWhoRename);

API Natives:
- Более удобное (менее запутанное как минимум) получение данных об игроке
CCST_USETAG, // Флаг, использует ли игрок клановый тег
CCST_ID, // ИД игрока в базе
CCST_ROLE, // Роль игрока
CCST_CLANID, // ИД клана игрока
CCST_KILLS, // Число убийств игроке в клане
CCST_DEATHS, // Число смертей игрока в клане
CCST_PERMTOCREATE, // Флаг, может ли игрок создавать клан
CCST_TIMEINCLAN, // Время игрока в клане (секунды)
CCST_TIMETOCREATE // Время, сколько игроку еще ждать до создания клана

CCST_USETAG, CCST_PERMTOCREATE и CCST_TIMETOCREATE вернут 0, если просить данные по ИД игрока в базе, а самого игрока на сервере нет
// iClientDB - ID игрока в базе
// Clans_ClientStatsType - то, что хотите получить
native int Clans_GetClientDataFromDB(int iClientDB, Clans_ClientStatsType type);
Если игрок с таким ИДом онлайн, то данные возьмутся с сервера!
// iClient - индекс игрока на сервере
// Clans_ClientStatsType - то, что хотите получить

native int Clans_GetClientData(int iClient, Clans_ClientStatsType type);
Показ одного из меню ядра игроку
Внимание, меню могут не показываться, если игроку это меню видеть нельзя или показ вовсе невозможен!
Пояснения:
targetID
- ИД игрока, чью статистику показывать
clanid - ИД клана
showFlags - 1й бит: показывать игрока в меню, 2й бит: не показывать игроков, чья роль выше, 3й бит: не показывать тех, у кого роль выше или такая же (суть больше в том, что такая же)
showClientClan - показывать ли клан игрока или нет

CM_Main, //Главное меню
CM_Control, //Меню управления кланом
CM_PlayerStats, //Статистика игрока, param1 = targetID
CM_ClanStats, //Статистика клана, param1 = clanid
CM_ClanMembers, //Показать список участников клана param1 = clanid, param2 = showFlags
CM_Top, //Показать топ кланов
CM_ClansList, //Показать список кланов игроку param1 = showClientClan
CM_AllClanClients, //Показать всех игроков, кто состоит в кланах
CM_Admin, //Показать админ меню
CM_ClanHelp, //Показать подсказку по командам для игроков
CM_TagSettings //Показать подсказку по командам для админов
// iClient - собственно кому показываем
// menuType - тип меню, которые есть выше
// param1, param2 - зависит от типа меню
// saveAsLastMenu - сохранить меню в стеке меню (так сделаны возвраты в ядре). Думаю, по умолчанию true вполне устроит всех

native Clans_ShowClientMenu(int iClient, Clan_MenuType menuType, int param1 = -1, int param2 = -1, bool saveAsLastMenu = true);
API Регистрация доп. опции для управления кланом для ролей:
Так случилось, что в меню "Управление кланом" вдруг надо добавлять опции дополнительные, но вот незадача - раз в стандартных опциях прав для той же старейшины нет, то и "Управление кланом" не открыть..
Что ж, теперь, если модуль подразумевает новую опцию для управления кланом, то можно воспользоваться данным нововведением:
1. Зарегистрироваться у ядра (условно сказать, что Ваш плагин хочет для такой-то роли добавить такую-то опцию для управления кланом). Если все ок, то вернется CR_Success.
2. Дальше уже действуете так, как хотите. Хоть даже пункт-пустышку добавлять можно в меню
0. В плагине-модуле должны быть следующие форварды:
Clans_OnClanControlMenuOpened - собственно форвард, который вызывается, когда открывается окно управления кланом
Clans_ApproveHandle - новый форвард, работает по принципу опроса на то, работает ли еще плагин: каждую карту ядро проверяет тех, кто регистрировался, и выискивает тех, кто самостоятельно забыл сообщить о снятии регистрации. В целом выглядит это так в плагине-модуле, который регистрировался:
C-подобный:
public bool Clans_ApproveHandle(Handle hPlugin)
{
    return GetMyHandle() == hPlugin;
}

1. Нужно вызвать вот такой натив, где нужно указать роль iRole:
native Clan_RegStatus Clans_RegClanControlOption(int iRole);

Доступные на данный момент константы, использовать именно их:
CLIENT_MEMBER 0
CLIENT_ELDER 1
CLIENT_COLEADER 2
CLIENT_LEADER 4

2. Дальше следующие исходы, если вернулось:
CR_Success - все хорошо
CR_AlreadyExists - на эту роль Вы уже заявляли свое желание добавить опцию
CR_NoApprove - забыли в плагине форвард Clans_ApproveHandle
CR_NoMenuOpenedForward - забыли в плагине форвард Clans_OnClanControlMenuOpened

3. Когда решите убрать опцию (ну или в момент, когда Ваш плагин заканчивает свою работу) вызывается следующий натив, где все так же указывается роль, на которую была заявлена доп. опция от Вас:
native bool Clans_RemoveClanControlOption(int iRole);

Ну.. Вроде, все.. Надеюсь :)
  • Мне нравится
Реакции: sniper45301 и Rimmer
Немного изменено обновление баз со старых версий: теперь будет конкретно писаться, какое действие не выполнилось.
Исправлено:
- ошибка в команде принятия приглашения в клан, когда брался ID игрока из базы, а не индекс на сервере
[SM] Exception reported: Array index out-of-bounds (index 171, limit 66)
[SM] Blaming: clans.smx
[SM] Call stack trace:
[SM] [1] Line 124, clans/clientCommands.sp::Command_AcceptClanInvitation
- у кого-то ругалось на запрос при удалении игрока из базы данных, теперь не будет (функция DeleteClientByID, добавлен GROUP BY)
- В одном месте при возникновении ошибки при запросе в базу не удалялись данные (датапак)
- При создании клана (возможно и при вступлении в него) некорректно изменялся айди игрока на сервере (бедному игроку с 1 индексом могло постоянно менять его айди из базы данных кланов). Однако в целом данные не повреждались (без учета того, что игрок с 1 индексом мог набивать стату не себе, а кому-то другому), при перезаходе все становилось нормально
Какой-то невидимка сожрал звездочку из запроса в базу данных, теперь все должно быть ок)
Спасибо asd& [BLR]
Продолжаем улучшать работу с базой данных :)
1. Больше оптимизации:
1.1. Клановое меню: теперь основывается на буфере (думаю, тут можно кинуть помидоры, что раньше с базы тянулась роль, а там уже меню формировалось).
Если у онлайн игрока изменится роль в базе - не страшно, при открытии управления кланом роль обновится сама (но, если его вдруг из участника в лидера превратят, конечно, ничего не обновится, нужно будет перезайти).
1.2. Статистика оффлайн игрока: раньше после отправки одного запроса в базу, отправлялось еще 2 (шок, конечно). Итого 3 запроса, так еще и последние 2 *чтобы не напрягать лишним, просто кошмар был*, теперь все сделал в один :)
1.3. Оптимизирован чат клана (с версии 1.7 был вариант оптимизации, где смотрелось по названию клана из базы, но теперь нынешняя оптимизация позволяет легко вернуть все на нормальные места)
1.4. Прочие мелкие исправления...

2. Исправлена команда invite: раньше проверялось право приглашать не по индексу игрока, а по его айди в базе кланов (сам в шоке как так). Да и в целом оптимизировал команду
3. Исправлена команда jclan: раньше там была печаль-беда, сейчас получше
4. Делаем базу правильнее: теперь айди кланов и игроков имеют тип AUTO INCREMENT (лучше не знать, как было до этого)
5. В переводе поправил пару мест: оставались записи из CSHOP, а в статистике игрока куда-то пропала информация о последнем заходе
6. Полностью выпилена sqlite для основной базы кланов (логи все еще могут быть в sqlite): судя по всему оно и не нужно никому вовсе. Для поддержки возможных модулей натив Clans_IsMySQLDatabase остался, возвращается всегда true
7. Можно писать !cct и не палиться сообщениями в чат :)
8. Сделан натив на обнуление всех кланов:
8.1 Clans_ResetAllClans(bool bResetPlayersInClan = false, bool bCoinsReset = false); // Обнуляет киллы/смерти. Дополнительно можно обнулить монеты и игроков
*сюда же, наверно: в нативе на обнуление одного клана при включенном флаге обнулении игроков на самом деле в базе ничего не обнулялось. Поправил

Если не хотите ставить архивные файлы перевода, то измените в clans_menus.phrases
C-подобный:
    "m_PlayerStats"
    {
        "#format"    "{1:s},{2:i},{3:s},{4:i},{5:s},{6:i},{7:i},{8:.2f},{9:s},{10:s}"
        "en"    "Name: {1} ({2} ID)\nClan: {3} ({4} ID) - {5}\nKills: {6} (K/D {8})\nDeaths: {7}\nTime in clan: {9}\nLast join: {10}"
        "ru"    "Имя: {1} ({2} ID)\nКлан: {3} ({4} ID) - {5}\nУбийств: {6} (K/D {8})\nСмертей: {7}\nВремени в клане: {9}\nПоследний заход: {10}"
    }
  
    "m_ClanStats"
    {
        "#format"    "{1:s},{2:i},{3:s},{4:s},{5:i},{6:i},{7:i},{8:i},{9:.2f},{10:s},{11:i}"
        "en"    "Name: {1} ({2} ID)\nType: {3}\nLeader: {4}\nMembers: {5}/{6}\nKills: {7} (K/D {9})\nDeaths: {8}\nDate of creating: {10}\nClan coins: {11}"
        "ru"    "Название: {1} ({2} ID)\nТип: {3}\nЛидер: {4}\nУчастников: {5}/{6}\nУбийств: {7} (K/D {9})\nСмертей: {8}\nДата создания: {10}\nКлановых монет: {11}"
    }
  • Мне нравится
Реакции: skywalker и RUSSAKOV #
sm_clans_steamauth2 "N" //1 - использовать стим айди вида STEAM_, 0 - использовать стим айди вида U: (до обновления ядра используется именно такой)
ПО УМОЛЧАНИЮ ЗНАЧЕНИЕ РОВНО 1!!!
кто сомневается в работе, можно сделать бекап базы на всякий случай, но, вроде, проблем не обнаружил

Убрал удаленные столбцы, которые случайно упустил. Если стоит 1.86, а не 1.862, то клан не создается (:
  • Мне нравится
Реакции: MoOvik и inklesspen
Сверху Снизу