PRC8/nwn/nwnprc/trunk/scripts/prc_bn_prj_event.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

111 lines
3.8 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Baelnorn Projection - Eventhooks
//:: prc_bn_prj_event
//::///////////////////////////////////////////////
/**
This script prevents a Baelnorn using Projection
from picking up items. It forces an
ActionPutDownItem repeatedly until the item is
dropped.
This script is fired via eventhook from the
OnAcquire event.
Possible problems
- The dropping may be workable around somehow.
- Might be replaced by a copy of the item to
ground and deletion of the original
- This has it's own problems. It will at the
very least break any object references to
the item.
@author Ornedan
@date Created - 2005.05.18
@date Modified - 2005.11.04
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_alterations"
const float DROP_DELAY = 2.0f;
// A pseudo-hb function that checks if the item has been dropped yet
// If it hasn't, clears action queue and queues another drop.
void CheckIsDropped(object oCreature, object oItem)
{
if(DEBUG) DoDebug("prc_bn_prj_event: CheckIsDropped()");
if(GetItemPossessor(oItem) == oCreature)
{
if(DEBUG) DoDebug("prc_bn_prj_event:GetItemPosessor(oItem) == oCreature");
// 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(oCreature, ClearAllActions());
AssignCommand(oCreature, ActionPutDownItem(oItem));
DelayCommand(DROP_DELAY, CheckIsDropped(oCreature, oItem));
}
}
void main()
{
int nEvent = GetRunningEvent();
object oPC, oItem;
if(DEBUG) DoDebug("prc_bn_prj_event running, event = " + IntToString(nEvent));
switch(nEvent)
{
// Nerf equipped weapons
case EVENT_ONPLAYEREQUIPITEM:
oPC = GetItemLastEquippedBy();
oItem = GetItemLastEquipped();
if(DEBUG) DoDebug("Equipped item, nerfing:"
+ "oPC = " + DebugObject2Str(oItem) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem))
{
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyNoDamage(), oItem);
array_set_object(oPC, "PRC_BaelnornProj_Nerfed", array_get_size(oPC, "PRC_BaelnornProj_Nerfed"), oItem);
}
break;
/*case EVENT_ONPLAYERUNEQUIPITEM:
break;*/
case EVENT_ONACQUIREITEM:
oPC = GetModuleItemAcquiredBy();
oItem = GetModuleItemAcquired();
AssignCommand(oPC, ActionPutDownItem(oItem));
DelayCommand(DROP_DELAY, CheckIsDropped(oPC, oItem));
break;
/*case EVENT_ONUNAQUIREITEM:
break;*/
case EVENT_ONPLAYERREST_STARTED:
oPC = GetLastBeingRested();
// Signal the projection monitoring HB
SetLocalInt(oPC, "PRC_BaelnornProjection_Abort", TRUE);
break;
case EVENT_ONCLIENTENTER:
object oPC = GetEnteringObject();
// Remove eventhooks
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, "prc_bn_prj_event", TRUE, FALSE); // OnEquip
RemoveEventScript(oPC, EVENT_ONACQUIREITEM, "prc_bn_prj_event", TRUE, FALSE); // OnAcquire
RemoveEventScript(oPC, EVENT_ONPLAYERREST_STARTED, "prc_bn_prj_event", FALSE, FALSE); // OnRest
RemoveEventScript(oPC, EVENT_ONCLIENTENTER, "prc_bn_prj_event", TRUE, FALSE); //OnClientEnter
break;
/*default:
if(DEBUG) DoDebug("prc_bn_prj_event: ERROR: Called for unhandled event: " + IntToString(nEvent));
return;*/
}
}