mux2.4/game/data/
mux2.4/src/tools/
TinyMUX 2.4:  LOCAL
Last Update:  June 2005

Notes on MUX's local.cpp extensions
-----------------------------------

The local.cpp file contains several functions to enable the extension of the
server source code (aka hardcode).  These functions provide an interface to
reduce the need to implement changes within the server code itself.

Developers should be familiar with the MUX source prior to utilizing the
local api.   Utilizing the local extensions is just like modifying the
server source code and can cause instability if done improperly.
=============================================================================

API Description

Function: local_startup()

 local_startup is called after all normal initialization is complete just
 before the game begins to process input and output for connected players.
 This function can be used to load databases, perform initialization or other
 tasks that need to occur prior to the game being active.  The function
 accepts no arguments and returns no value.

Function: local_dump_database(int dump_type)

 local_dump_database() is called prior to the game performing a database
 dump.  It is invoked via the periodic dump timer, @restart, @shutdown,
 and @dump.

 dump_type is one of the five dump type definitions declared in externs.h.
 It can be used to perform different procedures depending on what type
 of dump the game is performing.

 Currently, the following types are available:

   DUMP_I_NORMAL   -- perform a normal dump
   DUMP_I_PANIC    -- write a panic database (game output to crashdb)
   DUMP_I_RESTART  -- game writes database to the inputdb
   DUMP_I_FLAT     -- game is unloading the db to a flatfile
   DUMP_I_SIGNAL   -- game is unloading the db to a flatfile via a signal

Function: local_shutdown()

 local_shutdown is called after the game database has been saved but the
 logfiles remain open.  It can be utilized to perform any cleanup prior
 to the process being terminated.   Database saves need not occur within
 local_shutdown since local_dump_database is called prior to it.

Function: local_dbck()

 local_dbck is invoked during all database consistency checks (periodic
 or manual @dbck).

Function:  local_connect(dbref player, int isnew, int num)

 local_connect is called when a player connects to the game.  The
 argument isnew is set to 1 if the player object was just created,
 or 0 if it was pre-existing.   The number of current connections
 is passed via the num argument where any value >1 indicates multiple
 connections.

Function:  local_disconnect(dbref player, int num)

 local_disconnect is called when a player disconnects from the game.
 Arguments contain the dbref and the number of connections at the time
 of the disconnect.  A value of >1 for num indicates the player still
 has an active connection.

Function:  local_data_create(dbref object)

 local_data_create is called when any object is created.  Note: this
 function catches player creation via @pcreate as well as creations
 at the connection screen so is a better location for player based
 initialization if required.

Function:  local_data_clone(dbref clone, dbref source)

 Cloning is a unique creation process so it has a stand-alone handler.
 Called after the source object has been cloned and set with all
 relevant information.

Function:  local_data_free(dbref object)

 local_data_free is called after the target object has been cleared of
 all information but just prior to it being truly destroyed.  This occurs
 at the point of true destruction prior to being available to the freelist
 not when it is just set GOING.
=============================================================================

Periodic Processing

The MUX local implementation does not provide a function implementing the
functionality of PennMUSH's local_timer() 1 second cycle callback.  Instead,
developers should make use of the MUX scheduler to instantiate periodic or
one-shot timers.   The scheduler accepts a function pointer to execute at
the designated timeframe.   Regularly occuring timers must re-schedule
themselves during the callback execution.

The function format required by the sceduler is:

    void funname(void *, int)

The function accepts a void pointer to user data and an integer value.
Most timer functions do not make use of these parameters.

To instantiate a timer, first declare the function to be called.  This
example shows a timer that happens only once.

void myTimer(void* pUnused, int iUnused)
{
    // ... insert timer code here
}

Once the function is available, it must be scheduled.  The following
example is shown using local_statup.

const CLinearTimeDelta period_15s   = 15*FACTOR_100NS_PER_SECOND;

void local_startup(void)
{
    CLinearTimeAbsolute ltaNow;   // declare a time object
    ltaNow.GetUTC();              // set the value to UTC

    // Schedule myTimer to occur at 15 seconds in the future.
    // The final two args to DeferTask are the user data values.
    //
    scheduler.DeferTask(ltaNow+period_15s, PRIORITY_SYSTEM,
        myTimer, 0, 0);
}

If the timer should occur on a periodic basis, it must reschedule itself.

void myPeriodicTimer(void *pUnused, int iUnused)
{
    // ... perform processing
    //

    // Reschedule this timer.
    //
    CLinearTimeAbsolute ltaNow;   // declare a time object
    ltaNow.GetUTC();              // set the value to UTC
    scheduler.DeferTask(ltaNow+period_15s, PRIORITY_SYSTEM,
        myTimer, 0, 0);
}

Individuals using scheduled tasks should examine the CScheduler and
CLinearTimeAbsolute classes for more details on their use.