Entferne Wiederherstellen von Properties
Diese Funktionalitaet ist schon lange extrem kaputt.
1. Es wird zwar nach Closures gefiltert, allerdings erst, nachdem das
Objekt zerstört wurde. Closures auf this_object() sind jetzt 0, damit
werden diese beim Wiederherstellen überschrieben.
2. Nach Objekten wird gar nicht gefiltert.
Diese Probleme sind quasi nicht zu fixen. Vor dem Zerstören filtern
bringt auch nichts, da nicht bekannt ist, welche Objekte oder Closures
im remove() noch mit zerstört werden.
Da die aktuelle Funktionsweise bei Fehlerhafter Anwendung Objekte
ernsthaft kaputtmachen kann (z.B. Waffen mit P_HIT_FUNC =
this_object()), ist sie auszubauen die beste Lösung.
Change-Id: I0b66fa0f9230cba44e3849713547de1f19c63cfe
diff --git a/doc/mcmd/upd b/doc/mcmd/upd
index d66236a..4ca4c97 100644
--- a/doc/mcmd/upd
+++ b/doc/mcmd/upd
@@ -3,7 +3,7 @@
---
MAGIERKOMMANDO:
- upd [ -abcdhfilmrv ] <datei> [...]
+ upd [ -abdhfilmrv ] <datei> [...]
ARGUMENTE:
@@ -32,9 +32,6 @@
-C Die Nutzung von Configure() wird erzwungen, d.h. Objekte, die kein
oeffentliches Configure() haben, werden nicht zerstoert/ersetzt.
(im Zusammenspiel mit -l oder -r, inkompatibel mit -c)
- -c Die Properties des Originalobjektes werden kopiert. In diesem Fall
- wird Configure() _nicht_ benutzt (im Zusammenspiel mit -l und -r,
- inkompatibel mit -C)
-d Beim Zerstoeren der Instanzen werden auch evtl. in ihnen vorhandene
Objekte zerstoert. Nuetzlich, um z.B. NPCs samt ihrer Ausruestung zu
entsorgen.
@@ -75,5 +72,5 @@
destruct, load
Configure()
- LETZTE AENDERUNG:
- Tue, Oct 10 18:50:00 2000 von Mandragon
+Letzte Aenderung: 03.07.2025, Bugfix
+
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index ebee975..7482156 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -260,37 +260,6 @@
return ret;
}
-
-//
-// _illegal_closure(): ist closure in arg an objekt gebunden?
-// arg: closure(-array/mapping)
-// Rueckgabe: 0 wenn alles okay
-// 1 wenn closure geloescht werden muss
-//
-
-private int _illegal_closure( mixed arg )
-{
- int i, j;
- string *indices;
-
- if ( closurep(arg) && !objectp(query_closure_object(arg)) )
- return 1;
-
- if ( pointerp(arg) ){
- for ( i = sizeof(arg); i--; )
- if ( _illegal_closure(arg[i]) )
- return 1;
- }
- else if ( mappingp(arg) ){
- indices = m_indices(arg);
- for ( i = sizeof(indices); i--; )
- for ( j = get_type_info( arg, 1 ); j--; )
- if ( _illegal_closure(arg[indices[i], j]) )
- return 1;
- }
- return 0;
-}
-
//
// _make(): Update file
// file: Filename
@@ -361,24 +330,18 @@
mixed configdata;
int restore_config;
- // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() oder
- // Props sichern:
+ // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() sichern
if (obj)
{
- // im Fall UPD_C erfolgt _kein_ Auslesen und _keine_ Restauration
- // mittels Configure()
- if ( ! (flags & UPD_C ) )
+ catch(restore_config=call_resolved(&configdata,obj,
+ "Configure",0);
+ publish);
+ // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
+ // Configure() definieren, sonst erfolgt Abbruch.
+ if ((flags & UPD_CONF) && !restore_config)
{
- catch(restore_config=call_resolved(&configdata,obj,
- "Configure",0);
- publish);
- // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
- // Configure() definieren, sonst erfolgt Abbruch.
- if ((flags & UPD_CONF) && !restore_config)
- {
- printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
- return RET_FAIL;
- }
+ printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
+ return RET_FAIL;
}
if (!(flags&UPD_D)&&(flags&(UPD_L|UPD_R)))
{
@@ -404,10 +367,6 @@
inv=map( deep_inventory(obj), #'_save/*'*/, inv_saver )-({0});
}
env = environment(obj);
- if ( flags & UPD_C )
- {
- pro = ({mapping})(obj->QueryProperties());
- }
}
else inv = ({});
@@ -431,33 +390,12 @@
if ( obj = _reload( blue,inst,flags, &err ) )
msg += ", " + (inst ? "neu geclont" : "neu geladen");
-// Neu geladen: Properties wiederherstellen, Closures filtern
+// Neu geladen: Konfiguration wiederherstellen
if (!err)
{
if (!obj) obj = find_object(file);
- // Wenn gewuenscht, Props zurueckschreiben (hat Prioritaet vor
- // Configure(), weil explizit vom Magier angefordert).
- if ( pro && (flags & UPD_C) )
- {
- string *names;
-
- names = m_indices(pro);
-
- // Closures in (mittlerweile) zerstoerten Objekten
- // rausfiltern, damit die (hoffentlich korrekten) Closures
- // im neu geclonten Objekt erhalten bleiben
- for ( i = sizeof(names); i--; )
- if ( _illegal_closure(pro[names[i], F_VALUE]) ||
- _illegal_closure(pro[names[i], F_QUERY_METHOD]) ||
- _illegal_closure(pro[names[i], F_SET_METHOD]) )
- m_delete( pro, names[i] );
-
- ({mapping})obj->SetProperties(pro);
- msg += ", Properties gesetzt";
- }
- // Wenn kein UPD_C, wird ggf. das Ergebnis von Configure() wieder
- // uebergeben.
- else if (restore_config)
+ // Ggf. Ergebnis von Configure() uebergeben
+ if (restore_config)
{
int conf_res;
if (!catch(conf_res=({int})obj->Configure(configdata); publish)
@@ -517,11 +455,6 @@
args=parseargs(cmdline,&flags,UPD_OPTS,1);
if(flags==-1||!sizeof(args))
return USAGE("upd [-"+UPD_OPTS+"] <datei> [<datei> ..]");
- if ((flags & UPD_C) && (flags & UPD_CONF))
- {
- printf("upd: -c und -C gleichzeitig werden nicht unterstuetzt.\n");
- return 1;
- }
args=file_list(args,MODE_UPD,0,"/");
if(!sizeof(args)) return printf("upd: Keine passende Datei gefunden!\n"),1;
diff --git a/sys/magier.h b/sys/magier.h
index 0f51d1d..820d960 100644
--- a/sys/magier.h
+++ b/sys/magier.h
@@ -56,7 +56,7 @@
#define RM_M 4 // DateiMASKE beachten
#define RM_I 8 // Interaktiv loeschen (immer fragen)
-#define UPD_OPTS "afilrmbvcdhsC"
+#define UPD_OPTS "afilrmbvdhsC"
#define UPD_A 1 // Alle Instanzen bearbeiten
#define UPD_F 2 // Alle Instanzen finden und anzeigen
#define UPD_I 4 // Geerbte Klassen aktualisieren
@@ -67,13 +67,12 @@
// ggf. aktualisieren
#define UPD_B 64 // Backtrace bei Fehlern
#define UPD_V 128 // Erbschaftslisten mit ausgeben
-#define UPD_C 256 // Properties erhalten
-#define UPD_D 512 // Objektinhalt komplett destructen
-#define UPD_H 1024 // Hard-Destruct (kein remove())
-#define UPD_S 2048 // Silent
-#define UPD_CONF 4096 // Configure() erzwingen (d.h. kein Update,
+#define UPD_D 256 // Objektinhalt komplett destructen
+#define UPD_H 512 // Hard-Destruct (kein remove())
+#define UPD_S 1024 // Silent
+#define UPD_CONF 2048 // Configure() erzwingen (d.h. kein Update,
// wenn Configure() nicht definiert ist)
-#define UPD_LOAD 8192 // laden, falls nicht geladen (nur
+#define UPD_LOAD 4096 // laden, falls nicht geladen (nur
// intern fuer 'load)
#define CP_OPTS "vrfmi"