FunStuff/JumperNPCLooker.cs
using Sandbox;
using Sandbox.Citizen;
using Sandbox.Internal;

public sealed class JumperNPCLooker : Component, Component.ITriggerListener
{
	[Property] public CitizenAnimationHelper animhelp { get; set; }
	[Property] public GameObject LookTarget { get; set; }
	[Property] List<NPCTextGameResource> Resources { get; set; }
	NPCTextGameResource NPCTextGameResource { get; set; }

	protected override void OnEnabled()
	{
		base.OnEnabled();

		if ( Resources != null && Resources.Count > 0 )
		{
			int randomIndex = new Random().Next( 0, Resources.Count );

			NPCTextGameResource = Resources[randomIndex];
		}
	}

	void ITriggerListener.OnTriggerEnter( Collider other )
	{

		if ( other.GameObject.Tags.Has( "player" ) )
		{
			animhelp.LookAt = other.GameObject.Parent;
			animhelp.EyesWeight = 1;
			animhelp.HeadWeight = 1;
			animhelp.BodyWeight = 1;
			/*
			var yapper = other.GameObject.Parent.Components.Get<JumperNPCTalker>( FindMode.EnabledInSelfAndChildren );
			yapper.DisplayMessage( GetRandomMessage() );
			yapper.NPCName = NPCTextGameResource.NPCName;
			yapper.Voice = NPCTextGameResource.NPCVoice;
			*/
		}
	}

	void ITriggerListener.OnTriggerExit( Collider other )
	{

		if ( other.GameObject.Tags.Has( "player" ) )
		{
			animhelp.LookAt = LookTarget;
		}

	}

	private int lastMessage;
	private string GetRandomMessage()
	{
		var idx = Game.Random.Int( 0, NPCTextGameResource.NPCText.Count - 1 );
		while ( idx == lastMessage )
			idx = Game.Random.Int( 0, NPCTextGameResource.NPCText.Count - 1 );

		lastMessage = idx;
		return string.Format( NPCTextGameResource.NPCText[idx] );
	}
}