Im making a hookmod that works with bots (based off the hook grab for amxmod) and it works fine sept for 1 teeny problem>>>the hooks dont show always and if they do they hook to odd origins??? why?? Im using te_beaments and defining both entities and updating entity 2 to be at the user aiming point or if hooked to an entity oldorigin-neworigin+targetorigin
Code:
#define STS_CHNL 6
#define STS_FLAG11 11 //Bomb planting
#define STS_FLAG12 12 //Bomb defusing
#include<amxmodx>
#include<fun>
#include<xtrafun>
#include<Vexd_Utilities>
#define TE_BEAMENTS 8
#define TE_KILLBEAM 99
#define BEAMLIFE 100
#define DELTA_T 0.1
new Float:beamcreated[33]
new look2[33][3]
new grabbed[33]
new hooxtarget[33]
new oldtargorigin[33][3]
new targethit[33]
new oldentorigin[33][3]
new beam
/* cvars -> local variables that will be synced in a timer */
new sv_hooksound,sv_hook,sv_hook_notify_when_active
//new sv_hookwidth
//new sv_hooknoise,sv_hookcolor,sv_hookbrightness,sv_hookspeed
new sv_hookforce
//new sv_hook_beamlife
new Float:sv_hook_syncspeed
public hookgrab(id)
{
if (!(get_cvar_float("mp_freezetime"))&&(get_gametime()<=get_cvar_float("mp_freezetime")))
return 1
new cvar = sv_hook
if (cvar == 1)
{
if(!is_user_alive(id))
return 1
set_user_gravity(id,0.1)
set_user_maxspeed(id,0.1)
new lookx[3]
get_user_origin(id,lookx,3)
set_entity_origin(hooxtarget[id],lookx)
set_hookgrabbed(id)
}
return 1
}
public report(id)
server_cmd("say %d",id)
public notify_hook_status(svIndex[])
{
if(sv_hook_notify_when_active == 1 && sv_hook ==1)
{
client_print(0,print_chat,"[AMX] HookGrab mod is active! say /hook for more info.")
}
new sId[32]
sId[0] = 0
set_task(380.0,"notify_hook_status",0,sId,31)
return 0
}
public sync_cvars(sId[])
{ /* optimization: sync cvars in a timer to avoid stressful cvar lookups. */
/* if you add cvars, please follow this method to maintain speed */
/* floats */
sv_hook_syncspeed=get_cvar_float("sv_hook_syncspeed")+0.1
/* non floats */
sv_hooksound=get_cvar_num("sv_hooksound")
sv_hook=get_cvar_num("sv_hook")
sv_hook_notify_when_active=get_cvar_num("sv_hook_notify_when_active")
//sv_hookwidth=get_cvar_num("sv_hookwidth")
//sv_hooknoise=get_cvar_num("sv_hooknoise")
//sv_hookcolor=get_cvar_num("sv_hookcolor")
//sv_hookbrightness=get_cvar_num("sv_hookbrightness")
// sv_hookspeed=get_cvar_num("sv_hookspeed")
// sv_hook_beamlife=get_cvar_num("sv_hook_beamlife")
//sv_hook_allow_admin=get_cvar_num("sv_hook_allow_admin")
sv_hookforce=get_cvar_num("sv_hookforce")
set_task(sv_hook_syncspeed-0.1,"sync_cvars",0,sId[0],31)
return 0
}
public set_hookgrabbed(id)
{
get_entity_origin(hooxtarget[id],oldentorigin[id])
if(sv_hook == 0)
return 0
new origin1[3]
get_user_origin(id, origin1)
new soundcvar = sv_hooksound
if (soundcvar == 1)
{
emit_sound(id, CHAN_STATIC, "weapons/xbow_hit1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
}
new body,hooktarget
get_user_aiming(id,hooktarget,body)
if(hooktarget){
targethit[id] = hooktarget
get_entity_origin(hooktarget,oldtargorigin[id])
}
grabbed[id] = id
set_beam(id)
new parm[2]
parm[0] = id
set_task(DELTA_T, "hookgrabtask", 101+id, parm, 1, "b")
return 0
}
public set_beam(id)//,type)
{
if(is_user_bot(id)){
message_begin(MSG_ONE, 98, {0,0,0},id)//ScreenFade =98
write_short(1<<12)
write_short(1<<1)
write_short(1<<2)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(255)
message_end()
}
//new color = sv_hookcolor
message_begin( MSG_BROADCAST,SVC_TEMPENTITY,{0,0,0} )
write_byte ( TE_BEAMENTS )
write_short ( hooxtarget[id] ) // ent
write_short( id )
write_short( beam )
write_byte( 1 ) // framestart
write_byte( 1 ) // framerate
write_byte( 0 ) // life
write_byte( 50 ) // width
write_byte( 32 ) // noise
write_byte( 255 ) //
write_byte( 255 ) // r, g, b
write_byte( 255 ) //
write_byte( 255 ) // brightness
write_byte( 100 ) // speed
message_end()
new aimvec[3]
get_entity_origin(hooxtarget[id],aimvec)
message_begin( MSG_PVS, SVC_TEMPENTITY)
write_byte( 9 )
write_coord( aimvec[0] )
write_coord( aimvec[1] )
write_coord( aimvec[2] )
message_end()
beamcreated[id] = get_gametime()
return 0
}
public hookgrabtask(parm[])
{
new id = parm[0]
if(grabbed[id])
{
new origin[3], moveto[3], velocity[3], length
if (!is_user_alive(grabbed[id]))
{
unhook(id)
return 0
}
get_entity_origin(hooxtarget[id],look2[id])
get_user_origin(id, origin)//, 1)
new speed = sv_hookforce
length = get_distance(look2[id],origin)
if(length==0)
return 0
for(new p = 0;p<3;p++){
moveto[p]=origin[p]+(look2[id][p]-origin[p])*speed/length
velocity[p]=(moveto[p]-origin[p])
}
set_user_velocity(id, velocity)
if(targethit[id]){
new diff[3],targetorigin[3]
get_entity_origin(targethit[id],targetorigin)
for(new l = 0; l < 3; l++){
diff[l] = targetorigin[l] - oldtargorigin[id][l] + oldentorigin[id][l]
oldtargorigin[id][l] = targetorigin[l]
oldentorigin[id][l]=diff[l]
}
set_entity_origin(hooxtarget[id],diff)
}
}
return 0
}
public playerhit_sound(id)
{
new soundcvar2 = sv_hooksound
if (soundcvar2 == 1)
{
emit_sound(id, CHAN_STATIC, "common/bodydrop4.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
return 0
}
public unhook(id)
{
if(grabbed[id]){
killbeam(id)
targethit[id]=0
grabbed[id]=false
}
if(task_exists(101+id))
remove_task(101+id)
set_user_gravity(id,1.0)
set_user_maxspeed(id,280.0)
return 1
}
public killbeam(id)
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( TE_KILLBEAM )
write_short( hooxtarget[id] )
message_end()
return 0
}
public new_round(id)
{
if (grabbed[id])
{
unhook(id)
}
return 0
}
public plugin_precache()
{
beam=precache_model("sprites/rope.spr")
precache_sound("weapons/xbow_hit1.wav")
precache_sound("common/bodydrop4.wav")
return 0
}
public help_motd(id)
{
new hook_motd[1300]
new text[768]
text = "There are two different types of hooks, one lets you
\
swing (+hook), and the other will pull you directly towards the
\
location you hooked onto.
\
To bind the keys follow these directions:
"
add(hook_motd,1299,text)
text = "- First open your console with the tilde ` key
\
- Choose the keys that you want to use for the hooks
\
- Type in bind ^"The key you chose^" ^"+hook^"
\
- Press enter to complete the bind, It should look like this
\
examples: bind ^"f^" ^"+hook^"
"
add(hook_motd,1299,text)
text = "It takes some time to get used to the speed, momentum and
\
swing. After a few minutes you should start getting the
\
hang of it.
\
Have Fun!!"
add(hook_motd,1299,text)
show_motd(id,hook_motd,"Hook Help:")
return 0
}
public bot_interface(){
new sid[8],id2,clip,ammo
read_argv(1,sid,7)
id2 = str_to_num(sid)
new gunid
gunid = get_user_weapon(id2,clip,ammo)
new teamname[3]
get_user_team(id2,teamname,2)
new teambool = containi(teamname,"CT")
if((grabbed[id2]!=id2)||(gunid!=CSW_C4)||((get_user_flags(0,STS_CHNL)&(1<<STS_FLAG12))&&(teambool==1))||((get_user_flags(0,STS_CHNL)&(1<<STS_FLAG11))&&(teambool==0))||(!(get_cvar_float("mp_freezetime"))&&(get_gametime()<=get_cvar_float("mp_freezetime")))){
unhook(id2)
hookgrab(id2)
new parm[2]
parm[0]=id2
set_task(2.0,"unhookbot",0,parm,1)
}
}
public unhookbot(parm[]){
new id=parm[0]
server_cmd("botunhook %i",id)
}
public bot_unhook(){
new sid[8],id2
read_argv(1,sid,7)
id2 = str_to_num(sid)
unhook(id2)
}
public plugin_init()
{
register_plugin("Hook Grab w/ Bot Support","0.9.8","{W`C}Bludy|GeekGod|Ivn-Software|ts2do")
register_cvar("sv_hook","1")
register_cvar("sv_hook_beamlife","0.0") /* around 11 seconds by default. 0 disables. */
register_cvar("sv_hook_notify_when_active","1")
register_cvar("sv_hook_allow_admin","1")
register_cvar("sv_hook_syncspeed","5.0") /* speed at which the sync routing will be called */
register_cvar("sv_hookforce","600")
//register_cvar("sv_hookwidth","5")
//register_cvar("sv_hooknoise","32")
//register_cvar("sv_hookcolor","0")
//register_cvar("sv_hookbrightness","100")
register_cvar("amx_autohook_bots_freq","3.0")
register_cvar("sv_hookspeed","1") /* speed of hook being deployed. */
register_cvar("sv_hookmsgs","0")
register_cvar("sv_hooksound","1")
register_clcmd("+hook","hookgrab")
register_clcmd("-hook","unhook")
register_srvcmd("bothook","bot_interface")
register_srvcmd("botunhook","bot_unhook")
register_clcmd("say /hook","help_motd")
register_clcmd("say hook","help_motd")
register_event("ResetHUD", "new_round", "b")
new sId[32]
sId[0] = 0
set_task(380.0,"notify_hook_status",0,sId,31)
sync_cvars(sId[0]) /* sync cvars now! */
set_task(5.0,"pluginstart")
}
public pluginstart(){
set_task(get_cvar_float("amx_autohook_bots_freq"),"chk_hook")
return 0
}
round_start(){
remove_task(34028)
set_task(get_cvar_float("amx_autohook_bots_freq"),"chk_hook")
}
public client_putinserver(id){
hooxtarget[id] = CreateEntity("info_target")
DispatchSpawn(hooxtarget[id])
}
public chk_hook(){
new players[32],inum
new maxpl = get_maxplayers()
for(new a = 1; a < maxpl; a++) {
if(is_user_connected(a)){
if(is_user_bot(a)){
if(is_user_alive(a)){
players[inum] = a
inum++
}
}
}
}
new guy = random_num(0,inum-1)
if(!players[guy])
return 0
server_cmd("bothook %i",players[guy])
set_task(get_cvar_float("amx_autohook_bots_freq"),"chk_hook")
return 0
}
public plugin_log(){
new args = read_logargc()
if(!(args == 2))
return 0
new msg[32]
read_logargv(1,msg,31)
if(msg[6] == 'S')
round_start()
return 0
}