|
发表于 2008-9-1 09:36:47
|
显示全部楼层
来自 中国–广东–深圳
回复: 有一个错误码率,版主主帮改一下
[PHP]
/*
命令和参数说明:
amx_inform_freq <n> 玩家进行举报时,相邻两次举报的最小时间间隔(秒),默认 15 秒
amx_clear_inform_items 清除所有举报项目
amx_add_inform_item <title> <text> 增加举报项目,如:
amx_add_inform_item "举报玩家作弊" "%s 举报: 玩家 %s 作弊"
amx_add_inform_item "举报玩家可能作弊,请观察" "%s 举报: 玩家 %s 可能作弊,请观察"
amx_add_inform_item "举报玩家违反服务器规定,请处罚" "%s 举报: 玩家 %s 违反服务器规定,请处罚"
请按照此格式增加项目
say /inform 打开举报玩家菜单
*/
#include <amxmodx>
#include <amxmisc>
#define MENU_SIZE 512
#define MENU_PLAYERS 8
#define MENU_ITEMS_PERPAGE 7
#define INFORM_ITEMS_MAXCOUNT 28
new Inform_Items_Count = 0
new g_nMenuPosition[33]
new g_nMenuPlayers[33][32]
new g_InformType[33]
new g_InformTarget[33]
new g_InformTime[33]
new g_InformMenuTitle[INFORM_ITEMS_MAXCOUNT][128]
new g_InformText[INFORM_ITEMS_MAXCOUNT][128]
new g_informer = 0 //举报者
public plugin_init()
{
register_plugin("Inform Player", "1.0", "Rulzy")
register_dictionary("common.txt")
register_cvar("amx_inform_freq","15")
register_clcmd("say /inform", "cmdInformMenu", ADMIN_ALL, "- display inform menu")
register_srvcmd("amx_clear_inform_items", "cmdClearInformItems", _, "- clear inform items")
register_srvcmd("amx_add_inform_item", "cmdAddInformItem", _, "<title> <text> - add a inform item")
register_menucmd( register_menuid("Inform Main"), 1023, "MainMenuAction" )
register_menucmd( register_menuid("Inform Player"), 1023, "InformMenuAction" )
register_menucmd( register_menuid("Inform Reply"), MENU_KEY_1|MENU_KEY_2, "ReplyMenuAction" )
Inform_Items_Count = 5
copy(g_InformMenuTitle[0], 127, "举报玩家是作弊猪")
copy(g_InformText[0], 127, "%s 举报: 玩家 %s 是作弊猪")
copy(g_InformMenuTitle[1], 127, "举报玩家可能是透视作弊,请观察")
copy(g_InformText[1], 127, "%s 举报: 玩家 %s 可能透视作弊,请观察")
copy(g_InformMenuTitle[2], 127, "举报玩家可能是TV,请观察")
copy(g_InformText[2], 127, "%s 举报: 玩家 %s 可能是TV,请观察")
copy(g_InformMenuTitle[3], 127, "举报玩家多次满嘴喷粪,警告无效,请处罚")
copy(g_InformText[3], 127, "%s 举报: 玩家 %s 多次满嘴喷粪,警告无效,请处罚")
copy(g_InformMenuTitle[4], 127, "举报玩家使用的ID相当不文明,请处罚")
copy(g_InformText[4], 127, "%s 举报: 玩家 %s 使用的ID相当不文明,请处罚")
}
public client_putinserver(id)
{
g_InformType[id] = -1
g_InformTarget[id] = 0
g_InformTime[id] = 0
new i, j
//防止玩家举报的玩家已离开,被新进入的玩家占用此id而导致举报对象错误
for(i=1;i<=32;i++)
{
if(g_InformTarget==id) g_InformTarget = 0
for(j=0;j<32;j++)
{
if(g_nMenuPlayers[j]==id)
g_nMenuPlayers[j] = 0
}
}
set_task(10.0, "show_hint", id)
}
public show_hint(id)
{
client_print(id, print_chat, "[AMXX] 按 Y 键后输入 /inform 可打开举报玩家菜单")
}
public cmdClearInformItems(id)
{
Inform_Items_Count = 0
return PLUGIN_HANDLED
}
public cmdAddInformItem(id)
{
if(read_argc()<5)
{
server_print("Usage: amx_add_inform_item <title> <text> - add a inform item")
return PLUGIN_HANDLED
}
if(Inform_Items_Count>=INFORM_ITEMS_MAXCOUNT)
{
server_print("Max inform items reached")
return PLUGIN_HANDLED
}
read_argv(1, g_InformMenuTitle[Inform_Items_Count], 127)
read_argv(2, g_InformText[Inform_Items_Count], 127)
Inform_Items_Count++
return PLUGIN_HANDLED
}
public ReplyMenuAction(id, key)
{
if(key==0)
{
new name[32], name2[32]
get_user_name(id, name, 31)
client_print(g_informer, print_chat, "[AMXX] 管理员 %s 收到你的举报。", name)
client_cmd(g_informer,"spk misc/shoudao")
get_user_name(g_informer, name2, 31)
client_print(id, print_chat, "[AMXX] 你的回执已经发送给 %s。", name2)
}
}
public ShowInformReplyMenu(id, msg[])
{
new szMenuBody[MENU_SIZE]
new nLen = format(szMenuBody, MENU_SIZE-1, "\w%s^n^n\y请选择:\w^n^n", msg)
format(szMenuBody[nLen], MENU_SIZE-1-nLen,"1. 发送回执^n^n2. 不发送")
show_menu(id, MENU_KEY_1|MENU_KEY_2, szMenuBody, -1, "Inform Reply")
client_cmd(id,"spk misc/opshoudao")
}
public ShowInformMsg(id, vid)
{
new curtime = get_user_time(id)
new inform_freq = get_cvar_num("amx_inform_freq")
if(curtime-g_InformTime[id]<inform_freq && g_InformTime[id]!=0)
{
client_print(id, print_chat, "[AMXX] 对不起,你上次举报完没多久,请你稍后再举报。")
client_print(id, print_chat, "[AMXX] 下次举报此玩家只需选择 '重复上次的举报' 即可。")
return
}
g_InformTime[id]= curtime
if(vid==0 || !is_user_connected(vid))
{
client_print(id, print_chat, "[AMXX] 对不起,此玩家已经离开服务器,无法举报。")
return
}
new name[32], vname[32]
get_user_name(id, name, 31)
get_user_name(vid, vname, 31)
new OpCount = 0, flags, msg[256]
format(msg, 255, g_InformText[g_InformType[id]], name, vname)
new max_players = get_maxplayers()
g_informer = id
for(new i=1;i<=max_players;i++)
{
if(!is_user_connected(i)) continue
flags = get_user_flags(i)
if(flags&ADMIN_BAN || flags&ADMIN_KICK)
{
OpCount++
if(i!=id)
{
ShowInformReplyMenu(i, msg)
console_print(i, msg)
}
}
}
format(msg, 255, g_InformText[g_InformType[id]], "你", vname)
client_print(id, print_chat, msg)
}
public InformMenuAction(id, key)
{
switch( key )
{
case 8: ShowInformMenu( id, ++g_nMenuPosition[id] )
case 9: ShowInformMenu( id, --g_nMenuPosition[id] )
default:
{
g_InformTarget[id] = g_nMenuPlayers[id][g_nMenuPosition[id] * MENU_PLAYERS + key]
ShowInformMsg(id, g_InformTarget[id])
}
}
}
public ShowInformMenu(id, pos)
{
if( pos < 0 ) return
new i, j
new nCurrKey = 0
new szUserName[32]
new szMenuBody[MENU_SIZE]
new nStart = pos * MENU_PLAYERS
new nNum
get_players( g_nMenuPlayers[id], nNum )
if( nStart >= nNum )
nStart = pos = g_nMenuPosition[id] = 0
new nLen= format(szMenuBody, MENU_SIZE-1, "\y%s\R%d/%d^n\w^n",
g_InformMenuTitle[g_InformType[id]], pos+1, nNum/MENU_PLAYERS + ((nNum % MENU_PLAYERS)?1:0))
new nEnd = nStart + MENU_PLAYERS
new nKeys = MENU_KEY_0
if( nEnd > nNum )
nEnd = nNum
for( i = nStart; i < nEnd; i++ )
{
j = g_nMenuPlayers[id]
get_user_name( j, szUserName, 31 )
if( get_user_flags(j) & ADMIN_IMMUNITY || j == id)
{
nCurrKey++
nLen += format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "\d%d. %s^n\w", nCurrKey, szUserName)
}else
{
nKeys |= (1<<nCurrKey++)
if(is_user_admin(j))
nLen += format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "%d. %s \r*\w^n", nCurrKey, szUserName )
else
nLen += format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "%d. %s^n", nCurrKey, szUserName )
}
}
if( nEnd != nNum )
{
format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "^n9. %L...^n0. %L", id , "MORE", id, (pos ? "BACK" : "EXIT" ))
nKeys |= MENU_KEY_9
}
else
format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "^n0. %L", id, (pos ? "BACK" : "EXIT" ))
show_menu( id, nKeys, szMenuBody, -1 , "Inform Player")
}
public ReInform(id)
{
if(g_InformTarget[id]==0 || g_InformType[id] == -1)
{
client_print(id, print_chat, "[AMXX] 对不起,你还没有举报过,或者是你上次举报的玩家已经离开。")
return
}
ShowInformMsg(id, g_InformTarget[id])
}
public MainMenuAction(id, key)
{
switch( key )
{
case 7: ReInform(id)
case 8: ShowInformMainMenu(id, ++g_nMenuPosition[id])
case 9: ShowInformMainMenu(id, --g_nMenuPosition[id])
default:{
g_InformType[id] = g_nMenuPosition[id] * MENU_ITEMS_PERPAGE + key
ShowInformMenu(id, g_nMenuPosition[id]=0)
}
}
}
public ShowInformMainMenu(id, pos)
{
if( pos < 0 ) return
new szMenuBody[MENU_SIZE]
new nCurrKey = 0
new nStart = pos * MENU_ITEMS_PERPAGE
new nKeys = MENU_KEY_0
if( nStart >= Inform_Items_Count )
nStart = pos = g_nMenuPosition[id] = 0
new nEnd = nStart + MENU_ITEMS_PERPAGE
if( nEnd > Inform_Items_Count )
nEnd = Inform_Items_Count
new nLen = format( szMenuBody, MENU_SIZE-1, "\y举报玩家菜单\R%d/%d^n\w^n",
pos+1, Inform_Items_Count/MENU_ITEMS_PERPAGE+((Inform_Items_Count % MENU_ITEMS_PERPAGE)?1:0) )
for(new i=nStart;i<nEnd;i++)
{
nKeys |= 1<<nCurrKey++
nLen += format( szMenuBody[nLen], MENU_SIZE-1-nLen, "%d. %s^n", nCurrKey, g_InformMenuTitle)
}
if(Inform_Items_Count>0)
{
nLen += format( szMenuBody[nLen], MENU_SIZE-1-nLen, "^n8. 重复上次的举报^n")
nKeys |= MENU_KEY_8
}
if( nEnd != Inform_Items_Count )
{
format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "^n9. %L...^n0. %L", id , "MORE", id, (pos ? "BACK" : "EXIT" ))
nKeys |= MENU_KEY_9
}
else
format( szMenuBody[nLen], (MENU_SIZE-1-nLen), "^n0. %L", id, (pos ? "BACK" : "EXIT" ))
show_menu(id, nKeys, szMenuBody, -1, "Inform Main")
}
public plugin_precache(){
precache_sound( "misc/shoudao.wav")
precache_sound( "misc/opshoudao.wav")
return PLUGIN_CONTINUE
}
public cmdInformMenu(id)
{
ShowInformMainMenu(id, g_nMenuPosition[id]=0)
return PLUGIN_HANDLED
}
/* UTF-8 func by www.DT-Club.net */
[/PHP] |
|