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);