143 lines
5.1 KiB
Plaintext
143 lines
5.1 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
||
|
//:: Henchman Death Script
|
||
|
//::
|
||
|
//:: NW_CH_AC7.nss
|
||
|
//::
|
||
|
//:: Copyright (c) 2001-2003 Bioware Corp.
|
||
|
//:://////////////////////////////////////////////
|
||
|
//:: Official Campaign Henchmen Respawn
|
||
|
//:://////////////////////////////////////////////
|
||
|
//::
|
||
|
//:: Modified by: Brent, April 3 2002
|
||
|
//:: Removed delay in respawning
|
||
|
//:: the henchman - caused bugs
|
||
|
//:
|
||
|
//:: Georg, Oct 8 2003
|
||
|
//:: Rewrote teleport to temple routine
|
||
|
//:: because it was broken by
|
||
|
//:: some delicate timing issues in XP2
|
||
|
//:://////////////////////////////////////////////
|
||
|
|
||
|
#include "nw_i0_generic"
|
||
|
#include "nw_i0_plot"
|
||
|
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// Georg, 2003-10-08
|
||
|
// Rewrote that jump part to get rid of the DelayCommand Code that was prone to
|
||
|
// timing problems. If want to see a really back hack, this function is just that.
|
||
|
// -----------------------------------------------------------------------------
|
||
|
void WrapJump(string sTarget)
|
||
|
{
|
||
|
if (GetIsDead(OBJECT_SELF))
|
||
|
{
|
||
|
// * Resurrect and heal again, just in case
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectResurrection(), OBJECT_SELF);
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
|
||
|
|
||
|
// * recursively call self until we are alive again
|
||
|
DelayCommand(1.0f,WrapJump( sTarget));
|
||
|
return;
|
||
|
}
|
||
|
// * since the henchmen are teleporting very fast now, we leave a bloodstain on the ground
|
||
|
object oBlood = CreateObject(OBJECT_TYPE_PLACEABLE,"plc_bloodstain", GetLocation(OBJECT_SELF));
|
||
|
|
||
|
// * Remove blood after a while
|
||
|
DestroyObject(oBlood,30.0f);
|
||
|
|
||
|
// * Ensure the action queue is open to modification again
|
||
|
SetCommandable(TRUE,OBJECT_SELF);
|
||
|
|
||
|
// * Jump to Target
|
||
|
JumpToObject(GetObjectByTag(sTarget), FALSE);
|
||
|
|
||
|
// * Unset busy state
|
||
|
ActionDoCommand(SetAssociateState(NW_ASC_IS_BUSY, FALSE));
|
||
|
|
||
|
// * Make self vulnerable
|
||
|
SetPlotFlag(OBJECT_SELF, FALSE);
|
||
|
|
||
|
// * Set destroyable flag to leave corpse
|
||
|
DelayCommand(6.0f, SetIsDestroyable(TRUE, TRUE, TRUE));
|
||
|
}
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// Georg, 2003-10-08
|
||
|
// Changed to run the bad recursive function above.
|
||
|
// -----------------------------------------------------------------------------
|
||
|
void BringBack()
|
||
|
{
|
||
|
object oSelf = OBJECT_SELF;
|
||
|
SetLocalObject(oSelf,"NW_L_FORMERMASTER", GetMaster());
|
||
|
RemoveEffects(oSelf);
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectResurrection(), OBJECT_SELF);
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectHeal(GetMaxHitPoints(OBJECT_SELF)), OBJECT_SELF);
|
||
|
|
||
|
object oWay = GetObjectByTag("NW_DEATH_TEMPLE");
|
||
|
|
||
|
if (GetIsObjectValid(oWay) == TRUE)
|
||
|
{
|
||
|
// * if in Source stone area, respawn at opening to area
|
||
|
if (GetTag(GetArea(oSelf)) == "M4Q1D2")
|
||
|
{
|
||
|
DelayCommand(1.0, WrapJump("M4QD07_ENTER"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DelayCommand(1.0, WrapJump(GetTag(oWay)));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
WriteTimestampedLogEntry("UT: No place to go");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
void main()
|
||
|
{
|
||
|
// * This is used by the advanced henchmen
|
||
|
// * Let Brent know if it interferes with animal
|
||
|
// * companions et cetera
|
||
|
if (GetIsObjectValid(GetMaster()) == TRUE)
|
||
|
{
|
||
|
object oMe = OBJECT_SELF;
|
||
|
if (GetAssociateType(oMe) == ASSOCIATE_TYPE_HENCHMAN
|
||
|
// * this is to prevent 'double hits' from stopping
|
||
|
// * the henchmen from moving to the temple of tyr
|
||
|
// * I.e., henchmen dies 'twice', once after leaving your party
|
||
|
|| GetLocalInt(oMe, "NW_L_HEN_I_DIED") == TRUE)
|
||
|
{
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// Georg, 2003-10-08
|
||
|
// Rewrote code from here.
|
||
|
// -----------------------------------------------------------------------------
|
||
|
|
||
|
SetPlotFlag(oMe, TRUE);
|
||
|
SetAssociateState(NW_ASC_IS_BUSY, TRUE);
|
||
|
AddJournalQuestEntry("Henchman", 99, GetMaster(), FALSE, FALSE, FALSE);
|
||
|
SetIsDestroyable(FALSE, TRUE, TRUE);
|
||
|
DestroyObject(oMe, 30.0);
|
||
|
|
||
|
// -----------------------------------------------------------------------------
|
||
|
// End of rewrite
|
||
|
// -----------------------------------------------------------------------------
|
||
|
|
||
|
}
|
||
|
else
|
||
|
// * I am a familiar, give 1d6 damage to my master
|
||
|
if (GetAssociate(ASSOCIATE_TYPE_FAMILIAR, GetMaster()) == OBJECT_SELF)
|
||
|
{
|
||
|
// April 2002: Made it so that familiar death can never kill the player
|
||
|
// only wound them.
|
||
|
int nDam =d6();
|
||
|
if (nDam >= GetCurrentHitPoints(GetMaster()))
|
||
|
{
|
||
|
nDam = GetCurrentHitPoints(GetMaster()) - 1;
|
||
|
}
|
||
|
effect eDam = EffectDamage(nDam);
|
||
|
FloatingTextStrRefOnCreature(63489, GetMaster(), FALSE);
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDam, GetMaster());
|
||
|
}
|
||
|
}
|
||
|
}
|