Thanks all.
It's a single player module. So thats one less problem.
With help from Al and some other boards I managed to get some code together...
here is the basics:
// ** OnEnter handle of the appropriate area/trigger.
// ** FUNCTION DECLARATIONS ** //
void Countdown( int nTimeLimit, object oObject = OBJECT_INVALID);
void main()
{
// Declare variables:
object oPC = GetEnteringObject();
// Check that the entering object is a player character and
// that the LocalInt, "bDoOnce", has not been set:
if( !GetIsPC( oPC) || GetLocalInt( OBJECT_SELF, "bDoOnce")) { return;}
// Initiate the countdown:
// Note: The number determines the length of the
// countdown in seconds; you can change it to
// whatever you want. Moreover, delete oPC if you
// don't want to display a countdown for the last
// X seconds.
Countdown( 15, oPC);
// Flag the LocalInt, "bDoOnce", as TRUE so the countdown
// won't start if the player re-enters the area/trigger:
SetLocalInt( OBJECT_SELF, "bDoOnce", TRUE);
}
// ** FUNCTION DEFINITIONS ** //
void Countdown( int nTimeLimit, object oObject = OBJECT_INVALID)
{
// Declare variables:
// Note: Insert the tag of the object you want the player
// to use where indicted.
int bUsed = GetLocalInt( GetObjectByTag( "TAG_OF_OBJECT_HERE"), "bUsed");
// Return if the LocalInt, "bUsed", has been set:
if( bUsed) { return;}
// If the time limit has been exhausted...
if( nTimeLimit == 0) {
// ** WHATEVER YOU WANT TO HAPPEN WHEN THE TIMER ENDS ** //
// Delete the LocalInt, "bDoOnce", so the player can repeat
// the timed task by re-entering the area/trigger:
// Note: Comment out this line if you don't want the
// player to be able to repeat the task in the event
// they fail.
DeleteLocalInt( OBJECT_SELF, "bDoOnce");
// Otherwise...
} else {
// ...inform the player if they have less than or equal to
// 10 seconds remaining...
// Note: This number can be changed.
if( GetIsObjectValid( oObject) && nTimeLimit <= 10) {
FloatingTextStringOnCreature( IntToString( nTimeLimit), oObject);
}
// ...and continue with the countdown:
DelayCommand( 1.0, Countdown( --nTimeLimit, oObject));
}
}
and the great thing is...it works!
It isnt on heartbeat, because I dont trust heartbeat too much

and besides, its a loop that needs to be done every second, not every 6 seconds.