blob: 1b5d821b29dcf1f821bca9a9ce8bd2322cc4349f [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// OBJECTD.C -- object daemon
4//
5// $Date: 1995/04/03 14:47:02 $
6// $Revision: 9510 $
7/* $Log: objectd.c,v $
8 * Revision 1.2 1995/04/03 14:47:02 Wargon
9 * QueryObject() verwendet bei BluePrints jetzt auch AddItem.
10 *
11 * Revision 1.1 1995/03/31 13:30:33 Hate
12 * Initial revision
13 *
14 */
15
16#pragma strong_types,save_types,rtt_checks
17#pragma no_clone, no_shadow
18
19#include <rooms.h>
20#include <properties.h>
21#include <defines.h>
22#include <daemon.h>
23
24mapping objects = ([]);
25private nosave int do_save;
26
27#define CLASS 0
28#define DATA 1
29
30protected void create()
31{
32 seteuid(getuid(ME));
33 restore_object(OBJECTD_SAVE);
34}
35
36protected void reset() {
37 if (do_save)
38 {
39 save_object(OBJECTD_SAVE);
40 do_save=0;
41 }
42}
43
44string AddObject(object obj, string env)
45{
46 if(!obj || !env || !objectp(obj) || !stringp(env))
47 return 0;
48
49 // save information
50 if(!member(objects, env))
51 objects[env] = ({ ({ object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
52 else
53 objects[env] += ({ ({ object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
54
55 do_save=1;
56 return env;
57}
58
59int RemoveObject(object|string obj, string env)
60{
61 if(!obj || !env || !stringp(env))
62 return 0;
63
64 // save information
65 if(member(objects, env))
66 {
67 mixed oblist = objects[env];
68 foreach(mixed arr: &oblist)
69 {
70 if (load_name(arr[CLASS]) == load_name(obj))
71 {
72 arr = 0;
73 // nur eins Austragen, nicht alle, falls mehr als einmal angemeldet
74 break;
75 }
76 }
77 objects[env] = oblist - ({0});
78 }
79 if(!sizeof(objects[env]))
80 m_delete(objects, env);
81
82 do_save=1;
83 return 1;
84}
85
86// Fragt nicht wirklich ab, sondern erstellt die angemeldeten Objekt in env.
87// Wenn kein env, wird previous_object() genommen.
88varargs void QueryObject(string envname)
89{
90 object env;
91 // take the caller as the questioning object
92 if(!envname || !stringp(envname))
93 env = previous_object();
94 else
95 env = find_object(envname);
96
97 // target must be a blueprint
98 if(IS_CLONE(env)) return 0;
99
100 envname=object_name(env);
101 if(member(objects, envname))
102 {
103 mixed oblist = objects[envname];
104 foreach(mixed arr : &oblist)
105 {
106 // Wir muessen unterscheiden, ob ein Clone angemeldete wurde oder eine
107 // Blueprint.
108 object o;
109 string *n = explode(arr[CLASS], "#");
110 if (sizeof(n) > 1 && sizeof(n[1]) > 0)
111 o = env->AddItem(n[0], REFRESH_DESTRUCT);
112 else
113 o = env->AddItem(n[0], REFRESH_DESTRUCT, 1);
114 o->SetProp(P_AUTOLOAD, arr[DATA]);
115 // Und das neue Objekt merken (ne Verwendung hat das zur Zeit aber
116 // nicht)
117 arr[CLASS] = object_name(o);
118 }
119 }
120}
121
122// Liefert eine Liste der in env angemeldeten Objekte. Wenn kein env, wird
123// previous_object() genommen.
124public varargs string QueryObjects(string envname)
125{
126 object env;
127 // take the caller as the questioning object
128 if(!envname || !stringp(envname))
129 env = previous_object();
130 else
131 env = find_object(envname);
132
133 // target must be a blueprint
134 if(IS_CLONE(env)) return 0;
135
136 mixed arrarr = objects[object_name(env)];
137 if (arrarr)
138 {
139 return CountUp(map(arrarr, #'[, CLASS),", ",", ");
140 }
141 return 0;
142}
143
144public varargs int remove(int silent)
145{
146 save_object(OBJECTD_SAVE);
147 destruct(ME);
148 return 1;
149}
150