forked from Jaysyn/PRC8
765 lines
34 KiB
Plaintext
765 lines
34 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
||
|
//:: Binding events
|
||
|
//:: bnd_events
|
||
|
//::///////////////////////////////////////////////
|
||
|
/** @file
|
||
|
Does all Binding content that require event scripting.
|
||
|
|
||
|
@author Stratovarius
|
||
|
@date Created - 2021.02.03
|
||
|
*/
|
||
|
//:://////////////////////////////////////////////
|
||
|
//:://////////////////////////////////////////////
|
||
|
|
||
|
#include "bnd_inc_bndfunc"
|
||
|
#include "prc_inc_unarmed"
|
||
|
#include "prc_inc_fork"
|
||
|
|
||
|
//////////////////////////////////////////////////
|
||
|
/* Internal Functions */
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
void CheckIsDropped(object oBinder, object oItem)
|
||
|
{
|
||
|
if(DEBUG) DoDebug("bnd_events: CheckIsDropped()");
|
||
|
|
||
|
if(GetItemPossessor(oItem) == oBinder)
|
||
|
{
|
||
|
if(DEBUG) DoDebug("bnd_events:GetItemPosessor(oItem) == oBinder");
|
||
|
// No check for commandability here. Let's not break any cutscenes
|
||
|
// If cheating does occur, set the char to commandable first here.
|
||
|
//And remember to restore the setting.
|
||
|
|
||
|
AssignCommand(oBinder, ClearAllActions());
|
||
|
AssignCommand(oBinder, ActionPutDownItem(oItem));
|
||
|
|
||
|
DelayCommand(2.0, CheckIsDropped(oBinder, oItem));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////
|
||
|
/* Content Functions */
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
void AymHaloOfFire(object oBinder, object oTarget)
|
||
|
{
|
||
|
if (GetDistanceBetween(oBinder, oTarget) <= FeetToMeters(10.0f))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(1), DAMAGE_TYPE_FIRE), oTarget);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void NaberiusHeal(object oBinder)
|
||
|
{
|
||
|
int nCount = GetLocalInt(oBinder, "NaberiusCount");
|
||
|
//FloatingTextStringOnCreature("Naberius heal has spell effect, nCount: "+IntToString(nCount), oBinder, FALSE);
|
||
|
if (nCount == 20) // Default timer is 2 real world minutes to an hour
|
||
|
{
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_STRENGTH, 1);
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_DEXTERITY, 1);
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_CONSTITUTION, 1);
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_INTELLIGENCE, 1);
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_WISDOM, 1);
|
||
|
RecoverUnHealableAbilityDamage(oBinder, ABILITY_CHARISMA, 1);
|
||
|
// Reset the number
|
||
|
nCount -= 20;
|
||
|
}
|
||
|
|
||
|
effect eEffect = GetFirstEffect(oBinder);
|
||
|
while(GetIsEffectValid(eEffect) && !GetLocalInt(oBinder, "NaberiusHealLock"))
|
||
|
{
|
||
|
// Is it an ability decrease?
|
||
|
if(GetEffectType(eEffect) == EFFECT_TYPE_ABILITY_DECREASE)
|
||
|
{
|
||
|
string sTag = GetEffectTag(eEffect);
|
||
|
//FloatingTextStringOnCreature("Effect tag is "+sTag, oBinder, FALSE);
|
||
|
int nAbil = StringToInt(GetSubString(sTag, 0, 1));
|
||
|
//FloatingTextStringOnCreature("Effect ability is "+IntToString(nAbil), oBinder, FALSE);
|
||
|
int nAmount = StringToInt(GetSubString(sTag, 1, 2));
|
||
|
//FloatingTextStringOnCreature("Effect ability is "+IntToString(nAmount), oBinder, FALSE);
|
||
|
|
||
|
SetLocalInt(oBinder, "NaberiusHealLock", TRUE);
|
||
|
DelayCommand(nAmount * 6.0, RemoveEffect(oBinder, eEffect));
|
||
|
DelayCommand(nAmount * 6.0, DeleteLocalInt(oBinder, "NaberiusHealLock"));
|
||
|
//DelayCommand(nAmount * 6.0, FloatingTextStringOnCreature("Naberius heal removed nAmount: "+IntToString(nAmount), oBinder, FALSE));
|
||
|
}
|
||
|
eEffect = GetNextEffect(oBinder);
|
||
|
}
|
||
|
SetLocalInt(oBinder, "NaberiusCount", nCount+1);
|
||
|
}
|
||
|
|
||
|
void HaagentiTrans(object oBinder)
|
||
|
{
|
||
|
effect eEffect = GetFirstEffect(oBinder);
|
||
|
while(GetIsEffectValid(eEffect))
|
||
|
{
|
||
|
// Is it poly or petr
|
||
|
if(GetEffectType(eEffect) == EFFECT_TYPE_PETRIFY || GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH)
|
||
|
RemoveEffect(oBinder, eEffect);
|
||
|
|
||
|
eEffect = GetNextEffect(oBinder);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void AndrasInfluence(object oBinder)
|
||
|
{
|
||
|
int nCombat = GetIsInCombat(oBinder);
|
||
|
int nCount = GetLocalInt(oBinder, "AndrasCombat");
|
||
|
if (nCombat)
|
||
|
{
|
||
|
nCount += 1;
|
||
|
SetLocalInt(oBinder, "AndrasCombat", nCount);
|
||
|
if (nCount >= 10)
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectExhausted()), oBinder, HoursToSeconds(1));
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectFrightened()), oBinder, RoundsToSeconds(d4()));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
DeleteLocalInt(oBinder, "AndrasCombat");
|
||
|
}
|
||
|
|
||
|
void EurynomePoisonBloodDelay(object oBinder, object oTarget, int nDC)
|
||
|
{
|
||
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
|
||
|
{
|
||
|
int nDice = min(5, GetBinderLevel(oBinder, VESTIGE_EURYNOME)/3);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_ACID_S), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(nDice), DAMAGE_TYPE_ACID), oTarget);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EurynomePoisonBlood(object oBinder, object oTarget)
|
||
|
{
|
||
|
// Enemy in vaguely melee range, wolves and other long creatures can actually hit outside of 10.0
|
||
|
if (GetDistanceBetween(oBinder, oTarget) <= FeetToMeters(15.0f))
|
||
|
{
|
||
|
// No weapon equipped, and the target has a bite attack
|
||
|
if (!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)) && GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget)))
|
||
|
{
|
||
|
int nDC = GetBinderDC(oBinder, VESTIGE_EURYNOME);
|
||
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_ACID_S), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_ACID), oTarget);
|
||
|
}
|
||
|
DelayCommand(60.0, EurynomePoisonBloodDelay(oBinder, oTarget, nDC));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void TenebrousVoid(object oBinder, object oTarget)
|
||
|
{
|
||
|
if (!GetLocalInt(oBinder, "TenebrousVoidStrike"))
|
||
|
{
|
||
|
int nDice = 1 + (GetBinderLevel(oBinder, VESTIGE_TENEBROUS)-7)/4;
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d8(nDice), DAMAGE_TYPE_COLD), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FROST_L), oTarget);
|
||
|
SetLocalInt(oBinder, "TenebrousVoidStrike", TRUE);
|
||
|
DelayCommand(4.5, DeleteLocalInt(oBinder, "TenebrousVoidStrike"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ReapplyTenebrous(object oBinder)
|
||
|
{
|
||
|
SetLocalInt(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE, TRUE);
|
||
|
SetLocalObject(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE, oBinder);
|
||
|
DoBindingCheck(oBinder, 18);
|
||
|
DelayCommand(0.1, ApplyVestige(oBinder, VESTIGE_TENEBROUS)); // Tenebrous vestiges.2da rowid
|
||
|
DelayCommand(1.0, DeleteLocalInt(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE));
|
||
|
DelayCommand(1.0, DeleteLocalObject(GetModule(), PRC_SPELL_TARGET_OBJECT_OVERRIDE));
|
||
|
}
|
||
|
|
||
|
void SavnokInfluence(object oBinder, object oItem)
|
||
|
{
|
||
|
if (GetItemACValue(oItem) && !GetLocalInt(oBinder, "SavnokDelay"))
|
||
|
{
|
||
|
int nBase = GetBaseItemType(oItem);
|
||
|
AssignCommand(oBinder, ClearAllActions());
|
||
|
if (nBase == BASE_ITEM_SMALLSHIELD || nBase == BASE_ITEM_LARGESHIELD || nBase == BASE_ITEM_TOWERSHIELD)
|
||
|
AssignCommand(oBinder, ActionEquipItem(oItem, INVENTORY_SLOT_LEFTHAND));
|
||
|
if (nBase == BASE_ITEM_ARMOR)
|
||
|
AssignCommand(oBinder, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||
|
|
||
|
SetLocalInt(oBinder, "SavnokDelay", TRUE);
|
||
|
DelayCommand(0.5, DeleteLocalInt(oBinder, "SavnokDelay"));
|
||
|
DelayCommand(0.5, ExecuteScript("prc_speed", oBinder));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ExpelledVestigeCleanup(object oBinder)
|
||
|
{
|
||
|
if (!GetHasSpellEffect(VESTIGE_ANDROMALIUS, oBinder))
|
||
|
{
|
||
|
DeleteLocalInt(oBinder, "AndroSneak");
|
||
|
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oBinder));
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_MALPHAS, oBinder))
|
||
|
{
|
||
|
DeleteLocalInt(oBinder, "MalphasSneak");
|
||
|
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oBinder));
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_FOCALOR, oBinder))
|
||
|
{
|
||
|
PRCRemoveSpellEffects(VESTIGE_FOCALOR_AURA_SADNESS, oBinder, oBinder);
|
||
|
PRCRemoveSpellEffects(VESTIGE_FOCALOR_AURA_SADNESS, oBinder, oBinder);
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_RONOVE, oBinder))
|
||
|
{
|
||
|
DeleteLocalInt(oBinder, "RonovesFists");
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_SAVNOK, oBinder) && GetIsObjectValid(GetItemPossessedBy(oBinder, "SavnokCallArmor")))
|
||
|
{
|
||
|
object oArmor = GetItemPossessedBy(oBinder, "SavnokCallArmor");
|
||
|
SetPlotFlag(oArmor, FALSE);
|
||
|
DestroyObject(oArmor);
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && GetIsObjectValid(GetItemPossessedBy(oBinder, "bnd_eury_hammer")))
|
||
|
{
|
||
|
object oHammer = GetItemPossessedBy(oBinder, "bnd_eury_hammer");
|
||
|
SetPlotFlag(oHammer, FALSE);
|
||
|
AssignCommand(oHammer, SetIsDestroyable(TRUE, TRUE, TRUE));
|
||
|
DestroyObject(oHammer);
|
||
|
}
|
||
|
// Using Disguise Self strips the hide of all the vestige feats, this reapplies them
|
||
|
// Checks for having naberius, but not the disguise self feat
|
||
|
if (GetHasSpellEffect(VESTIGE_NABERIUS, oBinder) && !GetHasFeat(9033, oBinder))
|
||
|
{
|
||
|
int i;
|
||
|
for(i = VESTIGE_AMON; i <= VESTIGE_ABYSM; i++)
|
||
|
{
|
||
|
if(GetHasSpellEffect(i, oBinder))
|
||
|
{
|
||
|
ApplyVestige(oBinder, i);
|
||
|
//FloatingTextStringOnCreature("Applying vestige "+IntToString(i), oBinder, FALSE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (!GetHasSpellEffect(VESTIGE_ACERERAK, oBinder)) DeleteLocalInt(oBinder, "AcererakHealing");
|
||
|
if (!GetHasSpellEffect(VESTIGE_ARETE, oBinder))
|
||
|
{
|
||
|
PRCRemoveSpellEffects(VESTIGE_ARETE_RESIST, oBinder, oBinder);
|
||
|
GZPRCRemoveSpellEffects(VESTIGE_ARETE_RESIST, oBinder, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ChupoclopsEth(object oBinder)
|
||
|
{
|
||
|
// Check to see if the WP is valid
|
||
|
string sWPTag = "bnd_eventsWP_" + GetName(oBinder);
|
||
|
object oTestWP = GetWaypointByTag(sWPTag);
|
||
|
if (!GetIsObjectValid(oTestWP))
|
||
|
{
|
||
|
// Create waypoint for the movement
|
||
|
CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(oBinder), FALSE, sWPTag);
|
||
|
if(DEBUG) DoDebug("bnd_events: Chupoclops WP for " + DebugObject2Str(oBinder) + " didn't exist, creating. Tag: " + sWPTag);
|
||
|
}
|
||
|
else // We have a test waypoint, now to check the distance
|
||
|
{
|
||
|
// Distance moved in the last round
|
||
|
float fDist = GetDistanceBetween(oBinder, oTestWP);
|
||
|
// Distance needed to move
|
||
|
float fCheck = FeetToMeters(10.0);
|
||
|
|
||
|
// Now clean up the WP and create a new one for next round's check
|
||
|
DestroyObject(oTestWP);
|
||
|
CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(oBinder), FALSE, sWPTag);
|
||
|
|
||
|
if(DEBUG) DoDebug("bnd_events: Moved enough: " + DebugBool2String(fDist >= fCheck));
|
||
|
|
||
|
// Moved too far or in combat
|
||
|
if (fDist >= fCheck || GetIsInCombat(oBinder))
|
||
|
{
|
||
|
PRCRemoveSpellEffects(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder, oBinder);
|
||
|
GZPRCRemoveSpellEffects(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder, FALSE);
|
||
|
BindAbilCooldown(oBinder, VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, VESTIGE_CHUPOCLOPS);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ShaxStormStrike(object oBinder, object oTarget)
|
||
|
{
|
||
|
if (!GetLocalInt(oBinder, "ShaxStormStrike"))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_SONIC), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SONIC), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_ELECTRICAL), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
|
||
|
SetLocalInt(oBinder, "ShaxStormStrike", TRUE);
|
||
|
DelayCommand(4.5, DeleteLocalInt(oBinder, "ShaxStormStrike"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void VanusDisdain(object oBinder, object oTarget)
|
||
|
{
|
||
|
if (GetHitDice(oBinder) > GetHitDice(oTarget))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_DIVINE), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void VanusInfluence(object oBinder)
|
||
|
{
|
||
|
if (!GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_VANUS)))
|
||
|
{
|
||
|
int nCombat = GetLocalInt(oBinder, "VanusInfluence");
|
||
|
int nCurrent = GetIsInCombat(oBinder);
|
||
|
// We just left combat
|
||
|
if (nCurrent == FALSE && nCombat == TRUE)
|
||
|
{
|
||
|
SetCutsceneMode(oBinder, TRUE);
|
||
|
FloatingTextStringOnCreature("Victory over my enemies!", oBinder);
|
||
|
AssignCommand(oBinder, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 6.0));
|
||
|
DelayCommand(6.0, SetCutsceneMode(oBinder, FALSE));
|
||
|
}
|
||
|
//FloatingTextStringOnCreature("Vanus Combat State "+IntToString(nCurrent), oBinder);
|
||
|
SetLocalInt(oBinder, "VanusInfluence", nCurrent);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CityDweller(object oBinder)
|
||
|
{
|
||
|
object oArea = GetArea(oBinder);
|
||
|
// Urban environment, so not natural and aboveground
|
||
|
if (GetIsAreaNatural(oArea) != AREA_NATURAL && GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND)
|
||
|
{
|
||
|
SetLocalInt(oBinder, "DesharisSpeed", TRUE);
|
||
|
ExecuteScript("prc_speed", oBinder);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DeleteLocalInt(oBinder, "DesharisSpeed");
|
||
|
ExecuteScript("prc_speed", oBinder);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EligorChromatic(object oBinder, object oTarget)
|
||
|
{
|
||
|
if (!GetLocalInt(oBinder, "EligorStrikeTimer"))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), GetLocalInt(oBinder, "EligorStrike")), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FAERIE_FIRE), oTarget);
|
||
|
SetLocalInt(oBinder, "EligorStrikeTimer", TRUE);
|
||
|
DelayCommand(4.5, DeleteLocalInt(oBinder, "EligorStrikeTimer"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void MarchosiasRetribution(object oBinder, object oTarget)
|
||
|
{
|
||
|
// Skirmish or sneak attack
|
||
|
if (GetLevelByClass(CLASS_TYPE_SCOUT, oTarget) || GetTotalSneakAttackDice(oTarget))
|
||
|
{
|
||
|
if (GetDistanceBetween(oBinder, oTarget) < FeetToMeters(30.0))
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(3), DAMAGE_TYPE_FIRE), oTarget);
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SPARKS), oTarget);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
All of this below here is for the Karsite suppress item ability
|
||
|
*/
|
||
|
|
||
|
void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats);
|
||
|
|
||
|
object GetChest(object oCreature)
|
||
|
{
|
||
|
object oChest = GetObjectByTag("npf_chest" + ObjectToString(oCreature));
|
||
|
if(oChest == OBJECT_INVALID)
|
||
|
{
|
||
|
object oWP = GetWaypointByTag("npf_wp_chest_sp");
|
||
|
oChest = CreateObject(OBJECT_TYPE_PLACEABLE, "npf_keep_chest", GetLocation(oWP), FALSE,
|
||
|
"npf_chest" + ObjectToString(oCreature));
|
||
|
}
|
||
|
return oChest;
|
||
|
}
|
||
|
|
||
|
void RemoveAllProperties(object oItem, object oPC)
|
||
|
{
|
||
|
if(DEBUG) DoDebug("ture_utr_supitem: About to remove properties from item: " + DebugObject2Str(oItem));
|
||
|
|
||
|
if(oItem == OBJECT_INVALID)
|
||
|
return;
|
||
|
|
||
|
int nType = GetBaseItemType(oItem);
|
||
|
if(nType == BASE_ITEM_TORCH
|
||
|
|| nType == BASE_ITEM_TRAPKIT
|
||
|
|| nType == BASE_ITEM_HEALERSKIT
|
||
|
|| nType == BASE_ITEM_GRENADE
|
||
|
|| nType == BASE_ITEM_THIEVESTOOLS
|
||
|
|| nType == BASE_ITEM_CRAFTMATERIALMED
|
||
|
|| nType == BASE_ITEM_CRAFTMATERIALSML
|
||
|
|| nType == 112)//craftbase
|
||
|
return;
|
||
|
|
||
|
object oWP = GetWaypointByTag("npf_wp_chest_sp");
|
||
|
|
||
|
// Generate UID
|
||
|
int nKey = GetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter") + 1;
|
||
|
SetLocalInt(GetModule(), "PRC_NullPsionicsField_Item_UID_Counter", nKey);
|
||
|
string sKey = IntToString(nKey);
|
||
|
if(DEBUG) DoDebug("prc_pow_npfent: Removing itemproperties from item " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' of creature " + DebugObject2Str(oPC));
|
||
|
|
||
|
//object oChest = GetChest(oPC);
|
||
|
//object oCopy = CopyObject(oItem, GetLocation(oChest), oChest);
|
||
|
|
||
|
// copying original item to a secluded waypoint in the area
|
||
|
// and giving it a tag that contains the key string
|
||
|
object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "npf_item" + sKey);
|
||
|
|
||
|
//storing the key value on the original item (key value would point to the copy item)
|
||
|
SetLocalString(oItem, "PRC_NullPsionicsField_Item_UID", sKey);
|
||
|
|
||
|
//SetLocalObject(oItem, "ITEM_CHEST", oChest); // so the chest can be found
|
||
|
//SetLocalObject(oChest, sKey, oCopy); // and referenced in the chest
|
||
|
|
||
|
// Stripping original item from all properties
|
||
|
itemproperty ip = GetFirstItemProperty(oItem);
|
||
|
while(GetIsItemPropertyValid(ip))
|
||
|
{
|
||
|
RemoveItemProperty(oItem, ip);
|
||
|
ip = GetNextItemProperty(oItem);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void RestoreAllProperties(object oItem, object oPC, int nSlot = -1)
|
||
|
{
|
||
|
if(DEBUG) DoDebug("psi_pow_npfext: Attempting to restore itemproperties to: " + DebugObject2Str(oItem));
|
||
|
|
||
|
if(oPC != OBJECT_INVALID) // this is a pc object that has an item in inventory slot or normal inventory
|
||
|
{
|
||
|
if(oItem == OBJECT_INVALID)
|
||
|
oItem = GetItemInSlot(nSlot, oPC);
|
||
|
if(oItem == OBJECT_INVALID)
|
||
|
return;
|
||
|
}
|
||
|
//object oChest = GetLocalObject(oItem, "ITEM_CHEST");
|
||
|
// getting the key value - this points to the tag of the copy item
|
||
|
string sKey = GetLocalString(oItem, "PRC_NullPsionicsField_Item_UID");
|
||
|
// retrieving the copy item that is in this area
|
||
|
object oOriginalItem = GetObjectByTag("npf_item" + sKey);
|
||
|
if(DEBUG) DoDebug("psi_pow_npfext: Restoring itemproperties to item: " + DebugObject2Str(oItem) + " with key value of '" + sKey + "' for creature " + DebugObject2Str(oPC));
|
||
|
|
||
|
//object oOriginalItem = GetLocalObject(oChest, sKey);
|
||
|
|
||
|
object oNewItem;
|
||
|
if(oOriginalItem != OBJECT_INVALID) // item has not been restored yet
|
||
|
{
|
||
|
// replace current item with original
|
||
|
IPCopyItemProperties(oOriginalItem, oItem);
|
||
|
DestroyObject(oOriginalItem); // destroy dup item on player
|
||
|
//DeleteLocalObject(oChest, GetResRef(oItem)); // so it won't be restored again
|
||
|
DeleteLocalString(oItem, "PRC_NullPsionicsField_Item_UID");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SuppressItem(object oTrueSpeaker, object oTarget, int nBeats)
|
||
|
{
|
||
|
// Break if they fail concentration or it runs out
|
||
|
if (GetBreakConcentrationCheck(oTrueSpeaker) || nBeats == 0) return;
|
||
|
|
||
|
// Remove and restore the properties
|
||
|
RemoveAllProperties(oTarget, GetItemPossessor(oTarget));
|
||
|
// Has to run before RemoveAll is called again
|
||
|
DelayCommand(5.8, RestoreAllProperties(oTarget, GetItemPossessor(oTarget)));
|
||
|
|
||
|
// Apply VFX
|
||
|
effect eImp = EffectVisualEffect(VFX_IMP_PULSE_BOMB);
|
||
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, GetItemPossessor(oTarget));
|
||
|
|
||
|
DelayCommand(6.0, SuppressItem(oTrueSpeaker, oTarget, nBeats - 1));
|
||
|
}
|
||
|
|
||
|
void KarsiteOnHit(object oBinder, object oTarget)
|
||
|
{
|
||
|
// If the target succeeds, bail
|
||
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, 10 + GetAbilityModifier(ABILITY_CHARISMA, oBinder), SAVING_THROW_TYPE_NONE)) return;
|
||
|
|
||
|
object oItem;
|
||
|
|
||
|
// If the right hand isn't suppressed, that gets priority
|
||
|
if (!GetLocalInt(oTarget, "KarsiteSuppressRight"))
|
||
|
{
|
||
|
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
||
|
SuppressItem(oBinder, oItem, 1);
|
||
|
SetLocalInt(oTarget, "KarsiteSuppressRight", TRUE);
|
||
|
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressRight"));
|
||
|
}
|
||
|
else if (!GetLocalInt(oTarget, "KarsiteSuppressChest"))
|
||
|
{
|
||
|
oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||
|
SuppressItem(oBinder, oItem, 1);
|
||
|
SetLocalInt(oTarget, "KarsiteSuppressChest", TRUE);
|
||
|
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressChest"));
|
||
|
}
|
||
|
else if (!GetLocalInt(oTarget, "KarsiteSuppressLeft"))
|
||
|
{
|
||
|
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
||
|
SuppressItem(oBinder, oItem, 1);
|
||
|
SetLocalInt(oTarget, "KarsiteSuppressLeft", TRUE);
|
||
|
DelayCommand(5.8, DeleteLocalInt(oTarget, "KarsiteSuppressLeft"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////
|
||
|
/* Void Main and Event Triggers */
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
int nEvent = GetRunningEvent();
|
||
|
if(DEBUG) DoDebug("bnd_events running, event: " + IntToString(nEvent));
|
||
|
|
||
|
// Get the PC. This is event-dependent
|
||
|
object oBinder;
|
||
|
switch(nEvent)
|
||
|
{
|
||
|
case EVENT_ITEM_ONHIT: oBinder = OBJECT_SELF; break;
|
||
|
case EVENT_ONPLAYEREQUIPITEM: oBinder = GetItemLastEquippedBy(); break;
|
||
|
case EVENT_ONPLAYERUNEQUIPITEM: oBinder = GetItemLastUnequippedBy(); break;
|
||
|
case EVENT_ONHEARTBEAT: oBinder = OBJECT_SELF; break;
|
||
|
case EVENT_ONPLAYERREST_FINISHED: oBinder = GetLastBeingRested(); break;
|
||
|
case EVENT_ONACQUIREITEM: oBinder = GetModuleItemAcquiredBy(); break;
|
||
|
|
||
|
default:
|
||
|
oBinder = OBJECT_SELF;
|
||
|
}
|
||
|
|
||
|
object oItem;
|
||
|
object oSkin = GetPCSkin(oBinder);
|
||
|
|
||
|
// We aren't being called from any event, instead from EvalPRCFeats
|
||
|
if(nEvent == FALSE)
|
||
|
{
|
||
|
// Hook in the events
|
||
|
if(DEBUG) DoDebug("bnd_events: Adding eventhooks");
|
||
|
AddEventScript(oBinder, EVENT_ONPLAYEREQUIPITEM, "bnd_events", TRUE, FALSE);
|
||
|
AddEventScript(oBinder, EVENT_ONPLAYERUNEQUIPITEM, "bnd_events", TRUE, FALSE);
|
||
|
AddEventScript(oBinder, EVENT_ONHEARTBEAT, "bnd_events", TRUE, FALSE);
|
||
|
AddEventScript(oBinder, EVENT_ONPLAYERREST_FINISHED, "bnd_events", TRUE, FALSE);
|
||
|
AddEventScript(oBinder, EVENT_ONACQUIREITEM , "bnd_events", TRUE, FALSE);
|
||
|
|
||
|
if (GetHasSpellEffect(VESTIGE_RONOVE, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_RONOVE_FISTS))
|
||
|
{
|
||
|
SetLocalInt(oBinder, CALL_UNARMED_FEATS, TRUE);
|
||
|
SetLocalInt(oBinder, CALL_UNARMED_FISTS, TRUE);
|
||
|
}
|
||
|
}
|
||
|
else if(nEvent == EVENT_ITEM_ONHIT)
|
||
|
{
|
||
|
oItem = GetSpellCastItem();
|
||
|
object oTarget = PRCGetSpellTargetObject();
|
||
|
if(DEBUG) DoDebug("bnd_events: OnHit:\n"
|
||
|
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
|
||
|
+ "oItem = " + DebugObject2Str(oItem) + "\n"
|
||
|
+ "oTarget = " + DebugObject2Str(oTarget) + "\n"
|
||
|
);
|
||
|
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
||
|
{
|
||
|
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_HALO_FIRE))
|
||
|
AymHaloOfFire(oBinder, oTarget);
|
||
|
if (GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_POISON))
|
||
|
EurynomePoisonBlood(oBinder, oTarget);
|
||
|
}
|
||
|
else // This is always a weapon
|
||
|
{
|
||
|
if (GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) VanusDisdain(oBinder, oTarget);
|
||
|
if (GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) MarchosiasRetribution(oBinder, oTarget);
|
||
|
}
|
||
|
// Melee weapon checks
|
||
|
if(IPGetIsMeleeWeapon(oItem))
|
||
|
{
|
||
|
if (GetHasSpellEffect(VESTIGE_TENEBROUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_TENEBROUS_TOUCH_VOID)) TenebrousVoid(oBinder, oTarget);
|
||
|
if (GetHasSpellEffect(VESTIGE_SHAX, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_SHAX_STORM_STRIKE)) ShaxStormStrike(oBinder, oTarget);
|
||
|
if (GetHasSpellEffect(VESTIGE_ELIGOR, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_ELIGOR_STRIKE)) EligorChromatic(oBinder, oTarget);
|
||
|
if (GetRacialType(oBinder) == RACIAL_TYPE_KARSITE) KarsiteOnHit(oBinder, oTarget);
|
||
|
}
|
||
|
}// end if - Running OnHit event
|
||
|
else if(nEvent == EVENT_ONPLAYEREQUIPITEM)
|
||
|
{
|
||
|
oItem = GetItemLastEquipped();
|
||
|
if(DEBUG) DoDebug("bnd_events - OnEquip\n"
|
||
|
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
|
||
|
+ "oItem = " + DebugObject2Str(oItem) + "\n"
|
||
|
);
|
||
|
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
||
|
{
|
||
|
// Can't get Aym from Bind Vestige feat
|
||
|
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_HALO_FIRE) ||
|
||
|
(GetHasSpellEffect(VESTIGE_EURYNOME, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_EURYNOME_POISON)) )
|
||
|
{
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||
|
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
}
|
||
|
}
|
||
|
// Melee weapon checks
|
||
|
if(IPGetIsMeleeWeapon(oItem))
|
||
|
{
|
||
|
if (GetHasSpellEffect(VESTIGE_AYM, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && GetBinderLevel(oBinder, VESTIGE_AYM) >= 10 && !GetIsVestigeExploited(oBinder, VESTIGE_AYM_RUINOUS_ATTACK))
|
||
|
{
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(5), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
}
|
||
|
if (GetHasSpellEffect(VESTIGE_RONOVE, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_RONOVE_COLD_IRON))
|
||
|
{
|
||
|
int nBonus = 1;
|
||
|
if (GetBinderLevel(oBinder, VESTIGE_RONOVE) >= 7) nBonus = 3;
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(nBonus), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
}
|
||
|
if ((GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) ||
|
||
|
(GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) ||
|
||
|
(GetRacialType(oBinder) == RACIAL_TYPE_KARSITE))
|
||
|
{
|
||
|
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
|
}
|
||
|
}
|
||
|
// Any weapon
|
||
|
if (GetIsWeapon(oItem))
|
||
|
{
|
||
|
if (GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder))
|
||
|
{
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(3), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(3), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
}
|
||
|
}
|
||
|
if (GetWeaponRanged(oItem))
|
||
|
{
|
||
|
if ((GetHasSpellEffect(VESTIGE_VANUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_VANUS_DISDAIN)) ||
|
||
|
(GetHasSpellEffect(VESTIGE_MARCHOSIAS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_MARCHOSIAS_RETRIBUTION)) )
|
||
|
{
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
|
AddEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
|
||
|
object oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oBinder);
|
||
|
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
|
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
|
||
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oBinder);
|
||
|
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
|
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
|
||
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oBinder);
|
||
|
IPSafeAddItemProperty(oAmmo, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||
|
AddEventScript(oAmmo, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// We are called from the OnPlayerUnEquipItem eventhook. Remove OnHitCast: Unique Power from oBinder's weapon
|
||
|
else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
|
||
|
{
|
||
|
oItem = GetItemLastUnequipped();
|
||
|
if(DEBUG) DoDebug("bnd_events - OnUnEquip\n"
|
||
|
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
|
||
|
+ "oItem = " + DebugObject2Str(oItem) + "\n"
|
||
|
);
|
||
|
|
||
|
if (GetHasSpellEffect(VESTIGE_SAVNOK, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_SAVNOK)))
|
||
|
{
|
||
|
SavnokInfluence(oBinder, oItem);
|
||
|
}
|
||
|
|
||
|
// Only applies to armours
|
||
|
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR)
|
||
|
{
|
||
|
// Remove the temporary OnHitCastSpell: Unique
|
||
|
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", 1, DURATION_TYPE_TEMPORARY);
|
||
|
}
|
||
|
// Clean up weapons
|
||
|
if(GetIsWeapon(oItem))
|
||
|
{
|
||
|
// Remove the attack bonus
|
||
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
|
||
|
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "bnd_events", TRUE, FALSE);
|
||
|
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
object oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oBinder);
|
||
|
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BULLETS, oBinder);
|
||
|
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oBinder);
|
||
|
RemoveSpecificProperty(oAmmo, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
|
||
|
}
|
||
|
}
|
||
|
else if(nEvent == EVENT_ONHEARTBEAT)
|
||
|
{
|
||
|
ExpelledVestigeCleanup(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_NABERIUS, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_NABERIUS_ABILITY_HEALING)) NaberiusHeal(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_HAAGENTI, oBinder)) HaagentiTrans(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_PAIMON, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_PAIMON_BLADES))
|
||
|
{
|
||
|
int nType = GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oBinder));
|
||
|
if (nType == BASE_ITEM_RAPIER || nType == BASE_ITEM_SHORTSWORD)
|
||
|
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_FINESSE), 5.999, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||
|
}
|
||
|
if (GetHasSpellEffect(VESTIGE_ANDRAS, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_ANDRAS))) AndrasInfluence(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_TENEBROUS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_TENEBROUS_SEE_DARKNESS)) ActionCastSpellOnSelf(SPELL_DARKVISION);
|
||
|
if (GetHasSpellEffect(VESTIGE_GERYON, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_GERYON_DARKNESS)) ActionCastSpellOnSelf(SPELL_DARKVISION);
|
||
|
if (GetIsPatronVestigeBound(oBinder) && GetLevelByClass(CLASS_TYPE_KNIGHT_SACRED_SEAL, oBinder) >= 5)
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageReduction(10, DAMAGE_POWER_PLUS_ONE), oBinder, 6.0);
|
||
|
IPSafeAddItemProperty(oSkin, ItemPropertyBonusFeat(IP_CONST_FEAT_OUTSIDER_RACIAL_TYPE), 5.999, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
||
|
}
|
||
|
if (GetHasSpellEffect(VESTIGE_CHUPOCLOPS_ETHEREAL_WATCHER, oBinder)) ChupoclopsEth(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_VANUS, oBinder)) VanusInfluence(oBinder);
|
||
|
if (GetHasSpellEffect(VESTIGE_DESHARIS, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_DESHARIS_CITY_DWELLER)) CityDweller(oBinder);
|
||
|
}
|
||
|
else if(nEvent == EVENT_ONPLAYERREST_FINISHED)
|
||
|
{
|
||
|
if (GetHasFeat(FEAT_RAPID_PACT_MAKING, oBinder)) DeleteLocalInt(oBinder, "RapidPactMaking");
|
||
|
// Naberius's Skills
|
||
|
int i;
|
||
|
for(i = 0; i < 40 ; i++)
|
||
|
DeleteLocalInt(oBinder, "NaberiusSkill"+IntToString(i));
|
||
|
DeleteLocalInt(oBinder, "RonovesFists");
|
||
|
DeleteLocalInt(oBinder, "AndrasMount");
|
||
|
DeleteLocalInt(oBinder, "AmonRam");
|
||
|
DeleteLocalInt(oBinder, "ExploitVestige");
|
||
|
if (GetLevelByClass(CLASS_TYPE_ANIMA_MAGE, oBinder))
|
||
|
{
|
||
|
SetLocalInt(oBinder, "BinderRested", TRUE);
|
||
|
DelayCommand(30.0, DeleteLocalInt(oBinder, "BinderRested"));
|
||
|
}
|
||
|
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_KARSUS_DISPEL));
|
||
|
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_TENEBROUS_FLICKER));
|
||
|
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_DANTALION_TRAVEL_SPELL));
|
||
|
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(VESTIGE_THE_TRIAD_SMITE));
|
||
|
DeleteLocalInt(oBinder, "PRC_WoLUses" + IntToString(19139));
|
||
|
DeleteLocalInt(oBinder, "ZceryllTS");
|
||
|
if (GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oBinder)) ReapplyTenebrous(oBinder);
|
||
|
}
|
||
|
else if(nEvent == EVENT_ONACQUIREITEM)
|
||
|
{
|
||
|
oItem = GetModuleItemAcquired();
|
||
|
if(DEBUG) DoDebug("bnd_events - OnAcquire\n"
|
||
|
+ "oBinder = " + DebugObject2Str(oBinder) + "\n"
|
||
|
+ "oItem = " + DebugObject2Str(oItem) + "\n"
|
||
|
);
|
||
|
|
||
|
if (GetHasSpellEffect(VESTIGE_ANDROMALIUS, oBinder) && !GetLocalInt(oBinder, "PactQuality"+IntToString(VESTIGE_ANDROMALIUS)))
|
||
|
{
|
||
|
if (GetStolenFlag(oItem))
|
||
|
{
|
||
|
FloatingTextStringOnCreature("Andromalius prevents you from taking a stolen item!", oBinder, FALSE);
|
||
|
AssignCommand(oBinder, ActionPutDownItem(oItem));
|
||
|
DelayCommand(2.0, CheckIsDropped(oBinder, oItem));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (GetHasSpellEffect(VESTIGE_KARSUS, oBinder) && GetLevelByClass(CLASS_TYPE_BINDER, oBinder) && !GetIsVestigeExploited(oBinder, VESTIGE_KARSUS_WILL))
|
||
|
{
|
||
|
int nType = GetBaseItemType(oItem);
|
||
|
if(nType == BASE_ITEM_MAGICWAND || nType == BASE_ITEM_ENCHANTED_WAND || nType == BASE_ITEM_MAGICSTAFF || nType == BASE_ITEM_CRAFTED_STAFF || nType == BASE_ITEM_BLANK_WAND || nType == BASE_ITEM_MAGICROD || nType == BASE_ITEM_CRAFTED_ROD)
|
||
|
{
|
||
|
IPSafeAddItemProperty(oItem, ItemPropertyLimitUseByClass(CLASS_TYPE_BINDER), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|