Einfuehrung Mapping mit Walker-Daten.
Bislang wurden die Daten in einer geschachtelten
Zeit-Slot-Datenstruktur (walker) gespeichert und
wenn ermittelt werden sollte, ob ein MNPC schon
registriert war, war dies sehr aufwendig.
Es hat sich herausgestellt, dass es ziemlich
fehleranfaellig ist, jedem MNPC die Aufgabe zu geben,
Buch ueber seine Registrierung zu fuehren...
Daher wird fuer ein schnelles Lookup nun ein Mapping
gefuehrt, indem die MNPC mit dem Objekt als Key
abgelegt werden.
Change-Id: If932605350a93570dbe30f8e20086b9eb636a986
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index 99d677c..abd61bc 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -36,6 +36,9 @@
static int num_walker; // anzahl der walker im array
//static mixed *walker; // ({ ..., ({ ..., ({ wert, closure }), ...}), ...})
nosave < < <int|closure>* >* >* walker;
+// Mapping mit allen registrierten MNPC (als Objekte) als Key und deren
+// Zeitdaten (1. wert) und deren walk_closure (2. Wert).
+nosave mapping clients = m_allocate(0,2);
int Registration();
@@ -88,6 +91,7 @@
next+=(time+random(rand))/2;
if (next>MAX_DELAYTIME) next-=MAX_DELAYTIME;
walker[next]+=({ ({ wert, func }) });
+ clients += ([ get_type_info(func, 2): wert; func ]);
num_walker++;
}
@@ -99,10 +103,11 @@
// 0 zu returnen.
void RemoveWalker()
{
- int i, j;
- if (!num_walker) return;
- for (i=MAX_DELAYTIME; i>=0; i--) {
- for (j=sizeof(walker[i])-1; j>=0; j--)
+ if (!member(clients, previous_object()))
+ return;
+
+ for (int i=MAX_DELAYTIME; i>=0; i--) {
+ for (int j=sizeof(walker[i])-1; j>=0; j--)
{
if (get_type_info(walker[i][j][WALK_CLOSURE], 2)==previous_object())
{
@@ -116,24 +121,12 @@
if (i!=counter) // koennte gerade im heart_beat stecken...
walker[i]-=({ 0 });
}
+ m_delete(clients, previous_object());
}
-// Aufruf nach Moeglichkeit bitte vermeiden, da recht aufwendig. Meist ist
-// es leichter im NPC "sauber Buch zu fuehren" und sich zu merken, ob er
-// bereits angemeldet ist. Liefert zurueck, wie oft ein NPC als Walker
-// angemeldet ist (normalfall nie mehr als 1).
int Registration()
{
- int i, j, reg;
- if (!num_walker) return 0;
- reg=0;
- for (i=MAX_DELAYTIME; i>=0; i--)
- {
- for (j=sizeof(walker[i])-1; j>=0; j--)
- if (get_type_info(walker[i][j][WALK_CLOSURE], 2)==previous_object())
- reg++;
- }
- return reg;
+ return member(clients, previous_object());
}
void heart_beat()