forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
126 lines
5.0 KiB
Plaintext
126 lines
5.0 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: OnHit Armor maintainer
|
|
//:: prc_keep_onhit_a
|
|
//::///////////////////////////////////////////////
|
|
/** @file
|
|
A script for keeping OnHitCastSpell: Unique
|
|
itemproperty on whatever is the creature's
|
|
current armor or if no armor is present,
|
|
on the hide. The intent is to have this
|
|
script take care of the issues related
|
|
to maintaining the presence of an OnHit
|
|
virtual event for the creature.
|
|
|
|
Note that the hooking is intended to be
|
|
permanent, so that from the point this script
|
|
is first called, it will always keep the
|
|
property active on the creature.
|
|
|
|
@author Ornedan
|
|
@date Created - 2005.11.18
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_alterations"
|
|
|
|
void AddProperty(object oItem)
|
|
{
|
|
// Paranoia check - there are ways to get the item off a creature without triggering Unequip
|
|
if(!GetLocalInt(oItem, "PRC_OnHitKeeper_Marker"))
|
|
{
|
|
// Determine whether the item already has the OnHitCastSpell itemproperty
|
|
if(GetItemHasItemProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL))
|
|
{
|
|
// Get the itemproperty
|
|
itemproperty ipOHCS = GetFirstItemProperty(oItem);
|
|
while(GetIsItemPropertyValid(ipOHCS) && GetItemPropertyType(ipOHCS) != ITEM_PROPERTY_ONHITCASTSPELL)
|
|
ipOHCS = GetNextItemProperty(oItem);
|
|
|
|
// Is it permanent? If it's temporary, we don't need to care about it, since it'd die off in the next few hundred years anyway :P
|
|
if(GetItemPropertyDurationType(ipOHCS) == DURATION_TYPE_PERMANENT)
|
|
{
|
|
// Set the old itemproperty marker
|
|
SetLocalInt(oItem, "PRC_OnHitKeeper_ItemAlreadyHadProperty", TRUE);
|
|
// Store the itemproperty's date for restoration later on
|
|
SetLocalInt(oItem, "PRC_OnHitKeeper_OldIP_SubType", GetItemPropertySubType(ipOHCS));
|
|
SetLocalInt(oItem, "PRC_OnHitKeeper_OldIP_CostTableValue", GetItemPropertyCostTableValue(ipOHCS) + 1);
|
|
}
|
|
}
|
|
|
|
// Add the itemproperty
|
|
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1),
|
|
0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
|
|
|
// Add a marker to note that the item has been handled
|
|
SetLocalInt(oItem, "PRC_OnHitKeeper_Marker", TRUE);
|
|
}
|
|
}
|
|
|
|
void main()
|
|
{
|
|
int nEvent = GetRunningEvent();
|
|
|
|
// OnEquip event
|
|
if(nEvent == EVENT_ONPLAYEREQUIPITEM)
|
|
{
|
|
object oItem = GetItemLastEquipped();
|
|
object oEquipper = GetItemLastEquippedBy();
|
|
if(GetItemInSlot(INVENTORY_SLOT_CHEST, oEquipper) == oItem)
|
|
AddProperty(oItem);
|
|
}
|
|
// OnUnEquip event
|
|
else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
|
|
{
|
|
object oItem = GetItemLastUnequipped();
|
|
object oUnEquipper = GetItemLastUnequippedBy();
|
|
|
|
// No need to check slot here, just the marker local variable is enough
|
|
if(GetLocalInt(oItem, "PRC_OnHitKeeper_Marker"))
|
|
{
|
|
// Remove the current property
|
|
RemoveSpecificProperty(oItem,
|
|
ITEM_PROPERTY_ONHITCASTSPELL,
|
|
IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER,
|
|
0,
|
|
1,
|
|
"",
|
|
-1,
|
|
DURATION_TYPE_PERMANENT);
|
|
// Restore the old property if such existed
|
|
if(GetLocalInt(oItem, "PRC_OnHitKeeper_ItemAlreadyHadProperty"))
|
|
{
|
|
itemproperty ip = ItemPropertyOnHitCastSpell(GetLocalInt(oItem, "PRC_OnHitKeeper_OldIP_SubType"),
|
|
GetLocalInt(oItem, "PRC_OnHitKeeper_OldIP_CostTableValue")
|
|
);
|
|
IPSafeAddItemProperty(oItem, ip, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
|
|
|
// Cleanup
|
|
DeleteLocalInt(oItem, "PRC_OnHitKeeper_ItemAlreadyHadProperty");
|
|
DeleteLocalInt(oItem, "PRC_OnHitKeeper_OldIP_SubType");
|
|
DeleteLocalInt(oItem, "PRC_OnHitKeeper_OldIP_CostTableValue");
|
|
}
|
|
|
|
// Cleanup
|
|
DeleteLocalInt(oItem, "PRC_OnHitKeeper_Marker");
|
|
}
|
|
}
|
|
// Hook the evenscripts and do initial itemproperty additions
|
|
else
|
|
{
|
|
object oCreature = OBJECT_SELF;
|
|
|
|
// Set the eventhooks
|
|
AddEventScript(oCreature, EVENT_ONPLAYEREQUIPITEM, "prc_keep_onhit_a", TRUE, FALSE);
|
|
AddEventScript(oCreature, EVENT_ONPLAYERUNEQUIPITEM, "prc_keep_onhit_a", TRUE, FALSE);
|
|
|
|
// Add the property to the hide and current armor
|
|
object oSkin = GetPCSkin(oCreature);
|
|
AddProperty(oSkin);
|
|
|
|
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
|
|
if(GetIsObjectValid(oArmor))
|
|
AddProperty(oArmor);
|
|
}
|
|
}
|