288 lines
7.5 KiB
Plaintext
288 lines
7.5 KiB
Plaintext
const float WOW_POLYMORPH_HEARTBEAT = 1.0; // The delay between heartbeats
|
|
int wow_GetPrimaryAbility();
|
|
void wow_PolyFix();
|
|
effect wow_GetPolyFixEffect();
|
|
void wow_PolyHeartbeat();
|
|
void wow_RemovePolyFix();
|
|
int wow_CheckPoly();
|
|
int wow_GetPolySpellId();
|
|
void wow_PolyOnClientEnter();
|
|
int wow_CheckForCasterLevels();
|
|
|
|
int wow_CheckForCasterLevels()
|
|
{
|
|
if(GetLevelByClass(CLASS_TYPE_BARD) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_CLERIC) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_DRUID) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_PALADIN) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_RANGER) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_SHIFTER) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_SORCERER) > 0 ||
|
|
GetLevelByClass(CLASS_TYPE_WIZARD) > 0) return TRUE;
|
|
else return FALSE;
|
|
}
|
|
|
|
void wow_PolyOnClientEnter()
|
|
{
|
|
if(!GetIsPC(OBJECT_SELF))
|
|
{
|
|
AssignCommand(GetEnteringObject(), wow_PolyOnClientEnter());
|
|
}
|
|
else
|
|
{
|
|
if(wow_CheckPoly()) DelayCommand(WOW_POLYMORPH_HEARTBEAT, wow_PolyHeartbeat());
|
|
else wow_RemovePolyFix();
|
|
}
|
|
}
|
|
|
|
void wow_RemovePolyFix()
|
|
{
|
|
effect eEffect = GetFirstEffect(OBJECT_SELF);
|
|
int nType, nSpell;
|
|
|
|
while(GetIsEffectValid(eEffect))
|
|
{
|
|
nType = GetEffectType(eEffect);
|
|
nSpell = GetEffectSpellId(eEffect);
|
|
if(nType == EFFECT_TYPE_ABILITY_INCREASE)
|
|
{
|
|
switch(nSpell)
|
|
{
|
|
case 184:
|
|
case 387:
|
|
case 388:
|
|
case 389:
|
|
case 390:
|
|
case 391:
|
|
case 392:
|
|
case 393:
|
|
case 394:
|
|
case 395:
|
|
case 396:
|
|
case 397:
|
|
case 398:
|
|
case 399:
|
|
case 400:
|
|
case 401:
|
|
case 402:
|
|
case 403:
|
|
case 404:
|
|
case 405:
|
|
case 658:
|
|
case 659:
|
|
case 660:
|
|
case 661:
|
|
case 662:
|
|
case 672:
|
|
case 678:
|
|
case 680:
|
|
case 670:
|
|
case 673:
|
|
case 674:
|
|
case 679:
|
|
case 691:
|
|
case 694:
|
|
case 682:
|
|
case 683:
|
|
case 684:
|
|
case 704:
|
|
case 705:
|
|
case 706:
|
|
case 707:
|
|
case 708:
|
|
case 709:
|
|
case 733:
|
|
case 734:
|
|
case 735:
|
|
case 738:
|
|
case 739:
|
|
case 740:
|
|
{
|
|
RemoveEffect(OBJECT_SELF, eEffect);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
eEffect = GetNextEffect(OBJECT_SELF);
|
|
}
|
|
}
|
|
|
|
int wow_GetPolySpellId()
|
|
{
|
|
int nReturn = -1;
|
|
effect eEffect = GetFirstEffect(OBJECT_SELF);
|
|
int nType;
|
|
|
|
while(GetIsEffectValid(eEffect))
|
|
{
|
|
nType = GetEffectType(eEffect);
|
|
if(nType == EFFECT_TYPE_POLYMORPH) nReturn = GetEffectSpellId(eEffect);
|
|
eEffect = GetNextEffect(OBJECT_SELF);
|
|
}
|
|
return nReturn;
|
|
}
|
|
|
|
int wow_CheckPoly()
|
|
{
|
|
int nAppearance = GetAppearanceType(OBJECT_SELF);
|
|
int nReturn = FALSE;
|
|
int nSpell = wow_GetPolySpellId();
|
|
switch(nSpell)
|
|
{
|
|
case 387:
|
|
{
|
|
if(nAppearance == 159) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 388:
|
|
{
|
|
if(nAppearance == 167) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 389:
|
|
{
|
|
if(nAppearance == 168) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 390:
|
|
{
|
|
if(nAppearance == 55) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 391:
|
|
{
|
|
if(nAppearance == 198) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 392:
|
|
{
|
|
if(nAppearance == 49) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 393:
|
|
{
|
|
if(nAppearance == 80) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 394:
|
|
{
|
|
if(nAppearance == 38) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 395:
|
|
{
|
|
if(nAppearance == 152) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 396:
|
|
{
|
|
if(nAppearance == 89) nReturn = TRUE;
|
|
break;
|
|
}
|
|
case 184:
|
|
{
|
|
if(nAppearance == 40) nReturn = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
return nReturn;
|
|
}
|
|
void wow_PolyHeartbeat()
|
|
{
|
|
if(wow_CheckPoly()) DelayCommand(WOW_POLYMORPH_HEARTBEAT, wow_PolyHeartbeat());
|
|
else DelayCommand(1.0, wow_RemovePolyFix());
|
|
}
|
|
|
|
int wow_GetPrimaryAbility()
|
|
{
|
|
int nAbility;
|
|
int nClass = GetLastSpellCastClass();
|
|
if(nClass == CLASS_TYPE_INVALID) nClass = CLASS_TYPE_SHIFTER;
|
|
switch(nClass)
|
|
{
|
|
case CLASS_TYPE_BARD:
|
|
case CLASS_TYPE_SORCERER:
|
|
{
|
|
nAbility = ABILITY_CHARISMA;
|
|
break;
|
|
}
|
|
case CLASS_TYPE_CLERIC:
|
|
case CLASS_TYPE_DRUID:
|
|
case CLASS_TYPE_PALADIN:
|
|
case CLASS_TYPE_RANGER:
|
|
case CLASS_TYPE_SHIFTER:
|
|
{
|
|
nAbility = ABILITY_WISDOM;
|
|
break;
|
|
}
|
|
case CLASS_TYPE_WIZARD:
|
|
{
|
|
nAbility = ABILITY_INTELLIGENCE;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
nAbility = -1;
|
|
break;
|
|
}
|
|
}
|
|
return nAbility;
|
|
}
|
|
|
|
void wow_PolyFix()
|
|
{
|
|
if(GetIsPC(OBJECT_SELF) && wow_CheckForCasterLevels() && (GetIsPC(GetSpellTargetObject()) || !GetIsObjectValid(GetSpellTargetObject())))
|
|
{
|
|
effect eEffect = wow_GetPolyFixEffect();
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, GetSpellTargetObject());
|
|
AssignCommand(GetSpellTargetObject(), DelayCommand(WOW_POLYMORPH_HEARTBEAT, wow_PolyHeartbeat()));
|
|
}
|
|
}
|
|
|
|
effect wow_GetPolyFixEffect()
|
|
{
|
|
int nAbility = wow_GetPrimaryAbility();
|
|
effect eEffect;
|
|
if(nAbility != -1)
|
|
{
|
|
object oItem;
|
|
int nSlot, nValue; // 13, 1
|
|
itemproperty ipIP;
|
|
for(nSlot = 0; nSlot <= 13; nSlot++)
|
|
{
|
|
oItem = GetItemInSlot(nSlot, OBJECT_SELF);
|
|
if(GetIsObjectValid(oItem))
|
|
{
|
|
if(GetItemHasItemProperty(oItem, ITEM_PROPERTY_ABILITY_BONUS) || GetItemHasItemProperty(oItem, ITEM_PROPERTY_DECREASED_ABILITY_SCORE))
|
|
{
|
|
ipIP = GetFirstItemProperty(oItem);
|
|
while(GetIsItemPropertyValid(ipIP))
|
|
{
|
|
if(GetItemPropertyType(ipIP) == ITEM_PROPERTY_ABILITY_BONUS)
|
|
{
|
|
if(GetItemPropertySubType(ipIP) == nAbility)
|
|
{
|
|
nValue += GetItemPropertyCostTableValue(ipIP);
|
|
}
|
|
}
|
|
else if(GetItemPropertyType(ipIP) == ITEM_PROPERTY_DECREASED_ABILITY_SCORE)
|
|
{
|
|
if(GetItemPropertySubType(ipIP) == nAbility)
|
|
{
|
|
nValue -= GetItemPropertyCostTableValue(ipIP);
|
|
}
|
|
}
|
|
ipIP = GetNextItemProperty(oItem);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(nValue > 0)
|
|
{
|
|
eEffect = EffectAbilityIncrease(nAbility, nValue);
|
|
}
|
|
}
|
|
return eEffect;
|
|
}
|
|
//void main () {}
|