etqw-sdk/base/script/tools/binoculars.script

276 lines
5.0 KiB
Plaintext

/***********************************************************************
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;
}