PHP Code:
/*
Hierarchy:
----------
Ham_Player_PreThink
Ham_Player_UpdateClientData
PM_Move (client camera movement)
Ham_Item_ItemSlot
Ham_Player_PostThink
To do list:
-----------
[ ] Find fakemeta forward(s) (for/closest to) PM_Move or equivalent to Ham_Item_ItemSlot
[ ] Use fakemeta/hamsandwich only if possible
[ ] Customizability
[ ] Optimize
*/
#include <amxmodx>
#include <bitsums>
#include <engine>
#include <hamsandwich>
#include <zombieplaguenightmare>
// Uncomment to enable debugging
// Bits:
// 1 = log_to_file
// 2 = print_center
// 4 = print_console
// 8 = print_chat
// 16 = hud
//#define DefDebug 17
#if defined DefDebug
#if DefDebug & 1
new g_szDebugFile[] = "FreezeCamera.log";
#endif
#endif
new g_bitFrozen, Float:g_fAnglesOriginal[33][3]/*, Float:g_fAnglesViewOriginal[33][3]*/, g_pCvarClCmdStrafe;
public plugin_init()
{
register_plugin("[ZPNM] Freeze camera", "0.1.6", "schmurgel1983, D i 5 7 i n c T")
#if defined DefDebug
#if defined _zombieplaguenightmare_included
register_clcmd("say /f", "fw_ClCmdSayF")
#endif
#endif
RegisterHam(Ham_Spawn, "player", "fw_HamPlayerSpawn_Post", 1)
RegisterHam(Ham_Item_ItemSlot, "player", "fw_HamItemItemSlot")
g_pCvarClCmdStrafe = register_cvar("zpnm_freeze_cam_clcmd_strafe", "0")
}
#if defined _zombieplaguenightmare_included
public zpnm_register_ham_czbots(id)
{
RegisterHamFromEntity(Ham_Spawn, id, "fw_HamPlayerSpawn_Post", 1)
RegisterHamFromEntity(Ham_Item_ItemSlot, id, "fw_HamItemItemSlot")
}
#if defined DefDebug
public fw_ClCmdSayF(id)
zpnm_set_user_frozen(id, !bitsum_get(g_bitFrozen, id) ? 1 : 0)
#endif
#endif
public client_disconnect(id)
if (bitsum_get(g_bitFrozen, id))
zp_user_unfrozen(id, 0)
public fw_HamPlayerSpawn_Post(id)
client_disconnect(id)
public zpnm_user_frozen(id)
{
bitsum_add(g_bitFrozen, id)
entity_get_vector(id, /*EV_VEC_angles*/EV_VEC_v_angle, g_fAnglesOriginal[id])
// entity_get_vector(id, EV_VEC_v_angle, g_fAnglesViewOriginal[id])
#if defined DefDebug
#if DefDebug & 1
if (!is_user_bot(id))
log_to_file(g_szDebugFile, "[Player %d] Frozen. Original Angles: %.2f, %.2f, %.2f"/* | Original ViewAngles: %.2f, %.2f, %.2f*/, id, g_fAnglesOriginal[id][0], g_fAnglesOriginal[id][1], g_fAnglesOriginal[id][2]/*, g_fAnglesViewOriginal[id][0], g_fAnglesViewOriginal[id][1], g_fAnglesViewOriginal[id][2]*/)
#endif
#endif
}
public zp_user_unfrozen(id)
{
bitsum_del(g_bitFrozen, id)
client_cmd(id, "-strafe")
}
public fw_HamItemItemSlot(id)
{
if (!bitsum_get(g_bitFrozen, id))
return;
#if defined DefDebug
if (!is_user_bot(id))
{
static Float:fAngles[3], Float:fAnglesView[3];
entity_get_vector(id, EV_VEC_angles, fAngles)
entity_get_vector(id, EV_VEC_v_angle, fAnglesView)
if (fAnglesView[0] != g_fAnglesOriginal[id][0] || fAnglesView[1] != g_fAnglesOriginal[id][1]
|| fAnglesView[2] != g_fAnglesOriginal[id][2]/* || fAngles[0] != g_fAnglesViewOriginal[id][0]
|| fAngles[1] != g_fAnglesViewOriginal[id][1] || fAngles[2] != g_fAnglesViewOriginal[id][2]*/)
{
#if DefDebug & 1
log_to_file(g_szDebugFile, "[Player %d] Think. Angles: %.2f, %.2f, %.2f | ViewAngles: %.2f, %.2f, %.2f", id, fAngles[0], fAngles[1], fAngles[2], fAnglesView[0], fAnglesView[1], fAnglesView[2])
#endif
#if DefDebug & 4
client_print(id, print_console, "[Player %d] Think. Angles: %.2f, %.2f, %.2f | ViewAngles: %.2f, %.2f, %.2f", id, fAngles[0], fAngles[1], fAngles[2], fAnglesView[0], fAnglesView[1], fAnglesView[2])
#endif
#if DefDebug & 8
client_print(id, print_chat, "[Player %d] Think. Angles: %.2f, %.2f, %.2f | ViewAngles: %.2f, %.2f, %.2f", id, fAngles[0], fAngles[1], fAngles[2], fAnglesView[0], fAnglesView[1], fAnglesView[2])
#endif
}
#if DefDebug & 2
client_print(id, print_center, "[Player %d] Think. Angles: %.2f, %.2f, %.2f | ViewAngles: %.2f, %.2f, %.2f", id, fAngles[0], fAngles[1], fAngles[2], fAnglesView[0], fAnglesView[1], fAnglesView[2])
#endif
#if DefDebug & 16
static msgSyncHUD;
if (!msgSyncHUD)
msgSyncHUD = CreateHudSyncObj();
set_hudmessage(255, 0, 255, -1.0, -1.0, 0, 0.0, 3.0, 2.0, 1.0, 4)
ShowSyncHudMsg(id, msgSyncHUD, "[Player %d] Think.^nAngles: %.2f, %.2f, %.2f^nViewAngles: %.2f, %.2f, %.2f", id, fAngles[0], fAngles[1], fAngles[2], fAnglesView[0], fAnglesView[1], fAnglesView[2])
#endif
}
#endif
// entity_set_vector(id, EV_VEC_v_angle, g_fAnglesViewOriginal[id])
entity_set_vector(id, EV_VEC_angles, g_fAnglesOriginal[id])
entity_set_int(id, EV_INT_fixangle, 1)
// Not a very good idea since the client can have a
// connection fail and we won't be able to send -strafe
if (get_pcvar_num(g_pCvarClCmdStrafe))
client_cmd(id, "+strafe")
}