Scripted Waypoints

A place for players to discuss building content (toolset Q&A etc.)
Post Reply
Rob
Forum Troll
Posts: 3146
Joined: Fri Sep 22, 2006 9:39 pm
Other PCs: Amir Ma'fir, Darius Aylomen, Dewey Scoville, Jack Red-Eyes, Jørann, Kale, Leopold von Bruhl, Modelo Del Mar & Quintus d'Cerevallia
Bioware Username: robertharris
Location: Dallas, TX

Scripted Waypoints

Post by Rob »

In NWN1, you could create an NPC walk path by placing a series of waypoints named WP_<creature tag>_##. Now in NWN2, you can attach a script to that walk path, which fires every time an NPC hits a waypoint. Using the function GetCurrentWaypoint(), you can script events for each specific way point.

For example, I created an NPC named customer. I created an office building with a receptionist, two waiting rooms, and four offices. I placed these waypoints:

WP_customer_01 - at the entrance
WP_customer_02 - at the receptionist
WP_customer_03 - at the first waiting room
WP_customer_04 - at the second waiting room
WP_customer_05 - at the first office
WP_customer_06 - at the second office
WP_customer_07 - at the third office
WP_customer_08 - at the fourth office
WP_customer_09 - at the exit

Using the following script named wp_customer, I can simulate customers entering the office building, interacting with random clerks, and then exiting.

Code: Select all

//	WAYPOINT SCRIPT
//
//	NOTES:
//	StandardRedirectorNode:		THIS FUNCTION TELLS THE NPC TO HIDE FOR A CERTAIN AMOUNT OF TIME
//								BEFORE CHANGING CLOTHES AND WALKING WAYPOINTS AGAIN.
//	StandardRoadNetworkNode:	THIS FUNCTION SENDS THE NPC TO A WAYPOINT PICKED RANDOMLY FROM A LIST.
//								IF THE ONLY WAYPOINT AVAILABLE IS THE CURRENT WAYPOINT,
//								THE NPC IS SENT TO THE REDIRECTOR NODE SPECIFIED.
//
#include "ginc_wp"
//
//	HAVE A CONVERSATION WITH THE NEAREST NPC
//
void TalkWithClerk();
//
//	MAIN
//
void main()
{
	int iCurrentWP = GetCurrentWaypoint();

    switch (iCurrentWP)
    {
//	
//		ENTRANCE
//		GIVE THE NPC A RANDOM NAME
//		WAIT 0 TO 30 SECONDS BEFORE SPAWNING HIM AT WAYPOINT 01
//	
        case 1:
			SetFirstName(OBJECT_SELF, RandomName());
            StandardRedirectorNode("01", IntToFloat(Random(30)));
            break;
//			
//		RECEPTION DESK
//		TALK WITH THE RECEPTIONIST
//		THEN WALK TO A RANDOM OFFICE FROM THE LIST ("05,06,07,08")
//		
        case 2:
			TalkWithClerk();
            StandardRoadNetworkNode("05,06,07,08", 1);
            break;
//
//		WAITING ROOM ONE
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM OFFICE FROM THE LIST ("05,06,07,08")
//
         case 3:
		 	ActionPlayAnimation(RandomPauseAnim(),IntToFloat(Random(30)));
            StandardRoadNetworkNode("05,06,07,08", 1);
            break;
//
//		WAITING ROOM TWO
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM OFFICE FROM THE LIST ("05,06,07,08")
//
         case 4:
		 	ActionPlayAnimation(RandomPauseAnim(),IntToFloat(Random(30)));
            StandardRoadNetworkNode("05,06,07,08", 1);
            break;
//
//		OFFICE ONE
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM WAYPOINT FROM THE LIST ("02,03,04,09")
//		RECEPTIONIST, WAITING ROOM ONE, WAITING ROOM TWO, OR EXIT
//
         case 5:
			TalkWithClerk();		 
            StandardRoadNetworkNode("02,03,04,09", 1);
            break;
//
//		OFFICE TWO
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM WAYPOINT FROM THE LIST ("02,03,04,09")
//		RECEPTIONIST, WAITING ROOM ONE, WAITING ROOM TWO, OR EXIT
//
         case 6:
			TalkWithClerk();		 
            StandardRoadNetworkNode("02,03,04,09", 1);
            break;
//
//		OFFICE THREE
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM WAYPOINT FROM THE LIST ("02,03,04,09")
//		RECEPTIONIST, WAITING ROOM ONE, WAITING ROOM TWO, OR EXIT
//
         case 7:
			TalkWithClerk();		 
            StandardRoadNetworkNode("02,03,04,09", 1);
            break;
//
//		OFFICE FOUR
//		PLAY A RANDOM ANIMATION FOR 0-30 SECONDS
//		THEN WALK TO A RANDOM WAYPOINT FROM THE LIST ("02,03,04,09")
//		RECEPTIONIST, WAITING ROOM ONE, WAITING ROOM TWO, OR EXIT
//
         case 8:
			TalkWithClerk();		 
            StandardRoadNetworkNode("02,03,04,09", 1);
            break;
//
//		EXIT
//		SPECIFYING THE CURRENT WAYPOINT ENSURES THE NPC WILL RETURN TO THE STANDARD REDIRECTOR NODE
//
         case 9:
            StandardRoadNetworkNode("09", 1);
            break;
     }
}
//
//	START A CONVERSATION WITH THE NEAREST NPC
//
void TalkWithClerk()
{
	object oOther;
	oOther = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC);
	InitiateConversation(oOther);
	ShortConversation(oOther);
}
Post Reply

Return to “The Carpenter's Hall”