/* * Chrone Cannon * * by GordonFreeman * http://www.lambda-force.org/ */ #include #include #include #include #include #include new particle,shock,Float:maxspeed new screenfade #define REFLUX_DIST 500.0 #define Offset_Qwant Offset_iuser1 #define Offset_Refluxing Offset_iuser2 #define Offset_PowerUpTime Offset_fuser1 #define Offset_ZAxisCheckFail Offset_fuser2 #define MDL_INHANDS "models/v_chronecannon.mdl" #define MDL_ATHANDS "models/p_chronecannon.mdl" #define MDL_ATWORLD "models/w_chronecannon.mdl" #define REFLUX_BEAM "sprites/xbeam1.spr" #define REFLUX_FAIL "debris/beamstart9.wav" #define REFLUX_READY "buttons/blip2.wav" #define REFLUX_GONE "weapons/egon_windup2.wav" #define REFLUX_STOP "weapons/egon_off1.wav" #define REFLUX_TAKEOUT "debris/beamstart8.wav" #define REFLUX_TAKEIN "debris/beamstart14.wav" new bool:g_frozen[33] new maxpl enum _:{ IDLE1, FIDGET1, ALTON, ALTCYCLE, ALTCYCLEWTF, FIRE1, FIRE2, FIRE3, FIRE4, DRAW, FIDGET2 } public plugin_precache(){ PRECACHE_MODEL(MDL_INHANDS) PRECACHE_MODEL(MDL_ATHANDS) PRECACHE_MODEL(MDL_ATWORLD) PRECACHE_MODEL(REFLUX_BEAM) PRECACHE_SOUND(REFLUX_FAIL) PRECACHE_SOUND(REFLUX_READY) PRECACHE_SOUND(REFLUX_GONE) PRECACHE_SOUND(REFLUX_STOP) PRECACHE_SOUND(REFLUX_TAKEOUT) PRECACHE_SOUND(REFLUX_TAKEIN) PRECACHE_GENERIC("sprites/weapon_chronecannon.txt") shock = precache_model("sprites/shockwave.spr") particle = precache_model("sprites/blueflare2.spr") } public plugin_init(){ register_plugin("Chrone Cannon","0.2","GordonFreeman") new cc = wpnmod_register_weapon("weapon_chronecannon",1,5,"",-1,"",-1,-1,ITEM_FLAG_SELECTONEMPTY,14) wpnmod_register_weapon_forward(cc,Fwd_Wpn_Spawn,"fw_RelictInWorld") wpnmod_register_weapon_forward(cc,Fwd_Wpn_Deploy,"fw_TakeToUse") wpnmod_register_weapon_forward(cc,Fwd_Wpn_PrimaryAttack,"fw_TimeShift") wpnmod_register_weapon_forward(cc,Fwd_Wpn_SecondaryAttack,"fw_DimensionShift") wpnmod_register_weapon_forward(cc,Fwd_Wpn_Idle,"fw_Easy") wpnmod_register_weapon_forward(cc,Fwd_Wpn_Holster,"fw_TakeOut") RegisterHam(Ham_TakeDamage,"player","fw_PlayerDamage") // refluxing subjects cant be damaged screenfade = get_user_msgid("ScreenFade") maxpl = get_maxplayers() } public plugin_cfg() maxspeed = get_cvar_float("sv_maxspeed") public fw_RelictInWorld(ent) SET_MODEL(ent,MDL_ATWORLD) public fw_TakeToUse(ent,player) return wpnmod_default_deploy(ent,MDL_INHANDS,MDL_ATHANDS,DRAW,"egon") public fw_TimeShift(ent,player){ // primary attack - back to future our victim new qwant = wpnmod_get_offset_int(ent,Offset_Qwant) // current refluxing ent new reflux = get_aiment(player) // ent at aim pos if(pev_valid(qwant)){ // continue reflux current refluxing ent new Float:dist = fm_entity_range(player,qwant) if(dist>REFLUX_DIST){ RefluxFailed(ent,player,0) return } set_pev(player,pev_maxspeed,-1.0) // player cant move while refluxing process is going if(00.0)?-30.0:30.0) newloc[1] += ((newloc[1]-oldloc[1]>0.0)?-30.0:30.0) newloc[2] += 40.0 shockwave(newloc,330,0,255,255) set_pev(player,pev_origin,newloc) // teleport the player particle_shower(player) wpnmod_play_snd(player,REFLUX_TAKEIN) wpnmod_set_offset_float(ent,Offset_ZAxisCheckFail,newloc[2]) wpnmod_set_offset_float(ent,Offset_flNextPrimaryAttack,0.5) wpnmod_set_offset_float(ent,Offset_flNextSecondaryAttack,1.5) wpnmod_set_think(ent,"fw_TeleportCheckFail") set_pev(ent,pev_nextthink,get_gametime()+0.5) } public fw_TeleportCheckFail(ent,player){ // check teleport correctly new Float:origin[3],Float:zaxis = wpnmod_get_offset_float(ent,Offset_ZAxisCheckFail) pev(player,pev_origin,origin) if(origin[2]==zaxis){ // if teleporting is failed, then kill the player wpnmod_set_offset_float(ent,Offset_flNextPrimaryAttack,3.0) wpnmod_set_offset_float(ent,Offset_flNextSecondaryAttack,3.0) RefluxFailed(ent,player,0) RefluxDone(player,player,ent) } } public fw_Refluxing(ent,player){ // refluxing think new qwant = wpnmod_get_offset_int(ent,Offset_Qwant) new refluxing = wpnmod_get_offset_int(ent,Offset_Refluxing) if(!pev_valid(qwant)){ RefluxFailed(ent,player,0) return } if(055.0){ // refluxing is finished, lets back to future our ent RefluxDone(qwant,player,ent) RefluxFailed(ent,player,1) wpnmod_set_offset_float(ent,Offset_PowerUpTime,0.0) }else // otherwise just continue wpnmod_set_offset_float(ent,Offset_PowerUpTime,powerup+1.0) if(refluxing){ wpnmod_set_think(ent,"fw_Refluxing") set_pev(ent,pev_nextthink,get_gametime()) } } public fw_Easy(ent,player){ // weapon idle, reset goes here if(wpnmod_get_offset_int(ent,Offset_Refluxing)) RefluxFailed(ent,player,0) if(wpnmod_get_offset_float(ent,Offset_flTimeWeaponIdle)>0.0) return new anim new Float:nextidle if(random_float(0.0,1.0)<=0.75){ anim = IDLE1 nextidle = 8.0 }else{ anim = FIDGET1 nextidle = 12.0 } wpnmod_send_weapon_anim(ent,anim) wpnmod_set_offset_float(ent,Offset_flTimeWeaponIdle,nextidle) } public fw_TakeOut(ent,player){ // holster, reset goes here set_pev(player,pev_maxspeed,maxspeed) new beams while((beams = fm_find_ent_by_owner(beams,"beam",player))){ engfunc(EngFunc_RemoveEntity,beams) } RefluxReset(wpnmod_get_offset_int(ent,Offset_Qwant)) wpnmod_set_offset_int(ent,Offset_Qwant,0) wpnmod_set_offset_int(ent,Offset_Refluxing,0) wpnmod_set_offset_float(ent,Offset_PowerUpTime,0.0) wpnmod_set_offset_float(ent,Offset_flNextPrimaryAttack,1.0) } public fw_RefluxReady(ent) // beep sound wpnmod_play_snd(ent,REFLUX_READY) public RefluxDone(ent,player,wpn){ // we did it RefluxEffect(ent) if(!(00.0){ set_pev(ent,pev_renderamt,amt) new data[4] data[0] = ent data[1] = floatround(amt) data[2] = player data[3] = wpn if(0 0 ) { movetype = pev( ent, pev_movetype ) if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) && ent != id ) target = ent ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 10.0 ) } } return target }