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

144 lines
5.1 KiB
Plaintext

//:://////////////////////////////////////////////
//:: Teleportation Circle Auxiliary
//:: prc_telecirc_aux
//:://////////////////////////////////////////////
/** @file
Teleportation Circle auxiliary script, run on
the area of effect object created by the
spell / power or on the PC when they make
their selection about the target of the circle.
Creates the trapped trigger and, if this
is supposed to be a visible circle, starts
VFX heartbeat.
Also, starts monitor heartbeats on itself
and the trigger.
@author Ornedan
@date Created - 2005.10.25
@date Modified - 2006.06.04
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "spinc_telecircle"
void TrapMonitorHB(object oAoE)
{
if(DEBUG) DoDebug("prc_telecirc_aux: Running TrapMonitorHB on " + GetTag(OBJECT_SELF));
if(!GetIsObjectValid(oAoE))
{
if(DEBUG) DoDebug("prc_telecirc_aux: AoE no longer exists");
DestroyObject(OBJECT_SELF);
}
else
DelayCommand(6.0f, TrapMonitorHB(oAoE));
}
void AoEMonitorHB()
{
if(DEBUG) DoDebug("prc_telecirc_aux: Running AoEMonitorHB on " + GetTag(OBJECT_SELF));
// Loop over all traps and see if they still exist
int i;
for(i = 0; i < TC_NUM_TRAPS; i++)
{
if(!GetIsObjectValid(GetLocalObject(OBJECT_SELF, "Trap_" + IntToString(i))))
{
if(DEBUG) DoDebug("prc_telecirc_aux: Trap " + IntToString(i) + " no longer exists");
DestroyObject(OBJECT_SELF);
return;
}
}
// Got this far, all traps are OK
DelayCommand(6.0f, AoEMonitorHB());
}
void VFXHB(location lCenter)
{
// Do a smoke puff pentagram. Cliche - but meh :P
DrawPentacle(DURATION_TYPE_INSTANT, VFX_FNF_SMOKE_PUFF, lCenter,
FeetToMeters(5.0f), // Radius
0.0f, // VFX Duration
40, // # of nodes - orig 50
2.0f, // Number of revolutions
6.0f, // Time for drawing
0.0f, "z" // Angle offset and axis
);
DrawCircle(DURATION_TYPE_INSTANT, VFX_FNF_SMOKE_PUFF, lCenter, FeetToMeters(5.0f),
0.0f, 24 /*36*/, 1.0f, 6.0f, 0.0f, "z"
);
DelayCommand(6.0f, VFXHB(lCenter));
}
void main()
{
// Check whether we are running for the PC who selected the location the circle points at or for the area of effect object
if(GetTag(OBJECT_SELF) != Get2DACache("vfx_persistent", "LABEL", AOE_PER_TELEPORTATIONCIRCLE))
{
object oPC = OBJECT_SELF;
// Finish the casting
TeleportationCircleAux(oPC);
}
// Or for the circle AoE to initialise it
else
{
object oAoE = OBJECT_SELF;
object oArea = GetArea(oAoE);
object oTrap;
int bVisible = GetLocalInt(oAoE, "IsVisible");
int i;
vector vPosition = GetPosition(oAoE);
float fSideLength = FeetToMeters(2.5f) * sqrt(2.0f);
// Spawn a series of traps at lTarget, rotated by a certain offset relative to each other
for(i = 0; i < TC_NUM_TRAPS; i++)
{
oTrap = CreateTrapAtLocation(TRAP_BASE_TYPE_TELECIRCLE,
Location(oArea, vPosition, (90.0f / TC_NUM_TRAPS) * i),
fSideLength, // Length of the square's sides
"PRC_TELECIRCLE_TRAP_" + IntToString(i), // Tag of the trap
STANDARD_FACTION_HOSTILE, // Faction of the trap - this may or may not cause problems
"prc_telecirc_dis", // OnDisarm script
"" // OnTrigger script - nothing
);
if(!GetIsObjectValid(oTrap))
{
string sErr = "prc_telecirc_aux: ERROR: Failed to create trap " + IntToString(i) + "!";
if(DEBUG) DoDebug(sErr);
else WriteTimestampedLogEntry(sErr);
// Abort the the circle creation
DestroyObject(oAoE);
return;
}
// Set the trap to reset itself after being triggered
SetTrapOneShot(oTrap, FALSE);
// Set the trap to not be recoverable
SetTrapRecoverable(oTrap, FALSE);
// Set the detection DC - 0 if visible, 34 if hidden
SetTrapDetectDC(oTrap, bVisible ? 0 : 34);
// Store references to each other
SetLocalObject(oAoE, "Trap_" + IntToString(i), oTrap);
SetLocalObject(oTrap, "AreaOfEffectObject", oAoE);
// Start the trap's monitor HB
AssignCommand(oTrap, TrapMonitorHB(oAoE));
}
// Start the AoE's monitor HB
AssignCommand(oAoE, AoEMonitorHB());
// Do VFX
if(bVisible)
AssignCommand(oAoE, VFXHB(GetLocation(oAoE)));
// Mark the initalisation being done
SetLocalInt(oAoE, "PRC_TeleCircle_AoE_Inited", TRUE);
}
}