blob: 9fef94f88a98e0f06bbb2249a6ce8623f3408a89 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// envchk.c -- verhindern, dass objekte ohne env herumfliegen
4//
5// $Id: thing.c 6283 2007-05-09 21:30:33Z Zesstra $
6
7#pragma strict_types
8#pragma save_types
9#pragma range_check
10#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020011
12#include <moving.h>
13#define NEED_PROTOTYPES
14#include <thing/moving.h>
Zesstraf17d3a02018-11-12 22:29:00 +010015#include <thing/properties.h>
MG Mud User88f12472016-06-24 23:31:02 +020016
17protected void check_for_environment(string cloner)
18{
19 // Clones, die innerhalb von 10 Sekunden kein Environment haben,
20 // sollen auf -debug scrollen.
21 if ( clonep() && !environment() ) {
22 // mal in den Muellraum bewegen, damit diese Objekte zwar nicht zerstoert
23 // werden, aber zumindest hinterher noch einfach auffindbar sind. (Und
24 // entweder per hand oder automatisch aufgeraeumt werden koennen.)
25 move("/room/muellraum",M_NOCHECK|M_SILENT);
26 if ( !stringp(cloner) || !sizeof(cloner) )
27 cloner = "<Unbekannt>";
28 raise_error("Objekt hat kein Environment. Cloner: ["+cloner+"] ");
29 }
30}
31
Zesstraf17d3a02018-11-12 22:29:00 +010032protected void create()
MG Mud User88f12472016-06-24 23:31:02 +020033{
Zesstraf17d3a02018-11-12 22:29:00 +010034 if( clonep() )
MG Mud User88f12472016-06-24 23:31:02 +020035 call_out(#'check_for_environment, 3, object_name(previous_object()));
36}
Zesstraf17d3a02018-11-12 22:29:00 +010037
38// Kein Envcheck fuer Auto-Objekte, dafuer entfernen diese sich im naechsten
39// Reset, sofern sie noch kein Environment haben.
40// BTW: Abschalten des Resets sorgt fuer kein Aufraeumen.
41public int SetAutoObject(int autostate)
42{
43 if (autostate)
44 {
45 Set("p_lib_autoobject", 1, F_VALUE);
46 Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AS);
47 remove_call_out(#'check_for_environment);
48 if (autostate > 1)
49 set_next_reset(autostate);
50 // else: Standardresetzeit
51 }
52 else
53 {
54 // (Re-)Enable envchk
55 Set("p_lib_autoobject", 0, F_VALUE);
56 Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AD);
57 if (clonep() && find_call_out(#'check_for_environment) == -1)
58 call_out(#'check_for_environment, 3, object_name(previous_object()));
59 }
60 return autostate;
61}
62
63void reset()
64{
65 // wenn kein env und Autoobject: zerstoeren
66 if (clonep() && !environment()
67 && Query("p_lib_autoobject", F_VALUE))
68 {
69 remove(1);
70 // hier wirklich erzwingen, um unter allen Umstaenden zu vermeiden, dass
71 // sich dauerhaft Clones ansammeln, die niemand mehr referenziert.
72 if (objectp(this_object()))
73 destruct(this_object());
74 }
75}