present_objects(): vItems beruecksichtigen
present_objects() liefert virtuell anwesende Objekte zurueck.
Change-Id: Ied26e2bfe27f51500526d0f9695657fe33efc4ac
diff --git a/std/container/restrictions.c b/std/container/restrictions.c
index 1095b85..b9dcbf9 100644
--- a/std/container/restrictions.c
+++ b/std/container/restrictions.c
@@ -33,6 +33,7 @@
#include <properties.h>
#include <defines.h>
#include <thing/description.h>
+#include <container/vitems.h>
// local properties prototypes
static int _query_total_weight();
@@ -255,28 +256,32 @@
complex_desc = complex_desc[6..];
}
- obs=({});
+ obs = ({});
+ // all_inventory() und VItems (virtuell anwesende Items)
+ // zusammensammeln:
+ object *my_inventory = all_inventory() + GetVItemClones();
+
// nun nach Main-Ids (Gruppen) suchen...
if ( meth & POS_LETZTES )
{ // geht es nur um den letzten Gegenstand?
switch( complex_desc ){
case "waffe":
- obs = filter_objects( all_inventory(), "QueryProp",
+ obs = filter_objects( my_inventory, "QueryProp",
P_WEAPON_TYPE );
break;
case "ruestung":
- obs = filter_objects( all_inventory(), "QueryProp",
+ obs = filter_objects( my_inventory, "QueryProp",
P_ARMOUR_TYPE );
break;
case "kleidung":
- obs = filter_objects( all_inventory(), "IsClothing");
+ obs = filter_objects( my_inventory, "IsClothing");
break;
case "verschiedenem":
case "verschiedenes":
- obs = all_inventory();
+ obs = my_inventory;
obs -= filter_objects( obs, "QueryProp", P_WEAPON_TYPE );
obs -= filter_objects( obs, "QueryProp", P_ARMOUR_TYPE );
obs -= filter_objects( obs, "IsClothing");
@@ -292,7 +297,7 @@
// kein break;, Fall-through!
case "behaltenem":
case "behaltenes":
- obs += filter( all_inventory(), "_behalten", ME,
+ obs += filter( my_inventory, "_behalten", ME,
getuid(this_player() || previous_object()) );
obs += (QueryProp(P_ARMOURS) || ({}))
@@ -300,12 +305,12 @@
break;
case "gegenstand":
- obs = all_inventory() -
- filter( all_inventory(), #'living/*'*/ );
+ obs = my_inventory -
+ filter( my_inventory, #'living/*'*/ );
break;
default:
- obs = filter_objects( all_inventory(), "id", complex_desc );
+ obs = filter_objects( my_inventory, "id", complex_desc );
}
// unsichtbare objekte entfernen
@@ -328,8 +333,8 @@
if ( meth & POS_INVERS )
continue; // alles nicht = nichts :)
- obs = all_inventory() -
- filter( all_inventory(), #'living/*'*/ );
+ obs = my_inventory -
+ filter( my_inventory, #'living/*'*/ );
break;
case "waffen":
@@ -337,7 +342,7 @@
case "jeder waffe":
case "alle waffen":
case "allen waffen":
- obs = filter_objects( all_inventory(), "QueryProp",
+ obs = filter_objects( my_inventory, "QueryProp",
P_WEAPON_TYPE );
break;
@@ -346,7 +351,7 @@
case "jeder ruestung":
case "alle ruestungen":
case "allen ruestungen":
- obs = filter_objects( all_inventory(), "QueryProp",
+ obs = filter_objects( my_inventory, "QueryProp",
P_ARMOUR_TYPE );
break;
@@ -355,19 +360,19 @@
case "jeder kleidung":
case "alle kleidung":
case "allen kleidung":
- obs = filter_objects( all_inventory(), "IsClothing");
+ obs = filter_objects( my_inventory, "IsClothing");
break;
case "gegenstand":
- obs = filter_objects( all_inventory() -
- filter( all_inventory(),
+ obs = filter_objects( my_inventory -
+ filter( my_inventory,
#'living/*'*/ ),
"short" )[0..0];
break;
case "verschiedenem":
case "verschiedenes":
- obs = all_inventory();
+ obs = my_inventory;
obs -= filter_objects( obs, "QueryProp", P_WEAPON_TYPE );
obs -= filter_objects( obs, "QueryProp", P_ARMOUR_TYPE );
obs -= filter_objects( obs, "IsClothing");
@@ -388,7 +393,7 @@
case "behaltenen":
case "behaltenes":
case "alles behaltene":
- obs += filter( all_inventory(), "_behalten", ME,
+ obs += filter( my_inventory, "_behalten", ME,
getuid(this_player() || previous_object()) );
obs += (QueryProp(P_ARMOURS) || ({}))
@@ -401,7 +406,7 @@
{
if ( complex_desc[4..4] == " " )
{
- obs = filter_objects( all_inventory(), "id",
+ obs = filter_objects( my_inventory, "id",
complex_desc[5..] );
break;
}
@@ -413,7 +418,7 @@
case "r ":
case "n ":
case "s ":
- obs = filter_objects( all_inventory(), "id",
+ obs = filter_objects( my_inventory, "id",
complex_desc[6..] );
break;
@@ -427,6 +432,8 @@
// Der Normalfall: einzelne ID...
ob = present( complex_desc, ME );
+ if (!ob)
+ ob = present_vitem(complex_desc);
// Achtung: dieser Teil setzt das for() fort (continue) und
// umgeht dabei die Pruefung auf Sichtbarkeit nach dem Ende vom
// switch(). Aus diesem Grunde muss hier selber geprueft
@@ -434,11 +441,15 @@
if ( meth & POS_INVERS )
{
if ( ob && ob != ME )
- erg += (filter_objects( all_inventory(), "short" )
+ erg += (filter_objects( my_inventory, "short" )
- ({ ob }) );
else
- erg += filter_objects( all_inventory(), "short" );
+ erg += filter_objects( my_inventory, "short" );
}
+ // Grund fuer P_INVIS statt short==0: Bei Angabe einer ganz
+ // bestimmten ID (im Gegensatz zu "alles", "jede waffe" etc.)
+ // soll ein Item gefunden werden, auch wenn die Short 0 ist
+ // (unsichtbar, aber interagierbar).
else if ( ob && ob != ME && !ob->QueryProp(P_INVIS) )
erg += ({ ob }); //Normalfall: einzelne ID
@@ -450,7 +461,7 @@
} // else
if ( meth & POS_INVERS )
- erg += ( filter_objects( all_inventory(), "short" ) - obs );
+ erg += ( filter_objects( my_inventory, "short" ) - obs );
else
erg += obs;
} // for