Ion cannon
What the problem now? Can anyone explain what the problem?
He who fails to plan is planning to fail
This code is correct?
When the fire starts we want the nade to explode once.
When the fire starts we want the nade to explode once.
- public CreateFire(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- for( new id = 1; id < g_iMaxids; id++ )
- {
- if(ze_is_user_zombie(id))
- {
- ze_set_fire_grenade(id, true)
- }
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
- write_short(ReadyFire)
- write_byte(30)
- write_byte(200)
- message_end()
- set_task(1.5,"CreateFire", id)
- return PLUGIN_CONTINUE
- }
In this case we use boolean variable, a global variable that seen for all your functions. You will need to set it true once the event is done once and then you check if it's true then don't execute code again. And to reset it to false once the event ended.
If you don't understand this check:
I'm not sure of the place where
If you don't understand this check:
- #include <zombie_escape>
- #include <engine>
- #include <cstrike>
- #include <fun>
- #include <fakemeta_util>
- new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon"
- new const VERSION[] = "1.0"
- new const AUTHOR[] = "A.F./Mark"
- //#define ION_RADIUS 2000.0
- //#define ION_MAXDAMAGE 54200.0
- #define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE)
- new const V_MODEL[] = "models/v_c4.mdl"
- new const W_MODEL[] = "models/w_battery.mdl"
- new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav"
- new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav"
- new const SOUND_STOP[] = "vox/_comma.wav"
- new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav"
- new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav"
- new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav"
- new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav"
- new g_iCurrentWeapon[33]
- new bool:g_bHasIon[33]
- new bool:g_bCanBuy
- new bool:g_bIsFiring[33]
- new bool:g_bKilledByIon[33]
- new bool:g_bIsPlanting[33]
- new g_iLastWeapon[33]
- new g_Target[33]
- new i_Pitch[33]
- new Float:i_BeaconTime[33]
- new Float:ion_mid_origin[33][3]
- new Float:beam_origin[33][8][3]
- new Float:g_degrees[33][8]
- new Float:g_distance[33]
- new Float:g_Speed[33]
- new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame
- new g_iIonID
- new gmsgScreenShake
- new g_iMaxids
- new bool:g_bExploded /* This variable first initialized to false */
- new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage
- enum
- {
- anim_idle,
- anim_draw,
- anim_drop,
- anim_pressbutton
- }
- public plugin_precache()
- {
- precache_model(V_MODEL)
- precache_model(W_MODEL)
- precache_sound(SOUND_APPROACH)
- precache_sound(SOUND_BEACON)
- precache_sound(SOUND_BEEP)
- precache_sound(SOUND_ATTACK)
- precache_sound(SOUND_READY)
- precache_sound(SOUND_PLANT)
- precache_sound(SOUND_STOP)
- IonBeam = precache_model("sprites/ion_canon/ionbeam.spr")
- BlueFlare = precache_model("sprites/ion_canon/bflare.spr")
- ReadyFire = precache_model("sprites/ion_canon/fire.spr")
- BlueFire = precache_model("sprites/ion_canon/blueflame.spr")
- LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr")
- Shockwave = precache_model("sprites/shockwave.spr")
- }
- public plugin_init()
- {
- register_plugin( PLUGIN, VERSION, AUTHOR )
- g_iIonID = ze_register_item( "Ion Cannon", 100, 0)
- register_clcmd( "drop", "fn_Drop" )
- register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" )
- register_event( "DeathMsg", "EV_DeathMsg", "a" )
- register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" )
- register_forward( FM_CmdStart, "fw_CmdStart" )
- register_forward( FM_PlayerPreThink, "fw_idPreThink" )
- RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 )
- register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" )
- gmsgScreenShake = get_user_msgid( "ScreenShake" )
- cvar_barlen = register_cvar( "ze_ion_barlen", "4" )
- cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" )
- cvar_radius = register_cvar( "ze_ion_radius", "2000" )
- cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage
- cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0
- g_iMaxids = get_maxplayers( )
- }
- public client_connect( id )
- {
- g_bHasIon[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- public client_disconnected( id )
- {
- g_bHasIon[ id ] = false
- }
- public ze_game_started()
- {
- g_bCanBuy = false
- }
- public ze_zombie_release()
- {
- g_bCanBuy = true
- }
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iIonID)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- if (g_bHasIon[id] || !g_bCanBuy)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if( itemid == g_iIonID )
- {
- if( g_bHasIon[id] )
- {
- client_print( id, print_chat, "[ZE] Already have Ion Cannon" )
- return PLUGIN_HANDLED
- }
- else
- {
- g_bHasIon[id] = true
- give_item( id, "weapon_c4" )
- }
- }
- return PLUGIN_CONTINUE
- }
- public ze_user_infected(iVictim, iInfector)
- {
- emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(iVictim, 0, 0)
- remove_task(iVictim+5000)
- g_bHasIon[ iVictim ] = false
- g_bIsFiring[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- g_Target[ iVictim ] = 0
- }
- public ze_user_humanized(id)
- {
- g_bHasIon[id] = false
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- g_Target[ id ] = 0
- }
- public fn_Drop( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return PLUGIN_CONTINUE
- if( g_iCurrentWeapon[ id ] == CSW_C4 )
- {
- client_print( id, print_center, "* You cannot drop Ion Cannon *" )
- return PLUGIN_HANDLED
- }
- return PLUGIN_CONTINUE
- }
- public EV_CurWeapon( id )
- {
- if( !is_user_alive( id ) )
- return PLUGIN_CONTINUE
- g_iCurrentWeapon[ id ] = read_data( 2 )
- return PLUGIN_CONTINUE
- }
- public EV_DeathMsg( )
- {
- static iVictim
- iVictim = read_data( 2 )
- if( !is_user_connected( iVictim ) )
- return
- g_bHasIon[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- }
- public EV_RoundStart( )
- {
- // Remove any ion cannons
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( g_Target[ i ] )
- emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- if( is_user_alive( i ) )
- {
- ProgressBar(i, 0, 0)
- remove_task(i+5000)
- g_bHasIon[ i ] = false
- g_bIsFiring[ i ] = false
- g_bIsPlanting[ i ] = false
- g_Target[ i ] = 0
- }
- }
- static iEnt
- iEnt = -1
- while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 )
- {
- engfunc( EngFunc_RemoveEntity, iEnt )
- }
- }
- public fw_CmdStart( id, UC_Handle, Seed )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return FMRES_IGNORED
- static afButtons
- afButtons = get_uc( UC_Handle, UC_Buttons )
- if( afButtons & IN_ATTACK )
- {
- afButtons &= ~IN_ATTACK
- set_uc( UC_Handle, UC_Buttons, afButtons )
- if( g_bIsPlanting[ id ] )
- {
- //ProgressBar(id, 0, 0)
- return FMRES_IGNORED
- }
- if( g_Target[ id ] )
- {
- client_print( id, print_center, "* You already had planted Ion Cannon *" )
- g_bIsPlanting[ id ] = false
- return FMRES_IGNORED
- }
- if( is_user_outside( id ) )
- {
- g_Target[ id ] = 0
- i_Pitch[ id ] = 97
- i_BeaconTime[ id ] = 1.12
- g_distance[ id ] = 350.0
- g_Speed[ id ] = 0.0
- static iEnt
- iEnt = find_ent_by_owner( -1, "weapon_c4", id )
- set_pdata_float( iEnt, 48, 10.0, 4 )
- g_bIsFiring[ id ] = true
- g_bIsPlanting[ id ] = true
- emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- g_iCurrentWeapon[ id ] = CSW_C4
- if( get_pcvar_num( cvar_barlen ) > 0 )
- {
- set_task( 3.6, "UpdateAnim" )
- SendWeaponAnim( id, anim_pressbutton )
- ProgressBar(id, get_pcvar_num( cvar_barlen ), 0)
- set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000)
- }
- else
- {
- set_task(0.2,"ion_planted", id+5000)
- SendWeaponAnim( id, anim_drop )
- }
- }
- else
- {
- g_bIsPlanting[ id ] = false
- client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" )
- return FMRES_IGNORED
- }
- }
- return FMRES_HANDLED
- }
- public fw_PlayerPreThink( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return
- if( g_bIsFiring[ id ] )
- {
- g_iLastWeapon[ id ] = get_user_weapon( id )
- if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK )
- {
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- }
- }
- public fw_KnifeDeploy_Post( iEnt )
- {
- static id
- id = get_pdata_cbase( iEnt, 41, 4 )
- if( g_bHasIon[ id ] )
- {
- set_pev( id, pev_viewmodel2, V_MODEL )
- SendWeaponAnim( id, anim_draw )
- }
- }
- public fn_DeathMsg( id, Dest, iEntity )
- {
- static iVictim, iKiller
- iKiller = get_msg_arg_int( 1 )
- iVictim = get_msg_arg_int( 2 )
- if( !is_user_connected( iVictim ) || iKiller == iVictim )
- return PLUGIN_CONTINUE
- if ( g_bKilledByIon[ iVictim ] )
- {
- set_msg_arg_string ( 4, "ion cannon" )
- }
- return PLUGIN_CONTINUE
- }
- public ion_planted(id)
- {
- id -= 5000
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- client_print(0, print_center, "Ion Cannon has been planted!")
- client_cmd(0, "spk %s", SOUND_PLANT)
- g_bIsFiring[id] = false
- g_bIsPlanting[ id ] = false
- static Weapon
- Weapon = find_ent_by_owner( -1, "weapon_c4", id )
- ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon );
- ExecuteHamB( Ham_RemovePlayerItem, id, Weapon );
- ExecuteHamB( Ham_Item_Kill, Weapon );
- set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) );
- cs_set_user_bpammo( id, CSW_C4, 0 );
- g_bHasIon[ id ] = false
- g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
- if(!g_Target[id]) return PLUGIN_HANDLED
- // Strings
- set_pev(g_Target[id],pev_classname,"info_target_ion")
- engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
- // Integer
- set_pev(g_Target[id],pev_owner, id)
- set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
- set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
- entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id])
- //wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
- //static Float:flOrigin[ 3 ]
- //pev( id, pev_origin, flOrigin )
- //engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin )
- set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
- ion_beacon(id)
- set_task(5.0,"ion_startup", id)
- return PLUGIN_CONTINUE
- }
- public ion_beacon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- i_Pitch[id] += 3
- i_BeaconTime[id] -= 0.03
- if(i_Pitch[id] > 255) i_Pitch[id] = 255
- if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30
- emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
- set_task(i_BeaconTime[id],"ion_beacon", id)
- return PLUGIN_CONTINUE
- }
- public ion_startup(id)
- {
- client_cmd(0, "spk ^"%s^"", SOUND_APPROACH)
- client_print(0, print_chat,"Ion Cannon is approaching")
- set_task(5.0,"Trace_Ready", id)
- }
- public Trace_Ready(id)
- {
- if( !pev_valid( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- // write origin of each
- new Float:mid_origin[33][3]
- pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
- // 1st
- beam_origin[id][0][0] = mid_origin[id][0] + 300.0
- beam_origin[id][0][1] = mid_origin[id][1] + 150.0
- beam_origin[id][0][2] = mid_origin[id][2]
- g_degrees[id][0] = 0.0
- // 2nd
- beam_origin[id][1][0] = mid_origin[id][0] + 300.0
- beam_origin[id][1][1] = mid_origin[id][1] - 150.0
- beam_origin[id][1][2] = mid_origin[id][2]
- g_degrees[id][1] = 45.0
- // 3rd
- beam_origin[id][2][0] = mid_origin[id][0] - 300.0
- beam_origin[id][2][1] = mid_origin[id][1] - 150.0
- beam_origin[id][2][2] = mid_origin[id][2]
- g_degrees[id][2] = 90.0
- // 4th
- beam_origin[id][3][0] = mid_origin[id][0] - 300.0
- beam_origin[id][3][1] = mid_origin[id][1] + 150.0
- beam_origin[id][3][2] = mid_origin[id][2]
- g_degrees[id][3] = 135.0
- // 5th
- beam_origin[id][4][0] = mid_origin[id][0] + 150.0
- beam_origin[id][4][1] = mid_origin[id][1] + 300.0
- beam_origin[id][4][2] = mid_origin[id][2]
- g_degrees[id][4] = 180.0
- // 6th
- beam_origin[id][5][0] = mid_origin[id][0] + 150.0
- beam_origin[id][5][1] = mid_origin[id][1] - 300.0
- beam_origin[id][5][2] = mid_origin[id][2]
- g_degrees[id][5] = 225.0
- // 7th
- beam_origin[id][6][0] = mid_origin[id][0] - 150.0
- beam_origin[id][6][1] = mid_origin[id][1] - 300.0
- beam_origin[id][6][2] = mid_origin[id][2]
- g_degrees[id][6] = 270.0
- // 8th
- beam_origin[id][7][0] = mid_origin[id][0] - 150.0
- beam_origin[id][7][1] = mid_origin[id][1] + 300.0
- beam_origin[id][7][2] = mid_origin[id][2]
- g_degrees[id][7] = 315.0
- // set the mid to global
- ion_mid_origin[id] = mid_origin[id]
- new Float:addtime
- for(new i = 0; i < 8; i++) {
- addtime = addtime + 0.3
- new param[3]
- param[0] = i
- param[1] = id
- set_task(0.0 + addtime, "Trace_Start", _,param, 2)
- }
- Laser_Rotate(id) //To fix the laserdraw
- client_cmd(0, "spk ^"%s^"", SOUND_READY)
- for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
- set_task(i+3.0, "Laser_Rotate", id)
- set_task(2.9,"AddSpeed", id)
- set_task(11.5,"CreateFire", id)
- set_task(12.5,"ClearLasers", id)
- set_task(16.2,"FireIonCannon", id)
- return PLUGIN_CONTINUE
- }
- public AddSpeed(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- if(g_Speed[id] > 1.0) g_Speed[id] = 1.0
- g_Speed[id] += 0.1
- set_task(0.6,"AddSpeed", id)
- return PLUGIN_CONTINUE
- }
- public CreateFire(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- // Here we check if it's exploded before or not?
- if (!g_bExploded)
- {
- for( new id = 1; id < g_iMaxids; id++ )
- {
- if(ze_is_user_zombie(id))
- {
- ze_set_fire_grenade(id, true)
- }
- }
- // After this we turn the variable to true so not to be called next call
- g_bExploded = true
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
- write_short(ReadyFire)
- write_byte(30)
- write_byte(200)
- message_end()
- set_task(1.5,"CreateFire", id)
- return PLUGIN_CONTINUE
- }
- public ClearLasers(id)
- {
- // Here we reset the variable
- g_bExploded = false
- ze_set_fire_grenade(id, false)
- remove_task(1018+id)
- }
- public Laser_Rotate(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- g_distance[id] -= 0.467
- for(new i = 0; i < 8; i++) {
- // Calculate new alpha
- g_degrees[id][i] += g_Speed[id]
- if(g_degrees[id][i] > 360.0)
- g_degrees[id][i] -= 360.0
- // calcul the next origin
- new Float:tmp[33][3]
- tmp[id] = ion_mid_origin[id]
- tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][2] += 0.0 // -.-
- beam_origin[id][i] = tmp[id]
- }
- }
- public Trace_Start(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:get_random_z,Float:SkyOrigin[33][3]
- if( is_user_alive( id ) )
- {
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- get_random_z = random_float(300.0,SkyOrigin[id][2])
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
- write_short(BlueFire)
- write_byte(10)
- write_byte(100)
- message_end()
- TraceAll(param)
- }
- public TraceAll(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:SkyOrigin[33][3]
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(1) //life
- write_byte(50) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_short(LaserFlame)
- write_byte(5)
- write_byte(200)
- message_end()
- /*message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_WORLDDECAL)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_byte(46)
- message_end()*/
- set_task(0.08,"TraceAll", 1018+id, param, 2)
- }
- public FireIonCannon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new i = -1
- while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0)
- {
- if( !is_user_connected( i ) )
- continue
- if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT))
- {
- message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i)
- write_short(255<<14) //ammount
- write_short(10<<14) //lasts this long
- write_short(255<<14) //frequency
- message_end()
- }
- //next player in spehre.
- continue
- }
- new Float:skyOrigin[33][3]
- skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(15) //life
- write_byte(255) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
- write_byte(TE_BEAMCYLINDER)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z
- write_short(Shockwave) // sprite
- write_byte(0) // startframe
- write_byte(0) // framerate
- write_byte(100) // life
- write_byte(150) // width
- write_byte(0) // noise
- write_byte(0) // red
- write_byte(100) // green
- write_byte(250) // blue
- write_byte(150) // brightness
- write_byte(0) // speed
- message_end()
- for(new i = 1; i < 6; i++)
- {
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
- write_short(BlueFlare) // (sprite index)
- write_byte(50) // (count)
- write_byte(random_num(27,30)) // (life in 0.1's)
- write_byte(10) // byte (scale in 0.1's)
- write_byte(random_num(30,70)) // (velocity along vector in 10's)
- write_byte(40) // (randomness of velocity in 10's)
- message_end()
- }
- switch( get_pcvar_num( cvar_ionmode ) )
- {
- case 0:
- {
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( is_user_alive( i ) && ze_is_user_zombie( i ) )
- {
- static Float:flHealth
- flHealth = entity_get_float( i, EV_FL_health )
- static Float:flDamage
- flDamage = get_pcvar_float( cvar_damage )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ i ] = true
- ExecuteHamB( Ham_Killed, i, id, 2 )
- g_bKilledByIon[ i ] = false
- }
- }
- }
- }
- case 1:
- {
- static victim
- victim = -1
- while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 )
- {
- if( !is_user_connected( victim ) )
- {
- if( pev_valid( victim ) )
- {
- static szClassname[ 32 ]
- pev( victim, pev_classname, szClassname, 31 )
- if( equal( szClassname, "func_breakable" ) )
- {
- force_use( id, victim )
- }
- }
- continue
- }
- if ( !is_user_alive( victim ) )
- continue
- if( !ze_is_user_zombie( victim ) )
- continue
- static Float:flOrigin[ 3 ]
- pev( victim, pev_origin, flOrigin )
- static Float:flDistance, Float:flDamage
- flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin )
- flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance )
- if( flDamage )
- {
- static Float:flHealth
- flHealth = entity_get_float( victim, EV_FL_health )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ victim ] = true
- ExecuteHamB( Ham_Killed, victim, id, 2 )
- g_bKilledByIon[ victim ] = false
- }
- }
- }
- }
- }
- client_cmd(0, "spk ^"%s^"", SOUND_ATTACK)
- ResetAll(id)
- }
- ResetAll(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- set_pev(g_Target[id], pev_flags, FL_KILLME)
- g_Target[id] = 0
- }
- /******************** Stocks ********************/
- // Get entity above sky.
- stock Float:tlx_distance_to_sky(id)
- {
- new Float:TraceEnd[3]
- pev(id, pev_origin, TraceEnd)
- new Float:f_dest[3]
- f_dest[0] = TraceEnd[0]
- f_dest[1] = TraceEnd[1]
- f_dest[2] = TraceEnd[2] + 8192.0
- new res, Float:SkyOrigin[3]
- engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
- get_tr2(res, TR_vecEndPos, SkyOrigin)
- return SkyOrigin
- }
- //return distance above us to sky
- stock Float:is_user_outside(id)
- {
- new Float:origin[3], Float:dist
- pev(id, pev_origin, origin)
- dist = origin[2]
- while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
- origin[2] += 5.0
- if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
- return (origin[2] - dist)
- return 0.0
- }
- stock ProgressBar(id, seconds, position)
- {
- message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
- write_byte(seconds)
- write_byte(position)
- message_end()
- }
- SendWeaponAnim( id, Sequence )
- {
- set_pev( id, pev_weaponanim, Sequence )
- message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id )
- write_byte( Sequence )
- write_byte( pev( id, pev_body ) )
- message_end( )
- }
- public UpdateAnim( id )
- {
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return
- SendWeaponAnim( id, anim_drop )
- }
- stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance)
- {
- return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance))
- }
I'm not sure of the place where
g_bExploded = false
should be as i don't know how this works, so try find the suitable place when the fire ends to reset it to false.He who fails to plan is planning to fail
Ok 1 more problem with this when the zombie is not in the radius of the ion cannon the fire nade still sets him on fire.
New Code Here
New Code Here
- #include <zombie_escape>
- #include <engine>
- #include <cstrike>
- #include <fun>
- #include <fakemeta_util>
- new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon"
- new const VERSION[] = "1.0"
- new const AUTHOR[] = "A.F./Mark"
- //#define ION_RADIUS 2000.0
- //#define ION_MAXDAMAGE 54200.0
- #define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE)
- new const V_MODEL[] = "models/v_c4.mdl"
- new const W_MODEL[] = "models/w_battery.mdl"
- new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav"
- new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav"
- new const SOUND_STOP[] = "vox/_comma.wav"
- new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav"
- new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav"
- new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav"
- new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav"
- new g_iCurrentWeapon[33]
- new bool:g_bHasIon[33]
- new bool:g_bCanBuy
- new bool:g_bIsFiring[33]
- new bool:g_bKilledByIon[33]
- new bool:g_bIsPlanting[33]
- new g_iLastWeapon[33]
- new g_Target[33]
- new i_Pitch[33]
- new Float:i_BeaconTime[33]
- new Float:ion_mid_origin[33][3]
- new Float:beam_origin[33][8][3]
- new Float:g_degrees[33][8]
- new Float:g_distance[33]
- new Float:g_Speed[33]
- new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame
- new g_iIonID
- new gmsgScreenShake
- new g_iMaxids
- new bool:g_bExploded /* This variable first initialized to false */
- new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage
- enum
- {
- anim_idle,
- anim_draw,
- anim_drop,
- anim_pressbutton
- }
- public plugin_precache()
- {
- precache_model(V_MODEL)
- precache_model(W_MODEL)
- precache_sound(SOUND_APPROACH)
- precache_sound(SOUND_BEACON)
- precache_sound(SOUND_BEEP)
- precache_sound(SOUND_ATTACK)
- precache_sound(SOUND_READY)
- precache_sound(SOUND_PLANT)
- precache_sound(SOUND_STOP)
- IonBeam = precache_model("sprites/ion_canon/ionbeam.spr")
- BlueFlare = precache_model("sprites/ion_canon/bflare.spr")
- ReadyFire = precache_model("sprites/ion_canon/fire.spr")
- BlueFire = precache_model("sprites/ion_canon/blueflame.spr")
- LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr")
- Shockwave = precache_model("sprites/shockwave.spr")
- }
- public plugin_init()
- {
- register_plugin( PLUGIN, VERSION, AUTHOR )
- g_iIonID = ze_register_item( "Ion Cannon", 100, 0)
- register_clcmd( "drop", "fn_Drop" )
- register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" )
- register_event( "DeathMsg", "EV_DeathMsg", "a" )
- register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" )
- register_forward( FM_CmdStart, "fw_CmdStart" )
- register_forward( FM_PlayerPreThink, "fw_idPreThink" )
- RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 )
- register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" )
- gmsgScreenShake = get_user_msgid( "ScreenShake" )
- cvar_barlen = register_cvar( "ze_ion_barlen", "4" )
- cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" )
- cvar_radius = register_cvar( "ze_ion_radius", "2000" )
- cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage
- cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0
- g_iMaxids = get_maxplayers( )
- }
- public client_connect( id )
- {
- g_bHasIon[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- public client_disconnected( id )
- {
- g_bHasIon[ id ] = false
- }
- public ze_game_started()
- {
- g_bCanBuy = false
- }
- public ze_zombie_release()
- {
- g_bCanBuy = true
- }
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iIonID)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- if (g_bHasIon[id] || !g_bCanBuy)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if( itemid == g_iIonID )
- {
- if( g_bHasIon[id] )
- {
- client_print( id, print_chat, "[ZE] Already have Ion Cannon" )
- return PLUGIN_HANDLED
- }
- else
- {
- g_bHasIon[id] = true
- give_item( id, "weapon_c4" )
- }
- }
- return PLUGIN_CONTINUE
- }
- public ze_user_infected(iVictim, iInfector)
- {
- emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(iVictim, 0, 0)
- remove_task(iVictim+5000)
- g_bHasIon[ iVictim ] = false
- g_bIsFiring[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- g_Target[ iVictim ] = 0
- }
- public ze_user_humanized(id)
- {
- g_bHasIon[id] = false
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- g_Target[ id ] = 0
- }
- public fn_Drop( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return PLUGIN_CONTINUE
- if( g_iCurrentWeapon[ id ] == CSW_C4 )
- {
- client_print( id, print_center, "* You cannot drop Ion Cannon *" )
- return PLUGIN_HANDLED
- }
- return PLUGIN_CONTINUE
- }
- public EV_CurWeapon( id )
- {
- if( !is_user_alive( id ) )
- return PLUGIN_CONTINUE
- g_iCurrentWeapon[ id ] = read_data( 2 )
- return PLUGIN_CONTINUE
- }
- public EV_DeathMsg( )
- {
- static iVictim
- iVictim = read_data( 2 )
- if( !is_user_connected( iVictim ) )
- return
- g_bHasIon[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- }
- public EV_RoundStart( )
- {
- // Remove any ion cannons
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( g_Target[ i ] )
- emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- if( is_user_alive( i ) )
- {
- ProgressBar(i, 0, 0)
- remove_task(i+5000)
- g_bHasIon[ i ] = false
- g_bIsFiring[ i ] = false
- g_bIsPlanting[ i ] = false
- g_Target[ i ] = 0
- }
- }
- static iEnt
- iEnt = -1
- while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 )
- {
- engfunc( EngFunc_RemoveEntity, iEnt )
- }
- }
- public fw_CmdStart( id, UC_Handle, Seed )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return FMRES_IGNORED
- static afButtons
- afButtons = get_uc( UC_Handle, UC_Buttons )
- if( afButtons & IN_ATTACK )
- {
- afButtons &= ~IN_ATTACK
- set_uc( UC_Handle, UC_Buttons, afButtons )
- if( g_bIsPlanting[ id ] )
- {
- //ProgressBar(id, 0, 0)
- return FMRES_IGNORED
- }
- if( g_Target[ id ] )
- {
- client_print( id, print_center, "* You already had planted Ion Cannon *" )
- g_bIsPlanting[ id ] = false
- return FMRES_IGNORED
- }
- if( is_user_outside( id ) )
- {
- g_Target[ id ] = 0
- i_Pitch[ id ] = 97
- i_BeaconTime[ id ] = 1.12
- g_distance[ id ] = 350.0
- g_Speed[ id ] = 0.0
- static iEnt
- iEnt = find_ent_by_owner( -1, "weapon_c4", id )
- set_pdata_float( iEnt, 48, 10.0, 4 )
- g_bIsFiring[ id ] = true
- g_bIsPlanting[ id ] = true
- emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- g_iCurrentWeapon[ id ] = CSW_C4
- if( get_pcvar_num( cvar_barlen ) > 0 )
- {
- set_task( 3.6, "UpdateAnim" )
- SendWeaponAnim( id, anim_pressbutton )
- ProgressBar(id, get_pcvar_num( cvar_barlen ), 0)
- set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000)
- }
- else
- {
- set_task(0.2,"ion_planted", id+5000)
- SendWeaponAnim( id, anim_drop )
- }
- }
- else
- {
- g_bIsPlanting[ id ] = false
- client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" )
- return FMRES_IGNORED
- }
- }
- return FMRES_HANDLED
- }
- public fw_PlayerPreThink( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return
- if( g_bIsFiring[ id ] )
- {
- g_iLastWeapon[ id ] = get_user_weapon( id )
- if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK )
- {
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- }
- }
- public fw_KnifeDeploy_Post( iEnt )
- {
- static id
- id = get_pdata_cbase( iEnt, 41, 4 )
- if( g_bHasIon[ id ] )
- {
- set_pev( id, pev_viewmodel2, V_MODEL )
- SendWeaponAnim( id, anim_draw )
- }
- }
- public fn_DeathMsg( id, Dest, iEntity )
- {
- static iVictim, iKiller
- iKiller = get_msg_arg_int( 1 )
- iVictim = get_msg_arg_int( 2 )
- if( !is_user_connected( iVictim ) || iKiller == iVictim )
- return PLUGIN_CONTINUE
- if ( g_bKilledByIon[ iVictim ] )
- {
- set_msg_arg_string ( 4, "ion cannon" )
- }
- return PLUGIN_CONTINUE
- }
- public ion_planted(id)
- {
- id -= 5000
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- client_print(0, print_center, "Ion Cannon has been planted!")
- client_cmd(0, "spk %s", SOUND_PLANT)
- g_bIsFiring[id] = false
- g_bIsPlanting[ id ] = false
- static Weapon
- Weapon = find_ent_by_owner( -1, "weapon_c4", id )
- ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon );
- ExecuteHamB( Ham_RemovePlayerItem, id, Weapon );
- ExecuteHamB( Ham_Item_Kill, Weapon );
- set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) );
- cs_set_user_bpammo( id, CSW_C4, 0 );
- g_bHasIon[ id ] = false
- g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
- if(!g_Target[id]) return PLUGIN_HANDLED
- // Strings
- set_pev(g_Target[id],pev_classname,"info_target_ion")
- engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
- // Integer
- set_pev(g_Target[id],pev_owner, id)
- set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
- set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
- entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id])
- //wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
- //static Float:flOrigin[ 3 ]
- //pev( id, pev_origin, flOrigin )
- //engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin )
- set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
- ion_beacon(id)
- set_task(5.0,"ion_startup", id)
- return PLUGIN_CONTINUE
- }
- public ion_beacon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- i_Pitch[id] += 3
- i_BeaconTime[id] -= 0.03
- if(i_Pitch[id] > 255) i_Pitch[id] = 255
- if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30
- emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
- set_task(i_BeaconTime[id],"ion_beacon", id)
- return PLUGIN_CONTINUE
- }
- public ion_startup(id)
- {
- client_cmd(0, "spk ^"%s^"", SOUND_APPROACH)
- client_print(0, print_chat,"Ion Cannon is approaching")
- set_task(5.0,"Trace_Ready", id)
- }
- public Trace_Ready(id)
- {
- if( !pev_valid( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- // write origin of each
- new Float:mid_origin[33][3]
- pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
- // 1st
- beam_origin[id][0][0] = mid_origin[id][0] + 300.0
- beam_origin[id][0][1] = mid_origin[id][1] + 150.0
- beam_origin[id][0][2] = mid_origin[id][2]
- g_degrees[id][0] = 0.0
- // 2nd
- beam_origin[id][1][0] = mid_origin[id][0] + 300.0
- beam_origin[id][1][1] = mid_origin[id][1] - 150.0
- beam_origin[id][1][2] = mid_origin[id][2]
- g_degrees[id][1] = 45.0
- // 3rd
- beam_origin[id][2][0] = mid_origin[id][0] - 300.0
- beam_origin[id][2][1] = mid_origin[id][1] - 150.0
- beam_origin[id][2][2] = mid_origin[id][2]
- g_degrees[id][2] = 90.0
- // 4th
- beam_origin[id][3][0] = mid_origin[id][0] - 300.0
- beam_origin[id][3][1] = mid_origin[id][1] + 150.0
- beam_origin[id][3][2] = mid_origin[id][2]
- g_degrees[id][3] = 135.0
- // 5th
- beam_origin[id][4][0] = mid_origin[id][0] + 150.0
- beam_origin[id][4][1] = mid_origin[id][1] + 300.0
- beam_origin[id][4][2] = mid_origin[id][2]
- g_degrees[id][4] = 180.0
- // 6th
- beam_origin[id][5][0] = mid_origin[id][0] + 150.0
- beam_origin[id][5][1] = mid_origin[id][1] - 300.0
- beam_origin[id][5][2] = mid_origin[id][2]
- g_degrees[id][5] = 225.0
- // 7th
- beam_origin[id][6][0] = mid_origin[id][0] - 150.0
- beam_origin[id][6][1] = mid_origin[id][1] - 300.0
- beam_origin[id][6][2] = mid_origin[id][2]
- g_degrees[id][6] = 270.0
- // 8th
- beam_origin[id][7][0] = mid_origin[id][0] - 150.0
- beam_origin[id][7][1] = mid_origin[id][1] + 300.0
- beam_origin[id][7][2] = mid_origin[id][2]
- g_degrees[id][7] = 315.0
- // set the mid to global
- ion_mid_origin[id] = mid_origin[id]
- new Float:addtime
- for(new i = 0; i < 8; i++) {
- addtime = addtime + 0.3
- new param[3]
- param[0] = i
- param[1] = id
- set_task(0.0 + addtime, "Trace_Start", _,param, 2)
- }
- Laser_Rotate(id) //To fix the laserdraw
- client_cmd(0, "spk ^"%s^"", SOUND_READY)
- for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
- set_task(i+3.0, "Laser_Rotate", id)
- set_task(2.9,"AddSpeed", id)
- set_task(11.5,"CreateFire", id)
- set_task(12.5,"ClearLasers", id)
- set_task(18.2,"FireIonCannon", id)
- return PLUGIN_CONTINUE
- }
- public AddSpeed(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- if(g_Speed[id] > 1.0) g_Speed[id] = 1.0
- g_Speed[id] += 0.1
- set_task(0.6,"AddSpeed", id)
- return PLUGIN_CONTINUE
- }
- public CreateFire(id)
- {
- if( !g_Target[ id ] )
- {
- g_bExploded = false
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- // Here we check if it's exploded before or not?
- if (!g_bExploded)
- {
- for( new id = 1; id < g_iMaxids; id++ )
- {
- if(ze_is_user_zombie(id))
- {
- ze_set_fire_grenade(id, true)
- }
- }
- // After this we turn the variable to true so not to be called next call
- g_bExploded = true
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
- write_short(ReadyFire)
- write_byte(30)
- write_byte(200)
- message_end()
- set_task(1.5,"CreateFire", id)
- return PLUGIN_CONTINUE
- }
- public ClearLasers(id)
- {
- // Here we reset the variable
- g_bExploded = false
- ze_set_fire_grenade(id, false)
- remove_task(1018+id)
- }
- public Laser_Rotate(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- g_distance[id] -= 0.467
- for(new i = 0; i < 8; i++) {
- // Calculate new alpha
- g_degrees[id][i] += g_Speed[id]
- if(g_degrees[id][i] > 360.0)
- g_degrees[id][i] -= 360.0
- // calcul the next origin
- new Float:tmp[33][3]
- tmp[id] = ion_mid_origin[id]
- tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][2] += 0.0 // -.-
- beam_origin[id][i] = tmp[id]
- }
- }
- public Trace_Start(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:get_random_z,Float:SkyOrigin[33][3]
- if( is_user_alive( id ) )
- {
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- get_random_z = random_float(300.0,SkyOrigin[id][2])
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
- write_short(BlueFire)
- write_byte(10)
- write_byte(100)
- message_end()
- TraceAll(param)
- }
- public TraceAll(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:SkyOrigin[33][3]
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(1) //life
- write_byte(50) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_short(LaserFlame)
- write_byte(5)
- write_byte(200)
- message_end()
- /*message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_WORLDDECAL)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_byte(46)
- message_end()*/
- set_task(0.08,"TraceAll", 1018+id, param, 2)
- }
- public FireIonCannon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new i = -1
- while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0)
- {
- if( !is_user_connected( i ))
- continue
- if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT))
- {
- message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i)
- write_short(255<<14) //ammount
- write_short(10<<14) //lasts this long
- write_short(255<<14) //frequency
- message_end()
- }
- //next player in spehre.
- continue
- }
- new Float:skyOrigin[33][3]
- skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(15) //life
- write_byte(255) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
- write_byte(TE_BEAMCYLINDER)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z
- write_short(Shockwave) // sprite
- write_byte(0) // startframe
- write_byte(0) // framerate
- write_byte(100) // life
- write_byte(150) // width
- write_byte(0) // noise
- write_byte(0) // red
- write_byte(100) // green
- write_byte(250) // blue
- write_byte(150) // brightness
- write_byte(0) // speed
- message_end()
- for(new i = 1; i < 6; i++)
- {
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
- write_short(BlueFlare) // (sprite index)
- write_byte(50) // (count)
- write_byte(random_num(27,30)) // (life in 0.1's)
- write_byte(10) // byte (scale in 0.1's)
- write_byte(random_num(30,70)) // (velocity along vector in 10's)
- write_byte(40) // (randomness of velocity in 10's)
- message_end()
- }
- switch( get_pcvar_num( cvar_ionmode ) )
- {
- case 0:
- {
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( is_user_alive( i ) && ze_is_user_zombie( i ) )
- {
- static Float:flHealth
- flHealth = entity_get_float( i, EV_FL_health )
- static Float:flDamage
- flDamage = get_pcvar_float( cvar_damage )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ i ] = true
- ExecuteHamB( Ham_Killed, i, id, 2 )
- g_bKilledByIon[ i ] = false
- }
- }
- }
- }
- case 1:
- {
- static victim
- victim = -1
- while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 )
- {
- if( !is_user_connected( victim ) )
- {
- if( pev_valid( victim ) )
- {
- static szClassname[ 32 ]
- pev( victim, pev_classname, szClassname, 31 )
- if( equal( szClassname, "func_breakable" ) )
- {
- force_use( id, victim )
- }
- }
- continue
- }
- if ( !is_user_alive( victim ) )
- continue
- if( !ze_is_user_zombie( victim ) )
- continue
- static Float:flOrigin[ 3 ]
- pev( victim, pev_origin, flOrigin )
- static Float:flDistance, Float:flDamage
- flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin )
- flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance )
- if( flDamage )
- {
- static Float:flHealth
- flHealth = entity_get_float( victim, EV_FL_health )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ victim ] = true
- ExecuteHamB( Ham_Killed, victim, id, 2 )
- g_bKilledByIon[ victim ] = false
- }
- }
- }
- }
- }
- client_cmd(0, "spk ^"%s^"", SOUND_ATTACK)
- ResetAll(id)
- }
- ResetAll(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- set_pev(g_Target[id], pev_flags, FL_KILLME)
- g_Target[id] = 0
- }
- /******************** Stocks ********************/
- // Get entity above sky.
- stock Float:tlx_distance_to_sky(id)
- {
- new Float:TraceEnd[3]
- pev(id, pev_origin, TraceEnd)
- new Float:f_dest[3]
- f_dest[0] = TraceEnd[0]
- f_dest[1] = TraceEnd[1]
- f_dest[2] = TraceEnd[2] + 8192.0
- new res, Float:SkyOrigin[3]
- engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
- get_tr2(res, TR_vecEndPos, SkyOrigin)
- return SkyOrigin
- }
- //return distance above us to sky
- stock Float:is_user_outside(id)
- {
- new Float:origin[3], Float:dist
- pev(id, pev_origin, origin)
- dist = origin[2]
- while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
- origin[2] += 5.0
- if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
- return (origin[2] - dist)
- return 0.0
- }
- stock ProgressBar(id, seconds, position)
- {
- message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
- write_byte(seconds)
- write_byte(position)
- message_end()
- }
- SendWeaponAnim( id, Sequence )
- {
- set_pev( id, pev_weaponanim, Sequence )
- message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id )
- write_byte( Sequence )
- write_byte( pev( id, pev_body ) )
- message_end( )
- }
- public UpdateAnim( id )
- {
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return
- SendWeaponAnim( id, anim_drop )
- }
- stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance)
- {
- return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance))
- }
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Try:
Code: Select all
#include <zombie_escape>
#include <engine>
#include <cstrike>
#include <fun>
#include <fakemeta_util>
new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon"
new const VERSION[] = "1.0"
new const AUTHOR[] = "A.F./Mark"
//#define ION_RADIUS 2000.0
//#define ION_MAXDAMAGE 54200.0
#define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE)
new const V_MODEL[] = "models/v_c4.mdl"
new const W_MODEL[] = "models/w_battery.mdl"
new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav"
new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav"
new const SOUND_STOP[] = "vox/_comma.wav"
new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav"
new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav"
new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav"
new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav"
new g_iCurrentWeapon[33]
new bool:g_bHasIon[33]
new bool:g_bCanBuy
new bool:g_bIsFiring[33]
new bool:g_bKilledByIon[33]
new bool:g_bIsPlanting[33]
new g_iLastWeapon[33]
new g_Target[33]
new i_Pitch[33]
new Float:i_BeaconTime[33]
new Float:ion_mid_origin[33][3]
new Float:beam_origin[33][8][3]
new Float:g_degrees[33][8]
new Float:g_distance[33]
new Float:g_Speed[33]
new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame
new g_iIonID
new gmsgScreenShake
new g_iMaxids
new bool:g_bExploded /* This variable first initialized to false */
new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage
enum
{
anim_idle,
anim_draw,
anim_drop,
anim_pressbutton
}
public plugin_precache()
{
precache_model(V_MODEL)
precache_model(W_MODEL)
precache_sound(SOUND_APPROACH)
precache_sound(SOUND_BEACON)
precache_sound(SOUND_BEEP)
precache_sound(SOUND_ATTACK)
precache_sound(SOUND_READY)
precache_sound(SOUND_PLANT)
precache_sound(SOUND_STOP)
IonBeam = precache_model("sprites/ion_canon/ionbeam.spr")
BlueFlare = precache_model("sprites/ion_canon/bflare.spr")
ReadyFire = precache_model("sprites/ion_canon/fire.spr")
BlueFire = precache_model("sprites/ion_canon/blueflame.spr")
LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr")
Shockwave = precache_model("sprites/shockwave.spr")
}
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR )
g_iIonID = ze_register_item( "Ion Cannon", 100, 0)
register_clcmd( "drop", "fn_Drop" )
register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" )
register_event( "DeathMsg", "EV_DeathMsg", "a" )
register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" )
register_forward( FM_CmdStart, "fw_CmdStart" )
register_forward( FM_PlayerPreThink, "fw_idPreThink" )
RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 )
register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" )
gmsgScreenShake = get_user_msgid( "ScreenShake" )
cvar_barlen = register_cvar( "ze_ion_barlen", "4" )
cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" )
cvar_radius = register_cvar( "ze_ion_radius", "2000" )
cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage
cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0
g_iMaxids = get_maxplayers( )
}
public client_connect( id )
{
g_bHasIon[ id ] = false
g_bIsPlanting[ id ] = false
}
public client_disconnected( id )
{
g_bHasIon[ id ] = false
}
public ze_game_started()
{
g_bCanBuy = false
}
public ze_zombie_release()
{
g_bCanBuy = true
}
public ze_select_item_pre(id, itemid)
{
if (itemid != g_iIonID)
return ZE_ITEM_AVAILABLE
if (ze_is_user_zombie(id))
return ZE_ITEM_DONT_SHOW
if (g_bHasIon[id] || !g_bCanBuy)
return ZE_ITEM_UNAVAILABLE
return ZE_ITEM_AVAILABLE
}
public ze_select_item_post(id, itemid)
{
if( itemid == g_iIonID )
{
if( g_bHasIon[id] )
{
client_print( id, print_chat, "[ZE] Already have Ion Cannon" )
return PLUGIN_HANDLED
}
else
{
g_bHasIon[id] = true
give_item( id, "weapon_c4" )
}
}
return PLUGIN_CONTINUE
}
public ze_user_infected(iVictim, iInfector)
{
emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
ProgressBar(iVictim, 0, 0)
remove_task(iVictim+5000)
g_bHasIon[ iVictim ] = false
g_bIsFiring[ iVictim ] = false
g_bIsPlanting[ iVictim ] = false
g_Target[ iVictim ] = 0
}
public ze_user_humanized(id)
{
g_bHasIon[id] = false
emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
ProgressBar(id, 0, 0)
remove_task(id+5000)
g_bIsFiring[ id ] = false
g_bIsPlanting[ id ] = false
g_Target[ id ] = 0
}
public fn_Drop( id )
{
if( !is_user_alive( id ) || !g_bHasIon[ id ] )
return PLUGIN_CONTINUE
if( g_iCurrentWeapon[ id ] == CSW_C4 )
{
client_print( id, print_center, "* You cannot drop Ion Cannon *" )
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public EV_CurWeapon( id )
{
if( !is_user_alive( id ) )
return PLUGIN_CONTINUE
g_iCurrentWeapon[ id ] = read_data( 2 )
return PLUGIN_CONTINUE
}
public EV_DeathMsg( )
{
static iVictim
iVictim = read_data( 2 )
if( !is_user_connected( iVictim ) )
return
g_bHasIon[ iVictim ] = false
g_bIsPlanting[ iVictim ] = false
}
public EV_RoundStart( )
{
// Remove any ion cannons
for( new i = 1; i < g_iMaxids; i++ )
{
if( g_Target[ i ] )
emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
if( is_user_alive( i ) )
{
ProgressBar(i, 0, 0)
remove_task(i+5000)
g_bHasIon[ i ] = false
g_bIsFiring[ i ] = false
g_bIsPlanting[ i ] = false
g_Target[ i ] = 0
}
}
static iEnt
iEnt = -1
while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 )
{
engfunc( EngFunc_RemoveEntity, iEnt )
}
}
public fw_CmdStart( id, UC_Handle, Seed )
{
if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
return FMRES_IGNORED
static afButtons
afButtons = get_uc( UC_Handle, UC_Buttons )
if( afButtons & IN_ATTACK )
{
afButtons &= ~IN_ATTACK
set_uc( UC_Handle, UC_Buttons, afButtons )
if( g_bIsPlanting[ id ] )
{
//ProgressBar(id, 0, 0)
return FMRES_IGNORED
}
if( g_Target[ id ] )
{
client_print( id, print_center, "* You already had planted Ion Cannon *" )
g_bIsPlanting[ id ] = false
return FMRES_IGNORED
}
if( is_user_outside( id ) )
{
g_Target[ id ] = 0
i_Pitch[ id ] = 97
i_BeaconTime[ id ] = 1.12
g_distance[ id ] = 350.0
g_Speed[ id ] = 0.0
static iEnt
iEnt = find_ent_by_owner( -1, "weapon_c4", id )
set_pdata_float( iEnt, 48, 10.0, 4 )
g_bIsFiring[ id ] = true
g_bIsPlanting[ id ] = true
emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
g_iCurrentWeapon[ id ] = CSW_C4
if( get_pcvar_num( cvar_barlen ) > 0 )
{
set_task( 3.6, "UpdateAnim" )
SendWeaponAnim( id, anim_pressbutton )
ProgressBar(id, get_pcvar_num( cvar_barlen ), 0)
set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000)
}
else
{
set_task(0.2,"ion_planted", id+5000)
SendWeaponAnim( id, anim_drop )
}
}
else
{
g_bIsPlanting[ id ] = false
client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" )
return FMRES_IGNORED
}
}
return FMRES_HANDLED
}
public fw_PlayerPreThink( id )
{
if( !is_user_alive( id ) || !g_bHasIon[ id ] )
return
if( g_bIsFiring[ id ] )
{
g_iLastWeapon[ id ] = get_user_weapon( id )
if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK )
{
emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
ProgressBar(id, 0, 0)
remove_task(id+5000)
g_bIsFiring[ id ] = false
g_bIsPlanting[ id ] = false
}
}
}
public fw_KnifeDeploy_Post( iEnt )
{
static id
id = get_pdata_cbase( iEnt, 41, 4 )
if( g_bHasIon[ id ] )
{
set_pev( id, pev_viewmodel2, V_MODEL )
SendWeaponAnim( id, anim_draw )
}
}
public fn_DeathMsg( id, Dest, iEntity )
{
static iVictim, iKiller
iKiller = get_msg_arg_int( 1 )
iVictim = get_msg_arg_int( 2 )
if( !is_user_connected( iVictim ) || iKiller == iVictim )
return PLUGIN_CONTINUE
if ( g_bKilledByIon[ iVictim ] )
{
set_msg_arg_string ( 4, "ion cannon" )
}
return PLUGIN_CONTINUE
}
public ion_planted(id)
{
id -= 5000
if( !is_user_alive( id ) || ze_is_user_zombie( id ) )
{
remove_task( id )
return PLUGIN_CONTINUE
}
client_print(0, print_center, "Ion Cannon has been planted!")
client_cmd(0, "spk %s", SOUND_PLANT)
g_bIsFiring[id] = false
g_bIsPlanting[ id ] = false
static Weapon
Weapon = find_ent_by_owner( -1, "weapon_c4", id )
ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon );
ExecuteHamB( Ham_RemovePlayerItem, id, Weapon );
ExecuteHamB( Ham_Item_Kill, Weapon );
set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) );
cs_set_user_bpammo( id, CSW_C4, 0 );
g_bHasIon[ id ] = false
g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
if(!g_Target[id]) return PLUGIN_HANDLED
// Strings
set_pev(g_Target[id],pev_classname,"info_target_ion")
engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
// Integer
set_pev(g_Target[id],pev_owner, id)
set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id])
//wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
//static Float:flOrigin[ 3 ]
//pev( id, pev_origin, flOrigin )
//engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin )
set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
ion_beacon(id)
set_task(5.0,"ion_startup", id)
return PLUGIN_CONTINUE
}
public ion_beacon(id)
{
if( !g_Target[ id ] )
{
remove_task( id )
return PLUGIN_CONTINUE
}
i_Pitch[id] += 3
i_BeaconTime[id] -= 0.03
if(i_Pitch[id] > 255) i_Pitch[id] = 255
if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30
emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
set_task(i_BeaconTime[id],"ion_beacon", id)
return PLUGIN_CONTINUE
}
public ion_startup(id)
{
client_cmd(0, "spk ^"%s^"", SOUND_APPROACH)
client_print(0, print_chat,"Ion Cannon is approaching")
set_task(5.0,"Trace_Ready", id)
}
public Trace_Ready(id)
{
if( !pev_valid( id ) )
{
remove_task( id )
return PLUGIN_CONTINUE
}
// write origin of each
new Float:mid_origin[33][3]
pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
// 1st
beam_origin[id][0][0] = mid_origin[id][0] + 300.0
beam_origin[id][0][1] = mid_origin[id][1] + 150.0
beam_origin[id][0][2] = mid_origin[id][2]
g_degrees[id][0] = 0.0
// 2nd
beam_origin[id][1][0] = mid_origin[id][0] + 300.0
beam_origin[id][1][1] = mid_origin[id][1] - 150.0
beam_origin[id][1][2] = mid_origin[id][2]
g_degrees[id][1] = 45.0
// 3rd
beam_origin[id][2][0] = mid_origin[id][0] - 300.0
beam_origin[id][2][1] = mid_origin[id][1] - 150.0
beam_origin[id][2][2] = mid_origin[id][2]
g_degrees[id][2] = 90.0
// 4th
beam_origin[id][3][0] = mid_origin[id][0] - 300.0
beam_origin[id][3][1] = mid_origin[id][1] + 150.0
beam_origin[id][3][2] = mid_origin[id][2]
g_degrees[id][3] = 135.0
// 5th
beam_origin[id][4][0] = mid_origin[id][0] + 150.0
beam_origin[id][4][1] = mid_origin[id][1] + 300.0
beam_origin[id][4][2] = mid_origin[id][2]
g_degrees[id][4] = 180.0
// 6th
beam_origin[id][5][0] = mid_origin[id][0] + 150.0
beam_origin[id][5][1] = mid_origin[id][1] - 300.0
beam_origin[id][5][2] = mid_origin[id][2]
g_degrees[id][5] = 225.0
// 7th
beam_origin[id][6][0] = mid_origin[id][0] - 150.0
beam_origin[id][6][1] = mid_origin[id][1] - 300.0
beam_origin[id][6][2] = mid_origin[id][2]
g_degrees[id][6] = 270.0
// 8th
beam_origin[id][7][0] = mid_origin[id][0] - 150.0
beam_origin[id][7][1] = mid_origin[id][1] + 300.0
beam_origin[id][7][2] = mid_origin[id][2]
g_degrees[id][7] = 315.0
// set the mid to global
ion_mid_origin[id] = mid_origin[id]
new Float:addtime
for(new i = 0; i < 8; i++) {
addtime = addtime + 0.3
new param[3]
param[0] = i
param[1] = id
set_task(0.0 + addtime, "Trace_Start", _,param, 2)
}
Laser_Rotate(id) //To fix the laserdraw
client_cmd(0, "spk ^"%s^"", SOUND_READY)
for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
set_task(i+3.0, "Laser_Rotate", id)
set_task(2.9,"AddSpeed", id)
set_task(11.5,"CreateFire", id)
set_task(12.5,"ClearLasers", id)
set_task(18.2,"FireIonCannon", id)
return PLUGIN_CONTINUE
}
public AddSpeed(id)
{
if( !g_Target[ id ] )
{
remove_task( id )
return PLUGIN_CONTINUE
}
if(g_Speed[id] > 1.0) g_Speed[id] = 1.0
g_Speed[id] += 0.1
set_task(0.6,"AddSpeed", id)
return PLUGIN_CONTINUE
}
public CreateFire(id)
{
if( !g_Target[ id ] )
{
g_bExploded = false
remove_task( id )
return PLUGIN_CONTINUE
}
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
write_short(ReadyFire)
write_byte(30)
write_byte(200)
message_end()
set_task(1.5,"CreateFire", id)
return PLUGIN_CONTINUE
}
public ClearLasers(id)
{
// Here we reset the variable
g_bExploded = false
ze_set_fire_grenade(id, false)
remove_task(1018+id)
}
public Laser_Rotate(id)
{
if( !g_Target[ id ] )
{
remove_task( id )
return
}
g_distance[id] -= 0.467
for(new i = 0; i < 8; i++) {
// Calculate new alpha
g_degrees[id][i] += g_Speed[id]
if(g_degrees[id][i] > 360.0)
g_degrees[id][i] -= 360.0
// calcul the next origin
new Float:tmp[33][3]
tmp[id] = ion_mid_origin[id]
tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
tmp[id][2] += 0.0 // -.-
beam_origin[id][i] = tmp[id]
}
}
public Trace_Start(param[])
{
new i = param[0]
new id = param[1]
if( !g_Target[ id ] )
{
remove_task( id )
return
}
new Float:get_random_z,Float:SkyOrigin[33][3]
if( is_user_alive( id ) )
{
SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
get_random_z = random_float(300.0,SkyOrigin[id][2])
}
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
write_short(BlueFire)
write_byte(10)
write_byte(100)
message_end()
TraceAll(param)
}
public TraceAll(param[])
{
new i = param[0]
new id = param[1]
if( !g_Target[ id ] )
{
remove_task( id )
return
}
new Float:SkyOrigin[33][3]
SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y)
engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z)
write_short(IonBeam) //model
write_byte(0) //startframe
write_byte(0) //framerate
write_byte(1) //life
write_byte(50) //width
write_byte(0) //noise
write_byte(255) //r
write_byte(255) //g
write_byte(255) //b
write_byte(255) //brightness
write_byte(0) //speed
message_end()
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
write_short(LaserFlame)
write_byte(5)
write_byte(200)
message_end()
/*message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL)
engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
write_byte(46)
message_end()*/
set_task(0.08,"TraceAll", 1018+id, param, 2)
}
public FireIonCannon(id)
{
if( !g_Target[ id ] )
{
remove_task( id )
return
}
new i = -1
while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0)
{
if( !is_user_connected( i ))
continue
if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT))
{
message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i)
write_short(255<<14) //ammount
write_short(10<<14) //lasts this long
write_short(255<<14) //frequency
message_end()
if (ze_is_user_zombie(i))
ze_set_fire_grenade(i, true)
// After this we turn the variable to true so not to be called next call
g_bExploded = true
}
//next player in spehre.
continue
}
new Float:skyOrigin[33][3]
skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x)
engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y)
engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z)
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x)
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y)
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z)
write_short(IonBeam) //model
write_byte(0) //startframe
write_byte(0) //framerate
write_byte(15) //life
write_byte(255) //width
write_byte(0) //noise
write_byte(255) //r
write_byte(255) //g
write_byte(255) //b
write_byte(255) //brightness
write_byte(0) //speed
message_end()
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
write_byte(TE_BEAMCYLINDER)
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z
write_short(Shockwave) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(100) // life
write_byte(150) // width
write_byte(0) // noise
write_byte(0) // red
write_byte(100) // green
write_byte(250) // blue
write_byte(150) // brightness
write_byte(0) // speed
message_end()
for(new i = 1; i < 6; i++)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
write_short(BlueFlare) // (sprite index)
write_byte(50) // (count)
write_byte(random_num(27,30)) // (life in 0.1's)
write_byte(10) // byte (scale in 0.1's)
write_byte(random_num(30,70)) // (velocity along vector in 10's)
write_byte(40) // (randomness of velocity in 10's)
message_end()
}
switch( get_pcvar_num( cvar_ionmode ) )
{
case 0:
{
for( new i = 1; i < g_iMaxids; i++ )
{
if( is_user_alive( i ) && ze_is_user_zombie( i ) )
{
static Float:flHealth
flHealth = entity_get_float( i, EV_FL_health )
static Float:flDamage
flDamage = get_pcvar_float( cvar_damage )
if( flHealth - flDamage >= 1 )
{
ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST )
}
else
{
g_bKilledByIon[ i ] = true
ExecuteHamB( Ham_Killed, i, id, 2 )
g_bKilledByIon[ i ] = false
}
}
}
}
case 1:
{
static victim
victim = -1
while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 )
{
if( !is_user_connected( victim ) )
{
if( pev_valid( victim ) )
{
static szClassname[ 32 ]
pev( victim, pev_classname, szClassname, 31 )
if( equal( szClassname, "func_breakable" ) )
{
force_use( id, victim )
}
}
continue
}
if ( !is_user_alive( victim ) )
continue
if( !ze_is_user_zombie( victim ) )
continue
static Float:flOrigin[ 3 ]
pev( victim, pev_origin, flOrigin )
static Float:flDistance, Float:flDamage
flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin )
flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance )
if( flDamage )
{
static Float:flHealth
flHealth = entity_get_float( victim, EV_FL_health )
if( flHealth - flDamage >= 1 )
{
ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST )
}
else
{
g_bKilledByIon[ victim ] = true
ExecuteHamB( Ham_Killed, victim, id, 2 )
g_bKilledByIon[ victim ] = false
}
}
}
}
}
client_cmd(0, "spk ^"%s^"", SOUND_ATTACK)
ResetAll(id)
}
ResetAll(id)
{
if( !g_Target[ id ] )
{
remove_task( id )
return
}
set_pev(g_Target[id], pev_flags, FL_KILLME)
g_Target[id] = 0
}
/******************** Stocks ********************/
// Get entity above sky.
stock Float:tlx_distance_to_sky(id)
{
new Float:TraceEnd[3]
pev(id, pev_origin, TraceEnd)
new Float:f_dest[3]
f_dest[0] = TraceEnd[0]
f_dest[1] = TraceEnd[1]
f_dest[2] = TraceEnd[2] + 8192.0
new res, Float:SkyOrigin[3]
engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
get_tr2(res, TR_vecEndPos, SkyOrigin)
return SkyOrigin
}
//return distance above us to sky
stock Float:is_user_outside(id)
{
new Float:origin[3], Float:dist
pev(id, pev_origin, origin)
dist = origin[2]
while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
origin[2] += 5.0
if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
return (origin[2] - dist)
return 0.0
}
stock ProgressBar(id, seconds, position)
{
message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
write_byte(seconds)
write_byte(position)
message_end()
}
SendWeaponAnim( id, Sequence )
{
set_pev( id, pev_weaponanim, Sequence )
message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id )
write_byte( Sequence )
write_byte( pev( id, pev_body ) )
message_end( )
}
public UpdateAnim( id )
{
if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
return
SendWeaponAnim( id, anim_drop )
}
stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance)
{
return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance))
}
Umm noJack GamePlay wrote: ↑5 years ago Try:
Code: Select all
#include <zombie_escape> #include <engine> #include <cstrike> #include <fun> #include <fakemeta_util> new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon" new const VERSION[] = "1.0" new const AUTHOR[] = "A.F./Mark" //#define ION_RADIUS 2000.0 //#define ION_MAXDAMAGE 54200.0 #define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE) new const V_MODEL[] = "models/v_c4.mdl" new const W_MODEL[] = "models/w_battery.mdl" new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav" new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav" new const SOUND_STOP[] = "vox/_comma.wav" new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav" new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav" new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav" new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav" new g_iCurrentWeapon[33] new bool:g_bHasIon[33] new bool:g_bCanBuy new bool:g_bIsFiring[33] new bool:g_bKilledByIon[33] new bool:g_bIsPlanting[33] new g_iLastWeapon[33] new g_Target[33] new i_Pitch[33] new Float:i_BeaconTime[33] new Float:ion_mid_origin[33][3] new Float:beam_origin[33][8][3] new Float:g_degrees[33][8] new Float:g_distance[33] new Float:g_Speed[33] new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame new g_iIonID new gmsgScreenShake new g_iMaxids new bool:g_bExploded /* This variable first initialized to false */ new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage enum { anim_idle, anim_draw, anim_drop, anim_pressbutton } public plugin_precache() { precache_model(V_MODEL) precache_model(W_MODEL) precache_sound(SOUND_APPROACH) precache_sound(SOUND_BEACON) precache_sound(SOUND_BEEP) precache_sound(SOUND_ATTACK) precache_sound(SOUND_READY) precache_sound(SOUND_PLANT) precache_sound(SOUND_STOP) IonBeam = precache_model("sprites/ion_canon/ionbeam.spr") BlueFlare = precache_model("sprites/ion_canon/bflare.spr") ReadyFire = precache_model("sprites/ion_canon/fire.spr") BlueFire = precache_model("sprites/ion_canon/blueflame.spr") LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr") Shockwave = precache_model("sprites/shockwave.spr") } public plugin_init() { register_plugin( PLUGIN, VERSION, AUTHOR ) g_iIonID = ze_register_item( "Ion Cannon", 100, 0) register_clcmd( "drop", "fn_Drop" ) register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" ) register_event( "DeathMsg", "EV_DeathMsg", "a" ) register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" ) register_forward( FM_CmdStart, "fw_CmdStart" ) register_forward( FM_PlayerPreThink, "fw_idPreThink" ) RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 ) register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" ) gmsgScreenShake = get_user_msgid( "ScreenShake" ) cvar_barlen = register_cvar( "ze_ion_barlen", "4" ) cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" ) cvar_radius = register_cvar( "ze_ion_radius", "2000" ) cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0 g_iMaxids = get_maxplayers( ) } public client_connect( id ) { g_bHasIon[ id ] = false g_bIsPlanting[ id ] = false } public client_disconnected( id ) { g_bHasIon[ id ] = false } public ze_game_started() { g_bCanBuy = false } public ze_zombie_release() { g_bCanBuy = true } public ze_select_item_pre(id, itemid) { if (itemid != g_iIonID) return ZE_ITEM_AVAILABLE if (ze_is_user_zombie(id)) return ZE_ITEM_DONT_SHOW if (g_bHasIon[id] || !g_bCanBuy) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid) { if( itemid == g_iIonID ) { if( g_bHasIon[id] ) { client_print( id, print_chat, "[ZE] Already have Ion Cannon" ) return PLUGIN_HANDLED } else { g_bHasIon[id] = true give_item( id, "weapon_c4" ) } } return PLUGIN_CONTINUE } public ze_user_infected(iVictim, iInfector) { emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(iVictim, 0, 0) remove_task(iVictim+5000) g_bHasIon[ iVictim ] = false g_bIsFiring[ iVictim ] = false g_bIsPlanting[ iVictim ] = false g_Target[ iVictim ] = 0 } public ze_user_humanized(id) { g_bHasIon[id] = false emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(id, 0, 0) remove_task(id+5000) g_bIsFiring[ id ] = false g_bIsPlanting[ id ] = false g_Target[ id ] = 0 } public fn_Drop( id ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] ) return PLUGIN_CONTINUE if( g_iCurrentWeapon[ id ] == CSW_C4 ) { client_print( id, print_center, "* You cannot drop Ion Cannon *" ) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } public EV_CurWeapon( id ) { if( !is_user_alive( id ) ) return PLUGIN_CONTINUE g_iCurrentWeapon[ id ] = read_data( 2 ) return PLUGIN_CONTINUE } public EV_DeathMsg( ) { static iVictim iVictim = read_data( 2 ) if( !is_user_connected( iVictim ) ) return g_bHasIon[ iVictim ] = false g_bIsPlanting[ iVictim ] = false } public EV_RoundStart( ) { // Remove any ion cannons for( new i = 1; i < g_iMaxids; i++ ) { if( g_Target[ i ] ) emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) if( is_user_alive( i ) ) { ProgressBar(i, 0, 0) remove_task(i+5000) g_bHasIon[ i ] = false g_bIsFiring[ i ] = false g_bIsPlanting[ i ] = false g_Target[ i ] = 0 } } static iEnt iEnt = -1 while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 ) { engfunc( EngFunc_RemoveEntity, iEnt ) } } public fw_CmdStart( id, UC_Handle, Seed ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 ) return FMRES_IGNORED static afButtons afButtons = get_uc( UC_Handle, UC_Buttons ) if( afButtons & IN_ATTACK ) { afButtons &= ~IN_ATTACK set_uc( UC_Handle, UC_Buttons, afButtons ) if( g_bIsPlanting[ id ] ) { //ProgressBar(id, 0, 0) return FMRES_IGNORED } if( g_Target[ id ] ) { client_print( id, print_center, "* You already had planted Ion Cannon *" ) g_bIsPlanting[ id ] = false return FMRES_IGNORED } if( is_user_outside( id ) ) { g_Target[ id ] = 0 i_Pitch[ id ] = 97 i_BeaconTime[ id ] = 1.12 g_distance[ id ] = 350.0 g_Speed[ id ] = 0.0 static iEnt iEnt = find_ent_by_owner( -1, "weapon_c4", id ) set_pdata_float( iEnt, 48, 10.0, 4 ) g_bIsFiring[ id ] = true g_bIsPlanting[ id ] = true emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) g_iCurrentWeapon[ id ] = CSW_C4 if( get_pcvar_num( cvar_barlen ) > 0 ) { set_task( 3.6, "UpdateAnim" ) SendWeaponAnim( id, anim_pressbutton ) ProgressBar(id, get_pcvar_num( cvar_barlen ), 0) set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000) } else { set_task(0.2,"ion_planted", id+5000) SendWeaponAnim( id, anim_drop ) } } else { g_bIsPlanting[ id ] = false client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" ) return FMRES_IGNORED } } return FMRES_HANDLED } public fw_PlayerPreThink( id ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] ) return if( g_bIsFiring[ id ] ) { g_iLastWeapon[ id ] = get_user_weapon( id ) if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK ) { emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(id, 0, 0) remove_task(id+5000) g_bIsFiring[ id ] = false g_bIsPlanting[ id ] = false } } } public fw_KnifeDeploy_Post( iEnt ) { static id id = get_pdata_cbase( iEnt, 41, 4 ) if( g_bHasIon[ id ] ) { set_pev( id, pev_viewmodel2, V_MODEL ) SendWeaponAnim( id, anim_draw ) } } public fn_DeathMsg( id, Dest, iEntity ) { static iVictim, iKiller iKiller = get_msg_arg_int( 1 ) iVictim = get_msg_arg_int( 2 ) if( !is_user_connected( iVictim ) || iKiller == iVictim ) return PLUGIN_CONTINUE if ( g_bKilledByIon[ iVictim ] ) { set_msg_arg_string ( 4, "ion cannon" ) } return PLUGIN_CONTINUE } public ion_planted(id) { id -= 5000 if( !is_user_alive( id ) || ze_is_user_zombie( id ) ) { remove_task( id ) return PLUGIN_CONTINUE } client_print(0, print_center, "Ion Cannon has been planted!") client_cmd(0, "spk %s", SOUND_PLANT) g_bIsFiring[id] = false g_bIsPlanting[ id ] = false static Weapon Weapon = find_ent_by_owner( -1, "weapon_c4", id ) ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon ); ExecuteHamB( Ham_RemovePlayerItem, id, Weapon ); ExecuteHamB( Ham_Item_Kill, Weapon ); set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) ); cs_set_user_bpammo( id, CSW_C4, 0 ); g_bHasIon[ id ] = false g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) if(!g_Target[id]) return PLUGIN_HANDLED // Strings set_pev(g_Target[id],pev_classname,"info_target_ion") engfunc(EngFunc_SetModel,g_Target[id],W_MODEL) // Integer set_pev(g_Target[id],pev_owner, id) set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS) set_pev(g_Target[id],pev_solid, SOLID_TRIGGER) entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id]) //wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id]) //static Float:flOrigin[ 3 ] //pev( id, pev_origin, flOrigin ) //engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin ) set_pev(g_Target[id],pev_origin,ion_mid_origin[id]) ion_beacon(id) set_task(5.0,"ion_startup", id) return PLUGIN_CONTINUE } public ion_beacon(id) { if( !g_Target[ id ] ) { remove_task( id ) return PLUGIN_CONTINUE } i_Pitch[id] += 3 i_BeaconTime[id] -= 0.03 if(i_Pitch[id] > 255) i_Pitch[id] = 255 if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30 emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id]) set_task(i_BeaconTime[id],"ion_beacon", id) return PLUGIN_CONTINUE } public ion_startup(id) { client_cmd(0, "spk ^"%s^"", SOUND_APPROACH) client_print(0, print_chat,"Ion Cannon is approaching") set_task(5.0,"Trace_Ready", id) } public Trace_Ready(id) { if( !pev_valid( id ) ) { remove_task( id ) return PLUGIN_CONTINUE } // write origin of each new Float:mid_origin[33][3] pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id // 1st beam_origin[id][0][0] = mid_origin[id][0] + 300.0 beam_origin[id][0][1] = mid_origin[id][1] + 150.0 beam_origin[id][0][2] = mid_origin[id][2] g_degrees[id][0] = 0.0 // 2nd beam_origin[id][1][0] = mid_origin[id][0] + 300.0 beam_origin[id][1][1] = mid_origin[id][1] - 150.0 beam_origin[id][1][2] = mid_origin[id][2] g_degrees[id][1] = 45.0 // 3rd beam_origin[id][2][0] = mid_origin[id][0] - 300.0 beam_origin[id][2][1] = mid_origin[id][1] - 150.0 beam_origin[id][2][2] = mid_origin[id][2] g_degrees[id][2] = 90.0 // 4th beam_origin[id][3][0] = mid_origin[id][0] - 300.0 beam_origin[id][3][1] = mid_origin[id][1] + 150.0 beam_origin[id][3][2] = mid_origin[id][2] g_degrees[id][3] = 135.0 // 5th beam_origin[id][4][0] = mid_origin[id][0] + 150.0 beam_origin[id][4][1] = mid_origin[id][1] + 300.0 beam_origin[id][4][2] = mid_origin[id][2] g_degrees[id][4] = 180.0 // 6th beam_origin[id][5][0] = mid_origin[id][0] + 150.0 beam_origin[id][5][1] = mid_origin[id][1] - 300.0 beam_origin[id][5][2] = mid_origin[id][2] g_degrees[id][5] = 225.0 // 7th beam_origin[id][6][0] = mid_origin[id][0] - 150.0 beam_origin[id][6][1] = mid_origin[id][1] - 300.0 beam_origin[id][6][2] = mid_origin[id][2] g_degrees[id][6] = 270.0 // 8th beam_origin[id][7][0] = mid_origin[id][0] - 150.0 beam_origin[id][7][1] = mid_origin[id][1] + 300.0 beam_origin[id][7][2] = mid_origin[id][2] g_degrees[id][7] = 315.0 // set the mid to global ion_mid_origin[id] = mid_origin[id] new Float:addtime for(new i = 0; i < 8; i++) { addtime = addtime + 0.3 new param[3] param[0] = i param[1] = id set_task(0.0 + addtime, "Trace_Start", _,param, 2) } Laser_Rotate(id) //To fix the laserdraw client_cmd(0, "spk ^"%s^"", SOUND_READY) for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs. set_task(i+3.0, "Laser_Rotate", id) set_task(2.9,"AddSpeed", id) set_task(11.5,"CreateFire", id) set_task(12.5,"ClearLasers", id) set_task(18.2,"FireIonCannon", id) return PLUGIN_CONTINUE } public AddSpeed(id) { if( !g_Target[ id ] ) { remove_task( id ) return PLUGIN_CONTINUE } if(g_Speed[id] > 1.0) g_Speed[id] = 1.0 g_Speed[id] += 0.1 set_task(0.6,"AddSpeed", id) return PLUGIN_CONTINUE } public CreateFire(id) { if( !g_Target[ id ] ) { g_bExploded = false remove_task( id ) return PLUGIN_CONTINUE } engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100) write_short(ReadyFire) write_byte(30) write_byte(200) message_end() set_task(1.5,"CreateFire", id) return PLUGIN_CONTINUE } public ClearLasers(id) { // Here we reset the variable g_bExploded = false ze_set_fire_grenade(id, false) remove_task(1018+id) } public Laser_Rotate(id) { if( !g_Target[ id ] ) { remove_task( id ) return } g_distance[id] -= 0.467 for(new i = 0; i < 8; i++) { // Calculate new alpha g_degrees[id][i] += g_Speed[id] if(g_degrees[id][i] > 360.0) g_degrees[id][i] -= 360.0 // calcul the next origin new Float:tmp[33][3] tmp[id] = ion_mid_origin[id] tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id] tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id] tmp[id][2] += 0.0 // -.- beam_origin[id][i] = tmp[id] } } public Trace_Start(param[]) { new i = param[0] new id = param[1] if( !g_Target[ id ] ) { remove_task( id ) return } new Float:get_random_z,Float:SkyOrigin[33][3] if( is_user_alive( id ) ) { SkyOrigin[id] = tlx_distance_to_sky(g_Target[id]) get_random_z = random_float(300.0,SkyOrigin[id][2]) } engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z) write_short(BlueFire) write_byte(10) write_byte(100) message_end() TraceAll(param) } public TraceAll(param[]) { new i = param[0] new id = param[1] if( !g_Target[ id ] ) { remove_task( id ) return } new Float:SkyOrigin[33][3] SkyOrigin[id] = tlx_distance_to_sky(g_Target[id]) engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_BEAMPOINTS) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y) engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z) write_short(IonBeam) //model write_byte(0) //startframe write_byte(0) //framerate write_byte(1) //life write_byte(50) //width write_byte(0) //noise write_byte(255) //r write_byte(255) //g write_byte(255) //b write_byte(255) //brightness write_byte(0) //speed message_end() engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) write_short(LaserFlame) write_byte(5) write_byte(200) message_end() /*message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_WORLDDECAL) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) write_byte(46) message_end()*/ set_task(0.08,"TraceAll", 1018+id, param, 2) } public FireIonCannon(id) { if( !g_Target[ id ] ) { remove_task( id ) return } new i = -1 while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0) { if( !is_user_connected( i )) continue if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)) { message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i) write_short(255<<14) //ammount write_short(10<<14) //lasts this long write_short(255<<14) //frequency message_end() if (ze_is_user_zombie(i)) ze_set_fire_grenade(i, true) // After this we turn the variable to true so not to be called next call g_bExploded = true } //next player in spehre. continue } new Float:skyOrigin[33][3] skyOrigin[id] = tlx_distance_to_sky(g_Target[id]) engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_BEAMPOINTS) engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x) engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y) engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z) write_short(IonBeam) //model write_byte(0) //startframe write_byte(0) //framerate write_byte(15) //life write_byte(255) //width write_byte(0) //noise write_byte(255) //r write_byte(255) //g write_byte(255) //b write_byte(255) //brightness write_byte(0) //speed message_end() engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0) write_byte(TE_BEAMCYLINDER) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z write_short(Shockwave) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(100) // life write_byte(150) // width write_byte(0) // noise write_byte(0) // red write_byte(100) // green write_byte(250) // blue write_byte(150) // brightness write_byte(0) // speed message_end() for(new i = 1; i < 6; i++) { engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200) write_short(BlueFlare) // (sprite index) write_byte(50) // (count) write_byte(random_num(27,30)) // (life in 0.1's) write_byte(10) // byte (scale in 0.1's) write_byte(random_num(30,70)) // (velocity along vector in 10's) write_byte(40) // (randomness of velocity in 10's) message_end() } switch( get_pcvar_num( cvar_ionmode ) ) { case 0: { for( new i = 1; i < g_iMaxids; i++ ) { if( is_user_alive( i ) && ze_is_user_zombie( i ) ) { static Float:flHealth flHealth = entity_get_float( i, EV_FL_health ) static Float:flDamage flDamage = get_pcvar_float( cvar_damage ) if( flHealth - flDamage >= 1 ) { ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST ) } else { g_bKilledByIon[ i ] = true ExecuteHamB( Ham_Killed, i, id, 2 ) g_bKilledByIon[ i ] = false } } } } case 1: { static victim victim = -1 while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 ) { if( !is_user_connected( victim ) ) { if( pev_valid( victim ) ) { static szClassname[ 32 ] pev( victim, pev_classname, szClassname, 31 ) if( equal( szClassname, "func_breakable" ) ) { force_use( id, victim ) } } continue } if ( !is_user_alive( victim ) ) continue if( !ze_is_user_zombie( victim ) ) continue static Float:flOrigin[ 3 ] pev( victim, pev_origin, flOrigin ) static Float:flDistance, Float:flDamage flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin ) flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance ) if( flDamage ) { static Float:flHealth flHealth = entity_get_float( victim, EV_FL_health ) if( flHealth - flDamage >= 1 ) { ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST ) } else { g_bKilledByIon[ victim ] = true ExecuteHamB( Ham_Killed, victim, id, 2 ) g_bKilledByIon[ victim ] = false } } } } } client_cmd(0, "spk ^"%s^"", SOUND_ATTACK) ResetAll(id) } ResetAll(id) { if( !g_Target[ id ] ) { remove_task( id ) return } set_pev(g_Target[id], pev_flags, FL_KILLME) g_Target[id] = 0 } /******************** Stocks ********************/ // Get entity above sky. stock Float:tlx_distance_to_sky(id) { new Float:TraceEnd[3] pev(id, pev_origin, TraceEnd) new Float:f_dest[3] f_dest[0] = TraceEnd[0] f_dest[1] = TraceEnd[1] f_dest[2] = TraceEnd[2] + 8192.0 new res, Float:SkyOrigin[3] engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res) get_tr2(res, TR_vecEndPos, SkyOrigin) return SkyOrigin } //return distance above us to sky stock Float:is_user_outside(id) { new Float:origin[3], Float:dist pev(id, pev_origin, origin) dist = origin[2] while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY) origin[2] += 5.0 if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY) return (origin[2] - dist) return 0.0 } stock ProgressBar(id, seconds, position) { message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id) write_byte(seconds) write_byte(position) message_end() } SendWeaponAnim( id, Sequence ) { set_pev( id, pev_weaponanim, Sequence ) message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id ) write_byte( Sequence ) write_byte( pev( id, pev_body ) ) message_end( ) } public UpdateAnim( id ) { if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 ) return SendWeaponAnim( id, anim_drop ) } stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance) { return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance)) }
Player should be in the sphere with specific radius to be fired, in your code you set all zombies fire regardless where they are and then all players fired.
We search for all entities in a sphere with the radius we define from CVAR then if this entity is player we will fire him:
We search for all entities in a sphere with the radius we define from CVAR then if this entity is player we will fire him:
- #include <zombie_escape>
- #include <engine>
- #include <cstrike>
- #include <fun>
- #include <fakemeta_util>
- new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon"
- new const VERSION[] = "1.0"
- new const AUTHOR[] = "A.F./Mark"
- //#define ION_RADIUS 2000.0
- //#define ION_MAXDAMAGE 54200.0
- #define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE)
- new const V_MODEL[] = "models/v_c4.mdl"
- new const W_MODEL[] = "models/w_battery.mdl"
- new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav"
- new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav"
- new const SOUND_STOP[] = "vox/_comma.wav"
- new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav"
- new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav"
- new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav"
- new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav"
- new g_iCurrentWeapon[33]
- new bool:g_bHasIon[33]
- new bool:g_bCanBuy
- new bool:g_bIsFiring[33]
- new bool:g_bKilledByIon[33]
- new bool:g_bIsPlanting[33]
- new g_iLastWeapon[33]
- new g_Target[33]
- new i_Pitch[33]
- new Float:i_BeaconTime[33]
- new Float:ion_mid_origin[33][3]
- new Float:beam_origin[33][8][3]
- new Float:g_degrees[33][8]
- new Float:g_distance[33]
- new Float:g_Speed[33]
- new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame
- new g_iIonID
- new gmsgScreenShake
- new g_iMaxids
- new bool:g_bExploded /* This variable first initialized to false */
- new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage
- enum
- {
- anim_idle,
- anim_draw,
- anim_drop,
- anim_pressbutton
- }
- public plugin_precache()
- {
- precache_model(V_MODEL)
- precache_model(W_MODEL)
- precache_sound(SOUND_APPROACH)
- precache_sound(SOUND_BEACON)
- precache_sound(SOUND_BEEP)
- precache_sound(SOUND_ATTACK)
- precache_sound(SOUND_READY)
- precache_sound(SOUND_PLANT)
- precache_sound(SOUND_STOP)
- IonBeam = precache_model("sprites/ion_canon/ionbeam.spr")
- BlueFlare = precache_model("sprites/ion_canon/bflare.spr")
- ReadyFire = precache_model("sprites/ion_canon/fire.spr")
- BlueFire = precache_model("sprites/ion_canon/blueflame.spr")
- LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr")
- Shockwave = precache_model("sprites/shockwave.spr")
- }
- public plugin_init()
- {
- register_plugin( PLUGIN, VERSION, AUTHOR )
- g_iIonID = ze_register_item( "Ion Cannon", 100, 0)
- register_clcmd( "drop", "fn_Drop" )
- register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" )
- register_event( "DeathMsg", "EV_DeathMsg", "a" )
- register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" )
- register_forward( FM_CmdStart, "fw_CmdStart" )
- register_forward( FM_PlayerPreThink, "fw_idPreThink" )
- RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 )
- register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" )
- gmsgScreenShake = get_user_msgid( "ScreenShake" )
- cvar_barlen = register_cvar( "ze_ion_barlen", "4" )
- cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" )
- cvar_radius = register_cvar( "ze_ion_radius", "2000" )
- cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage
- cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0
- g_iMaxids = get_maxplayers( )
- }
- public client_connect( id )
- {
- g_bHasIon[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- public client_disconnected( id )
- {
- g_bHasIon[ id ] = false
- }
- public ze_game_started()
- {
- g_bCanBuy = false
- }
- public ze_zombie_release()
- {
- g_bCanBuy = true
- }
- public ze_select_item_pre(id, itemid)
- {
- if (itemid != g_iIonID)
- return ZE_ITEM_AVAILABLE
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- if (g_bHasIon[id] || !g_bCanBuy)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- if( itemid == g_iIonID )
- {
- if( g_bHasIon[id] )
- {
- client_print( id, print_chat, "[ZE] Already have Ion Cannon" )
- return PLUGIN_HANDLED
- }
- else
- {
- g_bHasIon[id] = true
- give_item( id, "weapon_c4" )
- }
- }
- return PLUGIN_CONTINUE
- }
- public ze_user_infected(iVictim, iInfector)
- {
- emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(iVictim, 0, 0)
- remove_task(iVictim+5000)
- g_bHasIon[ iVictim ] = false
- g_bIsFiring[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- g_Target[ iVictim ] = 0
- }
- public ze_user_humanized(id)
- {
- g_bHasIon[id] = false
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- g_Target[ id ] = 0
- }
- public fn_Drop( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return PLUGIN_CONTINUE
- if( g_iCurrentWeapon[ id ] == CSW_C4 )
- {
- client_print( id, print_center, "* You cannot drop Ion Cannon *" )
- return PLUGIN_HANDLED
- }
- return PLUGIN_CONTINUE
- }
- public EV_CurWeapon( id )
- {
- if( !is_user_alive( id ) )
- return PLUGIN_CONTINUE
- g_iCurrentWeapon[ id ] = read_data( 2 )
- return PLUGIN_CONTINUE
- }
- public EV_DeathMsg( )
- {
- static iVictim
- iVictim = read_data( 2 )
- if( !is_user_connected( iVictim ) )
- return
- g_bHasIon[ iVictim ] = false
- g_bIsPlanting[ iVictim ] = false
- }
- public EV_RoundStart( )
- {
- // Remove any ion cannons
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( g_Target[ i ] )
- emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- if( is_user_alive( i ) )
- {
- ProgressBar(i, 0, 0)
- remove_task(i+5000)
- g_bHasIon[ i ] = false
- g_bIsFiring[ i ] = false
- g_bIsPlanting[ i ] = false
- g_Target[ i ] = 0
- }
- }
- static iEnt
- iEnt = -1
- while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 )
- {
- engfunc( EngFunc_RemoveEntity, iEnt )
- }
- }
- public fw_CmdStart( id, UC_Handle, Seed )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return FMRES_IGNORED
- static afButtons
- afButtons = get_uc( UC_Handle, UC_Buttons )
- if( afButtons & IN_ATTACK )
- {
- afButtons &= ~IN_ATTACK
- set_uc( UC_Handle, UC_Buttons, afButtons )
- if( g_bIsPlanting[ id ] )
- {
- //ProgressBar(id, 0, 0)
- return FMRES_IGNORED
- }
- if( g_Target[ id ] )
- {
- client_print( id, print_center, "* You already had planted Ion Cannon *" )
- g_bIsPlanting[ id ] = false
- return FMRES_IGNORED
- }
- if( is_user_outside( id ) )
- {
- g_Target[ id ] = 0
- i_Pitch[ id ] = 97
- i_BeaconTime[ id ] = 1.12
- g_distance[ id ] = 350.0
- g_Speed[ id ] = 0.0
- static iEnt
- iEnt = find_ent_by_owner( -1, "weapon_c4", id )
- set_pdata_float( iEnt, 48, 10.0, 4 )
- g_bIsFiring[ id ] = true
- g_bIsPlanting[ id ] = true
- emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- g_iCurrentWeapon[ id ] = CSW_C4
- if( get_pcvar_num( cvar_barlen ) > 0 )
- {
- set_task( 3.6, "UpdateAnim" )
- SendWeaponAnim( id, anim_pressbutton )
- ProgressBar(id, get_pcvar_num( cvar_barlen ), 0)
- set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000)
- }
- else
- {
- set_task(0.2,"ion_planted", id+5000)
- SendWeaponAnim( id, anim_drop )
- }
- }
- else
- {
- g_bIsPlanting[ id ] = false
- client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" )
- return FMRES_IGNORED
- }
- }
- return FMRES_HANDLED
- }
- public fw_PlayerPreThink( id )
- {
- if( !is_user_alive( id ) || !g_bHasIon[ id ] )
- return
- if( g_bIsFiring[ id ] )
- {
- g_iLastWeapon[ id ] = get_user_weapon( id )
- if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK )
- {
- emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- ProgressBar(id, 0, 0)
- remove_task(id+5000)
- g_bIsFiring[ id ] = false
- g_bIsPlanting[ id ] = false
- }
- }
- }
- public fw_KnifeDeploy_Post( iEnt )
- {
- static id
- id = get_pdata_cbase( iEnt, 41, 4 )
- if( g_bHasIon[ id ] )
- {
- set_pev( id, pev_viewmodel2, V_MODEL )
- SendWeaponAnim( id, anim_draw )
- }
- }
- public fn_DeathMsg( id, Dest, iEntity )
- {
- static iVictim, iKiller
- iKiller = get_msg_arg_int( 1 )
- iVictim = get_msg_arg_int( 2 )
- if( !is_user_connected( iVictim ) || iKiller == iVictim )
- return PLUGIN_CONTINUE
- if ( g_bKilledByIon[ iVictim ] )
- {
- set_msg_arg_string ( 4, "ion cannon" )
- }
- return PLUGIN_CONTINUE
- }
- public ion_planted(id)
- {
- id -= 5000
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- client_print(0, print_center, "Ion Cannon has been planted!")
- client_cmd(0, "spk %s", SOUND_PLANT)
- g_bIsFiring[id] = false
- g_bIsPlanting[ id ] = false
- static Weapon
- Weapon = find_ent_by_owner( -1, "weapon_c4", id )
- ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon );
- ExecuteHamB( Ham_RemovePlayerItem, id, Weapon );
- ExecuteHamB( Ham_Item_Kill, Weapon );
- set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) );
- cs_set_user_bpammo( id, CSW_C4, 0 );
- g_bHasIon[ id ] = false
- g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
- if(!g_Target[id]) return PLUGIN_HANDLED
- // Strings
- set_pev(g_Target[id],pev_classname,"info_target_ion")
- engfunc(EngFunc_SetModel,g_Target[id],W_MODEL)
- // Integer
- set_pev(g_Target[id],pev_owner, id)
- set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS)
- set_pev(g_Target[id],pev_solid, SOLID_TRIGGER)
- entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id])
- //wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id])
- //static Float:flOrigin[ 3 ]
- //pev( id, pev_origin, flOrigin )
- //engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin )
- set_pev(g_Target[id],pev_origin,ion_mid_origin[id])
- ion_beacon(id)
- set_task(5.0,"ion_startup", id)
- return PLUGIN_CONTINUE
- }
- public ion_beacon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- i_Pitch[id] += 3
- i_BeaconTime[id] -= 0.03
- if(i_Pitch[id] > 255) i_Pitch[id] = 255
- if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30
- emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id])
- set_task(i_BeaconTime[id],"ion_beacon", id)
- return PLUGIN_CONTINUE
- }
- public ion_startup(id)
- {
- client_cmd(0, "spk ^"%s^"", SOUND_APPROACH)
- client_print(0, print_chat,"Ion Cannon is approaching")
- set_task(5.0,"Trace_Ready", id)
- }
- public Trace_Ready(id)
- {
- if( !pev_valid( id ) )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- // write origin of each
- new Float:mid_origin[33][3]
- pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id
- // 1st
- beam_origin[id][0][0] = mid_origin[id][0] + 300.0
- beam_origin[id][0][1] = mid_origin[id][1] + 150.0
- beam_origin[id][0][2] = mid_origin[id][2]
- g_degrees[id][0] = 0.0
- // 2nd
- beam_origin[id][1][0] = mid_origin[id][0] + 300.0
- beam_origin[id][1][1] = mid_origin[id][1] - 150.0
- beam_origin[id][1][2] = mid_origin[id][2]
- g_degrees[id][1] = 45.0
- // 3rd
- beam_origin[id][2][0] = mid_origin[id][0] - 300.0
- beam_origin[id][2][1] = mid_origin[id][1] - 150.0
- beam_origin[id][2][2] = mid_origin[id][2]
- g_degrees[id][2] = 90.0
- // 4th
- beam_origin[id][3][0] = mid_origin[id][0] - 300.0
- beam_origin[id][3][1] = mid_origin[id][1] + 150.0
- beam_origin[id][3][2] = mid_origin[id][2]
- g_degrees[id][3] = 135.0
- // 5th
- beam_origin[id][4][0] = mid_origin[id][0] + 150.0
- beam_origin[id][4][1] = mid_origin[id][1] + 300.0
- beam_origin[id][4][2] = mid_origin[id][2]
- g_degrees[id][4] = 180.0
- // 6th
- beam_origin[id][5][0] = mid_origin[id][0] + 150.0
- beam_origin[id][5][1] = mid_origin[id][1] - 300.0
- beam_origin[id][5][2] = mid_origin[id][2]
- g_degrees[id][5] = 225.0
- // 7th
- beam_origin[id][6][0] = mid_origin[id][0] - 150.0
- beam_origin[id][6][1] = mid_origin[id][1] - 300.0
- beam_origin[id][6][2] = mid_origin[id][2]
- g_degrees[id][6] = 270.0
- // 8th
- beam_origin[id][7][0] = mid_origin[id][0] - 150.0
- beam_origin[id][7][1] = mid_origin[id][1] + 300.0
- beam_origin[id][7][2] = mid_origin[id][2]
- g_degrees[id][7] = 315.0
- // set the mid to global
- ion_mid_origin[id] = mid_origin[id]
- new Float:addtime
- for(new i = 0; i < 8; i++) {
- addtime = addtime + 0.3
- new param[3]
- param[0] = i
- param[1] = id
- set_task(0.0 + addtime, "Trace_Start", _,param, 2)
- }
- Laser_Rotate(id) //To fix the laserdraw
- client_cmd(0, "spk ^"%s^"", SOUND_READY)
- for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs.
- set_task(i+3.0, "Laser_Rotate", id)
- set_task(2.9,"AddSpeed", id)
- set_task(11.5,"CreateFire", id)
- set_task(12.5,"ClearLasers", id)
- set_task(18.2,"FireIonCannon", id)
- return PLUGIN_CONTINUE
- }
- public AddSpeed(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- if(g_Speed[id] > 1.0) g_Speed[id] = 1.0
- g_Speed[id] += 0.1
- set_task(0.6,"AddSpeed", id)
- return PLUGIN_CONTINUE
- }
- public CreateFire(id)
- {
- if( !g_Target[ id ] )
- {
- g_bExploded = false
- remove_task( id )
- return PLUGIN_CONTINUE
- }
- new i = -1
- while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0)
- {
- if( !is_user_connected( i ))
- continue
- // Here we check if it's exploded before or not?
- if (!g_bExploded)
- {
- //for( new id = 1; id < g_iMaxids; id++ )
- //{
- if(ze_is_user_zombie(i))
- {
- ze_set_fire_grenade(i, true)
- }
- //}
- // After this we turn the variable to true so not to be called next call
- g_bExploded = true
- }
- //next player in spehre.
- continue
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100)
- write_short(ReadyFire)
- write_byte(30)
- write_byte(200)
- message_end()
- set_task(1.5,"CreateFire", id)
- return PLUGIN_CONTINUE
- }
- public ClearLasers(id)
- {
- // Here we reset the variable
- g_bExploded = false
- ze_set_fire_grenade(id, false)
- remove_task(1018+id)
- }
- public Laser_Rotate(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- g_distance[id] -= 0.467
- for(new i = 0; i < 8; i++) {
- // Calculate new alpha
- g_degrees[id][i] += g_Speed[id]
- if(g_degrees[id][i] > 360.0)
- g_degrees[id][i] -= 360.0
- // calcul the next origin
- new Float:tmp[33][3]
- tmp[id] = ion_mid_origin[id]
- tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id]
- tmp[id][2] += 0.0 // -.-
- beam_origin[id][i] = tmp[id]
- }
- }
- public Trace_Start(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:get_random_z,Float:SkyOrigin[33][3]
- if( is_user_alive( id ) )
- {
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- get_random_z = random_float(300.0,SkyOrigin[id][2])
- }
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z)
- write_short(BlueFire)
- write_byte(10)
- write_byte(100)
- message_end()
- TraceAll(param)
- }
- public TraceAll(param[])
- {
- new i = param[0]
- new id = param[1]
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new Float:SkyOrigin[33][3]
- SkyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(1) //life
- write_byte(50) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0)
- write_byte(TE_SPRITE)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_short(LaserFlame)
- write_byte(5)
- write_byte(200)
- message_end()
- /*message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_WORLDDECAL)
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][0])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][1])
- engfunc(EngFunc_WriteCoord, beam_origin[id][i][2])
- write_byte(46)
- message_end()*/
- set_task(0.08,"TraceAll", 1018+id, param, 2)
- }
- public FireIonCannon(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- new i = -1
- while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0)
- {
- if( !is_user_connected( i ))
- continue
- if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT))
- {
- message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i)
- write_short(255<<14) //ammount
- write_short(10<<14) //lasts this long
- write_short(255<<14) //frequency
- message_end()
- }
- //next player in spehre.
- continue
- }
- new Float:skyOrigin[33][3]
- skyOrigin[id] = tlx_distance_to_sky(g_Target[id])
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_BEAMPOINTS)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y)
- engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z)
- write_short(IonBeam) //model
- write_byte(0) //startframe
- write_byte(0) //framerate
- write_byte(15) //life
- write_byte(255) //width
- write_byte(0) //noise
- write_byte(255) //r
- write_byte(255) //g
- write_byte(255) //b
- write_byte(255) //brightness
- write_byte(0) //speed
- message_end()
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0)
- write_byte(TE_BEAMCYLINDER)
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z
- write_short(Shockwave) // sprite
- write_byte(0) // startframe
- write_byte(0) // framerate
- write_byte(100) // life
- write_byte(150) // width
- write_byte(0) // noise
- write_byte(0) // red
- write_byte(100) // green
- write_byte(250) // blue
- write_byte(150) // brightness
- write_byte(0) // speed
- message_end()
- for(new i = 1; i < 6; i++)
- {
- engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0)
- write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1])
- engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200)
- write_short(BlueFlare) // (sprite index)
- write_byte(50) // (count)
- write_byte(random_num(27,30)) // (life in 0.1's)
- write_byte(10) // byte (scale in 0.1's)
- write_byte(random_num(30,70)) // (velocity along vector in 10's)
- write_byte(40) // (randomness of velocity in 10's)
- message_end()
- }
- switch( get_pcvar_num( cvar_ionmode ) )
- {
- case 0:
- {
- for( new i = 1; i < g_iMaxids; i++ )
- {
- if( is_user_alive( i ) && ze_is_user_zombie( i ) )
- {
- static Float:flHealth
- flHealth = entity_get_float( i, EV_FL_health )
- static Float:flDamage
- flDamage = get_pcvar_float( cvar_damage )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ i ] = true
- ExecuteHamB( Ham_Killed, i, id, 2 )
- g_bKilledByIon[ i ] = false
- }
- }
- }
- }
- case 1:
- {
- static victim
- victim = -1
- while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 )
- {
- if( !is_user_connected( victim ) )
- {
- if( pev_valid( victim ) )
- {
- static szClassname[ 32 ]
- pev( victim, pev_classname, szClassname, 31 )
- if( equal( szClassname, "func_breakable" ) )
- {
- force_use( id, victim )
- }
- }
- continue
- }
- if ( !is_user_alive( victim ) )
- continue
- if( !ze_is_user_zombie( victim ) )
- continue
- static Float:flOrigin[ 3 ]
- pev( victim, pev_origin, flOrigin )
- static Float:flDistance, Float:flDamage
- flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin )
- flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance )
- if( flDamage )
- {
- static Float:flHealth
- flHealth = entity_get_float( victim, EV_FL_health )
- if( flHealth - flDamage >= 1 )
- {
- ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST )
- }
- else
- {
- g_bKilledByIon[ victim ] = true
- ExecuteHamB( Ham_Killed, victim, id, 2 )
- g_bKilledByIon[ victim ] = false
- }
- }
- }
- }
- }
- client_cmd(0, "spk ^"%s^"", SOUND_ATTACK)
- ResetAll(id)
- }
- ResetAll(id)
- {
- if( !g_Target[ id ] )
- {
- remove_task( id )
- return
- }
- set_pev(g_Target[id], pev_flags, FL_KILLME)
- g_Target[id] = 0
- }
- /******************** Stocks ********************/
- // Get entity above sky.
- stock Float:tlx_distance_to_sky(id)
- {
- new Float:TraceEnd[3]
- pev(id, pev_origin, TraceEnd)
- new Float:f_dest[3]
- f_dest[0] = TraceEnd[0]
- f_dest[1] = TraceEnd[1]
- f_dest[2] = TraceEnd[2] + 8192.0
- new res, Float:SkyOrigin[3]
- engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res)
- get_tr2(res, TR_vecEndPos, SkyOrigin)
- return SkyOrigin
- }
- //return distance above us to sky
- stock Float:is_user_outside(id)
- {
- new Float:origin[3], Float:dist
- pev(id, pev_origin, origin)
- dist = origin[2]
- while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY)
- origin[2] += 5.0
- if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY)
- return (origin[2] - dist)
- return 0.0
- }
- stock ProgressBar(id, seconds, position)
- {
- message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id)
- write_byte(seconds)
- write_byte(position)
- message_end()
- }
- SendWeaponAnim( id, Sequence )
- {
- set_pev( id, pev_weaponanim, Sequence )
- message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id )
- write_byte( Sequence )
- write_byte( pev( id, pev_body ) )
- message_end( )
- }
- public UpdateAnim( id )
- {
- if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 )
- return
- SendWeaponAnim( id, anim_drop )
- }
- stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance)
- {
- return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance))
- }
He who fails to plan is planning to fail
Still all firedRaheem wrote: ↑5 years ago Player should be in the sphere with specific radius to be fired, in your code you set all zombies fire regardless where they are and then all players fired.
We search for all entities in a sphere with the radius we define from CVAR then if this entity is player we will fire him:
#include <zombie_escape> #include <engine> #include <cstrike> #include <fun> #include <fakemeta_util> new const PLUGIN[] = "[ZE] Extra Item:Ion Cannon" new const VERSION[] = "1.0" new const AUTHOR[] = "A.F./Mark" //#define ION_RADIUS 2000.0 //#define ION_MAXDAMAGE 54200.0 #define ACTION_BLOCK ( IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_LEFT | IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_RELOAD | IN_RUN | IN_USE) new const V_MODEL[] = "models/v_c4.mdl" new const W_MODEL[] = "models/w_battery.mdl" new const SOUND_APPROACH[] = "zombie_plague/ion_canon/ion_approach2.wav" new const SOUND_BEACON[] = "zombie_plague/ion_canon/ion_beacon_set.wav" new const SOUND_STOP[] = "vox/_comma.wav" new const SOUND_BEEP[] = "zombie_plague/ion_canon/ion_beep3.wav" new const SOUND_ATTACK[] = "zombie_plague/ion_canon/ion_attack.wav" new const SOUND_READY[] = "zombie_plague/ion_canon/ion_ready.wav" new const SOUND_PLANT[] = "zombie_plague/ion_canon/ion_beacon_plant2.wav" new g_iCurrentWeapon[33] new bool:g_bHasIon[33] new bool:g_bCanBuy new bool:g_bIsFiring[33] new bool:g_bKilledByIon[33] new bool:g_bIsPlanting[33] new g_iLastWeapon[33] new g_Target[33] new i_Pitch[33] new Float:i_BeaconTime[33] new Float:ion_mid_origin[33][3] new Float:beam_origin[33][8][3] new Float:g_degrees[33][8] new Float:g_distance[33] new Float:g_Speed[33] new IonBeam, BlueFire, Shockwave, ReadyFire, BlueFlare, LaserFlame new g_iIonID new gmsgScreenShake new g_iMaxids new bool:g_bExploded /* This variable first initialized to false */ new cvar_barlen, cvar_maxdmg, cvar_radius, cvar_ionmode, cvar_damage enum { anim_idle, anim_draw, anim_drop, anim_pressbutton } public plugin_precache() { precache_model(V_MODEL) precache_model(W_MODEL) precache_sound(SOUND_APPROACH) precache_sound(SOUND_BEACON) precache_sound(SOUND_BEEP) precache_sound(SOUND_ATTACK) precache_sound(SOUND_READY) precache_sound(SOUND_PLANT) precache_sound(SOUND_STOP) IonBeam = precache_model("sprites/ion_canon/ionbeam.spr") BlueFlare = precache_model("sprites/ion_canon/bflare.spr") ReadyFire = precache_model("sprites/ion_canon/fire.spr") BlueFire = precache_model("sprites/ion_canon/blueflame.spr") LaserFlame = precache_model("sprites/ion_canon/ion_laserflame.spr") Shockwave = precache_model("sprites/shockwave.spr") } public plugin_init() { register_plugin( PLUGIN, VERSION, AUTHOR ) g_iIonID = ze_register_item( "Ion Cannon", 100, 0) register_clcmd( "drop", "fn_Drop" ) register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" ) register_event( "DeathMsg", "EV_DeathMsg", "a" ) register_event( "HLTV", "EV_RoundStart", "a", "1=0", "2=0" ) register_forward( FM_CmdStart, "fw_CmdStart" ) register_forward( FM_PlayerPreThink, "fw_idPreThink" ) RegisterHam( Ham_Item_Deploy, "weapon_c4", "fw_KnifeDeploy_Post", 1 ) register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" ) gmsgScreenShake = get_user_msgid( "ScreenShake" ) cvar_barlen = register_cvar( "ze_ion_barlen", "4" ) cvar_maxdmg = register_cvar( "ze_ion_maxdmg", "54200" ) cvar_radius = register_cvar( "ze_ion_radius", "2000" ) cvar_ionmode = register_cvar( "ze_ion_mode", "1" ) // 0 - all zm damage, 1 - radius damage cvar_damage = register_cvar( "ze_ion_damage", "1000" ) // only if ze_ion_mode is 0 g_iMaxids = get_maxplayers( ) } public client_connect( id ) { g_bHasIon[ id ] = false g_bIsPlanting[ id ] = false } public client_disconnected( id ) { g_bHasIon[ id ] = false } public ze_game_started() { g_bCanBuy = false } public ze_zombie_release() { g_bCanBuy = true } public ze_select_item_pre(id, itemid) { if (itemid != g_iIonID) return ZE_ITEM_AVAILABLE if (ze_is_user_zombie(id)) return ZE_ITEM_DONT_SHOW if (g_bHasIon[id] || !g_bCanBuy) return ZE_ITEM_UNAVAILABLE return ZE_ITEM_AVAILABLE } public ze_select_item_post(id, itemid) { if( itemid == g_iIonID ) { if( g_bHasIon[id] ) { client_print( id, print_chat, "[ZE] Already have Ion Cannon" ) return PLUGIN_HANDLED } else { g_bHasIon[id] = true give_item( id, "weapon_c4" ) } } return PLUGIN_CONTINUE } public ze_user_infected(iVictim, iInfector) { emit_sound(g_Target[iVictim], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(iVictim, 0, 0) remove_task(iVictim+5000) g_bHasIon[ iVictim ] = false g_bIsFiring[ iVictim ] = false g_bIsPlanting[ iVictim ] = false g_Target[ iVictim ] = 0 } public ze_user_humanized(id) { g_bHasIon[id] = false emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(id, 0, 0) remove_task(id+5000) g_bIsFiring[ id ] = false g_bIsPlanting[ id ] = false g_Target[ id ] = 0 } public fn_Drop( id ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] ) return PLUGIN_CONTINUE if( g_iCurrentWeapon[ id ] == CSW_C4 ) { client_print( id, print_center, "* You cannot drop Ion Cannon *" ) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } public EV_CurWeapon( id ) { if( !is_user_alive( id ) ) return PLUGIN_CONTINUE g_iCurrentWeapon[ id ] = read_data( 2 ) return PLUGIN_CONTINUE } public EV_DeathMsg( ) { static iVictim iVictim = read_data( 2 ) if( !is_user_connected( iVictim ) ) return g_bHasIon[ iVictim ] = false g_bIsPlanting[ iVictim ] = false } public EV_RoundStart( ) { // Remove any ion cannons for( new i = 1; i < g_iMaxids; i++ ) { if( g_Target[ i ] ) emit_sound(g_Target[i], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) if( is_user_alive( i ) ) { ProgressBar(i, 0, 0) remove_task(i+5000) g_bHasIon[ i ] = false g_bIsFiring[ i ] = false g_bIsPlanting[ i ] = false g_Target[ i ] = 0 } } static iEnt iEnt = -1 while( ( iEnt = find_ent_by_class( iEnt, "info_target_ion" ) ) > 0 ) { engfunc( EngFunc_RemoveEntity, iEnt ) } } public fw_CmdStart( id, UC_Handle, Seed ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 ) return FMRES_IGNORED static afButtons afButtons = get_uc( UC_Handle, UC_Buttons ) if( afButtons & IN_ATTACK ) { afButtons &= ~IN_ATTACK set_uc( UC_Handle, UC_Buttons, afButtons ) if( g_bIsPlanting[ id ] ) { //ProgressBar(id, 0, 0) return FMRES_IGNORED } if( g_Target[ id ] ) { client_print( id, print_center, "* You already had planted Ion Cannon *" ) g_bIsPlanting[ id ] = false return FMRES_IGNORED } if( is_user_outside( id ) ) { g_Target[ id ] = 0 i_Pitch[ id ] = 97 i_BeaconTime[ id ] = 1.12 g_distance[ id ] = 350.0 g_Speed[ id ] = 0.0 static iEnt iEnt = find_ent_by_owner( -1, "weapon_c4", id ) set_pdata_float( iEnt, 48, 10.0, 4 ) g_bIsFiring[ id ] = true g_bIsPlanting[ id ] = true emit_sound(id, CHAN_WEAPON, SOUND_BEACON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) g_iCurrentWeapon[ id ] = CSW_C4 if( get_pcvar_num( cvar_barlen ) > 0 ) { set_task( 3.6, "UpdateAnim" ) SendWeaponAnim( id, anim_pressbutton ) ProgressBar(id, get_pcvar_num( cvar_barlen ), 0) set_task(get_pcvar_float( cvar_barlen ),"ion_planted", id+5000) } else { set_task(0.2,"ion_planted", id+5000) SendWeaponAnim( id, anim_drop ) } } else { g_bIsPlanting[ id ] = false client_print( id, print_center, "* To plant Ion Cannon you must be outside!!!*" ) return FMRES_IGNORED } } return FMRES_HANDLED } public fw_PlayerPreThink( id ) { if( !is_user_alive( id ) || !g_bHasIon[ id ] ) return if( g_bIsFiring[ id ] ) { g_iLastWeapon[ id ] = get_user_weapon( id ) if( g_iCurrentWeapon[ id ] != CSW_C4 || g_iLastWeapon[ id ] != g_iCurrentWeapon[ id ] || get_user_button( id ) & ACTION_BLOCK ) { emit_sound(g_Target[id], CHAN_WEAPON, SOUND_STOP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) ProgressBar(id, 0, 0) remove_task(id+5000) g_bIsFiring[ id ] = false g_bIsPlanting[ id ] = false } } } public fw_KnifeDeploy_Post( iEnt ) { static id id = get_pdata_cbase( iEnt, 41, 4 ) if( g_bHasIon[ id ] ) { set_pev( id, pev_viewmodel2, V_MODEL ) SendWeaponAnim( id, anim_draw ) } } public fn_DeathMsg( id, Dest, iEntity ) { static iVictim, iKiller iKiller = get_msg_arg_int( 1 ) iVictim = get_msg_arg_int( 2 ) if( !is_user_connected( iVictim ) || iKiller == iVictim ) return PLUGIN_CONTINUE if ( g_bKilledByIon[ iVictim ] ) { set_msg_arg_string ( 4, "ion cannon" ) } return PLUGIN_CONTINUE } public ion_planted(id) { id -= 5000 if( !is_user_alive( id ) || ze_is_user_zombie( id ) ) { remove_task( id ) return PLUGIN_CONTINUE } client_print(0, print_center, "Ion Cannon has been planted!") client_cmd(0, "spk %s", SOUND_PLANT) g_bIsFiring[id] = false g_bIsPlanting[ id ] = false static Weapon Weapon = find_ent_by_owner( -1, "weapon_c4", id ) ExecuteHamB( Ham_Weapon_RetireWeapon, Weapon ); ExecuteHamB( Ham_RemovePlayerItem, id, Weapon ); ExecuteHamB( Ham_Item_Kill, Weapon ); set_pev( id, pev_weapons, pev( id, pev_weapons ) & ~( 1 << CSW_C4) ); cs_set_user_bpammo( id, CSW_C4, 0 ); g_bHasIon[ id ] = false g_Target[id] = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) if(!g_Target[id]) return PLUGIN_HANDLED // Strings set_pev(g_Target[id],pev_classname,"info_target_ion") engfunc(EngFunc_SetModel,g_Target[id],W_MODEL) // Integer set_pev(g_Target[id],pev_owner, id) set_pev(g_Target[id],pev_movetype, MOVETYPE_TOSS) set_pev(g_Target[id],pev_solid, SOLID_TRIGGER) entity_get_vector(id,EV_VEC_origin, ion_mid_origin[id]) //wpn_projectile_startpos(id,0,0,50,ion_mid_origin[id]) //static Float:flOrigin[ 3 ] //pev( id, pev_origin, flOrigin ) //engfunc( EngFunc_SetOrigin, g_Target[ id ], flOrigin ) set_pev(g_Target[id],pev_origin,ion_mid_origin[id]) ion_beacon(id) set_task(5.0,"ion_startup", id) return PLUGIN_CONTINUE } public ion_beacon(id) { if( !g_Target[ id ] ) { remove_task( id ) return PLUGIN_CONTINUE } i_Pitch[id] += 3 i_BeaconTime[id] -= 0.03 if(i_Pitch[id] > 255) i_Pitch[id] = 255 if(i_BeaconTime[id] < 0.30) i_BeaconTime[id] = 0.30 emit_sound(g_Target[id], CHAN_ITEM, SOUND_BEEP, VOL_NORM, ATTN_NORM, 0, i_Pitch[id]) set_task(i_BeaconTime[id],"ion_beacon", id) return PLUGIN_CONTINUE } public ion_startup(id) { client_cmd(0, "spk ^"%s^"", SOUND_APPROACH) client_print(0, print_chat,"Ion Cannon is approaching") set_task(5.0,"Trace_Ready", id) } public Trace_Ready(id) { if( !pev_valid( id ) ) { remove_task( id ) return PLUGIN_CONTINUE } // write origin of each new Float:mid_origin[33][3] pev(g_Target[id],pev_origin,mid_origin[id]) // Target contain entity id // 1st beam_origin[id][0][0] = mid_origin[id][0] + 300.0 beam_origin[id][0][1] = mid_origin[id][1] + 150.0 beam_origin[id][0][2] = mid_origin[id][2] g_degrees[id][0] = 0.0 // 2nd beam_origin[id][1][0] = mid_origin[id][0] + 300.0 beam_origin[id][1][1] = mid_origin[id][1] - 150.0 beam_origin[id][1][2] = mid_origin[id][2] g_degrees[id][1] = 45.0 // 3rd beam_origin[id][2][0] = mid_origin[id][0] - 300.0 beam_origin[id][2][1] = mid_origin[id][1] - 150.0 beam_origin[id][2][2] = mid_origin[id][2] g_degrees[id][2] = 90.0 // 4th beam_origin[id][3][0] = mid_origin[id][0] - 300.0 beam_origin[id][3][1] = mid_origin[id][1] + 150.0 beam_origin[id][3][2] = mid_origin[id][2] g_degrees[id][3] = 135.0 // 5th beam_origin[id][4][0] = mid_origin[id][0] + 150.0 beam_origin[id][4][1] = mid_origin[id][1] + 300.0 beam_origin[id][4][2] = mid_origin[id][2] g_degrees[id][4] = 180.0 // 6th beam_origin[id][5][0] = mid_origin[id][0] + 150.0 beam_origin[id][5][1] = mid_origin[id][1] - 300.0 beam_origin[id][5][2] = mid_origin[id][2] g_degrees[id][5] = 225.0 // 7th beam_origin[id][6][0] = mid_origin[id][0] - 150.0 beam_origin[id][6][1] = mid_origin[id][1] - 300.0 beam_origin[id][6][2] = mid_origin[id][2] g_degrees[id][6] = 270.0 // 8th beam_origin[id][7][0] = mid_origin[id][0] - 150.0 beam_origin[id][7][1] = mid_origin[id][1] + 300.0 beam_origin[id][7][2] = mid_origin[id][2] g_degrees[id][7] = 315.0 // set the mid to global ion_mid_origin[id] = mid_origin[id] new Float:addtime for(new i = 0; i < 8; i++) { addtime = addtime + 0.3 new param[3] param[0] = i param[1] = id set_task(0.0 + addtime, "Trace_Start", _,param, 2) } Laser_Rotate(id) //To fix the laserdraw client_cmd(0, "spk ^"%s^"", SOUND_READY) for(new Float:i = 0.0; i < 7.5; i += 0.01) //Rotate for 7.5 secs. set_task(i+3.0, "Laser_Rotate", id) set_task(2.9,"AddSpeed", id) set_task(11.5,"CreateFire", id) set_task(12.5,"ClearLasers", id) set_task(18.2,"FireIonCannon", id) return PLUGIN_CONTINUE } public AddSpeed(id) { if( !g_Target[ id ] ) { remove_task( id ) return PLUGIN_CONTINUE } if(g_Speed[id] > 1.0) g_Speed[id] = 1.0 g_Speed[id] += 0.1 set_task(0.6,"AddSpeed", id) return PLUGIN_CONTINUE } public CreateFire(id) { if( !g_Target[ id ] ) { g_bExploded = false remove_task( id ) return PLUGIN_CONTINUE } new i = -1 while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0) { if( !is_user_connected( i )) continue // Here we check if it's exploded before or not? if (!g_bExploded) { //for( new id = 1; id < g_iMaxids; id++ ) //{ if(ze_is_user_zombie(i)) { ze_set_fire_grenade(i, true) } //} // After this we turn the variable to true so not to be called next call g_bExploded = true } //next player in spehre. continue } engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 100) write_short(ReadyFire) write_byte(30) write_byte(200) message_end() set_task(1.5,"CreateFire", id) return PLUGIN_CONTINUE } public ClearLasers(id) { // Here we reset the variable g_bExploded = false ze_set_fire_grenade(id, false) remove_task(1018+id) } public Laser_Rotate(id) { if( !g_Target[ id ] ) { remove_task( id ) return } g_distance[id] -= 0.467 for(new i = 0; i < 8; i++) { // Calculate new alpha g_degrees[id][i] += g_Speed[id] if(g_degrees[id][i] > 360.0) g_degrees[id][i] -= 360.0 // calcul the next origin new Float:tmp[33][3] tmp[id] = ion_mid_origin[id] tmp[id][0] += floatsin(g_degrees[id][i], degrees) * g_distance[id] tmp[id][1] += floatcos(g_degrees[id][i], degrees) * g_distance[id] tmp[id][2] += 0.0 // -.- beam_origin[id][i] = tmp[id] } } public Trace_Start(param[]) { new i = param[0] new id = param[1] if( !g_Target[ id ] ) { remove_task( id ) return } new Float:get_random_z,Float:SkyOrigin[33][3] if( is_user_alive( id ) ) { SkyOrigin[id] = tlx_distance_to_sky(g_Target[id]) get_random_z = random_float(300.0,SkyOrigin[id][2]) } engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2] + get_random_z) write_short(BlueFire) write_byte(10) write_byte(100) message_end() TraceAll(param) } public TraceAll(param[]) { new i = param[0] new id = param[1] if( !g_Target[ id ] ) { remove_task( id ) return } new Float:SkyOrigin[33][3] SkyOrigin[id] = tlx_distance_to_sky(g_Target[id]) engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_BEAMPOINTS) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //start point (x) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //start point (y) engfunc(EngFunc_WriteCoord, SkyOrigin[id][2]) //start point (z) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) //end point (x) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) //end point (y) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) //end point (z) write_short(IonBeam) //model write_byte(0) //startframe write_byte(0) //framerate write_byte(1) //life write_byte(50) //width write_byte(0) //noise write_byte(255) //r write_byte(255) //g write_byte(255) //b write_byte(255) //brightness write_byte(0) //speed message_end() engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, beam_origin[id][i], 0) write_byte(TE_SPRITE) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) write_short(LaserFlame) write_byte(5) write_byte(200) message_end() /*message_begin(MSG_BROADCAST, SVC_TEMPENTITY) write_byte(TE_WORLDDECAL) engfunc(EngFunc_WriteCoord, beam_origin[id][i][0]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][1]) engfunc(EngFunc_WriteCoord, beam_origin[id][i][2]) write_byte(46) message_end()*/ set_task(0.08,"TraceAll", 1018+id, param, 2) } public FireIonCannon(id) { if( !g_Target[ id ] ) { remove_task( id ) return } new i = -1 while((i = engfunc(EngFunc_FindEntityInSphere, i, ion_mid_origin[id], get_pcvar_float( cvar_radius ) )) != 0) { if( !is_user_connected( i )) continue if( pev(i, pev_flags) & (FL_CLIENT | FL_FAKECLIENT)) { message_begin(MSG_ONE_UNRELIABLE, gmsgScreenShake, {0,0,0}, i) write_short(255<<14) //ammount write_short(10<<14) //lasts this long write_short(255<<14) //frequency message_end() } //next player in spehre. continue } new Float:skyOrigin[33][3] skyOrigin[id] = tlx_distance_to_sky(g_Target[id]) engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_BEAMPOINTS) engfunc(EngFunc_WriteCoord, skyOrigin[id][0]) //start point (x) engfunc(EngFunc_WriteCoord, skyOrigin[id][1]) //start point (y) engfunc(EngFunc_WriteCoord, skyOrigin[id][2]) //start point (z) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) //end point (x) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) //end point (y) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) //end point (z) write_short(IonBeam) //model write_byte(0) //startframe write_byte(0) //framerate write_byte(15) //life write_byte(255) //width write_byte(0) //noise write_byte(255) //r write_byte(255) //g write_byte(255) //b write_byte(255) //brightness write_byte(0) //speed message_end() engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin, 0) write_byte(TE_BEAMCYLINDER) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // start X engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // start Y engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) // start Z engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) // something X engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) // something Y engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + get_pcvar_float( cvar_radius ) - 1000.0) // something Z write_short(Shockwave) // sprite write_byte(0) // startframe write_byte(0) // framerate write_byte(100) // life write_byte(150) // width write_byte(0) // noise write_byte(0) // red write_byte(100) // green write_byte(250) // blue write_byte(150) // brightness write_byte(0) // speed message_end() for(new i = 1; i < 6; i++) { engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, ion_mid_origin[id], 0) write_byte(TE_SPRITETRAIL) // line of moving glow sprites with gravity, fadeout, and collisions engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][0]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][1]) engfunc(EngFunc_WriteCoord, ion_mid_origin[id][2] + 200) write_short(BlueFlare) // (sprite index) write_byte(50) // (count) write_byte(random_num(27,30)) // (life in 0.1's) write_byte(10) // byte (scale in 0.1's) write_byte(random_num(30,70)) // (velocity along vector in 10's) write_byte(40) // (randomness of velocity in 10's) message_end() } switch( get_pcvar_num( cvar_ionmode ) ) { case 0: { for( new i = 1; i < g_iMaxids; i++ ) { if( is_user_alive( i ) && ze_is_user_zombie( i ) ) { static Float:flHealth flHealth = entity_get_float( i, EV_FL_health ) static Float:flDamage flDamage = get_pcvar_float( cvar_damage ) if( flHealth - flDamage >= 1 ) { ExecuteHamB( Ham_TakeDamage, i, g_Target[ id ], id, flDamage, DMG_BLAST ) } else { g_bKilledByIon[ i ] = true ExecuteHamB( Ham_Killed, i, id, 2 ) g_bKilledByIon[ i ] = false } } } } case 1: { static victim victim = -1 while ( ( victim = engfunc( EngFunc_FindEntityInSphere, victim, ion_mid_origin[id], get_pcvar_float( cvar_radius ) ) ) != 0 ) { if( !is_user_connected( victim ) ) { if( pev_valid( victim ) ) { static szClassname[ 32 ] pev( victim, pev_classname, szClassname, 31 ) if( equal( szClassname, "func_breakable" ) ) { force_use( id, victim ) } } continue } if ( !is_user_alive( victim ) ) continue if( !ze_is_user_zombie( victim ) ) continue static Float:flOrigin[ 3 ] pev( victim, pev_origin, flOrigin ) static Float:flDistance, Float:flDamage flDistance = get_distance_f( ion_mid_origin[ id ], flOrigin ) flDamage = floatradius( get_pcvar_float( cvar_maxdmg ), get_pcvar_float( cvar_radius ), flDistance ) if( flDamage ) { static Float:flHealth flHealth = entity_get_float( victim, EV_FL_health ) if( flHealth - flDamage >= 1 ) { ExecuteHamB( Ham_TakeDamage, victim, g_Target[ id ], id, flDamage, DMG_BLAST ) } else { g_bKilledByIon[ victim ] = true ExecuteHamB( Ham_Killed, victim, id, 2 ) g_bKilledByIon[ victim ] = false } } } } } client_cmd(0, "spk ^"%s^"", SOUND_ATTACK) ResetAll(id) } ResetAll(id) { if( !g_Target[ id ] ) { remove_task( id ) return } set_pev(g_Target[id], pev_flags, FL_KILLME) g_Target[id] = 0 } /******************** Stocks ********************/ // Get entity above sky. stock Float:tlx_distance_to_sky(id) { new Float:TraceEnd[3] pev(id, pev_origin, TraceEnd) new Float:f_dest[3] f_dest[0] = TraceEnd[0] f_dest[1] = TraceEnd[1] f_dest[2] = TraceEnd[2] + 8192.0 new res, Float:SkyOrigin[3] engfunc(EngFunc_TraceLine, TraceEnd, f_dest, IGNORE_MONSTERS + IGNORE_GLASS, id, res) get_tr2(res, TR_vecEndPos, SkyOrigin) return SkyOrigin } //return distance above us to sky stock Float:is_user_outside(id) { new Float:origin[3], Float:dist pev(id, pev_origin, origin) dist = origin[2] while(engfunc(EngFunc_PointContents, origin) == CONTENTS_EMPTY) origin[2] += 5.0 if(engfunc(EngFunc_PointContents, origin) == CONTENTS_SKY) return (origin[2] - dist) return 0.0 } stock ProgressBar(id, seconds, position) { message_begin(MSG_ONE, get_user_msgid("BarTime"), {0, 0, 0}, id) write_byte(seconds) write_byte(position) message_end() } SendWeaponAnim( id, Sequence ) { set_pev( id, pev_weaponanim, Sequence ) message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id ) write_byte( Sequence ) write_byte( pev( id, pev_body ) ) message_end( ) } public UpdateAnim( id ) { if( !is_user_alive( id ) || ze_is_user_zombie( id ) || !g_bHasIon[ id ] || g_iCurrentWeapon[ id ] != CSW_C4 ) return SendWeaponAnim( id, anim_drop ) } stock Float:floatradius(Float:flMaxAmount, Float:flRadius, Float:flDistance) { return floatsub(flMaxAmount, floatmul(floatdiv(flMaxAmount, flRadius), flDistance)) }
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Seems like this weapon is bugged even before making it compatiable with ZE.
So i'm asking the topic author to test this item in a zombie plague mod & see whether it's fixed there or not.
Trashed.
So i'm asking the topic author to test this item in a zombie plague mod & see whether it's fixed there or not.
Trashed.
Create an account or sign in to join the discussion
You need to be a member in order to post a reply
Create an account
Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute
Sign in
Who is online
Users browsing this forum: No registered users and 2 guests