selamlar izleyici'ye attıgım kisiler izledikleri kisilerin klavye tuslarını goruyor fakat pluginde yapmak istediğim değişiklikler var bunları yapabilen olursa çok sevinirim. öncelikle benim kullandıgım pluginin tasarımı attıgım 2. fotoğraftaki gibi olmasını istiyorum.. ekstradan hız göstergeci ve fps göstergeci de eklenirse çok güzel olur. tesekkur ederım.
1- https://hizliresim.com/nqefksz
2- https://hizliresim.com/lhc0sed
1- https://hizliresim.com/nqefksz
2- https://hizliresim.com/lhc0sed
Kod:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <reapi>
#define PLUGIN "SpecInfo"
#define VERSION "1.0"
#define AUTHOR "mi0"
#define LISTR 45
#define LISTG 89
#define LISTB 116
#define LISTX 0.7
#define LISTY 0.1
#define LISTFREQ 10
enum PlayerSettings
{
Name[32],
bool:Keys,
bool:KeysSpec,
KeysString[192],
bool:List,
bool:ListHide,
SpectatingIndex,
ListString[256],
WatchingCount
}
new g_iThinkingEntity, iSyncHudListObj, iSyncHudKeysObj
new g_ePlayerSettings[MAX_PLAYERS + 1][PlayerSettings]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
iSyncHudListObj = CreateHudSyncObj()
iSyncHudKeysObj = CreateHudSyncObj()
g_iThinkingEntity = rg_create_entity("info_target")
set_entvar(g_iThinkingEntity, var_classname, "SpecInfo_Entity")
set_entvar(g_iThinkingEntity, var_nextthink, get_gametime() + 10.0)
RegisterHam(Ham_Think, "info_target", "OnEntityThink")
}
public client_connect(id)
{
get_user_name(id, g_ePlayerSettings[id][Name], charsmax(g_ePlayerSettings[][Name]))
g_ePlayerSettings[id][List] = true
g_ePlayerSettings[id][ListHide] = false
g_ePlayerSettings[id][Keys] = false
g_ePlayerSettings[id][KeysSpec] = true
Func_ClearStorages(id)
}
public client_infochanged(id)
{
get_user_info(id, "name", g_ePlayerSettings[id][Name], charsmax(g_ePlayerSettings[][Name]))
}
public OnEntityThink(id)
{
if (id != g_iThinkingEntity) {
return;
}
static iListCounter
if (++iListCounter >= LISTFREQ)
{
Func_UpdateList()
iListCounter = 0
}
Func_UpdateKeys()
set_entvar(g_iThinkingEntity, var_nextthink, get_gametime() + 0.1)
}
Func_UpdateKeys()
{
new iPlayers[MAX_PLAYERS], iPlayersNum
get_players_ex(iPlayers, iPlayersNum)
new iTargetIndex
new bool:bNeeded[33], iSpecIndex[33]
for (new i = 0; i < iPlayersNum; i++)
{
iTargetIndex = iPlayers[i]
if (is_user_alive(iTargetIndex))
{
if (g_ePlayerSettings[iTargetIndex][Keys])
{
bNeeded[iTargetIndex] = true
}
}
else
{
if (!g_ePlayerSettings[iTargetIndex][KeysSpec] ||
!is_user_alive((iSpecIndex[iTargetIndex] = get_entvar(iTargetIndex, var_iuser2))) ||
bNeeded[iSpecIndex[iTargetIndex]])
{
continue
}
bNeeded[iSpecIndex[iTargetIndex]] = true
}
}
for (new i; i < iPlayersNum; i++)
{
iTargetIndex = iPlayers[i]
if (!bNeeded[iTargetIndex])
{
continue
}
Func_FormatButtons(iTargetIndex)
}
new iObserved
for (--iPlayersNum; iPlayersNum >= 0; iPlayersNum--)
{
iTargetIndex = iPlayers[iPlayersNum]
if (is_user_alive(iTargetIndex) && g_ePlayerSettings[iTargetIndex][Keys])
{
iObserved = iTargetIndex
}
else if (g_ePlayerSettings[iTargetIndex][KeysSpec])
{
iObserved = iSpecIndex[iTargetIndex]
}
else
{
continue
}
Func_ShowKeys(iTargetIndex, iObserved)
}
}
Func_FormatButtons(id)
{
new iButtons = get_entvar(id, var_button)
// definately didnt steal that HUH
formatex(g_ePlayerSettings[id][KeysString], charsmax(g_ePlayerSettings[][KeysString]), "^n^t^t%s^t^t^t%s^n^t%s %s %s^t^t%s",
iButtons & IN_FORWARD ? "W" : " .",
iButtons & IN_JUMP ? "Jump" : " -",
iButtons & IN_MOVELEFT ? "A" : ".",
iButtons & IN_BACK ? "S" : ".",
iButtons & IN_MOVERIGHT ? "D" : ".",
iButtons & IN_DUCK ? "Duck" : " -"
)
}
Func_ShowKeys(iObs, iObsed)
{
set_hudmessage(0, 30, 200, 0.48, 0.40, 0, 0.0, 0.1, 0.1, 0.0)
ShowSyncHudMsg(iObs, iSyncHudKeysObj, g_ePlayerSettings[iObsed][KeysString])
}
Func_UpdateList()
{
new iPlayers[MAX_PLAYERS], iPlayersNum, iPlayersDead[MAX_PLAYERS], iPlayersDeadNum
new iTargetIndex, iSpectatingIndex
get_players_ex(iPlayers, iPlayersNum, GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV)
for (new i; i < iPlayersNum; i++)
{
Func_ClearStorages(iPlayers[i])
}
get_players_ex(iPlayersDead, iPlayersDeadNum, GetPlayers_ExcludeAlive | GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV)
for (new i; i < iPlayersDeadNum; i++)
{
iTargetIndex = iPlayersDead[i]
if ((iSpectatingIndex = get_entvar(iTargetIndex, var_iuser2)) && iSpectatingIndex != iTargetIndex)
{
if (!g_ePlayerSettings[iTargetIndex][ListHide])
{
format(g_ePlayerSettings[iSpectatingIndex][ListString], charsmax(g_ePlayerSettings[][ListString]),
"%s^n^t%s", g_ePlayerSettings[iSpectatingIndex][ListString], g_ePlayerSettings[iTargetIndex][Name])
}
g_ePlayerSettings[iSpectatingIndex][WatchingCount]++
g_ePlayerSettings[iTargetIndex][SpectatingIndex] = iSpectatingIndex
}
}
for (new i; i < iPlayersNum; i++)
{
iTargetIndex = iPlayers[i]
if (is_user_alive(iTargetIndex))
{
Func_FormatList(iTargetIndex)
}
}
for (--iPlayersNum; iPlayersNum >= 0; iPlayersNum--)
{
iTargetIndex = iPlayers[iPlayersNum]
if (g_ePlayerSettings[iTargetIndex][List] && g_ePlayerSettings[is_user_alive(iTargetIndex) ? iTargetIndex : g_ePlayerSettings[iTargetIndex][SpectatingIndex]][WatchingCount])
{
Func_ShowList(iTargetIndex, is_user_alive(iTargetIndex) ? iTargetIndex : g_ePlayerSettings[iTargetIndex][SpectatingIndex])
}
}
}
Func_FormatList(id)
{
format(g_ePlayerSettings[id][ListString], charsmax(g_ePlayerSettings[][ListString]), "Watching %s [%i]:%s",
g_ePlayerSettings[id][Name], g_ePlayerSettings[id][WatchingCount], g_ePlayerSettings[id][ListString])
}
Func_ShowList(id, iListOwner)
{
set_hudmessage(LISTR, LISTG, LISTB, LISTX, LISTY, 0, 0.0, 1.0)
ShowSyncHudMsg(id, iSyncHudListObj, g_ePlayerSettings[iListOwner][ListString])
}
Func_ClearStorages(id)
{
g_ePlayerSettings[id][SpectatingIndex] = 0
g_ePlayerSettings[id][WatchingCount] = 0
copy(g_ePlayerSettings[id][ListString], charsmax(g_ePlayerSettings[][ListString]), "")
})

