RemoveSkillAttributeModifier()
******************************


FUNKTION
========

   public int RemoveSkillAttributeModifier(object caster, string atrname)


DEFINIERT IN
============

   /std/living/skill_attributes.c


ARGUMENTE
=========

   <atrname>   string
               Name des Skill-Attributes, von dem der Modifikator geloescht
               werden soll.
               (Definiert in /sys/living/skill_attributes.h)

   <caster>    object
               Objekt, dessen Modifikator wieder entfernt werden soll.


BESCHREIBUNG
============

   Entfernt den Modifikator, den Object <caster> gesetzt hat, wieder. Dies
   ist nur notwendig, wenn der Effekt vor Ablauf der Gueltigkeit des
   Modifikators aufgehoben werden soll.


RUECKGABEWERT
=============

   SA_MOD_REMOVED         wenn der Modifikator geloescht wurde
   SA_MOD_NOT_FOUND       wenn der Modifikator nicht gefunden wurde
   Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt es
   sich, auf == SA_MOD_REMOVED zu pruefen.


BEISPIELE
=========

   // eine Waffe setzt im InformWield() einen Bonus auf SA_DAMAGE fuer 10min
   protected void InformWield(object pl, int silent) {
     if (objectp(pl)) {
       if (pl->ModifySkillAttribute(SA_DAMAGE, 20, 600) == SA_MOD_OK)
         // Erfolgsmeldung an Spieler
       else
         // Misserfolgsmeldung an Spieler.
     }
   }

   // wenn der Spieler die Waffe vor Ablauf der 600s wegstecken will, muss
   // der Bonus natuerlich auch wieder raus
   protected void InformUnwield(object pl, int silent) {
     if (objectp(pl))
       pl->RemoveSkillAttributeModifier(this_object(), SA_DAMAGE);
       // falls kein solcher Mod mehr gesetzt war, liefert RSAM()
       // SA_MOD_NOT_FOUND zurueck. Auswertung des Rueckgabewertes ist
       // vernachlaessigt.
   }


SIEHE AUCH
==========

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

13.08.2008, Zesstra
