Aw query

From ActiveWiki
Jump to: navigation, search

Minimum requirements
Added in version 2.1
SDKbuild 13

int aw_query (int x_sector, int z_sector, int sequence[3][3])


Queries for property in a three by three sector area.




For a complete description of how to use aw_query, see Property.

Sequence is a 3x3 array of sector sequence numbers. These sequence numbers come from previous calls to aw_query and indicate the last time your application queried property in this zone. A zero sequence number indicates that you have no previous property for that sector. To get a complete property update for the entire zone, set all nine sequence numbers to zero.

A single call to aw_query may not be sufficient to update the entire area. After the call completes (or within the context of the AW_CALLBACK_QUERY callback) the value of the boolean attribute AW_QUERY_COMPLETE indicates whether aw_query should be called again to get more property. It may be necessary to call aw_query many times in order to get the contents of the entire three by three sector area.

Once AW_QUERY_COMPLETE is 1 (true), live update mode is enabled. This means your application may start receiving AW_EVENT_OBJECT_ADD and AW_EVENT_OBJECT_DELETE events if the surrounding property is being modified by other users.

For version 3.2 or later: Consider using aw_query_5x5 to query larger areas of property.



Argument attributes


Return values

RC_SUCCESS (1) (2)
The connection to the world is down.

(1) Possible return values when a callback is installed.

(2) Returned by the world server.

Returned attributes



Count the number of objects in the 3x3 sector area around 500N 500W.

int sequence[3][3]; /* sequence[z][x] */
int object_count;
int query_x;
int query_z;

void handle_cell_begin (void)
  int cell_x = aw_int (AW_CELL_X);
  int cell_z = aw_int (AW_CELL_Z);
  int sector_x = aw_sector_from_cell (cell_x) - query_x;
  int sector_z = aw_sector_from_cell (cell_z) - query_z;
  if (sector_x < -1 || sector_x > 1 || sector_z < -1 || sector_z > 1)
  sequence[sector_z + 1][sector_x + 1] = aw_int (AW_CELL_SEQUENCE);

void handle_cell_object (void)
  object_count += 1;

int main (int argc, char *argv[])
  int rc;
  /* ... */
  aw_event_set (AW_EVENT_CELL_BEGIN, handle_cell_begin);
  aw_event_set (AW_EVENT_CELL_OBJECT, handle_cell_object);
  memset (sequence, 0, sizeof (sequence));
  query_x = aw_sector_from_cell (500); /* 500W */
  query_z = aw_sector_from_cell (500); /* 500N */
  for (;;)
    rc = aw_query (query_x, query_z, sequence);
    if (rc != RC_SUCCESS)
      printf ("Query failed (reason %d)\n", rc);
      return 1;
    if (aw_bool (AW_QUERY_COMPLETE))
  printf ("%d objects at sector (%d, %d)\n", object_count, query_x, query_z);
  /* ... */
  return 0;

This trick allows an application to immediately receive AW_EVENT_OBJECT_ADD and AW_EVENT_OBJECT_DELETE events for an area.

 int sequence[3][3];
 memset (sequence, -1, sizeof (sequence));
 aw_query (query_x, query_z, sequence);

See also