Цитата(CyberUser @ 11.6.2015, 12:09)

Код:
set_task( 0.1, "keys_update", _, _, _, "b" );
может и из-за этого моргать слишком уж быстро!
Код:
set_task( 1.0, "keys_update", _, _, _, "b" );
так тоже норм!
махинации с set_task не помогут, в любом случае при обновлении будет моргать. А если я поставлю 1.0 сек, то это значит что я буду обновлять 1 раз в секунду, а для нажатия клавиш это очень долго, с specinfo я перепробовал много, но такого результата как в showkeys не добиться, хотелось бы в showkeys видеть возможность от speclist'a, а т.е клавиши которые нажимает тот за кем наблюдаешь.
Нашел еще пару плагинов подобного рода, но:
в этом не работает showkeyКод:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#define ADMIN_SPECHIDE ADMIN_KICK
new g_HudSyncObj_List;
new g_HudSyncObj_Keys1;
new g_HudSyncObj_Keys2;
new bool:g_bSpecList[33];
new bool:g_bSpecKeys[33];
new bool:g_bSpecHide[33];
new bool:g_bConnected[33];
new bool:g_bAlive[33];
new bool:g_bBot[33];
new g_Keys[33];
new Float:g_fKeysDelay;
new g_MaxPlayers;
new const g_sKeys[6][] =
{
"W",
"A",
"D",
"S",
"Duck",
"Jump"
};
new const g_Buttons[6] =
{
IN_FORWARD,
IN_MOVELEFT,
IN_MOVERIGHT,
IN_BACK,
IN_DUCK,
IN_JUMP
};
public plugin_init()
{
register_plugin("Spectator List", "0.1", "Exolent");
register_clcmd("say", "clcmd_Say", -1, "");
register_clcmd("say_team", "clcmd_Say", -1, "");
register_forward(FM_PlayerPreThink, "fwd_FM_PlayerPreThink_pre", 0);
RegisterHam(Ham_Spawn, "player", "fwd_Ham_Spawn_post", 1);
RegisterHam(Ham_Killed, "player", "fwd_Ham_Killed_pre", 0);
g_HudSyncObj_List = CreateHudSyncObj(0);
g_HudSyncObj_Keys1 = CreateHudSyncObj(0);
g_HudSyncObj_Keys2 = CreateHudSyncObj(0);
g_MaxPlayers = get_maxplayers();
return PLUGIN_CONTINUE;
}
public plugin_cfg()
{
set_task(1.0, "task_SpectatorList", 0, "", 0, "b", 0);
set_task(0.1, "task_SpectatorKeys", 0, "", 0, "b", 0);
return PLUGIN_CONTINUE;
}
public client_connect(plr)
{
g_bSpecList[plr] = true;
g_bSpecKeys[plr] = true;
g_bSpecHide[plr] = false;
return PLUGIN_CONTINUE;
}
public client_putinserver(plr)
{
g_bConnected[plr] = true;
g_bBot[plr] = bool:is_user_bot(plr);
return PLUGIN_CONTINUE;
}
public client_disconnect(plr)
{
g_bConnected[plr] = false;
g_bAlive[plr] = false;
return PLUGIN_CONTINUE;
}
public clcmd_Say(id)
{
static sMessage[192];
read_args(sMessage, 191);
remove_quotes(sMessage);
if(equali(sMessage, "/speclist"))
{
g_bSpecList[id] = !g_bSpecList[id];
client_print(id, print_chat, "[SPECLIST] You have turned o%s the spectator list.", g_bSpecList[id] ? "n" : "ff");
return PLUGIN_HANDLED;
}
if(equali(sMessage, "/speckeys"))
{
g_bSpecKeys[id] = !g_bSpecKeys[id];
client_print(id, print_chat, "[SPECLIST] You have turned o%s the spectator keys.", g_bSpecKeys[id] ? "n" : "ff");
return PLUGIN_HANDLED;
}
if(equali(sMessage, "/spechide"))
{
if(get_user_flags(id) & ADMIN_SPECHIDE)
{
g_bSpecHide[id] = !g_bSpecHide[id];
client_print(id, print_chat, "[SPECLIST] You have turned o%s spectator list hiding.", g_bSpecHide[id] ? "n" : "ff");
}
else
{
client_print(id, print_chat, "[SPECLIST] You have no access to spectator list hiding.");
}
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public fwd_Ham_Spawn_post(plr)
{
if(is_user_alive(plr))
{
g_bAlive[plr] = true;
return HAM_HANDLED;
}
return HAM_IGNORED;
}
public fwd_Ham_Killed_pre(plr, attacker, shouldgib)
{
g_bAlive[plr] = false;
return HAM_IGNORED;
}
public fwd_FM_PlayerPreThink_pre(plr)
{
if(get_gametime() >= g_fKeysDelay && g_bAlive[plr])
{
g_Keys[plr] = 0;
static button, i, temp;
button = pev(plr, pev_button);
for(i = 0; i < 6; i++)
{
temp = g_Buttons[i];
if(button & temp)
{
g_Keys[plr] |= temp;
}
}
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public task_SpectatorKeys()
{
for(new plr = 1; plr <= g_MaxPlayers; plr++)
{
if(!g_bConnected[plr])
{
continue;
}
static spec[33], id;
for(id = 1; id <= g_MaxPlayers; id++)
{
if(g_bConnected[id] && !g_bAlive[id])
{
spec[id] = pev(id, pev_iuser2);
}
}
static sMsg[6][16], i;
for(i = 0; i < 6; i++)
{
if(g_Keys[plr] & g_Buttons[i])
{
copy(sMsg[i], 15, g_sKeys[i]);
}
else if(i > 3)
{
copy(sMsg[i], 15, "^n^n");
}
else
{
copy(sMsg[i], 15, "^t^t");
}
for(id = 1; id <= g_MaxPlayers; id++)
{
if(!g_bConnected[id] || g_bAlive[id] || g_bBot[id] || !g_bSpecKeys[id])
{
continue;
}
if(spec[id] == plr)
{
set_hudmessage(100, 100, 100, -1.0, -1.0, 0, 0.0, 0.3, 0.0, 0.0, -1);
ShowSyncHudMsg(id, g_HudSyncObj_Keys1,\
"%s^n^n%s^t^t^t^t^t^t^t^t^t^t%s^n^n%s",\
sMsg[0],\
sMsg[1],\
sMsg[2],\
sMsg[3]);
set_hudmessage(100, 100, 100, -1.0, -1.0, 0, 0.0, 0.3, 0.0, 0.0, -1);
ShowSyncHudMsg(id, g_HudSyncObj_Keys2,\
"^n^n^n^n^n^n^n^n^n%s^n^n%s",\
sMsg[4],\
sMsg[5]);
}
}
}
}
g_fKeysDelay = get_gametime() + 0.1;
return FMRES_IGNORED;
}
public task_SpectatorList()
{
static sTitle[46];
static sMsg[1280];
static sName[33][48];
static bool:bHudExists;
static spectators[32];
static specNum;
static totalSpecNum;
static id, alive, dead, i, dead2, i2;
for(id = 1; id <= g_MaxPlayers; id++)
{
if(!g_bConnected[id])
{
continue;
}
if(g_bSpecHide[id] && !(get_user_flags(id) & ADMIN_SPECHIDE))
{
g_bSpecHide[id] = false;
}
}
for(alive = 1; alive <= g_MaxPlayers; alive++)
{
if(!g_bConnected[alive] || !g_bAlive[alive] || g_bBot[alive])
{
continue;
}
bHudExists = false;
specNum = 0;
arrayset(spectators, 0, 32);
for(dead = 1; dead <= g_MaxPlayers; dead++)
{
if(!g_bConnected[dead] || g_bAlive[dead] || g_bBot[dead])
{
continue;
}
if(pev(dead, pev_iuser2) == alive)
{
spectators[specNum++] = dead;
if(!bHudExists)
{
get_user_name(alive, sName[alive], 31);
formatex(sTitle, 45, "Spectating %s^n", sName[alive]);
bHudExists = true;
}
get_user_name(dead, sName[dead], 31);
format(sName[dead], 47, " %s^n", sName[dead]);
}
}
if(bHudExists && specNum > 0)
{
totalSpecNum = 0;
formatex(sMsg, 1279, "%s", sTitle);
if(g_bSpecList[alive])
{
for(i = 0; i < specNum; i++)
{
dead =spectators[i];
if(!g_bSpecHide[dead])
{
add(sMsg, 1279, sName[dead]);
totalSpecNum++;
}
}
if(totalSpecNum > 0)
{
format(sMsg, 1279, "(%d) %s", totalSpecNum, sMsg);
ClearSyncHud(alive, g_HudSyncObj_List);
set_hudmessage(100, 100, 100, 0.75, 0.15, 0, 0.0, 1.1, 0.0, 0.0, -1);
ShowSyncHudMsg(alive, g_HudSyncObj_List, "%s", sMsg);
}
}
for(i = 0; i < specNum; i++)
{
dead = spectators[i];
if(!g_bSpecList[dead])
{
continue;
}
totalSpecNum = 0;
formatex(sMsg, 1279, "%s", sTitle);
for(i2 = 0; i2 < specNum; i2++)
{
dead2 = spectators[i2];
if(!g_bSpecHide[dead2])
{
add(sMsg, 1279, sName[dead2]);
totalSpecNum++;
}
}
if(totalSpecNum > 0)
{
format(sMsg, 1279, "(%d) %s",totalSpecNum, sMsg);
ClearSyncHud(dead, g_HudSyncObj_List);
set_hudmessage(100, 100, 100, 0.75, 0.15, 0, 0.0, 1.1, 0.0, 0.0, -1);
ShowSyncHudMsg(dead, g_HudSyncObj_List, "%s", sMsg);
}
}
}
}
return PLUGIN_CONTINUE;
}
а этот так же использует set_task, ну и реализация замены нажатий не очень хорошая.
Код:
#include <amxmodx>
#include <fakemeta>
#define PLUGIN "key listener"
#define VERSION "0.3"
#define AUTHOR "cheap_suit"
new cvar_x
new cvar_y
new g_spectarget[33]
new bool:g_firstperson[33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_forward(FM_PlayerPostThink, "fwd_playerpostthink")
register_event("StatusValue", "event_statusvalue", "bd", "1=2")
register_event("SpecHealth2", "event_spechealth2", "bd")
register_event("TextMsg", "event_textmsg","b", "2&#Spec_Mode")
register_event("ResetHUD", "event_resethud", "be")
cvar_x = register_cvar("keylistenhud_x", "-1.0")
cvar_y = register_cvar("keylistenhud_y", "-0.49")
}
public client_connect(id)
reset(id)
public client_disconnect(id)
reset(id)
public event_resethud(id)
reset(id)
public reset(id)
{
g_spectarget[id] = 0
g_firstperson[id] = false
}
public event_textmsg(id)
{
static specmode[12]
read_data(2, specmode, 11)
g_firstperson[id] = equal(specmode,"#Spec_Mode4") ? true : false
}
public event_statusvalue(id)
{
if(is_user_connected(id) && !is_user_alive(id))
set_spec_target(id, read_data(2))
}
public event_spechealth2(id)
{
if(is_user_connected(id) && !is_user_alive(id))
set_spec_target(id, read_data(2))
}
public set_spec_target(index, target)
{
if(target > 0)
g_spectarget[index] = target
}
public fwd_playerpostthink(id)
{
if(is_user_alive(id) || !g_firstperson[id])
return FMRES_IGNORED;
new target = g_spectarget[id]
if((target < 1) || !is_user_alive(target))
return FMRES_IGNORED;
new button = pev(target, pev_button)
static key[6][6]
formatex(key[0], 5, "%s", (button & IN_FORWARD) && !(button & IN_BACK) ? " W " : " ")
formatex(key[1], 5, "%s", (button & IN_BACK) && !(button & IN_FORWARD) ? " S " : " ")
formatex(key[2], 5, "%s", (button & IN_MOVELEFT) && !(button & IN_MOVERIGHT) ? "A" : " ")
formatex(key[3], 5, "%s", (button & IN_MOVERIGHT) && !(button & IN_MOVELEFT) ? "D" : " ")
formatex(key[4], 5, "%s", (button & IN_DUCK) ? " DUCK " : " ")
formatex(key[5], 5, "%s", (button & IN_JUMP) ? " JUMP " : " ")
set_hudmessage(255, 255, 255, get_pcvar_float(cvar_x), get_pcvar_float(cvar_y), _, _, _, 0.1)
show_hudmessage(id, " %s^n%s %s %s^n^n%s %s", key[0], key[2], key[1], key[3], key[4], key[5])
return FMRES_IGNORED;
}
и еще один код, также через 0.1 сек обновление. Переводил в ДХУД хуже остальных :)
Код:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#define PLUGIN "Showkeys Info"
#define VERSION "1.0"
#define AUTHOR "vato loco [GE-S]"
new g_iPlayerKeys[33]
new bool:g_bShowKeys[33]
new Float:fShowKeyTime = 0.0
new g_showkeys
new g_color
new g_SyncShowKeys
new g_iMaxPlayers
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_forward(FM_StartFrame, "fw_StartFrame")
register_clcmd( "say /showkeys", "ClientShowKeys")
g_showkeys = register_cvar("amx_showkeys","1")
g_color = register_cvar("amx_showkeys_color","0 255 255")
g_SyncShowKeys = CreateHudSyncObj()
g_iMaxPlayers = get_maxplayers()
}
public ClientShowKeys(id)
{
g_bShowKeys[id] = !g_bShowKeys[id]
}
public fw_StartFrame()
{
if(!get_pcvar_num(g_showkeys))
return FMRES_IGNORED
static Float:fGameTime, Float:fDelay
fGameTime = get_gametime()
fDelay = 0.1
if((fShowKeyTime + fDelay) <= fGameTime)
{
show_keyinfo()
fShowKeyTime = fGameTime
}
static id
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(is_user_alive(id))
{
new Button = pev(id, pev_button)
if(Button & IN_FORWARD)
g_iPlayerKeys[id] |= IN_FORWARD
if(Button & IN_BACK)
g_iPlayerKeys[id] |= IN_BACK
if(Button & IN_MOVELEFT)
g_iPlayerKeys[id] |= IN_MOVELEFT
if(Button & IN_MOVERIGHT)
g_iPlayerKeys[id] |= IN_MOVERIGHT
if(Button & IN_DUCK)
g_iPlayerKeys[id] |= IN_DUCK
if(Button & IN_JUMP )
g_iPlayerKeys[id] |= IN_JUMP
}
}
return FMRES_IGNORED
}
stock show_keyinfo()
{
static id
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(!is_user_alive(id))
{
new specmode = pev(id, pev_iuser1)
if(specmode == 2 || specmode == 4)
{
new target = pev(id, pev_iuser2)
if(target != id)
{
if(!is_user_alive(target))
g_iPlayerKeys[target] = 0
static plr_key[64], r, g, b
HudMsgColor(g_color, r, g, b)
set_hudmessage(r, g, b, -1.0, -0.40, 0, _, 0.1, _, _, 3)
formatex(plr_key, 63, "%s^n %s %s %s %s ^n %s",
g_iPlayerKeys[target] & IN_FORWARD ? "W" : " .",
g_iPlayerKeys[target] & IN_MOVELEFT ? "A" : ".",
g_iPlayerKeys[target] & IN_BACK ? "S" : ".",
g_iPlayerKeys[target] & IN_MOVERIGHT ? "D" : ".",
g_iPlayerKeys[target] & IN_DUCK ? "DUCK" : "- ",
g_iPlayerKeys[target] & IN_JUMP ? "JUMP" : " . ")
ShowSyncHudMsg(id, g_SyncShowKeys, "%s", plr_key)
g_iPlayerKeys[target] = 0
}
}
}
else if(is_user_alive(id) && g_bShowKeys[id])
{
static plr_key[64], r, g, b
HudMsgColor(g_color, r, g, b)
set_hudmessage(r, g, b, -1.0, -0.40, 0, _, 0.1, _, _, 3)
formatex(plr_key, 63, "%s^n %s %s %s %s ^n %s",
g_iPlayerKeys[id] & IN_FORWARD ? "W" : " .",
g_iPlayerKeys[id] & IN_MOVELEFT ? "A" : ".",
g_iPlayerKeys[id] & IN_BACK ? "S" : ".",
g_iPlayerKeys[id] & IN_MOVERIGHT ? "D" : ".",
g_iPlayerKeys[id] & IN_DUCK ? "DUCK" : "- ",
g_iPlayerKeys[id] & IN_JUMP ? "JUMP" : " . ")
ShowSyncHudMsg(id, g_SyncShowKeys, "%s", plr_key)
g_iPlayerKeys[id] = 0
}
}
return PLUGIN_CONTINUE
}
public HudMsgColor(cvar, &r, &g, &b)
{
static color[16], piece[5]
get_pcvar_string(cvar, color, 15)
strbreak( color, piece, 4, color, 15)
r = str_to_num(piece)
strbreak( color, piece, 4, color, 15)
g = str_to_num(piece)
b = str_to_num(color)
}