// MorgenGrauen MUDlib
//
// secure/master/destruct.inc -- module of the master object: stuff for destruct.
//
// $Id: master.c 7041 2008-10-13 18:18:27Z Zesstra $

#include "/sys/object_info.h"

// privilegierte Objekte, die das destruct() abbrechen duerfen (root objekte
// duerfen auch ohne, dass sie in dieser Liste erfasst sind):
private nosave string *deny_destruct_list = ({
    "/obj/shut", "/room/void", "/room/netztot", "/room/jail" });

// Helferfunktion fuer prepare_destruct()
private void recursive_remove(object ob, int immediate_destruct) {

  if (efun::object_info(ob, OI_ONCE_INTERACTIVE)) {
    // Spieler werden ins Void bewegt.
    int res;
    tell_object(ob, "Ploetzlich loest sich deine Welt in ihre " +
                  "Bestandteile auf. Zum Glueck wirst\nDu irgendwo " +
                  "hin geschleudert ...\n");
    // wenn Bewegung buggt oder nicht funktioniert und ob noch existiert,
    // rekursiv zerstoeren.
    object oldenv=environment(ob);
    if ( (catch(res=({int})ob->move("/room/void",M_TPORT|M_NOCHECK,0,"faellt");
           publish) || (ob && environment(ob) == oldenv) )
          && ob) {
            // Spieler speichern, dann erst Inventar entleeren, dann remove() und
        // und destruct() anwenden.
        catch(ob->save_me(1); publish);
        filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
        if (!immediate_destruct) 
          catch(ob->remove(0);publish);
        if (ob) 
          destruct(ob);
    }
  }
  else {
    // kein Spieler. Rekursiv entfernen. Hierbei _zuerst_ rekursiv das
    // Inventar entfernen und dann ob selber, damit nicht erst das Inventar in
    // das Environment bewegt wird (soll ja eh zerstoert werden).
    filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
    // ggf. zuerst remove versuchen
    if (!immediate_destruct)
      catch(ob->remove(1);publish);
    if (ob)
      destruct(ob);
  }
}

// Zerstoerung von ob vorbereiten
protected mixed prepare_destruct(object ob)
{
  object old_env,env,item;
  int|string res;

  // zuerst das notify_destruct() rufen und ggf. abbrechen, falls ob
  // privilegiert ist.
  catch(res = ({int|string})ob->NotifyDestruct(previous_object()); publish);
  if (res &&
      (getuid(ob) == ROOTID ||
       (IS_ARCH(ob)) ||
       member(deny_destruct_list, object_name(ob)) >= 0)) {
    if (stringp(res) && sizeof(res))
      return res;
    else
      return sprintf("%O verweigert die Zerstoerung mittels destruct(). "
          "Fehlende Rechte von %O?\n",ob, previous_object());
  }
  
  env = environment(ob);

  // Objekt hat kein Env: Alles zerstoeren, Spieler ins Void
  if (!env) {
    filter(all_inventory(ob), #'recursive_remove, 1);
  }
  else {
    // Ansonsten alles ins Environment 
    foreach(item : all_inventory(ob))
    {
      old_env=environment(item);
      // M_MOVE_ALL, falls item nen Unitobjekt ist. Sonst clonen die u.U. noch
      // wieder nen neues Objekt im alten Env.
      if(catch(item->move(env, M_NOCHECK|M_MOVE_ALL);publish))
        recursive_remove(item, 1);
      else if (item && environment(item) == old_env)
        recursive_remove(item, 1);
    }
  }

  return 0; // Erfolg
}

// Anmerkung: liefert 0 zurueck, wenn die sefuns gerade geladen werden.
string NotifyDestruct(object caller) {
  // Nicht jeder Magier muss den Master entsorgen koennen.
  if ((caller != this_object() && 
        call_sefun("secure_level") < ARCH_LVL)
      || call_sefun("process_call") ) {
    return "Du darfst den Mudlib-Master nicht zerstoeren!\n";
  }
  return 0;
}

