/*********************************************************************** binoculars.script ***********************************************************************/ object binoculars : weapon_base { void preinit(); void init(); void destroy(); void Idle(); void OnProxyEnter(); void OnProxyExit(); void LoadScopeGUI(); void FreeScopeGUI(); void ScopeUp(); void ScopeDown(); void ToggleZoom(); float OnActivate( entity p, float distance ); float OnActivateHeld( entity p, float distance ); float OnUsed( entity p, float distance ); boolean OnWeapNext(); boolean OnWeapPrev(); void OnBecomeViewWeapon(); void OnFinishViewWeapon(); void AddLocalScopeEffects(); void RemoveLocalScopeEffects(); void vSetScopeState( boolean up ); float scopeGUIHandle; zoomWidget zoomer; boolean scopeUp; boolean localScopeEffectsEnabled; boolean localScopeEffectsActive; float modeSwitchDown; } void binoculars::destroy() { ScopeDown(); RemoveLocalScopeEffects(); delete zoomer; } void binoculars::preinit() { scopeGUIHandle = -1; zoomer = new zoomWidget; zoomer.Init( self ); } void binoculars::init() { weaponState( "Raise", 0 ); } void binoculars::Idle() { weaponReady(); playCycle( ANIMCHANNEL_ALL, "idle" ); while( 1 ) { if ( !scopeUp ) { StartIdleEffect(); } else { if ( myPlayer.isInWater() > 0.5f ) { ToggleZoom(); } } if ( WEAPON_LOWERWEAPON ) { StopIdleEffect(); weaponState( "Lower", 0 ); } if ( !sys.isClient() ) { if ( WEAPON_ATTACK ) { if ( !mainFireDown ) { mainFireDown = true; ToggleZoom(); } } else { mainFireDown = false; } } if ( myPlayer.getButton( PK_ACTIVATE ) ) { if ( !modeSwitchDown ) { modeSwitchDown = true; if ( scopeUp && zoomer.IsEnabled() ) { startSound( "snd_zoomin", SND_WEAPON_SIG ); zoomer.Cycle(); } } } else { modeSwitchDown = false; } sys.waitFrame(); } } void binoculars::vSetScopeState( boolean up ) { if ( up ) { ScopeUp(); } else { ScopeDown(); } } void binoculars::ToggleZoom() { if ( myPlayer.IsSniperScopeUp() ) { ScopeDown(); } else { ScopeUp(); } } void binoculars::OnBecomeViewWeapon() { if ( localScopeEffectsActive ) { AddLocalScopeEffects(); } } void binoculars::OnFinishViewWeapon() { RemoveLocalScopeEffects(); } void binoculars::AddLocalScopeEffects() { if ( localScopeEffectsEnabled ) { return; } if ( myPlayer == $null_entity ) { return; } if ( myPlayer == sys.getLocalViewPlayer() ) { localScopeEffectsEnabled = true; HideSights(); if ( getKey( "def_scopemodel" ) ) { myPlayer.enableClientModelSights( getKey( "def_scopemodel" ) ); } LoadScopeGUI(); } } void binoculars::RemoveLocalScopeEffects() { if ( !localScopeEffectsEnabled ) { return; } localScopeEffectsEnabled = false; if ( myPlayer != $null_entity ) { myPlayer.disableClientModelSights(); } ShowSights(); FreeScopeGUI(); } void binoculars::ScopeUp() { if ( scopeUp ) { return; } StopIdleEffect(); scopeUp = true; myPlayer.SetSniperScopeUp( true ); hide(); localScopeEffectsActive = true; AddLocalScopeEffects(); zoomer.Enable(); startSound( "snd_scopeup", SND_WEAPON_SIG ); myPlayer.setSniperAOR( 1.f ); myPlayer.AI_HOLD_WEAPON = true; } void binoculars::ScopeDown() { if ( !scopeUp ) { return; } scopeUp = false; if ( myPlayer != $null_entity ) { myPlayer.SetSniperScopeUp( false ); myPlayer.setSniperAOR( 0.f ); myPlayer.AI_HOLD_WEAPON = false; } show(); localScopeEffectsActive = false; RemoveLocalScopeEffects(); zoomer.Disable(); startSound( "snd_scopedown", SND_WEAPON_SIG ); } void binoculars::LoadScopeGUI() { FreeScopeGUI(); scopeGUIHandle = sys.allocHudModule( getKey( "gui_overlay" ), getFloatKeyWithDefault( "hud_sort", 0 ), false ); } void binoculars::FreeScopeGUI() { if ( scopeGUIHandle != -1 ) { sys.freeHudModule( scopeGUIHandle ); scopeGUIHandle = -1; } } void binoculars::OnProxyEnter() { Base_OnProxyEnter(); if ( myPlayer.IsSniperScopeUp() ) { ToggleZoom(); } } void binoculars::OnProxyExit() { Base_OnProxyExit(); } float binoculars::OnActivateHeld( entity p, float distance ) { return scopeUp; } float binoculars::OnActivate( entity p, float distance ) { return scopeUp; } float binoculars::OnUsed( entity p, float distance ) { return scopeUp; } boolean binoculars::OnWeapNext() { if ( scopeUp && zoomer.IsEnabled() ) { if ( !zoomer.IsFullyZoomedOut() ) { startSound( "snd_zoomout", SND_WEAPON_SIG ); } zoomer.ZoomOut(); return true; } return false; } boolean binoculars::OnWeapPrev() { if ( scopeUp && zoomer.IsEnabled() ) { if ( !zoomer.IsFullyZoomedIn() ) { startSound( "snd_zoomin", SND_WEAPON_SIG ); } zoomer.ZoomIn(); return true; } return false; }