new g_iMenuPlayers[33][32], g_iMenuPosition[33], szPlayerHook[33], szBreakEnd[33];
new g_pEndSpriteBreak[4], g_LoadColor[81], g_LoadSprite[81], g_LoadSound[81], bool:g_iHookEnable = true;
new szPlayerColor[33], szPlayerSprite[33], szPlayerSize[33], szPlayerSound[33], szPlayerSpeed[33], szPlayerView[33], szPlayerEndSprite[33], szPlayerHookOrigin[33][3];
new g_HookColorNum, g_HookColorDefault, g_HookColorName[999][64], g_HookColorRGB[999][4];
new g_HookSpriteNum, g_HookSpriteDefault, g_HookSpriteName[999][64], g_HookSpriteFile[999][64], g_HookSpriteMsg[999];
new g_HookSoundNum, g_HookSoundDefault, g_HookSoundName[999][64], g_HookSoundFile[999][64];
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("+hook", "HookOn")
register_clcmd("-hook", "HookOff")
register_clcmd("say /hook", "Ar4_HookMenu")
register_dictionary("UltraHook.txt")
register_menucmd(register_menuid("Show_HookMenu"), 1023, "Handle_HookMenu");
register_menucmd(register_menuid("Show_HookTargetMenu"), 1023, "Handle_HookTargetMenu");
register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0");
for(new id = 1; id <= get_maxplayers(); id++)
if(get_user_flags(id) & FlagOne)
LimitOne[id] = LimitFlagOne;
get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
formatex(g_LoadDir, charsmax( g_LoadDir ), "%s/UltraHook", g_LoadDir)
if(!dir_exists( g_LoadDir ))
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_PRECACHE")
set_fail_state( szError )
formatex(g_LoadColor, charsmax( g_LoadColor ), "%s/hook_color.ini", g_LoadDir)
formatex(g_LoadSprite, charsmax( g_LoadSprite ), "%s/hook_sprite.ini", g_LoadDir)
formatex(g_LoadSound, charsmax( g_LoadSound ), "%s/hook_sound.ini", g_LoadDir)
if(!file_exists( g_LoadColor ))
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_COLOR")
set_fail_state( szError )
if(!file_exists( g_LoadSprite ))
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_SPRITE")
set_fail_state( szError )
if(!file_exists( g_LoadSound ))
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_SOUND")
set_fail_state( szError )
set_task(0.5, "LoadColor")
set_task(0.5, "LoadSprite")
set_task(0.5, "LoadSound")
new szParse[320], szParseName[64], szParseFile[256], szLine, szNum, szNums
for(szLine=0;read_file(g_LoadSprite, szLine, szParse, charsmax( szParse ), szNum);szLine++)
if(szNum > 0 && szParse[0] != ';')
parse(szParse, szParseFile, charsmax( szParseFile ), szParseFile, charsmax( szParseFile ))
g_HookSpriteMsg[szNums] = precache_model( szParseFile )
for(szLine=0;read_file(g_LoadSound, szLine, szParse, charsmax( szParse ), szNum);szLine++)
if(szNum > 0 && szParse[0] != ';')
parse(szParse, szParseFile, charsmax( szParseFile ), szParseFile, charsmax( szParseFile ))
precache_sound( szParseFile )
szParseName = szParseName
g_pEndSpriteBreak[0] = engfunc(EngFunc_PrecacheModel, "sprites/UltraHook/end_7.spr");
g_pEndSpriteBreak[1] = engfunc(EngFunc_PrecacheModel, "sprites/UltraHook/end_6.spr");
g_pEndSpriteBreak[2] = engfunc(EngFunc_PrecacheModel, "sprites/UltraHook/end_3.spr");
g_pEndSpriteBreak[3] = engfunc(EngFunc_PrecacheModel, "sprites/UltraHook/end_4.spr");
new szParse[256], szParseName[64], szParseColor[32], szParseDefault[32], szParseR[32], szParseG[32], szParseB[32], szParseDefaultNum, szLine, szNum
for(szLine=0;read_file(g_LoadColor, szLine, szParse, charsmax( szParse ), szNum);szLine++)
if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
parse(szParse, szParseName, charsmax( szParseName ), szParseColor, charsmax( szParseColor ), szParseDefault, charsmax( szParseDefault ))
parse(szParseColor, szParseR, charsmax( szParseR ), szParseG, charsmax( szParseG ), szParseB, charsmax( szParseB ))
g_HookColorName[g_HookColorNum] = szParseName
g_HookColorRGB[g_HookColorNum][0] = str_to_num( szParseR )
g_HookColorRGB[g_HookColorNum][1] = str_to_num( szParseG )
g_HookColorRGB[g_HookColorNum][2] = str_to_num( szParseB )
szParseDefaultNum = str_to_num( szParseDefault )
if(szParseDefaultNum && !g_HookColorDefault) g_HookColorDefault = g_HookColorNum
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOCOLOR")
set_fail_state( szError )
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOCOLORDEF")
set_fail_state( szError )
new szParse[256], szParseName[64], szParseFile[32], szParseDefault[32], szParseDefaultNum, szLine, szNum
for(szLine=0;read_file(g_LoadSprite, szLine, szParse, charsmax( szParse ), szNum);szLine++)
if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
parse(szParse, szParseName, charsmax( szParseName ), szParseFile, charsmax( szParseFile ), szParseDefault, charsmax( szParseDefault ))
g_HookSpriteName[g_HookSpriteNum] = szParseName
g_HookSpriteFile[g_HookSpriteNum] = szParseFile
szParseDefaultNum = str_to_num( szParseDefault )
g_HookSpriteDefault = g_HookSpriteNum
server_print("fsdfsd - %d - %d", g_HookSpriteDefault, g_HookSpriteNum)
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSPRITE")
set_fail_state( szError )
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSPRITEDEF")
set_fail_state( szError )
new szParse[256], szParseName[64], szParseFile[32], szParseDefault[32], szParseDefaultNum, szLine, szNum
for(szLine=0;read_file(g_LoadSound, szLine, szParse, charsmax( szParse ), szNum);szLine++)
if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
parse(szParse, szParseName, charsmax( szParseName ), szParseFile, charsmax( szParseFile ), szParseDefault, charsmax( szParseDefault ))
g_HookSoundName[g_HookSoundNum] = szParseName
g_HookSoundFile[g_HookSoundNum] = szParseFile
szParseDefaultNum = str_to_num( szParseDefault )
if(szParseDefaultNum && !g_HookSoundDefault) g_HookSoundDefault = g_HookSoundNum
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSOUND")
set_fail_state( szError )
formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSOUNDDEF")
set_fail_state( szError )
public client_putinserver(id)
if(get_user_flags(id) & FlagOne)
szPlayerColor[id] = g_HookColorDefault
szPlayerSprite[id] = g_HookSpriteDefault
szPlayerSound[id] = g_HookSoundDefault
szPlayerEndSprite[id] = 0
public client_disconnect(id)
szPlayerHook[id] = false;
if(get_user_flags(id) & FlagOne)
return Show_HookMenu(id);
} else ChatColor(id, "%L", id, "JBE_MENU_AR4_MODE_NOACCESS");
new szMenu[512], iKeys = (1<<9), iLen = formatex(szMenu, charsmax(szMenu), "%L^n^n", id, "JBE_MENU_AR4_MODE_MAIN_TITLE")
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w1\r] \w%L^n", id, "JBE_MENU_AR4_MODE_COLOR", g_HookColorName[szPlayerColor[id]]);
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_COLOR_FALLS", g_HookColorName[szPlayerColor[id]]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w2\r] \w%L^n", id, "JBE_MENU_AR4_MODE_HOOK", g_HookSpriteName[szPlayerSprite[id]]);
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_HOOK_FALLS", g_HookSpriteName[szPlayerSprite[id]]);
case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_SIZE");
case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_SIZE");
case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_SIZE");
case 3: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_3_SIZE");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_SIZE_FALLS");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w4\r] \w%L^n", id, "JBE_MENU_AR4_MODE_SOUND", g_HookSoundName[szPlayerSound[id]]);
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_SOUND_FALLS", g_HookSoundName[szPlayerSound[id]]);
switch(szPlayerSpeed[id])
case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_SPEED");
case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_SPEED");
case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_SPEED");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_1_SPEED_FALLS");
case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_VIEW");
case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_VIEW");
case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_VIEW");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_VIEW_FALLS");
switch(szPlayerEndSprite[id])
case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_END");
case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_END");
case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_END");
case 3: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_3_END");
case 4: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_4_END");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_END_FALLS");
if(get_user_flags(id) & FlagTwo && g_iHookEnable)
if(g_iHookEnable) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w8\r] \w%L^n", id, "JBE_MENU_AR4_MODE_HOOK_TARGET_MENU");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_HOOK_TARGET_MENU_FALLS");
if(get_user_flags(id) & FlagTwo)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w9\r] \w%L^n", id, g_iHookEnable ? "JBE_AR4_MODE_HOOK_ENABLE" : "JBE_AR4_MODE_HOOK_DISABLE");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] %L^n", id, g_iHookEnable ? "JBE_AR4_MODE_HOOK_ENABLE" : "JBE_AR4_MODE_HOOK_DISABLE");
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w0\r] \w%L", id, "JBE_MENU_AR4_MODE_EXIT");
return show_menu(id, iKeys, szMenu, -1, "Show_HookMenu");
public Handle_HookMenu(id, iKey)
if(szPlayerColor[id] == g_HookColorNum + 1) szPlayerColor[id] = 1;
if(szPlayerSprite[id] == g_HookSpriteNum + 1) szPlayerSprite[id] = 1
if(szPlayerSize[id] == 4) szPlayerSize[id] = 0
if(szPlayerSound[id] == g_HookSoundNum + 1) szPlayerSound[id] = 1
if(szPlayerSpeed[id] == 3) szPlayerSpeed[id] = 0
if(szPlayerView[id] == 3) szPlayerView[id] = 0
if(szPlayerEndSprite[id] == 5) szPlayerEndSprite[id] = 0
case 7: if(g_iHookEnable) return Cmd_HookTargetMenu(id);
new szName[32]; get_user_name(id, szName, charsmax(szName))
ChatColor(0, "%L", id, "JBE_MENU_AR4_MODE_HOOK_OFF_CHAT", szName)
ChatColor(0, "%L", id, "JBE_MENU_AR4_MODE_HOOK_ON_CHAT", szName)
case 9: return PLUGIN_HANDLED;
return Show_HookMenu(id);
public Cmd_HookTargetMenu(id) return Show_HookTargetMenu(id, g_iMenuPosition[id] = 0);
Show_HookTargetMenu(id, iPos)
if(iPos < 0 || !is_user_connected(id)) return PLUGIN_HANDLED;
for(new i = 1; i <= 32; i++)
if(!is_user_connected(i)) continue;
g_iMenuPlayers[id][iPlayersNum++] = i;
new iStart = iPos * PLAYERS_PER_PAGE;
if(iStart > iPlayersNum) iStart = iPlayersNum;
iStart = iStart - (iStart % 8);
g_iMenuPosition[id] = iStart / PLAYERS_PER_PAGE;
new iEnd = iStart + PLAYERS_PER_PAGE;
if(iEnd > iPlayersNum) iEnd = iPlayersNum;
new szMenu[512], iLen, iPagesNum = (iPlayersNum / PLAYERS_PER_PAGE + ((iPlayersNum % PLAYERS_PER_PAGE) ? 1 : 0));
ChatColor(id, "%L", id, "JBE_HOOK_AR4_MODE_PLAYER");
default: iLen = formatex(szMenu, charsmax(szMenu), "\y%L^n^n", id, "JBE_HOOK_AR4_MODE_TARGET_HOOK", iPos + 1, iPagesNum);
new szName[32], i, iKeys = (1<<9), b;
for(new a = iStart; a < iEnd; a++)
i = g_iMenuPlayers[id][a];
get_user_name(i, szName, charsmax(szName));
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w%d\r] \w%s %L^n", ++b, szName, i, szPlayerHook[i] ? "JBE_HOOK_AR4_MODE_HOOK_TAKE" : "JBE_HOOK_AR4_MODE_HOOK_GIVE");
for(new i = b; i < PLAYERS_PER_PAGE; i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w9\r] \w%L^n\r[\w0\r] \w%L", id, "JBE_MENU_AR4_MODE_NEXT", id, iPos ? "JBE_MENU_AR4_MODE_BACK" : "JBE_MENU_AR4_MODE_EXIT");
else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r[\w0\r] \w%L", id, iPos ? "JBE_MENU_AR4_MODE_BACK" : "JBE_MENU_AR4_MODE_EXIT");
return show_menu(id, iKeys, szMenu, -1, "Show_HookTargetMenu");
public Handle_HookTargetMenu(id, iKey)
case 8: return Show_HookTargetMenu(id, ++g_iMenuPosition[id]);
case 9: return Show_HookTargetMenu(id, --g_iMenuPosition[id]);
new iTarget = g_iMenuPlayers[id][g_iMenuPosition[id] * PLAYERS_PER_PAGE + iKey];
new szName[32], szTargetName[32];
get_user_name(id, szName, charsmax(szName))
get_user_name(iTarget, szTargetName, charsmax(szTargetName))
if(!szPlayerHook[iTarget])
szPlayerSpeed[iTarget] = szPlayerSpeed[id]
szPlayerSize[iTarget] = szPlayerSize[id]
szPlayerColor[iTarget] = szPlayerColor[id]
szPlayerSound[iTarget] = szPlayerSound[id]
szPlayerSprite[iTarget] = szPlayerSprite[id]
szPlayerEndSprite[iTarget] = szPlayerEndSprite[id]
szPlayerView[iTarget] = szPlayerView[id]
szPlayerHook[iTarget] = true
ChatColor(0, "%L", LANG_PLAYER, "JBE_HOOK_AR4_MODE_HOOK_GIVE_CHAT", szName, szTargetName)
szPlayerHook[iTarget] = false
ChatColor(0, "%L", LANG_PLAYER, "JBE_HOOK_AR4_MODE_HOOK_TAKE_CHAT", szName, szTargetName)
return Show_HookTargetMenu(id, g_iMenuPosition[id]);
if(get_user_flags(id) & FlagOne)
if(is_user_alive(id) && szPlayerHook[id] && g_iHookEnable)
get_user_origin(id, szPlayerHookOrigin[id], 3)
if(callfunc_begin("detect_cheat", "prokreedz.amxx") == 1)
callfunc_push_str("Hook")
emit_sound(id, CHAN_STATIC, g_HookSoundFile[szPlayerSound[id]], 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(0.1, "HookTask", id, "", 0, "ab")
szBreakEnd[id] = szPlayerEndSprite[id] + 1;
if(get_user_flags(id) & FlagOne)
ChatColor(id, "%L", LANG_PLAYER, "JBE_HOOK_LEFT_ONE", LimitOne[id], LimitFlagOne)
} else ChatColor(id, "%L", LANG_PLAYER, "JBE_HOOK_END")
} else ChatColor(id, "%L", id, "JBE_MENU_AR4_MODE_NOACCESS");
if(!is_user_connected(id) || !is_user_alive(id)) RemoveHook(id)
new szOrigin[3], Float:szVelocity[3]
get_user_origin(id, szOrigin)
new szDistance = get_distance(szPlayerHookOrigin[id], szOrigin)
if(szPlayerSpeed[id] == 0)
szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 280 / szDistance)
szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 280 / szDistance)
szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 280 / szDistance)
else if(szPlayerSpeed[id] == 1)
szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 150 / szDistance)
szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 150 / szDistance)
szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 150 / szDistance)
else if(szPlayerSpeed[id] == 2)
szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 400 / szDistance)
szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 400 / szDistance)
szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 400 / szDistance)
entity_set_vector(id, EV_VEC_velocity, szVelocity)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_coord(szPlayerHookOrigin[id][0])
write_coord(szPlayerHookOrigin[id][1])
write_coord(szPlayerHookOrigin[id][2])
write_short(g_HookSpriteMsg[szPlayerSprite[id]])
write_byte(g_HookColorRGB[szPlayerColor[id]][0])
write_byte(g_HookColorRGB[szPlayerColor[id]][1])
write_byte(g_HookColorRGB[szPlayerColor[id]][2])
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
case 1: szSprite = g_pEndSpriteBreak[0];
case 2: szSprite = g_pEndSpriteBreak[1];
case 3: szSprite = g_pEndSpriteBreak[2];
case 4: szSprite = g_pEndSpriteBreak[3];
get_user_origin(id,origin,3)
message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0},id)
write_byte(TE_SPRITETRAIL)
write_coord(origin[2]+20)
write_coord(origin[2]+80)
stock ChatColor(const id, const input[], any:...)
new count = 1, players[32]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!t", "^3")
if (id) players[0] = id; else get_players(players, count, "ch")
for (new i = 0; i < count; i++)
if (is_user_connected(players[i]))
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);