blob: bf1c34eef998de3d10113bcc068afa6c7bd95d64 [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
Zesstra5245c5f2016-12-17 11:19:48 +010064 int ret;
MG Mud User88f12472016-06-24 23:31:02 +020065 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;
Zesstra5245c5f2016-12-17 11:19:48 +010073 ++ret;
MG Mud User88f12472016-06-24 23:31:02 +020074 // nur eins Austragen, nicht alle, falls mehr als einmal angemeldet
75 break;
76 }
77 }
78 objects[env] = oblist - ({0});
79 }
80 if(!sizeof(objects[env]))
81 m_delete(objects, env);
82
83 do_save=1;
Zesstra5245c5f2016-12-17 11:19:48 +010084 return ret;
MG Mud User88f12472016-06-24 23:31:02 +020085}
86
87// Fragt nicht wirklich ab, sondern erstellt die angemeldeten Objekt in env.
88// Wenn kein env, wird previous_object() genommen.
89varargs void QueryObject(string envname)
90{
91 object env;
92 // take the caller as the questioning object
93 if(!envname || !stringp(envname))
94 env = previous_object();
95 else
96 env = find_object(envname);
97
98 // target must be a blueprint
99 if(IS_CLONE(env)) return 0;
100
101 envname=object_name(env);
102 if(member(objects, envname))
103 {
104 mixed oblist = objects[envname];
105 foreach(mixed arr : &oblist)
106 {
107 // Wir muessen unterscheiden, ob ein Clone angemeldete wurde oder eine
108 // Blueprint.
109 object o;
110 string *n = explode(arr[CLASS], "#");
111 if (sizeof(n) > 1 && sizeof(n[1]) > 0)
112 o = env->AddItem(n[0], REFRESH_DESTRUCT);
113 else
114 o = env->AddItem(n[0], REFRESH_DESTRUCT, 1);
115 o->SetProp(P_AUTOLOAD, arr[DATA]);
116 // Und das neue Objekt merken (ne Verwendung hat das zur Zeit aber
117 // nicht)
118 arr[CLASS] = object_name(o);
119 }
120 }
121}
122
123// Liefert eine Liste der in env angemeldeten Objekte. Wenn kein env, wird
124// previous_object() genommen.
125public varargs string QueryObjects(string envname)
126{
127 object env;
128 // take the caller as the questioning object
129 if(!envname || !stringp(envname))
130 env = previous_object();
131 else
132 env = find_object(envname);
133
134 // target must be a blueprint
135 if(IS_CLONE(env)) return 0;
136
137 mixed arrarr = objects[object_name(env)];
138 if (arrarr)
139 {
140 return CountUp(map(arrarr, #'[, CLASS),", ",", ");
141 }
142 return 0;
143}
144
145public varargs int remove(int silent)
146{
147 save_object(OBJECTD_SAVE);
148 destruct(ME);
149 return 1;
150}
151
Zesstra5245c5f2016-12-17 11:19:48 +0100152/*
153void clean(string *list)
154{
155 if (!list)
156 list = m_indices(objects);
157 while (sizeof(list) && get_eval_cost() > 50000)
158 {
159 tell_object(this_player(),"Cleaning: "+list[0]+"\n");
160 mixed arrarr = objects[list[0]];
161 foreach(mixed arr: &arrarr)
162 {
163 if (load_name(arr[CLASS]) == "/p/service/miril/advent/obj/tuerchen")
164 {
165 arr = 0;
166 }
167 }
168 objects[list[0]] = arrarr - ({0});
169 list = list[1..];
170 }
171 if (sizeof(list))
172 call_out(#'clean, 4);
173 else
174 {
175 save_object(OBJECTD_SAVE);
176 tell_object(this_player(), "Fertig!");
177 }
178}
179*/