QuerySkillAttributeModifier()
FUNKTION:
    public varargs mapping QuerySkillAttributeModifier(object caster, 
                                                    string *atrnames)

DEFINIERT IN:
    /std/living/skill_attributes.c

ARGUMENTE:
    <caster>    object
                Objekt, welches die gesuchten Mods gesetzt hat

    <atrnames>  string*
                Array von Skill-Attributen, welche durchsucht werden sollen.

BESCHREIBUNG:
    Diese Funktion liefert alle Mods von <caster> auf den Skill-
    Attributen <atrnames> in einem Mapping zurueck.
    Wird <atrnames> nicht angegeben oder ist ein leeres Array, werden alle
    Skill-Attribute nach Mods abgesucht.
    Wird <caster> nicht angeben oder ist 0, so werden alle Mods der 
    gewuenschten Skill-Attribute geliefert.
    Dementsprechend bekommt man alle Mods aller Skill-Attribute, wenn keins
    von beidem angegeben wird.

RUECKGABEWERT:
    ([]), falls keine Modifikatoren gefunden wurden.
    In anderen Faellen ist die Datenstruktur des Mappings wie folgt:
    ([ atrname1: ([ <caster>: <value>; <duration> ]),
       atrname2: ([ <caster>: <value>; <duration> ]) ])
    Die Schluessel im Mapping sind die jeweiligen Skill-Attribute, die Werte
    des Mappings sind erneut Mappings, welche als Schluessel die Objekte
    haben, welche die Mods gesetzt haben. In diesem Mapping gehoeren zu jedem
    Schluessel zwei Werte, den Wert des Modifikators und die Ablaufzeit.
    <value> kann hierbei ein int oder eine closure sein, <duration> ist ein
    int, <caster> ist ein Objekt.
    Ggf. kann das innere Mapping natuerlich auch mehrere Modifikatoren
    enthalten (also caster1, caster2, usw.).

BEMERKUNGEN:

BEISPIELE:
     Ein Objekt moechte seinen bestehenden Modifikator um 20 und die
     Gueltigkeit um 13 erhoehen.
     mapping res = ob->QuerySkillAttributeModifier(this_object(),
                                                  ({SA_DAMAGE}) );
     if (member(res, SA_DAMAGE) && member(res[SA_DAMAGE], this_object())) {
          // alten Mod ueberschreiben und Werte dabei anheben.
          ob->ModifySkillAttributeModifier(SA_DAMAGE,
              res[SA_DAMAGE][this_object(),0] + 20,
              res[SA_DAMAGE][this_object(),1] + 13 );
     }
     else
          // neuen Mod setzen.
          ob->ModifySkilAttributeModifier(SA_DAMAGE, 20, 13);
      
     Ein Objekt hat den Fluch der unpraezisen Schnelligkeit, welcher SA_DAMAGE
     reduziert, sofern das Lebewesen einen positiven Modifikator auf SA_SPEED
     hat:
     mapping res = ob->QuerySkillAttributeModifier(0, ({SA_SPEED}) );
     if (member(res, SA_SPEED) {
         int val, int dur;
         foreach(object caster, int v, int d: res[SA_SPEED]) {
             // groessten Mod rausfinden, dabei keine closures
             // beruecksichtigen.
             if (intp(v) && v>val) {
                 val=v;
                 dur=d;
             }
         }
         if (val > 0) {
             // pos. Mod auf SA_SPEED gefunden, entsprechenden neg. Mod auf
             // SA_DAMAGE setzen, der zum gleichen Zeitpunkt ungueltig wird
             // wie der Mod auf SA_SPEED.
             if (ob->ModifySkillAttribute(SA_DAMAGE, -val, dur) == SA_MOD_OK)
                tell_object(ob, "tolle Fluchmeldung.");
         }
     }

SIEHE AUCH:
    Skills Lernen:  LearnSkill, ModifySkill, LimitAbility
    * Nutzung:      UseSpell, UseSkill
    * Abfragen:     QuerySkill, QuerySkillAbility
    * Modifikation: ModifySkillAttribute, QuerySkillAttribute,
                    RemoveSkillAttributeModifier
      * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
    * sonstig:      spruchermuedung, skill_info_liste
    * Properties:   P_NEWSKILLS

14.08.2008, Zesstra
