P_HELPER_OBJECTS initialisieren

Ist die Property nicht initialisiert, kann das zu Bugs fuehren, unter
anderem bei GetHelperObject()

Die Pruefung auf korrekte Datenstruktur in den anderen Funktionen kann
damit auch entfallen.

Change-Id: I98fa20bfe4de346045dc845b74e073858e97c9b4
diff --git a/std/living/helpers.c b/std/living/helpers.c
index 91c480f..a249b6c 100644
--- a/std/living/helpers.c
+++ b/std/living/helpers.c
@@ -14,6 +14,13 @@
 #include <thing/properties.h>
 #undef NEED_PROTOTYPES
 
+protected void create()
+{
+  Set(P_HELPER_OBJECTS,([
+    HELPER_TYPE_AQUATIC:({}),
+    HELPER_TYPE_AERIAL:({})]), F_VALUE);
+}
+
 public int RegisterHelperObject(object helper, int type, 
                                 string|closure callback) 
 {
@@ -51,14 +58,6 @@
 
   // Property auslesen und zwischenspeichern
   helpers = QueryProp(P_HELPER_OBJECTS);
-  // Wenn die Prop leer ist, hier initialisieren
-  if ( !helpers ) {
-    helpers = ([type:({})]);
-  }
-  // Wenn der Typ noch nicht existiert, hier nachtragen.
-  else if ( !pointerp(helpers[type]) ) {
-    helpers[type] = ({});
-  }
 
   // Closure eintragen, wenn noch nicht vorhanden
   if ( member(helpers[type], cb)==-1 ) {
@@ -79,12 +78,10 @@
 
   mapping helpers = Query(P_HELPER_OBJECTS, F_VALUE);
 
-  if ( mappingp(helpers) ) {
-    foreach(closure cl: helpers[type]) {
-      if ( get_type_info(cl,2) == helper ) {
-        helpers[type] = helpers[type]-({cl});
-        return HELPER_SUCCESS;
-      }
+  foreach(closure cl: helpers[type]) {
+    if ( get_type_info(cl,2) == helper ) {
+      helpers[type] = helpers[type]-({cl});
+      return HELPER_SUCCESS;
     }
   }
   return HELPER_NOTHING_TO_UNREGISTER;
@@ -94,11 +91,7 @@
 public mapping _query_lib_p_aquatic_helpers() {
   mapping ret = ([]);
   // eingetragene Callback-Closures auslesen
-  closure *helpers = 
-    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AQUATIC];
-  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
-  if ( !pointerp(helpers) )
-    return ret;
+  closure *helpers = Query(P_HELPER_OBJECTS, F_VALUE)[HELPER_TYPE_AQUATIC];
 
   // Nullelement substrahieren
   helpers -= ({0});
@@ -119,13 +112,8 @@
 public mapping _query_lib_p_aerial_helpers() {
   mapping ret = ([]);
   // eingetragene Callback-Closures auslesen
-  closure *helpers = 
-    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AERIAL];
+  closure *helpers = Query(P_HELPER_OBJECTS, F_VALUE)[HELPER_TYPE_AERIAL];
 
-  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
-  if ( !pointerp(helpers) )
-    return ret;
-  
   // Nullelement substrahieren
   helpers -= ({0});
 
diff --git a/std/npc.c b/std/npc.c
index 8ec29f4..3483bf8 100644
--- a/std/npc.c
+++ b/std/npc.c
@@ -68,6 +68,7 @@
   add_team_commands();
   items::create();
   envchk::create();
+  helpers::create();
   moving::create();
 
   add_action("UseSpell","",1);
diff --git a/std/player/base.c b/std/player/base.c
index 0a6c257..40669bf 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -157,6 +157,7 @@
   moving::create();
   travel::create();
   skills::create();
+  helpers::create();
    
   SetProp(P_LEVEL, -1);
   Set(P_LEVEL, SAVE|SECURED, F_MODE_AS);