forked from Jaysyn/PRC8
111 lines
3.8 KiB
Plaintext
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;*/
|
||
|
}
|
||
|
}
|
||
|
|