- Ошибка
-
include\gamecms5.inc(109) : error 001: expected token: ";", but found "enum"
- Компилятор
- Локальный
- Amx Mod X
- 1.9.0
- Исходный код
-
/**
История изменений:
0.1 (26.07.2022) by b0t.
- Первый релиз;
0.2 (29.10.2022) by b0t.
- fix бага с подгрузкой большого кол-ва моделей;
0.4 (31.10.2022) by b0t.
- fix проверки на флаг доступа к пункту;
- Добавлен префикс к пункту меню если игрок не имеет к нему доступа;
- Мелкие правки кода;
0.5 (24.02.2023) by b0t.
- Сброс шапки при заходе на сервер;
1.0b (20.03.2023) by b0t.
- Поддержка доступа к шапке через услугу от gamecms;
- Поддержка нескольких флагов доступа:
NOTE: Если в доступе к шапке указано "abc", то игрок должен иметь все три флага, чтобы получить
Доступ к шапке;
- Новая настройка отвечающая за то, какой команде будет доступна шапка;
- Удалена настройка префикса, если у игрока нету доступа;
- Небольшая оптимизация кода в структуре подгрузки моделей;
- Добавлены нативы;
- Добавлены форварды;
- Сохранение страницы после выбора шапки;
*/
new const VERSION[] = "1.0b";
#pragma semicolon 1
#include <amxmodx>
#include <fakemeta>
#include <reapi>
#tryinclude <gamecms5>
new const g_szGlobalDir[] = "HatsMenu"; //Имя папки с настройками;
new const g_szSettingsFileName[] = "NewHatsMenu"; //Имя файла с настройками/MultiLang;
const HIDE_HATS_INDEX = 0xA553;
#define var_hats_index var_euser1
#define IsValidTeam(%0,%1) (TeamName:get_member(%0,m_iTeam) == TeamName:%1)
enum {
SECTION_MENU = 0,
MENU_NAME,
MODEL_PATH,
MODEL_SUB,
MODEL_SKIN,
MODEL_ANIMATION,
MODEL_FRAME_RATE,
ITEM_FLAG_ACCESS,
ITEM_TEAM_ACCESS,
NUMBER_OF_CELLS
};
enum _:CVARS_DATA {
CVAR__CMD_OPEN_MENU[128],
CVAR__FLAG_ACCESS_MENU[64],
CVAR__ABILITY_HIDE_HATS,
CVAR__HIDE_HATS_CMD[128],
CVAR__REMOVE_HATS_POST_DEATH,
CVAR__PRINT_CHAT_NEW_HATS
};
enum _:ARRAY_DATA {
ARRAY__SECTION_MENU[128],
ARRAY__MENU_NAME[128],
ARRAY__MODEL_PATH[256],
ARRAY__MODEL_SUB,
ARRAY__MODEL_SKIN,
ARRAY__MODEL_ANIMATION,
Float:ARRAY__MODEL_FRAME_RATE,
ARRAY__ITEM_FLAG_ACCESS[256],
ARRAY__ITEM_TEAM_ACCESS
};
enum _:ForwardsStruct {
FWD__SET_HAT,
FWD__REMOVE_HAT
};
new
gCvars[CVARS_DATA],
Array:g_ArrayData,
Array:g_szArray__MenuIndex;
new
g_pCvarAbilityHideHats,
g_pCvarRemoveHatsPostDeath,
fwd_AddToFullPack,
g_fwd_APIForwards[ForwardsStruct],
HookChain:CBasePlayer_Killed;
new
p_iEntID[33],
bool:p_bToggleHats[33],
p_iHatsUse[33];
public plugin_precache() {
Func__CreateCvars();
Func__CreateFiles();
Func__CreateMultiLangFile();
}
public plugin_init() {
register_plugin("New Hats Menu",VERSION,"b0t.");
UTIL__RegisterClCmd(gCvars[CVAR__HIDE_HATS_CMD],"Func__ToggleHideHats");
UTIL__RegisterClCmd(gCvars[CVAR__CMD_OPEN_MENU],"Func__ShowMainHatsMenu_Pre");
if(gCvars[CVAR__ABILITY_HIDE_HATS])
fwd_AddToFullPack = register_forward(FM_AddToFullPack,"FM_AddToFullPack_Post",true);
hook_cvar_change(g_pCvarAbilityHideHats,"Func__HookCvarChange_AbilityHideHats");
hook_cvar_change(g_pCvarRemoveHatsPostDeath,"Func__HookCvarChange_RemoveHatsPostDeath");
if(gCvars[CVAR__REMOVE_HATS_POST_DEATH])
CBasePlayer_Killed = RegisterHookChain(RG_CBasePlayer_Killed,"CBasePlayer_Killed_Post", .post = true);
RegisterHookChain(RG_CBasePlayer_Spawn,"CBasePlayer_Spawn_Post", .post = true);
register_dictionary(fmt("%s.txt",g_szSettingsFileName));
CreateForwardsAPI();
}
public Func__ToggleHideHats(const id) {
p_bToggleHats[id] ^= true;
return PLUGIN_HANDLED;
}
public Func__ShowMainHatsMenu_Pre(const id) {
Func__ShowMainHatsMenu_Post(id,0);
return PLUGIN_HANDLED;
}
public Func__ShowMainHatsMenu_Post(const id,const iPages) {
if(gCvars[CVAR__FLAG_ACCESS_MENU][0]) {
if(~get_user_flags(id) & read_flags(gCvars[CVAR__FLAG_ACCESS_MENU])) {
client_print_color(id,print_team_default,"%L",LANG_SERVER,"NHM_CHAT_DONT_ACCESS");
return PLUGIN_HANDLED;
}
}
ArrayClear(g_szArray__MenuIndex);
new iMenu = menu_create(fmt("%L\R\d",LANG_SERVER,"NHM_MAIN_MENU_NAME"),"ShowMainHatsMenu_Post__Handler");
new iMenuCallback = menu_makecallback("ShowMainHatsMenu__Callback");
menu_additem(iMenu,fmt("%L%L",LANG_SERVER,!is_nullent(p_iEntID[id]) ? "NHM_COLOR_HATS_YES" : "NHM_COLOR_HATS_NO",LANG_SERVER,"NHM_ITEM_REMOVE_HATS"),"remove_hats");
new szSection[256];
for(new iItem,aData[ARRAY_DATA];iItem<ArraySize(g_ArrayData);iItem++) {
ArrayGetArray(g_ArrayData,iItem,aData);
if((ArrayFindString(g_szArray__MenuIndex,aData[ARRAY__SECTION_MENU])) != -1)
continue;
if(!aData[ARRAY__SECTION_MENU][0])
menu_additem(iMenu,aData[ARRAY__MENU_NAME],fmt("_%i",iItem), .callback = iMenuCallback);
else {
ArrayPushString(g_szArray__MenuIndex,aData[ARRAY__SECTION_MENU]);
copy(szSection,charsmax(szSection),aData[ARRAY__SECTION_MENU]);
replace_all(aData[ARRAY__SECTION_MENU],charsmax(aData[ARRAY__SECTION_MENU]),"!n","^n");
menu_additem(iMenu,aData[ARRAY__SECTION_MENU],szSection);
}
}
new iItem = menu_items(iMenu);
if(!iItem) {
client_print_color(id,print_team_default,"%L",LANG_SERVER,"NHM_CHAT_EMPTY_MENU");
menu_destroy(iMenu);
return PLUGIN_HANDLED;
}
if(iItem == 8)
menu_addblank2(iMenu);
if(iItem >= 8 && iItem <= 9) {
menu_setprop(iMenu,MPROP_EXIT,MEXIT_FORCE);
menu_setprop(iMenu,MPROP_PERPAGE,0);
}
UTIL__RegisterMenu(id,iMenu, .szExitName = "Выход", .szNumberColor = "\y", .iPage = iPages);
return PLUGIN_HANDLED;
}
public ShowMainHatsMenu__Callback(const id,const iMenu,const iItem) {
new szItemName[256],szData[128];
menu_item_getinfo(iMenu,iItem, .info = szData, .infolen = charsmax(szData), .name = szItemName, .namelen = charsmax(szItemName));
replace_all(szData,charsmax(szData),"_","");
new iKey = str_to_num(szData);
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,iKey,aData);
UTIL__ReplaceSimbols(szItemName,charsmax(szItemName),true);
new bool:bDescent;
if(contain(szItemName,"^n") != -1) {
replace_all(szItemName,charsmax(szItemName),"^n","");
bDescent = true;
}
if(p_iHatsUse[id] == iKey) {
menu_item_setname(iMenu,iItem,fmt("%s %L%s",szItemName,LANG_SERVER,"NHM_HATS_USE",bDescent ? "^n" : ""));
return ITEM_DISABLED;
}
if(!IsValidTeam(id,aData[ARRAY__ITEM_TEAM_ACCESS]) && aData[ARRAY__ITEM_TEAM_ACCESS]) {
menu_item_setname(iMenu,iItem,
fmt(
"%s %L%s",
szItemName,
LANG_SERVER,get_member(id,m_iTeam) == TEAM_CT ? "NHM_ITEM_ONLY_TE" : "NHM_ITEM_ONLY_CT",
bDescent ? "^n" : ""
)
);
return ITEM_DISABLED;
}
if(!aData[ARRAY__ITEM_FLAG_ACCESS][0])
return ITEM_ENABLED;
if(contain(aData[ARRAY__ITEM_FLAG_ACCESS],"_gamecms_hat_") != -1) {
new bool:bActive,szReason[256];
bActive = cmsapi_is_admin_active(id,szReason,charsmax(szReason),aData[ARRAY__ITEM_FLAG_ACCESS]);
if(!bActive) {
menu_item_setname(iMenu,iItem,szItemName);
return ITEM_DISABLED;
}
}
else {
new iBitFlags = get_user_flags(id);
if(!(iBitFlags & read_flags(aData[ARRAY__ITEM_FLAG_ACCESS]) == read_flags(aData[ARRAY__ITEM_FLAG_ACCESS]))) {
menu_item_setname(iMenu,iItem,szItemName);
return ITEM_DISABLED;
}
}
return ITEM_ENABLED;
}
public ShowMainHatsMenu_Post__Handler(const id,const iMenu,const iItem) {
if(iItem == MENU_EXIT) {
menu_destroy(iMenu);
return PLUGIN_HANDLED;
}
new iNewMenu = iMenu;
new iPage;
player_menu_info(id,iNewMenu,iNewMenu,iPage);
new szData[256];
menu_item_getinfo(iMenu,iItem, .info = szData, .infolen = charsmax(szData));
menu_destroy(iMenu);
if(equal(szData,"remove_hats")) {
Func__RemoveHats(id);
return Func__ShowMainHatsMenu_Post(id,iPage);
}
if(contain(szData,"_") != -1) {
replace_all(szData,charsmax(szData),"_","");
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,str_to_num(szData),aData);
Func__CreateHats(id,str_to_num(szData));
Func__ShowMainHatsMenu_Post(id,iPage);
if(gCvars[CVAR__PRINT_CHAT_NEW_HATS]) {
UTIL__ReplaceSimbols(aData[ARRAY__MENU_NAME],charsmax(aData),true);
client_print_color(id,print_team_default,"%L",LANG_SERVER,"NHM_CHAT_PUT_HAT",aData[ARRAY__MENU_NAME]);
}
}
else
Func__ShowSecondaryHatsMenu(id,szData,0);
return PLUGIN_HANDLED;
}
public Func__ShowSecondaryHatsMenu(const id,const szName[],const iPages) {
new szMenu[256];
copy(szMenu,charsmax(szMenu),szName);
replace_all(szMenu,charsmax(szMenu),"!n","");
new iMenu = menu_create(szMenu,"ShowSecondaryHatsMenu__Handler");
new iMenuCallback = menu_makecallback("ShowSecondaryHatsMenu__Callback");
for(new iItem,aData[ARRAY_DATA];iItem<ArraySize(g_ArrayData);iItem++) {
ArrayGetArray(g_ArrayData,iItem,aData);
if(contain(aData[ARRAY__SECTION_MENU],"_") != -1)
continue;
if(!equal(aData[ARRAY__SECTION_MENU],szName))
continue;
menu_additem(iMenu,fmt("%s",aData[ARRAY__MENU_NAME]),fmt("%i|%s",iItem,szName), .callback = iMenuCallback);
}
new iItem = menu_items(iMenu);
if(iItem == 8)
menu_addblank2(iMenu);
if(iItem >= 8 && iItem <= 9) {
menu_setprop(iMenu,MPROP_EXIT,MEXIT_FORCE);
menu_setprop(iMenu,MPROP_PERPAGE,0);
}
UTIL__RegisterMenu(id,iMenu, .szExitName = "В меню", .szNumberColor = "\y", .iPage = iPages);
return PLUGIN_HANDLED;
}
public ShowSecondaryHatsMenu__Callback(const id,const iMenu,const iItem) {
new szItemName[256],szData[128];
menu_item_getinfo(iMenu,iItem, .info = szData, .infolen = charsmax(szData), .name = szItemName, .namelen = charsmax(szItemName));
new szItem[64],szName[2];
strtok(szData,szItem,charsmax(szItem),szName,charsmax(szName),'|');
trim(szItem);
trim(szName);
new iKey = str_to_num(szItem);
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,iKey,aData);
UTIL__ReplaceSimbols(szItemName,charsmax(szItemName),true);
new bool:bDescent;
if(contain(szItemName,"^n") != -1) {
replace_all(szItemName,charsmax(szItemName),"^n","");
bDescent = true;
}
if(p_iHatsUse[id] == iKey) {
menu_item_setname(iMenu,iItem,fmt("%s %L%s",szItemName,LANG_SERVER,"NHM_HATS_USE",bDescent ? "^n" : ""));
return ITEM_DISABLED;
}
if(!IsValidTeam(id,aData[ARRAY__ITEM_TEAM_ACCESS]) && aData[ARRAY__ITEM_TEAM_ACCESS]) {
menu_item_setname(iMenu,iItem,
fmt(
"%s %L%s",
szItemName,
LANG_SERVER,get_member(id,m_iTeam) == TEAM_CT ? "NHM_ITEM_ONLY_TE" : "NHM_ITEM_ONLY_CT",
bDescent ? "^n" : ""
)
);
return ITEM_DISABLED;
}
if(!aData[ARRAY__ITEM_FLAG_ACCESS][0])
return ITEM_ENABLED;
if(contain(aData[ARRAY__ITEM_FLAG_ACCESS],"_gamecms_hat_") != -1) {
new bool:bActive,szReason[256];
bActive = cmsapi_is_admin_active(id,szReason,charsmax(szReason),aData[ARRAY__ITEM_FLAG_ACCESS]);
if(!bActive) {
menu_item_setname(iMenu,iItem,szItemName);
return ITEM_DISABLED;
}
}
else {
new iBitFlags = get_user_flags(id);
if(!(iBitFlags & read_flags(aData[ARRAY__ITEM_FLAG_ACCESS]) == read_flags(aData[ARRAY__ITEM_FLAG_ACCESS]))) {
menu_item_setname(iMenu,iItem,szItemName);
return ITEM_DISABLED;
}
}
return ITEM_ENABLED;
}
public ShowSecondaryHatsMenu__Handler(const id,const iMenu,const iItem) {
if(iItem == MENU_EXIT) {
menu_destroy(iMenu);
return Func__ShowMainHatsMenu_Pre(id);
}
new iMenuNew = iMenu;
new iPage;
player_menu_info(id,iMenuNew,iMenuNew,iPage);
new szData[64];
menu_item_getinfo(iMenu,iItem, .info = szData, .infolen = charsmax(szData));
menu_destroy(iMenu);
new szItem[64],szName[256];
strtok(szData,szItem,charsmax(szItem),szName,charsmax(szName),'|');
trim(szItem);
trim(szName);
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,str_to_num(szItem),aData);
Func__CreateHats(id,str_to_num(szItem));
Func__ShowSecondaryHatsMenu(id,szName,iPage);
if(gCvars[CVAR__PRINT_CHAT_NEW_HATS]) {
UTIL__ReplaceSimbols(aData[ARRAY__MENU_NAME],charsmax(aData),true);
client_print_color(id,print_team_default,"%L",LANG_SERVER,"NHM_CHAT_PUT_HAT",aData[ARRAY__MENU_NAME]);
}
return PLUGIN_HANDLED;
}
public FM_AddToFullPack_Post(iEs,iE,iEnt,pHost,BitHostFlags,Player,pSet) {
if(!is_user_connected(pHost))
return FMRES_IGNORED;
if(p_bToggleHats[pHost] && get_entvar(iEnt,var_hats_index) == HIDE_HATS_INDEX)
set_es(iEs,ES_Effects,EF_NODRAW);
return FMRES_IGNORED;
}
public CBasePlayer_Killed_Post(const pVictim,const pAttacker) {
if(!is_nullent(p_iEntID[pVictim]))
Func__RemoveHats(pVictim);
}
public CBasePlayer_Spawn_Post(const id) {
if(!is_nullent(p_iEntID[id])) {
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,p_iHatsUse[id],aData);
if(aData[ARRAY__ITEM_TEAM_ACCESS] && !IsValidTeam(id,aData[ARRAY__ITEM_TEAM_ACCESS])) {
Func__RemoveHats(id);
client_print_color(id,print_team_default,"%L",LANG_SERVER,"NHM_CHAT_UNAVAILABLE_FOR_THE_TEAM");
}
}
}
public Func__HookCvarChange_AbilityHideHats(pCvar,const szOldValue[],const szNewValue[]) {
new iNewValue = str_to_num(szNewValue);
new iOldValue = str_to_num(szOldValue);
if(iNewValue != iOldValue) {
switch(iNewValue) {
case 1: fwd_AddToFullPack = register_forward(FM_AddToFullPack,"FM_AddToFullPack_Post",true);
case 0: {
unregister_forward(FM_AddToFullPack,fwd_AddToFullPack,true);
arrayset(p_bToggleHats,0,sizeof(p_bToggleHats));
}
}
}
}
public Func__HookCvarChange_RemoveHatsPostDeath(pCvar,const szOldValue[],const szNewValue[]) {
new iNewValue = str_to_num(szNewValue);
new iOldValue = str_to_num(szOldValue);
if(iNewValue != iOldValue) {
switch(iNewValue) {
case 1: EnableHookChain(CBasePlayer_Killed);
case 0: DisableHookChain(CBasePlayer_Killed);
}
}
}
public client_putinserver(id) {
Func__RemoveHats(id);
}
public client_disconnected(id) {
Func__RemoveHats(id);
}
public Func__CreateHats(const id,const iItem) {
new aData[ARRAY_DATA];
ArrayGetArray(g_ArrayData,iItem,aData);
new iRet;
ExecuteForward(g_fwd_APIForwards[FWD__SET_HAT],iRet,id,aData[ARRAY__MENU_NAME]);
if(iRet == PLUGIN_HANDLED)
return;
Func__RemoveHats(id);
new iEnt = rg_create_entity("info_target");
if(is_nullent(iEnt))
return;
engfunc(EngFunc_SetModel,iEnt,fmt("models/%s",aData[ARRAY__MODEL_PATH]));
set_entvar(iEnt,var_movetype,MOVETYPE_FOLLOW);
set_entvar(iEnt,var_aiment,id);
set_entvar(iEnt,var_body,aData[ARRAY__MODEL_SUB]);
set_entvar(iEnt,var_skin,aData[ARRAY__MODEL_SKIN]);
set_entvar(iEnt,var_sequence,aData[ARRAY__MODEL_ANIMATION]);
set_entvar(iEnt,var_framerate,aData[ARRAY__MODEL_FRAME_RATE]);
set_entvar(iEnt,var_hats_index,HIDE_HATS_INDEX);
p_iEntID[id] = iEnt;
p_iHatsUse[id] = iItem;
}
public Func__RemoveHats(const id) {
if(!is_nullent(p_iEntID[id]))
set_entvar(p_iEntID[id],var_flags,FL_KILLME);
p_iEntID[id] = p_iHatsUse[id] = -1;
new iRet;
ExecuteForward(g_fwd_APIForwards[FWD__REMOVE_HAT],iRet,id);
}
public Func__CreateFiles() {
new szData[256];
formatex(szData,charsmax(szData),"addons/amxmodx/configs/plugins/%s",g_szGlobalDir);
if(!dir_exists(szData))
mkdir(szData);
add(szData,charsmax(szData),fmt("/%s.ini",g_szSettingsFileName));
if(!file_exists(szData))
write_file(szData,
"; Название секции где будет пункт | Имя в меню | Путь до модели | SubModel(Если есть) | Skin(Если есть) | Номер анимации(если есть) | Скорость анимации | Флаг доступа к пункту | Команда^n\
; *Путь до модели указывать без корневой папки 'models'^n\
; *Если пункт необходимо добавить в основное меню, в имени секции указать '_'(Оставить пустой)^n\
; *Если отсутствует SubModel/Skin/Анимация, указать 0(Оставить пустым)^n\
; *Если пункт будет доступен всем указать '_'(Оставить пустой)^n\
; *Для выдачи доступа через услугу от GameCMS использовать префикс '_gamecms_hat_*'^n\
; К примеру создаём услугу: '_gamecms_hat_angel'. Название этой услуги вписываем в пункт 'Флаг доступа'^n\
; *Команда: какая команда имеет доступ к шапке:^n\
; 0 - Все^n\
; 1 - ТЕ^n\
; 2 - КТ^n\
;^n\
; Спустить строку - !n"
);
new f = fopen(szData,"r");
new aData[ARRAY_DATA];
static szFileData[NUMBER_OF_CELLS][1024];
g_szArray__MenuIndex = ArrayCreate(256);
g_ArrayData = ArrayCreate(ARRAY_DATA);
new iLine;
while(!feof(f)) {
fgets(f,szData,charsmax(szData));
trim(szData);
iLine++;
if(szData[0] == ';' || szData[0] == EOS)
continue;
if(explode_string(szData,"|",szFileData,sizeof(szFileData),charsmax(szFileData[])) == NUMBER_OF_CELLS) {
remove_quotes_and_trim(szFileData[SECTION_MENU]);
remove_quotes_and_trim(szFileData[MENU_NAME]);
remove_quotes_and_trim(szFileData[MODEL_PATH]);
remove_quotes_and_trim(szFileData[MODEL_SUB]);
remove_quotes_and_trim(szFileData[MODEL_SKIN]);
remove_quotes_and_trim(szFileData[MODEL_ANIMATION]);
remove_quotes_and_trim(szFileData[MODEL_FRAME_RATE]);
remove_quotes_and_trim(szFileData[ITEM_FLAG_ACCESS]);
remove_quotes_and_trim(szFileData[ITEM_TEAM_ACCESS]);
copy(aData[ARRAY__SECTION_MENU],charsmax(aData[ARRAY__SECTION_MENU]),szFileData[SECTION_MENU]);
replace_all(aData[ARRAY__SECTION_MENU],charsmax(aData[ARRAY__SECTION_MENU]),"_","");
copy(aData[ARRAY__MENU_NAME],charsmax(aData[ARRAY__MENU_NAME]),szFileData[MENU_NAME]);
replace_all(aData[ARRAY__MENU_NAME],charsmax(aData[ARRAY__MENU_NAME]),"!n","^n");
copy(aData[ARRAY__MODEL_PATH],charsmax(aData[ARRAY__MODEL_PATH]),szFileData[MODEL_PATH]);
copy(aData[ARRAY__ITEM_FLAG_ACCESS],charsmax(aData[ARRAY__ITEM_FLAG_ACCESS]),szFileData[ITEM_FLAG_ACCESS]);
if(equal(aData[ARRAY__ITEM_FLAG_ACCESS],"_"))
replace_all(aData[ARRAY__ITEM_FLAG_ACCESS],charsmax(aData[ARRAY__ITEM_FLAG_ACCESS]),"_","");
aData[ARRAY__MODEL_SUB] = str_to_num(szFileData[MODEL_SUB]);
aData[ARRAY__MODEL_SKIN] = str_to_num(szFileData[MODEL_SKIN]);
aData[ARRAY__MODEL_ANIMATION] = str_to_num(szFileData[MODEL_ANIMATION]);
aData[ARRAY__MODEL_FRAME_RATE] = str_to_float(szFileData[MODEL_FRAME_RATE]);
aData[ARRAY__ITEM_TEAM_ACCESS] = str_to_num(szFileData[ITEM_TEAM_ACCESS]);
if(!file_exists(fmt("models/%s",aData[ARRAY__MODEL_PATH]))) {
server_print("[HATS MENU] Модель не найдена! Пункт удалён! [models/%s]",aData[ARRAY__MODEL_PATH]);
continue;
}
precache_model(fmt("models/%s",szFileData[MODEL_PATH]));
ArrayPushArray(g_ArrayData,aData);
}
else {
server_print("[HATS MENU] Файл [NewHatsMenu.ini] заполнен не верно! Строка: %i",iLine);
pause("a");
break;
}
continue;
}
fclose(f);
}
public Func__CreateCvars() {
bind_pcvar_string(
create_cvar(
.name = "nhm_cmd_open_menu",
.string = "hats",
.description = "Команда для открытия меню(все чаты + консоль)"
),
gCvars[CVAR__CMD_OPEN_MENU],charsmax(gCvars)
);
bind_pcvar_string(
create_cvar(
.name = "nhm_flag_access_menu",
.string = "",
.description = "Флаг доступа к меню^nОставить пустым если доступно всем"
),
gCvars[CVAR__FLAG_ACCESS_MENU],charsmax(gCvars)
);
bind_pcvar_num(
g_pCvarAbilityHideHats = create_cvar(
.name = "nhm_ability_hide_hats",
.string = "1",
.description = "Возможность скрывать шапки^nВНИМАНИЕ: возможность использует FullPack"
),
gCvars[CVAR__ABILITY_HIDE_HATS]
);
bind_pcvar_string(
create_cvar(
.name = "nhm_hide_hats_cmd",
.string = "toggle_hats",
.description = "Команда для отключения/включения отображения шляп^nВсе чаты + консоль"
),
gCvars[CVAR__HIDE_HATS_CMD],charsmax(gCvars)
);
bind_pcvar_num(
g_pCvarRemoveHatsPostDeath = create_cvar(
.name = "nhm_remove_hats_post_death",
.string = "0",
.description = "Снимать шляпу с игрока после смерти"
),
gCvars[CVAR__REMOVE_HATS_POST_DEATH]
);
bind_pcvar_num(
create_cvar(
.name = "nhm_print_chat_new_hats",
.string = "1",
.description = "Выводить ли игроку в чат информацию о надетой шапке"
),
gCvars[CVAR__PRINT_CHAT_NEW_HATS]
);
AutoExecConfig(.name = g_szSettingsFileName, .folder = g_szGlobalDir);
}
public Func__CreateMultiLangFile() {
new szData[256];
formatex(szData,charsmax(szData),"addons/amxmodx/data/lang/%s.txt",g_szSettingsFileName);
if(file_exists(szData))
return;
write_file(szData,
"[ru]^n^n\
NHM_MAIN_MENU_NAME = Меню шапок^n^n\
NHM_COLOR_HATS_YES = \r^n\
NHM_COLOR_HATS_NO = \d^n\
NHM_ITEM_REMOVE_HATS = Снять шапку^^n^n^n\
NHM_HATS_USE = \r[\dИспользуется\r]^n^n\
NHM_CHAT_DONT_ACCESS = ^^3[^^4HATS^^3] ^^1У вас нет доступа^^4!^n\
NHM_CHAT_EMPTY_MENU = ^^3[^^4HATS^^3] ^^1Увы, в меню пусто^^4!^n\
NHM_CHAT_PUT_HAT = ^^3[^^4HATS^^3] ^^1Вы надели ^^4%s^n\
NHM_CHAT_UNAVAILABLE_FOR_THE_TEAM = ^^3[^^4HATS^^3] ^^1Выбранная вами шапка недоступна для вашей команды^^4!^n^n\
NHM_ITEM_ONLY_CT = \r[\dТолько \yКТ\r]^n\
NHM_ITEM_ONLY_TE = \r[\dТолько \yTE\r]"
);
}
public CreateForwardsAPI() {
g_fwd_APIForwards[FWD__SET_HAT] = CreateMultiForward("NHM_SetUserHat",ET_STOP,FP_CELL,FP_STRING);
g_fwd_APIForwards[FWD__REMOVE_HAT] = CreateMultiForward("NHM_RemoveUserHat",ET_CONTINUE,FP_CELL);
}
public plugin_natives() {
set_native_filter("Func__NativeFilter");
register_native("nhm_get_user_hats","native_nhm_get_user_hats");
register_native("nhm_remove_user_hats","native_nhm_remove_user_hats");
register_native("nhm_get_user_show_hats","native_nhm_get_user_show_hats");
register_native("nhm_set_user_show_hats","native_nhm_set_user_show_hats");
register_native("nhm_get_hat_by_name","native_nhm_get_hat_by_name");
register_native("nhm_set_hat_by_key","native_nhm_set_hat_by_key");
}
public Func__NativeFilter() {
return PLUGIN_HANDLED;
}
public bool:native_nhm_get_user_hats() {
return bool:(!is_nullent(p_iEntID[get_param(1)]));
}
public native_nhm_remove_user_hats() {
Func__RemoveHats(get_param(1));
}
public bool:native_nhm_get_user_show_hats() {
return bool:(p_bToggleHats[get_param(1)]);
}
public native_nhm_set_user_show_hats() {
p_bToggleHats[get_param(1)] = bool:get_param(2);
}
public native_nhm_get_hat_by_name() {
new szHatName[256];
get_string(1,szHatName,charsmax(szHatName));
for(new i,aData[ARRAY_DATA];i<ArraySize(g_ArrayData);i++) {
ArrayGetArray(g_ArrayData,i,aData);
if(equal(aData[ARRAY__MENU_NAME],szHatName))
return i;
}
return -1;
}
public native_nhm_set_hat_by_key() {
new id = get_param(1);
new iKey = get_param(2);
if(iKey < ArraySize(g_ArrayData))
Func__CreateHats(id,iKey);
}
stock remove_quotes_and_trim(szData[]) {
remove_quotes(szData);
trim(szData);
}
/**
* Удалит ключи цветов из строки
*
* @param szMessage Массив с сообщением
* @param iMaxLen Максимальный размер массива
* @param bMenu true -- Удалять цвета из меню | false -- из чата
*
* @return -
*/
stock UTIL__ReplaceSimbols(szMessage[],const iMaxLen,const bool:bMenu = true) {
switch(bMenu) {
case true: {
replace_all(szMessage,iMaxLen,"\r","");
replace_all(szMessage,iMaxLen,"\y","");
replace_all(szMessage,iMaxLen,"\d","");
replace_all(szMessage,iMaxLen,"\w","");
}
case false: {
replace_all(szMessage,iMaxLen,"^4","");
replace_all(szMessage,iMaxLen,"^2","");
replace_all(szMessage,iMaxLen,"^1","");
}
}
}
/**
* Зарегистрирует команду во всех чатах + консоль
*
* @param szCmd Команда
* @param szFunc Функция обработчик
*
* @return -
*/
stock UTIL__RegisterClCmd(const szCmd[],const szFunc[]) {
register_clcmd(fmt("%s",szCmd),szFunc);
register_clcmd(fmt("say /%s",szCmd),szFunc);
register_clcmd(fmt("say_team /%s",szCmd),szFunc);
}
/**
* Отображает меню игроку
* @NOTE: Если игрока нет на сервере -- уничтожит меню для избежания утечек памяти
*
* @param pPlayer Игрок
* @param iMenu Меню
* @param szNextName Оформление кнопки "Далее"
* @param szBackName Оформление кнопки "Назад"
* @param szExitName Оформление кнопки "Выход"
* @param szNumberColor Цвет номеров (1,2,3...)
* @param iPage С какой страницы открыть меню
*
* @return -
*/
stock UTIL__RegisterMenu(const pPlayer,
const iMenu,
const szNextName[] = "Далее",
const szBackName[] = "Назад",
const szExitName[] = "Выход",
const szNumberColor[] = "\y",
const iPage = 0) {
if(menu_items(iMenu) <= 0 || !is_user_connected(pPlayer))
menu_destroy(iMenu);
else {
menu_setprop(iMenu,MPROP_NEXTNAME,szNextName);
menu_setprop(iMenu,MPROP_BACKNAME,szBackName);
menu_setprop(iMenu,MPROP_EXITNAME,szExitName);
menu_setprop(iMenu,MPROP_NUMBER_COLOR,szNumberColor);
menu_display(pPlayer,iMenu,iPage);
}
}
Здравствуйте, подскажите пожалуйста что делать с ошибкой при компиляции плагина?
include\gamecms5.inc(109) : error 001: expected token: ";", but found "enum"
//
// 1 Error.
// Could not locate output file compiled\NewHatsMenu.amx (compile failed).
//
// Compilation Time: 0,39 sec
// ----------------------------------------
Press enter to exit ...
include\gamecms5.inc(109) : error 001: expected token: ";", but found "enum"
//
// 1 Error.
// Could not locate output file compiled\NewHatsMenu.amx (compile failed).
//
// Compilation Time: 0,39 sec
// ----------------------------------------
Press enter to exit ...
В этой теме было размещено решение! Перейти к решению.
Download all Attachments
-
29.4 KB Просмотры: 31
-
31.5 KB Просмотры: 39