Code:
#include <amxmod.inc>
#include <xtrafun>
#include <Vexd_Utilities>
#include <superheromod.inc>
// Stryder Hiryu - NinjaRope, Knife Model, and Knife Dmg
// Made By -=HeRo=- PhO ShiZzLe
// Modify if you want >,>
// CVARS
// shiryu_hookstyle 3 // Ninja Rope
// shiryu_maxhooks -1 // UNLIMITED AMMOUNT
// shiryu_level 17 // Default Level
// shiryu_knifemult 3 // Knife Damage
// shiryu_moveacc 650 // Movement on hook
// shiryu_reelspeed 1000//How fast hook goes back in
// shiryu_hooksky 1 //1=Sky hook 0=no sky hook
// shiryu_teamcolored //1=yes 2=no
#define HOOKBEAMLIFE 100
#define HOOKBEAMPOINT 1
#define HOOKKILLBEAM 99
#define HOOK_DELTA_T 0.1
new gHeroName[]="Stryder Hiryu"
new bool:g_hasShiryuPower[SH_MAXSLOTS+1]
new g_hookLocation[SH_MAXSLOTS+1][3]
new g_hookLength[SH_MAXSLOTS+1]
new bool:g_hooked[SH_MAXSLOTS+1]
new Float:g_hookCreated[SH_MAXSLOTS+1]
new g_hooksLeft[SH_MAXSLOTS+1]
new g_spriteWeb
//----------------------------------------------------------------------------------------------
public plugin_init()
{
// Plugin Info
register_plugin("SUPERHERO Stryder Hiryu","1.0","-=HeRo=- PhO ShiZzLe")
register_cvar("shiryu_level", "17" )
register_cvar("shiryu_moveacc", "650" )
register_cvar("shiryu_reelspeed", "1000" )
register_cvar("shiryu_hookstyle", "3" )
register_cvar("shiryu_hooksky", "0" )
register_cvar("shiryu_maxhooks", "-1" )
register_cvar("shiryu_knifemult", "3.2" )
register_cvar("shiryu_teamcolored", "1" )
// fire the event to create this hero
shCreateHero(gHeroName, "Ninja Hook, Knife", "Ninja Hook To Anywhere you want", true, "shiryu_level" )
// Leave Key up
register_srvcmd("shiryu_ku", "shiryu_ku")
shRegKeyUp(gHeroName, "shiryu_ku")
// Hold Key Down
register_srvcmd("shiryu_kd", "shiryu_kd")
shRegKeyDown(gHeroName, "shiryu_kd")
// DEATH
register_event("DeathMsg", "shiryu_death", "a") // Re-uses KeyUp!
//Knife Dmg
register_event("Damage", "shiryu_damage", "b", "2!0")
// INIT
register_srvcmd("shiryu_init", "shiryu_init")
shRegHeroInit(gHeroName, "shiryu_init")
// Reset the HookCounts every round (regardless of shiryupower)
register_event("ResetHUD","newRound","b")
}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
precache_sound("weapons/xbow_hit2.wav")
g_spriteWeb = precache_model("sprites/zbeam4.spr")
precache_model("models/shiryu/v_knife.mdl")
}
//----------------------------------------------------------------------------------------------
public shiryu_weapons(id) {
if ( !is_user_alive(id) ) return PLUGIN_CONTINUE
shGiveWeapon(id,"weapon_knife")
model(id)
return PLUGIN_HANDLED
}
//----------------------------------------------------------------------------------------------
public model(id) {
if ( !is_user_alive(id) ) return PLUGIN_CONTINUE
Entvars_Set_String(id, EV_SZ_viewmodel, "models/shiryu/v_knife.mdl")
new iCurrent
iCurrent = FindEntity(-1,"weapon_knife")
while(iCurrent != -1) {
iCurrent = FindEntity(iCurrent,"weapon_knife")
}
return PLUGIN_HANDLED
}
//----------------------------------------------------------------------------------------------
public shiryu_init()
{
new temp[6]
// First Argument is an id
read_argv(1,temp,5)
new id=str_to_num(temp)
// 2nd Argument is 0 or 1 depending on whether the id has iron man powers
read_argv(2,temp,5)
new hasPowers=str_to_num(temp)
g_hasShiryuPower[id] = (hasPowers != 0)
if ( g_hooked[id] ) shiryu_hookOff(id)
}
//----------------------------------------------------------------------------------------------
public shiryu_kd()
{
new temp[6]
read_argv(1,temp,5)
new id=str_to_num(temp)
if ( g_hooked[id] || !is_user_alive(id) || !g_hasShiryuPower[id] || !hasRoundStarted() ) return
if (PassAimTest(id)) shiryu_hookOn(id)
}
//----------------------------------------------------------------------------------------------
public shiryu_ku()
{
new temp[10]
read_argv(1,temp,9)
new id=str_to_num(temp)
if ( g_hooked[id] ) shiryu_hookOff(id)
}
//----------------------------------------------------------------------------------------------
public shiryu_death()
{
new id=read_data(2)
if ( g_hooked[id] ) shiryu_hookOff(id)
return PLUGIN_CONTINUE
}
//----------------------------------------------------------------------------------------------
PassAimTest(id) {
new origin[3]
new Float:Orig[3]
get_user_origin(id, origin, 3)
Orig[0]=float(origin[0])
Orig[1]=float(origin[1])
Orig[2]=float(origin[2])
new AimAt = PointContents(Orig)
if (AimAt == CONTENTS_SKY && !get_cvar_num("shiryu_hooksky")) {
client_print(id,print_chat,"[SH](Stryder Hiryu) You are not allowed to hook to the sky")
return false
}
return true
}
//----------------------------------------------------------------------------------------------
public shiryu_checkWeb(parm[])
{
new id=parm[0]
new style=parm[1]
if (style==1) shiryu_physics(id, false)
if (style==2) shiryu_physics(id, true)
if (style>2 || style < 0 ) shiryu_cheapReel( id )
}
//----------------------------------------------------------------------------------------------
public shiryu_physics(id, bool:autoReel)
{
new user_origin[3], user_look[3], user_direction[3], move_direction[3]
new A[3], D[3], buttonadjust[3]
new acceleration, Float:vTowards_A, Float:DvTowards_A
new Float:velocity[3], null[3], buttonpress
if ( !g_hooked[id] ) return
if (!is_user_alive(id)) {
shiryu_hookOff(id)
return
}
if ( g_hookCreated[id] + HOOKBEAMLIFE/10 <= get_gametime() ) {
beamentpoint(id)
}
null[0] = 0
null[1] = 0
null[2] = 0
get_user_origin(id, user_origin)
get_user_origin(id, user_look,2)
Entvars_Get_Vector(id, EV_VEC_velocity, velocity)
buttonadjust[0]=0
buttonadjust[1]=0
buttonpress = Entvars_Get_Int(id, EV_INT_button)
if (buttonpress&IN_FORWARD) {
buttonadjust[0]+=1
}
if (buttonpress&IN_BACK) {
buttonadjust[0]-=1
}
if (buttonpress&IN_MOVERIGHT) {
buttonadjust[1]+=1
}
if (buttonpress&IN_MOVELEFT) {
buttonadjust[1]-=1
}
if (buttonpress&IN_JUMP) {
buttonadjust[2]+=1
}
if (buttonpress&IN_DUCK) {
buttonadjust[2]-=1
}
if (buttonadjust[0] || buttonadjust[1]) {
user_direction[0] = user_look[0] - user_origin[0]
user_direction[1] = user_look[1] - user_origin[1]
move_direction[0] = buttonadjust[0]*user_direction[0] + user_direction[1]*buttonadjust[1]
move_direction[1] = buttonadjust[0]*user_direction[1] - user_direction[0]*buttonadjust[1]
move_direction[2] = 0
velocity[0] += move_direction[0] * get_cvar_float("shiryu_moveacc") * HOOK_DELTA_T / get_distance(null,move_direction)
velocity[1] += move_direction[1] * get_cvar_float("shiryu_moveacc") * HOOK_DELTA_T / get_distance(null,move_direction)
}
if (buttonadjust[2] < 0 || (buttonadjust[2] && g_hookLength[id] >= 60)) {
g_hookLength[id] -= floatround(buttonadjust[2] * get_cvar_float("shiryu_reelspeed") * HOOK_DELTA_T)
}
else if (autoReel && !(buttonpress&IN_DUCK) && g_hookLength[id] >= 200) {
buttonadjust[2] += 1
g_hookLength[id] -= floatround(buttonadjust[2] * get_cvar_float("shiryu_reelspeed") * HOOK_DELTA_T)
}
A[0] = g_hookLocation[id][0] - user_origin[0]
A[1] = g_hookLocation[id][1] - user_origin[1]
A[2] = g_hookLocation[id][2] - user_origin[2]
D[0] = A[0]*A[2] / get_distance(null,A)
D[1] = A[1]*A[2] / get_distance(null,A)
D[2] = -(A[1]*A[1] + A[0]*A[0]) / get_distance(null,A)
new aDistance = get_distance(null,D) ? get_distance(null,D) : 1
acceleration = (-get_cvar_num("sv_gravity")) * D[2] / aDistance
vTowards_A = (velocity[0] * A[0] + velocity[1] * A[1] + velocity[2] * A[2]) / get_distance(null,A)
DvTowards_A = float((get_distance(user_origin,g_hookLocation[id]) - g_hookLength[id]) * 4)
if (get_distance(null,D)>10) {
velocity[0] += (acceleration * HOOK_DELTA_T * D[0]) / get_distance(null,D)
velocity[1] += (acceleration * HOOK_DELTA_T * D[1]) / get_distance(null,D)
velocity[2] += (acceleration * HOOK_DELTA_T * D[2]) / get_distance(null,D)
}
velocity[0] += ((DvTowards_A - vTowards_A) * A[0]) / get_distance(null,A)
velocity[1] += ((DvTowards_A - vTowards_A) * A[1]) / get_distance(null,A)
velocity[2] += ((DvTowards_A - vTowards_A) * A[2]) / get_distance(null,A)
Entvars_Set_Vector(id, EV_VEC_velocity, velocity)
}
//----------------------------------------------------------------------------------------------
public shiryu_cheapReel(id)
{
// Cheating Web drags you where ever you want
if ( !g_hooked[id] ) return
new user_origin[3]
new Float:velocity[3]
if (!is_user_alive(id)) {
shiryu_hookOff(id)
return
}
get_user_origin(id, user_origin)
Entvars_Get_Vector(id, EV_VEC_velocity, velocity)
new distance = get_distance( g_hookLocation[id], user_origin )
if ( distance > 60 ) {
velocity[0] = (g_hookLocation[id][0] - user_origin[0]) * ( 1.0 * get_cvar_num("shiryu_reelspeed") / distance )
velocity[1] = (g_hookLocation[id][1] - user_origin[1]) * ( 1.0 * get_cvar_num("shiryu_reelspeed") / distance )
velocity[2] = (g_hookLocation[id][2] - user_origin[2]) * ( 1.0 * get_cvar_num("shiryu_reelspeed") / distance )
}
else {
velocity[0] = 0.0
velocity[1] = 0.0
velocity[2] = 0.0
}
Entvars_Set_Vector(id, EV_VEC_velocity, velocity)
}
//----------------------------------------------------------------------------------------------
public shiryu_hookOn(id)
{
new parm[2], user_origin[3]
parm[0] = id
if ( !is_user_alive(id) ) return PLUGIN_HANDLED
if ( g_hooksLeft[id]== 0 ) {
playSoundDenySelect(id)
return PLUGIN_HANDLED
}
if ( g_hooksLeft[id] > 0 ) g_hooksLeft[id]--
if ( g_hooksLeft[id]>=0 && g_hooksLeft[id]<5 ) {
client_print(id, print_center, "You have %d shiryu hooks left", g_hooksLeft[id] )
}
g_hooked[id] = true
set_user_info(id,"USING_ROPE","1")
get_user_origin(id, user_origin)
get_user_origin(id, g_hookLocation[id], 3)
g_hookLength[id] = get_distance(g_hookLocation[id],user_origin)
set_user_gravity(id,0.001)
beamentpoint(id)
emit_sound(id, CHAN_STATIC, "weapons/xbow_hit2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
parm[1]=get_cvar_num("shiryu_hookstyle")
set_task(HOOK_DELTA_T, "shiryu_checkWeb", id+201, parm, 2, "b")
return PLUGIN_CONTINUE
}
//----------------------------------------------------------------------------------------------
public shiryu_hookOff(id)
{
g_hooked[id] = false
set_user_info(id,"USING_ROPE","0")
killbeam(id)
if ( is_user_connected(id) ) shSetGravityPower(id)
remove_task(id+201)
}
//----------------------------------------------------------------------------------------------
public beamentpoint(id)
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( HOOKBEAMPOINT )
write_short( id )
write_coord( g_hookLocation[id][0] )
write_coord( g_hookLocation[id][1] )
write_coord( g_hookLocation[id][2] )
write_short( g_spriteWeb ) // sprite index
write_byte( 0 ) // start frame
write_byte( 0 ) // framerate
write_byte( HOOKBEAMLIFE ) // life
write_byte( 10 ) // width
write_byte( 0 ) // noise
if (!get_cvar_num("shiryu_teamcolored")) {
write_byte( 250 ) // r, g, b
write_byte( 250 ) // r, g, b
write_byte( 250 ) // r, g, b
}
// Terrorist
else if (get_user_team(id)==1) {
write_byte( 255 ) // r, g, b
write_byte( 0 ) // r, g, b
write_byte( 0 ) // r, g, b
}
// Counter-Terrorist
else {
write_byte( 0 ) // r, g, b
write_byte( 0 ) // r, g, b
write_byte( 255 ) // r, g, b
}
write_byte( 150 ) // brightness
write_byte( 0 ) // speed
message_end( )
g_hookCreated[id] = get_gametime()
}
//----------------------------------------------------------------------------------------------
public killbeam(id)
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( HOOKKILLBEAM )
write_short( id )
message_end()
}
//----------------------------------------------------------------------------------------------
public newRound(id)
{
g_hooksLeft[id] = get_cvar_num("shiryu_maxhooks")
if ( g_hooked[id] ) shiryu_hookOff(id)
}
//----------------------------------------------------------------------------------------------
public client_disconnect(id)
{
// stupid check but lets see
if ( id <=0 || id>32 ) return PLUGIN_CONTINUE
// Yeah don't want any left over residuals
remove_task(id+201)
return PLUGIN_CONTINUE
}
//-------------------------------------------------------------------------------------------