Script:Files:script/tools/teleporter.script

From Mod Wiki
/***********************************************************************

tool_teleporter.script

Short distance teleporter

***********************************************************************/

object tool_teleporter : weapon_base {
    void        init();
    void        destroy();

    void        Idle();
    void        Lower();
    void        Raise();
    void        Throw();
    void        Teleport();

    void        DeployedIdle();
    void        DeployedRaise();
    void        DeployedLower();

    void        FindProjectile();

    void        ToolTipThread_Raise();
    void        ToolTipThread_Deployed();

    void        StartDeployedIdleEffect();
    void        StopDeployedIdleEffect();

    boolean        deployedIdleEffectOn;

    entity        projectile;

    boolean        deployedTipThreadActive;
}

void tool_teleporter::init() {
    FindProjectile();

    if ( projectile == $null_entity ) {
        if ( myPlayer.isLocalPlayer() ) {
            thread ToolTipThread_Raise();
        }
        weaponState( "Raise", 0 );
    } else {
        weaponState( "DeployedRaise", 0 );
    }
}

void tool_teleporter::destroy() {
    StopDeployedIdleEffect();
}

void tool_teleporter::StartDeployedIdleEffect() {
    if ( !deployedIdleEffectOn ) {
        playEffect( "fx_idle_deployed", idleEffectJoint, 1 );
        deployedIdleEffectOn = true;
    }
}

void tool_teleporter::StopDeployedIdleEffect() {
    if ( deployedIdleEffectOn ) {
        stopEffect( "fx_idle_deployed" );
        deployedIdleEffectOn = false;
    }
}

void tool_teleporter::FindProjectile() {
    if ( projectile != $null_entity ) {
        return;
    }

    float i;
    float num = myPlayer.binGetSize();
    for ( i = 0; i < num; i++ ) {
        entity other = myPlayer.binGet( i );
        if ( other.inCollection( "teleportbeacon" ) ) {
            projectile = other;
        }
    }
}

void tool_teleporter::Raise() {
    setupAnimClass( "anim_prefix" );
    Base_Raise();
}

void tool_teleporter::Lower() {
    StopDeployedIdleEffect();
    Base_Lower();
}

void tool_teleporter::Idle() {
    setupAnimClass( "anim_prefix" );

    weaponReady();

    playCycle( ANIMCHANNEL_ALL, "idle" );
    StartIdleEffect();

    float projectileFoundTime = -1;

    mainFireDown = WEAPON_ATTACK;
    while( true ) {
        FindProjectile();
        if ( projectile != $null_entity ) {
            if ( projectileFoundTime == -1 ) {
                projectileFoundTime = sys.getTime();
            }

            if ( !sys.isClient() || ( projectileFoundTime - sys.getTime() ) > 1.f ) {
                StopIdleEffect();
                weaponState( "DeployedIdle", 4 );
            }
        } else {
            projectileFoundTime = -1;
        }

        if( WEAPON_LOWERWEAPON ) {
            StopIdleEffect();
            weaponState( "Lower", 4 );
        }

        if( WEAPON_ATTACK ) {
            if ( !mainFireDown ) {
                mainFireDown = true;

                if ( myPlayer.EnergyBar_CanRemove( chargePerUse ) ) {
                    StopIdleEffect();
                    weaponState( "Throw", 4 );
                } else {
                    if ( myPlayer.isLocalPlayer() ) {
                        myPlayer.sendToolTip( GetToolTip( getKey( "tt_need_charge" ) ) );
                        sys.startSoundDirect( getKey( "snd_need_charge" ), SND_WEAPON_FIRE_LOCAL );
                        G_NotifyNoCharge( myPlayer );
                    }
                }
            }
        } else {
            mainFireDown = false;
        }

        UpdateCharge();

        sys.waitFrame();
    }
}

void tool_teleporter::Throw() {
    setupAnimClass( "anim_prefix_alt" );
    fired();

    playAnim( ANIMCHANNEL_ALL, "throw_quick" );
    playEffect( "fx_fire", idleEffectJoint, 0 );

    if ( !sys.isClient() ) {
        projectile = createProjectile( 0 );
        projectile.vSetOwner( myPlayer );
        projectile.vSetCharge( chargePerUse );

        float launchPower = 0.f;
        if ( myPlayer.getProficiency( g_proficiencyCovertOps ) >= 2 ) {
            launchPower = 1000.f;
        }

        launchProjectiles( numProjectiles, 0, 0, 0, launchPower, 1 );

        myPlayer.binAdd( projectile );
    }

    waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );

    weaponState( "DeployedIdle", 0 );
}

void tool_teleporter::Teleport() {
    if ( myPlayer != $null_entity ) {
        myPlayer.teleportSucceeded = false;
    }

    projectile.vActivateTeleportation();
}


void tool_teleporter::DeployedRaise() {
    setupAnimClass( "anim_prefix_alt" );

    weaponRising();
    playAnim( ANIMCHANNEL_ALL, "empty_raise" );
    waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
    weaponState( "DeployedIdle", 4 );
}

void tool_teleporter::DeployedLower() {
    StopIdleEffect();
    StopDeployedIdleEffect();

    weaponLowering();
    playAnim( ANIMCHANNEL_ALL, "empty_putaway" );
    waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
    weaponHolstered();
    waitUntil( WEAPON_RAISEWEAPON );
    weaponState( "DeployedRaise", 0 );
}

void tool_teleporter::DeployedIdle() {
    setupAnimClass( "anim_prefix_alt" );

    if ( myPlayer.isLocalPlayer() ) {
        thread ToolTipThread_Deployed();
    }

    weaponReady();

    playCycle( ANIMCHANNEL_ALL, "empty_idle" );
    StartDeployedIdleEffect();

    // clear teleport succeeded so it doesn't drop out of the state straight away
    if ( myPlayer != $null_entity ) {
        myPlayer.teleportSucceeded = false;
    }

    mainFireDown = WEAPON_ATTACK;
    while( true ) {
        if ( myPlayer != $null_entity ) {
            if ( myPlayer.teleportSucceeded ) {
                StopDeployedIdleEffect();
                setupAnimClass( "anim_prefix" );

                playAnim( ANIMCHANNEL_ALL, "empty_fire" );
                playEffect( "fx_teleport", idleEffectJoint, 0 );

                weaponState( "Idle", 4 );
            }
        }

        FindProjectile();

        if ( projectile == $null_entity ) {
            StopDeployedIdleEffect();
            weaponState( "Idle", 4 );        
        }

        if ( WEAPON_LOWERWEAPON ) {
            StopDeployedIdleEffect();
            weaponState( "DeployedLower", 4 );
        }

        if( WEAPON_ATTACK ) {
            if ( !mainFireDown ) {
                mainFireDown = true;

                if ( !projectile.vIsTeleporting() ) {
                    Teleport();
                }
            }
        } else {
            mainFireDown = false;

            if ( !projectile.vIsTeleporting() ) {
                if( WEAPON_ALTFIRE ) {
                    if ( !sys.isClient() && projectile != $null_entity ) {
                        startSound( "snd_recall", SND_WEAPON_FIRE );
                        projectile.vCancelTeleportation();
                    }
                }
            }
        }        

        UpdateCharge();
        sys.waitFrame();
    }
}

void tool_teleporter::ToolTipThread_Raise() {
    myPlayer.cancelToolTips();
    sys.wait( myPlayer.CalcTooltipWait() );

    WAIT_FOR_TOOLTIP;
    myPlayer.sendToolTip( GetToolTip( getKey( "tt_intro_1" ) ) );

    WAIT_FOR_TOOLTIP;
    myPlayer.sendToolTip( GetToolTip( getKey( "tt_intro_2" ) ) );
}

void tool_teleporter::ToolTipThread_Deployed() {
    if ( deployedTipThreadActive ) {
        return;
    }
    deployedTipThreadActive = true;

    WAIT_FOR_TOOLTIP;
    myPlayer.sendToolTip( GetToolTip( getKey( "tt_deployed_intro_1" ) ) );

    WAIT_FOR_TOOLTIP;
    myPlayer.sendToolTip( GetToolTip( getKey( "tt_deployed_intro_2" ) ) );

    deployedTipThreadActive = false;
}