<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Plugin Lifecycle &mdash; Sponge 6.0.0 documentation</title>

    <link rel="shortcut icon" href="../_static/favicon.ico"/>




    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />

    <link rel="stylesheet" href="../_static/spongedocs.css" type="text/css" />

        <link rel="index" title="Index"
              href="../genindex.html"/>        <link rel="search" title="Search" href="../search.html"/>    <link rel="top" title="Sponge 6.0.0 documentation" href="../index.html"/>        <link rel="up" title="Creating a Plugin" href="index.html"/>        <link rel="next" title="Dependency Injection" href="injection.html"/>        <link rel="prev" title="Main Plugin Class" href="plugin-class.html"/>
    <!-- Google Analytics -->
    <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-59476017-2', 'auto');
        ga('send', 'pageview');
    </script>

  <script src="../_static/js/modernizr.min.js"></script>

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search">
    <div id="sp-logo-container" class="page-scroll">
        <a class="logo" href="../index.html">
            <img src="../_static/spongie-mark-dark.svg">
            <span>Sponge</span>
            <i class="fa fa-fw fa-chevron-down"></i>
        </a>
        <div id="sp-logo-menu">
            <ul id="sp-logo-dropdown">
                <li><a href="https://www.spongepowered.org"><i class="fa-fw fa fa-home"></i>Homepage</a></li>
                <li><a href="https://forums.spongepowered.org"><i class="fa-fw fa fa-comments"></i>Forums</a></li>
                <li><a href="https://github.com/SpongePowered"><i class="fa-fw fa fa-code"></i>Code</a></li>
                <li class="active"><a href="https://docs.spongepowered.org"><i class="fa-fw fa fa-book"></i>Docs</a></li>
                <li><a href="https://jd.spongepowered.org"><i class="fa-fw fa fa-graduation-cap"></i>Javadocs</a></li>
                <li><a href="https://forums.spongepowered.org/c/plugins/plugin-releases"><i class="fa-fw fa fa-plug"></i>Plugins</a></li>
                <li><a href="https://www.spongepowered.org/downloads"><i class="fa-fw fa fa-download"></i>Downloads</a></li>
                <li><a href="https://www.spongepowered.org/chat"><i class="fa-fw fa fa-comment"></i>Chat</a></li>
            </ul>
        </div>
    </div>

<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>        </div>

        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
                <ul>
<li class="toctree-l1"><a class="reference internal" href="../server/index.html">Creating a Server</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../preparing/index.html">Preparing for Development</a></li>
</ul>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Creating a Plugin</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="buildsystem.html">Build Systems</a></li>
<li class="toctree-l2"><a class="reference internal" href="workspace/index.html">Setting Up Your Workspace</a></li>
<li class="toctree-l2"><a class="reference internal" href="project/index.html">Setting Up Your Project</a></li>
<li class="toctree-l2"><a class="reference internal" href="plugin-identifier.html">Plugin Identifiers</a></li>
<li class="toctree-l2"><a class="reference internal" href="plugin-class.html">Main Plugin Class</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Plugin Lifecycle</a></li>
<li class="toctree-l2"><a class="reference internal" href="injection.html">Dependency Injection</a></li>
<li class="toctree-l2"><a class="reference internal" href="practices.html">Best Practices</a></li>
<li class="toctree-l2"><a class="reference internal" href="optional/index.html">Optionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="logging.html">Logging and Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="commands/index.html">Commands</a></li>
<li class="toctree-l2"><a class="reference internal" href="event/index.html">Events</a></li>
<li class="toctree-l2"><a class="reference internal" href="assets.html">The Asset API</a></li>
<li class="toctree-l2"><a class="reference internal" href="configuration/index.html">Configuring Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="text/index.html">Text</a></li>
<li class="toctree-l2"><a class="reference internal" href="data/index.html">The Data API</a></li>
<li class="toctree-l2"><a class="reference internal" href="blocks/index.html">Blocks</a></li>
<li class="toctree-l2"><a class="reference internal" href="entities/index.html">Entities</a></li>
<li class="toctree-l2"><a class="reference internal" href="items/index.html">Items</a></li>
<li class="toctree-l2"><a class="reference internal" href="trade-offers.html">Trade-Offers</a></li>
<li class="toctree-l2"><a class="reference internal" href="effects.html">Effects</a></li>
<li class="toctree-l2"><a class="reference internal" href="scheduler.html">Scheduler</a></li>
<li class="toctree-l2"><a class="reference internal" href="services.html">Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="database.html">Databases</a></li>
<li class="toctree-l2"><a class="reference internal" href="permissions.html">Permissions</a></li>
<li class="toctree-l2"><a class="reference internal" href="bans.html">Bans</a></li>
<li class="toctree-l2"><a class="reference internal" href="bookview.html">Book Views</a></li>
<li class="toctree-l2"><a class="reference internal" href="economy/index.html">Economy</a></li>
<li class="toctree-l2"><a class="reference internal" href="wgen/index.html">World Generation</a></li>
<li class="toctree-l2"><a class="reference internal" href="manager.html">Plugin Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="game-profile-manager.html">Game Profile Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="offline-userplayer-data.html">Offline Player Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="debugging.html">Plugin Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="tab-lists.html">Tab Lists</a></li>
<li class="toctree-l2"><a class="reference internal" href="plugin-meta.html">Plugin Metadata</a></li>
<li class="toctree-l2"><a class="reference internal" href="ray-tracing.html">Ray Tracing</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials.html">Tutorials</a></li>
<li class="toctree-l2"><a class="reference internal" href="internals/index.html">Implementation-dependent Plugins</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../ore/index.html">Ore Documentation</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing to Sponge</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">About the Sponge Project</a></li>
</ul>

        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Sponge</a>
      </nav>


      <div class="wy-nav-content">
        <div class="rst-content">

 

<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Docs</a> &raquo;</li>
          <li><a href="index.html">Creating a Plugin</a> &raquo;</li>
    <li>Plugin Lifecycle</li>
      <li class="wy-breadcrumbs-aside">
            <a href="https://github.com/SpongePowered/SpongeDocs/blob/Update-to-API6/source/plugin/lifecycle.rst" class="fa fa-github"> Edit on GitHub</a>
      </li>
  </ul>
  <hr/>
</div>          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
  <div class="section" id="plugin-lifecycle">
<h1>Plugin Lifecycle<a class="headerlink" href="#plugin-lifecycle" title="Permalink to this headline">¶</a></h1>
<p>Prior to any states that make the plugin visible, the plugin loader first sorts through the available plugins, determines
if all dependencies are present, and sorts plugins by dependency order. Lifecycle events are given to plugins in this
order. For example, plugin A containing &#8220;[required-]after:B&#8221; will get each event after plugin B has completed work for
the given state. Additionally, lifecycle states are global. This means that all plugins visible to each other must be
transitioned through all states at once.</p>
<div class="admonition warning">
<p class="first admonition-title">Warning</p>
<p class="last">The Sponge <code class="docutils literal"><span class="pre">Server</span></code> object is not always available. Availability can be checked using the method
<code class="docutils literal"><span class="pre">Sponge.isServerAvailable()</span></code> or <code class="docutils literal"><span class="pre">Game.isServerAvailable()</span></code>.</p>
</div>
<div class="section" id="state-events">
<h2>State Events<a class="headerlink" href="#state-events" title="Permalink to this headline">¶</a></h2>
<p>There are three categories of state events:</p>
<ol class="arabic simple">
<li><strong>Initialization:</strong> When Sponge and plugins are loading, before the actual game has started. Initialization states
only occur once.</li>
<li><strong>Running:</strong> When the game and world are loading. Running states may occur multiple times.</li>
<li><strong>Stopping:</strong> When the game is shutting down. Stopping states, like initialization states, only occur once.</li>
</ol>
</div>
<div class="section" id="initialization-states">
<h2>Initialization States<a class="headerlink" href="#initialization-states" title="Permalink to this headline">¶</a></h2>
<p>Initialization states only occur once during a single run.</p>
<p><strong>CONSTRUCTION</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameConstructionEvent.html">GameConstructionEvent</a> is triggered.
During this state, the <code class="docutils literal"><span class="pre">&#64;Plugin</span></code> class instance for each plugin is triggered.</p>
<p><strong>PRE_INITIALIZATION</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GamePreInitializationEvent.html">GamePreInitializationEvent</a> is triggered.
During this state, the plugin gets ready for initialization. Access to a default logger instance and access to
information regarding preferred configuration file locations is available.</p>
<p><strong>INITIALIZATION</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameInitializationEvent.html">GameInitializationEvent</a> is triggered.
During this state, the plugin should finish any work needed in order to be functional. Global event handlers should get
registered in this stage.</p>
<p><strong>POST_INITIALIZATION</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GamePostInitializationEvent.html">GamePostInitializationEvent</a> is triggered.
By this state, inter-plugin communication should be ready to occur. Plugins providing an API should be ready to accept
basic requests.</p>
<p><strong>LOAD_COMPLETE</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameLoadCompleteEvent.html">GameLoadCompleteEvent</a> is triggered.
By this state, all plugin initialization should be completed.</p>
</div>
<div class="section" id="running-states">
<h2>Running States<a class="headerlink" href="#running-states" title="Permalink to this headline">¶</a></h2>
<p>Running States can occur multiple times during a single run. <code class="docutils literal"><span class="pre">SERVER_ABOUT_TO_START</span></code> may follow <code class="docutils literal"><span class="pre">SERVER_STOPPED</span></code>,
and <code class="docutils literal"><span class="pre">SERVER_STOPPED</span></code> may occur at any point during the process if there is an error.</p>
<p><strong>SERVER_ABOUT_TO_START</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameAboutToStartServerEvent.html">GameAboutToStartServerEvent</a> event is triggered.
The server instance exists, but worlds are not yet loaded.</p>
<p><strong>SERVER_STARTING</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStartingServerEvent.html">GameStartingServerEvent</a> is triggered.
The server instance exists, and worlds are loaded. Command registration is handled during this state.</p>
<p><strong>SERVER_STARTED</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStartedServerEvent.html">GameStartedServerEvent</a> event is triggered.
The server instance exists, and worlds are loaded.</p>
<p><strong>SERVER_STOPPING</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStoppingServerEvent.html">GameStoppingServerEvent</a> is triggered.
This state occurs immediately before the final tick, before the worlds are saved.</p>
<p><strong>SERVER_STOPPED</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStoppedServerEvent.html">GameStoppedServerEvent</a> is triggered.
During this state, no players are connected and no changes to worlds are saved.</p>
</div>
<div class="section" id="stopping-states">
<h2>Stopping States<a class="headerlink" href="#stopping-states" title="Permalink to this headline">¶</a></h2>
<p>Stopping states never occur more than once during a single run. They occur when the game stops normally. (On Servers:
the <code class="docutils literal"><span class="pre">/stop</span></code> command is typed. On Clients: The &#8220;Close&#8221; button or the &#8220;Quit Game&#8221; button are clicked)</p>
<div class="admonition warning">
<p class="first admonition-title">Warning</p>
<p class="last">Stopping states are not guaranteed to be run during shutdown. They may <strong>not</strong> fire if the game is force-stopped via
Ctrl-C, Task Manager, a computer crash, or similar situations.</p>
</div>
<p><strong>GAME_STOPPING</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStoppingServerEvent.html">GameStoppingServerEvent</a> is triggered.
This state occurs immediately before <code class="docutils literal"><span class="pre">GAME_STOPPED</span></code>. Plugins providing an API should still be capable of accepting
basic requests.</p>
<p><strong>GAME_STOPPED</strong></p>
<p>The <a class="reference external" href="https://jd.spongepowered.org/6.0.0/org/spongepowered/api/event/game/state/GameStoppedServerEvent.html">GameStoppedServerEvent</a> is triggered.
Once this event has finished executing, Minecraft will shut down. No further interaction with the game or other plugins
should be attempted at this point.</p>
</div>
</div>

           </div>
          </div>
<footer>
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
        <a href="injection.html" class="btn btn-neutral float-right" title="Dependency Injection" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
        <a href="plugin-class.html" class="btn btn-neutral" title="Main Plugin Class" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&copy; Copyright 2014-2017, Sponge Contributors.
    </p>
  </div>Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 
</footer>
        </div>
      </div>

    </section>

  </div>


<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
    <span class="rst-current-version" data-toggle="rst-current-version">
        <i class="fa fa-book"> <span>SpongeDocs</span></i>
        v: 6.0.0
        <span class="fa fa-caret-down"></span>
    </span>
    <div id="versions" class="rst-other-versions">




            <dl>
                <dt>Contribute</dt>
                    <dd><a href="https://github.com/SpongePowered/SpongeDocs/blob/Update-to-API6/source/plugin/lifecycle.rst">Source</a></dd>
                    <dd><a href="https://github.com/SpongePowered/SpongeDocs/edit/Update-to-API6/source/plugin/lifecycle.rst">Edit</a></dd>
            </dl>
    </div>
</div>

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'6.0.0',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>      <script type="text/javascript" src="../_static/jquery.js"></script>      <script type="text/javascript" src="../_static/underscore.js"></script>      <script type="text/javascript" src="../_static/doctools.js"></script>      <script type="text/javascript" src="../_static/spongedocs.js"></script>

    <script type="text/javascript" src="../_static/js/theme.js"></script>

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
 
</body>
</html>