Thread: Firebat
View Single Post
Author Message
LUNCHBOX!!!
Senior Member
Join Date: Nov 2004
Location: In a lunchbox!!!
Old 02-14-2005 , 13:59   Firebat
Reply With Quote #1

I don't know what I did wrong..
So if you could tell me..
Code:
// Firebat! - 

/* CVARS - copy and paste to shconfig.cfg

//Firebat
firebat_level 0
firebat_armorcost 0			//How much amour each flame uses
firebat_numburns 5			//How many time to burn the victim
firebat_burndamage 10		//How much damage each burn does

*/

#include <amxmod>
#include <Vexd_Utilities>
#include <superheromod>

// GLOBAL VARIABLES
new gHeroName[]="firebat"
new bool:gHasfirebatPower[SH_MAXSLOTS+1]
new gIsBurning[SH_MAXSLOTS+1]
new gSpriteSmoke, gSpriteFire, gSpriteBurning
#define AMMOX_HEGRENADE 12
//----------------------------------------------------------------------------------------------
public plugin_init()
{
	// Plugin Info
	register_plugin("SUPERHERO firebat","1.17.5","LUNCHBOX!!!/{HOJ} Batman/JTP10181")

	// DO NOT EDIT THIS FILE TO CHANGE CVARS, USE THE SHCONFIG.CFG
	register_cvar("firebat_level", "0" )
	register_cvar("firebat_armorcost", "0" )
	register_cvar("firebat_numburns", "5" )
	register_cvar("firebat_burndamage", "10" )
        register_cvar("firebat_grenademult", "60.9")
        register_cvar("firebat_grenadetimer", "55") 

	// FIRE THE EVENT TO CREATE THIS SUPERHERO!
	shCreateHero(gHeroName, "Flame Thrower", "Get a Flame Thrower to use on enemies", true, "firebat_level" )

	// REGISTER EVENTS THIS HERO WILL RESPOND TO! (AND SERVER COMMANDS)
	register_srvcmd("firebat_init", "firebat_init")
	shRegHeroInit(gHeroName, "firebat_init")

	register_srvcmd("firebat_kd", "Firebat_kd")
	shRegKeyDown(gHeroName, "firebat_kd")

	register_event("ResetHUD","newRound","b")
  
  // EXTRA NADE DAMAGE
  register_event("Damage", "firebat_damage", "b", "2!0")
  register_event( "TextMsg","grenade_thrown","bc","2&#Game_radio", "4&#Fire_in_the_hole")

  //Find Thrown Grenades
  register_event( "AmmoX", "on_AmmoX", "b" ) 

}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
	gSpriteSmoke   = precache_model("sprites/steam1.spr")
	gSpriteFire    = precache_model("sprites/explode1.spr")
	gSpriteBurning = precache_model("sprites/xfire.spr")
	precache_sound("ambience/burning1.wav")
	precache_sound("ambience/flameburst1.wav")
	precache_sound("scientist/c1a0_sci_catscream.wav")
	precache_sound("vox/_period.wav")
}
//----------------------------------------------------------------------------------------------
public newRound(id)
{
  new args[1]
  args[0] = id
  gIsBurning[id] = 0
  stopFireSound(args)

  new parm[1]
  parm[0]=id
  
  give_grenade(parm)
  set_user_rendering(id)

}
//----------------------------------------------------------------------------------------------
public give_grenade(parm[])
{
  new id=parm[0]

  if ( is_user_alive(id) && gHasfirebatPower[id] && shModActive() )
  {
       shGiveWeapon(id, "weapon_hegrenade" );
       engclient_cmd(id, "weapon_hegrenade" )
  }
}
//----------------------------------------------------------------------------------------------

public Firebat_damage(id)
{
    if (!shModActive()) return PLUGIN_CONTINUE

    new damage = read_data(2)
    new weapon, bodypart, attacker = get_user_attacker(id,weapon,bodypart)
    
    if ( attacker <=0 || attacker>SH_MAXSLOTS ) return PLUGIN_CONTINUE
    
    if ( gHasfirebatPower[attacker] && weapon == CSW_HEGRENADE && is_user_alive(id) )
    {
       // do extra damage
       new extraDamage = floatround(damage * get_cvar_float("firebat_grenademult") - damage)
       shExtraDamage( id, attacker, extraDamage, "firebat Grenade!" )
    }
    return PLUGIN_CONTINUE
}
//----------------------------------------------------------------------------------------------
public grenade_thrown()
{
  if ( !shModActive() ) return
  
  new name[ 32 ]
  read_data( 3, name, 31 )
  new parm[1]
  parm[0]=get_user_index( name )
  new id=parm[0]
  if ( id<1 || id>32) return
  if ( gHasFirebatPower[id] )
    set_task( get_cvar_float("firebat_grenadetimer"), "give_grenade", 0, parm, 1  )
}
//----------------------------------------------------------------------------------------------
public firebat_init()
{
	// First Argument is an id
	new temp[6]
	read_argv(1,temp,5)
	new id=str_to_num(temp)
	read_argv(2,temp,5)
	new hasPowers = str_to_num(temp)  // !0 = has Firebat power

	gHasFirebatPower[id] = (hasPowers!=0)
}
//----------------------------------------------------------------------------------------------
// Ludwigs flame thrower
public firebat_kd()
{
	if ( !hasRoundStarted() ) return PLUGIN_HANDLED

	// First Argument is an id with firebat
	new temp[6]
	read_argv(1,temp,5)
	new id=str_to_num(temp)

	if ( !is_user_alive(id) ) return PLUGIN_HANDLED

	if( Entvars_Get_Int( id, EV_INT_waterlevel ) == 3 ) {
		client_print(id,print_chat,"[SH] You cannot use the Flame Thrower while underwater")
		playSoundDenySelect(id)
		return PLUGIN_HANDLED
	}

	new fl_cost = get_cvar_num("firebat_armorcost")
	new armr = get_user_armor(id)

	if(armr < fl_cost) {
		client_print(id,print_chat,"%s blasts cost %d armor points each", gHeroName, fl_cost)
		playSoundDenySelect(id)
		return PLUGIN_HANDLED
	}

	set_user_armor(id,armr - fl_cost)

	emit_sound(id, CHAN_WEAPON, "ambience/flameburst1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	new vec[3]
	new aimvec[3]
	new velocityvec[3]
	new length
	new speed = 10
	get_user_origin(id,vec)
	get_user_origin(id,aimvec,2)
	new dist = get_distance(vec,aimvec)

	new speed1 = 160
	new speed2 = 350
	new radius = 105

	if(dist < 50) {
		radius = 0
		speed = 5
	}
	else if(dist < 150) {
		speed1 = speed2 = 1
		speed = 5
		radius = 50
	}
	else if(dist < 200) {
		speed1 = speed2 = 1
		speed = 5
		radius = 90
	}
	else if(dist < 250) {
		speed1 = speed2 = 90
		speed = 6
		radius = 90
	}
	else if(dist < 300) {
		speed1 = speed2 = 140
		speed = 7
	}
	else if(dist < 350) {
		speed1 = speed2 = 190
		speed = 7
	}
	else if(dist < 400) {
		speed1 = 150
		speed2 = 240
		speed = 8
	}
	else if(dist < 450) {
		speed1 = 150
		speed2 = 290
		speed = 8
	}
	else if(dist < 500) {
		speed1 = 180
		speed2 = 340
		speed = 9
	}

	velocityvec[0]=aimvec[0]-vec[0]
	velocityvec[1]=aimvec[1]-vec[1]
	velocityvec[2]=aimvec[2]-vec[2]
	length = sqrt(velocityvec[0]*velocityvec[0]+velocityvec[1]*velocityvec[1]+velocityvec[2]*velocityvec[2])
	velocityvec[0]=velocityvec[0]*speed/length
	velocityvec[1]=velocityvec[1]*speed/length
	velocityvec[2]=velocityvec[2]*speed/length

	new args[8]
	args[0] = vec[0]
	args[1] = vec[1]
	args[2] = vec[2]
	args[3] = velocityvec[0]
	args[4] = velocityvec[1]
	args[5] = velocityvec[2]
	set_task(0.1,"te_spray",0,args,8,"a",2)
	check_burnzone(id,vec,aimvec,speed1,speed2,radius)

	return PLUGIN_HANDLED
}
//----------------------------------------------------------------------------------------------
public te_spray(args[]){

	//TE_SPRAY
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte (120) // Throws a shower of sprites or models
	write_coord(args[0]) // start pos
	write_coord(args[1])
	write_coord(args[2])
	write_coord(args[3]) // velocity
	write_coord(args[4])
	write_coord(args[5])
	write_short (gSpriteFire) // spr
	write_byte (8) // count
	write_byte (70) // speed
	write_byte (100) //(noise)
	write_byte (5) // (rendermode)
	message_end()
}
//----------------------------------------------------------------------------------------------
check_burnzone(id,vec[],aimvec[],speed1,speed2,radius)
{
	new tbody,tid
	get_user_aiming(id,tid,tbody,550)

	if (tid <= 0 || tid > SH_MAXSLOTS) return

	if (get_cvar_num("mp_friendlyfire") == 1) {
		burn_victim(tid,id)
	}
	else if (get_user_team(id) != get_user_team(tid)) {
		burn_victim(tid,id)
	}
	new burnvec1[3],burnvec2[3],length1

	burnvec1[0]=aimvec[0]-vec[0]
	burnvec1[1]=aimvec[1]-vec[1]
	burnvec1[2]=aimvec[2]-vec[2]

	length1=sqrt(burnvec1[0]*burnvec1[0]+burnvec1[1]*burnvec1[1]+burnvec1[2]*burnvec1[2])
	burnvec2[0]=burnvec1[0]*speed2/length1
	burnvec2[1]=burnvec1[1]*speed2/length1
	burnvec2[2]=burnvec1[2]*speed2/length1
	burnvec1[0]=burnvec1[0]*speed1/length1
	burnvec1[1]=burnvec1[1]*speed1/length1
	burnvec1[2]=burnvec1[2]*speed1/length1
	burnvec1[0] += vec[0]
	burnvec1[1] += vec[1]
	burnvec1[2] += vec[2]
	burnvec2[0] += vec[0]
	burnvec2[1] += vec[1]
	burnvec2[2] += vec[2]

	new origin[3]
	for (new i=1; i <= SH_MAXSLOTS; i++) {
		if( is_user_alive(i) && i != id && ( get_cvar_num("mp_friendly_fire") || get_user_team(id) != get_user_team(i) ) ) {
			get_user_origin(i,origin)
			if(get_distance(origin,burnvec1) < radius) {
				burn_victim(i,id)
			}
			else if(get_distance(origin,burnvec2) < radius) {
				burn_victim(i,id)
			}

		}
	}
}
//----------------------------------------------------------------------------------------------
public burn_victim(id,killer)
{
	if( Entvars_Get_Int( id, EV_INT_waterlevel ) == 3 ) return
	if(gIsBurning[id] == 1) return

	gIsBurning[id] = 1

	emit_sound(id, CHAN_ITEM, "ambience/burning1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)

	new args[3]
	args[0] = id
	args[1] = killer
	set_task(0.3,"on_fire",451,args,3,"a", get_cvar_num("firebat_numburns") )
	set_task(0.7,"fire_scream",0,args,3)
	set_task(5.5,"stopFireSound",0,args,3)

}
//----------------------------------------------------------------------------------------------
public on_fire(args[])
{
	new id = args[0]
	new killer = args[1]

	if( !is_user_connected(id) || !is_user_alive(id) ) {
		gIsBurning[id] = 0
		return
	}
	if( Entvars_Get_Int( id, EV_INT_waterlevel ) == 3 ) {
		gIsBurning[id] = 0
		return
	}
	if (!gIsBurning[id]) return

	new rx,ry,rz,forigin[3]
	rx = random_num(-30,30)
	ry = random_num(-30,30)
	rz = random_num(-30,30)
	get_user_origin(id,forigin)

	//TE_SPRITE - additive sprite, plays 1 cycle
	message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte( 17 )
	write_coord(forigin[0]+rx) // coord, coord, coord (position)
	write_coord(forigin[1]+ry)
	write_coord(forigin[2]+10+rz)
	write_short( gSpriteBurning ) // short (sprite index)
	write_byte( 30 ) // byte (scale in 0.1's)
	write_byte( 200 ) // byte (brightness)
	message_end()

	//Smoke
	message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte( 5 )
	write_coord(forigin[0]+(rx*2)) // coord, coord, coord (position)
	write_coord(forigin[1]+(ry*2))
	write_coord(forigin[2]+100+(rz*2))
	write_short( gSpriteSmoke )// short (sprite index)
	write_byte( 60 ) // byte (scale in 0.1's)
	write_byte( 15 ) // byte (framerate)
	message_end()

	new health = get_user_health(id)
	new damage = get_cvar_num("firebat_burndamage")

	//Prevents the shExtraDamage from saying you attacked a teammate for every cycle of the loop
	if(health - damage  <= 0) {
		shExtraDamage(id, killer, damage, "firebat" )
	}
	else {
		set_user_health(id,health - damage)
	}
}
//----------------------------------------------------------------------------------------------
public fire_scream(args[])
{
	emit_sound(args[0], CHAN_AUTO, "scientist/c1a0_sci_catscream.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	return PLUGIN_CONTINUE
}
//----------------------------------------------------------------------------------------------
public stopFireSound(args[])
{
	new sndStop=(1<<5)
	gIsBurning[args[0]] = 0
	emit_sound(args[0], CHAN_ITEM, "ambience/burning1.wav", 1.0, ATTN_NORM, sndStop, PITCH_NORM)
	return PLUGIN_CONTINUE
}
//----------------------------------------------------------------------------------------------
public on_AmmoX(id)
{
	if ( !shModActive() ) return
	if ( id <= 0 || id > SH_MAXSLOTS) return
	if ( !is_user_alive(id) || !is_user_connected(id) ) return

	new iAmmoType = read_data(1)
	new iAmmoCount = read_data(2)

	if ( iAmmoType == AMMOX_HEGRENADE && iAmmoCount == 0 && gHasfirebatPower[id]) {
		set_task( get_cvar_float("goblin_grenadetimer"), "give_grenade", id )
	}
}
//----------------------------------------------------------------------------------------------
__________________
Fly..or something
Retierd!
LUNCHBOX!!! is offline