case KEY_FUNCTION:{
if(itemData[IB_PLUGIN_ID] == -1){ // плагин не найден
log_amx("[ERROR] plugin not found on line %d",line)
itemData[IB_TYPE] = -1
itemType = -1
}else{
itemData[IB_FUNCTION_ID] = get_func_id(value,itemData[IB_PLUGIN_ID])
if(itemData[IB_FUNCTION_ID] == -1){ // проверка на валидность функции
log_amx("[ERROR] can't find function ^"%s^" on line %d",value,line)
itemData[IB_TYPE] = -1
itemType = -1
}
}
}
// кол-во очков для этого бонуса в меню
case KEY_POINTS: itemData[IB_POINTS] = str_to_num(value)
// сумирование шанса за все уровни
case KEY_SUMLEVELS: itemData[IB_SUMCHANCE] = str_to_num(value) ? false : true
//
// Меню
//
// название меню
case KEY_MENU_TITLE: copy(menuData[MENU_TITLE],charsmax(menuData[MENU_TITLE]),value)
// команда в чат для вызова меню
case KEY_MENU_SAY: copy(menuData[MENU_SAYCMD],charsmax(menuData[MENU_SAYCMD]),value)
// команда в консоли для вызова этого меню
case KEY_MENU_CONSOLE: copy(menuData[MENU_CONCMD],charsmax(menuData[MENU_CONCMD]),value)
// список предметов в меню
case KEY_MENU_ITEMS: menuData[MENU_LIST] = _:parse_levels(value)
case KEY_EXP: itemData[IB_EXP] = _:str_to_float(value)
case KEY_LEVEL: itemData[IB_LEVEL] = str_to_num(value)
case KEY_ROUND: itemData[IB_ROUND] = str_to_num(value)
case KEY_TIME: itemData[IB_TIME] = _:str_to_float(value)
case KEY_FLAGS: copy(itemData[IB_FLAGS], charsmax(itemData[IB_FLAGS]), value);
case KEY_DAYS: itemData[IB_DAYS] = str_to_num(value);
}
}
switch(cfgBlock){ // разбираем последний предмет, если есть
case BONUS_ITEM_SPAWN,BONUS_ITEM_MENU:
if(RegisterBonusItem(itemData,cfgBlock,line))
arrayset(itemData,0,itemFieldsStruct)
case BONUS_MENUS: {
if(RegisterMenuItem(menuData,line) >= 0)
arrayset(menuData,0,menuFieldsStruct)
}
}
TrieDestroy(keyMap)
// бонусы на спавне
if(g_SpawnBonusItems)
{
g_SpawnBonusCount = ArraySize(g_SpawnBonusItems)
}
if(g_PointsBonusItems){
g_PointsBonusCount = ArraySize(g_PointsBonusItems)
// регистрация бонус менюшек
if(g_PointsBonusCount){
if(g_BonusMenus){
for(new i,length = ArraySize(g_BonusMenus) ; i < length ; i++){
ArrayGetArray(g_BonusMenus,i,menuData)
if(!callCmds)
callCmds = TrieCreate()
if(menuData[MENU_SAYCMD][0]){
if(!TrieKeyExists(callCmds,menuData[MENU_SAYCMD])){
new sayCmd[128]
formatex(sayCmd,charsmax(sayCmd),"say %s",menuData[MENU_SAYCMD])
register_clcmd(sayCmd,"Forward_CallCommand")
TrieSetCell(callCmds,menuData[MENU_SAYCMD],i)
}else{
log_amx("WARNING! ^"%s^" say command already in use on line %d!",menuData[MENU_CONCMD],line)
}
}
if(menuData[MENU_CONCMD][0]){
if(!TrieKeyExists(callCmds,menuData[MENU_CONCMD])){
register_clcmd(menuData[MENU_CONCMD],"Forward_CallCommand")
TrieSetCell(callCmds,menuData[MENU_CONCMD],i)
}else
log_amx("WARNING ^"%s^" console command already in use on line %d!",menuData[MENU_CONCMD],line)
}
}
}else{ // дефолтное меню /anew
register_clcmd("say /anew","Forward_CallCommand")
register_clcmd("anew","Forward_CallCommand")
}
}
}
if(get_pcvar_num(cvar[CVAR_BONUS_SPAWN]) == 2)
{
if(cstrike_running())
{
register_logevent("ResetSpawn",2,"1=Round_End")
register_logevent("RoundStart",2,"0=World triggered","1=Round_Start")
register_logevent("RoundRestart",2,"0=World triggered","1=Game_Commencing")
register_event("TextMsg","RoundRestart","a","2Game_will_restart_in")
}
}
}
public RoundRestart()
{
iRound = 0
}
public RoundStart()
{
iRound ++
}
public Check_LockMap()
{
new getmap[32],map[32]
read_args(getmap,charsmax(getmap))
remove_quotes(getmap)
get_mapname(map,charsmax(map))
if(!strcmp(getmap,map))
{
isLocked = true
set_pcvar_num(cvar[CVAR_BONUS_ENABLED],0)
}
}
public client_disconnected(id)
{
player_already_spawned[id] = false
}
//
// Обработчик консольных команд
//
public Forward_ConsoleCommand(id){
if(!g_BonusMenus)
return Format_BonusMenu(id,-1)
new consoleCmd[128]
read_argv(0,consoleCmd,127)
new cmdId
// проверяем что сообщение содержит команду и узнаем её ID
if(!TrieGetCell(g_MenuCommandsValid,consoleCmd,cmdId))
return PLUGIN_HANDLED
Format_BonusMenu(id,cmdId)
return PLUGIN_HANDLED
}
//
// Обработчик say комманд
//
public Forward_CallCommand(id){
if(!g_BonusMenus)
return Format_BonusMenu(id,-1)
new cmd[128]
read_args(cmd,charsmax(cmd))
if(!cmd[0])
read_argv(0,cmd,charsmax(cmd))
trim(cmd)
remove_quotes(cmd)
new cmdId
if(!TrieGetCell(callCmds,cmd,cmdId))
return PLUGIN_CONTINUE
Format_BonusMenu(id,cmdId)
return PLUGIN_CONTINUE
}
//
// Форматирование менюшек
//
public Format_BonusMenu(id,cmdId){
if(isLocked){ // проверка возможности использования бонусов на этой карте
client_print_color(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_BLOCKED")
return PLUGIN_CONTINUE
}
new player_bonus = aes_get_player_bonus(id)
new player_bonus_str[10]
num_to_str(player_bonus,player_bonus_str,charsmax(player_bonus_str))
if(player_bonus <= 0){ // еще какая-то проверка
client_print_color(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_NOT")
return PLUGIN_CONTINUE
}
new ret
ExecuteForward(iaNewForward,ret,id)
if(ret == PLUGIN_HANDLED) // блок вызова в другом плагине
return PLUGIN_HANDLED
new m,itemData[itemFieldsStruct]
if(cmdId == -1){ // строим дефолтное меню anew со списком всех предметов
formatex(itemName,charsmax(itemName),"%L %L",id,"AES_TAG_MENU",id,"AES_BONUS_MENU",player_bonus)
m = menu_create(itemName,"aNew_MenuHandler")
for(new i ; i < g_PointsBonusCount ; i++){
ArrayGetArray(g_PointsBonusItems,i,itemData)
num_to_str(i,itemInfo,charsmax(itemInfo))
aes_get_item_name(itemData[IB_NAME],itemName,charsmax(itemName),id)
menu_additem(m,itemName,itemInfo,.callback = items_CB)
}
}else{
new menuData[menuFieldsStruct],itemIndex
ArrayGetArray(g_BonusMenus,cmdId,menuData)
new len = formatex(itemName,charsmax(itemName),"%L ",id,"AES_TAG_MENU")
len += aes_get_item_name(menuData[MENU_TITLE],itemName[len],charsmax(itemName) - len,id)
replace_all(itemName,charsmax(itemName),"\n","^n")
replace_all(itemName,charsmax(itemName),"",player_bonus_str)
m = menu_create(itemName,"aNew_MenuHandler")
for(new i,length = ArraySize(menuData[MENU_LIST]) ; i < length ; i++){
itemIndex = ArrayGetCell(menuData[MENU_LIST],i) - 1
if(!(0 <=itemIndex < g_PointsBonusCount)) // что ты мне подсунул, блеать
continue
ArrayGetArray(g_PointsBonusItems,i,itemData)
num_to_str(i,itemInfo,charsmax(itemInfo))
aes_get_item_name(itemData[IB_NAME],itemName,charsmax(itemName),id)
menu_additem(m,itemName,itemInfo,.callback = items_CB)
}
}
if(m != -1)
{
F_Format_NavButtons(id,m)
menu_display(id,m)
}
return PLUGIN_CONTINUE
}
//
// Хандлер итемов в меню
//
public Format_ItemsCallback(id,menu,item)
{
new info[10],item_name[256],dummy
menu_item_getinfo(menu,item,dummy,info,charsmax(info),item_name,charsmax(item_name),dummy)
new itemData[itemFieldsStruct]
ArrayGetArray(g_PointsBonusItems,str_to_num(info),itemData)
new limit_fields = Bonus_CheckLimits(id,itemData)
for(new i = 1; i <= 5 ; i++)
{
if(limit_fields & (1< player_bonus)
{
limit_fields |= LIMIT_POINTS
}
}
// проверяем доступность по обыту
if(itemData[IB_EXP])
{
new Float:player_exp = aes_get_player_exp(id)
if(itemData[IB_EXP] > player_exp)
{
limit_fields |= LIMIT_EXP
}
}
// проверяем доступность по уровню
if(itemData[IB_LEVEL])
{
new player_level = aes_get_player_level(id) + 1
if(itemData[IB_LEVEL] > player_level)
{
limit_fields |= LIMIT_LEVEL
}
}
// проверяем доступность по раунду
if(itemData[IB_ROUND])
{
if(itemData[IB_ROUND] > iRound)
{
limit_fields |= LIMIT_ROUND
}
}
// проверяем на доступность по времени
if(itemData[IB_TIME])
{
if(itemData[IB_TIME] < (get_gametime() - player_spawn_time[id]))
{
limit_fields |= LIMIT_TIME
}
}
return limit_fields
}
public F_Format_NavButtons(id,menu){
new tmpLang[20]
formatex(tmpLang,charsmax(tmpLang),"%L",id,"BACK")
menu_setprop(menu,MPROP_BACKNAME,tmpLang)
formatex(tmpLang,charsmax(tmpLang),"%L",id,"EXIT")
menu_setprop(menu,MPROP_EXITNAME,tmpLang)
formatex(tmpLang,charsmax(tmpLang),"%L",id,"MORE")
menu_setprop(menu,MPROP_NEXTNAME,tmpLang)
}
//
// Хандлер бонус меню
//
public aNew_MenuHandler(id,m,item){
if(item == MENU_EXIT)
{
menu_destroy(m)
return PLUGIN_HANDLED
}
if(Format_ItemsCallback(id,m,item) != ITEM_ENABLED)
{
menu_destroy(m)
return PLUGIN_HANDLED
}
menu_item_getinfo(m,item,itemName[0],itemInfo,charsmax(itemInfo),itemName,1,itemName[0])
new itemKey = str_to_num(itemInfo)
menu_destroy(m)
new itemData[itemFieldsStruct]
ArrayGetArray(g_PointsBonusItems,itemKey,itemData)
if(GiveBonus(itemData,id))
{
aes_add_player_bonus_f(id,-itemData[IB_POINTS])
aes_get_item_name(itemData[IB_NAME],itemName,charsmax(itemName),id)
strip_menu_codes(itemName,charsmax(itemName))
client_print_color(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_GIVE",itemName,itemData[IB_POINTS])
}
return PLUGIN_HANDLED
}
//
// Назначение бонус предметов
// itemData- данные бонуса
// id - игрок
// count - кол-во бонусов
// psh - пшш парень, значение в функцию передать не хочешь?
//
GiveBonus(itemData[itemFieldsStruct],id,count = 1,psh = 0){
switch(itemData[IB_TYPE])
{
case ITEM_GIVE:
{
for(new i ; i < count ; i++)
{
if(!give_item(id,itemData[IB_ITEM]))
{
client_print_color(id,print_team_default,"%L %L",id,"AES_TAG",id,"AES_ANEW_CALL_PROBLEM")
return false
}
}
}
case ITEM_CALL:
{
if(callfunc_begin_i(itemData[IB_FUNCTION_ID],itemData[IB_PLUGIN_ID]))
{
callfunc_push_int(id)
if(itemData[IB_FLAGS][0])
{
callfunc_push_str(itemData[IB_FLAGS]);
if(itemData[IB_DAYS])
callfunc_push_int(itemData[IB_DAYS]);
}
else callfunc_push_int(count);
if(psh)
callfunc_push_int(psh);
return callfunc_end();
}
else
{
client_print_color(id,print_team_default,"%L %L",id,"AES_TAG",id,"AES_ANEW_CALL_PROBLEM")
return false
}
}
}
return true
}
//
// Очищение строки от символов меню
//
strip_menu_codes(itemName[],len)
{
replace_all(itemName,len,"\r","")
replace_all(itemName,len,"\y","")
replace_all(itemName,len,"\R","")
replace_all(itemName,len,"\w","")
}
//
// Выдача бонусов на спавнеы
//
public On_Player_Spawn(id)
{
Bonus_OnSpawn(id)
return HAM_IGNORED
}
public Bonus_OnSpawn(id)
{
if(isLocked || !get_pcvar_num(cvar[CVAR_BONUS_ENABLED]) || !is_user_alive(id))
return false
player_spawn_time[id] = get_gametime()
new player_level = aes_get_player_level(id)
switch(get_pcvar_num(cvar[CVAR_BONUS_SPAWN]))
{
case 0: return HAM_IGNORED
case 2: // запоминаем спавн игрока
{
// игрок уже заспавнился
if(player_already_spawned[id])
{
return HAM_IGNORED
}
player_already_spawned[id] = true
}
}
new itemData[itemFieldsStruct],actLevel = -1
new levelValue
new Array:assigned_bonuses
// проверяем бонусы на спавне
for(new i;i < g_SpawnBonusCount ; ++i)
{
arrayset(itemData,0,itemFieldsStruct)
ArrayGetArray(g_SpawnBonusItems,i,itemData)
if(Bonus_CheckLimits(id,itemData))
{
continue
}
// считаем шанс выдачи бонуса
if(itemData[IB_CHANCE])
{
new chanceValue
if(player_level >= ArraySize(itemData[IB_CHANCE])) // :D
actLevel = ArraySize(itemData[IB_CHANCE]) - 1
else
actLevel = player_level
if(itemData[IB_SUMCHANCE]){
for(new z ; z <= actLevel ; z++) // складываем общий шанс за все уровни
chanceValue += ArrayGetCell(itemData[IB_CHANCE],i)
}else{
if(actLevel < 0)
continue
chanceValue = ArrayGetCell(itemData[IB_CHANCE],actLevel)
}
// проверяем что это наш шанс
if(chanceValue * 10 < random_num(0,1000))
{
continue // извини братюнь, в другой раз
}
}
// узнаем значение бонуса для определенного уровня
if(itemData[IB_LEVELS])
{
if(player_level >= ArraySize(itemData[IB_LEVELS])) // :D
actLevel = ArraySize(itemData[IB_LEVELS]) - 1
else
actLevel = player_level
if(itemData[IB_SUMCHANCE])
{
for(new i ; i <= actLevel ; i++) // складываем значения за все уровни
levelValue += ArrayGetCell(itemData[IB_LEVELS],i)
}
else
{
if(actLevel < 0)
{
continue
}
levelValue = ArrayGetCell(itemData[IB_LEVELS],actLevel)
}
}
if(levelValue > 0)
{
// выдаем бонус
if(GiveBonus(itemData,id,levelValue))
{
if(!assigned_bonuses)
{
assigned_bonuses = ArrayCreate(sizeof itemData[IB_NAME])
}
ArrayPushString(assigned_bonuses,itemData[IB_NAME])
}
}
}
if(assigned_bonuses)
{
new bonus_info[192],len
len = formatex(bonus_info,charsmax(bonus_info),"%L %L ",id,"AES_TAG",
id,"AES_ANEW_INFO6")
for(new i,length = ArraySize(assigned_bonuses) ; i < length ; i++)
{
ArrayGetString(assigned_bonuses,i,itemData[IB_NAME],charsmax(itemData[IB_NAME]))
if(i > 0)
{
len += formatex(bonus_info[len],charsmax(bonus_info) - len,", ")
}
len += formatex(bonus_info[len],charsmax(bonus_info) - len,"^4")
len += aes_get_item_name(itemData[IB_NAME],bonus_info[len],charsmax(bonus_info) - len,id)
len += formatex(bonus_info[len],charsmax(bonus_info) - len,"^1")
}
ArrayDestroy(assigned_bonuses)
client_print_color(id,print_team_default,bonus_info)
}
return true
}
public Array:parse_levels(levelString[]){
new Array:which = ArrayCreate(1)
new stPos,ePos,rawPoint[20]
// parse levels entry
do {
ePos = strfind(levelString[stPos]," ")
formatex(rawPoint,ePos,levelString[stPos])
ArrayPushCell(which,str_to_num(rawPoint))
stPos += ePos + 1
} while (ePos != -1)
return which
}
public aes_get_item_name(itemString[],out[],len,id)
{
new l
if(strfind(itemString,"LANG_") == 0)// формирование по словарю
{
replace(itemString,strlen(itemString),"LANG_","")
l = formatex(out,len,"%L",id,itemString)
}
else
{
l = copy(out,len,itemString)
}
return l
}
//
// Регистрация бонус предмета
// itemData - данные
// cfgBlock - конфигурационный блок
// line - линия
//
public RegisterBonusItem(itemData[itemFieldsStruct],cfgBlock,line){
if(itemData[IB_TYPE]){ // записываем параметры предедущего бонуса
new bool:isOk = true
// проверки на валидность
switch(itemData[IB_TYPE]){
case ITEM_GIVE:{
if(!itemData[IB_ITEM][0]){
log_amx("[ERROR] give item not set on line %d",line)
isOk = false
}
}
}
if(isOk){
new Array:itemArray
switch(cfgBlock){
case BONUS_ITEM_SPAWN: {
if(!g_SpawnBonusItems)
g_SpawnBonusItems = ArrayCreate(itemFieldsStruct)
itemArray = g_SpawnBonusItems
}
case BONUS_ITEM_MENU: {
if(!g_PointsBonusItems)
g_PointsBonusItems = ArrayCreate(itemFieldsStruct)
itemArray = g_PointsBonusItems
}
}
if(itemArray)
ArrayPushArray(itemArray,itemData)
}
return true
}
return false
}
public RegisterMenuItem(menuData[menuFieldsStruct],line){
if(!menuData[MENU_SAYCMD][0] && !menuData[MENU_CONCMD][0])
return -1
if(!g_BonusMenus)
g_BonusMenus = ArrayCreate(menuFieldsStruct)
ArrayPushArray(g_BonusMenus,menuData)
return ArraySize(g_BonusMenus) - 1
}
public ResetSpawn()
{
arrayset(player_already_spawned,false,sizeof player_already_spawned)
arrayset(_:player_spawn_time,0,sizeof player_spawn_time)
}