evennia/docs/1.0-dev/_modules/evennia/objects/objects.html
2021-05-29 13:55:45 +02:00

2869 lines
No EOL
307 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.objects.objects &#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.objects.objects</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.objects.objects</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This module defines the basic `DefaultObject` and its children</span>
<span class="sd">`DefaultCharacter`, `DefaultAccount`, `DefaultRoom` and `DefaultExit`.</span>
<span class="sd">These are the (default) starting points for all in-game visible</span>
<span class="sd">entities.</span>
<span class="sd">This is the v1.0 develop version (for ref in doc building).</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
<span class="kn">import</span> <span class="nn">inflect</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.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="kn">import</span> <span class="n">cmdset</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdsethandler</span> <span class="kn">import</span> <span class="n">CmdSetHandler</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.objects.models</span> <span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.scripthandler</span> <span class="kn">import</span> <span class="n">ScriptHandler</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.attributes</span> <span class="kn">import</span> <span class="n">ModelAttributeBackend</span><span class="p">,</span> <span class="n">NickHandler</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.models</span> <span class="kn">import</span> <span class="n">TypeclassBase</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">ansi</span><span class="p">,</span> <span class="n">create</span><span class="p">,</span> <span class="n">funcparser</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">search</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="p">(</span><span class="n">class_from_module</span><span class="p">,</span> <span class="n">is_iter</span><span class="p">,</span> <span class="n">lazy_property</span><span class="p">,</span>
<span class="n">list_to_string</span><span class="p">,</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">to_str</span><span class="p">,</span>
<span class="n">variable_from_module</span><span class="p">)</span>
<span class="n">_INFLECT</span> <span class="o">=</span> <span class="n">inflect</span><span class="o">.</span><span class="n">engine</span><span class="p">()</span>
<span class="n">_MULTISESSION_MODE</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">MULTISESSION_MODE</span>
<span class="n">_ScriptDB</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_SESSIONS</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_CMDHANDLER</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_AT_SEARCH_RESULT</span> <span class="o">=</span> <span class="n">variable_from_module</span><span class="p">(</span><span class="o">*</span><span class="n">settings</span><span class="o">.</span><span class="n">SEARCH_AT_RESULT</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</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"># the sessid_max is based on the length of the db_sessid csv field (excluding commas)</span>
<span class="n">_SESSID_MAX</span> <span class="o">=</span> <span class="mi">16</span> <span class="k">if</span> <span class="n">_MULTISESSION_MODE</span> <span class="ow">in</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="k">else</span> <span class="mi">1</span>
<span class="n">_MSG_CONTENTS_PARSER</span> <span class="o">=</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">FuncParser</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;you&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_you</span><span class="p">,</span>
<span class="s2">&quot;You&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_You</span><span class="p">,</span>
<span class="s2">&quot;conj&quot;</span><span class="p">:</span> <span class="n">funcparser</span><span class="o">.</span><span class="n">funcparser_callable_conjugate</span>
<span class="p">}</span>
<span class="p">)</span>
<div class="viewcode-block" id="ObjectSessionHandler"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler">[docs]</a><span class="k">class</span> <span class="nc">ObjectSessionHandler</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handles the get/setting of the sessid comma-separated integer field</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ObjectSessionHandler.__init__"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.__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">obj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initializes the handler.</span>
<span class="sd"> Args:</span>
<span class="sd"> obj (Object): The object on which the handler is defined.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_recache</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">_recache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">_SESSIONS</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_SESSIONS</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.server.sessionhandler</span> <span class="kn">import</span> <span class="n">SESSIONS</span> <span class="k">as</span> <span class="n">_SESSIONS</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span>
<span class="nb">set</span><span class="p">(</span><span class="nb">int</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="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db_sessid</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</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">if</span> <span class="n">val</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">sessid</span> <span class="k">for</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="k">if</span> <span class="n">sessid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_SESSIONS</span><span class="p">):</span>
<span class="c1"># cache is out of sync with sessionhandler! Only retain the ones in the handler.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="o">=</span> <span class="p">[</span><span class="n">sessid</span> <span class="k">for</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="n">_SESSIONS</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db_sessid</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="nb">str</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="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;db_sessid&quot;</span><span class="p">])</span>
<div class="viewcode-block" id="ObjectSessionHandler.get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sessid</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the sessions linked to this Object.</span>
<span class="sd"> Args:</span>
<span class="sd"> sessid (int, optional): A specific session id.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sessions (list): The sessions connected to this object. If `sessid` is given,</span>
<span class="sd"> this is a list of one (or zero) elements.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Aliased to `self.all()`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_SESSIONS</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_SESSIONS</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.server.sessionhandler</span> <span class="kn">import</span> <span class="n">SESSIONS</span> <span class="k">as</span> <span class="n">_SESSIONS</span>
<span class="k">if</span> <span class="n">sessid</span><span class="p">:</span>
<span class="n">sessions</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">[</span><span class="n">_SESSIONS</span><span class="p">[</span><span class="n">sessid</span><span class="p">]</span> <span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="n">_SESSIONS</span> <span class="k">else</span> <span class="kc">None</span><span class="p">]</span>
<span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span>
<span class="k">else</span> <span class="p">[]</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sessions</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">_SESSIONS</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="k">if</span> <span class="n">ssid</span> <span class="ow">in</span> <span class="n">_SESSIONS</span> <span class="k">else</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">ssid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span>
<span class="p">]</span>
<span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="n">sessions</span><span class="p">:</span>
<span class="c1"># this happens only if our cache has gone out of sync with the SessionHandler.</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">sessid</span><span class="o">=</span><span class="n">sessid</span><span class="p">)</span>
<span class="k">return</span> <span class="n">sessions</span></div>
<div class="viewcode-block" id="ObjectSessionHandler.all"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.all">[docs]</a> <span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Alias to get(), returning all sessions.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sessions (list): All sessions.</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">get</span><span class="p">()</span></div>
<div class="viewcode-block" id="ObjectSessionHandler.add"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Add session to handler.</span>
<span class="sd"> Args:</span>
<span class="sd"> session (Session or int): Session or session id to add.</span>
<span class="sd"> Notes:</span>
<span class="sd"> We will only add a session/sessid if this actually also exists</span>
<span class="sd"> in the the core sessionhandler.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_SESSIONS</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_SESSIONS</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.server.sessionhandler</span> <span class="kn">import</span> <span class="n">SESSIONS</span> <span class="k">as</span> <span class="n">_SESSIONS</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sessid</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">sessid</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">sessid</span> <span class="o">=</span> <span class="n">session</span>
<span class="n">sessid_cache</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span>
<span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="n">_SESSIONS</span> <span class="ow">and</span> <span class="n">sessid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">sessid_cache</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sessid_cache</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">_SESSID_MAX</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">sessid_cache</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sessid</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db_sessid</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="nb">str</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">sessid_cache</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;db_sessid&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="ObjectSessionHandler.remove"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.remove">[docs]</a> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Remove session from handler.</span>
<span class="sd"> Args:</span>
<span class="sd"> session (Session or int): Session or session id to remove.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sessid</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">sessid</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">sessid</span> <span class="o">=</span> <span class="n">session</span>
<span class="n">sessid_cache</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span>
<span class="k">if</span> <span class="n">sessid</span> <span class="ow">in</span> <span class="n">sessid_cache</span><span class="p">:</span>
<span class="n">sessid_cache</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">sessid</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db_sessid</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="nb">str</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">sessid_cache</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;db_sessid&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="ObjectSessionHandler.clear"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</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 all handled sessids.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db_sessid</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;db_sessid&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="ObjectSessionHandler.count"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ObjectSessionHandler.count">[docs]</a> <span class="k">def</span> <span class="nf">count</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 amount of sessions connected.</span>
<span class="sd"> Returns:</span>
<span class="sd"> sesslen (int): Number of sessions handled.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sessid_cache</span><span class="p">)</span></div></div>
<span class="c1">#</span>
<span class="c1"># Base class to inherit from.</span>
<div class="viewcode-block" id="DefaultObject"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject">[docs]</a><span class="k">class</span> <span class="nc">DefaultObject</span><span class="p">(</span><span class="n">ObjectDB</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">TypeclassBase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the root typeclass object, representing all entities that</span>
<span class="sd"> have an actual presence in-game. DefaultObjects generally have a</span>
<span class="sd"> location. They can also be manipulated and looked at. Game</span>
<span class="sd"> entities you define should inherit from DefaultObject at some distance.</span>
<span class="sd"> It is recommended to create children of this class using the</span>
<span class="sd"> `evennia.create_object()` function rather than to initialize the class</span>
<span class="sd"> directly - this will both set things up and efficiently save the object</span>
<span class="sd"> without `obj.save()` having to be called explicitly.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Used for sorting / filtering in inventories / room contents.</span>
<span class="n">_content_types</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;object&quot;</span><span class="p">,)</span>
<span class="c1"># lockstring of newly created objects, for easy overloading.</span>
<span class="c1"># Will be formatted with the appropriate attributes.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="s2">&quot;control:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin);delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">ObjectManager</span><span class="p">()</span>
<span class="c1"># on-object properties</span>
<div class="viewcode-block" id="DefaultObject.cmdset"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.cmdset">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">cmdset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">CmdSetHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.scripts"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.scripts">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">scripts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">ScriptHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.nicks"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.nicks">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">nicks</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">NickHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ModelAttributeBackend</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.sessions"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.sessions">[docs]</a> <span class="nd">@lazy_property</span>
<span class="k">def</span> <span class="nf">sessions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">ObjectSessionHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># we get an error for objects subscribed to channels without this</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">:</span> <span class="c1"># seems sane to pass on the account</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">is_connected</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">has_account</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Convenience property for checking if an active account is</span>
<span class="sd"> currently connected to this object.</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">sessions</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">is_superuser</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if user has an account, and if so, if it is a superuser.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_account</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_account</span><span class="o">.</span><span class="n">is_superuser</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_account</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;_quell&quot;</span><span class="p">)</span>
<span class="p">)</span>
<div class="viewcode-block" id="DefaultObject.contents_get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.contents_get">[docs]</a> <span class="k">def</span> <span class="nf">contents_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the contents of this object, i.e. all</span>
<span class="sd"> objects that has this object set as its location.</span>
<span class="sd"> This should be publically available.</span>
<span class="sd"> Args:</span>
<span class="sd"> exclude (Object): Object to exclude from returned</span>
<span class="sd"> contents list</span>
<span class="sd"> content_type (str): A content_type to filter by. None for no</span>
<span class="sd"> filtering.</span>
<span class="sd"> Returns:</span>
<span class="sd"> contents (list): List of contents of this Object.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Also available as the `contents` property, minus exclusion</span>
<span class="sd"> and filtering.</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">contents_cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="n">exclude</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.contents_set"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.contents_set">[docs]</a> <span class="k">def</span> <span class="nf">contents_set</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="s2">&quot;You cannot replace this property&quot;</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">{}</span><span class="s2">.contents is read-only. Use obj.move_to or &quot;</span>
<span class="s2">&quot;obj.location to move an object here.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">)</span>
<span class="p">)</span></div>
<span class="n">contents</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">contents_get</span><span class="p">,</span> <span class="n">contents_set</span><span class="p">,</span> <span class="n">contents_set</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">exits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns all exits from this object, i.e. all objects at this</span>
<span class="sd"> location having the property destination != `None`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">exi</span> <span class="k">for</span> <span class="n">exi</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span> <span class="k">if</span> <span class="n">exi</span><span class="o">.</span><span class="n">destination</span><span class="p">]</span>
<span class="c1"># main methods</span>
<div class="viewcode-block" id="DefaultObject.get_display_name"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.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"> Displays the name of the object in a viewer-aware manner.</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 if this user is privileged to control</span>
<span class="sd"> said object.</span>
<span class="sd"> Notes:</span>
<span class="sd"> This function could be extended to change how object names</span>
<span class="sd"> appear to users in character, but be wary. This function</span>
<span class="sd"> does not change an object&#39;s keys or aliases when</span>
<span class="sd"> searching, and is expected to produce something useful for</span>
<span class="sd"> builders.</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="k">return</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">(#</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="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">)</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="DefaultObject.get_numbered_name"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.get_numbered_name">[docs]</a> <span class="k">def</span> <span class="nf">get_numbered_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">count</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"> Return the numbered (singular, plural) forms of this object&#39;s key. This is by default called</span>
<span class="sd"> by return_appearance and is used for grouping multiple same-named of this object. Note that</span>
<span class="sd"> this will be called on *every* member of a group even though the plural name will be only</span>
<span class="sd"> shown once. Also the singular display version, such as &#39;an apple&#39;, &#39;a tree&#39; is determined</span>
<span class="sd"> from this method.</span>
<span class="sd"> Args:</span>
<span class="sd"> count (int): Number of objects of this type</span>
<span class="sd"> looker (Object): Onlooker. Not used by default.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> key (str): Optional key to pluralize, if given, use this instead of the object&#39;s key.</span>
<span class="sd"> Returns:</span>
<span class="sd"> singular (str): The singular form to display.</span>
<span class="sd"> plural (str): The determined plural form of the key, including the count.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">plural_category</span> <span class="o">=</span> <span class="s2">&quot;plural_key&quot;</span>
<span class="n">key</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;key&quot;</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">key</span> <span class="o">=</span> <span class="n">ansi</span><span class="o">.</span><span class="n">ANSIString</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="c1"># this is needed to allow inflection of colored names</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">plural</span> <span class="o">=</span> <span class="n">_INFLECT</span><span class="o">.</span><span class="n">plural</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">count</span><span class="p">)</span>
<span class="n">plural</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> </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">_INFLECT</span><span class="o">.</span><span class="n">number_to_words</span><span class="p">(</span><span class="n">count</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mi">12</span><span class="p">),</span> <span class="n">plural</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="c1"># this is raised by inflect if the input is not a proper noun</span>
<span class="n">plural</span> <span class="o">=</span> <span class="n">key</span>
<span class="n">singular</span> <span class="o">=</span> <span class="n">_INFLECT</span><span class="o">.</span><span class="n">an</span><span class="p">(</span><span class="n">key</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">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">plural</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">plural_category</span><span class="p">):</span>
<span class="c1"># we need to wipe any old plurals/an/a in case key changed in the interrim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="n">category</span><span class="o">=</span><span class="n">plural_category</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">plural</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">plural_category</span><span class="p">)</span>
<span class="c1"># save the singular form as an alias here too so we can display &quot;an egg&quot; and also</span>
<span class="c1"># look at &#39;an egg&#39;.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">singular</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">plural_category</span><span class="p">)</span>
<span class="k">return</span> <span class="n">singular</span><span class="p">,</span> <span class="n">plural</span></div>
<div class="viewcode-block" id="DefaultObject.search"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.search">[docs]</a> <span class="k">def</span> <span class="nf">search</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">searchdata</span><span class="p">,</span>
<span class="n">global_search</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">use_nicks</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="kc">None</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">attribute_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">exact</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">candidates</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">use_dbref</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">stacked</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns an Object matching a search string/condition</span>
<span class="sd"> Perform a standard object search in the database, handling</span>
<span class="sd"> multiple results and lack thereof gracefully. By default, only</span>
<span class="sd"> objects in the current `location` of `self` or its inventory are searched for.</span>
<span class="sd"> Args:</span>
<span class="sd"> searchdata (str or obj): Primary search criterion. Will be matched</span>
<span class="sd"> against `object.key` (with `object.aliases` second) unless</span>
<span class="sd"> the keyword attribute_name specifies otherwise.</span>
<span class="sd"> **Special strings:**</span>
<span class="sd"> - `#&lt;num&gt;`: search by unique dbref. This is always</span>
<span class="sd"> a global search.</span>
<span class="sd"> - `me,self`: self-reference to this object</span>
<span class="sd"> - `&lt;num&gt;-&lt;string&gt;` - can be used to differentiate</span>
<span class="sd"> between multiple same-named matches. The exact form of this input</span>
<span class="sd"> is given by `settings.SEARCH_MULTIMATCH_REGEX`.</span>
<span class="sd"> global_search (bool): Search all objects globally. This overrules &#39;location&#39; data.</span>
<span class="sd"> use_nicks (bool): Use nickname-replace (nicktype &quot;object&quot;) on `searchdata`.</span>
<span class="sd"> typeclass (str or Typeclass, or list of either): Limit search only</span>
<span class="sd"> to `Objects` with this typeclass. May be a list of typeclasses</span>
<span class="sd"> for a broader search.</span>
<span class="sd"> location (Object or list): Specify a location or multiple locations</span>
<span class="sd"> to search. Note that this is used to query the *contents* of a</span>
<span class="sd"> location and will not match for the location itself -</span>
<span class="sd"> if you want that, don&#39;t set this or use `candidates` to specify</span>
<span class="sd"> exactly which objects should be searched. If this nor candidates are</span>
<span class="sd"> given, candidates will include caller&#39;s inventory, current location and</span>
<span class="sd"> all objects in the current location.</span>
<span class="sd"> attribute_name (str): Define which property to search. If set, no</span>
<span class="sd"> key+alias search will be performed. This can be used</span>
<span class="sd"> to search database fields (db_ will be automatically</span>
<span class="sd"> prepended), and if that fails, it will try to return</span>
<span class="sd"> objects having Attributes with this name and value</span>
<span class="sd"> equal to searchdata. A special use is to search for</span>
<span class="sd"> &quot;key&quot; here if you want to do a key-search without</span>
<span class="sd"> including aliases.</span>
<span class="sd"> quiet (bool): don&#39;t display default error messages - this tells the</span>
<span class="sd"> search method that the user wants to handle all errors</span>
<span class="sd"> themselves. It also changes the return value type, see</span>
<span class="sd"> below.</span>
<span class="sd"> exact (bool): if unset (default) - prefers to match to beginning of</span>
<span class="sd"> string rather than not matching at all. If set, requires</span>
<span class="sd"> exact matching of entire string.</span>
<span class="sd"> candidates (list of objects): this is an optional custom list of objects</span>
<span class="sd"> to search (filter) between. It is ignored if `global_search`</span>
<span class="sd"> is given. If not set, this list will automatically be defined</span>
<span class="sd"> to include the location, the contents of location and the</span>
<span class="sd"> caller&#39;s contents (inventory).</span>
<span class="sd"> nofound_string (str): optional custom string for not-found error message.</span>
<span class="sd"> multimatch_string (str): optional custom string for multimatch error header.</span>
<span class="sd"> use_dbref (bool or None, optional): If `True`, allow to enter e.g. a query &quot;#123&quot;</span>
<span class="sd"> to find an object (globally) by its database-id 123. If `False`, the string &quot;#123&quot;</span>
<span class="sd"> will be treated like a normal string. If `None` (default), the ability to query by</span>
<span class="sd"> #dbref is turned on if `self` has the permission &#39;Builder&#39; and is turned off</span>
<span class="sd"> otherwise.</span>
<span class="sd"> stacked (int, optional): If &gt; 0, multimatches will be analyzed to determine if they</span>
<span class="sd"> only contains identical objects; these are then assumed &#39;stacked&#39; and no multi-match</span>
<span class="sd"> error will be generated, instead `stacked` number of matches will be returned. If</span>
<span class="sd"> `stacked` is larger than number of matches, returns that number of matches. If</span>
<span class="sd"> the found stack is a mix of objects, return None and handle the multi-match</span>
<span class="sd"> error depending on the value of `quiet`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Object: If finding a match an `quiet=False`</span>
<span class="sd"> None: If not finding a unique match and `quiet=False`.</span>
<span class="sd"> list: With 0, 1 or more matching objects if `quiet=True`</span>
<span class="sd"> list: With 2 or more matching objects if `stacked` is a positive integer and</span>
<span class="sd"> the matched stack has only object-copies.</span>
<span class="sd"> Notes:</span>
<span class="sd"> To find Accounts, use eg. `evennia.account_search`. If</span>
<span class="sd"> `quiet=False`, error messages will be handled by</span>
<span class="sd"> `settings.SEARCH_AT_RESULT` and echoed automatically (on</span>
<span class="sd"> error, return will be `None`). If `quiet=True`, the error</span>
<span class="sd"> messaging is assumed to be handled by the caller.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">is_string</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">searchdata</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="k">if</span> <span class="n">is_string</span><span class="p">:</span>
<span class="c1"># searchdata is a string; wrap some common self-references</span>
<span class="k">if</span> <span class="n">searchdata</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="s2">&quot;here&quot;</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">location</span><span class="p">]</span> <span class="k">if</span> <span class="n">quiet</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="n">searchdata</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="s2">&quot;me&quot;</span><span class="p">,</span> <span class="s2">&quot;self&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="p">]</span> <span class="k">if</span> <span class="n">quiet</span> <span class="k">else</span> <span class="bp">self</span>
<span class="k">if</span> <span class="n">use_dbref</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">use_dbref</span> <span class="o">=</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="bp">self</span><span class="p">,</span> <span class="s2">&quot;_dummy:perm(Builder)&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">use_nicks</span><span class="p">:</span>
<span class="c1"># do nick-replacement on search</span>
<span class="n">searchdata</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;object&quot;</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">global_search</span> <span class="ow">or</span> <span class="p">(</span>
<span class="n">is_string</span>
<span class="ow">and</span> <span class="n">searchdata</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;#&quot;</span><span class="p">)</span>
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">searchdata</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
<span class="ow">and</span> <span class="n">searchdata</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span>
<span class="p">):</span>
<span class="c1"># only allow exact matching if searching the entire database</span>
<span class="c1"># or unique #dbrefs</span>
<span class="n">exact</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="n">candidates</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># no custom candidates given - get them automatically</span>
<span class="k">if</span> <span class="n">location</span><span class="p">:</span>
<span class="c1"># location(s) were given</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">location</span><span class="p">):</span>
<span class="n">candidates</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">contents</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># local search. Candidates are taken from</span>
<span class="c1"># self.contents, self.location and</span>
<span class="c1"># self.location.contents</span>
<span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">location</span><span class="p">:</span>
<span class="n">candidates</span> <span class="o">=</span> <span class="n">candidates</span> <span class="o">+</span> <span class="p">[</span><span class="n">location</span><span class="p">]</span> <span class="o">+</span> <span class="n">location</span><span class="o">.</span><span class="n">contents</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># normally we don&#39;t need this since we are</span>
<span class="c1"># included in location.contents</span>
<span class="n">candidates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">object_search</span><span class="p">(</span>
<span class="n">searchdata</span><span class="p">,</span>
<span class="n">attribute_name</span><span class="o">=</span><span class="n">attribute_name</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="n">typeclass</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="n">exact</span><span class="o">=</span><span class="n">exact</span><span class="p">,</span>
<span class="n">use_dbref</span><span class="o">=</span><span class="n">use_dbref</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">nresults</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
<span class="k">if</span> <span class="n">stacked</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">nresults</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># handle stacks, disable multimatch errors</span>
<span class="n">nstack</span> <span class="o">=</span> <span class="n">nresults</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">exact</span><span class="p">:</span>
<span class="c1"># we re-run exact match agains one of the matches to</span>
<span class="c1"># make sure we were not catching partial matches not belonging</span>
<span class="c1"># to the stack</span>
<span class="n">nstack</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_objs_with_key_or_alias</span><span class="p">(</span>
<span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span>
<span class="n">exact</span><span class="o">=</span><span class="kc">True</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">results</span><span class="p">),</span>
<span class="n">typeclasses</span><span class="o">=</span><span class="p">[</span><span class="n">typeclass</span><span class="p">]</span> <span class="k">if</span> <span class="n">typeclass</span> <span class="k">else</span> <span class="kc">None</span>
<span class="p">))</span>
<span class="k">if</span> <span class="n">nstack</span> <span class="o">==</span> <span class="n">nresults</span><span class="p">:</span>
<span class="c1"># a valid stack, return multiple results</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">results</span><span class="p">)[:</span><span class="n">stacked</span><span class="p">]</span>
<span class="k">if</span> <span class="n">quiet</span><span class="p">:</span>
<span class="c1"># don&#39;t auto-handle error messaging</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
<span class="c1"># handle error messages</span>
<span class="k">return</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span>
<span class="n">results</span><span class="p">,</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">query</span><span class="o">=</span><span class="n">searchdata</span><span class="p">,</span>
<span class="n">nofound_string</span><span class="o">=</span><span class="n">nofound_string</span><span class="p">,</span>
<span class="n">multimatch_string</span><span class="o">=</span><span class="n">multimatch_string</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.search_account"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.search_account">[docs]</a> <span class="k">def</span> <span class="nf">search_account</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">searchdata</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Simple shortcut wrapper to search for accounts, not characters.</span>
<span class="sd"> Args:</span>
<span class="sd"> searchdata (str): Search criterion - the key or dbref of the account</span>
<span class="sd"> to search for. If this is &quot;here&quot; or &quot;me&quot;, search</span>
<span class="sd"> for the account connected to this object.</span>
<span class="sd"> quiet (bool): Returns the results as a list rather than</span>
<span class="sd"> echo eventual standard error messages. Default `False`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> result (Account, None or list): Just what is returned depends on</span>
<span class="sd"> the `quiet` setting:</span>
<span class="sd"> - `quiet=True`: No match or multumatch auto-echoes errors</span>
<span class="sd"> to self.msg, then returns `None`. The esults are passed</span>
<span class="sd"> through `settings.SEARCH_AT_RESULT` and</span>
<span class="sd"> `settings.SEARCH_AT_MULTIMATCH_INPUT`. If there is a</span>
<span class="sd"> unique match, this will be returned.</span>
<span class="sd"> - `quiet=True`: No automatic error messaging is done, and</span>
<span class="sd"> what is returned is always a list with 0, 1 or more</span>
<span class="sd"> matching Accounts.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">searchdata</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># searchdata is a string; wrap some common self-references</span>
<span class="k">if</span> <span class="n">searchdata</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="s2">&quot;me&quot;</span><span class="p">,</span> <span class="s2">&quot;self&quot;</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">account</span><span class="p">]</span> <span class="k">if</span> <span class="n">quiet</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">search</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="n">searchdata</span><span class="p">)</span>
<span class="k">if</span> <span class="n">quiet</span><span class="p">:</span>
<span class="k">return</span> <span class="n">results</span>
<span class="k">return</span> <span class="n">_AT_SEARCH_RESULT</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="n">searchdata</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.execute_cmd"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.execute_cmd">[docs]</a> <span class="k">def</span> <span class="nf">execute_cmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">raw_string</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>
<span class="sd"> Do something as this object. This is never called normally,</span>
<span class="sd"> it&#39;s only used when wanting specifically to let an object be</span>
<span class="sd"> the caller of a command. It makes use of nicks of eventual</span>
<span class="sd"> connected accounts as well.</span>
<span class="sd"> Args:</span>
<span class="sd"> raw_string (string): Raw command input</span>
<span class="sd"> session (Session, optional): Session to</span>
<span class="sd"> return results to</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Other keyword arguments will be added to the found command</span>
<span class="sd"> object instace as variables before it executes. This is</span>
<span class="sd"> unused by default Evennia but may be used to set flags and</span>
<span class="sd"> change operating paramaters for commands at run-time.</span>
<span class="sd"> Returns:</span>
<span class="sd"> defer (Deferred): This is an asynchronous Twisted object that</span>
<span class="sd"> will not fire until the command has actually finished</span>
<span class="sd"> executing. To overload this one needs to attach</span>
<span class="sd"> callback functions to it, with addCallback(function).</span>
<span class="sd"> This function will be called with an eventual return</span>
<span class="sd"> value from the command execution. This return is not</span>
<span class="sd"> used at all by Evennia by default, but might be useful</span>
<span class="sd"> for coders intending to implement some sort of nested</span>
<span class="sd"> command structure.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># break circular import issues</span>
<span class="k">global</span> <span class="n">_CMDHANDLER</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_CMDHANDLER</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdhandler</span> <span class="kn">import</span> <span class="n">cmdhandler</span> <span class="k">as</span> <span class="n">_CMDHANDLER</span>
<span class="c1"># nick replacement - we require full-word matching.</span>
<span class="c1"># do text encoding conversion</span>
<span class="n">raw_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">nickreplace</span><span class="p">(</span>
<span class="n">raw_string</span><span class="p">,</span> <span class="n">categories</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;inputline&quot;</span><span class="p">,</span> <span class="s2">&quot;channel&quot;</span><span class="p">),</span> <span class="n">include_account</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">_CMDHANDLER</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">raw_string</span><span class="p">,</span> <span class="n">callertype</span><span class="o">=</span><span class="s2">&quot;object&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="o">**</span><span class="n">kwargs</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.msg"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.msg">[docs]</a> <span class="k">def</span> <span class="nf">msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">from_obj</span><span class="o">=</span><span class="kc">None</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="n">options</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"> Emits something to a session attached to the object.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str or tuple, optional): The message to send. This</span>
<span class="sd"> is treated internally like any send-command, so its</span>
<span class="sd"> value can be a tuple if sending multiple arguments to</span>
<span class="sd"> the `text` oob command.</span>
<span class="sd"> from_obj (obj or list, optional): object that is sending. If</span>
<span class="sd"> given, at_msg_send will be called. This value will be</span>
<span class="sd"> passed on to the protocol. If iterable, will execute hook</span>
<span class="sd"> on all entities in it.</span>
<span class="sd"> session (Session or list, optional): Session or list of</span>
<span class="sd"> Sessions to relay data to, if any. If set, will force send</span>
<span class="sd"> to these sessions. If unset, who receives the message</span>
<span class="sd"> depends on the MULTISESSION_MODE.</span>
<span class="sd"> options (dict, optional): Message-specific option-value</span>
<span class="sd"> pairs. These will be applied at the protocol level.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> any (string or tuples): All kwarg keys not listed above</span>
<span class="sd"> will be treated as send-command names and their arguments</span>
<span class="sd"> (which can be a string or a tuple).</span>
<span class="sd"> Notes:</span>
<span class="sd"> `at_msg_receive` will be called on this Object.</span>
<span class="sd"> All extra kwargs will be passed on to the protocol.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># try send hooks</span>
<span class="k">if</span> <span class="n">from_obj</span><span class="p">:</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">from_obj</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_msg_send</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">text</span><span class="p">,</span> <span class="n">to_obj</span><span class="o">=</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">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;options&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">options</span>
<span class="k">try</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">at_msg_receive</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">text</span><span class="p">,</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># if at_msg_receive returns false, we abort message to this object</span>
<span class="k">return</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">log_trace</span><span class="p">()</span>
<span class="k">if</span> <span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="c1"># sanitize text before sending across the wire</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">to_str</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="nb">repr</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;text&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">text</span>
<span class="c1"># relay to session(s)</span>
<span class="n">sessions</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">session</span><span class="p">)</span> <span class="k">if</span> <span class="n">session</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="n">sessions</span><span class="p">:</span>
<span class="n">session</span><span class="o">.</span><span class="n">data_out</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.for_contents"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.for_contents">[docs]</a> <span class="k">def</span> <span class="nf">for_contents</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">exclude</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"> Runs a function on every object contained within this one.</span>
<span class="sd"> Args:</span>
<span class="sd"> func (callable): Function to call. This must have the</span>
<span class="sd"> formal call sign func(obj, **kwargs), where obj is the</span>
<span class="sd"> object currently being processed and `**kwargs` are</span>
<span class="sd"> passed on from the call to `for_contents`.</span>
<span class="sd"> exclude (list, optional): A list of object not to call the</span>
<span class="sd"> function on.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Keyword arguments will be passed to the function for all objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">contents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">exclude</span><span class="p">)</span>
<span class="n">contents</span> <span class="o">=</span> <span class="p">[</span><span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contents</span> <span class="k">if</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contents</span><span class="p">:</span>
<span class="n">func</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.msg_contents"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.msg_contents">[docs]</a> <span class="k">def</span> <span class="nf">msg_contents</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">from_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">mapping</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"> Emits a message to all objects inside this object.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str or tuple): Message to send. If a tuple, this should be</span>
<span class="sd"> on the valid OOB outmessage form `(message, {kwargs})`,</span>
<span class="sd"> where kwargs are optional data passed to the `text`</span>
<span class="sd"> outputfunc. The message will be parsed for `{key}` formatting and</span>
<span class="sd"> `$You/$you()/$You(key)` and `$conj(verb)` inline function callables.</span>
<span class="sd"> The `key` is taken from the `mapping` kwarg {&quot;key&quot;: object, ...}`.</span>
<span class="sd"> The `mapping[key].get_display_name(looker=recipient)` will be called</span>
<span class="sd"> for that key for every recipient of the string.</span>
<span class="sd"> exclude (list, optional): A list of objects not to send to.</span>
<span class="sd"> from_obj (Object, optional): An object designated as the</span>
<span class="sd"> &quot;sender&quot; of the message. See `DefaultObject.msg()` for</span>
<span class="sd"> more info.</span>
<span class="sd"> mapping (dict, optional): A mapping of formatting keys</span>
<span class="sd"> `{&quot;key&quot;:&lt;object&gt;, &quot;key2&quot;:&lt;object2&gt;,...}.</span>
<span class="sd"> The keys must either match `{key}` or `$You(key)/$you(key)` markers</span>
<span class="sd"> in the `text` string. If `&lt;object&gt;` doesn&#39;t have a `get_display_name`</span>
<span class="sd"> method, it will be returned as a string. If not set, a key `you` will</span>
<span class="sd"> be auto-added to point to `from_obj` if given, otherwise to `self`.</span>
<span class="sd"> **kwargs: Keyword arguments will be passed on to `obj.msg()` for all</span>
<span class="sd"> messaged objects.</span>
<span class="sd"> Notes:</span>
<span class="sd"> For &#39;actor-stance&#39; reporting (You say/Name says), use the</span>
<span class="sd"> `$You()/$you()/$You(key)` and `$conj(verb)` (verb-conjugation)</span>
<span class="sd"> inline callables. This will use the respective `get_display_name()`</span>
<span class="sd"> for all onlookers except for `from_obj or self`, which will become</span>
<span class="sd"> &#39;You/you&#39;. If you use `$You/you(key)`, the key must be in `mapping`.</span>
<span class="sd"> For &#39;director-stance&#39; reporting (Name says/Name says), use {key}</span>
<span class="sd"> syntax directly. For both `{key}` and `You/you(key)`,</span>
<span class="sd"> `mapping[key].get_display_name(looker=recipient)` may be called</span>
<span class="sd"> depending on who the recipient is.</span>
<span class="sd"> Examples:</span>
<span class="sd"> Let&#39;s assume</span>
<span class="sd"> - `player1.key -&gt; &quot;Player1&quot;`,</span>
<span class="sd"> `player1.get_display_name(looker=player2) -&gt; &quot;The First girl&quot;`</span>
<span class="sd"> - `player2.key -&gt; &quot;Player2&quot;`,</span>
<span class="sd"> `player2.get_display_name(looker=player1) -&gt; &quot;The Second girl&quot;`</span>
<span class="sd"> Actor-stance:</span>
<span class="sd"> ::</span>
<span class="sd"> char.location.msg_contents(</span>
<span class="sd"> &quot;$You() $conj(attack) $you(defender).&quot;,</span>
<span class="sd"> mapping={&quot;defender&quot;: player2})</span>
<span class="sd"> - player1 will see `You attack The Second girl.`</span>
<span class="sd"> - player2 will see &#39;The First girl attacks you.&#39;</span>
<span class="sd"> Director-stance:</span>
<span class="sd"> ::</span>
<span class="sd"> char.location.msg_contents(</span>
<span class="sd"> &quot;{attacker} attacks {defender}.&quot;,</span>
<span class="sd"> mapping={&quot;attacker:player1, &quot;defender&quot;:player2})</span>
<span class="sd"> - player1 will see: &#39;Player1 attacks The Second girl.&#39;</span>
<span class="sd"> - player2 will see: &#39;The First girl attacks Player2&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># we also accept an outcommand on the form (message, {kwargs})</span>
<span class="n">is_outcmd</span> <span class="o">=</span> <span class="n">text</span> <span class="ow">and</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">inmessage</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">is_outcmd</span> <span class="k">else</span> <span class="n">text</span>
<span class="n">outkwargs</span> <span class="o">=</span> <span class="n">text</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">is_outcmd</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="p">{}</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="n">mapping</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">you</span> <span class="o">=</span> <span class="n">from_obj</span> <span class="ow">or</span> <span class="bp">self</span>
<span class="k">if</span> <span class="s1">&#39;you&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">mapping</span><span class="p">:</span>
<span class="n">mapping</span><span class="p">[</span><span class="n">you</span><span class="p">]</span> <span class="o">=</span> <span class="n">you</span>
<span class="n">contents</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">exclude</span><span class="p">)</span>
<span class="n">contents</span> <span class="o">=</span> <span class="p">[</span><span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contents</span> <span class="k">if</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">]</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">contents</span><span class="p">:</span>
<span class="c1"># actor-stance replacements</span>
<span class="n">inmessage</span> <span class="o">=</span> <span class="n">_MSG_CONTENTS_PARSER</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span>
<span class="n">inmessage</span><span class="p">,</span> <span class="n">raise_errors</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">return_string</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="n">you</span><span class="p">,</span> <span class="n">receiver</span><span class="o">=</span><span class="n">receiver</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="n">mapping</span><span class="p">)</span>
<span class="c1"># director-stance replacements</span>
<span class="n">outmessage</span> <span class="o">=</span> <span class="n">inmessage</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="n">receiver</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;get_display_name&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()})</span>
<span class="n">receiver</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">outmessage</span><span class="p">,</span> <span class="n">outkwargs</span><span class="p">),</span> <span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.move_to"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.move_to">[docs]</a> <span class="k">def</span> <span class="nf">move_to</span><span class="p">(</span>
<span class="bp">self</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="kc">False</span><span class="p">,</span>
<span class="n">emit_to_obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">use_destination</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">to_none</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">move_hooks</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Moves this object to a new location.</span>
<span class="sd"> Args:</span>
<span class="sd"> destination (Object): Reference to the object to move to. This</span>
<span class="sd"> can also be an exit object, in which case the</span>
<span class="sd"> destination property is used as destination.</span>
<span class="sd"> quiet (bool): If true, turn off the calling of the emit hooks</span>
<span class="sd"> (announce_move_to/from etc)</span>
<span class="sd"> emit_to_obj (Object): object to receive error messages</span>
<span class="sd"> use_destination (bool): Default is for objects to use the &quot;destination&quot;</span>
<span class="sd"> property of destinations as the target to move to. Turning off this</span>
<span class="sd"> keyword allows objects to move &quot;inside&quot; exit objects.</span>
<span class="sd"> to_none (bool): Allow destination to be None. Note that no hooks are run when</span>
<span class="sd"> moving to a None location. If you want to run hooks, run them manually</span>
<span class="sd"> (and make sure they can manage None locations).</span>
<span class="sd"> move_hooks (bool): If False, turn off the calling of move-related hooks</span>
<span class="sd"> (at_before/after_move etc) with quiet=True, this is as quiet a move</span>
<span class="sd"> as can be done.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Passed on to announce_move_to and announce_move_from hooks.</span>
<span class="sd"> Returns:</span>
<span class="sd"> result (bool): True/False depending on if there were problems with the move.</span>
<span class="sd"> This method may also return various error messages to the</span>
<span class="sd"> `emit_to_obj`.</span>
<span class="sd"> Notes:</span>
<span class="sd"> No access checks are done in this method, these should be handled before</span>
<span class="sd"> calling `move_to`.</span>
<span class="sd"> The `DefaultObject` hooks called (if `move_hooks=True`) are, in order:</span>
<span class="sd"> 1. `self.at_before_move(destination)` (if this returns False, move is aborted)</span>
<span class="sd"> 2. `source_location.at_object_leave(self, destination)`</span>
<span class="sd"> 3. `self.announce_move_from(destination)`</span>
<span class="sd"> 4. (move happens here)</span>
<span class="sd"> 5. `self.announce_move_to(source_location)`</span>
<span class="sd"> 6. `destination.at_object_receive(self, source_location)`</span>
<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>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">err</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="p">))</span>
<span class="k">return</span>
<span class="n">errtxt</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Couldn&#39;t perform move (&#39;</span><span class="si">%s</span><span class="s2">&#39;). Contact an admin.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">emit_to_obj</span><span class="p">:</span>
<span class="n">emit_to_obj</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">destination</span><span class="p">:</span>
<span class="k">if</span> <span class="n">to_none</span><span class="p">:</span>
<span class="c1"># immediately move to None. There can be no hooks called since</span>
<span class="c1"># there is no destination to call them with.</span>
<span class="bp">self</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="kc">True</span>
<span class="n">emit_to_obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;The destination doesn&#39;t exist.&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span>
<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>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_before_move</span><span class="p">(</span><span class="n">destination</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="kc">False</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;at_before_move()&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># Save the old location</span>
<span class="n">source_location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="c1"># Call hook on source location</span>
<span class="k">if</span> <span class="n">move_hooks</span> <span class="ow">and</span> <span class="n">source_location</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">source_location</span><span class="o">.</span><span class="n">at_object_leave</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;at_object_leave()&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">quiet</span><span class="p">:</span>
<span class="c1"># tell the old room we are leaving</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_move_from</span><span class="p">(</span><span class="n">destination</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;at_announce_move()&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># Perform move</span>
<span class="k">try</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="n">destination</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;location change&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">quiet</span><span class="p">:</span>
<span class="c1"># Tell the new room we are there.</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">announce_move_to</span><span class="p">(</span><span class="n">source_location</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;announce_move_to()&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">move_hooks</span><span class="p">:</span>
<span class="c1"># Perform eventual extra commands on the receiving location</span>
<span class="c1"># (the object has already arrived at this point)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">destination</span><span class="o">.</span><span class="n">at_object_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_location</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;at_object_receive()&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># Execute eventual extra commands on this object after moving it</span>
<span class="c1"># (usually calling &#39;look&#39;)</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>
<span class="bp">self</span><span class="o">.</span><span class="n">at_after_move</span><span class="p">(</span><span class="n">source_location</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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">logerr</span><span class="p">(</span><span class="n">errtxt</span> <span class="o">%</span> <span class="s2">&quot;at_after_move&quot;</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.clear_exits"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.clear_exits">[docs]</a> <span class="k">def</span> <span class="nf">clear_exits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Destroys all of the exits and any exits pointing to this</span>
<span class="sd"> object as a destination.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">out_exit</span> <span class="ow">in</span> <span class="p">[</span><span class="n">exi</span> <span class="k">for</span> <span class="n">exi</span> <span class="ow">in</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_contents</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">if</span> <span class="n">exi</span><span class="o">.</span><span class="n">db_destination</span><span class="p">]:</span>
<span class="n">out_exit</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">for</span> <span class="n">in_exit</span> <span class="ow">in</span> <span class="n">ObjectDB</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_destination</span><span class="o">=</span><span class="bp">self</span><span class="p">):</span>
<span class="n">in_exit</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div>
<div class="viewcode-block" id="DefaultObject.clear_contents"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.clear_contents">[docs]</a> <span class="k">def</span> <span class="nf">clear_contents</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Moves all objects (accounts/things) to their home location or</span>
<span class="sd"> to default home.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Gather up everything that thinks this is its location.</span>
<span class="n">default_home_id</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">&quot;#&quot;</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">default_home</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">default_home_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">default_home</span><span class="o">.</span><span class="n">dbid</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbid</span><span class="p">:</span>
<span class="c1"># we are deleting default home!</span>
<span class="n">default_home</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Could not find default home &#39;(#</span><span class="si">%d</span><span class="s2">)&#39;.&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">string</span> <span class="o">%</span> <span class="n">default_home_id</span><span class="p">)</span>
<span class="n">default_home</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span><span class="p">:</span>
<span class="n">home</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">home</span>
<span class="c1"># Obviously, we can&#39;t send it back to here.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">home</span> <span class="ow">or</span> <span class="p">(</span><span class="n">home</span> <span class="ow">and</span> <span class="n">home</span><span class="o">.</span><span class="n">dbid</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbid</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">home</span> <span class="o">=</span> <span class="n">default_home</span>
<span class="n">home</span> <span class="o">=</span> <span class="n">default_home</span>
<span class="c1"># If for some reason it&#39;s still None...</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">home</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Something went wrong! You are dumped into nowhere. Contact an admin.&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;Missing default home - &#39;</span><span class="si">{name}</span><span class="s2">(#</span><span class="si">{dbid}</span><span class="s2">)&#39; now &quot;</span>
<span class="s2">&quot;has a null location.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">obj</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">dbid</span><span class="o">=</span><span class="n">obj</span><span class="o">.</span><span class="n">dbid</span><span class="p">))</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="k">if</span> <span class="n">home</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;Your current location has ceased to exist,&quot;</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot; moving you to </span><span class="si">%s</span><span class="s2">(#</span><span class="si">%d</span><span class="s2">).&quot;</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">home</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">home</span><span class="o">.</span><span class="n">dbid</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Famous last words: The account should never see this.</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;This place should not exist ... contact an admin.&quot;</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="n">string</span><span class="p">))</span>
<span class="n">obj</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">home</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic object with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
<span class="sd"> Provides a friendlier interface to the utils.create_object() function.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new object.</span>
<span class="sd"> account (Account): Account to attribute this object to.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> description (str): Brief description for this object.</span>
<span class="sd"> ip (str): IP address of creator (for object auditing).</span>
<span class="sd"> Returns:</span>
<span class="sd"> object (Object): A newly created object of the given typeclass.</span>
<span class="sd"> errors (list): A list of errors in string form, if any.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Get IP address of creator, if available</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># If no typeclass supplied, use this class</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
<span class="c1"># Set the supplied key as the name of the intended object</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
<span class="c1"># Get a supplied description, if any</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># Create a sane lockstring if one wasn&#39;t supplied</span>
<span class="n">lockstring</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;locks&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">account</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">lockstring</span><span class="p">:</span>
<span class="n">lockstring</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="n">account_id</span><span class="o">=</span><span class="n">account</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;locks&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">lockstring</span>
<span class="c1"># Create object</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span> <span class="o">=</span> <span class="n">ip</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_id</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># Set description if there is none, or update it if provided</span>
<span class="k">if</span> <span class="n">description</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">:</span>
<span class="n">desc</span> <span class="o">=</span> <span class="n">description</span> <span class="k">if</span> <span class="n">description</span> <span class="k">else</span> <span class="s2">&quot;You see nothing special.&quot;</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">desc</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">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;An error occurred while creating this &#39;</span><span class="si">%s</span><span class="s2">&#39; object.&quot;</span> <span class="o">%</span> <span class="n">key</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">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span></div>
<div class="viewcode-block" id="DefaultObject.copy"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.copy">[docs]</a> <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_key</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"> Makes an identical copy of this object, identical except for a</span>
<span class="sd"> new dbref in the database. If you want to customize the copy</span>
<span class="sd"> by changing some settings, use ObjectDB.object.copy_object()</span>
<span class="sd"> directly.</span>
<span class="sd"> Args:</span>
<span class="sd"> new_key (string): New key/name of copied object. If new_key is not</span>
<span class="sd"> specified, the copy will be named &lt;old_key&gt;_copy by default.</span>
<span class="sd"> Returns:</span>
<span class="sd"> copy (Object): A copy of this object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">find_clone_key</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Append 01, 02 etc to obj.key. Checks next higher number in the</span>
<span class="sd"> same location, then adds the next number available</span>
<span class="sd"> returns the new clone name on the form keyXX</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span>
<span class="n">num</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span>
<span class="mi">1</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span>
<span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s%03i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
<span class="n">new_key</span> <span class="o">=</span> <span class="n">new_key</span> <span class="ow">or</span> <span class="n">find_clone_key</span><span class="p">()</span>
<span class="n">new_obj</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">copy_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_key</span><span class="o">=</span><span class="n">new_key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_object_post_copy</span><span class="p">(</span><span class="n">new_obj</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="n">new_obj</span></div>
<div class="viewcode-block" id="DefaultObject.at_object_post_copy"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_object_post_copy">[docs]</a> <span class="k">def</span> <span class="nf">at_object_post_copy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_obj</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"> Called by DefaultObject.copy(). Meant to be overloaded. In case there&#39;s extra data not</span>
<span class="sd"> covered by .copy(), this can be used to deal with it.</span>
<span class="sd"> Args:</span>
<span class="sd"> new_obj (Object): The new Copy of this object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.delete"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.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"> Deletes this object. Before deletion, this method makes sure</span>
<span class="sd"> to move all contained objects to their respective home</span>
<span class="sd"> locations, as well as clean up all exits to/from the object.</span>
<span class="sd"> Returns:</span>
<span class="sd"> noerror (bool): Returns whether or not the delete completed</span>
<span class="sd"> successfully or not.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">global</span> <span class="n">_ScriptDB</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_ScriptDB</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.models</span> <span class="kn">import</span> <span class="n">ScriptDB</span> <span class="k">as</span> <span class="n">_ScriptDB</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_object_delete</span><span class="p">():</span>
<span class="c1"># This object has already been deleted,</span>
<span class="c1"># or the pre-delete check return False</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="c1"># See if we need to kick the account off.</span>
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">session</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Your character </span><span class="si">{key}</span><span class="s2"> has been destroyed.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="p">))</span>
<span class="c1"># no need to disconnect, Account just jumps to OOC mode.</span>
<span class="c1"># sever the connection (important!)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">:</span>
<span class="c1"># Remove the object from playable characters list</span>
<span class="k">if</span> <span class="bp">self</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span> <span class="k">if</span> <span class="n">x</span> <span class="o">!=</span> <span class="bp">self</span>
<span class="p">]</span>
<span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">unpuppet_object</span><span class="p">(</span><span class="n">session</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">_ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_all_scripts_on_obj</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">script</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="c1"># Destroy any exits to and from this room, if any</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clear_exits</span><span class="p">()</span>
<span class="c1"># Clear out any non-exit objects located within the object</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clear_contents</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nicks</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">clear</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="kc">None</span> <span class="c1"># this updates contents_cache for our location</span>
<span class="c1"># Perform the deletion of the object</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.access"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.access">[docs]</a> <span class="k">def</span> <span class="nf">access</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">accessing_obj</span><span class="p">,</span> <span class="n">access_type</span><span class="o">=</span><span class="s2">&quot;read&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">no_superuser_bypass</span><span class="o">=</span><span class="kc">False</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"> Determines if another object has permission to access this object</span>
<span class="sd"> in whatever way.</span>
<span class="sd"> Args:</span>
<span class="sd"> accessing_obj (Object): Object trying to access this one.</span>
<span class="sd"> access_type (str, optional): Type of access sought.</span>
<span class="sd"> default (bool, optional): What to return if no lock of access_type was found.</span>
<span class="sd"> no_superuser_bypass (bool, optional): If `True`, don&#39;t skip</span>
<span class="sd"> lock check for superuser (be careful with this one).</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Passed on to the at_access hook along with the result of the access check.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">access</span><span class="p">(</span>
<span class="n">accessing_obj</span><span class="p">,</span>
<span class="n">access_type</span><span class="o">=</span><span class="n">access_type</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">no_superuser_bypass</span><span class="o">=</span><span class="n">no_superuser_bypass</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_access</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">accessing_obj</span><span class="p">,</span> <span class="n">access_type</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="n">result</span></div>
<span class="c1">#</span>
<span class="c1"># Hook methods</span>
<span class="c1">#</span>
<div class="viewcode-block" id="DefaultObject.at_first_save"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_first_save">[docs]</a> <span class="k">def</span> <span class="nf">at_first_save</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 called by the typeclass system whenever an instance of</span>
<span class="sd"> this class is saved for the first time. It is a generic hook</span>
<span class="sd"> for calling the startup hooks for the various game entities.</span>
<span class="sd"> When overloading you generally don&#39;t overload this but</span>
<span class="sd"> overload the hooks called by this method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_object_creation</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_createdict&quot;</span><span class="p">):</span>
<span class="c1"># this will only be set if the utils.create function</span>
<span class="c1"># was used to create the object. We want the create</span>
<span class="c1"># call&#39;s kwargs to override the values set by hooks.</span>
<span class="n">cdict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createdict</span>
<span class="n">updates</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;key&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">db_key</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_key</span> <span class="o">=</span> <span class="s2">&quot;#</span><span class="si">%i</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">dbid</span>
<span class="n">updates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">!=</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;key&quot;</span><span class="p">):</span>
<span class="n">updates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;db_key&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_key</span> <span class="o">=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">!=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_location</span> <span class="o">=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span>
<span class="n">updates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;db_location&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;home&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">home</span> <span class="o">!=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;home&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">home</span> <span class="o">=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;home&quot;</span><span class="p">]</span>
<span class="n">updates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;db_home&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;destination&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">!=</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;destination&quot;</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">cdict</span><span class="p">[</span><span class="s2">&quot;destination&quot;</span><span class="p">]</span>
<span class="n">updates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;db_destination&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">updates</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="n">updates</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;permissions&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;permissions&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">):</span>
<span class="bp">self</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">cdict</span><span class="p">[</span><span class="s2">&quot;locks&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</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">aliases</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;aliases&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;location&quot;</span><span class="p">):</span>
<span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">at_object_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_after_move</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">):</span>
<span class="c1"># this should be a list of tags, tuples (key, category) or (key, category, data)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;tags&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;attributes&quot;</span><span class="p">):</span>
<span class="c1"># this should be tuples (key, val, ...)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">batch_add</span><span class="p">(</span><span class="o">*</span><span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;attributes&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="n">cdict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;nattributes&quot;</span><span class="p">):</span>
<span class="c1"># this should be a dict of nattrname:value</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">cdict</span><span class="p">[</span><span class="s2">&quot;nattributes&quot;</span><span class="p">]:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nattributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createdict</span>
<span class="bp">self</span><span class="o">.</span><span class="n">basetype_posthook_setup</span><span class="p">()</span></div>
<span class="c1"># hooks called by the game engine #</span>
<div class="viewcode-block" id="DefaultObject.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</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 sets up the default properties of an Object, just before</span>
<span class="sd"> the more general at_object_creation.</span>
<span class="sd"> You normally don&#39;t need to change this unless you change some</span>
<span class="sd"> fundamental things like names of permission groups.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># the default security setup fallback for a generic</span>
<span class="c1"># object. Overload in child for a custom setup. Also creation</span>
<span class="c1"># commands may set this (create an item and you should be its</span>
<span class="c1"># controller, for example)</span>
<span class="bp">self</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="s2">&quot;;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="p">[</span>
<span class="s2">&quot;control:perm(Developer)&quot;</span><span class="p">,</span> <span class="c1"># edit locks/permissions, delete</span>
<span class="s2">&quot;examine:perm(Builder)&quot;</span><span class="p">,</span> <span class="c1"># examine properties</span>
<span class="s2">&quot;view:all()&quot;</span><span class="p">,</span> <span class="c1"># look at object (visibility)</span>
<span class="s2">&quot;edit:perm(Admin)&quot;</span><span class="p">,</span> <span class="c1"># edit properties/attributes</span>
<span class="s2">&quot;delete:perm(Admin)&quot;</span><span class="p">,</span> <span class="c1"># delete object</span>
<span class="s2">&quot;get:all()&quot;</span><span class="p">,</span> <span class="c1"># pick up object</span>
<span class="s2">&quot;drop:holds()&quot;</span><span class="p">,</span> <span class="c1"># drop only that which you hold</span>
<span class="s2">&quot;call:true()&quot;</span><span class="p">,</span> <span class="c1"># allow to call commands on this object</span>
<span class="s2">&quot;tell:perm(Admin)&quot;</span><span class="p">,</span> <span class="c1"># allow emits to this object</span>
<span class="s2">&quot;puppet:pperm(Developer)&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="p">)</span> <span class="c1"># lock down puppeting only to staff by default</span></div>
<div class="viewcode-block" id="DefaultObject.basetype_posthook_setup"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.basetype_posthook_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_posthook_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called once, after basetype_setup and at_object_creation. This</span>
<span class="sd"> should generally not be overloaded unless you are redefining</span>
<span class="sd"> how a room/exit/object works. It allows for basetype-like</span>
<span class="sd"> setup after the object is created. An example of this is</span>
<span class="sd"> EXITs, who need to know keys, aliases, locks etc to set up</span>
<span class="sd"> their exit-cmdsets.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_object_creation"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_object_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_object_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"> Called once, when this object is first created. This is the</span>
<span class="sd"> normal hook to overload for most object types.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_object_delete"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_object_delete">[docs]</a> <span class="k">def</span> <span class="nf">at_object_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"> Called just before the database object is permanently</span>
<span class="sd"> delete()d from the database. If this method returns False,</span>
<span class="sd"> deletion is aborted.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.at_init"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_init">[docs]</a> <span class="k">def</span> <span class="nf">at_init</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 always called whenever this object is initiated --</span>
<span class="sd"> that is, whenever it its typeclass is cached from memory. This</span>
<span class="sd"> happens on-demand first time the object is used or activated</span>
<span class="sd"> in some way after being created but also after each server</span>
<span class="sd"> restart or reload.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_cmdset_get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_cmdset_get">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_get</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called just before cmdsets on this object are requested by the</span>
<span class="sd"> command handler. If changes need to be done on the fly to the</span>
<span class="sd"> cmdset before passing them on to the cmdhandler, this is the</span>
<span class="sd"> place to do it. This is called also if the object currently</span>
<span class="sd"> have no cmdsets.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> caller (Session, Object or Account): The caller requesting</span>
<span class="sd"> this cmdset.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_pre_puppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.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>
<span class="sd"> Called just before an Account connects to this object to puppet</span>
<span class="sd"> it.</span>
<span class="sd"> Args:</span>
<span class="sd"> account (Account): This is the connecting account.</span>
<span class="sd"> session (Session): Session controlling the connection.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_post_puppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_post_puppet">[docs]</a> <span class="k">def</span> <span class="nf">at_post_puppet</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called just after puppeting has been completed and all</span>
<span class="sd"> Account&lt;-&gt;Object links have been established.</span>
<span class="sd"> Args:</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Note:</span>
<span class="sd"> You can use `self.account` and `self.sessions.get()` to get</span>
<span class="sd"> account and sessions at this point; the last entry in the</span>
<span class="sd"> list from `self.sessions.get()` is the latest Session</span>
<span class="sd"> puppeting this Object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;You become |w</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">|n.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="DefaultObject.at_pre_unpuppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_pre_unpuppet">[docs]</a> <span class="k">def</span> <span class="nf">at_pre_unpuppet</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called just before beginning to un-connect a puppeting from</span>
<span class="sd"> this Account.</span>
<span class="sd"> Args:</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Note:</span>
<span class="sd"> You can use `self.account` and `self.sessions.get()` to get</span>
<span class="sd"> account and sessions at this point; the last entry in the</span>
<span class="sd"> list from `self.sessions.get()` is the latest Session</span>
<span class="sd"> puppeting this Object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_post_unpuppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_post_unpuppet">[docs]</a> <span class="k">def</span> <span class="nf">at_post_unpuppet</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>
<span class="sd"> Called just after the Account successfully disconnected from</span>
<span class="sd"> this object, severing all connections.</span>
<span class="sd"> Args:</span>
<span class="sd"> account (Account): The account object that just disconnected</span>
<span class="sd"> from this object.</span>
<span class="sd"> session (Session): Session id controlling the connection that</span>
<span class="sd"> just disconnected.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_server_reload"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_server_reload">[docs]</a> <span class="k">def</span> <span class="nf">at_server_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"> This hook is called whenever the server is shutting down for</span>
<span class="sd"> restart/reboot. If you want to, for example, save non-persistent</span>
<span class="sd"> properties across a restart, this is the place to do it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_server_shutdown"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_server_shutdown">[docs]</a> <span class="k">def</span> <span class="nf">at_server_shutdown</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 hook is called whenever the server is shutting down fully</span>
<span class="sd"> (i.e. not for a restart).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_access"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_access">[docs]</a> <span class="k">def</span> <span class="nf">at_access</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">accessing_obj</span><span class="p">,</span> <span class="n">access_type</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"> This is called with the result of an access call, along with</span>
<span class="sd"> any kwargs used for that call. The return of this method does</span>
<span class="sd"> not affect the result of the lock check. It can be used e.g. to</span>
<span class="sd"> customize error messages in a central location or other effects</span>
<span class="sd"> based on the access result.</span>
<span class="sd"> Args:</span>
<span class="sd"> result (bool): The outcome of the access call.</span>
<span class="sd"> accessing_obj (Object or Account): The entity trying to gain access.</span>
<span class="sd"> access_type (str): The type of access that was requested.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Not used by default, added for possible expandability in a</span>
<span class="sd"> game.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="c1"># hooks called when moving the object</span>
<div class="viewcode-block" id="DefaultObject.at_before_move"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_before_move">[docs]</a> <span class="k">def</span> <span class="nf">at_before_move</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination</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"> Called just before starting to move this object to</span>
<span class="sd"> destination.</span>
<span class="sd"> Args:</span>
<span class="sd"> destination (Object): The object we are moving to</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> shouldmove (bool): If we should move or not.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If this method returns False/None, the move is cancelled</span>
<span class="sd"> before it is even started.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># return has_perm(self, destination, &quot;can_move&quot;)</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.announce_move_from"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.announce_move_from">[docs]</a> <span class="k">def</span> <span class="nf">announce_move_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">mapping</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"> Called if the move is to be announced. This is</span>
<span class="sd"> called while we are still standing in the old</span>
<span class="sd"> location.</span>
<span class="sd"> Args:</span>
<span class="sd"> destination (Object): The place we are going to.</span>
<span class="sd"> msg (str, optional): a replacement message.</span>
<span class="sd"> mapping (dict, optional): additional mapping objects.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> You can override this method and call its parent with a</span>
<span class="sd"> message to simply change the default message. In the string,</span>
<span class="sd"> you can use the following as mappings (between braces):</span>
<span class="sd"> object: the object which is moving.</span>
<span class="sd"> exit: the exit from which the object is moving (if found).</span>
<span class="sd"> origin: the location of the object before the move.</span>
<span class="sd"> destination: the location of the object after moving.</span>
<span class="sd"> &quot;&quot;&quot;</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="k">return</span>
<span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">msg</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{object}</span><span class="s2"> is leaving </span><span class="si">{origin}</span><span class="s2">, heading for </span><span class="si">{destination}</span><span class="s2">.&quot;</span>
<span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="n">exits</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">o</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">location</span><span class="o">.</span><span class="n">contents</span> <span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">location</span> <span class="ow">is</span> <span class="n">location</span> <span class="ow">and</span> <span class="n">o</span><span class="o">.</span><span class="n">destination</span> <span class="ow">is</span> <span class="n">destination</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">mapping</span><span class="p">:</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;exit&quot;</span><span class="p">:</span> <span class="n">exits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">exits</span> <span class="k">else</span> <span class="s2">&quot;somewhere&quot;</span><span class="p">,</span>
<span class="s2">&quot;origin&quot;</span><span class="p">:</span> <span class="n">location</span> <span class="ow">or</span> <span class="s2">&quot;nowhere&quot;</span><span class="p">,</span>
<span class="s2">&quot;destination&quot;</span><span class="p">:</span> <span class="n">destination</span> <span class="ow">or</span> <span class="s2">&quot;nowhere&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">location</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="p">,),</span> <span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="n">mapping</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.announce_move_to"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.announce_move_to">[docs]</a> <span class="k">def</span> <span class="nf">announce_move_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_location</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">mapping</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"> Called after the move if the move was not quiet. At this point</span>
<span class="sd"> we are standing in the new location.</span>
<span class="sd"> Args:</span>
<span class="sd"> source_location (Object): The place we came from</span>
<span class="sd"> msg (str, optional): the replacement message if location.</span>
<span class="sd"> mapping (dict, optional): additional mapping objects.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> You can override this method and call its parent with a</span>
<span class="sd"> message to simply change the default message. In the string,</span>
<span class="sd"> you can use the following as mappings (between braces):</span>
<span class="sd"> object: the object which is moving.</span>
<span class="sd"> exit: the exit from which the object is moving (if found).</span>
<span class="sd"> origin: the location of the object before the move.</span>
<span class="sd"> destination: the location of the object after moving.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">source_location</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">has_account</span><span class="p">:</span>
<span class="c1"># This was created from nowhere and added to an account&#39;s</span>
<span class="c1"># inventory; it&#39;s probably the result of a create command.</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;You now have </span><span class="si">{name}</span><span class="s2"> in your possession.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">get_display_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">location</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="k">if</span> <span class="n">source_location</span><span class="p">:</span>
<span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">msg</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{object}</span><span class="s2"> arrives to </span><span class="si">{destination}</span><span class="s2"> from </span><span class="si">{origin}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{object}</span><span class="s2"> arrives to </span><span class="si">{destination}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="n">origin</span> <span class="o">=</span> <span class="n">source_location</span>
<span class="n">destination</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="n">exits</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">origin</span><span class="p">:</span>
<span class="n">exits</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">o</span>
<span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">destination</span><span class="o">.</span><span class="n">contents</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">location</span> <span class="ow">is</span> <span class="n">destination</span> <span class="ow">and</span> <span class="n">o</span><span class="o">.</span><span class="n">destination</span> <span class="ow">is</span> <span class="n">origin</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">mapping</span><span class="p">:</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;exit&quot;</span><span class="p">:</span> <span class="n">exits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">exits</span> <span class="k">else</span> <span class="s2">&quot;somewhere&quot;</span><span class="p">,</span>
<span class="s2">&quot;origin&quot;</span><span class="p">:</span> <span class="n">origin</span> <span class="ow">or</span> <span class="s2">&quot;nowhere&quot;</span><span class="p">,</span>
<span class="s2">&quot;destination&quot;</span><span class="p">:</span> <span class="n">destination</span> <span class="ow">or</span> <span class="s2">&quot;nowhere&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">destination</span><span class="o">.</span><span class="n">msg_contents</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="p">,),</span> <span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="n">mapping</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultObject.at_after_move"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_after_move">[docs]</a> <span class="k">def</span> <span class="nf">at_after_move</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_location</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"> Called after move has completed, regardless of quiet mode or</span>
<span class="sd"> not. Allows changes to the object due to the location it is</span>
<span class="sd"> now in.</span>
<span class="sd"> Args:</span>
<span class="sd"> source_location (Object): Wwhere we came from. This may be `None`.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_object_leave"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_object_leave">[docs]</a> <span class="k">def</span> <span class="nf">at_object_leave</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">moved_obj</span><span class="p">,</span> <span class="n">target_location</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"> Called just before an object leaves from inside this object</span>
<span class="sd"> Args:</span>
<span class="sd"> moved_obj (Object): The object leaving</span>
<span class="sd"> target_location (Object): Where `moved_obj` is going.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_object_receive"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_object_receive">[docs]</a> <span class="k">def</span> <span class="nf">at_object_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">moved_obj</span><span class="p">,</span> <span class="n">source_location</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"> Called after an object has been moved into this object.</span>
<span class="sd"> Args:</span>
<span class="sd"> moved_obj (Object): The object moved into this one</span>
<span class="sd"> source_location (Object): Where `moved_object` came from.</span>
<span class="sd"> Note that this could be `None`.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_traverse"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_traverse">[docs]</a> <span class="k">def</span> <span class="nf">at_traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traversing_object</span><span class="p">,</span> <span class="n">target_location</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"> This hook is responsible for handling the actual traversal,</span>
<span class="sd"> normally by calling</span>
<span class="sd"> `traversing_object.move_to(target_location)`. It is normally</span>
<span class="sd"> only implemented by Exit objects. If it returns False (usually</span>
<span class="sd"> because `move_to` returned False), `at_after_traverse` below</span>
<span class="sd"> should not be called and instead `at_failed_traverse` should be</span>
<span class="sd"> called.</span>
<span class="sd"> Args:</span>
<span class="sd"> traversing_object (Object): Object traversing us.</span>
<span class="sd"> target_location (Object): Where target is going.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_after_traverse"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_after_traverse">[docs]</a> <span class="k">def</span> <span class="nf">at_after_traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traversing_object</span><span class="p">,</span> <span class="n">source_location</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"> Called just after an object successfully used this object to</span>
<span class="sd"> traverse to another object (i.e. this object is a type of</span>
<span class="sd"> Exit)</span>
<span class="sd"> Args:</span>
<span class="sd"> traversing_object (Object): The object traversing us.</span>
<span class="sd"> source_location (Object): Where `traversing_object` came from.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> The target location should normally be available as `self.destination`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_failed_traverse"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_failed_traverse">[docs]</a> <span class="k">def</span> <span class="nf">at_failed_traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traversing_object</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"> This is called if an object fails to traverse this object for</span>
<span class="sd"> some reason.</span>
<span class="sd"> Args:</span>
<span class="sd"> traversing_object (Object): The object that failed traversing us.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> Using the default exits, this hook will not be called if an</span>
<span class="sd"> Attribute `err_traverse` is defined - this will in that case be</span>
<span class="sd"> read for an error string instead.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_msg_receive"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_msg_receive">[docs]</a> <span class="k">def</span> <span class="nf">at_msg_receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">from_obj</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"> This hook is called whenever someone sends a message to this</span>
<span class="sd"> object using the `msg` method.</span>
<span class="sd"> Note that from_obj may be None if the sender did not include</span>
<span class="sd"> itself as an argument to the obj.msg() call - so you have to</span>
<span class="sd"> check for this. .</span>
<span class="sd"> Consider this a pre-processing method before msg is passed on</span>
<span class="sd"> to the user session. If this method returns False, the msg</span>
<span class="sd"> will not be passed on.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str, optional): The message received.</span>
<span class="sd"> from_obj (any, optional): The object sending the message.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> This includes any keywords sent to the `msg` method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> receive (bool): If this message should be received.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If this method returns False, the `msg` operation</span>
<span class="sd"> will abort without sending the message.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.at_msg_send"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_msg_send">[docs]</a> <span class="k">def</span> <span class="nf">at_msg_send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">to_obj</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"> This is a hook that is called when *this* object sends a</span>
<span class="sd"> message to another object with `obj.msg(text, to_obj=obj)`.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str, optional): Text to send.</span>
<span class="sd"> to_obj (any, optional): The object to send to.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> Keywords passed from msg()</span>
<span class="sd"> Notes:</span>
<span class="sd"> Since this method is executed by `from_obj`, if no `from_obj`</span>
<span class="sd"> was passed to `DefaultCharacter.msg` this hook will never</span>
<span class="sd"> get called.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="c1"># hooks called by the default cmdset.</span>
<div class="viewcode-block" id="DefaultObject.return_appearance"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.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"> This formats a description. It is the hook a &#39;look&#39; command</span>
<span class="sd"> should call.</span>
<span class="sd"> Args:</span>
<span class="sd"> looker (Object): Object doing the looking.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">filter_visible</span><span class="p">(</span><span class="n">obj_list</span><span class="p">):</span>
<span class="c1"># Helper method to determine if objects are visible to the looker.</span>
<span class="k">return</span> <span class="p">[</span><span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">obj_list</span> <span class="k">if</span> <span class="n">obj</span> <span class="o">!=</span> <span class="n">looker</span> <span class="ow">and</span> <span class="n">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">looker</span><span class="p">,</span> <span class="s2">&quot;view&quot;</span><span class="p">)]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">looker</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># get and identify all objects</span>
<span class="n">exits_list</span> <span class="o">=</span> <span class="n">filter_visible</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">contents_get</span><span class="p">(</span><span class="n">content_type</span><span class="o">=</span><span class="s2">&quot;exit&quot;</span><span class="p">))</span>
<span class="n">users_list</span> <span class="o">=</span> <span class="n">filter_visible</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">contents_get</span><span class="p">(</span><span class="n">content_type</span><span class="o">=</span><span class="s2">&quot;character&quot;</span><span class="p">))</span>
<span class="n">things_list</span> <span class="o">=</span> <span class="n">filter_visible</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">contents_get</span><span class="p">(</span><span class="n">content_type</span><span class="o">=</span><span class="s2">&quot;object&quot;</span><span class="p">))</span>
<span class="n">things</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">thing</span> <span class="ow">in</span> <span class="n">things_list</span><span class="p">:</span>
<span class="n">things</span><span class="p">[</span><span class="n">thing</span><span class="o">.</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">thing</span><span class="p">)</span>
<span class="n">users</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;|c</span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">|n&quot;</span> <span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">users_list</span><span class="p">]</span>
<span class="n">exits</span> <span class="o">=</span> <span class="p">[</span><span class="n">ex</span><span class="o">.</span><span class="n">key</span> <span class="k">for</span> <span class="n">ex</span> <span class="ow">in</span> <span class="n">exits_list</span><span class="p">]</span>
<span class="c1"># get description, build string</span>
<span class="n">string</span> <span class="o">=</span> <span class="s2">&quot;|c</span><span class="si">%s</span><span class="s2">|n</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="p">)</span>
<span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span>
<span class="k">if</span> <span class="n">desc</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">desc</span>
<span class="k">if</span> <span class="n">exits</span><span class="p">:</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wExits:|n &quot;</span> <span class="o">+</span> <span class="n">list_to_string</span><span class="p">(</span><span class="n">exits</span><span class="p">)</span>
<span class="k">if</span> <span class="n">users</span> <span class="ow">or</span> <span class="n">things</span><span class="p">:</span>
<span class="c1"># handle pluralization of things (never pluralize users)</span>
<span class="n">thing_strings</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">itemlist</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">things</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
<span class="n">nitem</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">itemlist</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nitem</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">key</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">itemlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_numbered_name</span><span class="p">(</span><span class="n">nitem</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span><span class="o">.</span><span class="n">get_numbered_name</span><span class="p">(</span><span class="n">nitem</span><span class="p">,</span> <span class="n">looker</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">itemlist</span><span class="p">][</span>
<span class="mi">0</span>
<span class="p">]</span>
<span class="n">thing_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="n">string</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">|wYou see:|n &quot;</span> <span class="o">+</span> <span class="n">list_to_string</span><span class="p">(</span><span class="n">users</span> <span class="o">+</span> <span class="n">thing_strings</span><span class="p">)</span>
<span class="k">return</span> <span class="n">string</span></div>
<div class="viewcode-block" id="DefaultObject.at_look"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_look">[docs]</a> <span class="k">def</span> <span class="nf">at_look</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</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"> Called when this object performs a look. It allows to</span>
<span class="sd"> customize just what this means. It will not itself</span>
<span class="sd"> send any data.</span>
<span class="sd"> Args:</span>
<span class="sd"> target (Object): The target being looked at. This is</span>
<span class="sd"> commonly an object or the current location. It will</span>
<span class="sd"> be checked for the &quot;view&quot; type access.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call. This will be passed into</span>
<span class="sd"> return_appearance, get_display_name and at_desc but is not used</span>
<span class="sd"> by default.</span>
<span class="sd"> Returns:</span>
<span class="sd"> lookstring (str): A ready-processed look string</span>
<span class="sd"> potentially ready to return to the looker.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">target</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="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;Could not view &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</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="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;Could not view &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">target</span><span class="o">.</span><span class="n">key</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">return_appearance</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="c1"># the target&#39;s at_desc() method.</span>
<span class="c1"># this must be the last reference to target so it may delete itself when acted on.</span>
<span class="n">target</span><span class="o">.</span><span class="n">at_desc</span><span class="p">(</span><span class="n">looker</span><span class="o">=</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">return</span> <span class="n">description</span></div>
<div class="viewcode-block" id="DefaultObject.at_desc"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_desc">[docs]</a> <span class="k">def</span> <span class="nf">at_desc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">looker</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"> This is called whenever someone looks at this object.</span>
<span class="sd"> Args:</span>
<span class="sd"> looker (Object, optional): The object requesting the description.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_before_get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_before_get">[docs]</a> <span class="k">def</span> <span class="nf">at_before_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">getter</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"> Called by the default `get` command before this object has been</span>
<span class="sd"> picked up.</span>
<span class="sd"> Args:</span>
<span class="sd"> getter (Object): The object about to get this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> shouldget (bool): If the object should be gotten or not.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If this method returns False/None, the getting is cancelled</span>
<span class="sd"> before it is even started.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.at_get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_get">[docs]</a> <span class="k">def</span> <span class="nf">at_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">getter</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"> Called by the default `get` command when this object has been</span>
<span class="sd"> picked up.</span>
<span class="sd"> Args:</span>
<span class="sd"> getter (Object): The object getting this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> This hook cannot stop the pickup from happening. Use</span>
<span class="sd"> permissions or the at_before_get() hook for that.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_before_give"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_before_give">[docs]</a> <span class="k">def</span> <span class="nf">at_before_give</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">giver</span><span class="p">,</span> <span class="n">getter</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"> Called by the default `give` command before this object has been</span>
<span class="sd"> given.</span>
<span class="sd"> Args:</span>
<span class="sd"> giver (Object): The object about to give this object.</span>
<span class="sd"> getter (Object): The object about to get this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> shouldgive (bool): If the object should be given or not.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If this method returns False/None, the giving is cancelled</span>
<span class="sd"> before it is even started.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.at_give"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_give">[docs]</a> <span class="k">def</span> <span class="nf">at_give</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">giver</span><span class="p">,</span> <span class="n">getter</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"> Called by the default `give` command when this object has been</span>
<span class="sd"> given.</span>
<span class="sd"> Args:</span>
<span class="sd"> giver (Object): The object giving this object.</span>
<span class="sd"> getter (Object): The object getting this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> This hook cannot stop the give from happening. Use</span>
<span class="sd"> permissions or the at_before_give() hook for that.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_before_drop"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_before_drop">[docs]</a> <span class="k">def</span> <span class="nf">at_before_drop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dropper</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"> Called by the default `drop` command before this object has been</span>
<span class="sd"> dropped.</span>
<span class="sd"> Args:</span>
<span class="sd"> dropper (Object): The object which will drop this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> shoulddrop (bool): If the object should be dropped or not.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If this method returns False/None, the dropping is cancelled</span>
<span class="sd"> before it is even started.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">locks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;drop&quot;</span><span class="p">):</span>
<span class="c1"># TODO: This if-statment will be removed in Evennia 1.0</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">dropper</span><span class="p">,</span> <span class="s2">&quot;drop&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">dropper</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;You cannot drop </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">dropper</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span></div>
<div class="viewcode-block" id="DefaultObject.at_drop"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_drop">[docs]</a> <span class="k">def</span> <span class="nf">at_drop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dropper</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"> Called by the default `drop` command when this object has been</span>
<span class="sd"> dropped.</span>
<span class="sd"> Args:</span>
<span class="sd"> dropper (Object): The object which just dropped this object.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> This hook cannot stop the drop from happening. Use</span>
<span class="sd"> permissions or the at_before_drop() hook for that.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="DefaultObject.at_before_say"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_before_say">[docs]</a> <span class="k">def</span> <span class="nf">at_before_say</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</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"> Before the object says something.</span>
<span class="sd"> This hook is by default used by the &#39;say&#39; and &#39;whisper&#39;</span>
<span class="sd"> commands as used by this command it is called before the text</span>
<span class="sd"> is said/whispered and can be used to customize the outgoing</span>
<span class="sd"> text from the object. Returning `None` aborts the command.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): The suggested say/whisper text spoken by self.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> whisper (bool): If True, this is a whisper rather than</span>
<span class="sd"> a say. This is sent by the whisper command by default.</span>
<span class="sd"> Other verbal commands could use this hook in similar</span>
<span class="sd"> ways.</span>
<span class="sd"> receivers (Object or iterable): If set, this is the target or targets for the</span>
<span class="sd"> say/whisper.</span>
<span class="sd"> Returns:</span>
<span class="sd"> message (str): The (possibly modified) text to be spoken.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">message</span></div>
<div class="viewcode-block" id="DefaultObject.at_say"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject.at_say">[docs]</a> <span class="k">def</span> <span class="nf">at_say</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">message</span><span class="p">,</span>
<span class="n">msg_self</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">msg_location</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">receivers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">msg_receivers</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="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Display the actual say (or whisper) of self.</span>
<span class="sd"> This hook should display the actual say/whisper of the object in its</span>
<span class="sd"> location. It should both alert the object (self) and its</span>
<span class="sd"> location that some text is spoken. The overriding of messages or</span>
<span class="sd"> `mapping` allows for simple customization of the hook without</span>
<span class="sd"> re-writing it completely.</span>
<span class="sd"> Args:</span>
<span class="sd"> message (str): The message to convey.</span>
<span class="sd"> msg_self (bool or str, optional): If boolean True, echo `message` to self. If a string,</span>
<span class="sd"> return that message. If False or unset, don&#39;t echo to self.</span>
<span class="sd"> msg_location (str, optional): The message to echo to self&#39;s location.</span>
<span class="sd"> receivers (Object or iterable, optional): An eventual receiver or receivers of the</span>
<span class="sd"> message (by default only used by whispers).</span>
<span class="sd"> msg_receivers(str): Specific message to pass to the receiver(s). This will parsed</span>
<span class="sd"> with the {receiver} placeholder replaced with the given receiver.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> whisper (bool): If this is a whisper rather than a say. Kwargs</span>
<span class="sd"> can be used by other verbal commands in a similar way.</span>
<span class="sd"> mapping (dict): Pass an additional mapping to the message.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Messages can contain {} markers. These are substituted against the values</span>
<span class="sd"> passed in the `mapping` argument.</span>
<span class="sd"> msg_self = &#39;You say: &quot;{speech}&quot;&#39;</span>
<span class="sd"> msg_location = &#39;{object} says: &quot;{speech}&quot;&#39;</span>
<span class="sd"> msg_receivers = &#39;{object} whispers: &quot;{speech}&quot;&#39;</span>
<span class="sd"> Supported markers by default:</span>
<span class="sd"> {self}: text to self-reference with (default &#39;You&#39;)</span>
<span class="sd"> {speech}: the text spoken/whispered by self.</span>
<span class="sd"> {object}: the object speaking.</span>
<span class="sd"> {receiver}: replaced with a single receiver only for strings meant for a specific</span>
<span class="sd"> receiver (otherwise &#39;None&#39;).</span>
<span class="sd"> {all_receivers}: comma-separated list of all receivers,</span>
<span class="sd"> if more than one, otherwise same as receiver</span>
<span class="sd"> {location}: the location where object is.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">msg_type</span> <span class="o">=</span> <span class="s2">&quot;say&quot;</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;whisper&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="c1"># whisper mode</span>
<span class="n">msg_type</span> <span class="o">=</span> <span class="s2">&quot;whisper&quot;</span>
<span class="n">msg_self</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">&#39;</span><span class="si">{self}</span><span class="s1"> whisper to </span><span class="si">{all_receivers}</span><span class="s1">, &quot;|n</span><span class="si">{speech}</span><span class="s1">|n&quot;&#39;</span>
<span class="k">if</span> <span class="n">msg_self</span> <span class="ow">is</span> <span class="kc">True</span> <span class="k">else</span> <span class="n">msg_self</span>
<span class="p">)</span>
<span class="n">msg_receivers</span> <span class="o">=</span> <span class="n">msg_receivers</span> <span class="ow">or</span> <span class="s1">&#39;</span><span class="si">{object}</span><span class="s1"> whispers: &quot;|n</span><span class="si">{speech}</span><span class="s1">|n&quot;&#39;</span>
<span class="n">msg_location</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">msg_self</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{self}</span><span class="s1"> say, &quot;|n</span><span class="si">{speech}</span><span class="s1">|n&quot;&#39;</span> <span class="k">if</span> <span class="n">msg_self</span> <span class="ow">is</span> <span class="kc">True</span> <span class="k">else</span> <span class="n">msg_self</span>
<span class="n">msg_location</span> <span class="o">=</span> <span class="n">msg_location</span> <span class="ow">or</span> <span class="s1">&#39;</span><span class="si">{object}</span><span class="s1"> says, &quot;</span><span class="si">{speech}</span><span class="s1">&quot;&#39;</span>
<span class="n">msg_receivers</span> <span class="o">=</span> <span class="n">msg_receivers</span> <span class="ow">or</span> <span class="n">message</span>
<span class="n">custom_mapping</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;mapping&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">receivers</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">receivers</span><span class="p">)</span> <span class="k">if</span> <span class="n">receivers</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="n">msg_self</span><span class="p">:</span>
<span class="n">self_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;self&quot;</span><span class="p">:</span> <span class="s2">&quot;You&quot;</span><span class="p">,</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
<span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="n">location</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">if</span> <span class="n">location</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;receiver&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;all_receivers&quot;</span><span class="p">:</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">recv</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="k">for</span> <span class="n">recv</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">)</span>
<span class="k">if</span> <span class="n">receivers</span>
<span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;speech&quot;</span><span class="p">:</span> <span class="n">message</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">self_mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">custom_mapping</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="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">msg_self</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">self_mapping</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">msg_type</span><span class="p">}),</span> <span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">receivers</span> <span class="ow">and</span> <span class="n">msg_receivers</span><span class="p">:</span>
<span class="n">receiver_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;self&quot;</span><span class="p">:</span> <span class="s2">&quot;You&quot;</span><span class="p">,</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;receiver&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;all_receivers&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;speech&quot;</span><span class="p">:</span> <span class="n">message</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">receivers</span><span class="p">):</span>
<span class="n">individual_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">receiver</span><span class="p">),</span>
<span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="n">location</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">receiver</span><span class="p">),</span>
<span class="s2">&quot;receiver&quot;</span><span class="p">:</span> <span class="n">receiver</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">receiver</span><span class="p">),</span>
<span class="s2">&quot;all_receivers&quot;</span><span class="p">:</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">recv</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">recv</span><span class="p">)</span> <span class="k">for</span> <span class="n">recv</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">)</span>
<span class="k">if</span> <span class="n">receivers</span>
<span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">receiver_mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">individual_mapping</span><span class="p">)</span>
<span class="n">receiver_mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">custom_mapping</span><span class="p">)</span>
<span class="n">receiver</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">msg_receivers</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">receiver_mapping</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">msg_type</span><span class="p">}),</span>
<span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="ow">and</span> <span class="n">msg_location</span><span class="p">:</span>
<span class="n">location_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;self&quot;</span><span class="p">:</span> <span class="s2">&quot;You&quot;</span><span class="p">,</span>
<span class="s2">&quot;object&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="n">location</span><span class="p">,</span>
<span class="s2">&quot;all_receivers&quot;</span><span class="p">:</span> <span class="s2">&quot;, &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="n">recv</span><span class="p">)</span> <span class="k">for</span> <span class="n">recv</span> <span class="ow">in</span> <span class="n">receivers</span><span class="p">)</span> <span class="k">if</span> <span class="n">receivers</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;receiver&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;speech&quot;</span><span class="p">:</span> <span class="n">message</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">location_mapping</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">custom_mapping</span><span class="p">)</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">msg_self</span><span class="p">:</span>
<span class="n">exclude</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">receivers</span><span class="p">:</span>
<span class="n">exclude</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">receivers</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="n">msg_contents</span><span class="p">(</span>
<span class="n">text</span><span class="o">=</span><span class="p">(</span><span class="n">msg_location</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">msg_type</span><span class="p">}),</span>
<span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="n">exclude</span><span class="o">=</span><span class="n">exclude</span><span class="p">,</span>
<span class="n">mapping</span><span class="o">=</span><span class="n">location_mapping</span><span class="p">,</span>
<span class="p">)</span></div></div>
<span class="c1">#</span>
<span class="c1"># Base Character object</span>
<span class="c1">#</span>
<div class="viewcode-block" id="DefaultCharacter"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter">[docs]</a><span class="k">class</span> <span class="nc">DefaultCharacter</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This implements an Object puppeted by a Session - that is,</span>
<span class="sd"> a character avatar controlled by an account.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Tuple of types used for indexing inventory contents. Characters generally wouldn&#39;t be in</span>
<span class="c1"># anyone&#39;s inventory, but this also governs displays in room contents.</span>
<span class="n">_content_types</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;character&quot;</span><span class="p">,)</span>
<span class="c1"># lockstring of newly created rooms, for easy overloading.</span>
<span class="c1"># Will be formatted with the appropriate attributes.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;puppet:id(</span><span class="si">{character_id}</span><span class="s2">) or pid(</span><span class="si">{account_id}</span><span class="s2">) or perm(Developer) or pperm(Developer);&quot;</span>
<span class="s2">&quot;delete:id(</span><span class="si">{account_id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="p">)</span>
<div class="viewcode-block" id="DefaultCharacter.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic Character with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
<span class="sd"> Provides a friendlier interface to the utils.create_character() function.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new Character.</span>
<span class="sd"> account (obj, optional): Account to associate this Character with.</span>
<span class="sd"> If unset supplying None-- it will</span>
<span class="sd"> change the default lockset and skip creator attribution.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> description (str): Brief description for this object.</span>
<span class="sd"> ip (str): IP address of creator (for object auditing).</span>
<span class="sd"> All other kwargs will be passed into the create_object call.</span>
<span class="sd"> Returns:</span>
<span class="sd"> character (Object): A newly created Character of the given typeclass.</span>
<span class="sd"> errors (list): A list of errors in string form, if any.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Get IP address of creator, if available</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># If no typeclass supplied, use this class</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
<span class="c1"># Normalize to latin characters and validate, if necessary, the supplied key</span>
<span class="n">key</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">normalize_name</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">validate_name</span><span class="p">(</span><span class="n">key</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Invalid character name.&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span>
<span class="c1"># Set the supplied key as the name of the intended object</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
<span class="c1"># Get permissions</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;permissions&quot;</span><span class="p">]</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;permissions&quot;</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">PERMISSION_ACCOUNT_DEFAULT</span><span class="p">)</span>
<span class="c1"># Get description if provided</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># Get locks if provided</span>
<span class="n">locks</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Check to make sure account does not have too many chars</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">settings</span><span class="o">.</span><span class="n">MAX_NR_CHARACTERS</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;There are too many characters associated with this account.&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span>
<span class="c1"># Create the Character</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span> <span class="o">=</span> <span class="n">ip</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_id</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">account</span><span class="o">.</span><span class="n">characters</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_playable_characters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="c1"># Add locks</span>
<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="c1"># Allow only the character itself and the creator account to puppet this character</span>
<span class="c1"># (and Developers).</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;character_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="s2">&quot;account_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="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s2">&quot;character_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="s2">&quot;account_id&quot;</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</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>
<span class="c1"># If no description is set, set a default description</span>
<span class="k">if</span> <span class="n">description</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">description</span> <span class="k">if</span> <span class="n">description</span> <span class="k">else</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;This is a character.&quot;</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">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;An error occurred while creating object &#39;</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> object.&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">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span></div>
<div class="viewcode-block" id="DefaultCharacter.normalize_name"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.normalize_name">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">normalize_name</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Normalize the character name prior to creating. Note that this should be refactored to</span>
<span class="sd"> support i18n for non-latin scripts, but as we (currently) have no bug reports requesting</span>
<span class="sd"> better support of non-latin character sets, requiring character names to be latinified is an</span>
<span class="sd"> acceptable option.</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str) : The name of the character</span>
<span class="sd"> Returns:</span>
<span class="sd"> latin_name (str) : A valid name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">latinify</span>
<span class="n">latin_name</span> <span class="o">=</span> <span class="n">latinify</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&quot;X&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">latin_name</span></div>
<div class="viewcode-block" id="DefaultCharacter.validate_name"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.validate_name">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">validate_name</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Validate the character name prior to creating. Overload this function to add custom validators</span>
<span class="sd"> Args:</span>
<span class="sd"> name (str) : The name of the character</span>
<span class="sd"> Returns:</span>
<span class="sd"> valid (bool) : True if character creation should continue; False if it should fail</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span> <span class="c1"># Default validator does not perform any operations</span></div>
<div class="viewcode-block" id="DefaultCharacter.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Setup character-specific security.</span>
<span class="sd"> You should normally not need to overload this, but if you do,</span>
<span class="sd"> make sure to reproduce at least the two last commands in this</span>
<span class="sd"> method (unless you want to fundamentally change how a</span>
<span class="sd"> Character object works).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="bp">self</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="s2">&quot;;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;get:false()&quot;</span><span class="p">,</span> <span class="s2">&quot;call:false()&quot;</span><span class="p">])</span> <span class="c1"># noone can pick up the character</span>
<span class="p">)</span> <span class="c1"># no commands can be called on character from outside</span>
<span class="c1"># add the default cmdset</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add_default</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">CMDSET_CHARACTER</span><span class="p">,</span> <span class="n">permanent</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultCharacter.at_after_move"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.at_after_move">[docs]</a> <span class="k">def</span> <span class="nf">at_after_move</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_location</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"> We make sure to look around after a move.</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">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>
<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>
<span class="sd"> Return the character from storage in None location in `at_post_unpuppet`.</span>
<span class="sd"> Args:</span>
<span class="sd"> account (Account): This is the connecting account.</span>
<span class="sd"> session (Session): Session controlling the connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="p">):</span> <span class="c1"># Make sure character&#39;s location is never None before being puppeted.</span>
<span class="c1"># Return to last location (or home, which should always exist),</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">db</span><span class="o">.</span><span class="n">prelogout_location</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">prelogout_location</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">home</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">at_object_receive</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="kc">None</span>
<span class="p">)</span> <span class="c1"># and trigger the location&#39;s reception hook.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span> <span class="c1"># If the character is verified to be somewhere,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">prelogout_location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="c1"># save location again to be sure.</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">account</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span>
<span class="n">_</span><span class="p">(</span><span class="s2">&quot;|r</span><span class="si">{obj}</span><span class="s2"> has no location and no home is set.|n&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj</span><span class="o">=</span><span class="bp">self</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"># Note to set home.</span></div>
<div class="viewcode-block" id="DefaultCharacter.at_post_puppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.at_post_puppet">[docs]</a> <span class="k">def</span> <span class="nf">at_post_puppet</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called just after puppeting has been completed and all</span>
<span class="sd"> Account&lt;-&gt;Object links have been established.</span>
<span class="sd"> Args:</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Note:</span>
<span class="sd"> You can use `self.account` and `self.sessions.get()` to get</span>
<span class="sd"> account and sessions at this point; the last entry in the</span>
<span class="sd"> list from `self.sessions.get()` is the latest Session</span>
<span class="sd"> puppeting this Object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">You become |c</span><span class="si">{name}</span><span class="s2">|n.</span><span class="se">\n</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">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">key</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> <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>
<span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">from_obj</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{name}</span><span class="s2"> has entered the game.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">obj</span><span class="p">)),</span>
<span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</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="n">for_contents</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">],</span> <span class="n">from_obj</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultCharacter.at_post_unpuppet"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultCharacter.at_post_unpuppet">[docs]</a> <span class="k">def</span> <span class="nf">at_post_unpuppet</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>
<span class="sd"> We stove away the character when the account goes ooc/logs off,</span>
<span class="sd"> otherwise the character object will remain in the room also</span>
<span class="sd"> after the account logged off (&quot;headless&quot;, so to say).</span>
<span class="sd"> Args:</span>
<span class="sd"> account (Account): The account object that just disconnected</span>
<span class="sd"> from this object.</span>
<span class="sd"> session (Session): Session controlling the connection that</span>
<span class="sd"> just disconnected.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">count</span><span class="p">():</span>
<span class="c1"># only remove this char from grid if no sessions control it anymore.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">message</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">from_obj</span><span class="p">):</span>
<span class="n">obj</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{name}</span><span class="s2"> has left the game.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">obj</span><span class="p">)),</span>
<span class="n">from_obj</span><span class="o">=</span><span class="n">from_obj</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="n">for_contents</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="p">],</span> <span class="n">from_obj</span><span class="o">=</span><span class="bp">self</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">prelogout_location</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">idle_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the idle time of the least idle session in seconds. If</span>
<span class="sd"> no sessions are connected it returns nothing.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">idle</span> <span class="o">=</span> <span class="p">[</span><span class="n">session</span><span class="o">.</span><span class="n">cmd_last_visible</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="k">if</span> <span class="n">idle</span><span class="p">:</span>
<span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">idle</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">connection_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the maximum connection time of all connected sessions</span>
<span class="sd"> in seconds. Returns nothing if there are no sessions.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">conn</span> <span class="o">=</span> <span class="p">[</span><span class="n">session</span><span class="o">.</span><span class="n">conn_time</span> <span class="k">for</span> <span class="n">session</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">all</span><span class="p">()]</span>
<span class="k">if</span> <span class="n">conn</span><span class="p">:</span>
<span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="nb">float</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">conn</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="c1">#</span>
<span class="c1"># Base Room object</span>
<div class="viewcode-block" id="DefaultRoom"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultRoom">[docs]</a><span class="k">class</span> <span class="nc">DefaultRoom</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the base room object. It&#39;s just like any Object except its</span>
<span class="sd"> location is always `None`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># A tuple of strings used for indexing this object inside an inventory.</span>
<span class="c1"># Generally, a room isn&#39;t expected to HAVE a location, but maybe in some games?</span>
<span class="n">_content_types</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;room&quot;</span><span class="p">,)</span>
<span class="c1"># lockstring of newly created rooms, for easy overloading.</span>
<span class="c1"># Will be formatted with the {id} of the creating object.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;control:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;delete:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;edit:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="p">)</span>
<div class="viewcode-block" id="DefaultRoom.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultRoom.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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Creates a basic Room with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
<span class="sd"> Provides a friendlier interface to the utils.create_object() function.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new Room.</span>
<span class="sd"> account (obj, optional): Account to associate this Room with. If</span>
<span class="sd"> given, it will be given specific control/edit permissions to this</span>
<span class="sd"> object (along with normal Admin perms). If not given, default</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> description (str): Brief description for this object.</span>
<span class="sd"> ip (str): IP address of creator (for object auditing).</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"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Get IP address of creator, if available</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># If no typeclass supplied, use this class</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
<span class="c1"># Set the supplied key as the name of the intended object</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
<span class="c1"># Get who to send errors to</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;report_to&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;report_to&quot;</span><span class="p">,</span> <span class="n">account</span><span class="p">)</span>
<span class="c1"># Get description, if provided</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># get locks if provided</span>
<span class="n">locks</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Create the Room</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Add locks</span>
<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">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>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span> <span class="o">=</span> <span class="n">ip</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_id</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># If no description is set, set a default description</span>
<span class="k">if</span> <span class="n">description</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">description</span> <span class="k">if</span> <span class="n">description</span> <span class="k">else</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;This is a room.&quot;</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">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;An error occurred while creating this &#39;</span><span class="si">%s</span><span class="s2">&#39; object.&quot;</span> <span class="o">%</span> <span class="n">key</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">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span></div>
<div class="viewcode-block" id="DefaultRoom.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultRoom.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Simple room setup setting locks to make sure the room</span>
<span class="sd"> cannot be picked up.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="bp">self</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="s2">&quot;;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s2">&quot;get:false()&quot;</span><span class="p">,</span> <span class="s2">&quot;puppet:false()&quot;</span><span class="p">])</span>
<span class="p">)</span> <span class="c1"># would be weird to puppet a room ...</span>
<span class="bp">self</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span></div></div>
<span class="c1">#</span>
<span class="c1"># Default Exit command, used by the base exit object</span>
<span class="c1">#</span>
<div class="viewcode-block" id="ExitCommand"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ExitCommand">[docs]</a><span class="k">class</span> <span class="nc">ExitCommand</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"> This is a command that simply cause the caller to traverse</span>
<span class="sd"> the object it is attached to.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="ExitCommand.func"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ExitCommand.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"> Default exit traverse if no syscommand is defined.</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">obj</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="s2">&quot;traverse&quot;</span><span class="p">):</span>
<span class="c1"># we may traverse the exit.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">at_traverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># exit is locked</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">err_traverse</span><span class="p">:</span>
<span class="c1"># if exit has a better error message, let&#39;s use it.</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="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">err_traverse</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># No shorthand error message. Call hook.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">at_failed_traverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">)</span></div>
<div class="viewcode-block" id="ExitCommand.get_extra_info"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.ExitCommand.get_extra_info">[docs]</a> <span class="k">def</span> <span class="nf">get_extra_info</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="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Shows a bit of information on where the exit leads.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object): The object (usually a character) that entered an ambiguous command.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Returns:</span>
<span class="sd"> A string with identifying information to disambiguate the command, conventionally with a</span>
<span class="sd"> preceding space.</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">obj</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot; (exit to </span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</span><span class="o">.</span><span class="n">destination</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="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot; (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj</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></div></div>
<span class="c1">#</span>
<span class="c1"># Base Exit object</span>
<div class="viewcode-block" id="DefaultExit"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit">[docs]</a><span class="k">class</span> <span class="nc">DefaultExit</span><span class="p">(</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the base exit object - it connects a location to another.</span>
<span class="sd"> This is done by the exit assigning a &quot;command&quot; on itself with the</span>
<span class="sd"> same name as the exit object (to do this we need to remember to</span>
<span class="sd"> re-create the command when the object is cached since it must be</span>
<span class="sd"> created dynamically depending on what the exit is called). This</span>
<span class="sd"> command (which has a high priority) will thus allow us to traverse</span>
<span class="sd"> exits simply by giving the exit-object&#39;s name on its own.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_content_types</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;exit&quot;</span><span class="p">,)</span>
<span class="n">exit_command</span> <span class="o">=</span> <span class="n">ExitCommand</span>
<span class="n">priority</span> <span class="o">=</span> <span class="mi">101</span>
<span class="c1"># lockstring of newly created exits, for easy overloading.</span>
<span class="c1"># Will be formatted with the {id} of the creating object.</span>
<span class="n">lockstring</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;control:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;delete:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin); &quot;</span>
<span class="s2">&quot;edit:id(</span><span class="si">{id}</span><span class="s2">) or perm(Admin)&quot;</span>
<span class="p">)</span>
<span class="c1"># Helper classes and methods to implement the Exit. These need not</span>
<span class="c1"># be overloaded unless one want to change the foundation for how</span>
<span class="c1"># Exits work. See the end of the class for hook methods to overload.</span>
<div class="viewcode-block" id="DefaultExit.create_exit_cmdset"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.create_exit_cmdset">[docs]</a> <span class="k">def</span> <span class="nf">create_exit_cmdset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exidbobj</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Helper function for creating an exit command set + command.</span>
<span class="sd"> The command of this cmdset has the same name as the Exit</span>
<span class="sd"> object and allows the exit to react when the account enter the</span>
<span class="sd"> exit&#39;s name, triggering the movement between rooms.</span>
<span class="sd"> Args:</span>
<span class="sd"> exidbobj (Object): The DefaultExit object to base the command on.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># create an exit command. We give the properties here,</span>
<span class="c1"># to always trigger metaclass preparations</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_command</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">exidbobj</span><span class="o">.</span><span class="n">db_key</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="n">aliases</span><span class="o">=</span><span class="n">exidbobj</span><span class="o">.</span><span class="n">aliases</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span>
<span class="n">locks</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">exidbobj</span><span class="o">.</span><span class="n">locks</span><span class="p">),</span>
<span class="n">auto_help</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">destination</span><span class="o">=</span><span class="n">exidbobj</span><span class="o">.</span><span class="n">db_destination</span><span class="p">,</span>
<span class="n">arg_regex</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;^$&quot;</span><span class="p">,</span>
<span class="n">is_exit</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="n">exidbobj</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># create a cmdset</span>
<span class="n">exit_cmdset</span> <span class="o">=</span> <span class="n">cmdset</span><span class="o">.</span><span class="n">CmdSet</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="n">exit_cmdset</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;ExitCmdSet&quot;</span>
<span class="n">exit_cmdset</span><span class="o">.</span><span class="n">priority</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">priority</span>
<span class="n">exit_cmdset</span><span class="o">.</span><span class="n">duplicates</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># add command to cmdset</span>
<span class="n">exit_cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
<span class="k">return</span> <span class="n">exit_cmdset</span></div>
<span class="c1"># Command hooks</span>
<div class="viewcode-block" id="DefaultExit.create"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.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">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="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"> Creates a basic Exit with default parameters, unless otherwise</span>
<span class="sd"> specified or extended.</span>
<span class="sd"> Provides a friendlier interface to the utils.create_object() function.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): Name of the new Exit, as it should appear from the</span>
<span class="sd"> source room.</span>
<span class="sd"> account (obj): Account to associate this Exit with.</span>
<span class="sd"> source (Room): The room to create this exit in.</span>
<span class="sd"> dest (Room): The room to which this exit should go.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> description (str): Brief description for this object.</span>
<span class="sd"> ip (str): IP address of creator (for object auditing).</span>
<span class="sd"> Returns:</span>
<span class="sd"> exit (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"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">obj</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Get IP address of creator, if available</span>
<span class="n">ip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;ip&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="c1"># If no typeclass supplied, use this class</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;typeclass&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;typeclass&quot;</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span>
<span class="c1"># Set the supplied key as the name of the intended object</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
<span class="c1"># Get who to send errors to</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;report_to&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;report_to&quot;</span><span class="p">,</span> <span class="n">account</span><span class="p">)</span>
<span class="c1"># Set to/from rooms</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;destination&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">dest</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">locks</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;locks&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Create the Exit</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Set appropriate locks</span>
<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="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>
<span class="c1"># Record creator id and creation IP</span>
<span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_ip</span> <span class="o">=</span> <span class="n">ip</span>
<span class="k">if</span> <span class="n">account</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">creator_id</span> <span class="o">=</span> <span class="n">account</span><span class="o">.</span><span class="n">id</span>
<span class="c1"># If no description is set, set a default description</span>
<span class="k">if</span> <span class="n">description</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="n">description</span> <span class="k">if</span> <span class="n">description</span> <span class="k">else</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;This is an exit.&quot;</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">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;An error occurred while creating this &#39;</span><span class="si">%s</span><span class="s2">&#39; object.&quot;</span> <span class="o">%</span> <span class="n">key</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">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">errors</span></div>
<div class="viewcode-block" id="DefaultExit.basetype_setup"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.basetype_setup">[docs]</a> <span class="k">def</span> <span class="nf">basetype_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Setup exit-security</span>
<span class="sd"> You should normally not need to overload this - if you do make</span>
<span class="sd"> sure you include all the functionality in this method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="c1"># setting default locks (overload these in at_object_creation()</span>
<span class="bp">self</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="s2">&quot;;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="p">[</span>
<span class="s2">&quot;puppet:false()&quot;</span><span class="p">,</span> <span class="c1"># would be weird to puppet an exit ...</span>
<span class="s2">&quot;traverse:all()&quot;</span><span class="p">,</span> <span class="c1"># who can pass through exit by default</span>
<span class="s2">&quot;get:false()&quot;</span><span class="p">,</span> <span class="c1"># noone can pick up the exit</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="c1"># an exit should have a destination (this is replaced at creation time)</span>
<span class="k">if</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="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">location</span></div>
<div class="viewcode-block" id="DefaultExit.at_cmdset_get"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.at_cmdset_get">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_get</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called just before cmdsets on this object are requested by the</span>
<span class="sd"> command handler. If changes need to be done on the fly to the</span>
<span class="sd"> cmdset before passing them on to the cmdhandler, this is the</span>
<span class="sd"> place to do it. This is called also if the object currently</span>
<span class="sd"> has no cmdsets.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> force_init (bool): If `True`, force a re-build of the cmdset</span>
<span class="sd"> (for example to update aliases).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;force_init&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">has_cmdset</span><span class="p">(</span><span class="s2">&quot;ExitCmdSet&quot;</span><span class="p">,</span> <span class="n">must_be_default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="c1"># we are resetting, or no exit-cmdset was set. Create one dynamically.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">create_exit_cmdset</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="n">permanent</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultExit.at_init"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.at_init">[docs]</a> <span class="k">def</span> <span class="nf">at_init</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 called when this objects is re-loaded from cache. When</span>
<span class="sd"> that happens, we make sure to remove any old ExitCmdSet cmdset</span>
<span class="sd"> (this most commonly occurs when renaming an existing exit)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">remove_default</span><span class="p">()</span></div>
<div class="viewcode-block" id="DefaultExit.at_traverse"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.at_traverse">[docs]</a> <span class="k">def</span> <span class="nf">at_traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traversing_object</span><span class="p">,</span> <span class="n">target_location</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"> This implements the actual traversal. The traverse lock has</span>
<span class="sd"> already been checked (in the Exit command) at this point.</span>
<span class="sd"> Args:</span>
<span class="sd"> traversing_object (Object): Object traversing us.</span>
<span class="sd"> target_location (Object): Where target is going.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">source_location</span> <span class="o">=</span> <span class="n">traversing_object</span><span class="o">.</span><span class="n">location</span>
<span class="k">if</span> <span class="n">traversing_object</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">target_location</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_after_traverse</span><span class="p">(</span><span class="n">traversing_object</span><span class="p">,</span> <span class="n">source_location</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">err_traverse</span><span class="p">:</span>
<span class="c1"># if exit has a better error message, let&#39;s use it.</span>
<span class="n">traversing_object</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">db</span><span class="o">.</span><span class="n">err_traverse</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># No shorthand error message. Call hook.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_failed_traverse</span><span class="p">(</span><span class="n">traversing_object</span><span class="p">)</span></div>
<div class="viewcode-block" id="DefaultExit.at_failed_traverse"><a class="viewcode-back" href="../../../api/evennia.objects.objects.html#evennia.objects.objects.DefaultExit.at_failed_traverse">[docs]</a> <span class="k">def</span> <span class="nf">at_failed_traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traversing_object</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"> Overloads the default hook to implement a simple default error message.</span>
<span class="sd"> Args:</span>
<span class="sd"> traversing_object (Object): The object that failed traversing us.</span>
<span class="sd"> **kwargs (dict): Arbitrary, optional arguments for users</span>
<span class="sd"> overriding the call (unused by default).</span>
<span class="sd"> Notes:</span>
<span class="sd"> Using the default exits, this hook will not be called if an</span>
<span class="sd"> Attribute `err_traverse` is defined - this will in that case be</span>
<span class="sd"> read for an error string instead.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">traversing_object</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;You cannot go there.&quot;</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="objects.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.objects.objects</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>