mirror of
https://github.com/evennia/evennia.git
synced 2026-03-17 13:26:30 +01:00
309 lines
No EOL
32 KiB
HTML
309 lines
No EOL
32 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>Objects — Evennia 3.x 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" />
|
||
<link rel="next" title="Characters" href="Characters.html" />
|
||
<link rel="prev" title="Accounts" href="Accounts.html" />
|
||
</head><body>
|
||
|
||
|
||
<div class="admonition important">
|
||
<p class="first admonition-title">Note</p>
|
||
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
|
||
</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"
|
||
accesskey="I">index</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python Module Index"
|
||
>modules</a> |</li>
|
||
<li class="right" >
|
||
<a href="Characters.html" title="Characters"
|
||
accesskey="N">next</a> |</li>
|
||
<li class="right" >
|
||
<a href="Accounts.html" title="Accounts"
|
||
accesskey="P">previous</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 3.x</a> »</li>
|
||
<li class="nav-item nav-item-1"><a href="Components-Overview.html" accesskey="U">Core Components</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">Objects</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
|
||
<div class="documentwrapper">
|
||
<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><a href="../index.html">Table of Contents</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#">Objects</a><ul>
|
||
<li><a class="reference internal" href="#object">Object</a></li>
|
||
<li><a class="reference internal" href="#objectparent-adding-common-functionality">ObjectParent - Adding common functionality</a></li>
|
||
<li><a class="reference internal" href="#working-with-children-of-defaultobject">Working with children of DefaultObject</a><ul>
|
||
<li><a class="reference internal" href="#properties-and-functions-on-objects">Properties and functions on Objects</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#changing-an-objects-appearance">Changing an Object’s appearance</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>Previous topic</h4>
|
||
<p class="topless"><a href="Accounts.html"
|
||
title="previous chapter">Accounts</a></p>
|
||
<h4>Next topic</h4>
|
||
<p class="topless"><a href="Characters.html"
|
||
title="next chapter">Characters</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<!--h3>This Page</h3-->
|
||
<ul class="this-page-menu">
|
||
<li><a href="../_sources/Components/Objects.md.txt"
|
||
rel="nofollow">Show Page Source</a></li>
|
||
</ul>
|
||
</div><h3>Links</h3>
|
||
<ul>
|
||
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
||
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
||
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
||
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
||
<li>
|
||
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
||
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
||
<a href="https://evennia.blogspot.com/">Blog</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section class="tex2jax_ignore mathjax_ignore" id="objects">
|
||
<h1>Objects<a class="headerlink" href="#objects" title="Permalink to this headline">¶</a></h1>
|
||
<p><strong>Message-path:</strong></p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>┌──────┐ │ ┌───────┐ ┌───────┐ ┌──────┐
|
||
│Client├─┼──►│Session├───►│Account├──►│Object│
|
||
└──────┘ │ └───────┘ └───────┘ └──────┘
|
||
^
|
||
</pre></div>
|
||
</div>
|
||
<p>All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are jointly referred to as an Evennia <em>Object</em>. An Object is generally something you can look and interact with in the game world. When a message travels from the client, the Object-level is the last stop.</p>
|
||
<p>Objects form the core of Evennia and is probably what you’ll spend most time working with. Objects are <a class="reference internal" href="Typeclasses.html"><span class="doc std std-doc">Typeclassed</span></a> entities.</p>
|
||
<p>An Evennia Object is, by definition, a Python class that includes <a class="reference internal" href="../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject" title="evennia.objects.objects.DefaultObject"><span class="xref myst py py-class">evennia.objects.objects.DefaultObject</span></a> among its parents. Evennia defines several subclasses of <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">Object</span></code> - the base in-game entity. Found in <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/objects.py</span></code>. Inherits directly from <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>.</p></li>
|
||
<li><p><a class="reference internal" href="Characters.html"><span class="doc std std-doc">Characters</span></a> - the normal in-game Character, controlled by a player. Found in <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/characters.py</span></code>. Inherits from <code class="docutils literal notranslate"><span class="pre">DefaultCharacter</span></code>, which is turn a child of <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>.</p></li>
|
||
<li><p><a class="reference internal" href="Rooms.html"><span class="doc std std-doc">Rooms</span></a> - a location in the game world. Found in <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/rooms.py</span></code>. Inherits from <code class="docutils literal notranslate"><span class="pre">DefaultRoom</span></code>, which is in turn a child of <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>).</p></li>
|
||
<li><p><a class="reference internal" href="Exits.html"><span class="doc std std-doc">Exits</span></a> - represents a one-way connection to another location. Found in <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/exits.py</span></code> (inherits from <code class="docutils literal notranslate"><span class="pre">DefaultExit</span></code>, which is in turn a child of <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>).</p></li>
|
||
</ul>
|
||
<section id="object">
|
||
<h2>Object<a class="headerlink" href="#object" title="Permalink to this headline">¶</a></h2>
|
||
<p><strong>Inheritance Tree:</strong></p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>┌─────────────┐
|
||
│DefaultObject│
|
||
└──────▲──────┘
|
||
│ ┌────────────┐
|
||
│ ┌─────►ObjectParent│
|
||
│ │ └────────────┘
|
||
┌─┴─┴──┐
|
||
│Object│
|
||
└──────┘
|
||
</pre></div>
|
||
</div>
|
||
<blockquote>
|
||
<div><p>For an explanation of <code class="docutils literal notranslate"><span class="pre">ObjectParent</span></code>, see next section.</p>
|
||
</div></blockquote>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">Object</span></code> class is meant to be used as the basis for creating things that are neither characters, rooms or exits - anything from weapons and armour, equipment and houses can be represented by extending the Object class. Depending on your game, this also goes for NPCs and monsters (in some games you may want to treat NPCs as just an un-puppeted <a class="reference internal" href="Characters.html"><span class="doc std std-doc">Character</span></a> instead).</p>
|
||
<p>You should not use Objects for game <em>systems</em>. Don’t use an ‘invisible’ Object for tracking weather, combat, economy or guild memberships - that’s what <a class="reference internal" href="Scripts.html"><span class="doc std std-doc">Scripts</span></a> are for.</p>
|
||
</section>
|
||
<section id="objectparent-adding-common-functionality">
|
||
<h2>ObjectParent - Adding common functionality<a class="headerlink" href="#objectparent-adding-common-functionality" title="Permalink to this headline">¶</a></h2>
|
||
<p><code class="docutils literal notranslate"><span class="pre">Object</span></code>, as well as <code class="docutils literal notranslate"><span class="pre">Character</span></code>, <code class="docutils literal notranslate"><span class="pre">Room</span></code> and <code class="docutils literal notranslate"><span class="pre">Exit</span></code> classes all additionally inherit from <code class="docutils literal notranslate"><span class="pre">mygame.typeclasses.objects.ObjectParent</span></code>.</p>
|
||
<p><code class="docutils literal notranslate"><span class="pre">ObjectParent</span></code> is an empty ‘mixin’ class. You can add stuff to this class that you want <em>all</em> in-game entities to have.</p>
|
||
<p>Here is an example:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># in mygame/typeclasses/objects.py</span>
|
||
<span class="c1"># ... </span>
|
||
|
||
<span class="kn">from</span> <span class="nn">evennia.objects.objects</span> <span class="kn">import</span> <span class="n">DefaultObject</span>
|
||
|
||
<span class="k">class</span> <span class="nc">ObjectParent</span><span class="p">:</span>
|
||
<span class="k">def</span> <span class="nf">at_pre_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="c1"># make all entities by default un-pickable</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Now all of <code class="docutils literal notranslate"><span class="pre">Object</span></code>, <code class="docutils literal notranslate"><span class="pre">Exit</span></code>. <code class="docutils literal notranslate"><span class="pre">Room</span></code> and <code class="docutils literal notranslate"><span class="pre">Character</span></code> default to not being able to be picked up using the <code class="docutils literal notranslate"><span class="pre">get</span></code> command.</p>
|
||
</section>
|
||
<section id="working-with-children-of-defaultobject">
|
||
<h2>Working with children of DefaultObject<a class="headerlink" href="#working-with-children-of-defaultobject" title="Permalink to this headline">¶</a></h2>
|
||
<p>This functionality is shared by all sub-classes of <code class="docutils literal notranslate"><span class="pre">DefaultObject</span></code>. You can easily add your own in-game behavior by either modifying one of the typeclasses in your game dir or by inheriting further from them.</p>
|
||
<p>You can put your new typeclass directly in the relevant module, or you could organize your code in some other way. Here we assume we make a new module <code class="docutils literal notranslate"><span class="pre">mygame/typeclasses/flowers.py</span></code>:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="c1"># mygame/typeclasses/flowers.py</span>
|
||
|
||
<span class="kn">from</span> <span class="nn">typeclasses.objects</span> <span class="kn">import</span> <span class="n">Object</span>
|
||
|
||
<span class="k">class</span> <span class="nc">Rose</span><span class="p">(</span><span class="n">Object</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This creates a simple rose object </span>
|
||
<span class="sd"> """</span>
|
||
<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="s2">"this is called only once, when object is first created"</span>
|
||
<span class="c1"># add a persistent attribute 'desc' </span>
|
||
<span class="c1"># to object (silly example).</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="o">=</span> <span class="s2">"This is a pretty rose with thorns."</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Now you just need to point to the class <em>Rose</em> with the <code class="docutils literal notranslate"><span class="pre">create</span></code> command to make a new rose:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span> create/drop MyRose:flowers.Rose
|
||
</pre></div>
|
||
</div>
|
||
<p>What the <code class="docutils literal notranslate"><span class="pre">create</span></code> command actually <em>does</em> is to use the <a class="reference internal" href="../api/evennia.utils.create.html#evennia.utils.create.create_object" title="evennia.utils.create.create_object"><span class="xref myst py py-func">evennia.create_object</span></a> function. You can do the same thing yourself in code:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">create_object</span>
|
||
<span class="n">new_rose</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="s2">"typeclasses.flowers.Rose"</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">"MyRose"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>(The <code class="docutils literal notranslate"><span class="pre">create</span></code> command will auto-append the most likely path to your typeclass, if you enter the call manually you have to give the full path to the class. The <code class="docutils literal notranslate"><span class="pre">create.create_object</span></code> function is powerful and should be used for all coded object creating (so this is what you use when defining your own building commands).</p>
|
||
<p>This particular Rose class doesn’t really do much, all it does it make sure the attribute <code class="docutils literal notranslate"><span class="pre">desc</span></code>(which is what the <code class="docutils literal notranslate"><span class="pre">look</span></code> command looks for) is pre-set, which is pretty pointless since you will usually want to change this at build time (using the <code class="docutils literal notranslate"><span class="pre">desc</span></code> command or using the <a class="reference internal" href="Prototypes.html"><span class="doc std std-doc">Spawner</span></a>).</p>
|
||
<section id="properties-and-functions-on-objects">
|
||
<h3>Properties and functions on Objects<a class="headerlink" href="#properties-and-functions-on-objects" title="Permalink to this headline">¶</a></h3>
|
||
<p>Beyond the properties assigned to all <a class="reference internal" href="Typeclasses.html"><span class="doc std std-doc">typeclassed</span></a> objects (see that page for a list
|
||
of those), the Object also has the following custom properties:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">aliases</span></code> - a handler that allows you to add and remove aliases from this object. Use <code class="docutils literal notranslate"><span class="pre">aliases.add()</span></code> to add a new alias and <code class="docutils literal notranslate"><span class="pre">aliases.remove()</span></code> to remove one.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">location</span></code> - a reference to the object currently containing this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">home</span></code> is a backup location. The main motivation is to have a safe place to move the object to if its <code class="docutils literal notranslate"><span class="pre">location</span></code> is destroyed. All objects should usually have a home location for safety.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">destination</span></code> - this holds a reference to another object this object links to in some way. Its main use is for <a class="reference internal" href="Exits.html"><span class="doc std std-doc">Exits</span></a>, it’s otherwise usually unset.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">nicks</span></code> - as opposed to aliases, a <a class="reference internal" href="Nicks.html"><span class="doc std std-doc">Nick</span></a> holds a convenient nickname replacement for a real name, word or sequence, only valid for this object. This mainly makes sense if the Object is used as a game character - it can then store briefer shorts, example so as to quickly reference game commands or other characters. Use nicks.add(alias, realname) to add a new one.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">account</span></code> - this holds a reference to a connected <a class="reference internal" href="Accounts.html"><span class="doc std std-doc">Account</span></a> controlling this object (if any). Note that this is set also if the controlling account is <em>not</em> currently online - to test if an account is online, use the <code class="docutils literal notranslate"><span class="pre">has_account</span></code> property instead.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">sessions</span></code> - if <code class="docutils literal notranslate"><span class="pre">account</span></code> field is set <em>and the account is online</em>, this is a list of all active sessions (server connections) to contact them through (it may be more than one if multiple connections are allowed in settings).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">has_account</span></code> - a shorthand for checking if an <em>online</em> account is currently connected to this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">contents</span></code> - this returns a list referencing all objects ‘inside’ this object (i,e. which has this object set as their <code class="docutils literal notranslate"><span class="pre">location</span></code>).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">exits</span></code> - this returns all objects inside this object that are <em>Exits</em>, that is, has the <code class="docutils literal notranslate"><span class="pre">destination</span></code> property set.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">appearance_template</span></code> - this helps formatting the look of the Object when someone looks at it (see next section).l</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">cmdset</span></code> - this is a handler that stores all <a class="reference internal" href="Command-Sets.html"><span class="doc std std-doc">command sets</span></a> defined on the object (if any).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">scripts</span></code> - this is a handler that manages <a class="reference internal" href="Scripts.html"><span class="doc std std-doc">Scripts</span></a> attached to the object (if any).</p></li>
|
||
</ul>
|
||
<p>The Object also has a host of useful utility functions. See the function headers in <code class="docutils literal notranslate"><span class="pre">src/objects/objects.py</span></code> for their arguments and more details.</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">msg()</span></code> - this function is used to send messages from the server to an account connected to this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">msg_contents()</span></code> - calls <code class="docutils literal notranslate"><span class="pre">msg</span></code> on all objects inside this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">search()</span></code> - this is a convenient shorthand to search for a specific object, at a given location or globally. It’s mainly useful when defining commands (in which case the object executing the command is named <code class="docutils literal notranslate"><span class="pre">caller</span></code> and one can do <code class="docutils literal notranslate"><span class="pre">caller.search()</span></code> to find objects in the room to operate on).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">execute_cmd()</span></code> - Lets the object execute the given string as if it was given on the command line.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">move_to</span></code> - perform a full move of this object to a new location. This is the main move method and will call all relevant hooks, do all checks etc.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">clear_exits()</span></code> - will delete all <a class="reference internal" href="Exits.html"><span class="doc std std-doc">Exits</span></a> to <em>and</em> from this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">clear_contents()</span></code> - this will not delete anything, but rather move all contents (except Exits) to their designated <code class="docutils literal notranslate"><span class="pre">Home</span></code> locations.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">delete()</span></code> - deletes this object, first calling <code class="docutils literal notranslate"><span class="pre">clear_exits()</span></code> and <code class="docutils literal notranslate"><span class="pre">clear_contents()</span></code>.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">return_appearance</span></code> is the main hook letting the object visually describe itself.</p></li>
|
||
</ul>
|
||
<p>The Object Typeclass defines many more <em>hook methods</em> beyond <code class="docutils literal notranslate"><span class="pre">at_object_creation</span></code>. Evennia calls these hooks at various points. When implementing your custom objects, you will inherit from the base parent and overload these hooks with your own custom code. See <code class="docutils literal notranslate"><span class="pre">evennia.objects.objects</span></code> for an updated list of all the available hooks or the <a class="reference internal" href="../api/evennia.objects.objects.html#evennia.objects.objects.DefaultObject" title="evennia.objects.objects.DefaultObject"><span class="xref myst py py-class">API for DefaultObject here</span></a>.</p>
|
||
</section>
|
||
</section>
|
||
<section id="changing-an-objects-appearance">
|
||
<h2>Changing an Object’s appearance<a class="headerlink" href="#changing-an-objects-appearance" title="Permalink to this headline">¶</a></h2>
|
||
<p>When you type <code class="docutils literal notranslate"><span class="pre">look</span> <span class="pre"><obj></span></code>, this is the sequence of events that happen:</p>
|
||
<ol>
|
||
<li><p>The command checks if the <code class="docutils literal notranslate"><span class="pre">caller</span></code> of the command (the ‘looker’) passes the <code class="docutils literal notranslate"><span class="pre">view</span></code> <a class="reference internal" href="Locks.html"><span class="doc std std-doc">lock</span></a> of the target <code class="docutils literal notranslate"><span class="pre">obj</span></code>. If not, they will not find anything to look at (this is how you make objects invisible).</p></li>
|
||
<li><p>The <code class="docutils literal notranslate"><span class="pre">look</span></code> command calls <code class="docutils literal notranslate"><span class="pre">caller.at_look(obj)</span></code> - that is, the <code class="docutils literal notranslate"><span class="pre">at_look</span></code> hook on the ‘looker’ (the caller of the command) is called to perform the look on the target object. The command will echo whatever this hook returns.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">caller.at_look</span></code> calls and returns the outcome of <code class="docutils literal notranslate"><span class="pre">obj.return_apperance(looker,</span> <span class="pre">**kwargs)</span></code>. Here <code class="docutils literal notranslate"><span class="pre">looker</span></code> is the <code class="docutils literal notranslate"><span class="pre">caller</span></code> of the command. In other words, we ask the <code class="docutils literal notranslate"><span class="pre">obj</span></code> to descibe itself to <code class="docutils literal notranslate"><span class="pre">looker</span></code>.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">obj.return_appearance</span></code> makes use of its <code class="docutils literal notranslate"><span class="pre">.appearance_template</span></code> property and calls a slew of helper-hooks to populate this template. This is how the template looks by default:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span> ```python
|
||
appearance_template = """
|
||
{header}
|
||
|c{name}|n
|
||
{desc}
|
||
{exits}{characters}{things}
|
||
{footer}
|
||
"""```
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
<li><p>Each field of the template is populated by a matching helper method (and their default returns):</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_name(looker,</span> <span class="pre">**kwargs)</span></code> - returns <code class="docutils literal notranslate"><span class="pre">obj.name</span></code>.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">desc</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_desc(looker,</span> <span class="pre">**kwargs)</span></code> - returns <code class="docutils literal notranslate"><span class="pre">obj.db.desc</span></code>.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">header</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_header(looker,</span> <span class="pre">**kwargs)</span></code> - empty by default.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">footer</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_footer(looker,</span> <span class="pre">**kwargs)</span></code> - empty by default.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">exits</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_exits(looker,</span> <span class="pre">**kwargs)</span></code> - a list of <code class="docutils literal notranslate"><span class="pre">DefaultExit</span></code>-inheriting objects found inside this object (usually only present if <code class="docutils literal notranslate"><span class="pre">obj</span></code> is a <code class="docutils literal notranslate"><span class="pre">Room</span></code>).</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">characters</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_characters(looker,</span> <span class="pre">**kwargs)</span></code> - a list of <code class="docutils literal notranslate"><span class="pre">DefaultCharacter</span></code>-inheriting entities inside this object.</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">things</span></code> -> <code class="docutils literal notranslate"><span class="pre">obj.get_display_things(looker,</span> <span class="pre">**kwargs)</span></code> - a list of all other Objects inside <code class="docutils literal notranslate"><span class="pre">obj</span></code>.</p></li>
|
||
</ul>
|
||
</li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">obj.format_appearance(string,</span> <span class="pre">looker,</span> <span class="pre">**kwargs)</span></code> is the last step the populated template string goes through. This can be used for final adjustments, such as stripping whitespace. The return from this method is what the user will see.</p></li>
|
||
</ol>
|
||
<p>As each of these hooks (and the template itself) can be overridden in your child class, you can customize your look extensively. You can also have objects look different depending on who is looking at them. The extra <code class="docutils literal notranslate"><span class="pre">**kwargs</span></code> are not used by default, but are there to allow you to pass extra data into the system if you need it (like light conditions etc.)</p>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</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="right" >
|
||
<a href="Characters.html" title="Characters"
|
||
>next</a> |</li>
|
||
<li class="right" >
|
||
<a href="Accounts.html" title="Accounts"
|
||
>previous</a> |</li>
|
||
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 3.x</a> »</li>
|
||
<li class="nav-item nav-item-1"><a href="Components-Overview.html" >Core Components</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">Objects</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
<div class="admonition important">
|
||
<p class="first admonition-title">Note</p>
|
||
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
|
||
</div>
|
||
|
||
|
||
<div class="footer" role="contentinfo">
|
||
© Copyright 2023, The Evennia developer community.
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
||
</div>
|
||
</body>
|
||
</html> |