Ошибка компиляции trial_access

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
106
Реакции
12
Помог
1 раз(а)
Ошибка
//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// trial_access.sma
//
// D:\Cs16\Compilators\amxmodx-1.9.0-git5241\trial_access.sma(541) : error 036: empty statement
//
// 1 Error.
// Could not locate output file D:\Cs16\Compilators\amxmodx-1.9.0-git5241\compiled\trial_access.amx (compile failed).
//
// Compilation Time: 0,95 sec
// ----------------------------------------

Press enter to exit ...
Компилятор
Локальный
Amx Mod X
1.9.0
Исходный код
// При просмотре и редактировании данного файла необходимо использовать кодировку 'UTF-8 без BOM'

/* Требования:
* AMX Mod X версии 1.8.1, либо новее
* Модуль nVault
* colorchat.inc для AMX Mod X до версии 1.8.3-dev [ https://dev-cs.ru/threads/222/page-2#post-12669 ]
*/

/* Рекомендуется:
1) Располагать данный плагин НИЖЕ плагина, выполняющего антифлуд-контроль чата (напр., antiflood.amxx)
2) Для правильного учёта перезагрузки учёток кон. командой рекомедуется располагать данный плагин
ВЫШЕ других плагинов, работающих с командой amx_reloadadmins (т.е. выше вашего админ лоадера)
*/

#define PLUGIN_NAME "Trial Access" // Основано на Vip Manager 2.0 by Javekson
#define PLUGIN_DATE "10.04.18"
#define PLUGIN_AUTHOR "mx?!"

/* ---------------------- НАСТРОЙКИ ---------------------- */

// MaxPlayers + 1
const MAXSIZE = 33

// Какие привилегии выдавать (можно указать несколько, пример: ADMIN_IMMUNITY|ADMIN_RESERVATION|ADMIN_LEVEL_A)
#define VIP_FLAG ADMIN_CHAT|ADMIN_LEVEL_B|ADMIN_MENU

// Режим выдачи привилегий
#define TRIAL_MODE 1 // 0 - по дням, 1 - по минутам

// На сколько дней/минут (см. TRIAL_MODE) выдавать привилегии
#define TRIAL_TIME 3

// 0 и менее - Отключить проверку флагов
// 1 - Блокировать выдачу привилегий игрокам, у которых ОТСУТСТВУЕТ флаг FLAG_TO_CHECK
// 2 и более - Блокировать выдачу привилегий игрокам, у которых ИМЕЕТСЯ флаг FLAG_TO_CHECK
#define CHECK_METHOD 1

/* Флаг для CHECK_METHOD (при значении 0 последнего роли не играет)
При CHECK_METHOD 1:
Пример отсечения всех игроков, получающих флаги от других плагинов:
Обычно игроки без привилегий имеют 'z', а те, кто имеет что-либо, этого флага лишены.
Соотвественно, если у игрока есть привилегии (выдал другой плагин), то здесь мы VIP ему не выдаём
Проверьте квар 'amx_default_access', и если там другой флаг, - задайте его здесь

При CHECK_METHOD 2:
Если у игрока есть указанный флаг то VIP он не получает.
*/
// По аналогии с VIP_FLAG можно указать несколько флагов.
// Если у игрока будет обнаружен любой из них, - сработает допуск/отсечение (в зависимости от значения CHECK_METHOD)
#define FLAG_TO_CHECK ADMIN_USER // ADMIN_USER == 'z', см. 'scripting/include/amxconst.inc'

// Снимать ли с игрока все имеющиеся у него флаги перед выдачей VIP
// Если отключить, то VIP-флаги приплюсуются к уже имеющимся флагам
#define REMOVE_ALL_FLAGS 1 // Меньше 1, - отключить

// Снимать ли с игрока флаг FLAG_TO_REMOVE при выдаче временных привилегий (при REMOVE_ALL_FLAGS > 0 роли не играет)
// Не меняйте значение, если не уверены в том, что это необходимо
#define REMOVE_FLAG 1 // Меньше 1, - отключить

// Флаг для REMOVE_FLAG. Можно указать несколько флагов.
// Не меняйте значение, если не уверены в том, что это необходимо
#define FLAG_TO_REMOVE ADMIN_USER // Снимаем флаг 'z' для правильного учёта прав игрока в других плагинах (is_user_admin(), etc.)

// Способ отслеживания смены ника:
// 0 - amxmodx
// 1 - fakemeta
// 2 - reapi (требует одноимённый модуль)
// 3 - через форвард 'client_admin' админ-лоадера ('admin loader' от neugomon, 'admin load' от fantom)
// Если способ 1 или 2 у вас не работает (не отлавливает смену ника), попробуйте в plugins.ini
// поставить плагин выше других плагинов, отлавливающих смену ника
#define CHECK_NAME_TYPE 2

// Регистрация say-команды в различных вариациях: say, say_team, '/', и '.'
#define EXTENDED_SAYCMD 1 // Меньше 1, - отключить (будет только 'say /...')

// Интервал (в минутах) страховочного сохранения списка
// Пригодится владельцам часто "падающих" серверов, на которых подолгу играется одна и та же карта
// Без особой необходимости использовать не рекомендуется
#define SAVE_INTERVAL 0 // Меньше 1, - отключить

// Записи старше указанного кол-ва месяцев удаляются из хранилища
#define PRUNE_MONTHS 3 // Меньше 1, - отключить (не рекомендуется)

// Имя хранилища (директория хранения: addons/amxmodx/data/vault)
#define VAULT_NAME "trial_vip"

// Задержка в секундах (0.5 = половина сек.) перед проверкой наличия игрока в списке (вход на сервер, смена имени)
// Повысьте значение при конфликте с изменением флагов в других плагинах
#define CHECK_DELAY 0.2 // Менять значение без необходимости не рекомендуется

// Флаг доступа для команды amx_reloadadmins
// Не играет роли при CHECK_NAME_TYPE = 3
#define RELOAD_ADMINS_FLAG ADMIN_CFG // Установите согласно флагу для amx_reloadadmins в 'configs/cmdaccess.ini'

// Задержка повторной выдачи флагов после использования команды amx_reloadadmins
// Не играет роли при CHECK_NAME_TYPE = 3
#define RELOAD_DELAY 5.0 // Увеличьте значение, если ваша база данных долго отвечает на запросы лоадера

/* При активации данной опции:
1) Плагин будет следить за необходимостью своевременного снятия привилегий с тех, кто находится на сервере

2) Перезагрузка учёток (amx_reloadadmins) или смена ника игроком, имеющим действующие временные
права, не позволит ему заново получить их, если на момент перепроверки их действие уже истечёт */
#define FORCE_CHECK 1 // Меньше 1, - отключить

// Режим проверки отыгранного времени:
// 0 и менее - Отключить проверку
// Далее требуется соответствующий плагин:
// 1 - Проверка через взаимодействие с плагином Simple Online Logger
// 2 - Проверка через взаимодействие с плагином CSstatsX SQL by serfreeman1337
// 3 и более - Проверка через взаимодействие с плагином CSstats MySQL by SKAJIbnEJIb
#define RESTRICT_BY_TIME 2

// Сколько минут требуется отыграть для снятия ограничения на получение временных прав
#define RESTRICT_TIME 0 // При RESTRICT_BY_TIME < 1 роли не играет

// Режим игнорирования временного ограничения игроками с лицензионной версией игры
#define STEAM_BYPASS 1 // Меньше 1, - отключить

// Режим игнорирования временного ограничения игроками, имеющими флаг BYPASS_FLAG
#define ACCESS_BYPASS 0 // Меньше 1, - отключить

// Флаг для ACCESS_BYPASS (при значении 0 последнего роли не играет)
#define BYPASS_FLAG ADMIN_BAN // Можно указать несколько флагов (игнор сработает при наличии любого из них)

/* --- НАСТРОЙКИ ЗВУКОВ --- */

// Если вы собираетесь использовать нестандартные звуки, то не забывайте о том,
// что их необходимо помещать в прекеш. Для этого установите USE_PRECACHE 1 и
// раскомментируйте (удалите '//') рядом с необходимым вам звуком в plugin_precache().
// Найти указанную функцию вы можете в самом низу данного файла.
#define USE_PRECACHE 0 // Меньше 1, - отключить

/* Звук, сопровождающий:
1) Ошибку получения привилегий, - когда игрок
уже получал таким образом привилегии, или если он не может их
получить из-за несоответствия требованиям CHECK_METHOD
2) Событие снятия привилегий при FORCE_CHECK > 0 */
new const NOTICE_SOUND[] = "events/friend_died"

// Звук, сопровождающий успешное получение привилегий
new const GET_SOUND[] = "events/tutor_msg"

/* ---------------------- НАСТРОЙКИ ---------------------- */

#include <amxmodx>
#include <nvault>

#if CHECK_NAME_TYPE == 1
#include <fakemeta>
#endif
#if CHECK_NAME_TYPE == 2
#include <reapi>
#endif

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define MAX_NAME_LENGTH 32
#define MAX_PLAYERS 32
#endif

#define chx charsmax

stock const DAYS_IN_MONTH = 30 // Среднее кол-во дней в месяце

// Defines from 'time.inc' as constants
stock const SECONDS_IN_WEEK = 604800
stock const SECONDS_IN_DAY = 86400
stock const SECONDS_IN_HOUR = 3600
stock const SECONDS_IN_MINUTE = 60

const AUTHID_STRLEN = 24

const NAME_LENGTH = MAX_NAME_LENGTH
#define DATE_STRLEN 24 // Размер возращаемого буфера szDate[] для func_FormatTime()

enum { HAS_AUTH, IS_CONNECTED, IN_LIST, HAS_VIP }

new g_iPlayerFlags[MAXSIZE], g_iVault
const TASKID_CHECK = 9678
#define TASKID_SAVE_VAULT 5981
stock const TASKID_REVOKE = 1945

bool:CheckBit(id, iType) return bool:(g_iPlayerFlags[id] & (1 << iType))
SetOneBit(id, iType) (g_iPlayerFlags[id] |= (1 << iType))
stock ClearOneBit(id, iType) (g_iPlayerFlags[id] &= ~(1 << iType))

new stock g_iPrevFlags[MAXSIZE], g_iEndTime[MAXSIZE], g_iRevokeTime, g_iRevokeID

#if RESTRICT_BY_TIME == 1
native sol_get_user_time(id)
#define GET_TIME_NATIVE sol_get_user_time(id)
#endif
#if RESTRICT_BY_TIME == 2
native get_user_gametime(id)
#define GET_TIME_NATIVE get_user_gametime(id)
#endif
#if RESTRICT_BY_TIME > 2
#define GAMETIME 14
native csstats_get_user_value(id, iType)
native csstats_is_user_connected(id)
#define GET_TIME_NATIVE csstats_get_user_value(id, GAMETIME)
#endif

/* -------------------- */

public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_DATE, PLUGIN_AUTHOR)

func_OpenVault()

register_dictionary("trial_access.txt")

#if CHECK_NAME_TYPE != 3
register_concmd("amx_reloadadmins", "func_ReloadAdmins", RELOAD_ADMINS_FLAG)
#endif

#if PRUNE_MONTHS > 0
nvault_prune(g_iVault, 0, get_systime() - (PRUNE_MONTHS * DAYS_IN_MONTH * SECONDS_IN_DAY))
#endif

#if EXTENDED_SAYCMD > 0
register_saycmd("vip", "func_CmdVip")
#else
register_clcmd("say /vip", "func_CmdVip")
#endif

#if CHECK_NAME_TYPE == 1
register_forward(FM_SetClientKeyValue, "fmfwd_SetClientKeyValue_Pre")
#endif
#if CHECK_NAME_TYPE == 2
RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "refwd_SetClientUserName_Pre")
#endif

#if SAVE_INTERVAL > 0
set_task(SAVE_INTERVAL * 60.0, "task_SaveVault", TASKID_SAVE_VAULT)
#endif
}

/* -------------------- */

#if SAVE_INTERVAL > 0
public task_SaveVault()
{
nvault_close(g_iVault)
func_OpenVault()
}
#endif

/* -------------------- */

func_OpenVault()
{
if((g_iVault = nvault_open(VAULT_NAME)) == INVALID_HANDLE)
set_fail_state("Error opening vault!")
}

/* -------------------- */

public func_CmdVip(id)
{
new szAuthID[AUTHID_STRLEN]
get_user_authid(id, szAuthID, chx(szAuthID))

new iEndTime = nvault_get(g_iVault, szAuthID)

if(iEndTime)
{
client_cmd(id, "spk %s", NOTICE_SOUND)

if(iEndTime < get_systime())
{
client_print_color(id, print_team_red, "^1%L", id, "TA_EXPIRED_MSG_1")
client_print_color(id, print_team_red, "^1%L", id, "TA_EXPIRED_MSG_2")
client_print_color(id, print_team_red, "^1%L", id, "TA_EXPIRED_MSG_3")
return PLUGIN_CONTINUE
}
//else ->
client_print_color(id, print_team_default, "^1%L", id, "TA_ALREADY_HAVE_MSG", func_FormatTime(iEndTime))
func_ShowUsage(id)
return PLUGIN_CONTINUE
}

#if CHECK_METHOD > 0
#if CHECK_METHOD == 1
if(~get_user_flags(id) & FLAG_TO_CHECK)
#else
if(get_user_flags(id) & FLAG_TO_CHECK)
#endif
{
client_print_color(id, print_team_red, "^1%L", id, "TA_HAVE_EXTERNAL_MSG")
client_cmd(id, "spk %s", NOTICE_SOUND)
return PLUGIN_CONTINUE
}
#endif

#if RESTRICT_BY_TIME > 0
new iTime = GET_TIME_NATIVE

#if RESTRICT_BY_TIME > 2
if(iTime == INVALID_HANDLE || !csstats_is_user_connected(id))
#else
if(iTime == INVALID_HANDLE)
#endif
{
client_cmd(id, "spk %s", NOTICE_SOUND)
client_print_color(id, print_team_red, "^1%L", id, "TA_NOT_AUTHORIZED")
return PLUGIN_CONTINUE
}

#if STEAM_BYPASS > 0 && ACCESS_BYPASS > 0
if(iTime / SECONDS_IN_MINUTE < RESTRICT_TIME && !is_user_steam(id) && (~get_user_flags(id) & BYPASS_FLAG))
#endif
#if STEAM_BYPASS > 0 && ACCESS_BYPASS < 1
if(iTime / SECONDS_IN_MINUTE < RESTRICT_TIME && !is_user_steam(id))
#endif
#if STEAM_BYPASS < 1 && ACCESS_BYPASS > 0
if(iTime / SECONDS_IN_MINUTE < RESTRICT_TIME && (~get_user_flags(id) & BYPASS_FLAG))
#endif
#if STEAM_BYPASS < 1 && ACCESS_BYPASS < 1
if(iTime / SECONDS_IN_MINUTE < RESTRICT_TIME)
#endif
{
client_cmd(id, "spk %s", NOTICE_SOUND)
client_print_color(id, print_team_red, "^1%L", id, "TA_REST_BY_TIME_1")
client_print_color(id, print_team_red, "^1%L", id, "TA_REST_BY_TIME_2", get_time_length(id, iTime))
client_print_color(id, print_team_red, "^1%L", id, "TA_REST_BY_TIME_3", get_time_length(id, RESTRICT_TIME * SECONDS_IN_MINUTE))
return PLUGIN_CONTINUE
}
#endif // <- #if RESTRICT_BY_TIME > 0

new iSysTime = get_systime()

#if TRIAL_MODE < 1
iEndTime = iSysTime + SECONDS_IN_DAY * TRIAL_TIME
#else
iEndTime = iSysTime + SECONDS_IN_MINUTE * TRIAL_TIME
#endif
new szEndTime[14]
num_to_str(iEndTime, szEndTime, chx(szEndTime))
nvault_set(g_iVault, szAuthID, szEndTime)

#if FORCE_CHECK > 0
func_SetVip(id, get_user_flags(id), iSysTime, iEndTime)
#else
func_SetVip(id)
#endif

client_print_color(id, print_team_default, "^1%L", id, "TA_GET_MSG", func_FormatTime(iEndTime))
func_ShowUsage(id)
client_cmd(id, "spk %s", GET_SOUND)

return PLUGIN_CONTINUE
}

/* -------------------- */

func_ShowUsage(id)
{
client_print_color(id, print_team_blue, "^1%L", id, "TA_USAGE_MSG_1")
client_print_color(id, print_team_blue, "^1%L", id, "TA_USAGE_MSG_2")
}

/* -------------------- */

public task_CheckPlayer(id)
{
id -= TASKID_CHECK

#if CHECK_METHOD > 0 || FORCE_CHECK > 0
new iFlags = get_user_flags(id)
#endif

#if CHECK_METHOD > 0
#if CHECK_METHOD == 1
#define CHECK_FUNCTION ~iFlags
#else
#define CHECK_FUNCTION iFlags
#endif
if(!CheckBit(id, IS_CONNECTED) || (CheckBit(id, IN_LIST) && !CheckBit(id, HAS_VIP)) || (CHECK_FUNCTION & FLAG_TO_CHECK))
#else
if(!CheckBit(id, IS_CONNECTED) || (CheckBit(id, IN_LIST) && !CheckBit(id, HAS_VIP)))
#endif
return

#if FORCE_CHECK < 1
if(CheckBit(id, HAS_VIP))
{
func_SetVip(id)
return
}
#endif

new szAuthID[AUTHID_STRLEN]
get_user_authid(id, szAuthID, chx(szAuthID))

new iEndTime = nvault_get(g_iVault, szAuthID)

if(iEndTime)
{
/* IN_LIST хорошо бы присваивать вне данного условия,
но т.к. я не уверен в правильности логики схемы
"отслеживание смены ников <-> ступень авторизации (HAS_AUTH, IS_CONNECTED)",
то оставляю пока что в таком виде */
SetOneBit(id, IN_LIST);

#if FORCE_CHECK > 0
new iSysTime = get_systime()
if(iEndTime >= iSysTime)
func_SetVip(id, iFlags, iSysTime, iEndTime)
#else
if(iEndTime >= get_systime())
func_SetVip(id)
#endif
}
}

/* -------------------- */

#if CHECK_NAME_TYPE != 3
public client_authorized(id)
!CheckBit(id, IS_CONNECTED) ? SetOneBit(id, HAS_AUTH) : func_SetCheck(id);
#endif

/* -------------------- */

public client_putinserver(id)
#if CHECK_NAME_TYPE != 3
CheckBit(id, HAS_AUTH) ? func_SetCheck(id) : SetOneBit(id, IS_CONNECTED);
#else
SetOneBit(id, IS_CONNECTED);
#endif

/* -------------------- */

func_SetCheck(id)
{
SetOneBit(id, IS_CONNECTED);
set_task(CHECK_DELAY, "task_CheckPlayer", id + TASKID_CHECK)
}

/* -------------------- */

#if AMXX_VERSION_NUM < 183
public client_disconnect(id)
#else
public client_disconnected(id)
#endif
{
#if FORCE_CHECK > 0
if(id == g_iRevokeID && !func_CalcRevoke())
remove_task(TASKID_REVOKE)

// На случай, если я где-то что-то упустил
g_iPrevFlags[id] = 0
g_iEndTime[id] = 0
#endif

g_iPlayerFlags[id] = 0
}

/* -------------------- */

func_FormatTime(iTime)
{
new szDate[DATE_STRLEN]
format_time(szDate, chx(szDate), "%d.%m.%Y - %H:%M", iTime)
return szDate
}

/* -------------------- */

#if FORCE_CHECK > 0
func_SetVip(id, iFlags, iSysTime, iEndTime)
#else
func_SetVip(id)
#endif
{
#if FORCE_CHECK > 0
g_iPrevFlags[id] = iFlags

if((g_iEndTime[id] = iEndTime) < g_iRevokeTime || !g_iRevokeTime)
{
g_iRevokeTime = iEndTime
func_SetRevoke(id, iSysTime)
}
#endif
SetOneBit(id, HAS_VIP);
#if REMOVE_ALL_FLAGS > 0
remove_user_flags(id)
#endif
#if REMOVE_ALL_FLAGS < 1 && REMOVE_FLAG > 0
remove_user_flags(id, FLAG_TO_REMOVE)
#endif
set_user_flags(id, VIP_FLAG)
}

/* -------------------- */

stock func_SetRevoke(id, iSysTime)
{
remove_task(TASKID_REVOKE)
g_iRevokeID = id
set_task(floatmax(0.1, float(g_iRevokeTime - iSysTime) + 1.0), "task_RevokeTrial", TASKID_REVOKE)
}

/* -------------------- */

#if FORCE_CHECK > 0
public task_RevokeTrial()
{
if(CheckBit(g_iRevokeID, IS_CONNECTED))
{
ClearOneBit(g_iRevokeID, HAS_VIP);
remove_user_flags(g_iRevokeID, VIP_FLAG)
set_user_flags(g_iRevokeID, g_iPrevFlags[g_iRevokeID])
client_cmd(g_iRevokeID, "spk %s", NOTICE_SOUND)
client_print_color(g_iRevokeID, print_team_red, "^1%L", g_iRevokeID, "TA_TIME_IS_OVER_1")
client_print_color(g_iRevokeID, print_team_red, "^1%L", g_iRevokeID, "TA_TIME_IS_OVER_2")
}

func_CalcRevoke()
}
#endif

/* -------------------- */

stock bool:func_CalcRevoke()
{
g_iRevokeTime = 0

new iPlayers[MAX_PLAYERS], iPlayerCount, iLastMatchID
get_players(iPlayers, iPlayerCount, "ch")

for(new i, iPlayer; i < iPlayerCount; i++)
{
iPlayer = iPlayers[i]
#if CHECK_METHOD > 0
if( CheckBit(iPlayer, HAS_VIP) && (g_iEndTime[iPlayer] < g_iRevokeTime || !g_iRevokeTime)
&& iPlayer != g_iRevokeID && (get_user_flags(iPlayer) & VIP_FLAG) );
#else
if(CheckBit(iPlayer, HAS_VIP) && (g_iEndTime[iPlayer] < g_iRevokeTime || !g_iRevokeTime) && iPlayer != g_iRevokeID)
#endif
{
iLastMatchID = iPlayer
g_iRevokeTime = g_iEndTime[iPlayer]
}
}

if(!iLastMatchID)
{
g_iRevokeID = g_iRevokeTime = 0
return false
}
//else ->
func_SetRevoke(iLastMatchID, get_systime())
return true
}

/* -------------------- */

#if CHECK_NAME_TYPE != 3
public func_ReloadAdmins(id, iLevel)
{
if(get_user_flags(id) & iLevel)
set_task(RELOAD_DELAY, "task_ReloadAdmins")

return PLUGIN_CONTINUE
}
#endif

/* -------------------- */

#if CHECK_NAME_TYPE != 3
public task_ReloadAdmins()
{
new iPlayers[MAX_PLAYERS], iPlayerCount

get_players(iPlayers, iPlayerCount, "ch")

for(new i; i < iPlayerCount; i++)
{
#if CHECK_METHOD > 0 || FORCE_CHECK > 0
task_CheckPlayer(iPlayers[i] + TASKID_CHECK)
#else
if(CheckBit(iPlayers[i], HAS_VIP))
func_SetVip(iPlayers[i])
#endif
}
}
#endif

/* -------------------- */

#if CHECK_NAME_TYPE < 1 || CHECK_NAME_TYPE > 3
public client_infochanged(id)
{
if(!CheckBit(id, IS_CONNECTED))
return

new szOldName[NAME_LENGTH], szNewName[NAME_LENGTH]
get_user_name(id, szOldName, chx(szOldName))
get_user_info(id, "name", szNewName, chx(szNewName))

if(strcmp(szOldName, szNewName))
func_SetCheck(id)
}
#endif
#if CHECK_NAME_TYPE == 1
public fmfwd_SetClientKeyValue_Pre(id, szInfoBuffer[], szKey[]/*, szValue[]*/)
if(CheckBit(id, IS_CONNECTED) && !strcmp(szKey, "name"))
func_SetCheck(id)
#endif
#if CHECK_NAME_TYPE == 2
public refwd_SetClientUserName_Pre(id/*, szInfoBuffer[], szNewName[]*/)
if(CheckBit(id, IS_CONNECTED))
func_SetCheck(id)
#endif
#if CHECK_NAME_TYPE == 3
public client_admin(id/*,iFlags*/)
func_SetCheck(id)
#endif

/* -------------------- */

stock register_saycmd(szSayCmd[], szFunc[]) // Пакетная регистрация say-команд
{
new const szPrefix[][] = { "say /", "say_team /", "say .", "say_team ." }

for(new i, szTemp[NAME_LENGTH]; i < sizeof(szPrefix); i++)
{
formatex(szTemp, chx(szTemp), "%s%s", szPrefix[i], szSayCmd)
register_clcmd(szTemp, szFunc)
}
}

/* -------------------- */

#if !defined _reapi_reunion_included
stock bool:is_user_steam(id)
{
static dp_pointer

if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
{
server_cmd("dp_clientinfo %d", id)
server_exec()
return bool:(get_pcvar_num(dp_pointer) == 2)
}

return false
}
#endif

/* -------------------- */

#if RESTRICT_BY_TIME > 0
enum _:TIME_TYPES { TYPE_WEEK, TYPE_DAY, TYPE_HOUR, TYPE_MIN, TYPE_SEC }
const TIME_ELEMENT_STRLEN = 12

get_time_length(id, iSec)
{
new iCount, iType[TIME_TYPES], szElement[TIME_TYPES][TIME_ELEMENT_STRLEN], szBuffer[MAX_PLAYERS * 2]

iType[TYPE_WEEK] = iSec / SECONDS_IN_WEEK
iSec -= (iType[TYPE_WEEK] * SECONDS_IN_WEEK)

iType[TYPE_DAY] = iSec / SECONDS_IN_DAY
iSec -= (iType[TYPE_DAY] * SECONDS_IN_DAY)

iType[TYPE_HOUR] = iSec / SECONDS_IN_HOUR
iSec -= (iType[TYPE_HOUR] * SECONDS_IN_HOUR)

iType[TYPE_MIN] = iSec / SECONDS_IN_MINUTE
iType[TYPE_SEC] = iSec -= (iType[TYPE_MIN] * SECONDS_IN_MINUTE)

new const szLang[][] = { "TA_TIME_WEEK", "TA_TIME_DAY", "TA_TIME_HOUR", "TA_TIME_MIN", "TA_TIME_SEC" }

for(new i; i < sizeof(iType); i++)
if(iType[i] > 0)
formatex(szElement[iCount++], chx(szElement[]), "%d %L", iType[i], id, szLang[i])

new const szAndChar[] = "TA_TIME_AND"

switch(iCount)
{
case 0: formatex(szBuffer, chx(szBuffer), "0 %L", id, szLang[TYPE_SEC])
case 1: copy(szBuffer, chx(szBuffer), szElement[0])
case 2: formatex(szBuffer, chx(szBuffer), "%s %L %s", szElement[0], id, szAndChar, szElement[1])
case 3: formatex(szBuffer, chx(szBuffer), "%s, %s, %L %s", szElement[0], szElement[1], id, szAndChar, szElement[2])
case 4: formatex(szBuffer, chx(szBuffer), "%s, %s, %s, %L %s", szElement[0], szElement[1], szElement[2], id, szAndChar, szElement[3])
case 5: formatex(szBuffer, chx(szBuffer), "%s, %s, %s, %s, %L %s", szElement[0], szElement[1], szElement[2], szElement[3], id, szAndChar, szElement[4])
}

return szBuffer
}
#endif

/* -------------------- */

public plugin_end()
nvault_close(g_iVault)

/* -------------------- */

#if USE_PRECACHE > 0
public plugin_precache()
{
//precache_sound(NOTICE_SOUND)
//precache_sound(GET_SOUND)
}
#endif
Не компилируется, в настройках вроде все верно
 
В этой теме было размещено решение! Перейти к решению.
Сообщения
106
Реакции
12
Помог
1 раз(а)
Получилось, спасибо!
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу