blob: af8704ab9a084e844185aad927f8ff0e5d607898 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// thing/restrictions.c -- Gewicht u.ae. eines Objekts
4//
5// $Id: restrictions.c 6809 2008-03-29 21:54:04Z 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 <defines.h>
13#include <properties.h>
14
15#define NEED_PROTOTYPES
16#include <thing/properties.h>
17
18// Gewicht ist 1kg, wenn nicht anders bestimmt
19protected void create()
20{
21 SetProp(P_WEIGHT, 1000);
22}
23
24protected void create_super() {
25 set_next_reset(-1);
Zesstra86db9c12021-01-26 22:11:19 +010026}
MG Mud User88f12472016-06-24 23:31:02 +020027
Zesstra86db9c12021-01-26 22:11:19 +010028static int _set_weight(int weight)
29{
30 // Content-Cache invalidieren.
31 object env = this_object();
32 while ( objectp(env = environment(env)) )
33 // Ja. Man ruft die _set_xxx()-Funktionen eigentlich nicht direkt auf.
34 // Aber das Gewichtssystem ist schon *so* rechenintensiv und gerade der
35 // P_LAST_CONTENT_CHANGE-Cache wird *so* oft benoetigt, dass es mir
36 // da um jedes bisschen Rechenzeit geht.
37 // Der Zweck heiligt ja bekanntlich die Mittel. ;-)
38 //
39 // Tiamak
40 env->_set_last_content_change();
41
42 // P_TOTAL_WEIGHT bei Nicht-Containern auf P_WEIGHT umleiten
43 SetProp(P_TOTAL_WEIGHT, weight);
44 return Set(P_WEIGHT, weight, F_VALUE);
MG Mud User88f12472016-06-24 23:31:02 +020045}
46
47// P_X_ATTR_MOD aendern (Attributaenderungen durch Ausruestung)
48static mapping _set_extern_attributes_modifier(mapping xmod)
49{
50 mapping res;
51
52 // wenn Muell oder ein leeres Mapping uebergeben wurde, wird die prop
53 // geloescht und ggf. das Objekt im Living abgemeldet.
54 if (!mappingp(xmod)) xmod=([]);
55
56 if (!sizeof(xmod)) {
57
58 res=Set(P_X_ATTR_MOD, xmod);
59
60 // wenn Prop geloescht wird, kann man das Item auch aus der Liste der
61 // Statmodifizierer des Lebewesens austragen.
62 if (living(environment())) {
63 environment()->deregister_modifier(ME);
64 environment()->UpdateAttributes();
65 }
66 }
67 else {
68 // ok, Prop wird auf nen interessanten Wert gesetzt. ;-)
69
70 // Damit Insert/RemoveSensitiveObject beim Move aufgerufen wird,
71 // muss P_SENSITIVE gesetzt sein
72 if (!QueryProp(P_SENSITIVE)) SetProp(P_SENSITIVE,({}));
73
74 if (living(environment()) &&
75 (!mappingp(res=QueryProp(P_X_ATTR_MOD)) || !sizeof(res))) {
76 // Wenn dieses Objekt in einem Living ist und bisher die prop nicht
77 // gesetzt war, muss sich das Objekt noch im Living als Statmodifizierer
78 // registrieren.
79 res=Set(P_X_ATTR_MOD, xmod);
80 environment()->register_modifier(ME);
81 environment()->UpdateAttributes(ME);
82 }
83 else if (living(environment())){
84 // sonst reicht ein einfaches UpdateAttributes() um das Lebewesen zu
85 // informieren.
86 res=Set(P_X_ATTR_MOD, xmod);
87 environment()->UpdateAttributes();
88 }
89 else {
90 // wenn kein lebendes Env, reicht einfaches Setzen.
91 res=Set(P_X_ATTR_MOD,xmod);
92 }
93 }
94
95 return res;
96}
97
98// P_X_HEALTH_MOD aendern (LP/KP-Aenderung durch Ausruestung)
99static mapping _set_extern_health_modifier(mapping xmod) {
100 mapping res;
101
102 // wenn Muell oder ein leeres Mapping uebergeben wurde, wird die prop
103 // geloescht und ggf. das Objekt im Living abgemeldet.
104 if (!mappingp(xmod)) xmod=([]);
105
106 if (!sizeof(xmod)) {
107
108 res=Set(P_X_HEALTH_MOD, xmod);
109
110 // wenn Prop geloescht wird, kann man das Item auch aus der Liste der
111 // Statmodifizierer des Lebewesens austragen.
112 if (living(environment())) {
113 environment()->deregister_modifier(ME);
114 environment()->UpdateAttributes();
115 }
116 }
117 else {
118 // ok, Prop wird auf nen interessanten Wert gesetzt. ;-)
119
120 // Damit Insert/RemoveSensitiveObject beim Move aufgerufen wird,
121 // muss P_SENSITIVE gesetzt sein
122 if (!QueryProp(P_SENSITIVE)) SetProp(P_SENSITIVE,({}));
123
124 if (living(environment()) &&
125 (!mappingp(res=QueryProp(P_X_HEALTH_MOD)) || !sizeof(res))) {
126 // Wenn dieses Objekt in einem Living ist und bisher die prop nicht
127 // gesetzt war, muss sich das Objekt noch im Living als Statmodifizierer
128 // registrieren.
129 res=Set(P_X_HEALTH_MOD, xmod);
130 environment()->register_modifier(ME);
131 environment()->UpdateAttributes(ME);
132 }
133 else if (living(environment())){
134 // sonst reicht ein einfaches UpdateAttributes() um das Lebewesen zu
135 // informieren.
136 res=Set(P_X_HEALTH_MOD, xmod);
137 environment()->UpdateAttributes();
138 }
139 else {
140 // wenn kein lebendes Env, reicht einfaches Setzen.
141 res=Set(P_X_HEALTH_MOD,xmod);
142 }
143 }
144
145 return res;
146
147}
148
149// P_X/M_ATTR_MOD werden nicht beruecksichtigt, da CUMULATIVE_ATTR_LIMIT
150// ueberschritten ist
151void NotifyXMAttrModLimitViolation()
152{
153}
154