Further file organization
Further file organization
This commit is contained in:
125
nwn/nwnprc/trunk/scripts/prc_keep_onhit_a.nss
Normal file
125
nwn/nwnprc/trunk/scripts/prc_keep_onhit_a.nss
Normal file
@@ -0,0 +1,125 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user