GetMatMembership()
FUNKTION:
     string *GetMatMembership(string mat)

DEFINIERT IN:
     /p/daemon/materialdb.c (MATERIALDB)

ARGUMENTE:
     string mat - ein Material

BESCHREIBUNG:
     Gibt alle Gruppen, denen das Material angehoert zurueck. Geeignet, um
     die Eigenschaften eines Materials zu ueberpruefen.

RUECKGABEWERT:
     Array von Strings mit Materialiengruppen oder ({})

BEISPIELE:
     // ein weiser Schmied:
     int i;
     string *mat, mname, mgroup;
     mat=m_indices(ob->QueryProp(P_MATERIAL));
     i=sizeof(mat);

     write("Der Schmied sagt: "+ob->Name(WER)+" besteht aus ...\n");
     while(i--) {
      // den Namen erkennen/aussprechen:
      // Materialien werden allgemein etwas besser erkannt (zu 5%), aber
      // alles aus Metall wird zu +100% besser erkannt ...
      mname=MATERIALDB->MaterialName(mat[i], WER,
	     ({5, ([MATRGROUP_METAL, 100])}));

      // und nur Metalle analysieren ...
      if(MATERIALDB->MaterialGroup(([mat[i]:100]),MATGROUP_METAL)>=100) {
       int j;
       string *mgr;
       mgr=MATERIALDB->GetMatMembership(mat[i]);
       j=sizeof(mgr);
       mgroup=" gehoert zu ";
       while(j--) {
        mgroup+=MATERIALDB->GroupName(mgr[j]);
        if(j>0) mgroup+=", ";
       }
      } else mgroup=" kenne ich nicht";
      printf("%-12.12s: %s\n",mname, mgroup);
     }

SIEHE AUCH:
     Konzepte:	  material, materialerkennung
     Grundlegend: P_MATERIAL, /sys/thing/material.h
     Master:	  AddMaterial(), ConvMaterialList(), MaterialGroup(),
		  GroupName(), MaterialName(),
		  GetGroupMembers()

7. Mai 2004 Gloinson