<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://g1r-mp.com/wiki/index.php?action=history&amp;feed=atom&amp;title=World_objects</id>
	<title>World objects - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://g1r-mp.com/wiki/index.php?action=history&amp;feed=atom&amp;title=World_objects"/>
	<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_objects&amp;action=history"/>
	<updated>2026-09-30T00:16:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=999&amp;oldid=prev</id>
		<title>QCherry: Release 0.1.4 BUILD133 / Protocol 36 and document authenticated event origin</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=999&amp;oldid=prev"/>
		<updated>2026-09-21T20:41:09Z</updated>

		<summary type="html">&lt;p&gt;Release 0.1.4 BUILD133 / Protocol 36 and document authenticated event origin&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 20:41, 21 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= World objects =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= World objects =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Client-side; since 0.1.4 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(in development, not public 0.1.3)&lt;/del&gt;.&#039;&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Client-side; since 0.1.4.&#039;&#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[WorldObjects.request]] submits asynchronous commands for resource-owned static meshes. It is generic gameplay-resource API, not restricted to the map editor. There is no engine global named CreateModel or MapEditor.CreateObject; [[MapEditor helpers|MapEditor helpers]] are Lua functions inside the editor resource only.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[WorldObjects.request]] submits asynchronous commands for resource-owned static meshes. It is generic gameplay-resource API, not restricted to the map editor. There is no engine global named CreateModel or MapEditor.CreateObject; [[MapEditor helpers|MapEditor helpers]] are Lua functions inside the editor resource only.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l83&quot;&gt;Line 83:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 83:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Lifetime, limits and multiplayer ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Lifetime, limits and multiplayer ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;No fixed instance-count, pending-request-count or requests/second cap in this API since BUILD124 (0.1.4 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;development&lt;/del&gt;).&#039;&#039;&#039; The former 512 instances, 32 pending requests and 80 requests/second checks have been removed, not replaced with higher count caps. The editor and map_scene loader likewise no longer impose 500 objects.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;No fixed instance-count, pending-request-count or requests/second cap in this API since BUILD124 (0.1.4).&#039;&#039;&#039; The former 512 instances, 32 pending requests and 80 requests/second checks have been removed, not replaced with higher count caps. The editor and map_scene loader likewise no longer impose 500 objects.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Commands still encode to at most 4096 bytes and at most 16 owning resources are supported. Shared IPC transport queues remain bounded (256 frames per queue); a full queue can cause immediate request rejection even though the WorldObjects-specific pending-count ceiling is gone. Check false returns, pace submissions and await completion. Do not submit an entire huge scene in a tight loop: native mesh loading/creation runs on the game thread. The supplied loader continues to load sequentially. RAM/VRAM/CPU, asset complexity, Lua/resource memory and JSON document limits remain practical bounds, not a guarantee of unlimited performance.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Commands still encode to at most 4096 bytes and at most 16 owning resources are supported. Shared IPC transport queues remain bounded (256 frames per queue); a full queue can cause immediate request rejection even though the WorldObjects-specific pending-count ceiling is gone. Check false returns, pace submissions and await completion. Do not submit an entire huge scene in a tight loop: native mesh loading/creation runs on the game thread. The supplied loader continues to load sequentially. RAM/VRAM/CPU, asset complexity, Lua/resource memory and JSON document limits remain practical bounds, not a guarantee of unlimited performance.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=946&amp;oldid=prev</id>
		<title>QCherry: 0.1.4 BUILD124: remove fixed world-object count and request caps; document remaining data/transport bounds</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=946&amp;oldid=prev"/>
		<updated>2026-09-20T18:37:36Z</updated>

		<summary type="html">&lt;p&gt;0.1.4 BUILD124: remove fixed world-object count and request caps; document remaining data/transport bounds&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:37, 20 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l40&quot;&gt;Line 40:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 40:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Successful mutations return JSON containing their &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;; clear/lease return an empty JSON object. Successful traces return &amp;lt;code&amp;gt;{&amp;quot;hit&amp;quot;:false}&amp;lt;/code&amp;gt; or a hit containing &amp;lt;code&amp;gt;hit,x,y,z,nx,ny,nz,id&amp;lt;/code&amp;gt;. The coordinates are metres, normals unitless. A hit ID is populated only for a recognized object owned by the caller; it is empty for ordinary world surfaces or unrecognized/foreign instances. Do not access hit coordinates when hit=false. Traces depend on collision; use the editor hierarchy to select non-colliding objects.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Successful mutations return JSON containing their &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;; clear/lease return an empty JSON object. Successful traces return &amp;lt;code&amp;gt;{&amp;quot;hit&amp;quot;:false}&amp;lt;/code&amp;gt; or a hit containing &amp;lt;code&amp;gt;hit,x,y,z,nx,ny,nz,id&amp;lt;/code&amp;gt;. The coordinates are metres, normals unitless. A hit ID is populated only for a recognized object owned by the caller; it is empty for ordinary world surfaces or unrecognized/foreign instances. Do not access hit coordinates when hit=false. Traces depend on collision; use the editor hierarchy to select non-colliding objects.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Typical failure reasons include &amp;lt;code&amp;gt;world-not-ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;native-dependencies-pending&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mesh-load-or-spawn-failed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;id-already-exists&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-limit&lt;/del&gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;owner-limit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-invalid-or-transform-failed&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;raycast-unavailable&amp;lt;/code&amp;gt;. An unanswered host request reports &amp;lt;code&amp;gt;native-timeout&amp;lt;/code&amp;gt; after 10 seconds. A timeout does not prove a mutation was never applied: do not blindly retry it. Reconcile/reload the owned scene.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Typical failure reasons include &amp;lt;code&amp;gt;world-not-ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;native-dependencies-pending&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mesh-load-or-spawn-failed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;id-already-exists&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;owner-limit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-invalid-or-transform-failed&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;raycast-unavailable&amp;lt;/code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. The former fixed-count &amp;lt;code&amp;gt;object-limit&amp;lt;/code&amp;gt; failure is removed in BUILD124&lt;/ins&gt;. An unanswered host request reports &amp;lt;code&amp;gt;native-timeout&amp;lt;/code&amp;gt; after 10 seconds. A timeout does not prove a mutation was never applied: do not blindly retry it. Reconcile/reload the owned scene.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Example: complete create command ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Example: complete create command ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l83&quot;&gt;Line 83:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 83:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Lifetime, limits and multiplayer ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Lifetime, limits and multiplayer ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;There are at most &lt;/del&gt;512 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;native &lt;/del&gt;objects &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;across all owners on a client and 16 owning resources&lt;/del&gt;. Commands encode to at most 4096 bytes; the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;host allows 32 &lt;/del&gt;pending &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;object requests &lt;/del&gt;and &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;80 submissions per one-second rate window across resources&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Submit large scenes incrementally&lt;/del&gt;. The native ownership lease is 15 seconds and the host sends renewals every second. Stop/disconnect/world changes clear owned instances. Handle [[onClientWorldObjectsReset]] to discard stale IDs/pending state and reconstruct deliberately; the event has no arguments.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;No fixed instance-count, pending-request-count or requests/second cap in this API since BUILD124 (0.1.4 development).&#039;&#039;&#039; The former &lt;/ins&gt;512 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;instances, 32 pending requests and 80 requests/second checks have been removed, not replaced with higher count caps. The editor and map_scene loader likewise no longer impose 500 &lt;/ins&gt;objects.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Commands &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;still &lt;/ins&gt;encode to at most 4096 bytes &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;and at most 16 owning resources are supported. Shared IPC transport queues remain bounded (256 frames per queue)&lt;/ins&gt;; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a full queue can cause immediate request rejection even though &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;WorldObjects-specific &lt;/ins&gt;pending&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;-count ceiling is gone. Check false returns, pace submissions &lt;/ins&gt;and &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;await completion. Do not submit an entire huge scene in a tight loop: native mesh loading/creation runs on the game thread&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The supplied loader continues to load sequentially&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;RAM/VRAM/CPU, asset complexity, Lua/resource memory and JSON document limits remain practical bounds, not a guarantee of unlimited performance.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The native ownership lease is 15 seconds and the host sends renewals every second. Stop/disconnect/world changes clear owned instances. Handle [[onClientWorldObjectsReset]] to discard stale IDs/pending state and reconstruct deliberately; the event has no arguments&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. Readiness, ownership, duplicate-ID checks, validation and timeout/cleanup safety have not been removed&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This API creates client-local static actors, not synchronized interactive doors, inventory items, server collision geometry or networked physics. Sending the same trusted static map resource to every player, as map_scene does, reconstructs the same layout for late joiners. Dynamic multiplayer edits require their own server-authorized state distribution.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This API creates client-local static actors, not synchronized interactive doors, inventory items, server collision geometry or networked physics. Sending the same trusted static map resource to every player, as map_scene does, reconstructs the same layout for late joiners. Dynamic multiplayer edits require their own server-authorized state distribution.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Lua API]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Lua API]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
	<entry>
		<id>https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=934&amp;oldid=prev</id>
		<title>QCherry: Document Map Editor, saved maps, static scene deployment and Lua APIs since 0.1.4</title>
		<link rel="alternate" type="text/html" href="https://g1r-mp.com/wiki/index.php?title=World_objects&amp;diff=934&amp;oldid=prev"/>
		<updated>2026-09-20T18:19:37Z</updated>

		<summary type="html">&lt;p&gt;Document Map Editor, saved maps, static scene deployment and Lua APIs since 0.1.4&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= World objects =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Client-side; since 0.1.4 (in development, not public 0.1.3).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[WorldObjects.request]] submits asynchronous commands for resource-owned static meshes. It is generic gameplay-resource API, not restricted to the map editor. There is no engine global named CreateModel or MapEditor.CreateObject; [[MapEditor helpers|MapEditor helpers]] are Lua functions inside the editor resource only.&lt;br /&gt;
&lt;br /&gt;
== Function and events ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
requestIdOrFalse = WorldObjects.request(command)&lt;br /&gt;
-- Events on the calling resource:&lt;br /&gt;
-- onClientWorldObjectResult(requestId, ok, reason, json)&lt;br /&gt;
-- onClientWorldObjectsReset()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supply a table. A numeric request ID means &amp;#039;&amp;#039;&amp;#039;queued&amp;#039;&amp;#039;&amp;#039;, not spawned/applied. &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; means immediate validation/readiness/capacity/IPC rejection. Match the ID in [[onClientWorldObjectResult]] before committing Lua state. The result&amp;#039;s JSON argument is a &amp;#039;&amp;#039;&amp;#039;string&amp;#039;&amp;#039;&amp;#039;; decode it with &amp;lt;code&amp;gt;fromJSON&amp;lt;/code&amp;gt;. Never expose native pointers to Lua.&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! op !! Required fields and effect&lt;br /&gt;
|-&lt;br /&gt;
| create || &amp;lt;code&amp;gt;id, mesh, x,y,z, pitch,yaw,roll, sx,sy,sz, hidden,collision,selected&amp;lt;/code&amp;gt;. Creates a new instance; an existing ID fails with id-already-exists.&lt;br /&gt;
|-&lt;br /&gt;
| update || &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, all nine transform numbers and all three booleans. Updates an existing instance. &amp;#039;&amp;#039;&amp;#039;Full state, not a partial patch.&amp;#039;&amp;#039;&amp;#039; Does not replace the mesh: delete/create to change the asset.&lt;br /&gt;
|-&lt;br /&gt;
| delete || &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. Removes the caller&amp;#039;s instance; an absent ID also succeeds.&lt;br /&gt;
|-&lt;br /&gt;
| clear || Only &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Removes all instances owned by the calling resource, never original world actors or another resource&amp;#039;s objects.&lt;br /&gt;
|-&lt;br /&gt;
| pick || &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Traces from the native player-controller view through the OS cursor, up to 1000 m. Requires usable game focus/viewport.&lt;br /&gt;
|-&lt;br /&gt;
| raycast || &amp;lt;code&amp;gt;x,y,z,tx,ty,tz&amp;lt;/code&amp;gt;, start and end in metres, length at most 1000 m.&lt;br /&gt;
|-&lt;br /&gt;
| lease || Only &amp;lt;code&amp;gt;op&amp;lt;/code&amp;gt;. Registers/renews ownership without creating a mesh; the host also renews ownership automatically.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Object IDs: 1-64 ASCII letters, digits, underscores or hyphens, scoped to the calling resource. Mesh must be a valid installed static-mesh object path like &amp;lt;code&amp;gt;/Game/Directory/Asset.Asset&amp;lt;/code&amp;gt;, at most 512 characters, not an OBJ filename or filesystem path. The editor additionally restricts choices to its shipped catalog. A syntactically valid path can still fail to load.&lt;br /&gt;
&lt;br /&gt;
Position: metres, each coordinate +/-100000. Rotation: pitch/yaw/roll in degrees, each +/-36000. Scale: sx/sy/sz in [0.01,100]. All numbers must be finite. The three booleans are required even when false. &amp;lt;code&amp;gt;selected&amp;lt;/code&amp;gt; requests custom-depth selection presentation; it does not guarantee an outline without matching post-processing. Names and editor locks belong to the Lua document, not the native command schema.&lt;br /&gt;
&lt;br /&gt;
== Result contract ==&lt;br /&gt;
Successful mutations return JSON containing their &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;; clear/lease return an empty JSON object. Successful traces return &amp;lt;code&amp;gt;{&amp;quot;hit&amp;quot;:false}&amp;lt;/code&amp;gt; or a hit containing &amp;lt;code&amp;gt;hit,x,y,z,nx,ny,nz,id&amp;lt;/code&amp;gt;. The coordinates are metres, normals unitless. A hit ID is populated only for a recognized object owned by the caller; it is empty for ordinary world surfaces or unrecognized/foreign instances. Do not access hit coordinates when hit=false. Traces depend on collision; use the editor hierarchy to select non-colliding objects.&lt;br /&gt;
&lt;br /&gt;
Typical failure reasons include &amp;lt;code&amp;gt;world-not-ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;native-dependencies-pending&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mesh-load-or-spawn-failed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;id-already-exists&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-limit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;owner-limit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object-invalid-or-transform-failed&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;raycast-unavailable&amp;lt;/code&amp;gt;. An unanswered host request reports &amp;lt;code&amp;gt;native-timeout&amp;lt;/code&amp;gt; after 10 seconds. A timeout does not prove a mutation was never applied: do not blindly retry it. Reconcile/reload the owned scene.&lt;br /&gt;
&lt;br /&gt;
== Example: complete create command ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function requestMesh(meshPath, x, y, z)&lt;br /&gt;
    return WorldObjects.request({&lt;br /&gt;
        op=&amp;quot;create&amp;quot;, id=&amp;quot;example_rock&amp;quot;, mesh=meshPath,&lt;br /&gt;
        x=x, y=y, z=z, pitch=0, yaw=0, roll=0,&lt;br /&gt;
        sx=1, sy=1, sz=1,&lt;br /&gt;
        hidden=false, collision=true, selected=false&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
-- Supply an actual installed mesh path and your desired coordinates.&lt;br /&gt;
-- Call after gameplay readiness; wait for onClientWorldObjectResult.&lt;br /&gt;
-- Reusing example_rock while it exists fails: assign unique IDs per instance.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example: asynchronous deletion ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local pending = {}&lt;br /&gt;
addEventHandler(&amp;quot;onClientWorldObjectResult&amp;quot;, resourceRoot,&lt;br /&gt;
    function(requestId, ok, reason, json)&lt;br /&gt;
        local id = pending[requestId]&lt;br /&gt;
        if not id then return end&lt;br /&gt;
        pending[requestId] = nil&lt;br /&gt;
        if ok then&lt;br /&gt;
            outputDebugString(&amp;quot;Deleted owned object: &amp;quot; .. id)&lt;br /&gt;
        else&lt;br /&gt;
            outputDebugString(&amp;quot;Delete not confirmed: &amp;quot; .. tostring(reason), 1)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
function deleteOwnedObject(id)&lt;br /&gt;
    local requestId = WorldObjects.request({op=&amp;quot;delete&amp;quot;, id=id})&lt;br /&gt;
    if not requestId then return false end&lt;br /&gt;
    pending[requestId] = id&lt;br /&gt;
    return true -- accepted only; completion is handled above&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For full scene creation, use the supplied &amp;lt;code&amp;gt;map_scene/client.lua&amp;lt;/code&amp;gt; loader and [[Map scene deployment]]. It includes startup readiness retries and reconstruction, which a one-shot on-start create call would miss.&lt;br /&gt;
&lt;br /&gt;
== Lifetime, limits and multiplayer ==&lt;br /&gt;
There are at most 512 native objects across all owners on a client and 16 owning resources. Commands encode to at most 4096 bytes; the host allows 32 pending object requests and 80 submissions per one-second rate window across resources. Submit large scenes incrementally. The native ownership lease is 15 seconds and the host sends renewals every second. Stop/disconnect/world changes clear owned instances. Handle [[onClientWorldObjectsReset]] to discard stale IDs/pending state and reconstruct deliberately; the event has no arguments.&lt;br /&gt;
&lt;br /&gt;
This API creates client-local static actors, not synchronized interactive doors, inventory items, server collision geometry or networked physics. Sending the same trusted static map resource to every player, as map_scene does, reconstructs the same layout for late joiners. Dynamic multiplayer edits require their own server-authorized state distribution.&lt;br /&gt;
[[Category:Lua API]]&lt;/div&gt;</summary>
		<author><name>QCherry</name></author>
	</entry>
</feed>