Updated HTML docs

This commit is contained in:
Griatch 2021-07-23 00:25:23 +02:00
parent 86c930be7a
commit 0639066d17
121 changed files with 16949 additions and 511 deletions

View file

@ -46,6 +46,7 @@
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.db.models</span> <span class="kn">import</span> <span class="n">Q</span><span class="p">,</span> <span class="n">Min</span><span class="p">,</span> <span class="n">Max</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">InterruptCommand</span>
<span class="kn">from</span> <span class="nn">evennia.objects.models</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.locks.lockhandler</span> <span class="kn">import</span> <span class="n">LockException</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdhandler</span> <span class="kn">import</span> <span class="n">get_and_merge_cmdsets</span>
@ -1529,40 +1530,33 @@
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">exit_obj</span></div>
<div class="viewcode-block" id="CmdOpen.parse"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: open &lt;new exit&gt;[;alias...][:typeclass]&quot;</span>
<span class="s2">&quot;[,&lt;return exit&gt;[;alias..][:typeclass]]] &quot;</span>
<span class="s2">&quot;= &lt;destination&gt;&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You cannot create an exit from a None-location.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span></div>
<div class="viewcode-block" id="CmdOpen.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdOpen.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is where the processing starts.</span>
<span class="sd"> Uses the ObjManipCommand.parser() for pre-processing</span>
<span class="sd"> as well as the self.create_exit() method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Usage: open &lt;new exit&gt;[;alias...][:typeclass][,&lt;return exit&gt;[;alias..][:typeclass]]] &quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;= &lt;destination&gt;&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># We must have a location to open an exit</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">location</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You cannot create an exit from a None-location.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># obtain needed info from cmdline</span>
<span class="n">exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="n">dest_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="c1"># first, check so the destination exists.</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">dest_name</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># Create exit</span>
<span class="n">ok</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">exit_aliases</span><span class="p">,</span> <span class="n">exit_typeclass</span><span class="p">)</span>
<span class="n">ok</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exit_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_aliases</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_typeclass</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ok</span><span class="p">:</span>
<span class="c1"># an error; the exit was not created, so we quit.</span>
<span class="k">return</span>
@ -1571,9 +1565,8 @@
<span class="n">back_exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="n">back_exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="n">back_exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span>
<span class="n">back_exit_name</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">back_exit_aliases</span><span class="p">,</span> <span class="n">back_exit_typeclass</span>
<span class="p">)</span></div></div>
<span class="bp">self</span><span class="o">.</span><span class="n">create_exit</span><span class="p">(</span><span class="n">back_exit_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">,</span> <span class="n">back_exit_aliases</span><span class="p">,</span>
<span class="n">back_exit_typeclass</span><span class="p">)</span></div></div>
<span class="k">def</span> <span class="nf">_convert_from_string</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">strobj</span><span class="p">):</span>
@ -3023,28 +3016,37 @@
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(teleport) or perm(Builder)&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;Building&quot;</span>
<div class="viewcode-block" id="CmdTeleport.parse"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTeleport.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Breaking out searching here to make this easier to override.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="CmdTeleport.func"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdTeleport.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Performs the teleport&quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">lhs</span><span class="p">,</span> <span class="n">rhs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span>
<span class="n">switches</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span>
<span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span>
<span class="c1"># setting switches</span>
<span class="n">tel_quietly</span> <span class="o">=</span> <span class="s2">&quot;quiet&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="n">to_none</span> <span class="o">=</span> <span class="s2">&quot;tonone&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="n">to_loc</span> <span class="o">=</span> <span class="s2">&quot;loc&quot;</span> <span class="ow">in</span> <span class="n">switches</span>
<span class="k">if</span> <span class="n">to_none</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;tonone&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="c1"># teleporting to None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">destination</span><span class="p">:</span>
<span class="c1"># in this case lhs is always the object to teleport</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">destination</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="s2">&quot;Cannot teleport a puppeted object &quot;</span>
@ -3053,57 +3055,54 @@
<span class="p">)</span>
<span class="k">return</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported </span><span class="si">%s</span><span class="s2"> -&gt; None-location.&quot;</span> <span class="o">%</span> <span class="n">obj_to_teleport</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">tel_quietly</span><span class="p">:</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="s2">&quot;quiet&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> teleported </span><span class="si">%s</span><span class="s2"> into nothingness.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="n">obj_to_teleport</span><span class="p">),</span> <span class="n">exclude</span><span class="o">=</span><span class="n">caller</span>
<span class="p">)</span>
<span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="c1"># not teleporting to None location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">to_none</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: teleport[/switches] [&lt;obj&gt; =] &lt;target_loc&gt;||home&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">rhs</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="n">caller</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: teleport[/switches] [&lt;obj&gt; =] &lt;target or (X,Y,Z)&gt;||home&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Destination not found.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">to_loc</span><span class="p">:</span>
<span class="k">if</span> <span class="s2">&quot;loc&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Destination has no location.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You can&#39;t teleport an object inside of itself!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">destination</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You can&#39;t teleport an object inside something it holds!&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="o">==</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> is already at </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj_to_teleport</span><span class="p">,</span> <span class="n">destination</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">use_destination</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="s2">&quot;intoexit&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">:</span>
<span class="n">use_destination</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># try the teleport</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span>
<span class="n">destination</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="n">tel_quietly</span><span class="p">,</span> <span class="n">emit_to_obj</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">use_destination</span><span class="o">=</span><span class="n">use_destination</span>
<span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="c1"># teleporting from none-location</span>
<span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="n">destination</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Teleported </span><span class="si">{</span><span class="n">obj_to_teleport</span><span class="si">}</span><span class="s2"> None -&gt; </span><span class="si">{</span><span class="n">destination</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">obj_to_teleport</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span>
<span class="n">destination</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="s2">&quot;quiet&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">,</span>
<span class="n">emit_to_obj</span><span class="o">=</span><span class="n">caller</span><span class="p">,</span> <span class="n">use_destination</span><span class="o">=</span><span class="s2">&quot;intoexit&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">switches</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj_to_teleport</span> <span class="o">==</span> <span class="n">caller</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported to </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">destination</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Teleported to </span><span class="si">{</span><span class="n">destination</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleported </span><span class="si">%s</span><span class="s2"> -&gt; </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj_to_teleport</span><span class="p">,</span> <span class="n">destination</span><span class="p">))</span></div></div>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Teleported </span><span class="si">{</span><span class="n">obj_to_teleport</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">{</span><span class="n">destination</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Teleportation failed.&quot;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdScript"><a class="viewcode-back" href="../../../../api/evennia.commands.default.building.html#evennia.commands.default.building.CmdScript">[docs]</a><span class="k">class</span> <span class="nc">CmdScript</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>

View file

@ -125,7 +125,10 @@
<span class="n">target</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">((</span><span class="n">caller</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="n">target</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;look&quot;</span><span class="p">}),</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></div></div>
<span class="n">desc</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
<span class="c1"># add the type=look to the outputfunc to make it</span>
<span class="c1"># easy to separate this output in client.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">desc</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;look&quot;</span><span class="p">}),</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdNick"><a class="viewcode-back" href="../../../../api/evennia.commands.default.general.html#evennia.commands.default.general.CmdNick">[docs]</a><span class="k">class</span> <span class="nc">CmdNick</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>

View file

@ -649,8 +649,8 @@
<div class="viewcode-block" id="TestCmdTasks.test_active_task"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_active_task">[docs]</a> <span class="k">def</span> <span class="nf">test_active_task</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ptrn</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;Task ID&#39;</span><span class="p">,</span> <span class="s1">&#39;Completion Date&#39;</span><span class="p">,</span> <span class="s1">&#39;Function&#39;</span><span class="p">,</span> <span class="s1">&#39;KWARGS&#39;</span><span class="p">,</span> <span class="s1">&#39;persisten&#39;</span><span class="p">,</span>
<span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\d+/\d+/\d+&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\d+\:\d+\:\d+&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;ms\:\d+&#39;</span><span class="p">,</span> <span class="s1">&#39;func_test&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="k">for</span> <span class="n">ptrn</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;Task ID&#39;</span><span class="p">,</span> <span class="s1">&#39;Completion&#39;</span><span class="p">,</span> <span class="s1">&#39;Date&#39;</span><span class="p">,</span> <span class="s1">&#39;Function&#39;</span><span class="p">,</span> <span class="s1">&#39;KWARGS&#39;</span><span class="p">,</span> <span class="s1">&#39;persisten&#39;</span><span class="p">,</span>
<span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\d+/\d+/\d+&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\d+\:&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\d+\:\d+&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\:\d+&#39;</span><span class="p">,</span> <span class="s1">&#39;func_test&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="s1">&#39;False&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="n">ptrn</span><span class="p">)</span></div>
@ -663,18 +663,18 @@
<div class="viewcode-block" id="TestCmdTasks.test_pause_unpause"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_pause_unpause">[docs]</a> <span class="k">def</span> <span class="nf">test_pause_unpause</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># test pause</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/pause </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, pause task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Pause task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">paused</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">task_handler</span><span class="o">.</span><span class="n">clock</span><span class="o">.</span><span class="n">advance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timedelay</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># test unpause</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/unpause </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">exists</span><span class="p">())</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, unpause task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Unpause task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="c1"># verify task continues after unpause</span>
<span class="bp">self</span><span class="o">.</span><span class="n">task_handler</span><span class="o">.</span><span class="n">clock</span><span class="o">.</span><span class="n">advance</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
@ -682,25 +682,25 @@
<div class="viewcode-block" id="TestCmdTasks.test_do_task"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_do_task">[docs]</a> <span class="k">def</span> <span class="nf">test_do_task</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/do_task </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, do_task task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Do_task task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">exists</span><span class="p">())</span></div>
<div class="viewcode-block" id="TestCmdTasks.test_remove"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_remove">[docs]</a> <span class="k">def</span> <span class="nf">test_remove</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/remove </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, remove task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Remove task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">exists</span><span class="p">())</span></div>
<div class="viewcode-block" id="TestCmdTasks.test_call"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_call">[docs]</a> <span class="k">def</span> <span class="nf">test_call</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/call </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, call task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Call task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="c1"># make certain the task is still active</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">active</span><span class="p">())</span>
@ -710,9 +710,9 @@
<div class="viewcode-block" id="TestCmdTasks.test_cancel"><a class="viewcode-back" href="../../../../api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestCmdTasks.test_cancel">[docs]</a> <span class="k">def</span> <span class="nf">test_cancel</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;/cancel </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">get_id</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Yes or No, cancel task 1? With completion date&#39;</span>
<span class="n">wanted_msg</span> <span class="o">=</span> <span class="s1">&#39;Cancel task 1 with completion date&#39;</span>
<span class="n">cmd_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">system</span><span class="o">.</span><span class="n">CmdTasks</span><span class="p">(),</span> <span class="n">args</span><span class="p">,</span> <span class="n">wanted_msg</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39;\. Deferring function func_test_cmd_tasks\.&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertRegex</span><span class="p">(</span><span class="n">cmd_result</span><span class="p">,</span> <span class="s1">&#39; \(func_test_cmd_tasks\) &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="s1">&#39;y&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">exists</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">active</span><span class="p">())</span></div>

View file

@ -0,0 +1,579 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.commands &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.commands</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">XYZ-aware commands</span>
<span class="sd">Just add the XYZGridCmdSet to the default character cmdset to override</span>
<span class="sd">the commands with XYZ-aware equivalents.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">InterruptCommand</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">default_cmds</span><span class="p">,</span> <span class="n">CmdSet</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default</span> <span class="kn">import</span> <span class="n">building</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzroom</span> <span class="kn">import</span> <span class="n">XYZRoom</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzgrid</span> <span class="kn">import</span> <span class="n">get_xyzgrid</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">ansi</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">list_to_string</span><span class="p">,</span> <span class="n">class_from_module</span><span class="p">,</span> <span class="n">delay</span>
<span class="n">COMMAND_DEFAULT_CLASS</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">)</span>
<span class="c1"># temporary store of goto/path data when using the auto-stepper</span>
<span class="n">PathData</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;PathData&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;target&quot;</span><span class="p">,</span> <span class="s2">&quot;xymap&quot;</span><span class="p">,</span> <span class="s2">&quot;directions&quot;</span><span class="p">,</span> <span class="s2">&quot;step_sequence&quot;</span><span class="p">,</span> <span class="s2">&quot;task&quot;</span><span class="p">))</span>
<div class="viewcode-block" id="CmdXYZTeleport"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdXYZTeleport">[docs]</a><span class="k">class</span> <span class="nc">CmdXYZTeleport</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdTeleport</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> teleport object to another location</span>
<span class="sd"> Usage:</span>
<span class="sd"> tel/switch [&lt;object&gt; to||=] &lt;target location&gt;</span>
<span class="sd"> tel/switch [&lt;object&gt; to||=] (X,Y[,Z])</span>
<span class="sd"> Examples:</span>
<span class="sd"> tel Limbo</span>
<span class="sd"> tel/quiet box = Limbo</span>
<span class="sd"> tel/tonone box</span>
<span class="sd"> tel (3, 3, the small cave)</span>
<span class="sd"> tel (4, 1) # on the same map</span>
<span class="sd"> tel/map Z|mapname</span>
<span class="sd"> Switches:</span>
<span class="sd"> quiet - don&#39;t echo leave/arrive messages to the source/target</span>
<span class="sd"> locations for the move.</span>
<span class="sd"> intoexit - if target is an exit, teleport INTO</span>
<span class="sd"> the exit object instead of to its destination</span>
<span class="sd"> tonone - if set, teleport the object to a None-location. If this</span>
<span class="sd"> switch is set, &lt;target location&gt; is ignored.</span>
<span class="sd"> Note that the only way to retrieve</span>
<span class="sd"> an object from a None location is by direct #dbref</span>
<span class="sd"> reference. A puppeted object cannot be moved to None.</span>
<span class="sd"> loc - teleport object to the target&#39;s location instead of its contents</span>
<span class="sd"> map - show coordinate map of given Zcoord/mapname.</span>
<span class="sd"> Teleports an object somewhere. If no object is given, you yourself are</span>
<span class="sd"> teleported to the target location. If (X,Y) or (X,Y,Z) coordinates</span>
<span class="sd"> are given, the target is a location on the XYZGrid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_search_by_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">):</span>
<span class="n">inp</span> <span class="o">=</span> <span class="n">inp</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;()&quot;</span><span class="p">)</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="o">*</span><span class="n">Z</span> <span class="o">=</span> <span class="n">inp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">if</span> <span class="n">Z</span><span class="p">:</span>
<span class="c1"># Z was specified</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">Z</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># use current location&#39;s Z, if it exists</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Z-coordinate is also required since you are not currently &quot;</span>
<span class="s2">&quot;in a room with a Z coordinate of its own.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">xyz</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="c1"># search by coordinate</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">X</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Y</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">))</span>
<span class="k">except</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found no target XYZRoom at (</span><span class="si">{</span><span class="n">X</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">Y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">Z</span><span class="si">}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<div class="viewcode-block" id="CmdXYZTeleport.parse"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdXYZTeleport.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">default_cmds</span><span class="o">.</span><span class="n">MuxCommand</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj_to_teleport</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Did not find object to teleport.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">char</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;(&quot;</span><span class="p">,</span> <span class="s2">&quot;)&quot;</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)):</span>
<span class="c1"># search by (X,Y) or (X,Y,Z)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_search_by_xyz</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># fallback to regular search by name/alias</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">char</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;(&quot;</span><span class="p">,</span> <span class="s2">&quot;)&quot;</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_search_by_xyz</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdXYZOpen"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdXYZOpen">[docs]</a><span class="k">class</span> <span class="nc">CmdXYZOpen</span><span class="p">(</span><span class="n">building</span><span class="o">.</span><span class="n">CmdOpen</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> open a new exit from the current room</span>
<span class="sd"> Usage:</span>
<span class="sd"> open &lt;new exit&gt;[;alias;..][:typeclass] [,&lt;return exit&gt;[;alias;..][:typeclass]]] = &lt;destination&gt;</span>
<span class="sd"> open &lt;new exit&gt;[;alias;..][:typeclass] [,&lt;return exit&gt;[;alias;..][:typeclass]]] = (X,Y,Z)</span>
<span class="sd"> Handles the creation of exits. If a destination is given, the exit</span>
<span class="sd"> will point there. The destination can also be given as an (X,Y,Z) coordinate on the</span>
<span class="sd"> XYZGrid - this command is used to link non-grid rooms to the grid and vice-versa.</span>
<span class="sd"> The &lt;return exit&gt; argument sets up an exit at the destination leading back to the current room.</span>
<span class="sd"> Apart from (X,Y,Z) coordinate, destination name can be given both as a #dbref and a name, if</span>
<span class="sd"> that name is globally unique.</span>
<span class="sd"> Examples:</span>
<span class="sd"> open kitchen = Kitchen</span>
<span class="sd"> open north, south = Town Center</span>
<span class="sd"> open cave mouth;cave = (3, 4, the small cave)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="CmdXYZOpen.parse"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdXYZOpen.parse">[docs]</a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">building</span><span class="o">.</span><span class="n">ObjManipCommand</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: open &lt;new exit&gt;[;alias...][:typeclass]&quot;</span>
<span class="s2">&quot;[,&lt;return exit&gt;[;alias..][:typeclass]]] &quot;</span>
<span class="s2">&quot;= &lt;destination or (X,Y,Z)&gt;&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;You cannot create an exit from a None-location.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">char</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;(&quot;</span><span class="p">,</span> <span class="s2">&quot;)&quot;</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)):</span>
<span class="c1"># search by (X,Y) or (X,Y,Z)</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="o">*</span><span class="n">Z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">Z</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;A full (X,Y,Z) coordinate must be given for the destination.&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">Z</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># search by coordinate</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">X</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Y</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">))</span>
<span class="k">except</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Found no target XYZRoom at (</span><span class="si">{X}</span><span class="s2">,</span><span class="si">{Y}</span><span class="s2">,</span><span class="si">{Y}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># regular search query</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rhs</span><span class="p">,</span> <span class="n">global_search</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">InterruptCommand</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_aliases</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;aliases&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lhs_objs</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;option&quot;</span><span class="p">]</span></div></div>
<div class="viewcode-block" id="CmdGoto"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdGoto">[docs]</a><span class="k">class</span> <span class="nc">CmdGoto</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Go to a named location in this area via the shortest path.</span>
<span class="sd"> Usage:</span>
<span class="sd"> path &lt;location&gt; - find shortest path to target location (don&#39;t move)</span>
<span class="sd"> goto &lt;location&gt; - auto-move to target location, using shortest path</span>
<span class="sd"> path - show current target location and shortest path</span>
<span class="sd"> goto - abort current goto, otherwise show current path</span>
<span class="sd"> path clear - clear current path</span>
<span class="sd"> Finds the shortest route to a location in your current area and</span>
<span class="sd"> can then automatically walk you there.</span>
<span class="sd"> Builders can optionally specify a specific grid coordinate (X,Y) to go to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;goto&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="s2">&quot;path&quot;</span>
<span class="n">help_category</span> <span class="o">=</span> <span class="s2">&quot;General&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:all()&quot;</span>
<span class="c1"># how quickly to step (seconds)</span>
<span class="n">auto_step_delay</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">default_xyz_path_interrupt_msg</span> <span class="o">=</span> <span class="s2">&quot;Pathfinding interrupted here.&quot;</span>
<span class="k">def</span> <span class="nf">_search_by_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">,</span> <span class="n">xyz_start</span><span class="p">):</span>
<span class="n">inp</span> <span class="o">=</span> <span class="n">inp</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&quot;()&quot;</span><span class="p">)</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span> <span class="o">=</span> <span class="n">inp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">xyz_start</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="c1"># search by coordinate</span>
<span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">X</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Y</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="nb">str</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">))</span>
<span class="k">except</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not find a room at (</span><span class="si">{</span><span class="n">X</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">Y</span><span class="si">}</span><span class="s2">) (Z=</span><span class="si">{</span><span class="n">Z</span><span class="si">}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_search_by_key_and_alias</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">,</span> <span class="n">xyz_start</span><span class="p">):</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">xyz_start</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">Z</span><span class="p">)))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">candidates</span><span class="o">=</span><span class="n">candidates</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_auto_step</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">caller</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">directions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">step_sequence</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">path_data</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span>
<span class="k">if</span> <span class="n">target</span><span class="p">:</span>
<span class="c1"># start/replace an old path if we provide the data for it</span>
<span class="k">if</span> <span class="n">path_data</span> <span class="ow">and</span> <span class="n">path_data</span><span class="o">.</span><span class="n">task</span> <span class="ow">and</span> <span class="n">path_data</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">active</span><span class="p">():</span>
<span class="c1"># stop any old task in its tracks</span>
<span class="n">path_data</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">path_data</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="n">PathData</span><span class="p">(</span>
<span class="n">target</span><span class="o">=</span><span class="n">target</span><span class="p">,</span> <span class="n">xymap</span><span class="o">=</span><span class="n">xymap</span><span class="p">,</span> <span class="n">directions</span><span class="o">=</span><span class="n">directions</span><span class="p">,</span>
<span class="n">step_sequence</span><span class="o">=</span><span class="n">step_sequence</span><span class="p">,</span> <span class="n">task</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">step</span> <span class="ow">and</span> <span class="n">path_data</span><span class="p">:</span>
<span class="n">step_sequence</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">step_sequence</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">direction</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">directions</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">current_node</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">step_sequence</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">first_link</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">step_sequence</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Target reached.&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="c1"># verfy our current location against the expected location</span>
<span class="n">expected_xyz</span> <span class="o">=</span> <span class="p">(</span><span class="n">current_node</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">current_node</span><span class="o">.</span><span class="n">Y</span><span class="p">,</span> <span class="n">current_node</span><span class="o">.</span><span class="n">Z</span><span class="p">)</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz_start</span> <span class="o">=</span> <span class="n">location</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Goto aborted - outside of area.&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">xyz_start</span> <span class="o">!=</span> <span class="n">expected_xyz</span><span class="p">:</span>
<span class="c1"># we are not where we expected to be (maybe the user moved</span>
<span class="c1"># manually) - we must recalculate the path to target</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Path changed - recalculating (&#39;goto&#39; to abort)&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz_end</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Goto aborted - target outside of area.&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">xyz_start</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">!=</span> <span class="n">xyz_end</span><span class="p">[</span><span class="mi">2</span><span class="p">]:</span>
<span class="c1"># can&#39;t go to another map</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Goto aborted - target outside of area.&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># recalculate path</span>
<span class="n">xy_start</span> <span class="o">=</span> <span class="n">xyz_start</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">xy_end</span> <span class="o">=</span> <span class="n">xyz_end</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">directions</span><span class="p">,</span> <span class="n">step_sequence</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">xymap</span><span class="o">.</span><span class="n">get_shortest_path</span><span class="p">(</span><span class="n">xy_start</span><span class="p">,</span> <span class="n">xy_end</span><span class="p">)</span>
<span class="c1"># try again with this path, rebuilding the data</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">direction</span> <span class="o">=</span> <span class="n">directions</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">current_node</span> <span class="o">=</span> <span class="n">step_sequence</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">first_link</span> <span class="o">=</span> <span class="n">step_sequence</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Target reached.&quot;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="n">path_data</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="n">PathData</span><span class="p">(</span>
<span class="n">target</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">target</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">xymap</span><span class="p">,</span>
<span class="n">directions</span><span class="o">=</span><span class="n">directions</span><span class="p">,</span>
<span class="n">step_sequence</span><span class="o">=</span><span class="n">step_sequence</span><span class="p">,</span>
<span class="n">task</span><span class="o">=</span><span class="kc">None</span>
<span class="p">)</span>
<span class="c1"># the map can itself tell the stepper to stop the auto-step prematurely</span>
<span class="n">interrupt_node_or_link</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># pop any extra links up until the next node - these are</span>
<span class="c1"># not useful when dealing with exits</span>
<span class="k">while</span> <span class="n">step_sequence</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">interrupt_node_or_link</span> <span class="ow">and</span> <span class="n">step_sequence</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">interrupt_path</span><span class="p">:</span>
<span class="n">interrupt_node_or_link</span> <span class="o">=</span> <span class="n">step_sequence</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">step_sequence</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&quot;node_index&quot;</span><span class="p">):</span>
<span class="k">break</span>
<span class="n">step_sequence</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># the exit name does not need to be the same as the cardinal direction!</span>
<span class="n">exit_name</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="o">=</span> <span class="n">first_link</span><span class="o">.</span><span class="n">spawn_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">direction</span><span class="p">,</span> <span class="n">current_node</span><span class="o">.</span><span class="n">direction_spawn_defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">direction</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;unknown&#39;</span><span class="p">,</span> <span class="p">)))</span>
<span class="n">exit_obj</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">exit_name</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exit_obj</span><span class="p">:</span>
<span class="c1"># extra safety measure to avoid trying to walk over and over</span>
<span class="c1"># if there&#39;s something wrong with the exit&#39;s name</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No exit &#39;</span><span class="si">{</span><span class="n">exit_name</span><span class="si">}</span><span class="s2">&#39; found at current location. Aborting goto.&quot;</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">interrupt_node_or_link</span><span class="p">:</span>
<span class="c1"># premature stop of pathfind-step because of map node/link of interrupt type</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">interrupt_node_or_link</span><span class="p">,</span> <span class="s2">&quot;node_index&quot;</span><span class="p">):</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">exit_obj</span><span class="o">.</span><span class="n">destination</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;xyz_path_interrupt_msg&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">default_xyz_path_interrupt_msg</span><span class="p">)</span>
<span class="c1"># we move into the node/room and then stop</span>
<span class="n">caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># if the link is interrupted we don&#39;t cross it at all</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">exit_obj</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;xyz_path_interrupt_msg&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">default_xyz_path_interrupt_msg</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># do the actual move - we use the command to allow for more obvious overrides</span>
<span class="n">caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">exit_name</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
<span class="c1"># namedtuples are unmutables, so we recreate and store</span>
<span class="c1"># with the new task</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="n">PathData</span><span class="p">(</span>
<span class="n">target</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">target</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">xymap</span><span class="p">,</span>
<span class="n">directions</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">directions</span><span class="p">,</span>
<span class="n">step_sequence</span><span class="o">=</span><span class="n">path_data</span><span class="o">.</span><span class="n">step_sequence</span><span class="p">,</span>
<span class="n">task</span><span class="o">=</span><span class="n">delay</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auto_step_delay</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_auto_step</span><span class="p">,</span> <span class="n">caller</span><span class="p">,</span> <span class="n">session</span><span class="p">)</span>
<span class="p">)</span>
<div class="viewcode-block" id="CmdGoto.func"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdGoto.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Implement command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">caller</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span>
<span class="n">goto_mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdname</span> <span class="o">==</span> <span class="s1">&#39;goto&#39;</span>
<span class="c1"># check if we have an existing path</span>
<span class="n">path_data</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="k">if</span> <span class="n">path_data</span><span class="p">:</span>
<span class="n">target_name</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span>
<span class="n">task</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">task</span>
<span class="k">if</span> <span class="n">goto_mode</span><span class="p">:</span>
<span class="k">if</span> <span class="n">task</span> <span class="ow">and</span> <span class="n">task</span><span class="o">.</span><span class="n">active</span><span class="p">():</span>
<span class="n">task</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Aborted auto-walking to </span><span class="si">{</span><span class="n">target_name</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># goto/path-command will show current path</span>
<span class="n">current_path</span> <span class="o">=</span> <span class="n">list_to_string</span><span class="p">(</span>
<span class="p">[</span><span class="sa">f</span><span class="s2">&quot;|w</span><span class="si">{</span><span class="n">step</span><span class="si">}</span><span class="s2">|n&quot;</span> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="n">path_data</span><span class="o">.</span><span class="n">directions</span><span class="p">])</span>
<span class="n">moving</span> <span class="o">=</span> <span class="s2">&quot;(moving)&quot;</span> <span class="k">if</span> <span class="n">task</span> <span class="ow">and</span> <span class="n">task</span><span class="o">.</span><span class="n">active</span><span class="p">()</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Path to </span><span class="si">{</span><span class="n">target_name</span><span class="si">}{</span><span class="n">moving</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Usage: goto|path [&lt;location&gt;]&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">goto_mode</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">==</span> <span class="s2">&quot;clear&quot;</span> <span class="ow">and</span> <span class="n">path_data</span><span class="p">:</span>
<span class="c1"># in case there is a target location &#39;clear&#39;, this is only</span>
<span class="c1"># used if path data already exists.</span>
<span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Cleared goto-path.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="c1"># find target</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz_start</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Cannot path-find since the current location is not on the grid.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">allow_xyz_query</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">check_lockstring</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;perm(Builder)&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">allow_xyz_query</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">(</span><span class="n">char</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;(&quot;</span><span class="p">,</span> <span class="s2">&quot;)&quot;</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)):</span>
<span class="c1"># search by (X,Y)</span>
<span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_by_xyz</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">xyz_start</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># search by normal key/alias</span>
<span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_search_by_key_and_alias</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="n">xyz_start</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz_end</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Target location is not on the grid and cannot be auto-walked to.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">xymap</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">xyz_start</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="c1"># we only need the xy coords once we have the map</span>
<span class="n">xy_start</span> <span class="o">=</span> <span class="n">xyz_start</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">xy_end</span> <span class="o">=</span> <span class="n">xyz_end</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">directions</span><span class="p">,</span> <span class="n">step_sequence</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">get_shortest_path</span><span class="p">(</span><span class="n">xy_start</span><span class="p">,</span> <span class="n">xy_end</span><span class="p">)</span>
<span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;There are </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">directions</span><span class="p">)</span><span class="si">}</span><span class="s2"> steps to </span><span class="si">{</span><span class="n">target</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">caller</span><span class="p">)</span><span class="si">}</span><span class="s2">: &quot;</span>
<span class="sa">f</span><span class="s2">&quot;|w</span><span class="si">{</span><span class="n">list_to_string</span><span class="p">(</span><span class="n">directions</span><span class="p">,</span> <span class="n">endsep</span><span class="o">=</span><span class="s1">&#39;|n, and finally|w&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">|n&quot;</span><span class="p">)</span>
<span class="c1"># create data for display and start stepping if we used goto</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_auto_step</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="n">target</span><span class="p">,</span> <span class="n">xymap</span><span class="o">=</span><span class="n">xymap</span><span class="p">,</span>
<span class="n">directions</span><span class="o">=</span><span class="n">directions</span><span class="p">,</span> <span class="n">step_sequence</span><span class="o">=</span><span class="n">step_sequence</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="n">goto_mode</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdMap"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdMap">[docs]</a><span class="k">class</span> <span class="nc">CmdMap</span><span class="p">(</span><span class="n">COMMAND_DEFAULT_CLASS</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Show a map of an area</span>
<span class="sd"> Usage:</span>
<span class="sd"> map [Zcoord]</span>
<span class="sd"> map list</span>
<span class="sd"> This is a builder-command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;map&quot;</span>
<span class="n">locks</span> <span class="o">=</span> <span class="s2">&quot;cmd:perm(Builders)&quot;</span>
<div class="viewcode-block" id="CmdMap.func"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.CmdMap.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Implement command&quot;&quot;&quot;</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="n">Z</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="c1"># show current area&#39;s map</span>
<span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">location</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xyz</span> <span class="o">=</span> <span class="n">location</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Your current location is not on the grid.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">xyz</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;list&quot;</span><span class="p">:</span>
<span class="n">xymaps</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">xymap</span><span class="p">))</span> <span class="k">for</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">all_maps</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Maps (Z coords) on the grid:</span><span class="se">\n</span><span class="s2"> |w</span><span class="si">{</span><span class="n">xymaps</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">Z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="n">xymap</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">xymap</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;XYMap &#39;</span><span class="si">{</span><span class="n">Z</span><span class="si">}</span><span class="s2">&#39; is not found on the grid. Try &#39;map list&#39; to see &quot;</span>
<span class="s2">&quot;available maps/Zcoords.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">ansi</span><span class="o">.</span><span class="n">raw</span><span class="p">(</span><span class="n">xymap</span><span class="o">.</span><span class="n">mapstring</span><span class="p">))</span></div></div>
<div class="viewcode-block" id="XYZGridCmdSet"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.XYZGridCmdSet">[docs]</a><span class="k">class</span> <span class="nc">XYZGridCmdSet</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Cmdset for easily adding the above cmds to the character cmdset.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;xyzgrid_cmdset&quot;</span>
<div class="viewcode-block" id="XYZGridCmdSet.at_cmdset_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.commands.html#evennia.contrib.xyzgrid.commands.XYZGridCmdSet.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdXYZTeleport</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdXYZOpen</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdGoto</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdMap</span><span class="p">())</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="commands.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.commands</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -0,0 +1,380 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.example &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.example</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.example</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Example xymaps to use with the XYZgrid contrib. Build outside of the game using</span>
<span class="sd">the `evennia xyzgrid` launcher command.</span>
<span class="sd">First add the launcher extension in your mygame/server/conf/settings.py:</span>
<span class="sd"> EXTRA_LAUNCHER_COMMANDS[&#39;xyzgrid&#39;] = &#39;evennia.contrib.xyzgrid.launchcmd.xyzcommand&#39;</span>
<span class="sd">Then</span>
<span class="sd"> evennia xyzgrid init</span>
<span class="sd"> evennia xyzgrid add evennia.contrib.xyzgrid.map_example</span>
<span class="sd"> evennia xyzgrid build</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid</span> <span class="kn">import</span> <span class="n">xymap_legend</span>
<span class="c1"># default prototype parent. It&#39;s important that</span>
<span class="c1"># the typeclass inherits from the XYZRoom (or XYZExit)</span>
<span class="c1"># if adding the evennia.contrib.xyzgrid.prototypes to</span>
<span class="c1"># settings.PROTOTYPE_MODULES, one could just set the</span>
<span class="c1"># prototype_parent to &#39;xyz_room&#39; and &#39;xyz_exit&#39; respectively</span>
<span class="c1"># instead.</span>
<span class="n">PARENT</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;An empty room&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;xyzmap_room_map1&quot;</span><span class="p">,</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">:</span> <span class="s2">&quot;evennia.contrib.xyzgrid.xyzroom.XYZRoom&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;An empty room.&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># ---------------------------------------- map1</span>
<span class="c1"># The large tree</span>
<span class="c1">#</span>
<span class="c1"># this exemplifies the various map symbols</span>
<span class="c1"># but is not heavily prototyped</span>
<span class="n">MAP1</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> 1</span>
<span class="s2"> + 0 1 2 3 4 5 6 7 8 9 0</span>
<span class="s2"> 8 #-------#-#-------I</span>
<span class="s2"> \ /</span>
<span class="s2"> 7 #-#---# t-#</span>
<span class="s2"> |\ |</span>
<span class="s2"> 6 #i#-#b--#-t</span>
<span class="s2"> | |</span>
<span class="s2"> 5 o-#---#</span>
<span class="s2"> \ /</span>
<span class="s2"> 4 o---#-#</span>
<span class="s2"> / d</span>
<span class="s2"> 3 #-----+-------#</span>
<span class="s2"> | d</span>
<span class="s2"> 2 | |</span>
<span class="s2"> v u</span>
<span class="s2"> 1 #---#&gt;#-#</span>
<span class="s2"> /</span>
<span class="s2"> 0 #-T</span>
<span class="s2"> + 0 1 2 3 4 5 6 7 8 9 0</span>
<span class="s2"> 1</span>
<span class="s2">&quot;&quot;&quot;</span>
<div class="viewcode-block" id="TransitionToCave"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.example.html#evennia.contrib.xyzgrid.example.TransitionToCave">[docs]</a><span class="k">class</span> <span class="nc">TransitionToCave</span><span class="p">(</span><span class="n">xymap_legend</span><span class="o">.</span><span class="n">TransitionMapNode</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A transition from &#39;the large tree&#39; to &#39;the small cave&#39; map. This node is never spawned</span>
<span class="sd"> into a room but only acts as a target for finding the exit&#39;s destination.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">symbol</span> <span class="o">=</span> <span class="s1">&#39;T&#39;</span>
<span class="n">target_map_xyz</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;the small cave&#39;</span><span class="p">)</span></div>
<span class="c1"># extends the default legend</span>
<span class="n">LEGEND_MAP1</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;T&#39;</span><span class="p">:</span> <span class="n">TransitionToCave</span>
<span class="p">}</span>
<span class="c1"># link coordinates to rooms</span>
<span class="n">PROTOTYPES_MAP1</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1"># node/room prototypes</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Dungeon Entrance&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;To the east, a narrow opening leads into darkness.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Under the foilage of a giant tree&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;High above the branches of a giant tree blocks out the sunlight. A slide &quot;</span>
<span class="s2">&quot;leading down from the upper branches ends here.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;The slide&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A slide leads down to the ground from here. It looks like a one-way trip.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Thorny path&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;To the east is a pathway of thorns. If you get through, you don&#39;t think you&#39;ll be &quot;</span>
<span class="s2">&quot;able to get back here the same way.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;By a large tree&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;You are standing at the root of a great tree.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;At the top of the tree&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;You are at the top of the tree.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Dense foilage&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;The foilage to the east is extra dense. It will take forever to get through it.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;On a huge branch&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;To the east is a glowing light, may be a teleporter to a higher branch.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="mi">7</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;On an enormous branch&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;To the west is a glowing light. It may be a teleporter to a lower branch.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;A gorgeous view&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;The view from here is breathtaking, showing the forest stretching far and wide.&quot;</span>
<span class="p">},</span>
<span class="c1"># default rooms</span>
<span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Among the branches of a giant tree&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;These branches are wide enough to easily walk on. There&#39;s green all around.&quot;</span>
<span class="p">},</span>
<span class="c1"># directional prototypes</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark passage into the underworld.&quot;</span>
<span class="p">},</span>
<span class="p">}</span>
<span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP1</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">PARENT</span>
<span class="n">XYMAP_DATA_MAP1</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;zcoord&quot;</span><span class="p">:</span> <span class="s2">&quot;the large tree&quot;</span><span class="p">,</span>
<span class="s2">&quot;map&quot;</span><span class="p">:</span> <span class="n">MAP1</span><span class="p">,</span>
<span class="s2">&quot;legend&quot;</span><span class="p">:</span> <span class="n">LEGEND_MAP1</span><span class="p">,</span>
<span class="s2">&quot;prototypes&quot;</span><span class="p">:</span> <span class="n">PROTOTYPES_MAP1</span>
<span class="p">}</span>
<span class="c1"># -------------------------------------- map2</span>
<span class="c1"># The small cave</span>
<span class="c1"># this gives prototypes for every room</span>
<span class="n">MAP2</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2">+ 0 1 2 3</span>
<span class="s2">3 #-#-#</span>
<span class="s2"> |x|</span>
<span class="s2">2 #-#-#</span>
<span class="s2"> | \</span>
<span class="s2">1 #---#</span>
<span class="s2"> | /</span>
<span class="s2">0 T-#-#</span>
<span class="s2">+ 0 1 2 3</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="c1"># custom map node</span>
<div class="viewcode-block" id="TransitionToLargeTree"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.example.html#evennia.contrib.xyzgrid.example.TransitionToLargeTree">[docs]</a><span class="k">class</span> <span class="nc">TransitionToLargeTree</span><span class="p">(</span><span class="n">xymap_legend</span><span class="o">.</span><span class="n">TransitionMapNode</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A transition from &#39;the small cave&#39; to &#39;the large tree&#39; map. This node is never spawned</span>
<span class="sd"> into a room by only acts as a target for finding the exit&#39;s destination.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">symbol</span> <span class="o">=</span> <span class="s1">&#39;T&#39;</span>
<span class="n">target_map_xyz</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;the large tree&#39;</span><span class="p">)</span></div>
<span class="c1"># this extends the default legend (that defines #,-+ etc)</span>
<span class="n">LEGEND_MAP2</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;T&quot;</span><span class="p">:</span> <span class="n">TransitionToLargeTree</span>
<span class="p">}</span>
<span class="c1"># prototypes for specific locations</span>
<span class="n">PROTOTYPES_MAP2</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1"># node/rooms prototype overrides</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;The entrance&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;This is the entrance to a small cave leading into the ground. &quot;</span>
<span class="s2">&quot;Light sifts in from the outside, while cavernous passages disappear &quot;</span>
<span class="s2">&quot;into darkness.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;A gruesome sight.&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Something was killed here recently. The smell is unbearable.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark pathway&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;The path splits three ways here. To the north a faint light can be seen.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Stagnant water&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A pool of stagnant, black water dominates this small chamber. To the nortwest &quot;</span>
<span class="s2">&quot;a faint light can be seen.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark alcove&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;This alcove is empty.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;South-west corner of the atrium&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Sunlight sifts down into a large underground chamber. Weeds and grass sprout &quot;</span>
<span class="s2">&quot;between the stones.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;South-east corner of the atrium&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Sunlight sifts down into a large underground chamber. Weeds and grass sprout &quot;</span>
<span class="s2">&quot;between the stones.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;North-west corner of the atrium&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Sunlight sifts down into a large underground chamber. Weeds and grass sprout &quot;</span>
<span class="s2">&quot;between the stones.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;North-east corner of the atrium&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;Sunlight sifts down into a large underground chamber. Weeds and grass sprout &quot;</span>
<span class="s2">&quot;between the stones. To the east is a dark passage.&quot;</span>
<span class="p">},</span>
<span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Craggy crevice&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;This is the deepest part of the dungeon. The path shrinks away and there &quot;</span>
<span class="s2">&quot;is no way to continue deeper.&quot;</span>
<span class="p">},</span>
<span class="c1"># default fallback for undefined nodes</span>
<span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark room&quot;</span><span class="p">,</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark, but empty, room.&quot;</span>
<span class="p">},</span>
<span class="c1"># directional prototypes</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A narrow path to the fresh air of the outside world.&quot;</span>
<span class="p">},</span>
<span class="c1"># directional fallbacks for unset directions</span>
<span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">):</span> <span class="p">{</span>
<span class="s2">&quot;desc&quot;</span><span class="p">:</span> <span class="s2">&quot;A dark passage&quot;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1"># this is required by the prototypes, but we add it all at once so we don&#39;t</span>
<span class="c1"># need to add it to every line above</span>
<span class="k">for</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">PROTOTYPES_MAP2</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="n">prot</span><span class="p">[</span><span class="s1">&#39;prototype_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">PARENT</span>
<span class="n">XYMAP_DATA_MAP2</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;map&quot;</span><span class="p">:</span> <span class="n">MAP2</span><span class="p">,</span>
<span class="s2">&quot;zcoord&quot;</span><span class="p">:</span> <span class="s2">&quot;the small cave&quot;</span><span class="p">,</span>
<span class="s2">&quot;legend&quot;</span><span class="p">:</span> <span class="n">LEGEND_MAP2</span><span class="p">,</span>
<span class="s2">&quot;prototypes&quot;</span><span class="p">:</span> <span class="n">PROTOTYPES_MAP2</span><span class="p">,</span>
<span class="s2">&quot;options&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;map_visual_range&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;map_mode&quot;</span><span class="p">:</span> <span class="s1">&#39;scan&#39;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1"># This is read by the parser</span>
<span class="n">XYMAP_DATA_LIST</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">XYMAP_DATA_MAP1</span><span class="p">,</span>
<span class="n">XYMAP_DATA_MAP2</span>
<span class="p">]</span>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="example.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.example</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -0,0 +1,517 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.launchcmd &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.launchcmd</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.launchcmd</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Custom Evennia launcher command option for maintaining the grid in a separate process than the main</span>
<span class="sd">server (since this can be slow).</span>
<span class="sd">To use, add to the settings:</span>
<span class="sd">::</span>
<span class="sd"> EXTRA_LAUNCHER_COMMANDS.update({&#39;xyzgrid&#39;: &#39;evennia.contrib.xyzgrid.launchcmd.xyzcommand&#39;})</span>
<span class="sd">You should now be able to do</span>
<span class="sd">::</span>
<span class="sd"> evennia xyzgrid &lt;options&gt;</span>
<span class="sd">Use `evennia xyzgrid help` for usage help.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">join</span> <span class="k">as</span> <span class="n">pathjoin</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">ansi</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzgrid</span> <span class="kn">import</span> <span class="n">get_xyzgrid</span>
<span class="n">_HELP_SHORT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">evennia xyzgrid help | list | init | add | spawn | initpath | delete [&lt;options&gt;]</span>
<span class="s2"> Manages the XYZ grid. Use &#39;xyzgrid help &lt;option&gt;&#39; for documentation.</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_HELP</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">evennia xyzgrid &lt;command&gt; [&lt;options&gt;]</span>
<span class="s2">Manages the XYZ grid.</span>
<span class="s2">help &lt;command&gt; - get help about each command:</span>
<span class="s2"> list - show list</span>
<span class="s2"> init - initialize grid (only one time)</span>
<span class="s2"> add - add new maps to grid</span>
<span class="s2"> spawn - spawn added maps into actual db-rooms/exits</span>
<span class="s2"> initpath - (re)creates pathfinder matrices</span>
<span class="s2"> delete - delete part or all of grid</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_LIST</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">list</span>
<span class="s2"> Lists the map grid structure and any loaded maps.</span>
<span class="s2">list &lt;Z|mapname&gt;</span>
<span class="s2"> Display the given XYmap in more detail. Also &#39;show&#39; works. Use quotes around</span>
<span class="s2"> map-names with spaces.</span>
<span class="s2">Examples:</span>
<span class="s2"> evennia xyzgrid list</span>
<span class="s2"> evennia xyzgrid list mymap</span>
<span class="s2"> evennia xyzgrid list &quot;the small cave&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_INIT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">init</span>
<span class="s2"> First start of the grid. This will create the XYZGrid global script. No maps are loaded yet!</span>
<span class="s2"> It&#39;s safe to run this command multiple times; the grid will only be initialized once.</span>
<span class="s2">Example:</span>
<span class="s2"> evennia xyzgrid init</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_ADD</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">add &lt;path.to.xymap.module&gt; [&lt;path&gt; &lt;path&gt;,...]</span>
<span class="s2"> Add path(s) to one or more modules containing XYMap definitions. The module will be parsed</span>
<span class="s2"> for</span>
<span class="s2"> - a XYMAP_DATA - a dict on this form:</span>
<span class="s2"> {&quot;map&quot;: mapstring, &quot;zcoord&quot;: mapname/zcoord, &quot;legend&quot;: dict, &quot;prototypes&quot;: dict}</span>
<span class="s2"> describing one single XYmap, or</span>
<span class="s2"> - a XYMAP_DATA_LIST - a list of multiple dicts on the XYMAP_DATA form. This allows for</span>
<span class="s2"> embedding multiple maps in the same module. See evennia/contrib/xyzgrid/example.py</span>
<span class="s2"> for an example of how this looks.</span>
<span class="s2"> Note that adding a map does *not* spawn it. If maps are linked to one another, you should</span>
<span class="s2"> add all linked maps before running &#39;spawn&#39;, or you&#39;ll get errors when creating transitional</span>
<span class="s2"> exits between maps.</span>
<span class="s2">Examples:</span>
<span class="s2"> evennia xyzgrid add evennia.contrib.xyzgrid.example</span>
<span class="s2"> evennia xyzgrid add world.mymap1 world.mymap2 world.mymap3</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_SPAWN</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">spawn</span>
<span class="s2"> spawns/updates the entire database grid based on the added maps. For a new grid, this will</span>
<span class="s2"> spawn all new rooms/exits (and may take a good while!). For updating, rooms may be</span>
<span class="s2"> removed/spawned if a map changed since the last spawn.</span>
<span class="s2">spawn &quot;(X,Y,Z|mapname)&quot;</span>
<span class="s2"> spawns/updates only a part of the grid. Remember the quotes around the coordinate (this</span>
<span class="s2"> is mostly because shells don&#39;t like them)! Use &#39;*&#39; as a wild card for XY coordinates.</span>
<span class="s2"> This should usually only be used if the full grid has already been built once - otherwise</span>
<span class="s2"> inter-map transitions may fail! Z is the name/z-coordinate of the map to spawn.</span>
<span class="s2">Examples:</span>
<span class="s2"> evennia xyzgrid spawn - spawn all</span>
<span class="s2"> evennia xyzgrid &quot;(*, *, mymap1)&quot; - spawn everything of map/zcoord mymap1</span>
<span class="s2"> evennia xyzgrid &quot;(12, 5, mymap1)&quot; - spawn only coordinate (12, 5) on map/zcoord mymap1</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_INITPATH</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">initpath</span>
<span class="s2"> Recreates the pathfinder matrices for the entire grid. These are used for all shortest-path</span>
<span class="s2"> calculations. The result will be cached to disk (in mygame/server/.cache/). If not run, each</span>
<span class="s2"> map will run this automatically first time it&#39;s used. Running this will always force to</span>
<span class="s2"> respawn the cache.</span>
<span class="s2">initpath Z|mapname</span>
<span class="s2"> recreate the pathfinder matrix for a specific map only. Z is the name/z-coordinate of the</span>
<span class="s2"> map. If the map name has spaces in it, use quotes.</span>
<span class="s2">Examples:</span>
<span class="s2"> evennia xyzgrid initpath</span>
<span class="s2"> evennia xyzgrid initpath mymap1</span>
<span class="s2"> evennia xyzgrid initpath &quot;the small cave&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_HELP_DELETE</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">delete</span>
<span class="s2"> WARNING: This will delete the entire xyz-grid (all maps), and *all* rooms/exits built to</span>
<span class="s2"> match it (they serve no purpose without the grid). You will be asked to confirm before</span>
<span class="s2"> continuing with this operation.</span>
<span class="s2">delete Z|mapname</span>
<span class="s2"> Remove a previously added XYmap with the name/z-coordinate Z. If the map was built, this</span>
<span class="s2"> will also wipe all its spawned rooms/exits. You will be asked to confirm before continuing</span>
<span class="s2"> with this operation. Use quotes if the Z/mapname contains spaces.</span>
<span class="s2">Examples:</span>
<span class="s2"> evennia xyzgrid delete</span>
<span class="s2"> evennia xyzgrid delete mymap1</span>
<span class="s2"> evennia xyzgrid delete &quot;the small cave&quot;</span>
<span class="s2">&quot;&quot;&quot;</span>
<span class="n">_TOPICS_MAP</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;list&quot;</span><span class="p">:</span> <span class="n">_HELP_LIST</span><span class="p">,</span>
<span class="s2">&quot;init&quot;</span><span class="p">:</span> <span class="n">_HELP_INIT</span><span class="p">,</span>
<span class="s2">&quot;add&quot;</span><span class="p">:</span> <span class="n">_HELP_ADD</span><span class="p">,</span>
<span class="s2">&quot;spawn&quot;</span><span class="p">:</span> <span class="n">_HELP_SPAWN</span><span class="p">,</span>
<span class="s2">&quot;initpath&quot;</span><span class="p">:</span> <span class="n">_HELP_INITPATH</span><span class="p">,</span>
<span class="s2">&quot;delete&quot;</span><span class="p">:</span> <span class="n">_HELP_DELETE</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">_option_help</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Show help &lt;command&gt; aid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">suboptions</span><span class="p">:</span>
<span class="n">topic</span> <span class="o">=</span> <span class="n">_HELP_HELP</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">topic</span> <span class="o">=</span> <span class="n">_TOPICS_MAP</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">suboptions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">_HELP_HELP</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">_option_list</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> List/view grid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="c1"># override grid&#39;s logger to echo directly to console</span>
<span class="k">def</span> <span class="nf">_log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">xyzgrid</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">_log</span>
<span class="n">xymap_data</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">grid</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">xymap_data</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The XYZgrid is currently empty. Use &#39;add&#39; to add paths to your map data.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">suboptions</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;XYMaps stored in grid:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">xymap_data</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">tup</span><span class="p">:</span> <span class="n">tup</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">xymap</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;:</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">xymap</span><span class="p">)))</span>
<span class="k">return</span>
<span class="n">zcoord</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">suboptions</span><span class="p">)</span>
<span class="n">xymap</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">xymap</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No XYMap with Z=&#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39; was found on grid.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">nrooms</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_room</span><span class="p">((</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">zcoord</span><span class="p">))</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="n">nnodes</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">xymap</span><span class="o">.</span><span class="n">node_index_map</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">xymap</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;:</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">checkwarning</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">nrooms</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">nrooms</span><span class="si">}</span><span class="s2"> / </span><span class="si">{</span><span class="n">nnodes</span><span class="si">}</span><span class="s2"> rooms are spawned.&quot;</span><span class="p">)</span>
<span class="n">checkwarning</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="n">nrooms</span> <span class="o">&lt;</span> <span class="n">nnodes</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">nrooms</span><span class="si">}</span><span class="s2"> / </span><span class="si">{</span><span class="n">nnodes</span><span class="si">}</span><span class="s2"> rooms are spawned</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;Note: Transitional nodes are *not* spawned (they just point </span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;to another map), so the &#39;missing room(s)&#39; may just be from such nodes.&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">nrooms</span> <span class="o">&gt;</span> <span class="n">nnodes</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">nrooms</span><span class="si">}</span><span class="s2"> / </span><span class="si">{</span><span class="n">nnodes</span><span class="si">}</span><span class="s2"> rooms are spawned</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;Note: Maybe some rooms were removed from map. Run &#39;spawn&#39; to re-sync.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">nrooms</span><span class="si">}</span><span class="s2"> / </span><span class="si">{</span><span class="n">nnodes</span><span class="si">}</span><span class="s2"> rooms are spawned</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">checkwarning</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Note: This check is not complete; it does not consider changed map &quot;</span>
<span class="s2">&quot;topology</span><span class="se">\n</span><span class="s2">like relocated nodes/rooms and new/removed links/exits - this &quot;</span>
<span class="s2">&quot;is calculated only during a spawn.&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Displayed map (as appearing in-game):</span><span class="se">\n\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">xymap</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Raw map string (including axes and invisible nodes/links):</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">xymap</span><span class="o">.</span><span class="n">mapstring</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Custom map options: </span><span class="si">{</span><span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">legend</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">node_or_link</span> <span class="ow">in</span> <span class="n">xymap</span><span class="o">.</span><span class="n">legend</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">legend</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="vm">__doc__</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Legend (all elements may not be present on map):</span><span class="se">\n</span><span class="s2"> &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">legend</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_option_init</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialize a new grid. Will fail if a Grid already exists.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;The grid is initalized as the Script &#39;</span><span class="si">{</span><span class="n">grid</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">&#39;(</span><span class="si">{</span><span class="n">grid</span><span class="o">.</span><span class="n">dbref</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_option_add</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add one or more map to the grid. Supports `add path,path,path,...`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="c1"># override grid&#39;s logger to echo directly to console</span>
<span class="k">def</span> <span class="nf">_log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">_log</span>
<span class="n">xymap_data_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">suboptions</span><span class="p">:</span>
<span class="n">maps</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">maps_from_module</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">maps</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No maps found with the path </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">.</span><span class="se">\n</span><span class="s2">Separate multiple paths with spaces. &quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">mapnames</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="n">m</span><span class="p">[</span><span class="s1">&#39;zcoord&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&#39;&quot;</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">maps</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; XYMaps from </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">:</span><span class="se">\n</span><span class="s2"> </span><span class="si">{</span><span class="n">mapnames</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">xymap_data_list</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">maps</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">add_maps</span><span class="p">(</span><span class="o">*</span><span class="n">xymap_data_list</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Added (or readded) </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">xymap_data_list</span><span class="p">)</span><span class="si">}</span><span class="s2"> XYMaps to grid.&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_option_spawn</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> spawn the grid or part of it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="c1"># override grid&#39;s logger to echo directly to console</span>
<span class="k">def</span> <span class="nf">_log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">_log</span>
<span class="k">if</span> <span class="n">suboptions</span><span class="p">:</span>
<span class="n">opts</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">suboptions</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;()&#39;</span><span class="p">)</span>
<span class="c1"># coordinate tuple</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;spawn coordinate must be given as (X, Y, Z) tuple, where &#39;*&#39; act &quot;</span>
<span class="s2">&quot;wild cards and Z is the mapname/z-coord of the map to load.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span>
<span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="n">y</span> <span class="o">==</span> <span class="n">z</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;This will (re)spawn the entire grid. If it was built before, it may spawn </span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;new rooms or delete rooms that no longer matches the grid.</span><span class="se">\n</span><span class="s2">Do you want to &quot;</span>
<span class="s2">&quot;continue? [Y]/N? &quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;This will spawn/delete objects in the database matching grid coordinates </span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">) (where &#39;*&#39; is a wildcard).</span><span class="se">\n</span><span class="s2">Do you want to continue? [Y]/N? &quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">inp</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;no&#39;</span><span class="p">,</span> <span class="s1">&#39;n&#39;</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Aborted.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Starting spawn ...&quot;</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... spawn complete!</span><span class="se">\n</span><span class="s2">It&#39;s recommended to reload the server to refresh caches if this &quot;</span>
<span class="s2">&quot;modified an existing grid.&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_option_initpath</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> (Re)Initialize the pathfinding matrices for grid or part of it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="c1"># override grid&#39;s logger to echo directly to console</span>
<span class="k">def</span> <span class="nf">_log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">_log</span>
<span class="n">xymaps</span> <span class="o">=</span> <span class="n">grid</span><span class="o">.</span><span class="n">all_maps</span><span class="p">()</span>
<span class="n">nmaps</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">xymaps</span><span class="p">)</span>
<span class="k">for</span> <span class="n">inum</span><span class="p">,</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">xymaps</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;(Re)building pathfinding matrix for xymap Z=</span><span class="si">{</span><span class="n">xymap</span><span class="o">.</span><span class="n">Z</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">inum</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">nmaps</span><span class="si">}</span><span class="s2">) ...&quot;</span><span class="p">)</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">calculate_path_matrix</span><span class="p">(</span><span class="n">force</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">cachepath</span> <span class="o">=</span> <span class="n">pathjoin</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">GAME_DIR</span><span class="p">,</span> <span class="s2">&quot;server&quot;</span><span class="p">,</span> <span class="s2">&quot;.cache&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;... done. Data cached to </span><span class="si">{</span><span class="n">cachepath</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_option_delete</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delete the grid or parts of it. Allows mapname,mapname, ...</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">get_xyzgrid</span><span class="p">()</span>
<span class="c1"># override grid&#39;s logger to echo directly to console</span>
<span class="k">def</span> <span class="nf">_log</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">_log</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">suboptions</span><span class="p">:</span>
<span class="n">repl</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;WARNING: This will delete the ENTIRE Grid and wipe all rooms/exits!&quot;</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Objects/Chars inside deleted rooms will be moved to their home locations.&quot;</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">This can&#39;t be undone. Are you sure you want to continue? Y/[N]? &quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">repl</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;yes&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Aborted.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Deleting grid ...&quot;</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... done.</span><span class="se">\n</span><span class="s2">Please reload the server now; otherwise &quot;</span>
<span class="s2">&quot;removed rooms may linger in cache.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">zcoords</span> <span class="o">=</span> <span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">suboptions</span><span class="p">)</span>
<span class="n">err</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="n">zcoords</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">grid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">zcoord</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Mapname/zcoord </span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2"> is not a part of the grid.&quot;</span><span class="p">)</span>
<span class="n">err</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Valid mapnames/zcoords are</span><span class="se">\n</span><span class="s2">:&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2"> &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">Z</span> <span class="k">for</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="n">grid</span><span class="o">.</span><span class="n">all_rooms</span><span class="p">()))</span>
<span class="k">return</span>
<span class="n">repl</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;This will delete map(s) {&#39;, &#39;.join(zcoords)} and wipe all corresponding</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="s2">&quot;rooms/exits!&quot;</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Objects/Chars inside deleted rooms will be moved to their home locations.&quot;</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">This can&#39;t be undone. Are you sure you want to continue? Y/[N]? &quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">repl</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;yes&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Aborted.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Deleting selected xymaps ...&quot;</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">remove_map</span><span class="p">(</span><span class="o">*</span><span class="n">zcoords</span><span class="p">,</span> <span class="n">remove_objects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;... done.</span><span class="se">\n</span><span class="s2">Please reload the server to refresh room caches.&quot;</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Also remember to remove any links from remaining maps pointing to deleted maps.&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="xyzcommand"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.launchcmd.html#evennia.contrib.xyzgrid.launchcmd.xyzcommand">[docs]</a><span class="k">def</span> <span class="nf">xyzcommand</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Evennia launcher command. This is made available as `evennia xyzgrid` on the command line,</span>
<span class="sd"> once added to `settings.EXTRA_LAUNCHER_COMMANDS`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">_HELP_SHORT</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="k">return</span>
<span class="n">option</span><span class="p">,</span> <span class="o">*</span><span class="n">suboptions</span> <span class="o">=</span> <span class="n">args</span>
<span class="k">if</span> <span class="n">option</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;help&#39;</span><span class="p">,</span> <span class="s1">&#39;h&#39;</span><span class="p">):</span>
<span class="n">_option_help</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">if</span> <span class="n">option</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;list&#39;</span><span class="p">,</span> <span class="s1">&#39;show&#39;</span><span class="p">):</span>
<span class="n">_option_list</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">option</span> <span class="o">==</span> <span class="s1">&#39;init&#39;</span><span class="p">:</span>
<span class="n">_option_init</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">option</span> <span class="o">==</span> <span class="s1">&#39;add&#39;</span><span class="p">:</span>
<span class="n">_option_add</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">option</span> <span class="o">==</span> <span class="s1">&#39;spawn&#39;</span><span class="p">:</span>
<span class="n">_option_spawn</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">option</span> <span class="o">==</span> <span class="s1">&#39;initpath&#39;</span><span class="p">:</span>
<span class="n">_option_initpath</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">option</span> <span class="o">==</span> <span class="s1">&#39;delete&#39;</span><span class="p">:</span>
<span class="n">_option_delete</span><span class="p">(</span><span class="o">*</span><span class="n">suboptions</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown option &#39;</span><span class="si">{</span><span class="n">option</span><span class="si">}</span><span class="s2">&#39;. Use &#39;evennia xyzgrid help&#39; for valid arguments.&quot;</span><span class="p">)</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="launchcmd.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.launchcmd</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,160 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.utils &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.utils</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Helpers and resources for the map system.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">BIGVAL</span> <span class="o">=</span> <span class="mi">999999999999</span>
<span class="n">REVERSE_DIRECTIONS</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;n&quot;</span><span class="p">:</span> <span class="s2">&quot;s&quot;</span><span class="p">,</span>
<span class="s2">&quot;ne&quot;</span><span class="p">:</span> <span class="s2">&quot;sw&quot;</span><span class="p">,</span>
<span class="s2">&quot;e&quot;</span><span class="p">:</span> <span class="s2">&quot;w&quot;</span><span class="p">,</span>
<span class="s2">&quot;se&quot;</span><span class="p">:</span> <span class="s2">&quot;nw&quot;</span><span class="p">,</span>
<span class="s2">&quot;s&quot;</span><span class="p">:</span> <span class="s2">&quot;n&quot;</span><span class="p">,</span>
<span class="s2">&quot;sw&quot;</span><span class="p">:</span> <span class="s2">&quot;ne&quot;</span><span class="p">,</span>
<span class="s2">&quot;w&quot;</span><span class="p">:</span> <span class="s2">&quot;e&quot;</span><span class="p">,</span>
<span class="s2">&quot;nw&quot;</span><span class="p">:</span> <span class="s2">&quot;se&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">MAPSCAN</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;n&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
<span class="s2">&quot;ne&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
<span class="s2">&quot;e&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
<span class="s2">&quot;se&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="s2">&quot;s&quot;</span><span class="p">:</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="s2">&quot;sw&quot;</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="s2">&quot;w&quot;</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
<span class="s2">&quot;nw&quot;</span><span class="p">:</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
<span class="p">}</span>
<span class="c1"># errors for Map system</span>
<div class="viewcode-block" id="MapError"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.utils.html#evennia.contrib.xyzgrid.utils.MapError">[docs]</a><span class="k">class</span> <span class="nc">MapError</span><span class="p">(</span><span class="ne">RuntimeError</span><span class="p">):</span>
<div class="viewcode-block" id="MapError.__init__"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.utils.html#evennia.contrib.xyzgrid.utils.MapError.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">node_or_link</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">if</span> <span class="n">node_or_link</span><span class="p">:</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> &#39;</span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="n">symbol</span><span class="si">}</span><span class="s2">&#39; &quot;</span>
<span class="sa">f</span><span class="s2">&quot;at XYZ=(</span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="n">X</span><span class="si">:</span><span class="s2">g</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="n">Y</span><span class="si">:</span><span class="s2">g</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">node_or_link</span><span class="o">.</span><span class="n">Z</span><span class="si">}</span><span class="s2">) &quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">node_or_link</span> <span class="o">=</span> <span class="n">node_or_link</span>
<span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="n">error</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="MapParserError"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.utils.html#evennia.contrib.xyzgrid.utils.MapParserError">[docs]</a><span class="k">class</span> <span class="nc">MapParserError</span><span class="p">(</span><span class="n">MapError</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MapTransition"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.utils.html#evennia.contrib.xyzgrid.utils.MapTransition">[docs]</a><span class="k">class</span> <span class="nc">MapTransition</span><span class="p">(</span><span class="ne">RuntimeWarning</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Used when signaling to the parser that a link</span>
<span class="sd"> leads to another map.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="utils.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.utils</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,399 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.xyzgrid &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.xyzgrid</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.xyzgrid</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">The grid</span>
<span class="sd">This represents the full XYZ grid, which consists of</span>
<span class="sd">- 2D `Map`-objects parsed from Map strings and Map-legend components. Each represents one</span>
<span class="sd"> Z-coordinate or location.</span>
<span class="sd">- `Prototypes` for how to build each XYZ component into &#39;real&#39; rooms and exits.</span>
<span class="sd">- Actual in-game rooms and exits, mapped to the game based on Map data.</span>
<span class="sd">The grid has three main functions:</span>
<span class="sd">- Building new rooms/exits from scratch based on one or more Maps.</span>
<span class="sd">- Updating the rooms/exits tied to an existing Map when the Map string</span>
<span class="sd"> of that map changes.</span>
<span class="sd">- Fascilitate communication between the in-game entities and their Map.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.scripts</span> <span class="kn">import</span> <span class="n">DefaultScript</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">variable_from_module</span><span class="p">,</span> <span class="n">make_iter</span>
<span class="kn">from</span> <span class="nn">.xymap</span> <span class="kn">import</span> <span class="n">XYMap</span>
<span class="kn">from</span> <span class="nn">.xyzroom</span> <span class="kn">import</span> <span class="n">XYZRoom</span><span class="p">,</span> <span class="n">XYZExit</span>
<div class="viewcode-block" id="XYZGrid"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid">[docs]</a><span class="k">class</span> <span class="nc">XYZGrid</span><span class="p">(</span><span class="n">DefaultScript</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Main grid class. This organizes the Maps based on their name/Z-coordinate.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="XYZGrid.at_script_creation"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.at_script_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_script_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> What we store persistently is data used to create each map (the legends, names etc)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="s2">&quot;Manages maps for XYZ-grid&quot;</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">grid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span>
<div class="viewcode-block" id="XYZGrid.get_map"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.get_map">[docs]</a> <span class="k">def</span> <span class="nf">get_map</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zcoord</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get a specific xymap.</span>
<span class="sd"> Args:</span>
<span class="sd"> zcoord (str): The name/zcoord of the xymap.</span>
<span class="sd"> Returns:</span>
<span class="sd"> XYMap: Or None if no map was found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span></div>
<div class="viewcode-block" id="XYZGrid.all_maps"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.all_maps">[docs]</a> <span class="k">def</span> <span class="nf">all_maps</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get all xymaps stored in the grid.</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: All initialized xymaps stored with this grid.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="o">.</span><span class="n">values</span><span class="p">())</span></div>
<div class="viewcode-block" id="XYZGrid.log"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.log">[docs]</a> <span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;|grid| </span><span class="si">{</span><span class="n">msg</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="XYZGrid.get_room"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.get_room">[docs]</a> <span class="k">def</span> <span class="nf">get_room</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get one or more room objects from XYZ coordinate.</span>
<span class="sd"> Args:</span>
<span class="sd"> xyz (tuple): X,Y,Z coordinate of room to fetch. &#39;*&#39; acts</span>
<span class="sd"> as wild cards.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Queryset: A queryset of XYZRoom(s) found.</span>
<span class="sd"> Raises:</span>
<span class="sd"> XYZRoom.DoesNotExist: If room is not found.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This assumes the room was previously built.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="XYZGrid.get_exit"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.get_exit">[docs]</a> <span class="k">def</span> <span class="nf">get_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;north&#39;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get one or more exit object at coordinate.</span>
<span class="sd"> Args:</span>
<span class="sd"> xyz (tuple): X,Y,Z coordinate of the room the</span>
<span class="sd"> exit leads out of. &#39;*&#39; acts as a wildcard.</span>
<span class="sd"> name (str): The full name of the exit, e.g. &#39;north&#39; or &#39;northwest&#39;.</span>
<span class="sd"> The &#39;*&#39; acts as a wild card.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Queryset: A queryset of XYZExit(s) found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;db_key&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">return</span> <span class="n">XYZExit</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz_exit</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="n">xyz</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="XYZGrid.maps_from_module"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.maps_from_module">[docs]</a> <span class="k">def</span> <span class="nf">maps_from_module</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module_path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Load map data from module. The loader will look for a dict XYMAP_DATA or a list of</span>
<span class="sd"> XYMAP_DATA_LIST (a list of XYMAP_DATA dicts). Each XYMAP_DATA dict should contain</span>
<span class="sd"> `{&quot;xymap&quot;: mapstring, &quot;zcoord&quot;: mapname/zcoord, &quot;legend&quot;: dict, &quot;prototypes&quot;: dict}`.</span>
<span class="sd"> Args:</span>
<span class="sd"> module_path (module_path): A python-path to a module containing</span>
<span class="sd"> map data as either `XYMAP_DATA` or `XYMAP_DATA_LIST` variables.</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: List of zero, one or more xy-map data dicts loaded from the module.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">map_data_list</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="n">module_path</span><span class="p">,</span> <span class="s2">&quot;XYMAP_DATA_LIST&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">map_data_list</span><span class="p">:</span>
<span class="n">map_data_list</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="n">module_path</span><span class="p">,</span> <span class="s2">&quot;XYMAP_DATA&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">map_data_list</span><span class="p">:</span>
<span class="n">map_data_list</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">map_data_list</span><span class="p">)</span>
<span class="c1"># inject the python path in the map data</span>
<span class="k">for</span> <span class="n">mapdata</span> <span class="ow">in</span> <span class="n">map_data_list</span><span class="p">:</span>
<span class="n">mapdata</span><span class="p">[</span><span class="s1">&#39;module_path&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">module_path</span>
<span class="k">return</span> <span class="n">map_data_list</span></div>
<div class="viewcode-block" id="XYZGrid.reload"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.reload">[docs]</a> <span class="k">def</span> <span class="nf">reload</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reload and rebuild the grid. This is done on a server reload.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">&quot;(Re)loading grid ...&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">nmaps</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">loaded_mapdata</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">changed</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># generate all Maps - this will also initialize their components</span>
<span class="c1"># and bake any pathfinding paths (or load from disk-cache)</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">old_mapdata</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loading map &#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39;...&quot;</span><span class="p">)</span>
<span class="c1"># we reload the map from module</span>
<span class="n">new_mapdata</span> <span class="o">=</span> <span class="n">loaded_mapdata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">new_mapdata</span><span class="p">:</span>
<span class="k">if</span> <span class="s1">&#39;module_path&#39;</span> <span class="ow">in</span> <span class="n">old_mapdata</span><span class="p">:</span>
<span class="k">for</span> <span class="n">mapdata</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">maps_from_module</span><span class="p">(</span><span class="n">old_mapdata</span><span class="p">[</span><span class="s1">&#39;module_path&#39;</span><span class="p">]):</span>
<span class="n">loaded_mapdata</span><span class="p">[</span><span class="n">mapdata</span><span class="p">[</span><span class="s1">&#39;zcoord&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">mapdata</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># nowhere to reload from - use what we have</span>
<span class="n">loaded_mapdata</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_mapdata</span>
<span class="n">new_mapdata</span> <span class="o">=</span> <span class="n">loaded_mapdata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span>
<span class="k">if</span> <span class="n">new_mapdata</span> <span class="o">!=</span> <span class="n">old_mapdata</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; XYMap data for Z=&#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39; has changed.&quot;</span><span class="p">)</span>
<span class="n">changed</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span>
<span class="n">xymap</span> <span class="o">=</span> <span class="n">XYMap</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">new_mapdata</span><span class="p">),</span> <span class="n">Z</span><span class="o">=</span><span class="n">zcoord</span><span class="p">,</span> <span class="n">xyzgrid</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">calculate_path_matrix</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">xymap</span>
<span class="n">nmaps</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># re-store changed data</span>
<span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="n">changed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">loaded_mapdata</span><span class="p">[</span><span class="s1">&#39;zcoord&#39;</span><span class="p">]</span>
<span class="c1"># store</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loaded and linked </span><span class="si">{</span><span class="n">nmaps</span><span class="si">}</span><span class="s2"> map(s).&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">loaded</span> <span class="o">=</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="XYZGrid.add_maps"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.add_maps">[docs]</a> <span class="k">def</span> <span class="nf">add_maps</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">mapdatas</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add map or maps to the grid.</span>
<span class="sd"> Args:</span>
<span class="sd"> *mapdatas (dict): Each argument is a dict structure</span>
<span class="sd"> `{&quot;map&quot;: &lt;mapstr&gt;, &quot;legend&quot;: &lt;legenddict&gt;, &quot;name&quot;: &lt;name&gt;,</span>
<span class="sd"> &quot;prototypes&quot;: &lt;dict-of-dicts&gt;, &quot;module_path&quot;: &lt;str&gt;}`. The `prototypes are</span>
<span class="sd"> coordinate-specific overrides for nodes/links on the map, keyed with their</span>
<span class="sd"> (X,Y) coordinate within that map. The `module_path` is injected automatically</span>
<span class="sd"> by self.maps_from_module.</span>
<span class="sd"> Raises:</span>
<span class="sd"> RuntimeError: If mapdata is malformed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">mapdata</span> <span class="ow">in</span> <span class="n">mapdatas</span><span class="p">:</span>
<span class="n">zcoord</span> <span class="o">=</span> <span class="n">mapdata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;zcoord&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">zcoord</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;XYZGrid.add_map data must contain &#39;zcoord&#39;.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">[</span><span class="n">zcoord</span><span class="p">]</span> <span class="o">=</span> <span class="n">mapdata</span></div>
<div class="viewcode-block" id="XYZGrid.remove_map"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.remove_map">[docs]</a> <span class="k">def</span> <span class="nf">remove_map</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">zcoords</span><span class="p">,</span> <span class="n">remove_objects</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove an XYmap from the grid.</span>
<span class="sd"> Args:</span>
<span class="sd"> *zoords (str): The zcoords/XYmaps to remove.</span>
<span class="sd"> remove_objects (bool, optional): If the synced database objects (rooms/exits) should</span>
<span class="sd"> be removed alongside this map.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># from evennia import set_trace;set_trace()</span>
<span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="n">zcoords</span><span class="p">:</span>
<span class="k">if</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">zcoord</span><span class="p">)</span>
<span class="k">if</span> <span class="n">remove_objects</span><span class="p">:</span>
<span class="c1"># we can&#39;t batch-delete because we want to run the .delete</span>
<span class="c1"># method that also wipes exits and moves content to save locations</span>
<span class="k">for</span> <span class="n">xyzroom</span> <span class="ow">in</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">zcoord</span><span class="p">)):</span>
<span class="n">xyzroom</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span></div>
<div class="viewcode-block" id="XYZGrid.delete"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clear the entire grid, including database entities, then the grid too.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_map</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">zcoord</span> <span class="k">for</span> <span class="n">zcoord</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">map_data</span><span class="p">),</span> <span class="n">remove_objects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div>
<div class="viewcode-block" id="XYZGrid.spawn"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.XYZGrid.spawn">[docs]</a> <span class="k">def</span> <span class="nf">spawn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="n">directions</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create/recreate/update the in-game grid based on the stored Maps or for a specific Map</span>
<span class="sd"> or coordinate.</span>
<span class="sd"> Args:</span>
<span class="sd"> xyz (tuple, optional): An (X,Y,Z) coordinate, where Z is the name of the map. `&#39;*&#39;`</span>
<span class="sd"> acts as a wildcard.</span>
<span class="sd"> directions (list, optional): A list of cardinal directions (&#39;n&#39;, &#39;ne&#39; etc).</span>
<span class="sd"> Spawn exits only the given direction. If unset, all needed directions are spawned.</span>
<span class="sd"> Examples:</span>
<span class="sd"> - `xyz=(&#39;*&#39;, &#39;*&#39;, &#39;*&#39;)` (default) - spawn/update all maps.</span>
<span class="sd"> - `xyz=(1, 3, &#39;foo&#39;)` - sync a specific element of map &#39;foo&#39; only.</span>
<span class="sd"> - `xyz=(&#39;*&#39;, &#39;*&#39;, &#39;foo&#39;) - sync all elements of map &#39;foo&#39;</span>
<span class="sd"> - `xyz=(1, 3, &#39;*&#39;) - sync all (1,3) coordinates on all maps (rarely useful)</span>
<span class="sd"> - `xyz=(1, 3, &#39;foo&#39;)`, `direction=&#39;ne&#39;` - sync only the north-eastern exit</span>
<span class="sd"> out of the specific node on map &#39;foo&#39;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="n">wildcard</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span>
<span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="n">wildcard</span><span class="p">:</span>
<span class="n">xymaps</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span> <span class="ow">and</span> <span class="n">z</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">grid</span><span class="p">:</span>
<span class="n">xymaps</span> <span class="o">=</span> <span class="p">{</span><span class="n">z</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid</span><span class="p">[</span><span class="n">z</span><span class="p">]}</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;The &#39;z&#39; coordinate/name &#39;</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">&#39; is not found on the grid.&quot;</span><span class="p">)</span>
<span class="c1"># first build all nodes/rooms</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="n">xymaps</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;spawning/updating nodes for Z=&#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39; ...&quot;</span><span class="p">)</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">spawn_nodes</span><span class="p">(</span><span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
<span class="c1"># next build all links between nodes (including between maps)</span>
<span class="k">for</span> <span class="n">zcoord</span><span class="p">,</span> <span class="n">xymap</span> <span class="ow">in</span> <span class="n">xymaps</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;spawning/updating links for Z=&#39;</span><span class="si">{</span><span class="n">zcoord</span><span class="si">}</span><span class="s2">&#39; ...&quot;</span><span class="p">)</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">spawn_links</span><span class="p">(</span><span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="n">directions</span><span class="o">=</span><span class="n">directions</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="get_xyzgrid"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzgrid.html#evennia.contrib.xyzgrid.xyzgrid.get_xyzgrid">[docs]</a><span class="k">def</span> <span class="nf">get_xyzgrid</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper for getting the grid. This will create the XYZGrid global script if it didn&#39;t</span>
<span class="sd"> previously exist.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="n">XYZGrid</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">xyzgrid</span><span class="p">:</span>
<span class="c1"># create a new one</span>
<span class="n">xyzgrid</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">XYZGrid</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s2">&quot;XYZGrid&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="n">xyzgrid</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span>
<span class="k">return</span> <span class="n">xyzgrid</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">xyzgrid</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="p">(</span><span class="s2">&quot;Warning: More than one XYZGrid instances were found. This is an error and &quot;</span>
<span class="s2">&quot;only the first one will be used. Delete the other one(s) manually.&quot;</span><span class="p">)</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
<span class="n">xyzgrid</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">xyzgrid</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">return</span> <span class="n">xyzgrid</span></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="xyzgrid.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.xyzgrid</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -0,0 +1,694 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.xyzgrid.xyzroom &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.xyzroom</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.xyzgrid.xyzroom</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">XYZ-aware rooms and exits.</span>
<span class="sd">These are intended to be used with the XYZgrid - which interprets the `Z` &#39;coordinate&#39; as</span>
<span class="sd">different (named) 2D XY maps. But if not wanting to use the XYZgrid gridding, these can also be</span>
<span class="sd">used as stand-alone XYZ-coordinate-aware rooms.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.db.models</span> <span class="kn">import</span> <span class="n">Q</span>
<span class="kn">from</span> <span class="nn">evennia.objects.objects</span> <span class="kn">import</span> <span class="n">DefaultRoom</span><span class="p">,</span> <span class="n">DefaultExit</span>
<span class="kn">from</span> <span class="nn">evennia.objects.manager</span> <span class="kn">import</span> <span class="n">ObjectManager</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">make_iter</span>
<span class="c1"># name of all tag categories. Note that the Z-coordinate is</span>
<span class="c1"># the `map_name` of the XYZgrid</span>
<span class="n">MAP_X_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;room_x_coordinate&quot;</span>
<span class="n">MAP_Y_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;room_y_coordinate&quot;</span>
<span class="n">MAP_Z_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;room_z_coordinate&quot;</span>
<span class="n">MAP_XDEST_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;exit_dest_x_coordinate&quot;</span>
<span class="n">MAP_YDEST_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;exit_dest_y_coordinate&quot;</span>
<span class="n">MAP_ZDEST_TAG_CATEGORY</span> <span class="o">=</span> <span class="s2">&quot;exit_dest_z_coordinate&quot;</span>
<span class="n">GET_XYZGRID</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="XYZManager"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZManager">[docs]</a><span class="k">class</span> <span class="nc">XYZManager</span><span class="p">(</span><span class="n">ObjectManager</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is accessed as `.objects` on the coordinate-aware typeclasses (`XYZRoom`, `XYZExit`). It</span>
<span class="sd"> has all the normal Object/Room manager methods (filter/get etc) but also special helpers for</span>
<span class="sd"> efficiently querying the room in the database based on XY coordinates.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="XYZManager.filter_xyz"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZManager.filter_xyz">[docs]</a> <span class="k">def</span> <span class="nf">filter_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Filter queryset based on XYZ position on the grid. The Z-position is the name of the XYMap</span>
<span class="sd"> Set a coordinate to `&#39;*&#39;` to act as a wildcard (setting all coords to `*` will thus find</span>
<span class="sd"> *all* XYZ rooms). This will also find children of XYZRooms on the given coordinates.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> xyz (tuple, optional): A coordinate tuple (X, Y, Z) where each element is either</span>
<span class="sd"> an `int` or `str`. The character `&#39;*&#39;` acts as a wild card. Note that</span>
<span class="sd"> the `Z`-coordinate is the name of the map (case-sensitive) in the XYZgrid contrib.</span>
<span class="sd"> **kwargs: All other kwargs are passed on to the query.</span>
<span class="sd"> Returns:</span>
<span class="sd"> django.db.queryset.Queryset: A queryset that can be combined</span>
<span class="sd"> with further filtering.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="n">wildcard</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span>
<span class="o">.</span><span class="n">filter_family</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">y</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">))</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="XYZManager.get_xyz"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZManager.get_xyz">[docs]</a> <span class="k">def</span> <span class="nf">get_xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Always return a single matched entity directly. This accepts no `*`-wildcards.</span>
<span class="sd"> This will also find children of XYZRooms on the given coordinates.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> xyz (tuple): A coordinate tuple of `int` or `str` (not `&#39;*&#39;`, no wildcards are</span>
<span class="sd"> allowed in get). The `Z`-coordinate acts as the name (case-sensitive) of the map in</span>
<span class="sd"> the XYZgrid contrib.</span>
<span class="sd"> **kwargs: All other kwargs are passed on to the query.</span>
<span class="sd"> Returns:</span>
<span class="sd"> XYRoom: A single room instance found at the combination of x, y and z given.</span>
<span class="sd"> Raises:</span>
<span class="sd"> XYZRoom.DoesNotExist: If no matching query was found.</span>
<span class="sd"> XYZRoom.MultipleObjectsReturned: If more than one match was found (which should not</span>
<span class="sd"> possible with a unique combination of x,y,z).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="c1"># mimic get_family</span>
<span class="n">paths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path__in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">paths</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;xyz=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">), &quot;</span> <span class="o">+</span>
<span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> &quot;</span>
<span class="sa">f</span><span class="s2">&quot;matching query </span><span class="si">{</span><span class="n">inp</span><span class="si">}</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="XYZExitManager"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExitManager">[docs]</a><span class="k">class</span> <span class="nc">XYZExitManager</span><span class="p">(</span><span class="n">XYZManager</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Used by Exits.</span>
<span class="sd"> Manager that also allows searching for destinations based on XY coordinates.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="XYZExitManager.filter_xyz_exit"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExitManager.filter_xyz_exit">[docs]</a> <span class="k">def</span> <span class="nf">filter_xyz_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span>
<span class="n">xyz_destination</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Used by exits (objects with a source and -destination property).</span>
<span class="sd"> Find all exits out of a source or to a particular destination. This will also find</span>
<span class="sd"> children of XYZExit on the given coords..</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> xyz (tuple, optional): A coordinate (X, Y, Z) for the source location. Each</span>
<span class="sd"> element is either an `int` or `str`. The character `&#39;*&#39;` is used as a wildcard -</span>
<span class="sd"> so setting all coordinates to the wildcard will return *all* XYZExits.</span>
<span class="sd"> the `Z`-coordinate is the name of the map (case-sensitive) in the XYZgrid contrib.</span>
<span class="sd"> xyz_destination (tuple, optional): Same as `xyz` but for the destination of the</span>
<span class="sd"> exit.</span>
<span class="sd"> **kwargs: All other kwargs are passed on to the query.</span>
<span class="sd"> Returns:</span>
<span class="sd"> django.db.queryset.Queryset: A queryset that can be combined</span>
<span class="sd"> with further filtering.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Depending on what coordinates are set to `*`, this can be used to</span>
<span class="sd"> e.g. find all exits in a room, or leading to a room or even to rooms</span>
<span class="sd"> in a particular X/Y row/column.</span>
<span class="sd"> In the XYZgrid, `z_source != z_destination` means a _transit_ between different maps.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="n">xdest</span><span class="p">,</span> <span class="n">ydest</span><span class="p">,</span> <span class="n">zdest</span> <span class="o">=</span> <span class="n">xyz_destination</span>
<span class="n">wildcard</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span>
<span class="o">.</span><span class="n">filter_family</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">y</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">z</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">xdest</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">xdest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_XDEST_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">ydest</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">ydest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_YDEST_TAG_CATEGORY</span><span class="p">))</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="n">Q</span><span class="p">()</span> <span class="k">if</span> <span class="n">zdest</span> <span class="o">==</span> <span class="n">wildcard</span>
<span class="k">else</span> <span class="n">Q</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">zdest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_ZDEST_TAG_CATEGORY</span><span class="p">))</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="XYZExitManager.get_xyz_exit"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExitManager.get_xyz_exit">[docs]</a> <span class="k">def</span> <span class="nf">get_xyz_exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="n">xyz_destination</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Used by exits (objects with a source and -destination property). Get a single</span>
<span class="sd"> exit. All source/destination coordinates (as well as the map&#39;s name) are required.</span>
<span class="sd"> This will also find children of XYZExits on the given coords.</span>
<span class="sd"> Kwargs:</span>
<span class="sd"> xyz (tuple, optional): A coordinate (X, Y, Z) for the source location. Each</span>
<span class="sd"> element is either an `int` or `str` (not `*`, no wildcards are allowed for get).</span>
<span class="sd"> the `Z`-coordinate is the name of the map (case-sensitive) in the XYZgrid contrib.</span>
<span class="sd"> xyz_destination_coord (tuple, optional): Same as the `xyz` but for the destination of</span>
<span class="sd"> the exit.</span>
<span class="sd"> **kwargs: All other kwargs are passed on to the query.</span>
<span class="sd"> Returns:</span>
<span class="sd"> XYZExit: A single exit instance found at the combination of x, y and xgiven.</span>
<span class="sd"> Raises:</span>
<span class="sd"> XYZExit.DoesNotExist: If no matching query was found.</span>
<span class="sd"> XYZExit.MultipleObjectsReturned: If more than one match was found (which should not</span>
<span class="sd"> be possible with a unique combination of x,y,x).</span>
<span class="sd"> Notes:</span>
<span class="sd"> All coordinates are required.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="n">xdest</span><span class="p">,</span> <span class="n">ydest</span><span class="p">,</span> <span class="n">zdest</span> <span class="o">=</span> <span class="n">xyz_destination</span>
<span class="c1"># mimic get_family</span>
<span class="n">paths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_typeclass_path__in&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">paths</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">xdest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_XDEST_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">ydest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_YDEST_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_tags__db_key</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">zdest</span><span class="p">),</span> <span class="n">db_tags__db_category</span><span class="o">=</span><span class="n">MAP_ZDEST_TAG_CATEGORY</span><span class="p">)</span>
<span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;xyz=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">),xyz_destination=(</span><span class="si">{</span><span class="n">xdest</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">ydest</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">zdest</span><span class="si">}</span><span class="s2">),&quot;</span> <span class="o">+</span>
<span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> &quot;</span>
<span class="sa">f</span><span class="s2">&quot;matching query </span><span class="si">{</span><span class="n">inp</span><span class="si">}</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="XYZRoom"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZRoom">[docs]</a><span class="k">class</span> <span class="nc">XYZRoom</span><span class="p">(</span><span class="n">DefaultRoom</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A game location aware of its XYZ-position.</span>
<span class="sd"> Special properties:</span>
<span class="sd"> map_display (bool): If the return_appearance of the room should</span>
<span class="sd"> show the map or not.</span>
<span class="sd"> map_mode (str): One of &#39;nodes&#39; or &#39;scan&#39;. See `return_apperance`</span>
<span class="sd"> for examples of how they differ.</span>
<span class="sd"> map_visual_range (int): How far on the map one can see. This is a</span>
<span class="sd"> fixed value here, but could also be dynamic based on skills,</span>
<span class="sd"> light etc.</span>
<span class="sd"> map_character_symbol (str): The character symbol to use to show</span>
<span class="sd"> the character position. Can contain color info. Default is</span>
<span class="sd"> the @-character.</span>
<span class="sd"> map_area_client (bool): If True, map area will always fill the entire</span>
<span class="sd"> client width. If False, the map area&#39;s width will vary with the</span>
<span class="sd"> width of the currently displayed location description.</span>
<span class="sd"> map_fill_all (bool): I the map area should fill the client width or not.</span>
<span class="sd"> map_separator_char (str): The char to use to separate the map area from</span>
<span class="sd"> the room description.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># makes the `room.objects.filter_xymap` available</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">XYZManager</span><span class="p">()</span>
<span class="c1"># default settings for map visualization</span>
<span class="n">map_display</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">map_mode</span> <span class="o">=</span> <span class="s1">&#39;nodes&#39;</span> <span class="c1"># or &#39;scan&#39;</span>
<span class="n">map_visual_range</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">map_character_symbol</span> <span class="o">=</span> <span class="s2">&quot;|g@|n&quot;</span>
<span class="n">map_align</span> <span class="o">=</span> <span class="s1">&#39;c&#39;</span>
<span class="n">map_target_path_style</span> <span class="o">=</span> <span class="s2">&quot;|y</span><span class="si">{display_symbol}</span><span class="s2">|n&quot;</span>
<span class="n">map_fill_all</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">map_separator_char</span> <span class="o">=</span> <span class="s2">&quot;|x~|n&quot;</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;&lt;XYZRoom &#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">db_key</span><span class="si">}</span><span class="s2">&#39;, XYZ=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">)&gt;&quot;</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_xyz&quot;</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">x</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">y</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">z</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># don&#39;t cache unfinished coordinate (probably tags have not finished saving)</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">coord</span><span class="p">)</span> <span class="k">if</span> <span class="n">coord</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">coord</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">else</span> <span class="n">coord</span>
<span class="k">for</span> <span class="n">coord</span> <span class="ow">in</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="c1"># cache result, convert to correct types (tags are strings)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_xyz</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">coord</span><span class="p">)</span> <span class="k">if</span> <span class="n">coord</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">else</span> <span class="n">coord</span> <span class="k">for</span> <span class="n">coord</span> <span class="ow">in</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_xyz</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xyzgrid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">GET_XYZGRID</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">GET_XYZGRID</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzgrid</span> <span class="kn">import</span> <span class="n">get_xyzgrid</span> <span class="k">as</span> <span class="n">GET_XYZGRID</span>
<span class="k">return</span> <span class="n">GET_XYZGRID</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xymap</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_xymap&quot;</span><span class="p">):</span>
<span class="n">xyzgrid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyzgrid</span>
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_xymap</span> <span class="o">=</span> <span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_xymap</span>
<div class="viewcode-block" id="XYZRoom.create"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZRoom.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creation method aware of XYZ coordinates.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): New name of object to create.</span>
<span class="sd"> account (Account, optional): Any Account to tie to this entity (usually not used for</span>
<span class="sd"> rooms).</span>
<span class="sd"> xyz (tuple, optional): A 3D coordinate (X, Y, Z) for this room&#39;s location on a</span>
<span class="sd"> map grid. Each element can theoretically be either `int` or `str`, but for the</span>
<span class="sd"> XYZgrid, the X, Y are always integers while the `Z` coordinate is used for the</span>
<span class="sd"> map&#39;s name.</span>
<span class="sd"> **kwargs: Will be passed into the normal `DefaultRoom.create` method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> room (Object): A newly created Room of the given typeclass.</span>
<span class="sd"> errors (list): A list of errors in string form, if any.</span>
<span class="sd"> Notes:</span>
<span class="sd"> The (X, Y, Z) coordinate must be unique across the game. If trying to create</span>
<span class="sd"> a room at a coordinate that already exists, an error will be returned.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;XYRroom.create got `xyz=</span><span class="si">{</span><span class="n">xyz</span><span class="si">}</span><span class="s2">` - needs a valid (X,Y,Z) &quot;</span>
<span class="s2">&quot;coordinate of ints/strings.&quot;</span><span class="p">]</span>
<span class="n">existing_query</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="k">if</span> <span class="n">existing_query</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="n">existing_room</span> <span class="o">=</span> <span class="n">existing_query</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;XYRoom XYZ=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">) already exists &quot;</span>
<span class="sa">f</span><span class="s2">&quot;(existing room is named &#39;</span><span class="si">{</span><span class="n">existing_room</span><span class="o">.</span><span class="n">db_key</span><span class="si">}</span><span class="s2">&#39;)!&quot;</span><span class="p">]</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">MAP_X_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">DefaultRoom</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="XYZRoom.get_display_name"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZRoom.get_display_name">[docs]</a> <span class="k">def</span> <span class="nf">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Shows both the #dbref and the xyz coord to staff.</span>
<span class="sd"> Args:</span>
<span class="sd"> looker (TypedObject): The object or account that is looking</span>
<span class="sd"> at/getting inforamtion for this object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> name (str): A string containing the name of the object,</span>
<span class="sd"> including the DBREF and XYZ coord if this user is</span>
<span class="sd"> privileged to control the room.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">check_lockstring</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="s2">&quot;perm(Builder)&quot;</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">[#</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">)]&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span></div>
<div class="viewcode-block" id="XYZRoom.return_appearance"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZRoom.return_appearance">[docs]</a> <span class="k">def</span> <span class="nf">return_appearance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Displays the map in addition to the room description</span>
<span class="sd"> Args:</span>
<span class="sd"> looker (Object): The one looking.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> map_display (bool): Turn on/off map display.</span>
<span class="sd"> map_visual_range (int): How &#39;far&#39; one can see on the map. For</span>
<span class="sd"> &#39;nodes&#39; mode, this is how many connected nodes away, for</span>
<span class="sd"> &#39;scan&#39; mode, this is number of characters away on the map.</span>
<span class="sd"> Default is a visual range of 2 (nodes).</span>
<span class="sd"> map_mode (str): One of &#39;node&#39; (default) or &#39;scan&#39;.</span>
<span class="sd"> map_character_symbol (str): The character symbol to use. Defaults to &#39;@&#39;.</span>
<span class="sd"> This can also be colored with standard color tags. Set to `None`</span>
<span class="sd"> to just show the current node.</span>
<span class="sd"> Examples:</span>
<span class="sd"> Assume this is the full map (where &#39;@&#39; is the character location):</span>
<span class="sd"> ::</span>
<span class="sd"> #----------------#</span>
<span class="sd"> | |</span>
<span class="sd"> | |</span>
<span class="sd"> # @------------#-#</span>
<span class="sd"> | |</span>
<span class="sd"> #----------------#</span>
<span class="sd"> This is how it will look in &#39;nodes&#39; mode with `visual_range=2`:</span>
<span class="sd"> ::</span>
<span class="sd"> @------------#-#</span>
<span class="sd"> And in &#39;scan&#39; mode with `visual_range=2`:</span>
<span class="sd"> ::</span>
<span class="sd"> |</span>
<span class="sd"> |</span>
<span class="sd"> # @--</span>
<span class="sd"> |</span>
<span class="sd"> #----</span>
<span class="sd"> Notes:</span>
<span class="sd"> The map kwargs default to values with the same names set on the</span>
<span class="sd"> XYZRoom class; these can be changed by overriding the room.</span>
<span class="sd"> We return the map display as a separate msg() call here, in order</span>
<span class="sd"> to make it easier to break this out into a client pane etc. The</span>
<span class="sd"> map is tagged with type=&#39;xymap&#39;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># normal get_appearance of a room</span>
<span class="n">room_desc</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">return_appearance</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># get current xymap</span>
<span class="n">xyz</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz</span>
<span class="n">xymap</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyzgrid</span><span class="o">.</span><span class="n">get_map</span><span class="p">(</span><span class="n">xyz</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="k">if</span> <span class="n">xymap</span> <span class="ow">and</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;map_display&#39;</span><span class="p">,</span> <span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_display&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_display</span><span class="p">)):</span>
<span class="c1"># show the near-area map.</span>
<span class="n">map_character_symbol</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s1">&#39;map_character_symbol&#39;</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_character_symbol&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_character_symbol</span><span class="p">))</span>
<span class="n">map_visual_range</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_visual_range&quot;</span><span class="p">,</span> <span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_visual_range&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_visual_range</span><span class="p">))</span>
<span class="n">map_mode</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_mode&quot;</span><span class="p">,</span> <span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_mode&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_mode</span><span class="p">))</span>
<span class="n">map_align</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_align&quot;</span><span class="p">,</span> <span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_align&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_align</span><span class="p">))</span>
<span class="n">map_target_path_style</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_target_path_style&quot;</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_target_path_style&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_target_path_style</span><span class="p">))</span>
<span class="n">map_area_client</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_fill_all&quot;</span><span class="p">,</span> <span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_fill_all&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_fill_all</span><span class="p">))</span>
<span class="n">map_separator_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;map_separator_char&quot;</span><span class="p">,</span>
<span class="n">xymap</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;map_separator_char&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">map_separator_char</span><span class="p">))</span>
<span class="n">client_width</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">looker</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_client_size</span><span class="p">()</span>
<span class="n">map_width</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">max_x</span>
<span class="k">if</span> <span class="n">map_area_client</span><span class="p">:</span>
<span class="n">display_width</span> <span class="o">=</span> <span class="n">client_width</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">display_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">map_width</span><span class="p">,</span>
<span class="nb">max</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">room_desc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)))</span>
<span class="c1"># align map</span>
<span class="n">map_indent</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">sep_width</span> <span class="o">=</span> <span class="n">display_width</span>
<span class="k">if</span> <span class="n">map_align</span> <span class="o">==</span> <span class="s1">&#39;r&#39;</span><span class="p">:</span>
<span class="n">map_indent</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">display_width</span> <span class="o">-</span> <span class="n">map_width</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">map_align</span> <span class="o">==</span> <span class="s1">&#39;c&#39;</span><span class="p">:</span>
<span class="n">map_indent</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">display_width</span> <span class="o">-</span> <span class="n">map_width</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span>
<span class="c1"># data set by the goto/path-command, for displaying the shortest path</span>
<span class="n">path_data</span> <span class="o">=</span> <span class="n">looker</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">xy_path_data</span>
<span class="n">target_xy</span> <span class="o">=</span> <span class="n">path_data</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">xyz</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">if</span> <span class="n">path_data</span> <span class="k">else</span> <span class="kc">None</span>
<span class="c1"># get visual range display from map</span>
<span class="n">map_display</span> <span class="o">=</span> <span class="n">xymap</span><span class="o">.</span><span class="n">get_visual_range</span><span class="p">(</span>
<span class="p">(</span><span class="n">xyz</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">xyz</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
<span class="n">dist</span><span class="o">=</span><span class="n">map_visual_range</span><span class="p">,</span>
<span class="n">mode</span><span class="o">=</span><span class="n">map_mode</span><span class="p">,</span>
<span class="n">target</span><span class="o">=</span><span class="n">target_xy</span><span class="p">,</span>
<span class="n">target_path_style</span><span class="o">=</span><span class="n">map_target_path_style</span><span class="p">,</span>
<span class="n">character</span><span class="o">=</span><span class="n">map_character_symbol</span><span class="p">,</span>
<span class="n">max_size</span><span class="o">=</span><span class="p">(</span><span class="n">display_width</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="n">indent</span><span class="o">=</span><span class="n">map_indent</span>
<span class="p">)</span>
<span class="n">sep</span> <span class="o">=</span> <span class="n">map_separator_char</span> <span class="o">*</span> <span class="n">sep_width</span>
<span class="n">map_display</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">sep</span><span class="si">}</span><span class="s2">|n</span><span class="se">\n</span><span class="si">{</span><span class="n">map_display</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">sep</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># echo directly to make easier to separate in client</span>
<span class="n">looker</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">map_display</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;xymap&quot;</span><span class="p">}),</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">room_desc</span></div></div>
<div class="viewcode-block" id="XYZExit"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExit">[docs]</a><span class="k">class</span> <span class="nc">XYZExit</span><span class="p">(</span><span class="n">DefaultExit</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An exit that is aware of the XYZ coordinate system.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">XYZExitManager</span><span class="p">()</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz</span>
<span class="n">xd</span><span class="p">,</span> <span class="n">yd</span><span class="p">,</span> <span class="n">zd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xyz_destination</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;&lt;XYZExit &#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">db_key</span><span class="si">}</span><span class="s2">&#39;, XYZ=(</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="s2">)-&gt;(</span><span class="si">{</span><span class="n">xd</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">yd</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">zd</span><span class="si">}</span><span class="s2">)&gt;&quot;</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xyzgrid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">GET_XYZGRID</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">GET_XYZGRID</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.contrib.xyzgrid.xyzgrid</span> <span class="kn">import</span> <span class="n">get_xyzgrid</span> <span class="k">as</span> <span class="n">GET_XYZGRID</span>
<span class="k">return</span> <span class="n">GET_XYZGRID</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_xyz&quot;</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_X_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">x</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">y</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">z</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># don&#39;t cache yet unfinished coordinate</span>
<span class="k">return</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="c1"># cache result</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_xyz</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_xyz</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">xyz_destination</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_xyz_destination&quot;</span><span class="p">):</span>
<span class="n">xd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_XDEST_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">yd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_YDEST_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">zd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">MAP_ZDEST_TAG_CATEGORY</span><span class="p">,</span> <span class="n">return_list</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">xd</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">yd</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">zd</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># don&#39;t cache unfinished coordinate</span>
<span class="k">return</span> <span class="p">(</span><span class="n">xd</span><span class="p">,</span> <span class="n">yd</span><span class="p">,</span> <span class="n">zd</span><span class="p">)</span>
<span class="c1"># cache result</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_xyz_destination</span> <span class="o">=</span> <span class="p">(</span><span class="n">xd</span><span class="p">,</span> <span class="n">yd</span><span class="p">,</span> <span class="n">zd</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_xyz_destination</span>
<div class="viewcode-block" id="XYZExit.create"><a class="viewcode-back" href="../../../../api/evennia.contrib.xyzgrid.xyzroom.html#evennia.contrib.xyzgrid.xyzroom.XYZExit.create">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">account</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="n">xyz_destination</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">),</span>
<span class="n">location</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">destination</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creation method aware of coordinates.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): New name of object to create.</span>
<span class="sd"> account (Account, optional): Any Account to tie to this entity (unused for exits).</span>
<span class="sd"> xyz (tuple or None, optional): A 3D coordinate (X, Y, Z) for this room&#39;s location</span>
<span class="sd"> on a map grid. Each element can theoretically be either `int` or `str`, but for the</span>
<span class="sd"> XYZgrid contrib, the X, Y are always integers while the `Z` coordinate is used for</span>
<span class="sd"> the map&#39;s name. Set to `None` if instead using a direct room reference with</span>
<span class="sd"> `location`.</span>
<span class="sd"> xyz_destination (tuple, optional): The XYZ coordinate of the place the exit</span>
<span class="sd"> leads to. Will be ignored if `destination` is given directly.</span>
<span class="sd"> location (Object, optional): If given, overrides `xyz` coordinate. This can be used</span>
<span class="sd"> to place this exit in any room, including non-XYRoom type rooms.</span>
<span class="sd"> destination (Object, optional): If given, overrides `xyz_destination`. This can</span>
<span class="sd"> be any room (including non-XYRooms) and is not checked for XYZ coordinates.</span>
<span class="sd"> **kwargs: Will be passed into the normal `DefaultRoom.create` method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> tuple: A tuple `(exit, errors)`, where the errors is a list containing all found</span>
<span class="sd"> errors (in which case the returned exit will be `None`).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tags</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">location</span><span class="p">:</span>
<span class="n">source</span> <span class="o">=</span> <span class="n">location</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">xyz</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;XYExit.create need either `xyz=(X,Y,Z)` coordinate or a `location`.&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">source</span> <span class="o">=</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">))</span>
<span class="n">tags</span><span class="o">.</span><span class="n">extend</span><span class="p">(((</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">MAP_X_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">MAP_Y_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">MAP_Z_TAG_CATEGORY</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">destination</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">destination</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">xdest</span><span class="p">,</span> <span class="n">ydest</span><span class="p">,</span> <span class="n">zdest</span> <span class="o">=</span> <span class="n">xyz_destination</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;XYExit.create need either `xyz_destination=(X,Y,Z)` coordinate &quot;</span>
<span class="s2">&quot;or a `destination`.&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">XYZRoom</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_xyz</span><span class="p">(</span><span class="n">xyz</span><span class="o">=</span><span class="p">(</span><span class="n">xdest</span><span class="p">,</span> <span class="n">ydest</span><span class="p">,</span> <span class="n">zdest</span><span class="p">))</span>
<span class="n">tags</span><span class="o">.</span><span class="n">extend</span><span class="p">(((</span><span class="nb">str</span><span class="p">(</span><span class="n">xdest</span><span class="p">),</span> <span class="n">MAP_XDEST_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ydest</span><span class="p">),</span> <span class="n">MAP_YDEST_TAG_CATEGORY</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">zdest</span><span class="p">),</span> <span class="n">MAP_ZDEST_TAG_CATEGORY</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">DefaultExit</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
<span class="n">key</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span>
<span class="n">account</span><span class="o">=</span><span class="n">account</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">typeclass</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li><a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC</a> -
<a href="https://discord.gg/NecFePw">Discord</a> -
<a href="https://groups.google.com/forum/#%21forum/evennia">Forums</a>
</li>
<li><a href="http://evennia.blogspot.com/">Evennia Dev blog</a> </li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="xyzroom.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.xyzgrid.xyzroom</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>

View file

@ -161,7 +161,12 @@
<span class="sd"> obj (Object): object to remove</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pkcache</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pkcache</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="c1"># not in pk cache, but can happen deletions happens</span>
<span class="c1"># remotely from out-of-thread.</span>
<span class="k">pass</span>
<span class="k">for</span> <span class="n">ctype</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">_content_types</span><span class="p">:</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_typecache</span><span class="p">[</span><span class="n">ctype</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_typecache</span><span class="p">[</span><span class="n">ctype</span><span class="p">]</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
@ -382,9 +387,11 @@
<span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">:</span>
<span class="n">errmsg</span> <span class="o">=</span> <span class="s2">&quot;Error: </span><span class="si">%s</span><span class="s2">.location = </span><span class="si">%s</span><span class="s2"> creates a location loop.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">location</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">errmsg</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errmsg</span> <span class="o">=</span> <span class="s2">&quot;Error (</span><span class="si">%s</span><span class="s2">): </span><span class="si">%s</span><span class="s2"> is not a valid location.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="n">location</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">errmsg</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="c1"># raising here gives more info for now</span>
<span class="k">raise</span>
<span class="c1"># errmsg = &quot;Error (%s): %s is not a valid location.&quot; % (str(e), location)</span>
<span class="c1"># raise RuntimeError(errmsg)</span>
<span class="k">return</span>
<span class="k">def</span> <span class="nf">__location_del</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>

View file

@ -903,7 +903,6 @@
<span class="sd"> 7. `self.at_after_move(source_location)`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">logerr</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Simple log helper method&quot;&quot;&quot;</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
@ -925,7 +924,6 @@
<span class="k">if</span> <span class="n">destination</span><span class="o">.</span><span class="n">destination</span> <span class="ow">and</span> <span class="n">use_destination</span><span class="p">:</span>
<span class="c1"># traverse exits</span>
<span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span><span class="o">.</span><span class="n">destination</span>
<span class="c1"># Before the move, call eventual pre-commands.</span>
<span class="k">if</span> <span class="n">move_hooks</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
@ -2313,7 +2311,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">))</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">at_look</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;look&quot;</span><span class="p">}))</span></div>
<div class="viewcode-block" id="DefaultCharacter.at_pre_puppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.at_pre_puppet">[docs]</a> <span class="k">def</span> <span class="nf">at_pre_puppet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">account</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@ -2488,7 +2486,7 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">locks</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">account</span><span class="p">:</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
<span class="n">locks</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">lockstring</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
<span class="n">obj</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">locks</span><span class="p">)</span>

View file

@ -134,8 +134,8 @@
<span class="sd"> homogenizations like adding missing prototype_keys and setting a default typeclass.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">prototype</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="n">prototype</span>
<span class="n">reserved</span> <span class="o">=</span> <span class="n">_PROTOTYPE_RESERVED_KEYS</span> <span class="o">+</span> <span class="p">(</span><span class="n">custom_keys</span> <span class="ow">or</span> <span class="p">())</span>
@ -186,19 +186,45 @@
<span class="k">return</span> <span class="n">homogenized</span></div>
<span class="c1"># module-based prototypes</span>
<span class="c1"># module/dict-based prototypes</span>
<div class="viewcode-block" id="load_module_prototypes"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.load_module_prototypes">[docs]</a><span class="k">def</span> <span class="nf">load_module_prototypes</span><span class="p">():</span>
<div class="viewcode-block" id="load_module_prototypes"><a class="viewcode-back" href="../../../api/evennia.prototypes.prototypes.html#evennia.prototypes.prototypes.load_module_prototypes">[docs]</a><span class="k">def</span> <span class="nf">load_module_prototypes</span><span class="p">(</span><span class="o">*</span><span class="n">mod_or_prototypes</span><span class="p">,</span> <span class="n">override</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is called by `evennia.__init__` as Evennia initializes. It&#39;s important</span>
<span class="sd"> to do this late so as to not interfere with evennia initialization.</span>
<span class="sd"> Load module prototypes. Also prototype-dicts passed directly to this function are considered</span>
<span class="sd"> &#39;module&#39; prototypes (they are impossible to change) but will have a module of None.</span>
<span class="sd"> Args:</span>
<span class="sd"> *mod_or_prototypes (module or dict): Each arg should be a separate module or</span>
<span class="sd"> prototype-dict to load. If none are given, `settings.PROTOTYPE_MODULES` will be used.</span>
<span class="sd"> override (bool, optional): If prototypes should override existing ones already loaded.</span>
<span class="sd"> Disabling this can allow for injecting prototypes into the system dynamically while</span>
<span class="sd"> still allowing same prototype-keys to be overridden from settings (even though settings</span>
<span class="sd"> is usually loaded before dynamic loading).</span>
<span class="sd"> Note:</span>
<span class="sd"> This is called (without arguments) by `evennia.__init__` as Evennia initializes. It&#39;s</span>
<span class="sd"> important to do this late so as to not interfere with evennia initialization. But it can</span>
<span class="sd"> also be used later to add more prototypes to the library on the fly. This is requried</span>
<span class="sd"> before a module-based prototype can be accessed by prototype-key.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">PROTOTYPE_MODULES</span><span class="p">:</span>
<span class="c1"># to remove a default prototype, override it with an empty dict.</span>
<span class="c1"># internally we store as (key, desc, locks, tags, prototype_dict)</span>
<span class="n">prots</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">global</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="p">,</span> <span class="n">_MODULE_PROTOTYPES</span>
<span class="k">def</span> <span class="nf">_prototypes_from_module</span><span class="p">(</span><span class="n">mod</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Load prototypes from a module, first by looking for a global list PROTOTYPE_LIST (a list of</span>
<span class="sd"> dict-prototypes), and if not found, assuming all global-level dicts in the module are</span>
<span class="sd"> prototypes.</span>
<span class="sd"> Args:</span>
<span class="sd"> mod (module): The module to load from.evennia</span>
<span class="sd"> Returns:</span>
<span class="sd"> list: A list of tuples `(prototype_key, prototype-dict)` where the prototype</span>
<span class="sd"> has been homogenized.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">prots</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">prototype_list</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="s2">&quot;PROTOTYPE_LIST&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prototype_list</span><span class="p">:</span>
<span class="c1"># found mod.PROTOTYPE_LIST - this should be a list of valid</span>
@ -221,27 +247,74 @@
<span class="k">if</span> <span class="s2">&quot;prototype_key&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">prot</span><span class="p">:</span>
<span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">variable_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">prots</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">],</span> <span class="n">homogenize_prototype</span><span class="p">(</span><span class="n">prot</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">prots</span>
<span class="c1"># assign module path to each prototype_key for easy reference</span>
<span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">prototype_key</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">mod</span> <span class="k">for</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">prots</span><span class="p">})</span>
<span class="c1"># make sure the prototype contains all meta info</span>
<span class="k">def</span> <span class="nf">_cleanup_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">prototype</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> We need to handle externally determined prototype-keys and to make sure</span>
<span class="sd"> the prototype contains all needed meta information.</span>
<span class="sd"> Args:</span>
<span class="sd"> prototype_key (str): The determined name of the prototype.</span>
<span class="sd"> prototype (dict): The prototype itself.</span>
<span class="sd"> mod (module, optional): The module the prototype was loaded from, if any.</span>
<span class="sd"> Returns:</span>
<span class="sd"> dict: The cleaned up prototype.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">actual_prot_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">prototype</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="n">actual_prot_key</span><span class="p">,</span>
<span class="s2">&quot;prototype_desc&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_desc&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;prototype_desc&quot;</span> <span class="ow">in</span> <span class="n">prototype</span> <span class="k">else</span> <span class="p">(</span><span class="n">mod</span> <span class="ow">or</span> <span class="s2">&quot;N/A&quot;</span><span class="p">)),</span>
<span class="s2">&quot;prototype_locks&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="n">prototype</span><span class="p">[</span><span class="s2">&quot;prototype_locks&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="s2">&quot;prototype_locks&quot;</span> <span class="ow">in</span> <span class="n">prototype</span>
<span class="k">else</span> <span class="s2">&quot;use:all();edit:false()&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;prototype_tags&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">set</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">make_iter</span><span class="p">(</span><span class="n">prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_tags&quot;</span><span class="p">,</span> <span class="p">[])))</span> <span class="o">+</span> <span class="p">[</span><span class="s2">&quot;module&quot;</span><span class="p">])</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">prototype</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">mod_or_prototypes</span><span class="p">:</span>
<span class="c1"># in principle this means PROTOTYPE_MODULES could also contain prototypes, but that is</span>
<span class="c1"># rarely useful ...</span>
<span class="n">mod_or_prototypes</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">PROTOTYPE_MODULES</span>
<span class="k">for</span> <span class="n">mod_or_dict</span> <span class="ow">in</span> <span class="n">mod_or_prototypes</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mod_or_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># a single prototype; we must make sure it has its key</span>
<span class="n">prototype_key</span> <span class="o">=</span> <span class="n">mod_or_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;prototype_key&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prototype_key</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;The prototype </span><span class="si">{</span><span class="n">mod_or_prototype</span><span class="si">}</span><span class="s2"> does not contain a &#39;prototype_key&#39;&quot;</span><span class="p">)</span>
<span class="n">prots</span> <span class="o">=</span> <span class="p">[(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">mod_or_dict</span><span class="p">)]</span>
<span class="n">mod</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># a module (or path to module). This can contain many prototypes; they can be keyed by</span>
<span class="c1"># variable-name too</span>
<span class="n">prots</span> <span class="o">=</span> <span class="n">_prototypes_from_module</span><span class="p">(</span><span class="n">mod_or_dict</span><span class="p">)</span>
<span class="n">mod</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">mod_or_dict</span><span class="p">)</span>
<span class="c1"># store all found prototypes</span>
<span class="k">for</span> <span class="n">prototype_key</span><span class="p">,</span> <span class="n">prot</span> <span class="ow">in</span> <span class="n">prots</span><span class="p">:</span>
<span class="n">actual_prot_key</span> <span class="o">=</span> <span class="n">prot</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="n">prototype_key</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">prot</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="n">actual_prot_key</span><span class="p">,</span>
<span class="s2">&quot;prototype_desc&quot;</span><span class="p">:</span> <span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_desc&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="s2">&quot;prototype_desc&quot;</span> <span class="ow">in</span> <span class="n">prot</span> <span class="k">else</span> <span class="n">mod</span><span class="p">,</span>
<span class="s2">&quot;prototype_locks&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="n">prot</span><span class="p">[</span><span class="s2">&quot;prototype_locks&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="s2">&quot;prototype_locks&quot;</span> <span class="ow">in</span> <span class="n">prot</span>
<span class="k">else</span> <span class="s2">&quot;use:all();edit:false()&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;prototype_tags&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">set</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">make_iter</span><span class="p">(</span><span class="n">prot</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prototype_tags&quot;</span><span class="p">,</span> <span class="p">[])))</span> <span class="o">+</span> <span class="p">[</span><span class="s2">&quot;module&quot;</span><span class="p">])</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">_MODULE_PROTOTYPES</span><span class="p">[</span><span class="n">actual_prot_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">prot</span></div>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">_cleanup_prototype</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">prot</span><span class="p">,</span> <span class="n">mod</span><span class="o">=</span><span class="n">mod</span><span class="p">)</span>
<span class="c1"># the key can change since in-proto key is given prio over variable-name-based keys</span>
<span class="n">actual_prototype_key</span> <span class="o">=</span> <span class="n">prototype</span><span class="p">[</span><span class="s1">&#39;prototype_key&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">actual_prototype_key</span> <span class="ow">in</span> <span class="n">_MODULE_PROTOTYPES</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">override</span><span class="p">:</span>
<span class="c1"># don&#39;t override - useful to still let settings replace dynamic inserts</span>
<span class="k">continue</span>
<span class="c1"># make sure the prototype contains all meta info</span>
<span class="n">_MODULE_PROTOTYPES</span><span class="p">[</span><span class="n">actual_prototype_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">prototype</span>
<span class="c1"># track module path for display purposes</span>
<span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="p">[</span><span class="n">actual_prototype_key</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">mod</span></div>
<span class="c1"># Db-based prototypes</span>
@ -308,11 +381,12 @@
<span class="c1"># we can&#39;t edit a prototype defined in a module</span>
<span class="k">if</span> <span class="n">prototype_key</span> <span class="ow">in</span> <span class="n">_MODULE_PROTOTYPES</span><span class="p">:</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="s2">&quot;N/A&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">PermissionError</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype &quot;</span> <span class="s2">&quot;(defined as code in </span><span class="si">{module}</span><span class="s2">).&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">protkey</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">mod</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mod</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (defined as code in </span><span class="si">{module}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (passed directly as a dict).&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">PermissionError</span><span class="p">(</span><span class="n">err</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">protkey</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">mod</span><span class="p">))</span>
<span class="c1"># make sure meta properties are included with defaults</span>
<span class="n">in_prototype</span><span class="p">[</span><span class="s2">&quot;prototype_desc&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">in_prototype</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
@ -376,11 +450,12 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">prototype_key</span> <span class="ow">in</span> <span class="n">_MODULE_PROTOTYPES</span><span class="p">:</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s2">&quot;N/A&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">PermissionError</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype &quot;</span> <span class="s2">&quot;(defined as code in </span><span class="si">{module}</span><span class="s2">).&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">protkey</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">mod</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mod</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (defined as code in </span><span class="si">{module}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (passed directly as a dict).&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">PermissionError</span><span class="p">(</span><span class="n">err</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">protkey</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">mod</span><span class="p">))</span>
<span class="n">stored_prototype</span> <span class="o">=</span> <span class="n">DbPrototype</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">db_key__iexact</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">)</span>
@ -451,7 +526,7 @@
<span class="k">if</span> <span class="n">key</span><span class="p">:</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">mod_matches</span><span class="p">:</span>
<span class="c1"># exact match</span>
<span class="n">module_prototypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">mod_matches</span><span class="p">[</span><span class="n">key</span><span class="p">]]</span>
<span class="n">module_prototypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">mod_matches</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()]</span>
<span class="n">allow_fuzzy</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># fuzzy matching</span>
@ -461,7 +536,9 @@
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">prototype_key</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">module_prototypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">match</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">mod_matches</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
<span class="c1"># note - we return a copy of the prototype dict, otherwise using this with e.g.</span>
<span class="c1"># prototype_from_object will modify the base prototype for every object</span>
<span class="n">module_prototypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">mod_matches</span><span class="o">.</span><span class="n">values</span><span class="p">()]</span>
<span class="c1"># search db-stored prototypes</span>
@ -494,7 +571,7 @@
<span class="n">ndbprots</span> <span class="o">=</span> <span class="n">db_matches</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="k">if</span> <span class="n">nmodules</span> <span class="o">+</span> <span class="n">ndbprots</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;Found </span><span class="si">{num}</span><span class="s2"> matching prototypes </span><span class="si">{module_prototypes}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="s2">&quot;Found </span><span class="si">{num}</span><span class="s2"> matching prototypes among </span><span class="si">{module_prototypes}</span><span class="s2">.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">num</span><span class="o">=</span><span class="n">nmodules</span> <span class="o">+</span> <span class="n">ndbprots</span><span class="p">,</span>
<span class="n">module_prototypes</span><span class="o">=</span><span class="n">module_prototypes</span><span class="p">)</span>
<span class="p">)</span>
@ -948,10 +1025,12 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s2">&quot;edit&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">prototype_key</span> <span class="ow">in</span> <span class="n">_MODULE_PROTOTYPES</span><span class="p">:</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="s2">&quot;N/A&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> is a read-only prototype &quot;</span> <span class="s2">&quot;(defined as code in </span><span class="si">{}</span><span class="s2">).&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">mod</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">_MODULE_PROTOTYPE_MODULES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">prototype_key</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mod</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (defined as code in </span><span class="si">{module}</span><span class="s2">).&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{protkey}</span><span class="s2"> is a read-only prototype (passed directly as a dict).&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="n">err</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">protkey</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="n">mod</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">prototype</span> <span class="o">=</span> <span class="n">search_prototype</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">prototype_key</span><span class="p">)</span>
@ -1018,7 +1097,8 @@
<span class="n">stype</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">stype</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">key</span><span class="p">):</span> <span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">iter</span><span class="p">()}</span>
<span class="k">return</span> <span class="p">{</span><span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">key</span><span class="p">):</span> <span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">stype</span><span class="p">([</span><span class="n">value_to_obj_or_any</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
<span class="k">return</span> <span class="n">dbid_to_obj</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">ObjectDB</span><span class="p">)</span></div>

View file

@ -196,7 +196,8 @@
<span class="n">_CREATE_OBJECT_KWARGS</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;key&quot;</span><span class="p">,</span> <span class="s2">&quot;location&quot;</span><span class="p">,</span> <span class="s2">&quot;home&quot;</span><span class="p">,</span> <span class="s2">&quot;destination&quot;</span><span class="p">)</span>
<span class="n">_PROTOTYPE_META_NAMES</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_desc&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_tags&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_locks&quot;</span><span class="p">)</span>
<span class="n">_PROTOTYPE_META_NAMES</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;prototype_key&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_desc&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_tags&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_locks&quot;</span><span class="p">,</span> <span class="s2">&quot;prototype_parent&quot;</span><span class="p">)</span>
<span class="n">_PROTOTYPE_ROOT_NAMES</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;typeclass&quot;</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">,</span>

View file

@ -1955,6 +1955,51 @@
<span class="nb">print</span><span class="p">(</span><span class="n">table</span><span class="p">)</span></div>
<div class="viewcode-block" id="run_custom_commands"><a class="viewcode-back" href="../../../api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.run_custom_commands">[docs]</a><span class="k">def</span> <span class="nf">run_custom_commands</span><span class="p">(</span><span class="n">option</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inject a custom option into the evennia launcher command chain.</span>
<span class="sd"> Args:</span>
<span class="sd"> option (str): Incoming option - the first argument after `evennia` on</span>
<span class="sd"> the command line.</span>
<span class="sd"> *args: All args will passed to a found callable.__dict__</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: If a custom command was found and handled the option.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Provide new commands in settings with</span>
<span class="sd"> CUSTOM_EVENNIA_LAUNCHER_COMMANDS = {&quot;mycmd&quot;: &quot;path.to.callable&quot;, ...}</span>
<span class="sd"> The callable will be passed any `*args` given on the command line and is expected to</span>
<span class="sd"> handle/validate the input correctly. Use like any other evennia command option on</span>
<span class="sd"> in the terminal/console, for example:</span>
<span class="sd"> evennia mycmd foo bar</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># a dict of {option: callable(*args), ...}</span>
<span class="n">custom_commands</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">EXTRA_LAUNCHER_COMMANDS</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">cmdpath</span> <span class="o">=</span> <span class="n">custom_commands</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">option</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cmdpath</span><span class="p">:</span>
<span class="n">modpath</span><span class="p">,</span> <span class="o">*</span><span class="n">cmdname</span> <span class="o">=</span> <span class="n">cmdpath</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cmdname</span><span class="p">:</span>
<span class="n">cmdname</span> <span class="o">=</span> <span class="n">cmdname</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">modpath</span><span class="p">)</span>
<span class="n">command</span> <span class="o">=</span> <span class="n">mod</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cmdname</span><span class="p">)</span>
<span class="k">if</span> <span class="n">command</span><span class="p">:</span>
<span class="n">command</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="run_menu"><a class="viewcode-back" href="../../../api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.run_menu">[docs]</a><span class="k">def</span> <span class="nf">run_menu</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This launches an interactive menu.</span>
@ -2328,6 +2373,10 @@
<span class="n">django</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">management</span><span class="o">.</span><span class="n">call_command</span><span class="p">(</span><span class="o">*</span><span class="p">([</span><span class="n">option</span><span class="p">]</span> <span class="o">+</span> <span class="n">unknown_args</span><span class="p">))</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">if</span> <span class="n">run_custom_commands</span><span class="p">(</span><span class="n">option</span><span class="p">,</span> <span class="o">*</span><span class="n">unknown_args</span><span class="p">):</span>
<span class="c1"># run any custom commands</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="c1"># pass on to the core django manager - re-parse the entire input line</span>
<span class="c1"># but keep &#39;evennia&#39; as the name instead of django-admin. This is</span>
<span class="c1"># an exit condition.</span>

View file

@ -248,6 +248,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">flags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol_flags</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;session flags:&quot;</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;SCREENWIDTH&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span><span class="p">)</span>
<span class="n">height</span> <span class="o">=</span> <span class="n">flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;SCREENHEIGHT&quot;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_HEIGHT</span><span class="p">)</span>
<span class="k">return</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span></div>

View file

@ -1302,7 +1302,7 @@
<span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">attrname</span><span class="p">)</span>
<div class="viewcode-block" id="DbHolder.get_all"><a class="viewcode-back" href="../../../api/evennia.typeclasses.attributes.html#evennia.typeclasses.attributes.DbHolder.get_all">[docs]</a> <span class="k">def</span> <span class="nf">get_all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">get_all_attributes</span><span class="p">()</span></div>
<span class="k">return</span> <span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_GA</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">backend</span><span class="o">.</span><span class="n">get_all_attributes</span><span class="p">()</span></div>
<span class="nb">all</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_all</span><span class="p">)</span></div>

View file

@ -839,7 +839,7 @@
<span class="n">all_subclasses</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_subclasses</span><span class="p">(</span><span class="n">subclass</span><span class="p">))</span>
<span class="k">return</span> <span class="n">all_subclasses</span>
<span class="k">def</span> <span class="nf">get_family</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">get_family</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Variation of get that not only returns the current typeclass</span>
<span class="sd"> but also all subclasses of that typeclass.</span>
@ -859,7 +859,7 @@
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span> <span class="k">for</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;db_typeclass_path__in&quot;</span><span class="p">:</span> <span class="n">paths</span><span class="p">})</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">filter_family</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>

View file

@ -286,7 +286,7 @@
<span class="sd"> &gt;: start</span>
<span class="sd"> # node abort</span>
<span class="sd"> ## node abort</span>
<span class="sd"> This exits the menu since there is no `## options` section.</span>

View file

@ -133,6 +133,15 @@
<li><a href="evennia/contrib/tutorial_world/rooms.html">evennia.contrib.tutorial_world.rooms</a></li>
<li><a href="evennia/contrib/unixcommand.html">evennia.contrib.unixcommand</a></li>
<li><a href="evennia/contrib/wilderness.html">evennia.contrib.wilderness</a></li>
<li><a href="evennia/contrib/xyzgrid/commands.html">evennia.contrib.xyzgrid.commands</a></li>
<li><a href="evennia/contrib/xyzgrid/example.html">evennia.contrib.xyzgrid.example</a></li>
<li><a href="evennia/contrib/xyzgrid/launchcmd.html">evennia.contrib.xyzgrid.launchcmd</a></li>
<li><a href="evennia/contrib/xyzgrid/tests.html">evennia.contrib.xyzgrid.tests</a></li>
<li><a href="evennia/contrib/xyzgrid/utils.html">evennia.contrib.xyzgrid.utils</a></li>
<li><a href="evennia/contrib/xyzgrid/xymap.html">evennia.contrib.xyzgrid.xymap</a></li>
<li><a href="evennia/contrib/xyzgrid/xymap_legend.html">evennia.contrib.xyzgrid.xymap_legend</a></li>
<li><a href="evennia/contrib/xyzgrid/xyzgrid.html">evennia.contrib.xyzgrid.xyzgrid</a></li>
<li><a href="evennia/contrib/xyzgrid/xyzroom.html">evennia.contrib.xyzgrid.xyzroom</a></li>
<li><a href="evennia/help/filehelp.html">evennia.help.filehelp</a></li>
<li><a href="evennia/help/manager.html">evennia.help.manager</a></li>
<li><a href="evennia/help/models.html">evennia.help.models</a></li>