Npcs/Scientist/ScientistIdleSchedule.cs
using Sandbox.Npcs.Tasks;
namespace Sandbox.Npcs.Schedules;
/// <summary>
/// Idle in place — glance around in a natural forward arc and occasionally mutter.
/// </summary>
public sealed class ScientistIdleSchedule : ScheduleBase
{
private static readonly string[] IdleLines =
[
"...",
"Hmm.",
"*yawn*",
"What a day.",
"Need more coffee.",
];
protected override void OnStart()
{
// Pick a horizontal direction within ±90° of where we're already facing
var forward = GameObject.WorldRotation.Forward.WithZ( 0 ).Normal;
var yawOffset = Game.Random.Float( -90f, 90f );
var lookDir = Rotation.FromAxis( Vector3.Up, yawOffset ) * forward;
var lookTarget = GameObject.WorldPosition + lookDir * 100f;
AddTask( new LookAt( lookTarget ) );
// occasionally mutter something
var speech = Npc.Speech;
if ( speech is not null && speech.CanSpeak && Game.Random.Float() < 0.15f )
{
var line = IdleLines[Game.Random.Int( 0, IdleLines.Length - 1 )];
AddTask( new Say( line, 2f ) );
}
// wait a bit, with random deviation
AddTask( new Wait( Game.Random.Float( 1f, 3f ) ) );
}
}