SYNOPSIS
        #include <configuration.h>

        void configure_object(object ob, int what, mixed data)

DESCRIPTION
        Sets the option <what> to the value <data> on the object <ob>
        or the default for all objects if <ob> is 0.

        If the first argument <ob> is not this_object(), the privilege
        violation ("configure_object", this_object(), ob, what, data)
        occurs.

        As <what>, the following arguments are accepted:

        <what> == OC_COMMANDS_ENABLED
          Sets whether <ob> can use commands normally accessible to
          users (1) or not (0). This also marks the object as "living".

        <what> == OC_HEART_BEAT
          Enables (1) or disables (0) the heart beat for <ob>. The
          driver will apply the lfun heart_beat() to the <ob> every
          __HEARTBEAT_INTERVAL__ seconds, if it is enabled.
          A shadow over the heart_beat() lfun will be ignored.

          If the heart beat is not needed for the moment, then do disable
          it. This will reduce system overhead.

          Note that heart_beat()s are called only if there are enabled
          via configuer_driver(DC_ENABLE_HEART_BEATS), which is the
          default.

        <what> == OC_EUID
          Set effective uid to <data>. <data> must be a string or 0.
          This call will always trigger a privilege violation check,
          even if <ob> is this_object().

          If strict euid usage is enforced, objects with euid 0 cannot
          load or clone other objects or do any file operations.


        The current values for these options can be queried using
        object_info().

HISTORY
        Introduced in LDMud 3.5.0.

SEE ALSO
        object_info(E), configure_interactive(E), configure_lwobject(E),
        configure_driver(E)
