PRC8/nwn/nwnprc/trunk/include/prc_inc_assoc.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

530 lines
19 KiB
Plaintext

//:://////////////////////////////////////////////
//:: Associate include
//:: prc_inc_assoc.nss
//:://////////////////////////////////////////////
/*
This file contains various functions for animal
companions and familiars
*/
//:://////////////////////////////////////////////
#include "inc_npc"
#include "inc_nwnx_funcs"
#include "shd_inc_shdfunc"
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
//adds associate as a henchman
void AddAssociate(object oMaster, object oAssociate);
//removes associate with unsummon vfx
void DestroyAssociate(object oAssociate);
//applies exalted companion bonuses
void ApplyExaltedCompanion(object oCompanion, object oCompSkin);
//applies blightspawned properties
void ApplyIllmaster(object oCompanion, object oCompSkin);
//applies pseudonatural template
void ApplyPseudonatural(object oFamiliar, object oFamSkin);
//applies pnp familiar bonuses
void ApplyPnPFamiliarProperties(object oPC, object oFamiliar);
//sets up animal companion natural weapons using following scheme:
/*
Damage
Lvl Claw Bite
1 1d3 1d6
6 1d4 1d8
12 1d6 1d10
19 1d8 2d6
27 1d10 2d8
36 1d12 2d10
enhancement bonus
(Lvl - 15) / 5
*/
void SetNaturalWeaponDamage(object oCompanion, int nLvlMod = 0);
void UnsummonCompanions(object oPC);
//////////////////////////////////////////////////
/* Constants */
//////////////////////////////////////////////////
const int DISEASE_TALONAS_BLIGHT = 52;
//associate numbers as nTH parameter in GetAssociateNPC()
const int NPC_BIOWARE_COMPANION = 1; //'original' bioware familiar/companion returned by GetAssociate()
const int NPC_HENCHMAN_COMPANION = 2; //bioware familiar/companion added as hanchman
//ASSOCIATE_TYPE_FAMILIAR
const int NPC_PNP_FAMILIAR = 3;
const int NPC_BONDED_FAMILIAR = 4;
const int NPC_DN_FAMILIAR = 5;
const int NPC_MS_ELEMENTAL = 6;
//ASSOCIATE_TYPE_ANIMALCOMPANION
const int NPC_SHAMAN_COMPANION = 3;
const int NPC_UR_COMPANION = 4;
//ASSOCIATE_TYPE_SUMMONED
const int NPC_DARK_COMPANION = 2;
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
void AddAssociate(object oMaster, object oAssociate)
{
int nMaxHenchmen = GetMaxHenchmen();
SetMaxHenchmen(99);
AddHenchman(oMaster, oAssociate);
SetMaxHenchmen(nMaxHenchmen);
}
void DestroyAssociate(object oAssociate)
{
AssignCommand(oAssociate, SetIsDestroyable(TRUE));
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oAssociate));
DestroyObject(oAssociate);
}
void CleanProperties(object oItem)
{
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
RemoveItemProperty(oItem, ip);
ip = GetNextItemProperty(oItem);
}
}
void ApplyExaltedCompanion(object oCompanion, object oCompSkin)
{
int nHD = GetHitDice(oCompanion);
effect eDR;
int nResist;
if (nHD >= 12)
{
eDR = EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE);
nResist = 20;
}
else if (12 > nHD && nHD >= 8)
{
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_TWO);
nResist = 15;
}
else if (8 > nHD && nHD >= 4)
{
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_ONE);
nResist = 10;
}
else if (4 > nHD)
{
nResist = 5;
}
effect eAcid = EffectDamageResistance(DAMAGE_TYPE_ACID, nResist);
effect eCold = EffectDamageResistance(DAMAGE_TYPE_COLD, nResist);
effect eElec = EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nResist);
effect eVis = EffectUltravision();
effect eLink = EffectLinkEffects(eDR, eAcid);
eLink = EffectLinkEffects(eLink, eCold);
eLink = EffectLinkEffects(eLink, eElec);
eLink = EffectLinkEffects(eLink, eVis);
eLink = SupernaturalEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oCompanion);
itemproperty ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_TEMPLATE_CELESTIAL_SMITE_EVIL);
IPSafeAddItemProperty(oCompSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
if(GetAlignmentGoodEvil(oCompanion) != ALIGNMENT_GOOD)
AdjustAlignment(oCompanion, ALIGNMENT_GOOD, 80, FALSE);
SetLocalInt(oCompanion, "CelestialTemplate", 1);
}
void ApplyPseudonatural(object oFamiliar, object oFamSkin)
{
if(GetLocalInt(oFamiliar, "PseudonaturalTemplate"))
return;
int nHD = GetHitDice(oFamiliar);
int nResist;
effect eDR;
if (nHD >= 12)
{
eDR = EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE);
nResist = 20;
}
else if (12 > nHD && nHD >= 8)
{
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_TWO);
nResist = 15;
}
else if (8 > nHD && nHD >= 4)
{
eDR = EffectDamageReduction(5, DAMAGE_POWER_PLUS_ONE);
nResist = 10;
}
else if (4 > nHD)
{
nResist = 5;
}
effect eAcid = EffectDamageResistance(DAMAGE_TYPE_ACID, nResist);
effect eElec = EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nResist);
effect eAC = EffectACIncrease(1,AC_NATURAL_BONUS);
effect eLink = EffectLinkEffects(eDR, eAcid);
eLink = EffectLinkEffects(eLink, eElec);
eLink = EffectLinkEffects(eLink, eAC);
eLink = SupernaturalEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oFamiliar);
// itemproperty ipIP = PRCItemPropertyBonusFeat(IP_CONST_FEAT_TEMPLATE_PSEUDONATURAL_TRUESTRIKE);
// IPSafeAddItemProperty(oFamSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
SetLocalInt(oFamiliar, "PseudonaturalTemplate", 1);
}
void ApplyIllmaster(object oCompanion, object oCompSkin)
{
//Give the companion permanent Str +4, Con +2, Wis -2, and Cha -2
if(GetPRCSwitch(PRC_NWNX_FUNCS))
{
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, 4);
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_CONSTITUTION, 2);
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_WISDOM, -2);
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_CHARISMA, -2);
}
else
{
string sFlag = "Illmaster";
SetCompositeBonus(oCompSkin, sFlag, 4, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR);
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON);
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_DECREASED_ABILITY_SCORE, IP_CONST_ABILITY_WIS);
SetCompositeBonus(oCompSkin, sFlag, 2, ITEM_PROPERTY_DECREASED_ABILITY_SCORE, IP_CONST_ABILITY_CHA);
}
//Set PLANT immunities and add low light vision
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_DOMINATE_PERSON), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_HOLD_PERSON), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_MASS_CHARM), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB), oCompSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, PRCItemPropertyBonusFeat(FEAT_LOWLIGHTVISION), oCompSkin);
//Compute the DC for this companion's blight touch
int iHD = GetHitDice(oCompanion);
int iCons = GetAbilityModifier(ABILITY_CONSTITUTION, oCompanion);
int iDC = 10 + (iHD / 2) + iCons;
//Create the onhit item property for causing the blight touch disease
itemproperty ipBlightTouch = ItemPropertyOnHitProps(IP_CONST_ONHIT_DISEASE, iDC, DISEASE_TALONAS_BLIGHT);
//Get the companion's creature weapons
object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
object oLClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCompanion);
object oRClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCompanion);
//Apply blight touch to each weapon
if (GetIsObjectValid(oBite))
IPSafeAddItemProperty(oBite, ipBlightTouch);
if (GetIsObjectValid(oLClaw))
IPSafeAddItemProperty(oLClaw, ipBlightTouch);
if (GetIsObjectValid(oRClaw))
IPSafeAddItemProperty(oRClaw, ipBlightTouch);
//Adjust alignment to Neutral Evil
if(GetAlignmentLawChaos(oCompanion) != ALIGNMENT_NEUTRAL)
AdjustAlignment(oCompanion, ALIGNMENT_NEUTRAL, 50, FALSE);
if (GetAlignmentGoodEvil(oCompanion) != ALIGNMENT_EVIL)
AdjustAlignment(oCompanion, ALIGNMENT_EVIL, 80, FALSE);
}
void WinterWolfProperties(object oCompanion, int nLevel)
{
int iStr = nLevel >= 30 ? (nLevel-30)/2 : (nLevel-4)/2;
int iDex = nLevel >= 30 ? (nLevel-31)/2 : (nLevel-5)/2;
object oCreR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
if(GetPRCSwitch(PRC_NWNX_FUNCS))
{
if(iStr > 0)
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, iStr);
if(iDex > 0)
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_DEXTERITY, iStr);
}
else
{
if(iStr > 0)
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR, iStr), oCreR);
if(iDex > 0)
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX, iDex), oCreR);
}
int nBonusDmg;
if(nLevel > 24)
nBonusDmg = IP_CONST_DAMAGEBONUS_1d12;
else if(nLevel > 16)
nBonusDmg = IP_CONST_DAMAGEBONUS_1d10;
else if(nLevel > 7)
nBonusDmg = IP_CONST_DAMAGEBONUS_1d8;
else
nBonusDmg = IP_CONST_DAMAGEBONUS_1d6;
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD, nBonusDmg), oCreR);
//winter wolf properties
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT), oCreR);
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEIMMUNITY_100_PERCENT), oCreR);
int iMax, i;
int coneAbi = nLevel / 5;
switch(coneAbi)
{
case 1 : iMax = 7; break;
case 2 : iMax = 6; break;
case 3 : iMax = 5; break;
case 4 : iMax = 4; break;
case 5 : iMax = 3; break;
case 6 : iMax = 2; break;
case 7 : iMax = 1; break;
}
if(iMax > 0)
{
for(i = 1; i <= iMax; i++)
DecrementRemainingSpellUses(oCompanion, 230);
}
}
void ApplyPnPFamiliarProperties(object oPC, object oFam)
{
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
effect eBonus;
//get familiar level
int nFamLevel = GetLevelByClass(CLASS_TYPE_WIZARD, oPC)
+ GetLevelByClass(CLASS_TYPE_SORCERER, oPC)
+ GetLevelByClass(CLASS_TYPE_WITCH, oPC)
+ GetLevelByClass(CLASS_TYPE_ALIENIST, oPC)
+ GetLevelByClass(CLASS_TYPE_HEXBLADE, oPC)
+ GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oPC);
if (GetHasFeat(FEAT_SHADOW_FAMILIAR, oPC)) nFamLevel = GetLevelByTypeArcane(oPC) + GetShadowcasterLevel(oPC); // For the purpose of determining familiar abilities that depend on your arcane caster level,
// your levels in all classes that allow you to cast mysteries or arcane spells stack
//scaling bonuses
int nAdjustLevel = nFamLevel - GetHitDice(oFam);
int n;
for(n = 1; nAdjustLevel >= n; n++)
LevelUpHenchman(oFam, CLASS_TYPE_INVALID, TRUE);
int nACBonus = nFamLevel / 2;
int nIntBonus = nFamLevel / 2;
int nSRBonus = nFamLevel > 11 ? nFamLevel + 5 : 0;
//saving throws
int nSaveRefBonus = GetReflexSavingThrow(oPC) - GetReflexSavingThrow(oFam);
int nSaveFortBonus = GetFortitudeSavingThrow(oPC) - GetFortitudeSavingThrow(oFam);
int nSaveWillBonus = GetWillSavingThrow(oPC) - GetWillSavingThrow(oFam);
int nHPBonus;
if(bFuncs)
{
nHPBonus = GetMaxHitPoints(oPC) / 2;
int i, nBonus;
for(i = 0; i < GetPRCSwitch(FILE_END_SKILLS); i++)
{
nBonus = GetSkillRank(i, oPC) - GetSkillRank(i, oFam);
if(nBonus > 0)
PRC_Funcs_ModSkill(oFam, i, nBonus);
}
PRC_Funcs_SetBaseNaturalAC(oFam, PRC_Funcs_GetBaseNaturalAC(oFam) + nACBonus);
PRC_Funcs_ModAbilityScore(oFam, ABILITY_INTELLIGENCE, nIntBonus);
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_REFLEX, nSaveRefBonus);
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_FORT, nSaveFortBonus);
PRC_Funcs_ModSavingThrowBonus(oFam, SAVING_THROW_WILL, nSaveWillBonus);
PRC_Funcs_SetMaxHitPoints(oFam, nHPBonus);
PRC_Funcs_SetCurrentHitPoints(oFam, nHPBonus);
}
else
{
//temporary HP for the moment, have to think of a better idea later
nHPBonus = (GetMaxHitPoints(oPC) / 2) - GetMaxHitPoints(oFam);
int i, nBonus;
for(i = 0; i < GetPRCSwitch(FILE_END_SKILLS); i++)
{
nBonus = GetSkillRank(i, oPC) - GetSkillRank(i, oFam);
eBonus = EffectLinkEffects(eBonus, EffectSkillIncrease(i, nBonus));
}
eBonus = EffectLinkEffects(eBonus, EffectACIncrease(nACBonus, AC_NATURAL_BONUS));
eBonus = EffectLinkEffects(eBonus, EffectAbilityIncrease(ABILITY_INTELLIGENCE, nIntBonus));
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nSaveRefBonus));
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_FORT, nSaveFortBonus));
eBonus = EffectLinkEffects(eBonus, EffectSavingThrowIncrease(SAVING_THROW_WILL, nSaveWillBonus));
eBonus = EffectLinkEffects(eBonus, EffectTemporaryHitpoints(nHPBonus));
}
int nABBonus = GetBaseAttackBonus(oPC) - GetBaseAttackBonus(oFam);
int nAttacks = (GetBaseAttackBonus(oPC)/5)+1;
if(nAttacks > 5)
nAttacks = 5;
SetBaseAttackBonus(nAttacks, oFam);
//effect doing
if(nSRBonus > 0) eBonus = EffectLinkEffects(eBonus, EffectSpellResistanceIncrease(nSRBonus));
eBonus = EffectLinkEffects(eBonus, EffectAttackIncrease(nABBonus));
//skills were linked earlier
eBonus = SupernaturalEffect(eBonus);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonus, oFam);
}
void CheckIsValidFamiliar(object oMaster, effect eBonus)
{
object oFam = GetAssociateNPC(ASSOCIATE_TYPE_FAMILIAR);
object oFamToken = GetItemPossessedBy(oMaster, "prc_pnp_familiar");
if(GetIsObjectValid(oFam))
{
if(!GetIsDead(oFam))
{
DelayCommand(30.0, CheckIsValidFamiliar(oMaster, eBonus));
return;
}
}
else
{
if(GetIsObjectValid(oFamToken))
{
DelayCommand(30.0, CheckIsValidFamiliar(oMaster, eBonus));
return;
}
}
RemoveEffect(oMaster, eBonus);
}
effect GetMasterBonus(int nFamiliarType)
{
effect eBonus;
string sFile = "prc_familiar";
string sTemp = Get2DACache(sFile, "BONUS", nFamiliarType);
int nParam1 = StringToInt(Get2DACache(sFile, "PARAM1", nFamiliarType));
int nParam2 = StringToInt(Get2DACache(sFile, "PARAM2", nFamiliarType));
if(sTemp == "sk")
eBonus = EffectSkillIncrease(nParam1, nParam2);
else if(sTemp == "sv")
eBonus = EffectSavingThrowIncrease(nParam1, nParam2);
else if(sTemp == "hp")
eBonus = EffectTemporaryHitpoints(nParam1);
return eBonus;
}
int GetCompanionBaseDamage(int nLevel, int bBite)
{
int nBite, nClaw;
if(nLevel > 35)
{
nBite = IP_CONST_MONSTERDAMAGE_2d10;
nClaw = IP_CONST_MONSTERDAMAGE_1d12;
}
else if(nLevel > 26)
{
nBite = IP_CONST_MONSTERDAMAGE_2d8;
nClaw = IP_CONST_MONSTERDAMAGE_1d10;
}
else if(nLevel > 18)
{
nBite = IP_CONST_MONSTERDAMAGE_2d6;
nClaw = IP_CONST_MONSTERDAMAGE_1d8;
}
else if(nLevel > 11)
{
nBite = IP_CONST_MONSTERDAMAGE_1d10;
nClaw = IP_CONST_MONSTERDAMAGE_1d6;
}
else if(nLevel > 5)
{
nBite = IP_CONST_MONSTERDAMAGE_1d8;
nClaw = IP_CONST_MONSTERDAMAGE_1d4;
}
else
{
nBite = IP_CONST_MONSTERDAMAGE_1d6;
nClaw = IP_CONST_MONSTERDAMAGE_1d3;
}
if(bBite)
return nBite;
return nClaw;
}
void SetNaturalWeaponDamage(object oCompanion, int nLvlMod = 0)
{
int nLevel = GetHitDice(oCompanion);
nLevel += nLvlMod;
int Enh = (nLevel - 15) / 5;
int nDamage;
//Get the companion's creature weapons
object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
object oLClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCompanion);
object oRClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCompanion);
//Apply properties to each weapon
if(GetIsObjectValid(oBite))
{
CleanProperties(oBite);
nDamage = GetCompanionBaseDamage(nLevel, TRUE);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oBite);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oBite);
}
if(GetIsObjectValid(oLClaw))
{
CleanProperties(oLClaw);
nDamage = GetCompanionBaseDamage(nLevel, FALSE);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oLClaw);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oLClaw);
}
if(GetIsObjectValid(oRClaw))
{
CleanProperties(oRClaw);
nDamage = GetCompanionBaseDamage(nLevel, FALSE);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyMonsterDamage(nDamage), oRClaw);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyAttackBonus(Enh), oRClaw);
}
}
void UnsummonCompanions(object oPC)
{
int i;
object oAsso;
for(i = 1; i <= 5; i++)
{
oAsso = GetAssociateNPC(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC, i);
if(GetIsObjectValid(oAsso))
DestroyAssociate(oAsso);
}
for(i = 1; i <= 5; i++)
{
oAsso = GetAssociateNPC(ASSOCIATE_TYPE_FAMILIAR, oPC, i);
if(GetIsObjectValid(oAsso))
DestroyAssociate(oAsso);
}
}