void RemoveAllEffectsByCreator(object oCreator, object oPC);
void RemoveAllEffectsByDuration(object oPC, int iDuration = DURATION_TYPE_TEMPORARY);
void RemoveAllEffectsByType(object oPC, int iType = EFFECT_TYPE_ABILITY_INCREASE);
void RemoveAllEffectsBySubType(object oPC, int iSubType = SUBTYPE_MAGICAL);
void RemoveAllEffectsByTypeDuration(object oPC, int iType = EFFECT_TYPE_ABILITY_INCREASE, int iDuration = DURATION_TYPE_TEMPORARY);

void RemoveAllIPsByDuration(object oItem, int iDuration = DURATION_TYPE_TEMPORARY);
void RemoveAllIPsByType(object oItem, int iType = ITEM_PROPERTY_ONHITCASTSPELL);

// Allows you to remove all temporary item properties except onhitcast so darkfire will stay on
void RemoveAllIPsByDurationExceptType(object oItem, int iDuration = DURATION_TYPE_TEMPORARY, int iType = ITEM_PROPERTY_ONHITCASTSPELL);

void RemoveAllEffectsByCreator(object oCreator, object oPC)
{
  effect e = GetFirstEffect(oPC);
  while(GetIsEffectValid(e))
  {
    if (GetEffectCreator(e) == oCreator) RemoveEffect(oPC, e);
    e = GetNextEffect(oPC);
  }
}

void RemoveAllEffectsByDuration(object oPC, int iDuration = DURATION_TYPE_TEMPORARY)
{
  effect e = GetFirstEffect(oPC);
  while(GetIsEffectValid(e))
  {
    if (GetEffectDurationType(e) == iDuration) RemoveEffect(oPC, e);
    e = GetNextEffect(oPC);
  }
}

void RemoveAllEffectsByType(object oPC, int iType = EFFECT_TYPE_ABILITY_INCREASE)
{
  effect e = GetFirstEffect(oPC);
  while(GetIsEffectValid(e))
  {
    if (GetEffectType(e) == iType) RemoveEffect(oPC, e);
    e = GetNextEffect(oPC);
  }
}

void RemoveAllEffectsBySubType(object oPC, int iSubType = SUBTYPE_MAGICAL)
{
  effect e = GetFirstEffect(oPC);
  while(GetIsEffectValid(e))
  {
    if (GetEffectSubType(e) == iSubType) RemoveEffect(oPC, e);
    e = GetNextEffect(oPC);
  }
}

void RemoveAllEffectsByTypeDuration(object oPC, int iType = EFFECT_TYPE_ABILITY_INCREASE, int iDuration = DURATION_TYPE_TEMPORARY)
{
  effect e = GetFirstEffect(oPC);
  while(GetIsEffectValid(e))
  {
    if (GetEffectType(e) == iType) if (GetEffectDurationType(e) == iDuration) RemoveEffect(oPC, e);
    e = GetNextEffect(oPC);
  }
}

void RemoveAllIPsByDuration(object oItem, int iDuration = DURATION_TYPE_TEMPORARY)
{
  itemproperty ip = GetFirstItemProperty(oItem);
  while(GetIsItemPropertyValid(ip))
  {
    if (GetItemPropertyDurationType(ip) == iDuration) RemoveItemProperty(oItem, ip);
    ip = GetNextItemProperty(oItem);
  }
}

void RemoveAllIPsByType(object oItem, int iType = ITEM_PROPERTY_ONHITCASTSPELL)
{
  itemproperty ip = GetFirstItemProperty(oItem);
  while(GetIsItemPropertyValid(ip))
  {
    if (GetItemPropertyType(ip) == iType) RemoveItemProperty(oItem, ip);
    ip = GetNextItemProperty(oItem);
  }
}

void RemoveAllIPsByDurationExceptType(object oItem, int iDuration = DURATION_TYPE_TEMPORARY, int iType = ITEM_PROPERTY_ONHITCASTSPELL)
{
  itemproperty ip = GetFirstItemProperty(oItem);
  while(GetIsItemPropertyValid(ip))
  {
    if (GetItemPropertyDurationType(ip) == iDuration) if (GetItemPropertyType(ip) != iType) RemoveItemProperty(oItem, ip);
    ip = GetNextItemProperty(oItem);
  }
}