<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.virtualparadise.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sleepy+E</id>
	<title>Virtual Paradise Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.virtualparadise.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sleepy+E"/>
	<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/Special:Contributions/Sleepy_E"/>
	<updated>2026-06-06T01:00:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=List_of_action_commands&amp;diff=5125</id>
		<title>List of action commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=List_of_action_commands&amp;diff=5125"/>
		<updated>2023-03-12T11:46:28Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added in some new commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Scripting.png|frame|150px]]&lt;br /&gt;
&lt;br /&gt;
== A-Z ==&lt;br /&gt;
* [[animate]]&lt;br /&gt;
* [[animation]]&lt;br /&gt;
* [[ambient]]&lt;br /&gt;
* [[astart]]&lt;br /&gt;
* [[astop]]&lt;br /&gt;
* [[camera]]&lt;br /&gt;
* [[color]]&lt;br /&gt;
* [[diffuse]]&lt;br /&gt;
* [[frame]]&lt;br /&gt;
* [[framerate]]&lt;br /&gt;
* [[group]]&lt;br /&gt;
* [[light]]&lt;br /&gt;
* [[lock]]&lt;br /&gt;
* [[makeconvex]]&lt;br /&gt;
* [[move]]&lt;br /&gt;
* [[name]]&lt;br /&gt;
* [[noise]]&lt;br /&gt;
* [[normalmap]]&lt;br /&gt;
* [[opacity]]&lt;br /&gt;
* [[path]]&lt;br /&gt;
* [[picture]]&lt;br /&gt;
* [[rotate]]&lt;br /&gt;
* [[say]]&lt;br /&gt;
* [[seq]]&lt;br /&gt;
* [[shear]]&lt;br /&gt;
* [[scale]]&lt;br /&gt;
* [[sign]]&lt;br /&gt;
* [[solid]]&lt;br /&gt;
* [[sound]]&lt;br /&gt;
* [[specular]]&lt;br /&gt;
* [[specularmap]]&lt;br /&gt;
* [[tag]]&lt;br /&gt;
* [[teleport]]&lt;br /&gt;
* [[teleportx]]&lt;br /&gt;
* [[teleportxyz]]&lt;br /&gt;
* [[texture]]&lt;br /&gt;
* [[url]]&lt;br /&gt;
* [[visible]]&lt;br /&gt;
* [[web]]&lt;br /&gt;
* [[Playsound]]&lt;br /&gt;
&lt;br /&gt;
== Categories by functions (INCOMPLETE) ==&lt;br /&gt;
=== Visual modifications - Textures and texture mapping ===&lt;br /&gt;
* [[texture]]&lt;br /&gt;
* [[picture]]&lt;br /&gt;
* [[normalmap]]&lt;br /&gt;
* [[specularmap]]&lt;br /&gt;
&lt;br /&gt;
=== Visual modifications - Lighting and surface lighting ===&lt;br /&gt;
* [[light]]&lt;br /&gt;
* [[ambient]]&lt;br /&gt;
* [[diffuse]]&lt;br /&gt;
* [[specular]]&lt;br /&gt;
&lt;br /&gt;
=== Visual modifications - Shape/size modifications ===&lt;br /&gt;
* [[shear]]&lt;br /&gt;
* [[scale]]&lt;br /&gt;
&lt;br /&gt;
=== Visual modifications - Assorted ===&lt;br /&gt;
* [[animate]]&lt;br /&gt;
* [[animation]]&lt;br /&gt;
* [[color]]&lt;br /&gt;
* [[opacity]]&lt;br /&gt;
* [[sign]]&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[noise]]&lt;br /&gt;
* [[sound]]&lt;br /&gt;
&lt;br /&gt;
=== Movement ===&lt;br /&gt;
* [[move]]&lt;br /&gt;
* [[rotate]]&lt;br /&gt;
* [[path]]&lt;br /&gt;
&lt;br /&gt;
=== Transportation ===&lt;br /&gt;
* [[teleport]]&lt;br /&gt;
* [[teleportx]]&lt;br /&gt;
* [[teleportxyz]]&lt;br /&gt;
&lt;br /&gt;
=== Utility ===&lt;br /&gt;
* [[astart]]&lt;br /&gt;
* [[astop]]&lt;br /&gt;
* [[group]]&lt;br /&gt;
* [[name]]&lt;br /&gt;
* [[tag]]&lt;br /&gt;
* [[web]]&lt;br /&gt;
&lt;br /&gt;
=== Assorted ===&lt;br /&gt;
* [[camera]]&lt;br /&gt;
* [[frame]]&lt;br /&gt;
* [[framerate]]&lt;br /&gt;
* [[say]]&lt;br /&gt;
* [[solid]]&lt;br /&gt;
* [[url]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Script commands| ]]&lt;br /&gt;
[[Category: Building]]&lt;br /&gt;
[[Category: Lists]]&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_wait&amp;diff=4963</id>
		<title>Vp wait</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_wait&amp;diff=4963"/>
		<updated>2018-08-20T21:58:09Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|wait|Pumps incoming and outgoing network traffic and fires any registered callbacks and events.&lt;br /&gt;
|paramex=1000&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|milliseconds|Maximum amount of time to pump (in milliseconds)}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_supported    |vp_wait is not supported by this instance, for example a custom vp_net_config was passed to {{sdk method|create}}}}&lt;br /&gt;
  {{sdk return code row|recursive_wait   |vp_wait was called recursively on the same instance (calling it from within an event/callback handler)}}&lt;br /&gt;
  {{sdk return code row|connection_error |Waiting for data failed or there are no connections to wait for events on}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* This method will attempt to send all pending messages and receive all pending data within the given time limit&lt;br /&gt;
** It will wait for the full number of milliseconds if no network messages are received (or are already waiting to be processed)&lt;br /&gt;
** If one or more messages are received while waiting (or were received since the last call to vp_wait), then it will return after processing them and firing any registered event/callback handler functions.&lt;br /&gt;
** If a value of {{code|0}} milliseconds is passed, it will process any messages that have been received since the last call to vp_wait (i.e. &amp;quot;polling&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* All [[:Category:SDK events|SDK events]] and [[:Category:SDK callbacks|SDK callbacks]] are fired from this method call. Consequently, they are fired on the same thread as the caller&lt;br /&gt;
|caveats=&lt;br /&gt;
This method should never be called inside an event handler originating from a previous {{sdk method|wait}} call. Note: The current SDK will simply return {{code|VP_RC_RECURSIVE_WAIT}}. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
vp_event_set(instance, VP_EVENT_AVATAR_ADD, event_avatar_add);&lt;br /&gt;
while(vp_wait(instance, 1000) == 0){}&lt;br /&gt;
...&lt;br /&gt;
void event_avatar_add(VPInstance instance)&lt;br /&gt;
{&lt;br /&gt;
    char message[300];&lt;br /&gt;
    sprintf((char*)&amp;amp;message, &amp;quot;Hello, %s!&amp;quot;, vp_string(sdk, VP_AVATAR_NAME));&lt;br /&gt;
    vp_say(instance, (char*)&amp;amp;message);&lt;br /&gt;
    vp_wait(instance, 1000); // Undefined behavior&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The millisecond parameter should not be used for any sort of timekeeping,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while (vp_wait(instance, 5000)) {&lt;br /&gt;
  vp_say(instance, &amp;quot;5 seconds have passed!&amp;quot;); // this is not guaranteed to occur every 5 seconds (if any message is received while waiting)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|event_set}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_wait&amp;diff=4962</id>
		<title>Vp wait</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_wait&amp;diff=4962"/>
		<updated>2018-08-20T21:40:05Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|wait|Pumps incoming and outgoing network traffic and fires any registered callbacks and events.&lt;br /&gt;
|paramex=1000&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|milliseconds|Maximum amount of time to pump (in milliseconds)}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_supported    |vp_wait is not supported by this instance, for example a custom vp_net_config was passed to {{sdk method|create}}}}&lt;br /&gt;
  {{sdk return code row|recursive_wait   |vp_wait was called recursively on the same instance (calling it from within an event/callback handler)}}&lt;br /&gt;
  {{sdk return code row|connection_error |Waiting for data failed or there are no connections to wait for events on}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* This will attempt to send all pending messages and receive all pending data within the given time limit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* It will wait for the full number of milliseconds if no network messages are received for the whole duration.&lt;br /&gt;
* If one or more messages are received while waiting, then it will return after processing them (and firing any registered event/callback handler functions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If a value of {{code|0}} is passed, it could still fire a number of different events&lt;br /&gt;
&lt;br /&gt;
* All [[:Category:SDK events|SDK events]] and [[:Category:SDK callbacks|SDK callbacks]] are fired from this method call. Consequently, they are fired on the same thread as the caller&lt;br /&gt;
* If there is nothing to handle, it will wait until the time limit (or until one or more events or callbacks callback is fired). Else, it will return immediately after handling all pending data.&lt;br /&gt;
|caveats=&lt;br /&gt;
This method should never be called inside an event handler originating from a previous {{sdk method|wait}} call. The current SDK will return {{code|VP_RC_RECURSIVE_WAIT}}. For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
vp_event_set(instance, VP_EVENT_AVATAR_ADD, event_avatar_add);&lt;br /&gt;
while(vp_wait(instance, 1000) == 0){}&lt;br /&gt;
...&lt;br /&gt;
void event_avatar_add(VPInstance sdk)&lt;br /&gt;
{&lt;br /&gt;
    char message[300];&lt;br /&gt;
    sprintf((char*)&amp;amp;message, &amp;quot;Hello, %s!&amp;quot;, vp_string(sdk, VP_AVATAR_NAME));&lt;br /&gt;
    vp_say(sdk, (char*)&amp;amp;message);&lt;br /&gt;
    vp_wait(instance, 1000); // Undefined behavior&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|event_set}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=List_of_SDK_attributes&amp;diff=4961</id>
		<title>List of SDK attributes</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=List_of_SDK_attributes&amp;diff=4961"/>
		<updated>2018-08-20T20:59:48Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added &amp;quot;APPLICATION&amp;quot; attributes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A list of [[attribute]]s available in the C [[SDK]]. For the category, see [[:Category:SDK attributes]].&lt;br /&gt;
&lt;br /&gt;
* {{sdk attribute|int|AVATAR_SESSION}}&lt;br /&gt;
* {{sdk attribute|int|AVATAR_TYPE}}&lt;br /&gt;
* {{sdk attribute|int|MY_TYPE}}&lt;br /&gt;
* {{sdk attribute|int|OBJECT_ID}}&lt;br /&gt;
* {{sdk attribute|int|OBJECT_TYPE}}&lt;br /&gt;
* {{sdk attribute|int|OBJECT_TIME}}&lt;br /&gt;
* {{sdk attribute|int|OBJECT_USER_ID}}&lt;br /&gt;
* {{sdk attribute|int|WORLD_STATE}}&lt;br /&gt;
* {{sdk attribute|int|WORLD_USERS}}&lt;br /&gt;
* {{sdk attribute|int|REFERENCE_NUMBER}}&lt;br /&gt;
* {{sdk attribute|int|CALLBACK}}&lt;br /&gt;
* {{sdk attribute|int|USER_ID}}&lt;br /&gt;
* {{sdk attribute|int|USER_REGISTRATION_TIME}}&lt;br /&gt;
* {{sdk attribute|int|USER_ONLINE_TIME}}&lt;br /&gt;
* {{sdk attribute|int|USER_LAST_LOGIN}}&lt;br /&gt;
* {{sdk attribute|int|FRIEND_ID}}&lt;br /&gt;
* {{sdk attribute|int|FRIEND_USER_ID}}&lt;br /&gt;
* {{sdk attribute|int|FRIEND_ONLINE}}&lt;br /&gt;
* {{sdk attribute|int|MY_USER_ID}}&lt;br /&gt;
* {{sdk attribute|int|PROXY_TYPE}}&lt;br /&gt;
* {{sdk attribute|int|PROXY_PORT}}&lt;br /&gt;
* {{sdk attribute|int|CELL_X}}&lt;br /&gt;
* {{sdk attribute|int|CELL_Z}}&lt;br /&gt;
* {{sdk attribute|int|TERRAIN_TILE_X}}&lt;br /&gt;
* {{sdk attribute|int|TERRAIN_TILE_Z}}&lt;br /&gt;
* {{sdk attribute|int|TERRAIN_NODE_X}}&lt;br /&gt;
* {{sdk attribute|int|TERRAIN_NODE_Z}}&lt;br /&gt;
* {{sdk attribute|int|TERRAIN_NODE_REVISION}}&lt;br /&gt;
* {{sdk attribute|int|CLICKED_SESSION}}&lt;br /&gt;
* {{sdk attribute|int|CHAT_TYPE}}&lt;br /&gt;
* {{sdk attribute|int|CHAT_COLOR_RED}}&lt;br /&gt;
* {{sdk attribute|int|CHAT_COLOR_GREEN}}&lt;br /&gt;
* {{sdk attribute|int|CHAT_COLOR_BLUE}}&lt;br /&gt;
* {{sdk attribute|int|CHAT_EFFECTS}}&lt;br /&gt;
* {{sdk attribute|int|DISCONNECT_ERROR_CODE}}&lt;br /&gt;
* {{sdk attribute|int|URL_TARGET}}&lt;br /&gt;
* {{sdk attribute|int|CURRENT_EVENT}}&lt;br /&gt;
* {{sdk attribute|int|CURRENT_CALLBACK}}&lt;br /&gt;
* {{sdk attribute|int|CELL_REVISION}}&lt;br /&gt;
* {{sdk attribute|int|CELL_STATUS}}&lt;br /&gt;
* {{sdk attribute|int|JOIN_ID}}&lt;br /&gt;
* {{sdk attribute|int|INVITE_ID}}&lt;br /&gt;
* {{sdk attribute|int|INVITE_USER_ID}}&lt;br /&gt;
* {{sdk attribute|float|AVATAR_X}}&lt;br /&gt;
* {{sdk attribute|float|AVATAR_Y}}&lt;br /&gt;
* {{sdk attribute|float|AVATAR_Z}}&lt;br /&gt;
* {{sdk attribute|float|AVATAR_YAW}}&lt;br /&gt;
* {{sdk attribute|float|AVATAR_PITCH}}&lt;br /&gt;
* {{sdk attribute|float|MY_X}}&lt;br /&gt;
* {{sdk attribute|float|MY_Y}}&lt;br /&gt;
* {{sdk attribute|float|MY_Z}}&lt;br /&gt;
* {{sdk attribute|float|MY_YAW}}&lt;br /&gt;
* {{sdk attribute|float|MY_PITCH}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_X}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_Y}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_Z}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_ROTATION_X}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_ROTATION_Y}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_ROTATION_Z}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_YAW}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_PITCH}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_ROLL}}&lt;br /&gt;
* {{sdk attribute|float|OBJECT_ROTATION_ANGLE}}&lt;br /&gt;
* {{sdk attribute|float|TELEPORT_X}}&lt;br /&gt;
* {{sdk attribute|float|TELEPORT_Y}}&lt;br /&gt;
* {{sdk attribute|float|TELEPORT_Z}}&lt;br /&gt;
* {{sdk attribute|float|TELEPORT_YAW}}&lt;br /&gt;
* {{sdk attribute|float|TELEPORT_PITCH}}&lt;br /&gt;
* {{sdk attribute|float|CLICK_HIT_X}}&lt;br /&gt;
* {{sdk attribute|float|CLICK_HIT_Y}}&lt;br /&gt;
* {{sdk attribute|float|CLICK_HIT_Z}}&lt;br /&gt;
* {{sdk attribute|float|JOIN_X}}&lt;br /&gt;
* {{sdk attribute|float|JOIN_Y}}&lt;br /&gt;
* {{sdk attribute|float|JOIN_Z}}&lt;br /&gt;
* {{sdk attribute|float|JOIN_YAW}}&lt;br /&gt;
* {{sdk attribute|float|JOIN_PITCH}}&lt;br /&gt;
* {{sdk attribute|float|INVITE_X}}&lt;br /&gt;
* {{sdk attribute|float|INVITE_Y}}&lt;br /&gt;
* {{sdk attribute|float|INVITE_Z}}&lt;br /&gt;
* {{sdk attribute|float|INVITE_YAW}}&lt;br /&gt;
* {{sdk attribute|float|INVITE_PITCH}}&lt;br /&gt;
* {{sdk attribute|string|AVATAR_NAME}}&lt;br /&gt;
* {{sdk attribute|string|CHAT_MESSAGE}}&lt;br /&gt;
* {{sdk attribute|string|OBJECT_MODEL}}&lt;br /&gt;
* {{sdk attribute|string|OBJECT_ACTION}}&lt;br /&gt;
* {{sdk attribute|string|OBJECT_DESCRIPTION}}&lt;br /&gt;
* {{sdk attribute|string|WORLD_NAME}}&lt;br /&gt;
* {{sdk attribute|string|USER_NAME}}&lt;br /&gt;
* {{sdk attribute|string|USER_EMAIL}}&lt;br /&gt;
* {{sdk attribute|string|WORLD_SETTING_KEY}}&lt;br /&gt;
* {{sdk attribute|string|WORLD_SETTING_VALUE}}&lt;br /&gt;
* {{sdk attribute|string|FRIEND_NAME}}&lt;br /&gt;
* {{sdk attribute|string|PROXY_HOST}}&lt;br /&gt;
* {{sdk attribute|string|TELEPORT_WORLD}}&lt;br /&gt;
* {{sdk attribute|string|URL}}&lt;br /&gt;
* {{sdk attribute|string|JOIN_WORLD}}&lt;br /&gt;
* {{sdk attribute|string|JOIN_NAME}}&lt;br /&gt;
* {{sdk attribute|string|START_WORLD}}&lt;br /&gt;
* {{sdk attribute|string|INVITE_NAME}}&lt;br /&gt;
* {{sdk attribute|string|INVITE_WORLD}}&lt;br /&gt;
* {{sdk attribute|string|APPLICATION_NAME}}&lt;br /&gt;
* {{sdk attribute|string|APPLICATION_VERSION}}&lt;br /&gt;
* {{sdk attribute|data|OBJECT_DATA}}&lt;br /&gt;
* {{sdk attribute|data|TERRAIN_NODE_DATA}}&lt;br /&gt;
    &lt;br /&gt;
[[Category: SDK]]&lt;br /&gt;
[[Category: Lists]]&lt;br /&gt;
[[Category: SDK attributes|*]]&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Build&amp;diff=4959</id>
		<title>Template:Build</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Build&amp;diff=4959"/>
		<updated>2018-08-04T15:01:09Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table class=&amp;quot;toccolours&amp;quot; style=&amp;quot; clear: both; width: 100%; margin: 1em auto; text-align: left; padding: 0em 0em 0em 0em&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td colspan=2 style=&amp;quot;padding: 0.2em 0.2em 0.5em; background: #A8C0FF; color:black&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;center&amp;gt;&#039;&#039;&#039;[[Object Scripting]]&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; style=&amp;quot;font-size: 95%; width:5%; padding-left:0.6em;&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;p style=&amp;quot;margin: 0px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Triggers:&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
			&amp;lt;p style=&amp;quot;margin: 0px;&amp;quot;&amp;gt;[[Activate]] • [[Adone]] • [[Bump]] • [[Bumpend]] • [[Create]]&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
	&amp;lt;tr&amp;gt;&lt;br /&gt;
		&amp;lt;td align=&amp;quot;left&amp;quot; style=&amp;quot;font-size: 95%; width:5%; padding-left:0.6em;&amp;quot; valign=top&amp;gt;&lt;br /&gt;
			&amp;lt;p style=&amp;quot;margin: 0px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Commands:&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
		&amp;lt;td&amp;gt;&lt;br /&gt;
			&amp;lt;p style=&amp;quot;margin: 0px;&amp;quot;&amp;gt;[[Animate]] • [[Animation]] • [[Ambient]] • [[Camera]] • [[Color]] • [[Diffuse]] • [[Frame]] • [[Framerate]] • [[Group]] • [[Light]] • [[Move]] • [[Name]] • [[Noise]] • [[Normalmap]] • [[Opacity]] • [[Path]] • [[Picture]] • [[Rotate]] • [[Say]] • [[Shear]] • [[Scale]] • [[Sign]] • [[Solid]] • [[Sound]] • [[Specular]] • [[Specularmap]] • [[Teleport]] • [[Teleportx]] • [[Teleportxyz]] • [[Texture]] • [[Url]] • [[Visible]] • [[Web]]&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category: Templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_parameter_table&amp;diff=4958</id>
		<title>Template:Sdk parameter table</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_parameter_table&amp;diff=4958"/>
		<updated>2018-08-01T22:08:54Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Align headers to the left&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
! style=&amp;quot;min-width: 200px&amp;quot; align=&amp;quot;left&amp;quot; | Parameter&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Usage&lt;br /&gt;
{{{1|}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_attribute_table&amp;diff=4957</id>
		<title>Template:Sdk attribute table</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_attribute_table&amp;diff=4957"/>
		<updated>2018-08-01T22:08:02Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Align headers to the left&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
! style=&amp;quot;min-width: 250px&amp;quot; align=&amp;quot;left&amp;quot; | Attribute&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Usage&lt;br /&gt;
{{{1|}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_attribute_table&amp;diff=4956</id>
		<title>Template:Sdk return attribute table</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_attribute_table&amp;diff=4956"/>
		<updated>2018-08-01T22:07:21Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Align headers to the left&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
! style=&amp;quot;min-width: 250px&amp;quot; align=&amp;quot;left&amp;quot; | Attribute&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Usage&lt;br /&gt;
! Also returned for&lt;br /&gt;
{{{1|}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_table&amp;diff=4955</id>
		<title>Template:Sdk return code table</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_table&amp;diff=4955"/>
		<updated>2018-08-01T22:06:38Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Align headers to the left&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|&lt;br /&gt;
! style=&amp;quot;min-width: 200px&amp;quot; align=&amp;quot;left&amp;quot; | Return code&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Cause&lt;br /&gt;
{{sdk return code row}}&lt;br /&gt;
{{{1|}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_row&amp;diff=4954</id>
		<title>Template:Sdk return code row</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_row&amp;diff=4954"/>
		<updated>2018-08-01T22:03:18Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;|-&lt;br /&gt;
| {{code|VP_RC_{{uc:{{{1|SUCCESS}}}}}}} || {{{2|Successful call (for methods that have a registered callback, it only means the request has been sent)}}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_row&amp;diff=4953</id>
		<title>Template:Sdk return code row</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_return_code_row&amp;diff=4953"/>
		<updated>2018-08-01T22:02:06Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;|-&lt;br /&gt;
| {{code|VP_RC_{{uc:{{{1|SUCCESS}}}}}}} || {{{2|Successful call (for methods that have a registered callback, it only means the request has been sent}}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4952</id>
		<title>Template:Sdk method page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4952"/>
		<updated>2018-08-01T22:00:28Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Method call snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_{{lc:{{{1|unknown}}}}}({{{customparamex|instance{{#if:{{{paramex|}}}|, {{{paramex}}}|}}}}});&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Parameters ==__NOEDITSECTION__&lt;br /&gt;
These are the parameters that this method requires:&lt;br /&gt;
{{sdk parameter table|{{#if:{{{noinstanceparam}}}|{{sdk parameter row|VPInstance|instance|Pointer to the instance this method call is intended for}}|}}&lt;br /&gt;
{{{parameters|}}}}}&lt;br /&gt;
{{#if: {{{attributes|}}} |== Used attributes ==__NOEDITSECTION__&lt;br /&gt;
This method uses data set in these attributes when called:&lt;br /&gt;
{{sdk attribute table|{{{attributes}}}}} |}}&lt;br /&gt;
== Returns ==__NOEDITSECTION__&lt;br /&gt;
{{{returns|This method returns a [[return code]] integer, which indicates whether the call was successful or errored for any reason:&lt;br /&gt;
{{sdk return code table|{{{returncodes|}}}}}&lt;br /&gt;
{{#if: {{{returnattributes|}}} |The following attributes will be returned in {{Sdk callback|{{{1}}}}} if the operation was successful:&lt;br /&gt;
{{sdk return attribute table|{{{returnattributes}}}}} |}} }}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this method&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This method has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:vp_{{lc:{{{1}}}}}}} {{{category|[[Category:SDK methods]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk event page|Event name|Event description&lt;br /&gt;
|returntype=&lt;br /&gt;
|paramex=&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|type|name|description}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_login&amp;diff=4951</id>
		<title>Vp login</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_login&amp;diff=4951"/>
		<updated>2018-08-01T21:55:00Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|login| Login to the universe server; using the credentials of an existing user account.&lt;br /&gt;
|paramex=username, password, botname&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|string|username|Use credentials of the account with this name}}&lt;br /&gt;
  {{sdk parameter row|string|password|Password associated with the account}}&lt;br /&gt;
  {{sdk parameter row|string|botname |Name that the bot will appear with in a world. There are no restrictions on what characters can be used.}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|STRING_TOO_LONG |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|INVALID_LOGIN   |The login credentials are incorrect}}&lt;br /&gt;
  {{sdk return code row|TIMEOUT         |Timeout}}&lt;br /&gt;
  {{sdk return code row|NOT_IN_UNIVERSE |Universe request made while not connected to a universe server}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|behavior=&lt;br /&gt;
*If a {{sdk callback|login}} callback is set this function will return immediately and return the result using the callback, otherwise it will call {{sdk method|wait}} in a loop until done.&lt;br /&gt;
* When successfully logged in, bots will have square brackets around their name. For example, providing &amp;quot;Samantha&amp;quot; as the {{code|botname}} parameter will identify the bot as &amp;quot;[Samantha]&amp;quot;.&lt;br /&gt;
* The user ID of the account used to log in will be exposed to other users.&lt;br /&gt;
* Bot names that contain [https://wikipedia.org/wiki/UTF-8 UTF-8] encoded characters (e.g. &amp;quot;\xE2\x98\xAF&amp;quot; is the &amp;quot;Yin and Yang&amp;quot; symbol ☯) will display correctly in a browser. &lt;br /&gt;
|caveats=&lt;br /&gt;
* To log out from a universe, {{sdk method|destroy}} must be called which will also disconnect the bot from the world.&lt;br /&gt;
* If calling this while already logged in and entered into a world, then it will not update the identity of the bot inside the world (nor will it disconnect). Need to call {{sdk method|enter}} for the identity in world to update.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int rc;&lt;br /&gt;
&lt;br /&gt;
rc = vp_login(sdk, &amp;quot;myname&amp;quot;, &amp;quot;mypassword&amp;quot;, &amp;quot;botname&amp;quot;);&lt;br /&gt;
if (rc)&lt;br /&gt;
  printf(&amp;quot;Couldn&#039;t login (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk callback|login}}&lt;br /&gt;
* {{sdk method|destroy}}&lt;br /&gt;
* {{sdk method|enter}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_login&amp;diff=4950</id>
		<title>Vp login</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_login&amp;diff=4950"/>
		<updated>2018-08-01T21:54:20Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|login| Login to the universe server; using the credentials of an existing user account.&lt;br /&gt;
|paramex=username, password, botname&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|string|username|Use credentials of the account with this username}}&lt;br /&gt;
  {{sdk parameter row|string|password|Password associated with the account}}&lt;br /&gt;
  {{sdk parameter row|string|botname |Name that the bot will appear with in a world. There are no restrictions on what characters can be used.}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|STRING_TOO_LONG |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|INVALID_LOGIN   |The login credentials are incorrect}}&lt;br /&gt;
  {{sdk return code row|TIMEOUT         |Timeout}}&lt;br /&gt;
  {{sdk return code row|NOT_IN_UNIVERSE |Universe request made while not connected to a universe server}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|behavior=&lt;br /&gt;
*If a {{sdk callback|login}} callback is set this function will return immediately and return the result using the callback, otherwise it will call {{sdk method|wait}} in a loop until done.&lt;br /&gt;
* When successfully logged in, bots will have square brackets around their name. For example, providing &amp;quot;Samantha&amp;quot; as the {{code|botname}} parameter will identify the bot as &amp;quot;[Samantha]&amp;quot;.&lt;br /&gt;
* The user ID of the account used to log in will be exposed to other users.&lt;br /&gt;
* Bot names that contain [https://wikipedia.org/wiki/UTF-8 UTF-8] encoded characters (e.g. &amp;quot;\xE2\x98\xAF&amp;quot; is the &amp;quot;Yin and Yang&amp;quot; symbol ☯) will display correctly in a browser. &lt;br /&gt;
|caveats=&lt;br /&gt;
* To log out from a universe, {{sdk method|destroy}} must be called which will also disconnect the bot from the world.&lt;br /&gt;
* If calling this while already logged in and entered into a world, then it will not update the identity of the bot inside the world (nor will it disconnect). Need to call {{sdk method|enter}} for the identity in world to update.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int rc;&lt;br /&gt;
&lt;br /&gt;
rc = vp_login(sdk, &amp;quot;myname&amp;quot;, &amp;quot;mypassword&amp;quot;, &amp;quot;botname&amp;quot;);&lt;br /&gt;
if (rc)&lt;br /&gt;
  printf(&amp;quot;Couldn&#039;t login (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk callback|login}}&lt;br /&gt;
* {{sdk method|destroy}}&lt;br /&gt;
* {{sdk method|enter}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_connect_universe&amp;diff=4949</id>
		<title>Vp connect universe</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_connect_universe&amp;diff=4949"/>
		<updated>2018-08-01T20:16:00Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Sdk method page|connect_universe|Connects an instance to a [[universe]] server. Required before an instance log in with user credentials and entering a world.&lt;br /&gt;
|paramex=&amp;quot;universe.virtualparadise.org&amp;quot;, 57000&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|string|host|Host address of server to connect to; currently {{code|&amp;quot;universe.virtualparadise.org&amp;quot;}}. IP addresses in dotted quad are also valid (e.g. the string &amp;quot;10.0.0.1&amp;quot;).}}&lt;br /&gt;
  {{sdk parameter row|int   |port|TCP port of remote server; currently {{code|57000}}}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|CONNECTION_ERROR|Error connecting to the universe server}}&lt;br /&gt;
  {{sdk return code row|TIMEOUT         |It took too long to connect or get a response from the server}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* If a {{sdk callback|connect_universe}} callback is set this function will return immediately and return the result using the callback, otherwise it will call {{sdk method|wait}} in a loop until done.&lt;br /&gt;
|caveats=&lt;br /&gt;
* To disconnect from a universe, {{sdk method|destroy}} must be called.&lt;br /&gt;
* Passing a NULL pointer for the host parameter will cause a memory access violation. It will not cause a default host address to be used. Passing port number 0 will also not cause a default port to be used.&lt;br /&gt;
* {{code|VP_RC_CONNECTION_ERROR}} could be returned for many issues, such as invalid host, unable to resolve IP address, wrong or invalid port, etc.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int rc;&lt;br /&gt;
&lt;br /&gt;
rc = vp_connect_universe(instance, &amp;quot;universe.virtualparadise.org&amp;quot;, 57000);&lt;br /&gt;
if (rc)&lt;br /&gt;
    printf(&amp;quot;Couldn&#039;t connect to universe (reason %d)&amp;quot;, rc);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk callback|CONNECT_UNIVERSE}}&lt;br /&gt;
* {{sdk method|destroy}}&lt;br /&gt;
* {{sdk method|login}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_destroy&amp;diff=4948</id>
		<title>Vp destroy</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_destroy&amp;diff=4948"/>
		<updated>2018-08-01T19:32:38Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added caveats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|destroy|Destroys an existing SDK instance.&lt;br /&gt;
|behavior=If the destroyed instance was connected to a [[world]] and/or a [[universe]], it will be disconnected from both. This is the only way to disconnect a bot from a universe.&lt;br /&gt;
|caveats=&lt;br /&gt;
  This method will &#039;&#039;&#039;always&#039;&#039;&#039; return {{code|VP_RC_SUCCESS}} even when passed a NULL pointer. However, passing an invalid instance pointer will crash the bot due to a memory access violation.&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|create}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_create&amp;diff=4947</id>
		<title>Vp create</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_create&amp;diff=4947"/>
		<updated>2018-08-01T19:18:38Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|create|Creates a new SDK instance in memory for connecting to a universe and world.&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|vp_net_config*|net_config|Network configuration for the instance or NULL to use the default select-based implementation. The contents of the structure will be copied.}}&lt;br /&gt;
|customparamex=net_config&lt;br /&gt;
|noinstanceparam=&lt;br /&gt;
|returns=A pointer to the newly created instance, or {{code|NULL}} if something went wrong whilst trying to create one.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
VPInstance instance;&lt;br /&gt;
&lt;br /&gt;
instance = vp_create(NULL);&lt;br /&gt;
if (!instance)&lt;br /&gt;
  printf(&amp;quot;Unable to create instance\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|connect_universe}}&lt;br /&gt;
* {{sdk method|destroy}}&lt;br /&gt;
* {{sdk method|login}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_init&amp;diff=4946</id>
		<title>Vp init</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_init&amp;diff=4946"/>
		<updated>2018-08-01T19:14:05Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|init|Check if the version of the VPSDK used to build the application matches the version that is currently loaded.&lt;br /&gt;
|customparam={{sdk parameter|int|version}}&lt;br /&gt;
|customparamex=VPSDK_VERSION&lt;br /&gt;
|noinstanceparam=&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|version|{{code|VPSDK_VERSION}} in VP.h defines the version of the SDK library}}&lt;br /&gt;
|behavior=&lt;br /&gt;
There is no longer a requirement to call this function. It is used to check if the version used to build the application is compatible with the version used at runtime.&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|version_mismatch|VP.h and the SDK library are from different builds}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int rc;&lt;br /&gt;
&lt;br /&gt;
if (rc = vp_init(VPSDK_VERSION))&lt;br /&gt;
    printf(&amp;quot;Incorrect VPSDK.dll version\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|create}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_join&amp;diff=4945</id>
		<title>Vp join</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_join&amp;diff=4945"/>
		<updated>2018-07-31T23:31:06Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|join|Send a join request to a user.&lt;br /&gt;
|paramex=user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|user_id|User id}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|reference_number|Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_UNIVERSE|Bot is not currently in the universe}}&lt;br /&gt;
  {{sdk return code row|JOIN_DECLINED|Join request was declined}}&lt;br /&gt;
  {{sdk return code row|TIMEOUT|Join request timeout (no accept/decline within 30 seconds)}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int    |JOIN_ID    |Join id               |{{code|VP_RC_JOIN_DECLINED}}}}&lt;br /&gt;
  {{sdk attribute row|int    |USER_ID    |User id               |{{code|VP_RC_JOIN_DECLINED}}}}&lt;br /&gt;
  {{sdk attribute row|string |JOIN_NAME  |Name of user          |{{code|VP_RC_JOIN_DECLINED}} and {{code|VP_RC_TIMEOUT}}}}&lt;br /&gt;
  {{sdk attribute row|float  |JOIN_X     |User x coordinate     |}}&lt;br /&gt;
  {{sdk attribute row|float  |JOIN_Y     |User y coordinate     |}}&lt;br /&gt;
  {{sdk attribute row|float  |JOIN_Z     |User z coordinate     |}}&lt;br /&gt;
  {{sdk attribute row|float  |JOIN_YAW   |User yaw angle        |}}&lt;br /&gt;
  {{sdk attribute row|float  |JOIN_PITCH |User pitch angle      |}}&lt;br /&gt;
  {{sdk attribute row|string |JOIN_WORLD |World that user is in |}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon sending a request, {{sdk event|JOIN}} is triggered for the user. See {{sdk method|event_set}}.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk event|JOIN}}&lt;br /&gt;
* {{sdk callback|JOIN}}&lt;br /&gt;
* {{sdk method|join_accept}}&lt;br /&gt;
* {{sdk method|join_decline}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_terrain_node_set&amp;diff=4944</id>
		<title>Vp terrain node set</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_terrain_node_set&amp;diff=4944"/>
		<updated>2018-07-31T23:29:11Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|terrain_node_set|Replace terrain node data.&lt;br /&gt;
|paramex=tile_x, tile_z, node_x, node_z, cells&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int                |tile_x |Tile X coordinate (with no terrain scaling, divide coordinates in decameter by 32 to get tile coordinates)}}&lt;br /&gt;
  {{sdk parameter row|int                |tile_z |Tile Z coordinate}}&lt;br /&gt;
  {{sdk parameter row|int                |node_x |Node X coordinate (within tile, 0 to 3)}}&lt;br /&gt;
  {{sdk parameter row|int                |node_z |Node Z coordinate}}&lt;br /&gt;
  {{sdk parameter row|vp_terrain_cell_t* |cells  |Pointer to 64 cells (8x8: cells[z*8+x])}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int       |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_WORLD |Bot is not currently in a world}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successfully replacing a node, {{sdk event|TERRAIN_NODE_CHANGED}} is triggered for any user subscribed to it. See {{sdk method|event_set}}.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Set the height of the terrain node containing the terrain cell coordinate x, z (Note: it will reset the texture, rotation and hole flag!)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
int tile_from_cell(int val)&lt;br /&gt;
{&lt;br /&gt;
  return val &amp;lt; 0 ? (val - 32) / 32 : val / 32;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void set_terrain_node_height(VPInstance sdk, int x, int z, float height)&lt;br /&gt;
{&lt;br /&gt;
  int tile_x, tile_z;&lt;br /&gt;
&lt;br /&gt;
  tile_x = tile_from_cell(x);&lt;br /&gt;
  tile_z = tile_from_cell(z);&lt;br /&gt;
&lt;br /&gt;
  int node_x, node_z;&lt;br /&gt;
&lt;br /&gt;
  if (node_x &amp;lt; 0)&lt;br /&gt;
    node_x -= 8;&lt;br /&gt;
&lt;br /&gt;
  node_x = (x % 32) / 8;&lt;br /&gt;
&lt;br /&gt;
  if (node_z &amp;lt; 0)&lt;br /&gt;
    node_z -= 8;&lt;br /&gt;
&lt;br /&gt;
  node_z = (z % 32) / 8;&lt;br /&gt;
&lt;br /&gt;
  struct vp_terrain_cell_t cells[64];&lt;br /&gt;
&lt;br /&gt;
  memset(cells, 0, sizeof(cells));&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; 64; i++)&lt;br /&gt;
    cells[i].height = height;&lt;br /&gt;
&lt;br /&gt;
  vp_terrain_node_set(sdk, tile_x, tile_z, node_x, node_z, cells);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk event|TERRAIN_NODE_CHANGED}}&lt;br /&gt;
* {{sdk callback|TERRAIN_NODE_SET}}&lt;br /&gt;
* {{sdk method|terrain_query}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_terrain_query&amp;diff=4943</id>
		<title>Vp terrain query</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_terrain_query&amp;diff=4943"/>
		<updated>2018-07-31T23:28:30Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|terrain_query|Query a terrain tile.&lt;br /&gt;
|paramex=x, z&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int       |tile_x                |X tile coordinate (with no terrain scaling, divide coordinates in decameter by 32 to get tile coordinates)}}&lt;br /&gt;
  {{sdk parameter row|int       |tile_z                |Z tile coordinate}}&lt;br /&gt;
  {{sdk parameter row|int[4][4] |revision              |16 node revision numbers (4x4: revision[z][x])}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int       |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_WORLD |Bot is not currently in a world}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successfully querying a tile, {{sdk event|TERRAIN_NODE}} is triggered for each of the terrain nodes in it. See {{sdk method|event_set}}.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  This example will monitor avatars within the area from 0X 0Z to 32X 32Z and teleport them above ground when they go more than 2 meters below the terrain height.&lt;br /&gt;
 *  Note: The code assumes that the terrain has not been scaled or offset!&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
float g_heights[32][32]; // All the heights inside the queried terrain tile (in this example it is a square from coordinate 0,0 to 32,32)&lt;br /&gt;
&lt;br /&gt;
void handle_terrain_node(VPInstance sdk)&lt;br /&gt;
{&lt;br /&gt;
  int offset_x, offset_z; // Offset cell x and z for storing current node in g_heights&lt;br /&gt;
&lt;br /&gt;
  offset_x = vp_int(sdk, VP_TERRAIN_NODE_X) * 8; &lt;br /&gt;
  offset_z = vp_int(sdk, VP_TERRAIN_NODE_Z) * 8;&lt;br /&gt;
&lt;br /&gt;
  int length; // Not used in this example&lt;br /&gt;
&lt;br /&gt;
  vp_terrain_cell_t (*cell)[8][8] = (vp_terrain_cell_t(*)[8][8])vp_data(sdk, VP_TERRAIN_NODE_DATA, &amp;amp;length);&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; 8; i++)&lt;br /&gt;
    for (int j = 0; j &amp;lt; 8; j++)&lt;br /&gt;
      g_heights[i + offset_z][j + offset_x] = (*cell)[i][j].height;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float get_height(double x, double z)&lt;br /&gt;
{&lt;br /&gt;
  int x_cell, z_cell; // Terrain cell coordinate is simply the truncated coordinate in decameters&lt;br /&gt;
&lt;br /&gt;
  x_cell = (int)x;&lt;br /&gt;
  z_cell = (int)z;&lt;br /&gt;
&lt;br /&gt;
  if (x_cell &amp;lt; 0 || x_cell &amp;gt; 30) // Check if x coordinate is within the queried tile&lt;br /&gt;
    return INFINITY;&lt;br /&gt;
&lt;br /&gt;
  if (z_cell &amp;lt; 0 || z_cell &amp;gt; 30) // Check if z coordinate is within the queried tile&lt;br /&gt;
    return INFINITY;&lt;br /&gt;
&lt;br /&gt;
  double x_rel, z_rel; // Coordinate within the cell (for calculating the height)&lt;br /&gt;
&lt;br /&gt;
  x_rel = x - trunc(x);&lt;br /&gt;
  z_rel = z - trunc(z);&lt;br /&gt;
&lt;br /&gt;
  double base, x_diff, z_diff; // Base height, maximum difference toward x and z.&lt;br /&gt;
&lt;br /&gt;
  // Four cases, depending on what cell it is and which half of the cell&lt;br /&gt;
	&lt;br /&gt;
  if ((x_cell + z_cell) % 2)&lt;br /&gt;
  {&lt;br /&gt;
    // Odd cell, diagonal goes from 0,0 to 1,1&lt;br /&gt;
&lt;br /&gt;
    if ((1.0 - x_rel) + z_rel &amp;gt; 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Upper half of the cell&lt;br /&gt;
      base = g_heights[z_cell + 1][x_cell];&lt;br /&gt;
      x_diff = g_heights[z_cell + 1][x_cell + 1] - base;&lt;br /&gt;
      z_diff = g_heights[z_cell][x_cell] - base;&lt;br /&gt;
&lt;br /&gt;
      z_rel = 1.0 - z_rel;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Lower half of the cell&lt;br /&gt;
      base = g_heights[z_cell][x_cell + 1];&lt;br /&gt;
      x_diff = g_heights[z_cell][x_cell] - base;&lt;br /&gt;
      z_diff = g_heights[z_cell + 1][x_cell + 1] - base;&lt;br /&gt;
&lt;br /&gt;
      x_rel = 1.0 - x_rel;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    // Even cell, diagonal goes from 1,0 to 0,1&lt;br /&gt;
&lt;br /&gt;
    if (x_rel + z_rel &amp;gt; 1)&lt;br /&gt;
    {&lt;br /&gt;
      // Upper half of the cell&lt;br /&gt;
      base = g_heights[z_cell + 1][x_cell + 1];&lt;br /&gt;
      x_diff = g_heights[z_cell + 1][x_cell] - base;&lt;br /&gt;
      z_diff = g_heights[z_cell][x_cell + 1] - base;&lt;br /&gt;
&lt;br /&gt;
      x_rel = 1.0 - x_rel;&lt;br /&gt;
      z_rel = 1.0 - z_rel;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      // Lower half of the cell&lt;br /&gt;
      base = g_heights[z_cell][x_cell];&lt;br /&gt;
      x_diff = g_heights[z_cell][x_cell + 1] - base;&lt;br /&gt;
      z_diff = g_heights[z_cell + 1][x_cell] - base;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (float)(base + x_diff * x_rel + z_diff * z_rel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_avatar_change(VPInstance sdk)&lt;br /&gt;
{&lt;br /&gt;
  double x, y, z;&lt;br /&gt;
&lt;br /&gt;
  x = vp_double(sdk, VP_AVATAR_X);&lt;br /&gt;
  y = vp_double(sdk, VP_AVATAR_Y);&lt;br /&gt;
  z = vp_double(sdk, VP_AVATAR_Z);&lt;br /&gt;
&lt;br /&gt;
  float y_calc;&lt;br /&gt;
&lt;br /&gt;
  y_calc = get_height(x, z);&lt;br /&gt;
&lt;br /&gt;
  if (y_calc != INFINITY) // Inside queried area&lt;br /&gt;
  {&lt;br /&gt;
    if (y &amp;lt; y_calc - 0.2) //Below the terrain (assuming avatar is shorter than 2 meters)&lt;br /&gt;
    {&lt;br /&gt;
      printf(&amp;quot;WARNING: \&amp;quot;%s\&amp;quot; was moving around below the terrain!\n&amp;quot;, vp_string(sdk, VP_AVATAR_NAME));&lt;br /&gt;
      vp_teleport_avatar(sdk,&lt;br /&gt;
                         vp_int(sdk, VP_AVATAR_SESSION),&lt;br /&gt;
                         &amp;quot;&amp;quot;,&lt;br /&gt;
                         x,&lt;br /&gt;
                         y_calc,&lt;br /&gt;
                         z,&lt;br /&gt;
                         vp_double(sdk, VP_AVATAR_YAW),&lt;br /&gt;
                         vp_double(sdk, VP_AVATAR_PITCH)); // Teleport avatar up above ground&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  //...&lt;br /&gt;
&lt;br /&gt;
  vp_event_set(sdk, VP_EVENT_AVATAR_CHANGE, handle_avatar_change);&lt;br /&gt;
  vp_event_set(sdk, VP_EVENT_TERRAIN_NODE, handle_terrain_node);&lt;br /&gt;
&lt;br /&gt;
  int rev[4][4];&lt;br /&gt;
&lt;br /&gt;
  memset(rev, 0, sizeof(rev));&lt;br /&gt;
  vp_terrain_query(sdk, 0, 0, rev);&lt;br /&gt;
&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|terrain_node_set}}&lt;br /&gt;
* {{sdk callback|TERRAIN_QUERY}}&lt;br /&gt;
* {{sdk event|TERRAIN_NODE}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4942</id>
		<title>Vp friend delete</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4942"/>
		<updated>2018-07-31T23:24:57Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friend_delete|Delete a user from the friend list.&lt;br /&gt;
|paramex=friend_user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|friend_user_id|User id of user to delete}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int    |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_in_universe|Universe request made while not connected to a universe server}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friends_get}}&lt;br /&gt;
* {{sdk method|friend_add_by_name}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friend_add_by_name&amp;diff=4941</id>
		<title>Vp friend add by name</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friend_add_by_name&amp;diff=4941"/>
		<updated>2018-07-31T23:24:21Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute, reason code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friend_add_by_name|Add a user to the friend list.&lt;br /&gt;
|paramex=name&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|string|name|Name of user to add}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|reference_number|Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_UNIVERSE|Universe request made while not connected to a universe server}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successfully adding a user, {{sdk event|FRIEND}} is triggered if the bot has subscribed to it.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friends_get}}&lt;br /&gt;
* {{sdk method|friend_delete}}&lt;br /&gt;
* {{sdk callback|FRIEND}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friends_get&amp;diff=4940</id>
		<title>Vp friends get</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friends_get&amp;diff=4940"/>
		<updated>2018-07-31T23:21:51Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute, return code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friends_get|Request the friend list.&lt;br /&gt;
|paramex=&lt;br /&gt;
|parameters=&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_UNIVERSE|Universe request made while not connected to a universe server}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void handle_friend(VPInstance sdk)&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  int user_id, online;&lt;br /&gt;
&lt;br /&gt;
  name = vp_string(sdk, VP_FRIEND_NAME);&lt;br /&gt;
  user_id = vp_int(sdk, VP_FRIEND_USER_ID);&lt;br /&gt;
  online = vp_int(sdk, VP_FRIEND_ONLINE);&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;Friend \&amp;quot;%s\&amp;quot; (id #%d) is %s\n&amp;quot;, name, user_id, online ? &amp;quot;online&amp;quot; : &amp;quot;offline&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void handle_get_friends(VPInstance sdk, int rc, int ref)&lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;Got the entire friend list!\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  //...&lt;br /&gt;
&lt;br /&gt;
  vp_callback_set(sdk, VP_CALLBACK_GET_FRIENDS, handle_get_friends);&lt;br /&gt;
  vp_event_set(sdk, VP_EVENT_FRIEND, handle_friend);&lt;br /&gt;
  vp_friends_get(sdk);&lt;br /&gt;
&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friend_add_by_name}}&lt;br /&gt;
* {{sdk method|friend_delete}}&lt;br /&gt;
* {{sdk callback|GET_FRIENDS}}&lt;br /&gt;
* {{sdk event|FRIEND}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_delete&amp;diff=4939</id>
		<title>Vp object delete</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_delete&amp;diff=4939"/>
		<updated>2018-07-31T23:17:50Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_delete|Delete an object.&lt;br /&gt;
|paramex=object_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|object_id             |Id of object to delete}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_WORLD |Bot is not currently in a world}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|OBJECT_ID|Object id of deleted object}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successful deletion of an object, {{sdk event|OBJECT_DELETE}} is triggered for those who have subscribed to it.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|object_add}}&lt;br /&gt;
* {{sdk method|object_change}}&lt;br /&gt;
* {{sdk callback|OBJECT_DELETE}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_change&amp;diff=4938</id>
		<title>Vp object change</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_change&amp;diff=4938"/>
		<updated>2018-07-31T23:15:55Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_change|Change an existing object.&lt;br /&gt;
|parameters=&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int    |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
  {{sdk attribute row|int    |OBJECT_ID             |Id of object to change}}&lt;br /&gt;
  {{sdk attribute row|int    |OBJECT_TYPE           |Type of object}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_X              |X coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_Y              |Y coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_Z              |Z coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_ROTATION_X     |Rotation axis X}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_ROTATION_Y     |Rotation axis Y}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_ROTATION_Z     |Rotation axis Z}}&lt;br /&gt;
  {{sdk attribute row|float  |OBJECT_ROTATION_ANGLE |Rotation angle}}&lt;br /&gt;
  {{sdk attribute row|string |OBJECT_MODEL          |Model}}&lt;br /&gt;
  {{sdk attribute row|string |OBJECT_ACTION         |Action}}&lt;br /&gt;
  {{sdk attribute row|string |OBJECT_DESCRIPTION    |Description}}&lt;br /&gt;
  {{sdk attribute row|data   |OBJECT_DATA           |Data}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_WORLD |Bot is not currently in a world}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|OBJECT_ID|Object id of changed object}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successful change of an object, {{sdk event|OBJECT_CHANGE}} is triggered for those who have subscribed to it.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|object_add}}&lt;br /&gt;
* {{sdk method|object_delete}}&lt;br /&gt;
* {{sdk callback|OBJECT_CHANGE}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_load&amp;diff=4937</id>
		<title>Vp object load</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_load&amp;diff=4937"/>
		<updated>2018-07-31T23:15:10Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_load|Load a new object, overriding user id and timestamp.&lt;br /&gt;
|parameters=&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int    |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
  {{sdk attribute row|int    |object_time           |Creation time to put on object (in unix time, seconds since UTC 00:00:00, 1 January 1970)}}&lt;br /&gt;
  {{sdk attribute row|int    |object_user_id        |User id to put on object}}&lt;br /&gt;
  {{sdk attribute row|int    |object_type           |Type of object (0 - 3D Model, 2 - Particle emitter, 3 - Path object) }}&lt;br /&gt;
  {{sdk attribute row|float  |object_x              |X coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_y              |Y coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_z              |Z coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_x     |Rotation X axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_y     |Rotation Y axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_z     |Rotation Z axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_angle |Rotation angle in radians}}&lt;br /&gt;
  {{sdk attribute row|float  |object_yaw            |Yaw angle in degrees (these are used instead of X,Y,Z axis when rotation angle is set to INFINITY)}}&lt;br /&gt;
  {{sdk attribute row|float  |object_pitch          |Pitch angle in degrees}}&lt;br /&gt;
  {{sdk attribute row|float  |object_roll           |Roll angle in degrees}}&lt;br /&gt;
  {{sdk attribute row|string |object_model          |Model}}&lt;br /&gt;
  {{sdk attribute row|string |object_action         |Action}}&lt;br /&gt;
  {{sdk attribute row|string |object_description    |Description}}&lt;br /&gt;
  {{sdk attribute row|data   |object_data           |Data}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_in_world|Bot is not currently in a world}}&lt;br /&gt;
  {{sdk return code row|not_allowed|Instance does not have the permission to load objects.}}&lt;br /&gt;
  {{sdk return code row|database_error|Unspecified database error}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|object_id|Object id that was assigned to the new object}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successful creation of an object, {{sdk event|OBJECT}} is triggered for those who have subscribed to it. See {{sdk method|event_set}}.&lt;br /&gt;
* If {{sdk attribute|object_rotation_angle}} is set to INFINITY then it will be stored as that in world. The euler angles will be not be converted to an equivalent axis-angle representation. See examples in {{sdk method|object_add}} for euler to axis-angle conversion code.&lt;br /&gt;
|caveats=&lt;br /&gt;
* Setting {{sdk attribute|object_user_id}} to 0 will not default it to the owner of the bot (it will be set to user id #0).&lt;br /&gt;
* Setting {{sdk attribute|object_time}} to 0 will not default it to current time (it will be set to unix time 0, that is 00:00:00, 1 January 1970).&lt;br /&gt;
|examples=&lt;br /&gt;
Load a street1.rwx object at 0X 0Y 0Z.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void handle_object_load(VPInstance sdk, int rc, int ref)&lt;br /&gt;
{&lt;br /&gt;
  if (rc)&lt;br /&gt;
    printf(&amp;quot;Couldn&#039;t load object (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
  else&lt;br /&gt;
    printf(&amp;quot;Object loaded successfully!\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  //...&lt;br /&gt;
  &lt;br /&gt;
  vp_callback_set(sdk, VP_CALLBACK_OBJECT_LOAD, handle_object_load);&lt;br /&gt;
&lt;br /&gt;
  vp_int_set(sdk, VP_OBJECT_TYPE, 0); // 3D Model&lt;br /&gt;
  vp_int_set(sdk, VP_OBJECT_USER_ID, 1234); // Owner #1234&lt;br /&gt;
  vp_int_set(sdk, VP_OBJECT_TIME, time(NULL) - 3600); // One hour ago&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_X, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_Y, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_Z, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_X, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_Y, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_Z, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_ANGLE, 0.0);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_MODEL, &amp;quot;street1.rwx&amp;quot;);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_ACTION, &amp;quot;&amp;quot;);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_DESCRIPTION, &amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
  rc = vp_object_load(sdk);&lt;br /&gt;
  if (rc)&lt;br /&gt;
    printf(&amp;quot;Couldn&#039;t load object (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|object_add}}&lt;br /&gt;
* {{sdk method|object_change}}&lt;br /&gt;
* {{sdk method|object_delete}}&lt;br /&gt;
* {{sdk callback|object_load}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_add&amp;diff=4936</id>
		<title>Vp object add</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_add&amp;diff=4936"/>
		<updated>2018-07-31T23:14:05Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_add|Build a new object.&lt;br /&gt;
|parameters=&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int    |reference_number      |Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
  {{sdk attribute row|int    |object_type           |Type of object (0 - 3D Model, 2 - Particle emitter, 3 - Path object) }}&lt;br /&gt;
  {{sdk attribute row|float  |object_x              |X coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_y              |Y coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_z              |Z coordinate}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_x     |Rotation X axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_y     |Rotation Y axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_z     |Rotation Z axis}}&lt;br /&gt;
  {{sdk attribute row|float  |object_rotation_angle |Rotation angle in radians}}&lt;br /&gt;
  {{sdk attribute row|float  |object_yaw            |Yaw angle in degrees (these are used instead of X,Y,Z axis when rotation angle is set to INFINITY)}}&lt;br /&gt;
  {{sdk attribute row|float  |object_pitch          |Pitch angle in degrees}}&lt;br /&gt;
  {{sdk attribute row|float  |object_roll           |Roll angle in degrees}}&lt;br /&gt;
  {{sdk attribute row|string |object_model          |Model}}&lt;br /&gt;
  {{sdk attribute row|string |object_action         |Action}}&lt;br /&gt;
  {{sdk attribute row|string |object_description    |Description}}&lt;br /&gt;
  {{sdk attribute row|data   |object_data           |Data}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_in_world|Bot is not currently in a world}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|object_id|Object id that was assigned to the new object}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successful creation of an object, {{sdk event|OBJECT}} is triggered for those who have subscribed to it. See {{sdk method|event_set}}.&lt;br /&gt;
* If {{sdk attribute|object_rotation_angle}} is set to INFINITY then it will be stored as that in world. The euler angles will be not be converted to an equivalent axis-angle representation. See examples for euler to axis-angle conversion code.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
Build a street1.rwx object at 0X 0Y 0Z.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void handle_object_add(VPInstance sdk, int rc, int ref)&lt;br /&gt;
{&lt;br /&gt;
  if (rc)&lt;br /&gt;
    printf(&amp;quot;Couldn&#039;t build object (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
  else&lt;br /&gt;
    printf(&amp;quot;Object built successfully!\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  //...&lt;br /&gt;
  &lt;br /&gt;
  vp_callback_set(sdk, VP_CALLBACK_OBJECT_ADD, handle_object_add);&lt;br /&gt;
&lt;br /&gt;
  vp_int_set(sdk, VP_OBJECT_TYPE, 0); // 3D Model&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_X, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_Y, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_Z, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_X, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_Y, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_Z, 0.0);&lt;br /&gt;
  vp_float_set(sdk, VP_OBJECT_ROTATION_ANGLE, 0.0);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_MODEL, &amp;quot;street1.rwx&amp;quot;);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_ACTION, &amp;quot;&amp;quot;);&lt;br /&gt;
  vp_string_set(sdk, VP_OBJECT_DESCRIPTION, &amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
  rc = vp_object_add(sdk);&lt;br /&gt;
  if (rc)&lt;br /&gt;
    printf(&amp;quot;Couldn&#039;t build object (reason %d)\n&amp;quot;, rc);&lt;br /&gt;
&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convert euler angles (in degrees) to axis-angle.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void euler_to_axis_angle(double yaw, double pitch, double roll, double *x, double *y, double *z, double *angle)&lt;br /&gt;
{&lt;br /&gt;
  // Convert angles to radians&lt;br /&gt;
	&lt;br /&gt;
  yaw = (yaw / 180.0) * M_PI;&lt;br /&gt;
  pitch = (pitch / 180.0) * M_PI;&lt;br /&gt;
  roll = (roll / 180.0) * M_PI;&lt;br /&gt;
&lt;br /&gt;
  // Convert to axis-angle&lt;br /&gt;
&lt;br /&gt;
  double sin_yaw_2, sin_pitch_2, sin_roll_2, cos_yaw_2, cos_pitch_2, cos_roll_2;&lt;br /&gt;
&lt;br /&gt;
  sin_yaw_2 = sin(yaw / 2);&lt;br /&gt;
  sin_pitch_2 = sin(pitch / 2);&lt;br /&gt;
  sin_roll_2  = sin(roll / 2);&lt;br /&gt;
  cos_yaw_2   = cos(yaw / 2);&lt;br /&gt;
  cos_pitch_2 = cos(pitch / 2);&lt;br /&gt;
  cos_roll_2  = cos(roll / 2);&lt;br /&gt;
&lt;br /&gt;
  // Return a normalized axis&lt;br /&gt;
&lt;br /&gt;
  double x_tmp, y_tmp, z_tmp;&lt;br /&gt;
&lt;br /&gt;
  x_tmp = sin_yaw_2 * sin_roll_2 * cos_pitch_2 + cos_yaw_2 * cos_roll_2 * sin_pitch_2;&lt;br /&gt;
  y_tmp = sin_yaw_2 * cos_roll_2 * cos_pitch_2 + cos_yaw_2 * sin_roll_2 * sin_pitch_2;&lt;br /&gt;
  z_tmp = cos_yaw_2 * sin_roll_2 * cos_pitch_2 - sin_yaw_2 * cos_roll_2 * sin_pitch_2;&lt;br /&gt;
&lt;br /&gt;
  double norm = sqrt(x_tmp * x_tmp + y_tmp * y_tmp + z_tmp * z_tmp);&lt;br /&gt;
&lt;br /&gt;
  if (norm)&lt;br /&gt;
  {&lt;br /&gt;
    *x = x_tmp / norm;&lt;br /&gt;
    *y = y_tmp / norm;&lt;br /&gt;
    *z = z_tmp / norm;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    *x = 1;&lt;br /&gt;
    *y = 0;&lt;br /&gt;
    *z = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  *angle = 2 * acos(cos_yaw_2 * cos_pitch_2 * cos_roll_2 - sin_yaw_2 * sin_pitch_2 * sin_roll_2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convert axis-angle to euler angles (in degrees).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void axis_angle_to_euler(double x, double y, double z, double angle, double *yaw, double *pitch, double *roll)&lt;br /&gt;
{&lt;br /&gt;
  // Normalize axis&lt;br /&gt;
&lt;br /&gt;
  double norm = sqrt(x * x + y * y + z * z);&lt;br /&gt;
&lt;br /&gt;
  if (norm)&lt;br /&gt;
  {&lt;br /&gt;
    x = x / norm;&lt;br /&gt;
    y = y / norm;&lt;br /&gt;
    z = z / norm;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    *yaw = 0;&lt;br /&gt;
    *pitch = 0;&lt;br /&gt;
    *roll = 0;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  double sin_angle, cos_angle, cos_angle_1;&lt;br /&gt;
	&lt;br /&gt;
  sin_angle = sin(angle);&lt;br /&gt;
  cos_angle = cos(angle);&lt;br /&gt;
  cos_angle_1 = 1 - cos(angle);&lt;br /&gt;
&lt;br /&gt;
  double yaw_tmp, pitch_tmp, roll_tmp;&lt;br /&gt;
	&lt;br /&gt;
  if ((x * y * cos_angle_1 + z * sin_angle) &amp;gt; 0.998) // North pole singularity detected&lt;br /&gt;
  {&lt;br /&gt;
    yaw_tmp = 2 * atan2(x * sin(angle / 2), cos(angle / 2));&lt;br /&gt;
    pitch_tmp = 0;&lt;br /&gt;
    roll_tmp = M_PI_2;&lt;br /&gt;
  }&lt;br /&gt;
  else if ((x * y * cos_angle_1 + z * sin_angle) &amp;lt; -0.998) // South pole singularity detected&lt;br /&gt;
  {&lt;br /&gt;
    yaw_tmp = -2 * atan2(x * sin(angle / 2), cos(angle / 2));&lt;br /&gt;
    pitch_tmp = 0;&lt;br /&gt;
    roll_tmp = -M_PI_2;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    yaw_tmp = atan2(y * sin_angle - x * z * cos_angle_1, 1 - (y * y + z * z) * cos_angle_1);&lt;br /&gt;
    pitch_tmp = atan2(x * sin_angle - y * z * cos_angle_1, 1 - (x * x + z * z) * cos_angle_1);&lt;br /&gt;
    roll_tmp = asin(x * y * cos_angle_1 + z * sin_angle);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  *yaw = (yaw_tmp * 180) / M_PI;&lt;br /&gt;
  *pitch = (pitch_tmp * 180) / M_PI;&lt;br /&gt;
  *roll = (roll_tmp * 180) / M_PI;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|object_change}}&lt;br /&gt;
* {{sdk method|object_delete}}&lt;br /&gt;
* {{sdk callback|object_add}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_get&amp;diff=4935</id>
		<title>Vp object get</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_get&amp;diff=4935"/>
		<updated>2018-07-31T23:11:24Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_get|Gets the attributes of a single object in-world by its ID.&lt;br /&gt;
|version=0.3.37&lt;br /&gt;
|paramex=id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|id|ID of the object}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|REFERENCE_NUMBER|Is passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_INITIALIZED|SDK not initialized with {{sdk method|init}} yet}}&lt;br /&gt;
|behavior=&lt;br /&gt;
This is a non-blocking call that requires a [[callback]] to be set for {{sdk callback|OBJECT_GET}}. The callback will either return the object&#039;s data or an error [[reason code]].&lt;br /&gt;
|caveats=This call is only useful for single objects the bot does not know about. After getting an object&#039;s data once, it should cache the result and monitor changes using {{sdk event|object_change}}.&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|query_cell}}&lt;br /&gt;
* {{sdk event|object_click}}&lt;br /&gt;
* {{sdk callback|object_get}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Reason_code&amp;diff=4934</id>
		<title>Reason code</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Reason_code&amp;diff=4934"/>
		<updated>2018-07-31T23:09:19Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Redirected page to Return code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[return code]]&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_object_get&amp;diff=4933</id>
		<title>Vp object get</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_object_get&amp;diff=4933"/>
		<updated>2018-07-31T23:08:46Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reference number attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|object_get|Gets the attributes of a single object in-world by its ID.&lt;br /&gt;
|version=0.3.37&lt;br /&gt;
|paramex=id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|id|ID of the object}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|int|REFERENCE_NUMBER|Will be passed to the callback to identify for which method call it is fired}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_INITIALIZED|SDK not initialized with {{sdk method|init}} yet}}&lt;br /&gt;
|behavior=&lt;br /&gt;
This is a non-blocking call that requires a [[callback]] to be set for {{sdk callback|OBJECT_GET}}. The callback will either return the object&#039;s data or an error [[reason code]].&lt;br /&gt;
|caveats=This call is only useful for single objects the bot does not know about. After getting an object&#039;s data once, it should cache the result and monitor changes using {{sdk event|object_change}}.&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|query_cell}}&lt;br /&gt;
* {{sdk event|object_click}}&lt;br /&gt;
* {{sdk callback|object_get}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4932</id>
		<title>Template:Sdk method page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4932"/>
		<updated>2018-07-31T22:33:43Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Trying to fix a strange issue with the template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Method call snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_{{lc:{{{1|unknown}}}}}({{{customparamex|instance{{#if:{{{paramex|}}}|, {{{paramex}}}|}}}}});&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Parameters ==__NOEDITSECTION__&lt;br /&gt;
These are the parameters that this method requires:&lt;br /&gt;
{{sdk parameter table|{{#if:{{{noinstanceparam}}}|{{sdk parameter row|VPInstance|instance|Pointer to the instance this method call is intended for}}|}}&lt;br /&gt;
{{{parameters|}}}}}&lt;br /&gt;
{{#if: {{{attributes|}}} |== Used attributes ==__NOEDITSECTION__&lt;br /&gt;
This method uses data set in these attributes when called:&lt;br /&gt;
{{sdk attribute table|{{{attributes}}}}} |}}&lt;br /&gt;
== Returns ==__NOEDITSECTION__&lt;br /&gt;
{{{returns|This method returns a [[return code]] integer, which indicates whether the call was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{returncodes|}}}}}&lt;br /&gt;
{{#if: {{{returnattributes|}}} |The following attributes will be returned in {{Sdk callback|{{{1}}}}} if the operation was successful:&lt;br /&gt;
{{sdk return attribute table|{{{returnattributes}}}}} |}} }}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this method&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This method has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:vp_{{lc:{{{1}}}}}}} {{{category|[[Category:SDK methods]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk event page|Event name|Event description&lt;br /&gt;
|returntype=&lt;br /&gt;
|paramex=&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|type|name|description}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4931</id>
		<title>Template:Sdk method page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_method_page&amp;diff=4931"/>
		<updated>2018-07-31T22:26:00Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Method call snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_{{lc:{{{1|unknown}}}}}({{{customparamex|instance{{#if:{{{paramex|}}}|, {{{paramex}}}|}}}}});&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if: {{{parameters|}}} |== Parameters ==__NOEDITSECTION__&lt;br /&gt;
These are the parameters that this method requires:&lt;br /&gt;
{{sdk parameter table|{{#if:{{{noinstanceparam}}}|{{sdk parameter row|VPInstance|instance|Pointer to the instance this method call is intended for}}|}}&lt;br /&gt;
{{{parameters|}}}}} |}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if: {{{attributes|}}} |== Used attributes ==__NOEDITSECTION__&lt;br /&gt;
This method uses data set in these attributes when called:&lt;br /&gt;
{{sdk attribute table|{{{attributes}}}}} |}}&lt;br /&gt;
== Returns ==__NOEDITSECTION__&lt;br /&gt;
{{{returns|This method returns a [[return code]] integer, which indicates whether the call was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{returncodes|}}}}}&lt;br /&gt;
{{#if: {{{returnattributes|}}} |The following attributes will be returned in {{Sdk callback|{{{1}}}}} if the operation was successful:&lt;br /&gt;
{{sdk return attribute table|{{{returnattributes}}}}} |}} }}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this method&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This method has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:vp_{{lc:{{{1}}}}}}} {{{category|[[Category:SDK methods]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk event page|Event name|Event description&lt;br /&gt;
|returntype=&lt;br /&gt;
|paramex=&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|type|name|description}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_avatar_click&amp;diff=4930</id>
		<title>Vp avatar click</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_avatar_click&amp;diff=4930"/>
		<updated>2018-07-31T21:13:23Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Fixed typos and incorrect call snippet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|avatar_click|Send an avatar click event to other users in the world.&lt;br /&gt;
|paramex=avatar_session&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int   |avatar_session |The session id of the clicked avatar}}&lt;br /&gt;
|attributes=&lt;br /&gt;
  {{sdk attribute row|float |CLICK_HIT_X |X coordinate of hit (world coordinates)}}&lt;br /&gt;
  {{sdk attribute row|float |CLICK_HIT_Y |Y coordinate of hit (world coordinates)}}&lt;br /&gt;
  {{sdk attribute row|float |CLICK_HIT_Z |Z coordinate of hit (world coordinates)}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|NOT_IN_WORLD |World request made while not connected to a world server}}&lt;br /&gt;
|behavior=&lt;br /&gt;
* Upon successfully clicking an avatar, {{sdk event|AVATAR_CLICK}} is sent to those who have subscribed to it.  See {{sdk method|event_set}}.&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk event|AVATAR_CLICK}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4929</id>
		<title>Vp friend delete</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4929"/>
		<updated>2018-07-31T21:00:41Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friend_delete|Delete a user from the friend list.&lt;br /&gt;
|paramex=friend_user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|friend_user_id|User id of user to delete}}&lt;br /&gt;
|attributes=&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_in_universe|Universe request made while not connected to a universe server}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friends_get}}&lt;br /&gt;
* {{sdk method|friend_add_by_name}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4928</id>
		<title>Vp friend delete</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4928"/>
		<updated>2018-07-31T21:00:14Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added missing reason code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friend_delete|Delete a user from the friend list.&lt;br /&gt;
|paramex=friend_user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|friend_user_id|User id of user to delete}}&lt;br /&gt;
|attributes=&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|not_in_universe|Universe request made while not connected to a universe server&lt;br /&gt;
|returnattributes=&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friends_get}}&lt;br /&gt;
* {{sdk method|friend_add_by_name}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_user_attributes_by_id&amp;diff=4927</id>
		<title>Vp user attributes by id</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_user_attributes_by_id&amp;diff=4927"/>
		<updated>2018-07-30T23:31:22Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added warning about failed requests&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|user_attributes_by_id|Request user attributes by user ID.&lt;br /&gt;
|paramex=user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int |user_id |User id}}&lt;br /&gt;
|returncodes=&lt;br /&gt;
|behavior=&lt;br /&gt;
The user attributes will be returned in the {{sdk event|USER_ATTRIBUTES}} event. See {{sdk method|event_set}}.&lt;br /&gt;
|caveats=&lt;br /&gt;
If the request fails then there will be no response from the server (e.g. if the user id doesn&#039;t exist).&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void handle_user_attributes(VPInstance sdk)&lt;br /&gt;
{&lt;br /&gt;
  int user_id;&lt;br /&gt;
  const char *name;&lt;br /&gt;
&lt;br /&gt;
  user_id = vp_int(sdk, VP_USER_ID);&lt;br /&gt;
  name = vp_string(sdk, VP_USER_NAME);&lt;br /&gt;
&lt;br /&gt;
  if (user_id == vp_int(sdk, VP_MY_USER_ID))&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;The name of my owner is \&amp;quot;%s\&amp;quot;\n&amp;quot;, name);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, const char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  //...&lt;br /&gt;
&lt;br /&gt;
  vp_event_set(sdk, VP_EVENT_USER_ATTRIBUTES, handle_user_attributes);&lt;br /&gt;
  vp_user_attributes_by_id(sdk, vp_int(sdk, VP_MY_USER_ID));&lt;br /&gt;
&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk event|USER_ATTRIBUTES}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4926</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4926"/>
		<updated>2018-07-30T23:11:51Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Missing reference parameter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code, int reference) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Sent to the client in response to {{sdk_method|{{{1|unknown}}}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Return_code&amp;diff=4925</id>
		<title>Return code</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Return_code&amp;diff=4925"/>
		<updated>2018-07-30T21:47:18Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;1&amp;quot; width=100%&lt;br /&gt;
|-&lt;br /&gt;
!Reason code&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_SUCCESS&amp;quot;&lt;br /&gt;
|VP_RC_SUCCESS&lt;br /&gt;
|0&lt;br /&gt;
|Request has completed successfully&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_VERSION_MISMATCH&amp;quot;&lt;br /&gt;
|VP_RC_VERSION_MISMATCH&lt;br /&gt;
|1&lt;br /&gt;
|VP.h and the SDK library are from different builds&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_INITIALIZED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_INITIALIZED&lt;br /&gt;
|2&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_ALREADY_INITIALIZED&amp;quot;&lt;br /&gt;
|VP_RC_ALREADY_INITIALIZED&lt;br /&gt;
|3&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_STRING_TOO_LONG&amp;quot;&lt;br /&gt;
|VP_RC_STRING_TOO_LONG&lt;br /&gt;
|4&lt;br /&gt;
|If any of the given string parameters exceed the maximum length for the operation (when using UTF-8 encoded characters they can each be multiple bytes long)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVALID_LOGIN&amp;quot;&lt;br /&gt;
|VP_RC_INVALID_LOGIN &lt;br /&gt;
|5&lt;br /&gt;
|Incorrect username of password&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_WORLD_NOT_FOUND&amp;quot;&lt;br /&gt;
|VP_RC_WORLD_NOT_FOUND&lt;br /&gt;
|6&lt;br /&gt;
|No such world is connected to the universe&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_WORLD_LOGIN_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_WORLD_LOGIN_ERROR&lt;br /&gt;
|7&lt;br /&gt;
|Could not enter world (e.g. incorrect world address configured) or banned (not yet implemented)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IN_WORLD&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IN_WORLD&lt;br /&gt;
|8&lt;br /&gt;
|World request made while not connected to a world server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_CONNECTION_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_CONNECTION_ERROR&lt;br /&gt;
|9&lt;br /&gt;
|Unable to connect to universe, or waiting for events failed&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_INSTANCE&amp;quot;&lt;br /&gt;
|VP_RC_NO_INSTANCE&lt;br /&gt;
|10&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IMPLEMENTED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IMPLEMENTED&lt;br /&gt;
|11&lt;br /&gt;
|Requested operation is not implemented for bots (only available in the browser)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_ATTRIBUTE&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_ATTRIBUTE&lt;br /&gt;
|12&lt;br /&gt;
|Invalid attribute (has an enum value that is out of range)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_ALLOWED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_ALLOWED&lt;br /&gt;
|13&lt;br /&gt;
|Not allowed to perform the requested operation&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_DATABASE_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_DATABASE_ERROR&lt;br /&gt;
|14&lt;br /&gt;
|Unspecified database error&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_USER&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_USER&lt;br /&gt;
|15&lt;br /&gt;
|No user with a matching user id (or name) was found&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_TIMEOUT&amp;quot;&lt;br /&gt;
|VP_RC_TIMEOUT&lt;br /&gt;
|16&lt;br /&gt;
|It took too long to receive a response from the server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IN_UNIVERSE&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IN_UNIVERSE&lt;br /&gt;
|17&lt;br /&gt;
|Universe request made while not connected to a universe server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVALID_ARGUMENTS&amp;quot;&lt;br /&gt;
|VP_RC_INVALID_ARGUMENTS&lt;br /&gt;
|18&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_OBJECT_NOT_FOUND&amp;quot;&lt;br /&gt;
|VP_RC_OBJECT_NOT_FOUND&lt;br /&gt;
|19&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_UNKNOWN_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_UNKNOWN_ERROR&lt;br /&gt;
|20&lt;br /&gt;
|Unknown error&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_RECURSIVE_WAIT&amp;quot;&lt;br /&gt;
|VP_RC_RECURSIVE_WAIT&lt;br /&gt;
|21&lt;br /&gt;
|{{sdk method|wait}} was called recursively on the same instance&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_JOIN_DECLINED&amp;quot;&lt;br /&gt;
|VP_RC_JOIN_DECLINED&lt;br /&gt;
|22&lt;br /&gt;
|Join request was declined&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_SECURE_CONNECTION_REQUIRED&amp;quot;&lt;br /&gt;
|VP_RC_SECURE_CONNECTION_REQUIRED&lt;br /&gt;
|23&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_HANDSHAKE_FAILED&amp;quot;&lt;br /&gt;
|VP_RC_HANDSHAKE_FAILED&lt;br /&gt;
|24&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_VERIFICATION_FAILED&amp;quot;&lt;br /&gt;
|VP_RC_VERIFICATION_FAILED&lt;br /&gt;
|25&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_SESSION&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_SESSION&lt;br /&gt;
|26&lt;br /&gt;
|No user with the specified session is currently connected to the universe&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_SUPPORTED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_SUPPORTED&lt;br /&gt;
|27&lt;br /&gt;
|Operation is not supported for this instance&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVITE_DECLINED&amp;quot;&lt;br /&gt;
|VP_RC_INVITE_DECLINED&lt;br /&gt;
|28&lt;br /&gt;
|Invite request was declined&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lists]]&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4924</id>
		<title>Vp friend delete</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Vp_friend_delete&amp;diff=4924"/>
		<updated>2018-07-30T21:38:14Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: User id is passed, not name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk method page|friend_delete|Delete a user from the friend list.&lt;br /&gt;
|paramex=friend_user_id&lt;br /&gt;
|parameters=&lt;br /&gt;
  {{sdk parameter row|int|friend_user_id|User id of user to delete}}&lt;br /&gt;
|attributes=&lt;br /&gt;
|returncodes=&lt;br /&gt;
|returnattributes=&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|friends_get}}&lt;br /&gt;
* {{sdk method|friend_add_by_name}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4923</id>
		<title>VP CALLBACK LOGIN</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4923"/>
		<updated>2018-07-30T21:17:12Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Removed reason codes that aren&amp;#039;t passed to callback&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk callback page|login&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|string_too_long |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|invalid_login   |The login credentials are incorrect}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4922</id>
		<title>VP CALLBACK LOGIN</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4922"/>
		<updated>2018-07-30T21:14:49Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Changed template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk callback page|login&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|string_too_long |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|invalid_login   |The login credentials are incorrect}}&lt;br /&gt;
  {{sdk return code row|timeout         |Timeout}}&lt;br /&gt;
  {{sdk return code row|not_in_universe |Bot is not currently connected to universe}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4921</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4921"/>
		<updated>2018-07-30T21:13:43Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Sent to the client in response to {{sdk_method|{{{1|unknown}}}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4920</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4920"/>
		<updated>2018-07-30T21:05:51Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name|Callback description&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4919</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4919"/>
		<updated>2018-07-30T21:02:59Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Undo revision 4918 by Sleepy E (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
{{{reasoncodes|This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name|Callback description&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4918</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4918"/>
		<updated>2018-07-30T21:02:33Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
{{{returns|This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name|Callback description&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4917</id>
		<title>VP CALLBACK LOGIN</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4917"/>
		<updated>2018-07-30T20:58:46Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Changed naming&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk callback page|login|Sent to the client from a call to {{sdk method|login}}.&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|string_too_long |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|invalid_login   |The login credentials are incorrect}}&lt;br /&gt;
  {{sdk return code row|timeout         |Timeout}}&lt;br /&gt;
  {{sdk return code row|not_in_universe |Bot is not currently connected to universe}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|login}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4916</id>
		<title>Template:Sdk callback page</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Template:Sdk_callback_page&amp;diff=4916"/>
		<updated>2018-07-30T20:57:41Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added callback page template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; width: 400px; {{box-sizing}} {{bg linearfade|color={{{color|204,100%,90%}}}}}; padding: 32px 16px 16px 16px; border-radius: 0px 0px 16px 16px;&amp;quot;&amp;gt;&#039;&#039;&#039;Callback set and handler snippet&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code style=&amp;quot;display: block; padding: 8px; margin: 8px 0px; border: 1px dashed hsl(204,100%,70%);&amp;quot;&amp;gt;vp_callback_set(instance, VP_CALLBACK_{{uc:{{{1|unknown}}}}}, callback_{{lc:{{{1|unknown}}}}});&lt;br /&gt;
&lt;br /&gt;
void callback_{{lc:{{{1|unknown}}}}}(VPInstance instance, int reason_code) { }&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{2}}}__NOTOC__&lt;br /&gt;
== Reason code ==__NOEDITSECTION__&lt;br /&gt;
{{{reasoncodes|This callback is passed a [[return code]] integer, which indicates whether the request was successful ({{code|0}}) or errored for any of these reasons:&lt;br /&gt;
{{sdk return code table|{{{reasoncodes|}}}}}&lt;br /&gt;
== Return attributes ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{returnattributes|}}} | {{sdk attribute table|{{{returnattributes}}}}} |:&#039;&#039;No attributes are returned in this callback&#039;&#039;}}&lt;br /&gt;
== Behavior ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{behavior|}}} | {{{behavior}}} |:&#039;&#039;There is no special behavior for this callback&#039;&#039;}}&lt;br /&gt;
{{#if: {{{caveats|}}} |== Caveats ==__NOEDITSECTION__&lt;br /&gt;
{{{caveats}}} |}}&lt;br /&gt;
== Examples ==__NOEDITSECTION__&lt;br /&gt;
{{#if: {{{examples|}}} | {{{examples}}} |:&#039;&#039;This callback has no usage examples; please add at least one to [{{canonicalurl:{{FULLPAGENAMEE}}|action=edit}} this page]&#039;&#039;}}&lt;br /&gt;
{{#if: {{{seealso|}}} |== See also ==__NOEDITSECTION__&lt;br /&gt;
{{{seealso}}}&lt;br /&gt;
|}}{{{extra|}}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{DEFAULTSORT:{{{1}}}}} {{DISPLAYTITLE:VP_CALLBACK_{{uc:{{{1}}}}}}} {{{category|[[Category:SDK callbacks]]}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;{{sdk callback page|Callback name|Callback description&lt;br /&gt;
|reasoncodes=&lt;br /&gt;
  {{sdk return code row|name|cause}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|type|name|description}}&lt;br /&gt;
|behavior=&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Subpage templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4915</id>
		<title>VP CALLBACK LOGIN</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=VP_CALLBACK_LOGIN&amp;diff=4915"/>
		<updated>2018-07-30T20:39:22Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Starting to work on callback page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sdk callback page|login|Sent to the client from a call to {{sdk method|login}}.&lt;br /&gt;
|returncodes=&lt;br /&gt;
  {{sdk return code row|string_too_long |If any of the given string parameters exceed 255 bytes in length (when using UTF-8 encoded characters they can each be multiple bytes long)}}&lt;br /&gt;
  {{sdk return code row|invalid_login   |The login credentials are incorrect}}&lt;br /&gt;
  {{sdk return code row|timeout         |Timeout}}&lt;br /&gt;
  {{sdk return code row|not_in_universe |Bot is not currently connected to universe}}&lt;br /&gt;
|returnattributes=&lt;br /&gt;
  {{sdk attribute row|int|my_user_id|User id of account used to log in}}&lt;br /&gt;
|examples=&lt;br /&gt;
|seealso=&lt;br /&gt;
* {{sdk method|login}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
	<entry>
		<id>https://wiki.virtualparadise.org/index.php?title=Return_code&amp;diff=4914</id>
		<title>Return code</title>
		<link rel="alternate" type="text/html" href="https://wiki.virtualparadise.org/index.php?title=Return_code&amp;diff=4914"/>
		<updated>2018-07-30T20:06:47Z</updated>

		<summary type="html">&lt;p&gt;Sleepy E: Added reason code for declined invites&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;1&amp;quot; width=100%&lt;br /&gt;
|-&lt;br /&gt;
!Reason code&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_SUCCESS&amp;quot;&lt;br /&gt;
|VP_RC_SUCCESS&lt;br /&gt;
|0&lt;br /&gt;
|Request has completed successfully&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_VERSION_MISMATCH&amp;quot;&lt;br /&gt;
|VP_RC_VERSION_MISMATCH&lt;br /&gt;
|1&lt;br /&gt;
|VP.h and the SDK library are from different builds&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_INITIALIZED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_INITIALIZED&lt;br /&gt;
|2&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_ALREADY_INITIALIZED&amp;quot;&lt;br /&gt;
|VP_RC_ALREADY_INITIALIZED&lt;br /&gt;
|3&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_STRING_TOO_LONG&amp;quot;&lt;br /&gt;
|VP_RC_STRING_TOO_LONG&lt;br /&gt;
|4&lt;br /&gt;
|If any of the given string parameters exceed the maximum length for the operation (when using UTF-8 encoded characters they can each be multiple bytes long)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVALID_LOGIN&amp;quot;&lt;br /&gt;
|VP_RC_INVALID_LOGIN &lt;br /&gt;
|5&lt;br /&gt;
|Incorrect username of password&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_WORLD_NOT_FOUND&amp;quot;&lt;br /&gt;
|VP_RC_WORLD_NOT_FOUND&lt;br /&gt;
|6&lt;br /&gt;
|No such world is connected to the universe&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_WORLD_LOGIN_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_WORLD_LOGIN_ERROR&lt;br /&gt;
|7&lt;br /&gt;
|Could not enter world (e.g. incorrect world address configured) or banned (not yet implemented)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IN_WORLD&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IN_WORLD&lt;br /&gt;
|8&lt;br /&gt;
|World request made while not connected to a world server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_CONNECTION_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_CONNECTION_ERROR&lt;br /&gt;
|9&lt;br /&gt;
|Unable to connect to universe, or waiting for events failed&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_INSTANCE&amp;quot;&lt;br /&gt;
|VP_RC_NO_INSTANCE&lt;br /&gt;
|10&lt;br /&gt;
|No longer used&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IMPLEMENTED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IMPLEMENTED&lt;br /&gt;
|11&lt;br /&gt;
|Requested operation is not implemented for bots (only available in the browser)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_ATTRIBUTE&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_ATTRIBUTE&lt;br /&gt;
|12&lt;br /&gt;
|Invalid attribute (has an enum value that is out of range)&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_ALLOWED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_ALLOWED&lt;br /&gt;
|13&lt;br /&gt;
|Not allowed to perform the requested operation&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_DATABASE_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_DATABASE_ERROR&lt;br /&gt;
|14&lt;br /&gt;
|Unspecified database error&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_USER&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_USER&lt;br /&gt;
|15&lt;br /&gt;
|No user with a matching user id (or name) was found&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_TIMEOUT&amp;quot;&lt;br /&gt;
|VP_RC_TIMEOUT&lt;br /&gt;
|16&lt;br /&gt;
|It took too long to receive a response from the server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_IN_UNIVERSE&amp;quot;&lt;br /&gt;
|VP_RC_NOT_IN_UNIVERSE&lt;br /&gt;
|17&lt;br /&gt;
|Universe request made while not connected to a universe server&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVALID_ARGUMENTS&amp;quot;&lt;br /&gt;
|VP_RC_INVALID_ARGUMENTS&lt;br /&gt;
|18&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_OBJECT_NOT_FOUND&amp;quot;&lt;br /&gt;
|VP_RC_OBJECT_NOT_FOUND&lt;br /&gt;
|19&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_UNKNOWN_ERROR&amp;quot;&lt;br /&gt;
|VP_RC_UNKNOWN_ERROR&lt;br /&gt;
|20&lt;br /&gt;
|Unknown error&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_RECURSIVE_WAIT&amp;quot;&lt;br /&gt;
|VP_RC_RECURSIVE_WAIT&lt;br /&gt;
|21&lt;br /&gt;
|{{sdk method|wait}} was called recursively&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_JOIN_DECLINED&amp;quot;&lt;br /&gt;
|VP_RC_JOIN_DECLINED&lt;br /&gt;
|22&lt;br /&gt;
|Join request was declined&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_SECURE_CONNECTION_REQUIRED&amp;quot;&lt;br /&gt;
|VP_RC_SECURE_CONNECTION_REQUIRED&lt;br /&gt;
|23&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_HANDSHAKE_FAILED&amp;quot;&lt;br /&gt;
|VP_RC_HANDSHAKE_FAILED&lt;br /&gt;
|24&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_VERIFICATION_FAILED&amp;quot;&lt;br /&gt;
|VP_RC_VERIFICATION_FAILED&lt;br /&gt;
|25&lt;br /&gt;
|???&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NO_SUCH_SESSION&amp;quot;&lt;br /&gt;
|VP_RC_NO_SUCH_SESSION&lt;br /&gt;
|26&lt;br /&gt;
|No user with the specified session is currently connected to the universe&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_NOT_SUPPORTED&amp;quot;&lt;br /&gt;
|VP_RC_NOT_SUPPORTED&lt;br /&gt;
|27&lt;br /&gt;
|Operation is not supported for this instance&lt;br /&gt;
&lt;br /&gt;
|- id=&amp;quot;VP_RC_INVITE_DECLINED&amp;quot;&lt;br /&gt;
|VP_RC_INVITE_DECLINED&lt;br /&gt;
|28&lt;br /&gt;
|Invite request was declined&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lists]]&lt;/div&gt;</summary>
		<author><name>Sleepy E</name></author>
	</entry>
</feed>