Script:Files:script/maps/quarry/final.script

From Mod Wiki
object quarry_final_objective_trigger {
    void                preinit();
    void                destroy();
    void                syncFields();

    void                OnTouch( entity other, object traceObject );

    void                vCreateMission();
    void                vFreeMission();
    void                vCompleteMission();

    void                OnIsPrimaryObjectiveChanged();
    void                UpdateObjectiveProgress();
    void                UpdateObjectiveThread();
    void                vMakePrimaryObjective( boolean value );
    void                SetObjectiveReminderTime( float time );

    void                vOnItemDeployed( float itemIndex, entity item );

    void                OnItem1Changed();
    void                OnItem2Changed();
    void                OnItem3Changed();

    float                numReturned;
    float                objectiveIndex;

    task                missionTask;

    boolean                isPrimaryObjective;
    float                nextObjectiveReminderTime;

    entity                cell1;
    entity                cell2;
    entity                cell3;

    carryable_item        item1;
    carryable_item        item2;
    carryable_item        item3;

}

void quarry_final_objective_trigger::preinit() {
    objectiveIndex    = getFloatKeyWithDefault( "objective_index", -1 );

    if ( !sys.isClient() ) {
        entity worldspawn = sys.getEntity( "worldspawn" );
        cell1 = worldspawn.getEntityKey( "script_shipcell_1" );
        cell2 = worldspawn.getEntityKey( "script_shipcell_2" );
        cell3 = worldspawn.getEntityKey( "script_shipcell_3" );
    }
}

void quarry_final_objective_trigger::syncFields() {
    syncBroadcast( "item1" );
    syncCallback( "item1", "OnItem1Changed" );
    syncBroadcast( "item2" );
    syncCallback( "item2", "OnItem2Changed" );
    syncBroadcast( "item3" );
    syncCallback( "item3", "OnItem3Changed" );
}

void quarry_final_objective_trigger::destroy() {
    vFreeMission();
}

void quarry_final_objective_trigger::OnTouch( entity other, object traceObject ) {
    if ( !sys.isClient() ) {
        carryable_item carryable = other.vGetCarryableItem();
        if ( carryable != $null_entity ) {
            numReturned++;

            objManager.PushCPrintString( other.getUserName() );
            objManager.PushCPrintHandle( carryable.itemname );
            objManager.CPrintEvent( carryable.itemCaptured, $null );

            if ( carryable == item1 ) {
                objManager.killBotActionGroup( QUARRY_STROGG_ATTACK_BARRACKS_POD );
                objManager.killBotActionGroup( QUARRY_GDF_DEFEND_BARRACKS_POD );
                objManager.killBotActionGroup( QUARRY_CELL_OBJ_1 );                    // Cell 1 Take Action

            }
            else if ( carryable == item2 ) {
                objManager.killBotActionGroup( QUARRY_STROGG_ATTACK_WAREHOUSE_POD );
                objManager.killBotActionGroup( QUARRY_GDF_DEFEND_WAREHOUSE_POD );
                objManager.killBotActionGroup( QUARRY_CELL_OBJ_2 );                    // Cell 2 Take Action
            }
            else {
                objManager.killBotActionGroup( QUARRY_STROGG_ATTACK_OFFICE_POD );
                objManager.killBotActionGroup( QUARRY_GDF_DEFEND_OFFICE_POD );
                objManager.killBotActionGroup( QUARRY_CELL_OBJ_3 );                    // Cell 3 Take Action
            }

            carryable.remove();

            if ( numReturned == 1 ) {
                cell1.show();
                objManager.PlaySound( getKey( "snd_third_strogg" ), stroggTeam );
                objManager.PlaySound( getKey( "snd_third_gdf" ), gdfTeam );
            } else if ( numReturned == 2 ) {
                cell2.show();
                objManager.PlaySound( getKey( "snd_twothird_strogg" ), stroggTeam );
                objManager.PlaySound( getKey( "snd_twothird_gdf" ), gdfTeam );
            } else if ( numReturned == 3 ) {
                cell3.show();
                objManager.CompleteObjective( objectiveIndex, other );
            }
        }
    }
}




void quarry_final_objective_trigger::OnIsPrimaryObjectiveChanged() {
    if ( item1 != $null_entity ) {
        item1.vMakePrimaryObjective( isPrimaryObjective );
    }
    if ( item2 != $null_entity ) {
        item2.vMakePrimaryObjective( isPrimaryObjective );
    }
    if ( item3 != $null_entity ) {
        item3.vMakePrimaryObjective( isPrimaryObjective );
    }

    if ( isPrimaryObjective ) {
        thread UpdateObjectiveThread();
    } else {
        sys.killThread( "UpdateObjectiveThread_" + getName() );
    }
}

void quarry_final_objective_trigger::vMakePrimaryObjective( boolean value ) {
    isPrimaryObjective = value;
    OnIsPrimaryObjectiveChanged();
}

void quarry_final_objective_trigger::SetObjectiveReminderTime( float time ) {
    if ( time > nextObjectiveReminderTime ) {
        nextObjectiveReminderTime = time;
    }
}

void quarry_final_objective_trigger::UpdateObjectiveThread() {
    waitUntil( objManager.gameState == GS_GAMEON );

    SetObjectiveReminderTime( sys.getTime() + 60.f );

    while ( true ) {
        UpdateObjectiveProgress();

        if ( !sys.isClient() ) {
            if ( sys.getTime() >= nextObjectiveReminderTime ) {
                objManager.PlaySound( getKey( "snd_reminder_strogg" ), stroggTeam );
                objManager.PlaySound( getKey( "snd_reminder_gdf" ), gdfTeam );

                SetObjectiveReminderTime( sys.getTime() + 60.f );
            }
        }

        sys.waitFrame();
    }
}

void quarry_final_objective_trigger::UpdateObjectiveProgress() {
    if ( sys.getLocalPlayer() != $null_entity ) {
        if ( item1 != $null_entity ) {
            item1.UpdateObjectiveProgress();
        } else {
            sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective.active", 0.f );
        }

        if ( item2 != $null_entity ) {
            item2.UpdateObjectiveProgress();
        } else {
            sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective2.active", 0.f );
        }

        if ( item3 != $null_entity ) {
            item3.UpdateObjectiveProgress();
        } else {
            sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective3.active", 0.f );
        }
    }
}

void quarry_final_objective_trigger::vOnItemDeployed( float itemIndex, entity item ) {
    if ( itemIndex == 0 ) {
        item1 = item;
        OnItem1Changed();
    } else if ( itemIndex == 1 ) {
        item2 = item;
        OnItem2Changed();
    } else if ( itemIndex == 2 ) {
        item3 = item;
        OnItem3Changed();
    }
}

void quarry_final_objective_trigger::OnItem1Changed() {
    if ( item1 != $null_entity ) {
        item1.vSetObjectiveString( "docObjective" );
        if ( isPrimaryObjective ) {
            item1.vMakePrimaryObjective( true );
        }
    }
}

void quarry_final_objective_trigger::OnItem2Changed() {
    if ( item2 != $null_entity ) {
        item2.vSetObjectiveString( "docObjective2" );
        if ( isPrimaryObjective ) {
            item2.vMakePrimaryObjective( true );
        }
    }
}

void quarry_final_objective_trigger::OnItem3Changed() {
    if ( item3 != $null_entity ) {
        item3.vSetObjectiveString( "docObjective3" );
        if ( isPrimaryObjective ) {
            item3.vMakePrimaryObjective( true );
        }
    }
}


void quarry_final_objective_trigger::vCreateMission() {
    vFreeMission();
    missionTask = taskManager.allocEntityTask( GetPlayerTask( getKey( "task_deliver" ) ), self );
}

void quarry_final_objective_trigger::vFreeMission() {
    if ( missionTask != $null ) {
        missionTask.free();
        missionTask = $null;
    }
}

void quarry_final_objective_trigger::vCompleteMission() {
    if ( missionTask != $null ) {
        missionTask.complete();
        missionTask.free();
        missionTask = $null;
    }
}