<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.deltaworlds.com/index.php?action=history&amp;feed=atom&amp;title=Mover_Control_example_code</id>
	<title>Mover Control example code - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.deltaworlds.com/index.php?action=history&amp;feed=atom&amp;title=Mover_Control_example_code"/>
	<link rel="alternate" type="text/html" href="https://wiki.deltaworlds.com/index.php?title=Mover_Control_example_code&amp;action=history"/>
	<updated>2026-04-20T14:22:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.deltaworlds.com/index.php?title=Mover_Control_example_code&amp;diff=200&amp;oldid=prev</id>
		<title>Xan: Created page with &quot;&lt;pre&gt; /*-----------------------------------------------------------------------------                             M o v e r   C o n t r o l                       Copyright 2007 Activeworlds Inc           Licensed Material -- Program Property of Activeworlds Inc. -----------------------------------------------------------------------------*/   #define MAX_MODEL_NAME        64 #define WAIT_TIME             10  // time to wait for SDK packets and events before update #defin...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.deltaworlds.com/index.php?title=Mover_Control_example_code&amp;diff=200&amp;oldid=prev"/>
		<updated>2025-04-07T19:26:50Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;-----------------------------------------------------------------------------                             M o v e r   C o n t r o l                       Copyright 2007 Activeworlds Inc           Licensed Material -- Program Property of Activeworlds Inc. -----------------------------------------------------------------------------: &lt;/span&gt;   #define MAX_MODEL_NAME        64 #define WAIT_TIME             10  // time to wait for SDK packets and events before update #defin...&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
/*-----------------------------------------------------------------------------&lt;br /&gt;
                            M o v e r   C o n t r o l&lt;br /&gt;
                      Copyright 2007 Activeworlds Inc&lt;br /&gt;
          Licensed Material -- Program Property of Activeworlds Inc.&lt;br /&gt;
-----------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define MAX_MODEL_NAME        64&lt;br /&gt;
#define WAIT_TIME             10  // time to wait for SDK packets and events before update&lt;br /&gt;
#define WAYPOINT_RESOLUTION   1   // accuracy, interpolates waypoint (1 to 10) - use as low as possible!&lt;br /&gt;
#define UPDATE_INTERVAL       (1000 / (aw_int (AW_WORLD_AVATAR_REFRESH_RATE) * WAYPOINT_RESOLUTION))&lt;br /&gt;
#define IDLE_INTERVAL         ((aw_int (AW_WORLD_MOVER_USED_RESET_TIMEOUT) * 1000) / 2)&lt;br /&gt;
#define STATE_INVALIDATE      -1  // invalidate mover&amp;#039;s state&lt;br /&gt;
#define MAX_WAYPOINTS         16  // number of elements in &amp;quot;waypoints&amp;quot; array&lt;br /&gt;
&lt;br /&gt;
// announced messages&lt;br /&gt;
#define START_MSG             &amp;quot;Bus started.&amp;quot;&lt;br /&gt;
#define STOP_MSG              &amp;quot;Bus stopped. Please leave the bus.&amp;quot;&lt;br /&gt;
#define READY_MSG             &amp;quot;Passengers are welcome! Bus will start in 15 seconds.&amp;quot;&lt;br /&gt;
#define POSTPONE_MSG          &amp;quot;Tour postponed by 15 seconds. Passengers are welcome!&amp;quot;&lt;br /&gt;
#define RIDER_ADDED_WHISPER   &amp;quot;You joined the bus tour.&amp;quot;&lt;br /&gt;
#define RIDER_DELETED_WHISPER &amp;quot;You left the bus tour.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;aw.h&amp;quot;&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct {&lt;br /&gt;
  int x;&lt;br /&gt;
  int y;&lt;br /&gt;
  int z;&lt;br /&gt;
  int yaw;&lt;br /&gt;
  int pitch;&lt;br /&gt;
  int roll;&lt;br /&gt;
} waypoints[MAX_WAYPOINTS] = {&lt;br /&gt;
// X      Y     Z     YAW   PITCH ROLL&lt;br /&gt;
  {0,     0,    0,    0,    0,    0},&lt;br /&gt;
  {0,     100,  500,  0,    -16,  32},&lt;br /&gt;
  {500,   400,  1000, 160,  -32,  64},&lt;br /&gt;
  {1000,  300,  1500, 280,  -16,  128},&lt;br /&gt;
  {1500,  200,  2000, 360,  -16,  64},&lt;br /&gt;
  {2000,  0,    2000, 450,  0,    -128},&lt;br /&gt;
  {1000,  200,  2500, -450, -16,  -256},&lt;br /&gt;
  {500,   400,  3000, -300, -16,  -64},&lt;br /&gt;
  {0,     900,  3500, -215, -32,  -32},&lt;br /&gt;
  {0,     400,  4000, 0,    -32,  0},&lt;br /&gt;
  {0,     0,    4200, 0,    -16,  0},&lt;br /&gt;
  {0,     900,  4000, 900,  -180, 180},&lt;br /&gt;
  {500,   1500, 2000, 2400, -360, 360},&lt;br /&gt;
  {-1500, 900,  500,  1200, 180, -90},&lt;br /&gt;
  {-800,  400,  -900, 0,    32,   -32},&lt;br /&gt;
  {0,     0,    0,    0,    0,    0},&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct rider {&lt;br /&gt;
  int           session;&lt;br /&gt;
  struct rider* next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct mover {&lt;br /&gt;
  unsigned int  id;&lt;br /&gt;
  int           state;&lt;br /&gt;
  int           init_x;&lt;br /&gt;
  int           init_y;&lt;br /&gt;
  int           init_z;&lt;br /&gt;
  int           init_yaw;&lt;br /&gt;
  int           init_pitch;&lt;br /&gt;
  int           init_roll;&lt;br /&gt;
  int           cur_x;&lt;br /&gt;
  int           cur_y;&lt;br /&gt;
  int           cur_z;&lt;br /&gt;
  int           cur_yaw;&lt;br /&gt;
  int           cur_pitch;&lt;br /&gt;
  int           cur_roll;&lt;br /&gt;
  unsigned int  start;&lt;br /&gt;
  unsigned int  last_update;&lt;br /&gt;
  unsigned int  last_move;&lt;br /&gt;
  float         last_waypoint;&lt;br /&gt;
  int           rider_count;&lt;br /&gt;
  struct rider* riders;&lt;br /&gt;
  struct mover* next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static  struct mover*   movers      = NULL;&lt;br /&gt;
static  int             mv_owner    = 0;&lt;br /&gt;
static  char            mv_model[MAX_MODEL_NAME];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void log_msg (char* format, ...)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  va_list  		args;&lt;br /&gt;
  struct tm*            now;&lt;br /&gt;
  time_t                secs;&lt;br /&gt;
  char                  buffer[1024];&lt;br /&gt;
&lt;br /&gt;
  time (&amp;amp;secs);&lt;br /&gt;
  now = localtime (&amp;amp;secs);&lt;br /&gt;
  strftime (buffer, sizeof (buffer), &amp;quot;%y-%m-%d %X &amp;quot;, now);&lt;br /&gt;
  printf (buffer);&lt;br /&gt;
&lt;br /&gt;
  va_start (args, format);&lt;br /&gt;
  __try {&lt;br /&gt;
    vsprintf (buffer, format, args);&lt;br /&gt;
  }&lt;br /&gt;
	__except( EXCEPTION_EXECUTE_HANDLER ) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  va_end (args);&lt;br /&gt;
  puts (buffer);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void announce (char* format, ...)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  va_list  		args;&lt;br /&gt;
  char                  buffer[1024];&lt;br /&gt;
&lt;br /&gt;
  va_start (args, format);&lt;br /&gt;
  __try {&lt;br /&gt;
    vsprintf (buffer, format, args);&lt;br /&gt;
  }&lt;br /&gt;
	__except( EXCEPTION_EXECUTE_HANDLER ) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  va_end (args);&lt;br /&gt;
  aw_say (buffer);&lt;br /&gt;
  log_msg (&amp;quot;announce : \&amp;quot;%s\&amp;quot;&amp;quot;, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL rider_add (unsigned int id, int session)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  BOOL            exists;&lt;br /&gt;
&lt;br /&gt;
  if (session == aw_session ())&lt;br /&gt;
    return TRUE;  // dont add own session&lt;br /&gt;
&lt;br /&gt;
  for (mv = movers; mv; mv = mv-&amp;gt;next)&lt;br /&gt;
    if (mv-&amp;gt;id == id)&lt;br /&gt;
      break;&lt;br /&gt;
  if (!mv)&lt;br /&gt;
    return FALSE;&lt;br /&gt;
&lt;br /&gt;
  for (exists = FALSE, rd = mv-&amp;gt;riders; rd; rd = rd-&amp;gt;next)&lt;br /&gt;
    if (rd-&amp;gt;session == session) {&lt;br /&gt;
      exists = TRUE;&lt;br /&gt;
      break;  // exists already&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  if (!rd&lt;br /&gt;
  &amp;amp;&amp;amp; !(rd = (struct rider*)calloc (1, sizeof (struct rider))))&lt;br /&gt;
    return FALSE;&lt;br /&gt;
&lt;br /&gt;
  rd-&amp;gt;session = session;&lt;br /&gt;
&lt;br /&gt;
  if (!exists) {&lt;br /&gt;
    if (mv-&amp;gt;riders)&lt;br /&gt;
      rd-&amp;gt;next = mv-&amp;gt;riders;&lt;br /&gt;
    mv-&amp;gt;riders = rd;&lt;br /&gt;
    mv-&amp;gt;rider_count++;&lt;br /&gt;
    aw_whisper (session, RIDER_ADDED_WHISPER);&lt;br /&gt;
  }&lt;br /&gt;
  return TRUE;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL rider_del (unsigned int id, int session)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  struct rider*   prev;&lt;br /&gt;
&lt;br /&gt;
  for (mv = movers; mv; mv = mv-&amp;gt;next)&lt;br /&gt;
    if (mv-&amp;gt;id == id)&lt;br /&gt;
      break;&lt;br /&gt;
  if (!mv)&lt;br /&gt;
    return FALSE; // mover does not exist&lt;br /&gt;
&lt;br /&gt;
  for (prev = NULL, rd = mv-&amp;gt;riders; rd; rd = rd-&amp;gt;next) {&lt;br /&gt;
    if (rd-&amp;gt;session == session)&lt;br /&gt;
      break;&lt;br /&gt;
    prev = rd;&lt;br /&gt;
  }&lt;br /&gt;
  if (!rd)&lt;br /&gt;
    return FALSE;&lt;br /&gt;
  if (prev)&lt;br /&gt;
    prev-&amp;gt;next = rd-&amp;gt;next;&lt;br /&gt;
  else&lt;br /&gt;
    movers-&amp;gt;riders = rd-&amp;gt;next;&lt;br /&gt;
  free (rd);&lt;br /&gt;
  mv-&amp;gt;rider_count--;&lt;br /&gt;
  aw_whisper (session, RIDER_DELETED_WHISPER);&lt;br /&gt;
  return TRUE;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL mover_add (unsigned int id, int state, int x, int y, int z,&lt;br /&gt;
                int yaw, int pitch, int roll)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  BOOL            exists;&lt;br /&gt;
&lt;br /&gt;
  if (movers)&lt;br /&gt;
    return FALSE; // this bot controls one mover only!&lt;br /&gt;
&lt;br /&gt;
  for (exists = FALSE, mv = movers; mv; mv = mv-&amp;gt;next)&lt;br /&gt;
    if (mv-&amp;gt;id == id) {&lt;br /&gt;
      exists = TRUE;&lt;br /&gt;
      break;  // exists already&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  if (!mv&lt;br /&gt;
  &amp;amp;&amp;amp; !(mv = (struct mover*)calloc (1, sizeof (struct mover))))&lt;br /&gt;
    return FALSE;&lt;br /&gt;
&lt;br /&gt;
  mv-&amp;gt;id            = id;&lt;br /&gt;
  mv-&amp;gt;init_x        = x;&lt;br /&gt;
  mv-&amp;gt;init_y        = y;&lt;br /&gt;
  mv-&amp;gt;init_z        = z;&lt;br /&gt;
  mv-&amp;gt;init_yaw      = yaw;&lt;br /&gt;
  mv-&amp;gt;init_pitch    = pitch;&lt;br /&gt;
  mv-&amp;gt;init_roll     = roll;&lt;br /&gt;
  mv-&amp;gt;cur_x         = waypoints[0].x;&lt;br /&gt;
  mv-&amp;gt;cur_y         = waypoints[0].y;&lt;br /&gt;
  mv-&amp;gt;cur_z         = waypoints[0].z;&lt;br /&gt;
  mv-&amp;gt;cur_yaw       = waypoints[0].yaw;&lt;br /&gt;
  mv-&amp;gt;cur_pitch     = waypoints[0].pitch;&lt;br /&gt;
  mv-&amp;gt;cur_roll      = waypoints[0].roll;&lt;br /&gt;
  mv-&amp;gt;last_waypoint = 0.0f;&lt;br /&gt;
  mv-&amp;gt;start         = aw_tick ();&lt;br /&gt;
  mv-&amp;gt;state         = state;&lt;br /&gt;
&lt;br /&gt;
  if (!exists) {&lt;br /&gt;
    if (movers)&lt;br /&gt;
      mv-&amp;gt;next = movers;&lt;br /&gt;
    movers = mv;&lt;br /&gt;
  }&lt;br /&gt;
  return TRUE;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL mover_change (unsigned int id, int state, int x, int y, int z,&lt;br /&gt;
                   int yaw, int pitch, int roll)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
&lt;br /&gt;
  for (mv = movers; mv; mv = mv-&amp;gt;next)&lt;br /&gt;
    if (mv-&amp;gt;id == id)&lt;br /&gt;
      break;&lt;br /&gt;
  if (!mv)&lt;br /&gt;
    return FALSE;&lt;br /&gt;
&lt;br /&gt;
  mv-&amp;gt;state       = state;&lt;br /&gt;
&lt;br /&gt;
  if (state == AW_MOVER_STATE_RESET) {&lt;br /&gt;
    mv-&amp;gt;cur_x         = waypoints[0].x;&lt;br /&gt;
    mv-&amp;gt;cur_y         = waypoints[0].y;&lt;br /&gt;
    mv-&amp;gt;cur_z         = waypoints[0].z;&lt;br /&gt;
    mv-&amp;gt;cur_yaw       = waypoints[0].yaw;&lt;br /&gt;
    mv-&amp;gt;cur_pitch     = waypoints[0].pitch;&lt;br /&gt;
    mv-&amp;gt;cur_roll      = waypoints[0].roll;&lt;br /&gt;
    mv-&amp;gt;last_waypoint = 0.0f;&lt;br /&gt;
    mv-&amp;gt;start = aw_tick ();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return TRUE;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
BOOL mover_del (unsigned int id)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct mover*   prev;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  struct rider*   rd_tmp;&lt;br /&gt;
&lt;br /&gt;
  for (prev = NULL, mv = movers; mv; mv = mv-&amp;gt;next) {&lt;br /&gt;
    if (mv-&amp;gt;id == id)&lt;br /&gt;
      break;&lt;br /&gt;
    prev = mv;&lt;br /&gt;
  }&lt;br /&gt;
  if (!mv)&lt;br /&gt;
    return FALSE;&lt;br /&gt;
  for (rd = mv-&amp;gt;riders; rd; ) {&lt;br /&gt;
    rd_tmp  = rd;&lt;br /&gt;
    rd      = rd-&amp;gt;next;&lt;br /&gt;
    free (rd_tmp);&lt;br /&gt;
  }&lt;br /&gt;
  mv-&amp;gt;riders = NULL;&lt;br /&gt;
  if (prev)&lt;br /&gt;
    prev-&amp;gt;next = mv-&amp;gt;next;&lt;br /&gt;
  else&lt;br /&gt;
    movers = mv-&amp;gt;next;&lt;br /&gt;
  free (mv);&lt;br /&gt;
  return TRUE;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reset ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct mover*   mv_tmp;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  struct rider*   rd_tmp;&lt;br /&gt;
&lt;br /&gt;
  for (mv = movers; mv; ) {&lt;br /&gt;
    for (rd = mv-&amp;gt;riders; rd; ) {&lt;br /&gt;
      rd_tmp  = rd;&lt;br /&gt;
      rd      = rd-&amp;gt;next;&lt;br /&gt;
      free (rd_tmp);&lt;br /&gt;
    }&lt;br /&gt;
    mv_tmp = mv;&lt;br /&gt;
    mv = mv-&amp;gt;next;&lt;br /&gt;
    free (mv_tmp);&lt;br /&gt;
  }&lt;br /&gt;
  movers = NULL;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_add (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (aw_int (AW_ENTITY_TYPE) == AW_ENTITY_MOVER&lt;br /&gt;
  &amp;amp;&amp;amp; aw_int (AW_ENTITY_ID)&lt;br /&gt;
  &amp;amp;&amp;amp; aw_int (AW_ENTITY_OWNER_CITIZEN) == mv_owner&lt;br /&gt;
  &amp;amp;&amp;amp; !stricmp (aw_string (AW_OBJECT_MODEL), mv_model)) {&lt;br /&gt;
    if (mover_add (aw_int (AW_ENTITY_ID), aw_int (AW_ENTITY_STATE),&lt;br /&gt;
      aw_int (AW_OBJECT_X), aw_int (AW_OBJECT_Y), aw_int (AW_OBJECT_Z),&lt;br /&gt;
      aw_int (AW_OBJECT_YAW), aw_int (AW_OBJECT_TILT), aw_int (AW_OBJECT_ROLL))) {&lt;br /&gt;
      // Reset the mover in case it&amp;#039;s used (causes mover to blick 10 seconds)&lt;br /&gt;
      if (aw_int (AW_ENTITY_STATE) != AW_MOVER_STATE_IDLE)&lt;br /&gt;
        aw_mover_set_state (aw_int (AW_ENTITY_ID), AW_MOVER_STATE_RESET, 0);&lt;br /&gt;
&lt;br /&gt;
      log_msg (&amp;quot;Mover ADD: %u %s&amp;quot;, aw_int (AW_ENTITY_ID), aw_string (AW_OBJECT_MODEL));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_change (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (mover_change (aw_int (AW_ENTITY_ID), aw_int (AW_ENTITY_STATE),&lt;br /&gt;
    aw_int (AW_ENTITY_X), aw_int (AW_ENTITY_Y), aw_int (AW_ENTITY_Z),&lt;br /&gt;
    aw_int (AW_ENTITY_YAW), aw_int (AW_ENTITY_PITCH), aw_int (AW_ENTITY_ROLL))) {&lt;br /&gt;
    // Reset the mover when bot isn&amp;#039;t owner! (somewhere else is using it)&lt;br /&gt;
    if (aw_int (AW_ENTITY_STATE) != AW_MOVER_STATE_RESET&lt;br /&gt;
    &amp;amp;&amp;amp; aw_int (AW_ENTITY_STATE) != AW_MOVER_STATE_IDLE&lt;br /&gt;
    &amp;amp;&amp;amp; aw_int (AW_ENTITY_OWNER_SESSION) != aw_session ())&lt;br /&gt;
      aw_mover_set_state (aw_int (AW_ENTITY_ID), AW_MOVER_STATE_RESET, 0);&lt;br /&gt;
    log_msg (&amp;quot;Mover CHG: %u state: %d&amp;quot;, aw_int (AW_ENTITY_ID), aw_int (AW_ENTITY_STATE));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_delete (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (mover_del (aw_int (AW_ENTITY_ID)))&lt;br /&gt;
    log_msg (&amp;quot;Mover DEL: %u&amp;quot;, aw_int (AW_ENTITY_ID));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_rider_add (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (rider_add (aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION)))&lt;br /&gt;
    log_msg (&amp;quot;Rider ADD: %u session# %d&amp;quot;, aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_rider_change (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (rider_add (aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION)))&lt;br /&gt;
    log_msg (&amp;quot;Rider CHG: %u session# %d&amp;quot;, aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_entity_rider_delete (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (rider_del (aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION)))&lt;br /&gt;
    log_msg (&amp;quot;Rider DEL: %u session# %d&amp;quot;, aw_int (AW_ENTITY_ID), aw_int (AW_AVATAR_SESSION));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_enter (int rc)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  reset ();&lt;br /&gt;
  if (rc) {&lt;br /&gt;
    log_msg (&amp;quot;world enter failed [%d]&amp;quot;, rc);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // announce our position in the world&lt;br /&gt;
  aw_int_set (AW_MY_X, 0);        // 0W&lt;br /&gt;
  aw_int_set (AW_MY_Y, 0);        // 0a&lt;br /&gt;
  aw_int_set (AW_MY_Z, 0);        // 0N&lt;br /&gt;
  aw_int_set (AW_MY_YAW, 0);      // facing south&lt;br /&gt;
  aw_int_set (AW_MY_PITCH, 0);&lt;br /&gt;
  if (rc = aw_state_change ()) {&lt;br /&gt;
    log_msg (&amp;quot;Unable to change state (reason %d)&amp;quot;, rc);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  log_msg (&amp;quot;%s entered world %s&amp;quot;,&lt;br /&gt;
    aw_string (AW_LOGIN_NAME), aw_string (AW_WORLD_NAME));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_world_disconnect (void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  reset ();&lt;br /&gt;
  log_msg (&amp;quot;world disconnected [%d]&amp;quot;, aw_int (AW_DISCONNECT_REASON));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pause (int id)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  aw_mover_set_state (id, AW_MOVER_STATE_PAUSE, 0);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void start (int id)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  int             num_riders;&lt;br /&gt;
  int             angle;&lt;br /&gt;
&lt;br /&gt;
  aw_mover_set_state (id, AW_MOVER_STATE_CONTINUE, 0);&lt;br /&gt;
&lt;br /&gt;
// optionally position all riders to their seats,&lt;br /&gt;
// starting with world build 86 and browser build 969&lt;br /&gt;
  for (mv = movers; mv; mv = mv-&amp;gt;next)&lt;br /&gt;
    if (mv-&amp;gt;id == (unsigned int)id)&lt;br /&gt;
      break;&lt;br /&gt;
  if (!mv)&lt;br /&gt;
    return;&lt;br /&gt;
  for (num_riders = 0, rd = mv-&amp;gt;riders; rd; rd = rd-&amp;gt;next)&lt;br /&gt;
    num_riders++;&lt;br /&gt;
  for (angle = 0, rd = mv-&amp;gt;riders; rd; rd = rd-&amp;gt;next) {&lt;br /&gt;
    aw_mover_rider_change (aw_int (AW_ENTITY_ID), rd-&amp;gt;session, 100, angle, -35, 1800, 0);&lt;br /&gt;
    angle += 3600 / num_riders;&lt;br /&gt;
    log_msg (&amp;quot;Rider %d changed to riding position&amp;quot;, rd-&amp;gt;session);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void move_to (struct mover* mv)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  int interval;&lt;br /&gt;
  int wp;&lt;br /&gt;
  int dx;&lt;br /&gt;
  int dy;&lt;br /&gt;
  int dz;&lt;br /&gt;
  int dyaw;&lt;br /&gt;
  int dpitch;&lt;br /&gt;
  int droll;&lt;br /&gt;
&lt;br /&gt;
  interval  = aw_int (AW_WORLD_AVATAR_REFRESH_RATE) * WAYPOINT_RESOLUTION;&lt;br /&gt;
  wp        = (int)mv-&amp;gt;last_waypoint;&lt;br /&gt;
  if (wp &amp;lt; 0 || wp &amp;gt;= MAX_WAYPOINTS)&lt;br /&gt;
    wp = 0;&lt;br /&gt;
&lt;br /&gt;
  if (wp) {&lt;br /&gt;
    dx      = mv-&amp;gt;cur_x + ((waypoints[wp].x - waypoints[wp - 1].x) / interval);&lt;br /&gt;
    dy      = mv-&amp;gt;cur_y + ((waypoints[wp].y - waypoints[wp - 1].y) / interval);&lt;br /&gt;
    dz      = mv-&amp;gt;cur_z + ((waypoints[wp].z - waypoints[wp - 1].z) / interval);&lt;br /&gt;
    dyaw    = mv-&amp;gt;cur_yaw + ((waypoints[wp].yaw - waypoints[wp - 1].yaw) / interval);&lt;br /&gt;
    dpitch  = mv-&amp;gt;cur_pitch + ((waypoints[wp].pitch - waypoints[wp - 1].pitch) / interval);&lt;br /&gt;
    droll   = mv-&amp;gt;cur_roll + ((waypoints[wp].roll - waypoints[wp - 1].roll) / interval);&lt;br /&gt;
  } else {&lt;br /&gt;
    dx      = waypoints[wp].x;&lt;br /&gt;
    dy      = waypoints[wp].y;&lt;br /&gt;
    dz      = waypoints[wp].z;&lt;br /&gt;
    dyaw    = waypoints[wp].yaw;&lt;br /&gt;
    dpitch  = waypoints[wp].pitch;&lt;br /&gt;
    droll   = waypoints[wp].roll;&lt;br /&gt;
  }&lt;br /&gt;
  mv-&amp;gt;cur_x       = dx;&lt;br /&gt;
  mv-&amp;gt;cur_y       = dy;&lt;br /&gt;
  mv-&amp;gt;cur_z       = dz;&lt;br /&gt;
  mv-&amp;gt;cur_yaw     = dyaw;&lt;br /&gt;
  mv-&amp;gt;cur_pitch   = dpitch;&lt;br /&gt;
  mv-&amp;gt;cur_roll    = droll;&lt;br /&gt;
&lt;br /&gt;
  aw_mover_set_position (mv-&amp;gt;id,&lt;br /&gt;
    mv-&amp;gt;init_x + dx, mv-&amp;gt;init_y + dy, mv-&amp;gt;init_z + dz,&lt;br /&gt;
    mv-&amp;gt;init_yaw + dyaw, mv-&amp;gt;init_pitch + dpitch, mv-&amp;gt;init_roll + droll);&lt;br /&gt;
&lt;br /&gt;
  mv-&amp;gt;last_move = aw_tick ();&lt;br /&gt;
&lt;br /&gt;
  log_msg (&amp;quot;Mover MOV: %u delta: %d %d %d %d %d %d&amp;quot;, mv-&amp;gt;id,&lt;br /&gt;
    dx, dy, dz, dyaw, dpitch, droll);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void idle (struct mover* mv)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  if (mv-&amp;gt;last_move + IDLE_INTERVAL &amp;lt; aw_tick ())&lt;br /&gt;
    move_to (mv);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int update ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  struct mover*   mv;&lt;br /&gt;
  struct rider*   rd;&lt;br /&gt;
  int             count;&lt;br /&gt;
  unsigned int    frame_time;&lt;br /&gt;
&lt;br /&gt;
  for (count = 0, mv = movers; mv; mv = mv-&amp;gt;next) {&lt;br /&gt;
              &lt;br /&gt;
    if (!mv-&amp;gt;start&lt;br /&gt;
    || mv-&amp;gt;last_update + UPDATE_INTERVAL &amp;gt; aw_tick ())&lt;br /&gt;
      continue;&lt;br /&gt;
&lt;br /&gt;
    frame_time = aw_tick () - mv-&amp;gt;start;&lt;br /&gt;
//    log_msg (&amp;quot;UPDATE   : %u state %d dt %d&amp;quot;, mv-&amp;gt;id, mv-&amp;gt;state, frame_time);&lt;br /&gt;
&lt;br /&gt;
    if (mv-&amp;gt;state != AW_MOVER_STATE_PAUSE&lt;br /&gt;
    &amp;amp;&amp;amp; mv-&amp;gt;state != AW_MOVER_STATE_MOVE) {&lt;br /&gt;
      if (mv-&amp;gt;state != AW_MOVER_STATE_IDLE)&lt;br /&gt;
        continue;&lt;br /&gt;
      // Set state to Pause, so other users can join in&lt;br /&gt;
      pause (mv-&amp;gt;id);&lt;br /&gt;
      mv-&amp;gt;state = STATE_INVALIDATE; // invalidate state&lt;br /&gt;
      // Move to first waypoint&lt;br /&gt;
      mv-&amp;gt;last_waypoint = 0.0f;&lt;br /&gt;
      move_to (mv);&lt;br /&gt;
      // Add bot as driver to first mover&lt;br /&gt;
      if (mv == movers)&lt;br /&gt;
        aw_mover_rider_add (mv-&amp;gt;id, aw_session (), 450, 1800, -30, 1800, 0);&lt;br /&gt;
      mv-&amp;gt;start = aw_tick ();&lt;br /&gt;
      announce (READY_MSG);&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
    idle (mv); // see if we have to send pos to prevent timeout&lt;br /&gt;
    if (frame_time &amp;lt; 15000) {&lt;br /&gt;
      // wait to get ready or something else?&lt;br /&gt;
      continue;&lt;br /&gt;
    } else if (mv-&amp;gt;last_waypoint &amp;gt;= 0.0f) {&lt;br /&gt;
      if (mv-&amp;gt;state != AW_MOVER_STATE_MOVE&lt;br /&gt;
      &amp;amp;&amp;amp; mv-&amp;gt;state != STATE_INVALIDATE) {&lt;br /&gt;
        if (mv-&amp;gt;rider_count &amp;lt;= 0) {&lt;br /&gt;
          mv-&amp;gt;start = aw_tick ();&lt;br /&gt;
          announce (POSTPONE_MSG);&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        start (mv-&amp;gt;id);&lt;br /&gt;
        mv-&amp;gt;state = STATE_INVALIDATE; // invalidate state&lt;br /&gt;
        announce (START_MSG);&lt;br /&gt;
      } else if (mv-&amp;gt;state == AW_MOVER_STATE_MOVE) {&lt;br /&gt;
        mv-&amp;gt;last_waypoint += 1.0f / (float)(aw_int (AW_WORLD_AVATAR_REFRESH_RATE) * WAYPOINT_RESOLUTION);&lt;br /&gt;
        if (mv-&amp;gt;last_waypoint &amp;gt;= MAX_WAYPOINTS)&lt;br /&gt;
          mv-&amp;gt;last_waypoint = 0.0f;&lt;br /&gt;
        move_to (mv);&lt;br /&gt;
        count++;&lt;br /&gt;
        if (mv-&amp;gt;last_waypoint == 0.0f)&lt;br /&gt;
          mv-&amp;gt;last_waypoint = -1.0f;&lt;br /&gt;
      }&lt;br /&gt;
    } else if (mv-&amp;gt;last_waypoint &amp;lt; 0.0f &amp;amp;&amp;amp; mv-&amp;gt;state == AW_MOVER_STATE_MOVE) {&lt;br /&gt;
      // Don&amp;#039;t pause before mover has reached the last waypoint,&lt;br /&gt;
      if (mv-&amp;gt;last_update + (2000 / aw_int (AW_WORLD_AVATAR_REFRESH_RATE)) &amp;lt; aw_tick ()) {&lt;br /&gt;
        pause (mv-&amp;gt;id);&lt;br /&gt;
        mv-&amp;gt;state = STATE_INVALIDATE; // invalidate state&lt;br /&gt;
        announce (STOP_MSG);&lt;br /&gt;
      } else&lt;br /&gt;
        continue;&lt;br /&gt;
    } else if (mv-&amp;gt;last_waypoint &amp;lt; 0.0f &amp;amp;&amp;amp; mv-&amp;gt;state == AW_MOVER_STATE_PAUSE) {&lt;br /&gt;
      for (rd = mv-&amp;gt;riders; rd; rd = rd-&amp;gt;next)&lt;br /&gt;
        if (rd-&amp;gt;session != aw_session ())&lt;br /&gt;
          aw_mover_rider_delete (mv-&amp;gt;id, rd-&amp;gt;session);&lt;br /&gt;
      mv-&amp;gt;start = aw_tick ();&lt;br /&gt;
      mv-&amp;gt;last_waypoint = 0.0f;&lt;br /&gt;
      announce (READY_MSG);&lt;br /&gt;
      count++;&lt;br /&gt;
    }&lt;br /&gt;
    mv-&amp;gt;last_update = aw_tick ();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return count;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  int   rc;&lt;br /&gt;
  int   owner;&lt;br /&gt;
	char* pw;&lt;br /&gt;
  char* world;&lt;br /&gt;
&lt;br /&gt;
  // check command line&lt;br /&gt;
  if (argc &amp;lt; 4) {&lt;br /&gt;
    log_msg (&amp;quot;Usage: %s citnumber password world&amp;quot;, argv[0]);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // initialize Active Worlds API&lt;br /&gt;
  if (rc = aw_init (AW_BUILD)) {&lt;br /&gt;
    log_msg (&amp;quot;Unable to initialize API (reason %d)&amp;quot;, rc);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // install handler for callbacks and events&lt;br /&gt;
  aw_callback_set (AW_CALLBACK_ENTER, handle_enter);&lt;br /&gt;
  aw_event_set (AW_EVENT_WORLD_DISCONNECT, handle_world_disconnect);&lt;br /&gt;
&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_ADD, handle_entity_add);&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_CHANGE, handle_entity_change);&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_DELETE, handle_entity_delete);&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_RIDER_ADD, handle_entity_rider_add);&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_RIDER_DELETE, handle_entity_rider_delete);&lt;br /&gt;
  aw_event_set (AW_EVENT_ENTITY_RIDER_CHANGE, handle_entity_rider_change);&lt;br /&gt;
&lt;br /&gt;
  // create bot instance&lt;br /&gt;
  if (rc = aw_create (&amp;quot;&amp;quot;, 0, 0)) {&lt;br /&gt;
    log_msg (&amp;quot;Unable to create bot instance (reason %d)&amp;quot;, rc);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  owner = atoi (argv[1]);&lt;br /&gt;
  pw    = argv[2];&lt;br /&gt;
  world = argv[3];&lt;br /&gt;
&lt;br /&gt;
  // log bot into the universe&lt;br /&gt;
  aw_int_set (AW_LOGIN_OWNER, owner);&lt;br /&gt;
  aw_string_set (AW_LOGIN_PRIVILEGE_PASSWORD, pw);&lt;br /&gt;
  aw_string_set (AW_LOGIN_APPLICATION, &amp;quot;MoverControlSample&amp;quot;);&lt;br /&gt;
  aw_string_set (AW_LOGIN_NAME, &amp;quot;MoverControl&amp;quot;);&lt;br /&gt;
  if (rc = aw_login ()) {&lt;br /&gt;
    log_msg (&amp;quot;Unable to login (reason %d)&amp;quot;, rc);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  log_msg (&amp;quot;Successfully logged into Universe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  strcpy (mv_model, &amp;quot;trolly.rwx&amp;quot;);&lt;br /&gt;
  mv_owner = 101;&lt;br /&gt;
&lt;br /&gt;
  // log bot into the world&lt;br /&gt;
  if (rc = aw_enter (world)) {&lt;br /&gt;
    log_msg (&amp;quot;Unable to enter world (reason %d)&amp;quot;, rc);&lt;br /&gt;
    exit (1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  log_msg (&amp;quot;Successfully entered World %s&amp;quot;, world);&lt;br /&gt;
&lt;br /&gt;
  // main event loop&lt;br /&gt;
  while (!aw_wait (WAIT_TIME))&lt;br /&gt;
    update ();&lt;br /&gt;
&lt;br /&gt;
  // close everything&lt;br /&gt;
  aw_destroy ();&lt;br /&gt;
  aw_term ();&lt;br /&gt;
  return 0;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------------------------------------------&lt;br /&gt;
                                  E O F&lt;br /&gt;
-----------------------------------------------------------------------------*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: SDK]]&lt;/div&gt;</summary>
		<author><name>Xan</name></author>
	</entry>
</feed>