Walkmaster: delay muss < MAX_MASTER_TIME sein
Der Walkmaster laesst nur noch Delays (in HBs) zu, die eine
Sekunde (d.h. auch ein HB) kuerzer sind als seine
Periodenlaenge (MAX_MASTER_TIME). Bislang wurde auch <=
akzeptiert.
Ansonsten kann es passieren, dass bei Abarbeitung eines
MNPC der wieder (sozusagen phasengleich) im gleichen Slot
landet, der aber nach Verarbeitung komplett genullt wird.
So konnten MNPC "verloren" gehen.
Change-Id: I2d933d41df92db05e8f1c0f45044d54985603837
diff --git a/p/service/padreic/mnpc/mnpc.h b/p/service/padreic/mnpc/mnpc.h
index 50544db..3c4749e 100644
--- a/p/service/padreic/mnpc/mnpc.h
+++ b/p/service/padreic/mnpc/mnpc.h
@@ -14,7 +14,7 @@
// max. Wartezeit zwischen 2 Bewegungen (in Sekunden), welche vom walk_master
// verwaltet wird. (Muss ganzzahlig durch __HEART_BEAT_INTERVAL__ dividierbar
// sein)
-#define MAX_MASTER_TIME 180
+#define MAX_MASTER_TIME 182
// ist automatisch in jedem mnpc gesetzt
#define P_MNPC "mnpc"
diff --git a/p/service/padreic/mnpc/moving.c b/p/service/padreic/mnpc/moving.c
index dcd76f5..4d08ab8 100644
--- a/p/service/padreic/mnpc/moving.c
+++ b/p/service/padreic/mnpc/moving.c
@@ -38,7 +38,7 @@
protected void RegisterWalk()
{
- if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))<=MAX_MASTER_TIME)
+ if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM)) < MAX_MASTER_TIME)
{
if (!WALK_MASTER->Registration())
WALK_MASTER->RegisterWalker(QueryProp(MNPC_DELAY),
@@ -67,7 +67,7 @@
|| find_call_out("Walk") > -1)
return -1;
// ansonsten MNPC registrieren, falls geeignet.
- if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))<=MAX_MASTER_TIME)
+ if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))<MAX_MASTER_TIME)
WALK_MASTER->RegisterWalker(QueryProp(MNPC_DELAY), QueryProp(MNPC_RANDOM));
// und mit kurzer Verzoegerung einmal laufen. (ja, absicht, hier
// MNPC_DELAY zu nutzen - denn solange dauert das Walk vom Master
@@ -341,7 +341,7 @@
return 0;
//ggf. neuen Callout eintragen, bevor irgendwas anderes gemacht wird.
- if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))>MAX_MASTER_TIME)
+ if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))>=MAX_MASTER_TIME)
call_out("Walk", QueryProp(MNPC_DELAY)+random(QueryProp(MNPC_RANDOM)));
// Im Kampf ggf. nicht weitergehen.
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index 3ae075f..58aecf3 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -62,7 +62,10 @@
// pruefen ob die Paramter zulaessig sind...
if (time<0) ERROR("negative time to RegisterWalker() from %O.\n");
if (rand<0) ERROR("negative random to RegisterWalker() from %O.\n");
- if ((time+rand) > (MAX_MASTER_TIME))
+ // das max. Delay darf max. MAX_MASTER_TIME-1 sein, sonst landet der MNPC im
+ // HB evtl. wieder in dem Slot, der gerade bearbeitet wird und der direkt
+ // danach komplett genullt wird...
+ if ((time+rand) >= (MAX_MASTER_TIME))
ERROR("Too long delaytime from %s to RegisterWalker().\n");
if (Registration())