Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

SHOWKEYS (help)

[РЕШЕНО]
Статус пользователя medusa
сообщение 31.5.2015, 21:44
Сообщение #1


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Здравствуйте. Есть 2 плагина *Showkeys и *SpecInfo. Интересовала функция показа нажитая клавиш, переделать ее в dhud.
Переделал SpecInfo, но результат не нравиться, т.к. работает через set task, и поэтому из-за обновления Дхуда он моргает.
Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <dhudmessage>

new const VERSION[ ] = "1.3.1"
new const TRKCVAR[ ] = "specinfo_version"
#define IMMUNE_FLAG ADMIN_IMMUNITY

#define KEYS_STR_LEN 31
#define LIST_STR_LEN 610
#define BOTH_STR_LEN KEYS_STR_LEN + LIST_STR_LEN

//cl_prefs constants
#define FL_LIST ( 1 << 0 )
#define FL_KEYS ( 1 << 1 )
#define FL_OWNKEYS ( 1 << 2 )
#define FL_HIDE ( 1 << 3 )

//cvar pointers
new p_enabled, p_list_enabled, p_keys_enabled, p_list_default, p_keys_default;
new p_red, p_grn, p_blu, p_immunity;

//data arrays
new cl_keys[33], cl_prefs[33];
new keys_string[33][KEYS_STR_LEN + 1], list_string[33][LIST_STR_LEN + 1]
new cl_names[33][21], spec_ids[33][33];

public plugin_init( )
{
register_plugin( "SpecInfo", VERSION, "Ian Cammarata" );
register_cvar( TRKCVAR, VERSION, FCVAR_SERVER );
set_cvar_string( TRKCVAR, VERSION );

p_enabled = register_cvar( "si_enabled", "1" );
p_list_enabled = register_cvar( "si_list_enabled", "1" );
p_keys_enabled = register_cvar( "si_keys_enabled", "1" );
p_list_default = register_cvar( "si_list_default", "1" );
p_keys_default = register_cvar( "si_keys_default", "1" );
p_immunity = register_cvar( "si_immunity", "1" );
p_red = register_cvar( "si_msg_r", "45" );
p_grn = register_cvar( "si_msg_g", "89" );
p_blu = register_cvar( "si_msg_b", "116" );

register_clcmd( "say /speclist", "toggle_list", _, "Toggle spectator list." );
register_clcmd( "say /speckeys", "toggle_keys", _, "Toggle spectator keys." );
register_clcmd( "say /showkeys", "toggle_ownkeys", _, "Toggle viewing own keys." );
register_clcmd( "say /spechide", "toggle_hide", IMMUNE_FLAG, "Admins toggle being hidden from list." );

set_task( 1.0, "list_update", _, _, _, "b" );
set_task( 0.1, "keys_update", _, _, _, "b" );

register_dictionary( "specinfo.txt" );
}

public client_connect( id )
{
cl_prefs[id] = 0;
if( !is_user_bot( id ) )
{
if( get_pcvar_num( p_list_default ) ) cl_prefs[id] |= FL_LIST;
if( get_pcvar_num( p_keys_default ) ) cl_prefs[id] |= FL_KEYS;
}
get_user_name( id, cl_names[id], 20 );
return PLUGIN_CONTINUE;
}

public client_infochanged( id )
{
get_user_name( id, cl_names[id], 20 );
return PLUGIN_CONTINUE;
}

public list_update( )
{
if( get_pcvar_num( p_enabled ) && get_pcvar_num ( p_list_enabled ) )
{
new players[32], num, id, id2, i, j;
for( i = 1; i < 33; i++ ) spec_ids[i][0] = 0;

get_players( players, num, "bch" );
for( i = 0; i < num; i++ )
{
id = players[i];
if( !( get_user_flags( id ) & IMMUNE_FLAG && get_pcvar_num( p_immunity ) && cl_prefs[id] & FL_HIDE ) )
{
id2 = pev( id, pev_iuser2 );
if( id2 )
{
spec_ids[ id2 ][ 0 ]++;
spec_ids[ id2 ][ spec_ids[ id2 ][ 0 ] ] = id;
}
}
}
new tmplist[ LIST_STR_LEN + 1 ], tmpstr[41];
new count, namelen, tmpname[21];
for( i=1; i<33; i++ )
{
count = spec_ids[i][0];
if( count )
{
namelen = ( LIST_STR_LEN - 10 ) / count;
clamp( namelen, 10, 20 );
format( tmpname, namelen, cl_names[i] );
formatex( tmplist, LIST_STR_LEN - 1, "^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t(%d) %s %s:^n", count, "%L", tmpname);
for( j=1; j<=count; j++ )
{
format( tmpname, namelen, cl_names[spec_ids[i][j]]);
formatex( tmpstr, 40, "^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t%s", tmpname );
if( strlen( tmplist ) + strlen( tmpstr ) + ( 11 - j ) < ( LIST_STR_LEN - 1 ) )
format( tmplist, LIST_STR_LEN - 10, "%s%s^n", tmplist, tmpstr );
else
{
format( tmplist, LIST_STR_LEN, "%s...^n", tmplist );
break;
}
}
if( count < 10 )
format( tmplist, LIST_STR_LEN,
"%s^n^n^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^t^tSpecInfo v%s^n",
tmplist, VERSION
);
for( j+=0; j<10; j++ )
format( tmplist, LIST_STR_LEN, "%s%s", tmplist, "^n" );
list_string[i] = tmplist;
}
}
get_players( players, num, "ch" );
for( i=0; i<num; i++ ) clmsg( players[i] );
}
return PLUGIN_HANDLED;
}

public keys_update( )
{
if( !get_pcvar_num( p_enabled ) && !get_pcvar_num( p_keys_enabled ) ) return;

new players[32], num, id, i;
get_players( players, num, "a" );
for( i = 0; i < num; i++ )
{
id = players[i];
formatex( keys_string[id], KEYS_STR_LEN, " ^n^t^t%s^t^t^t%s^n^t%s %s %s^t^t%s",
cl_keys[id] & IN_FORWARD ? "W" : " ",
"%L",
cl_keys[id] & IN_MOVELEFT ? "A" : " ",
cl_keys[id] & IN_BACK ? "S" : " ",
cl_keys[id] & IN_MOVERIGHT ? "D" : " ",
"%L"
);

//Flags stored in string to fill translation char in clmsg function
keys_string[id][0] = 0;
if( cl_keys[id] & IN_JUMP ) keys_string[id][0] |= IN_JUMP;
if( cl_keys[id] & IN_DUCK ) keys_string[id][0] |= IN_DUCK;

cl_keys[id] = 0;
}

new id2;
get_players( players, num, "ch" );
for( i=0; i<num; i++ )
{
id = players[i];
if( is_user_alive( id ) )
{
if( cl_prefs[id] & FL_OWNKEYS ) clmsg( id );
}
else
{
id2 = pev( id, pev_iuser2 );
if( cl_prefs[id] & FL_KEYS && id2 && id2 != id ) clmsg( id );
}
}

}

public server_frame( )
{
if( get_pcvar_num( p_enabled ) && get_pcvar_num( p_keys_enabled ) )
{
new players[32], num, id;
get_players( players, num, "a" );
for( new i = 0; i < num; i++ )
{
id = players[i];
if( get_user_button( id ) & IN_FORWARD )
cl_keys[id] |= IN_FORWARD;
if( get_user_button( id ) & IN_BACK )
cl_keys[id] |= IN_BACK;
if( get_user_button( id ) & IN_MOVELEFT )
cl_keys[id] |= IN_MOVELEFT;
if( get_user_button( id ) & IN_MOVERIGHT )
cl_keys[id] |= IN_MOVERIGHT;
if( get_user_button( id ) & IN_DUCK )
cl_keys[id] |= IN_DUCK;
if( get_user_button( id ) & IN_JUMP )
cl_keys[id] |= IN_JUMP;
}
}
return PLUGIN_CONTINUE
}

public clmsg( id )
{
if( !id ) return;

new prefs = cl_prefs[id];

new bool:show_own = false;
if( is_user_alive( id ) && prefs & FL_OWNKEYS ) show_own = true;

if( is_user_alive( id ) && !show_own )
{
if( prefs & FL_LIST && spec_ids[id][0] && get_pcvar_num( p_list_enabled ) )
{
set_hudmessage(
get_pcvar_num( p_red ),
get_pcvar_num( p_grn ),
get_pcvar_num( p_blu ),
0.7, /*x*/
0.1, /*y*/
0, /*fx*/
0.0, /*fx time*/
1.1, /*hold time*/
0.1, /*fade in*/
0.1, /*fade out*/
3 /*chan*/
);
show_hudmessage( id, list_string[id], id, "SPECTATING" );
}
}
else
{
new id2;
if( show_own ) id2 = id;
else id2 = pev( id, pev_iuser2 );
if( !id2 ) return;

if( prefs & FL_LIST || prefs & FL_KEYS || show_own )
{
set_dhudmessage(
get_pcvar_num( p_red ),
get_pcvar_num( p_grn ),
get_pcvar_num( p_blu ),
0.48, /*x*/
0.14, /*y*/
0, /*fx*/
0.0, /*fx time*/
prefs & FL_KEYS || show_own ? 0.1 : 1.0, /*hold time*/
0.0, /*fade in*/
0.0, /*fade out*/
false /*chan*/
);
new msg[BOTH_STR_LEN + 1];
msg ="^n^n^n^n^n^n^n^n^n^n^n^n";
if( get_pcvar_num( p_keys_enabled ) && ( prefs & FL_KEYS || show_own ) )
{
format( msg, BOTH_STR_LEN, "%s%s", msg, keys_string[id2][1] );
format( msg, BOTH_STR_LEN, msg,
id, keys_string[id2][0] & IN_JUMP ? "JUMP" : "LAME",
id, keys_string[id2][0] & IN_DUCK ? "DUCK" : "LAME"
);
}
show_dhudmessage( id, msg );
}
}
}

public set_hudmsg_flg_notify( )
{
set_hudmessage(
get_pcvar_num( p_red ),
get_pcvar_num( p_grn ),
get_pcvar_num( p_blu ),
-1.0, /*x*/
0.8, /*y*/
0, /*fx*/
0.0, /*fx time*/
3.0, /*hold time*/
0.0, /*fade in*/
0.0, /*fade out*/
-1 /*chan*/
);
}

public toggle_list( id )
{
set_hudmsg_flg_notify( );
cl_prefs[id] ^= FL_LIST;
show_hudmessage( id, "%L", id, cl_prefs[id] & FL_LIST ? "SPEC_LIST_ENABLED" : "SPEC_LIST_DISABLED" );
return PLUGIN_HANDLED;
}

public toggle_keys( id )
{
set_hudmsg_flg_notify( );
cl_prefs[id] ^= FL_KEYS;
show_hudmessage( id, "%L", id, cl_prefs[id] & FL_KEYS ? "SPEC_KEYS_ENABLED" : "SPEC_KEYS_DISABLED" );
return PLUGIN_HANDLED;
}

public toggle_ownkeys( id )
{
set_hudmsg_flg_notify( );
cl_prefs[id] ^= FL_OWNKEYS;
show_hudmessage( id, "%L", id, cl_prefs[id] & FL_OWNKEYS ? "SPEC_OWNKEYS_ENABLED" : "SPEC_OWNKEYS_DISABLED" );
return PLUGIN_HANDLED;
}

public toggle_hide( id, level, cid )
{
if( cmd_access( id, level, cid, 0 ) )
{
set_hudmsg_flg_notify( );
cl_prefs[id] ^= FL_HIDE;
show_hudmessage( id, "%L", id, cl_prefs[id] & FL_HIDE ? "SPEC_HIDE_ENABLED" : "SPEC_HIDE_DISABLED" );
}
return PLUGIN_HANDLED;
}

Потом изменил Showkeys, как мне нужно, здесь уже работает как нужно, но показывает только тому человеку который вызвал включение функции, и только его нажатия.
Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <dhudmessage>

#define PLUGIN "Showkeys"
#define VERSION "2.1(lite)"
#define AUTHOR "coderiz"

new cvar_autostart

new bool:g_plr_showkeys[32]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

cvar_autostart = register_cvar ( "keys_autostart", "0", FCVAR_SERVER)

register_clcmd("say /showkeys","cl_ShowKeys")
register_clcmd("say /sk","cl_ShowKeys")
register_clcmd("say /key","cl_ShowKeys")
register_clcmd("show_keys","cl_ShowKeys")

register_forward(FM_PlayerPreThink, "fwd_PlayerPreThink")
register_forward(FM_ClientPutInServer, "fwd_ClientPutInServer")

}

public cl_ShowKeys (id)
{
new index = id - 1

new arg[10]
read_argv(0, arg, 9)

if(equal(arg, "show_keys"))
{
read_argv(1, arg, 9)

if(equal(arg, "on") || equal(arg, "1"))
{
g_plr_showkeys[index] = true
} else if(equal(arg, "off") || equal(arg, "0"))
{
g_plr_showkeys[index] = false
} else {
client_print(id, print_console, "show_keys <on|off>")
}

return 1
}


if(!is_user_connected(id))
{
g_plr_showkeys[index] = false
return 1
}

if(g_plr_showkeys[index])
{
g_plr_showkeys[index] = false
return 0
}
else
{
g_plr_showkeys[index] = true
return 0
}

return 0
}

public fwd_ClientPutInServer(id)
{
new index = id - 1

if(get_pcvar_num(cvar_autostart) == 1) g_plr_showkeys[index] = true
else g_plr_showkeys[index] = false
}

public fwd_PlayerPreThink(id)
{
static index

index = id - 1

if(is_user_connected(id) && is_user_alive(id) && g_plr_showkeys[index])
{
new buttons = pev(id, pev_button)
new kw[10], ka[10], ks[10], kd[10], kjump[10], kduck[10]

if(buttons & IN_FORWARD)
{
kw = "W"
}
else
{
kw = "."
}

if(buttons & IN_MOVELEFT)
{
ka = "A"
}
else
{
ka = "."
}

if(buttons & IN_MOVERIGHT)
{
kd = "D"
}
else
{
kd = "."
}

if(buttons & IN_BACK)
{
ks = "S"
}
else
{
ks = "."
}

if(buttons & IN_JUMP)
{
kjump = "jump"
}
else
{
kjump = ""
}

if(buttons & IN_DUCK)
{
kduck = "duck"
}
else
{
kduck = ""
}

set_dhudmessage(40, 25, 40, 0.46, 0.80, 0, 0.0, 0.0, 0.0, 0.1, false)
show_dhudmessage(id, " %s %s^n %s %s %s %s", kw, kjump, ka, ks, kd, kduck)

}

return 1
}

В общем в чем вопрос, как сделать, чтобы нажатие клавиш показывалось только спектаторам и мертвым, и так же, те клавиши которые нажимает игрок[b] за которым наблюдаем (т.к это сделано в speinfo).[/b]

Отредактировал: medusa, - 31.5.2015, 21:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя CyberUser
сообщение 11.6.2015, 10:51
Сообщение #2
Стаж: 11 лет

Сообщений: 84
Благодарностей: 2
Полезность: 25

Попробуй дхуд увиличить время и set_task сделать так что бы при выключении дхуда что бы сразу же брало снова и не будет моргать!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя CyberUser
сообщение 11.6.2015, 11:09
Сообщение #3
Стаж: 11 лет

Сообщений: 84
Благодарностей: 2
Полезность: 25

Код:
set_task( 0.1, "keys_update", _, _, _, "b" );
может и из-за этого моргать слишком уж быстро!
Код:
set_task( 1.0, "keys_update", _, _, _, "b" );
так тоже норм!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя medusa
сообщение 22.6.2015, 18:22
Сообщение #4


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Цитата(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)
}

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя kadun
сообщение 22.6.2015, 19:39
Сообщение #5


Стаж: 12 лет

Сообщений: 222
Благодарностей: 43
Полезность: 156

Отличное дополнение для амх будет. Интересно, этим способом можно отловить нажатия del/home и тд? Как античит же Можно использовать :) а то делаешь скрины игроку, а он в игре резко встает и видимо офает свое палево.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя medusa
сообщение 22.6.2015, 19:57
Сообщение #6


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Цитата(kadun @ 22.6.2015, 20:39) *
Отличное дополнение для амх будет. Интересно, этим способом можно отловить нажатия del/home и тд? Как античит же Можно использовать :) а то делаешь скрины игроку, а он в игре резко встает и видимо офает свое палево.

Отловить - так, как это делается с [buttons] IN_JUMP и т.д. с DEL & INS & etc. не выйдет, т.к. нажатия биндов никак не влияет, а выполняется действие , прыжка, присидания и т.д., а DEL & INS & etc. возможно отловить посредством биндов, но на дворе 2015 год, и толку от этого просто нет. Ваша затея устарела лет так на 5-7 :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя medusa
сообщение 24.6.2015, 23:34
Сообщение #7


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Нашел функцию pev_iuser2.
вставил в public fwd_PlayerPreThink(id)
Код:
new Spec;
                Spec = pev(id, pev_iuser2)

Полный код:
Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <dhudmessage>
 
#define PLUGIN "Showkeys"
#define VERSION "2.1(lite)"
#define AUTHOR "coderiz"
 
new cvar_autostart
 
new bool:g_plr_showkeys[32]
 
public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
 
        cvar_autostart = register_cvar ( "keys_autostart", "0", FCVAR_SERVER)
       
        register_clcmd("say /showkeys","cl_ShowKeys")
        register_clcmd("say /sk","cl_ShowKeys")
        register_clcmd("say /key","cl_ShowKeys")
        register_clcmd("show_keys","cl_ShowKeys")
       
        register_forward(FM_PlayerPreThink, "fwd_PlayerPreThink")
        register_forward(FM_ClientPutInServer, "fwd_ClientPutInServer")
       
}
 
public cl_ShowKeys (id)
{
        new index = id - 1
       
        new arg[10]
        read_argv(0, arg, 9)
       
        if(equal(arg, "show_keys"))
        {
                read_argv(1, arg, 9)
               
                if(equal(arg, "on") || equal(arg, "1"))
                {
                        g_plr_showkeys[index] = true
                } else if(equal(arg, "off") || equal(arg, "0"))
                {
                        g_plr_showkeys[index] = false
                } else {
                        client_print(id, print_console, "show_keys <on|off>")
                }
               
                return 1
        }
       
       
        if(!is_user_connected(id))
        {
                g_plr_showkeys[index] = false
                return 1
        }
       
        if(g_plr_showkeys[index])
        {
                g_plr_showkeys[index] = false
                return 0
        }
        else
        {
                g_plr_showkeys[index] = true
                return 0       
        }
       
        return 0
}
 
public fwd_ClientPutInServer(id)
{
        new index = id - 1
       
        if(get_pcvar_num(cvar_autostart) == 1) g_plr_showkeys[index] = true
        else g_plr_showkeys[index] = false     
}
 
public fwd_PlayerPreThink(id)
{
 
        static index
       
        index = id - 1
       
        if(is_user_connected(id) && g_plr_showkeys[index])
        {
                new buttons = pev(id, pev_button)
                new kw[10], ka[10], ks[10], kd[10], kjump[10], kduck[10]
               
                new Spec;
                Spec = pev(id, pev_iuser2)
 
                if(buttons & IN_FORWARD)
                {
                        kw = "W"
                }
                else
                {
                        kw = "."
                }
               
                if(buttons & IN_MOVELEFT)
                {
                        ka = "A"
                }
                else
                {
                        ka = "."
                }
               
                if(buttons & IN_MOVERIGHT)
                {
                        kd = "D"
                }
                else
                {
                        kd = "."
                }
               
                if(buttons & IN_BACK)
                {
                        ks = "S"
                }
                else
                {
                        ks = "."
                }
               
                if(buttons & IN_JUMP)
                {
                        kjump = "jump"
                }
                else
                {
                        kjump = ""
                }
               
                if(buttons & IN_DUCK)
                {
                        kduck = "duck"
                }
                else
                {
                        kduck = ""
                }
               
                set_dhudmessage(40, 25, 40, 0.46, 0.55, 0, 0.0, 0.0, 0.0, 0.1, false)
                show_dhudmessage(id, "      %s      %s^n    %s %s %s    %s", kw, kjump, ka, ks, kd, kduck)
               
        }
       
        return 1
}

Теперь не нажатые клавиши стали показывается когда в спектаторах следишь за игроком, но проблема в том что, работает когда игрок нажимает только DUCK , только эта информация отображается, у остальных клавиш статично точки не меняються.

-- -- -- -- -- -- -- -- -- --

Вот, нашел интересный Stock но не знаю как правильно его реализовать.
Код:
stock PlayerInfo(id)
{
        if(!is_user_alive(id)) return pev(id, pev_iuser2)
        return id
}

И как добиться того, чтобы живым не показывался Showkeys а показывался только в тот момент когда смотришь за кем-то.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя medusa
сообщение 25.6.2015, 13:58
Сообщение #8


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Все решил. Остался только этот баг. " работает когда игрок нажимает только DUCK , только эта информация отображается, у остальных клавиш статично точки не меняються." помогите пожалуйста его исправить, идей совсем не осталось.

Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <dhudmessage>

#define PLUGIN "Showkeys"
#define VERSION "2.1(lite)"
#define AUTHOR "coderiz"

new cvar_autostart

new bool:g_plr_showkeys[32]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

cvar_autostart = register_cvar ( "keys_autostart", "0", FCVAR_SERVER)

register_clcmd("say /showkeys","cl_ShowKeys")
register_clcmd("say /sk","cl_ShowKeys")
register_clcmd("say /key","cl_ShowKeys")
register_clcmd("show_keys","cl_ShowKeys")

register_forward(FM_PlayerPreThink, "fwd_PlayerPreThink")
register_forward(FM_ClientPutInServer, "fwd_ClientPutInServer")

}

public cl_ShowKeys (id)
{
new index = id - 1

new arg[10]
read_argv(0, arg, 9)

if(equal(arg, "show_keys"))
{
read_argv(1, arg, 9)

if(equal(arg, "on") || equal(arg, "1"))
{
g_plr_showkeys[index] = true
} else if(equal(arg, "off") || equal(arg, "0"))
{
g_plr_showkeys[index] = false
} else {
client_print(id, print_console, "show_keys <on|off>")
}

return 1
}


if(!is_user_connected(id))
{
g_plr_showkeys[index] = false
return 1
}

if(g_plr_showkeys[index])
{
g_plr_showkeys[index] = false
return 0
}
else
{
g_plr_showkeys[index] = true
return 0
}

return 0
}

public fwd_ClientPutInServer(id)
{
new index = id - 1

if(get_pcvar_num(cvar_autostart) == 1) g_plr_showkeys[index] = true
else g_plr_showkeys[index] = false
}

public fwd_PlayerPreThink(id)
{

static index

index = id - 1

new buttons = pev(id, pev_button)
new kw[10], ka[10], ks[10], kd[10], kjump[10], kduck[10]

if(buttons & IN_FORWARD)
{
kw = "W"
}
else
{
kw = "."
}

if(buttons & IN_MOVELEFT)
{
ka = "A"
}
else
{
ka = "."
}

if(buttons & IN_MOVERIGHT)
{
kd = "D"
}
else
{
kd = "."
}

if(buttons & IN_BACK)
{
ks = "S"
}
else
{
ks = "."
}

if(buttons & IN_JUMP)
{
kjump = "jump"
}
else
{
kjump = ""
}

if(buttons & IN_DUCK)
{
kduck = "duck"
}
else
{
kduck = ""
}

if(is_user_connected(id) && pev(id, pev_iuser2) && g_plr_showkeys[index])
{
set_dhudmessage(40, 25, 40, 0.46, 0.55, 0, 0.0, 0.0, 0.0, 0.1, false)
show_dhudmessage(id, " %s %s^n %s %s %s %s", kw, kjump, ka, ks, kd, kduck)
}
return 1
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fintok
сообщение 25.6.2015, 15:57
Сообщение #9


Стаж: 16 лет

Сообщений: 756
Благодарностей: 294
Полезность: 638

medusa, отсылать dhudmessage используя функцию FM_PlayerPreThink - это сильно. Надо было сразу использовать функцию FM_AddToFullPack, чтобы раз и навсегда избавиться от своих игроков crazy.gif

Функция FM_PlayerPreThink выполняется ~100+ раз в секунду, обрабатывая каждый кадр игрока.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя medusa
сообщение 25.6.2015, 16:43
Сообщение #10


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Цитата(Fintok @ 25.6.2015, 16:57) *
medusa, отсылать dhudmessage используя функцию FM_PlayerPreThink - это сильно. Надо было сразу использовать функцию FM_AddToFullPack, чтобы раз и навсегда избавиться от своих игроков crazy.gif

Функция FM_PlayerPreThink выполняется ~100+ раз в секунду, обрабатывая каждый кадр игрока.

оу, ясно, спасибо за информацию. Ну раз такое дело, прийдется юзать set_task. Не знаете как можно будет изменить плагин SpecInfo чтобы в дхуд , он обновлялся корректно, а то я как ни пробую либо символы друг на друга накладываются, либо он моргает очень сильно за счет обновления постоянного, может есть како нибудь способ получше выводить подобную информацию.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fintok
сообщение 25.6.2015, 17:00
Сообщение #11


Стаж: 16 лет

Сообщений: 756
Благодарностей: 294
Полезность: 638

medusa, что бы сообщения не накладывались, нужно использовать очистку каналов.
Т.е. перед отправкой нового сообщения нужно отправить 8 пустых сообщений, метод конечно ватный, но других вариантов вроде бы нет

Код:
public send_dhudmsg(id)
{
clear_dhudmsg(id)

set_dhudmessage(0, 255, 0, -1.0, -1.0, 2, 1.0, 1.0, 0.1, 1.0, false)
show_dhudmessage(id, "Мое сообщение")
}

stock clear_dhudmsg(id)
{
for(new i = 0; i < 8; i++)
show_dhudmessage(id, "")
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя medusa
сообщение 25.6.2015, 17:29
Сообщение #12


Стаж: 11 лет

Сообщений: 50
Благодарностей: 40
Полезность: 536

Fintok спасибо, и правда теперь текст не накладывается осталось одолеть мерцание :) пошаманю над переменными.

Отредактировал: Bloo, - 25.6.2015, 17:31
Причина: Выдано устное предупреждение!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: