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);
}