RATDOG/_module/nss/cs_oe_trapcep.nss
Jaysyn904 0f13e6c538 Initial module commit
Initial module commit.
2021-08-29 23:34:48 -04:00

244 lines
9.5 KiB
Plaintext

//Name : cs_oe_trapcep
//Purpose : OnEnter script for a generic trigger for any of CEP's placeable traps.
//Created By: Stefan Grose of Faerun Nights
//Created On: 4/13/2004
//
/*
Note: This trigger and scripts were designed for a generic trigger,
not a trap trigger. A trap trigger cannot be reset after a disarm or
recover.
If you do set it up as a trap trigger, move the OnEnter script from
the OnEnter event to the OnTriggered event. It should work until it
has been disarmed or recovered.
Setup required:
1. Place a generic trigger in your area
2. Place this script in the OnEnter event of the trigger
3. Place the cs_ox_trapcep script in the OnExit event
4. Place the CEP trap placeable on or above the trigger (unless you
want the trap to be "hidden", then don't place the placeable and
instead set the TrapHidden local variable to "TRUE" and include
the trap resref in the TrapResRef local variable.
5. Configure the trap "parameters" using local variables stored on the
trigger. Local variables are set from the "variables" button
on the "Advanced" tab of the trigger.
The following parameters are configurable and can be setup as
local variables on the trigger. The variable name must match
the string name listed down the left side of the list below:
TrapTag : tag of trap placeable (expressed as a string) (required)
(Defaults to an empty string)
TrapReflexDC : DC required to avoid the trap (expressed as an integer)
(Defaults to 15)
DamageType : DAMAGE_TYPE_* (expressed as an integer)
(Defaults to 1 = DAMAGE_TYPE_BLUDGEONING)
1 = DAMAGE_TYPE_BLUDGEONING
2 = DAMAGE_TYPE_PIERCING
4 = DAMAGE_TYPE_SLASHING
8 = DAMAGE_TYPE_MAGICAL
16 = DAMAGE_TYPE_ACID
32 = DAMAGE_TYPE_COLD
64 = DAMAGE_TYPE_DIVINE
128 = DAMAGE_TYPE_ELECTRICAL
256 = DAMAGE_TYPE_FIRE
512 = DAMAGE_TYPE_NEGATIVE
1024 = DAMAGE_TYPE_POSITIVE
2048 = DAMAGE_TYPE_SONIC
NoKnockdown : TRUE/FALSE (expressed as an integer)
(Defaults to FALSE = Knockdown occurs)
SoundObjectTag : tag of sound that plays during trigger of trap
(Defaults to an empty string = no sound)
MaxDamage : the maximum damage distributed (expressed as an integer)
(Defaults to 10)
MinDamage : the minimum damage distributed (expressed as an integer)
(Defaults to 1)
ResetTime : number of seconds after "trap is triggered" that the
trap can be triggered again
(Defaults to 120 seconds)
DeactivateTime : number of seconds after "trigger" that the trap is
repositioned in its "ready" state (this value should
be equal to or less than ResetTime)
(Defaults to 110 seconds)
IncludeNonPC : TRUE/FALSE (expressed as an integer) whether the trap
can be triggered by a non-PC
(Defaults to TRUE = does trigger on non-PC's)
ContinuousDmg : TRUE/FALSE (expressed as an integer) a value of TRUE
causes damage to the PC every 2 seconds until they
exit the trigger
(Defaults to FALSE = no continuous damage)
HiddenTrap : TRUE/FALSE (expressed as an integer) a value of TRUE
assume the trap is "hidden" (not actually placed in
the area), so when the trap is triggered, the script
actually creates the trap placeable, then activates
it. On deactivate, the trap is destroyed.
(Defaults to FALSE = which requires placement of the trap)
TrapResRef : the resref of the trap being triggered - only required
if HiddenTrap is set to TRUE.
(Defaults to empty string)
*/
// Perform a reflex save and apply trap damage on failure
void Check_For_Trap_Damage(object oPC)
{
// configuration parameters regarding the cep trap placeable
int TrapReflexDC = GetLocalInt(OBJECT_SELF, "TrapReflexDC");
int DamageType = GetLocalInt(OBJECT_SELF, "DamageType");
int NoKnockdown = GetLocalInt(OBJECT_SELF, "NoKnockdown");
int MaxDamage = GetLocalInt(OBJECT_SELF, "MaxDamage");
int MinDamage = GetLocalInt(OBJECT_SELF, "MinDamage");
string SoundObjectTag = GetLocalString(OBJECT_SELF, "SoundObjectTag");
// Entered object's reflex save is successful
if(ReflexSave(oPC, TrapReflexDC, SAVING_THROW_TYPE_NONE, GetAreaOfEffectCreator()))
FloatingTextStringOnCreature("You barely dodge the trap!", oPC);
else
{
// Failed reflex save, damage is inflicted
effect eEffect;
int RdmVar = MaxDamage - MinDamage + 1;
//if no DamageType setup, then default it to Bludgeoning
if(DamageType ==0)
DamageType = 1;
if(NoKnockdown)
eEffect = EffectDamage(Random(RdmVar) + MinDamage, DamageType, DAMAGE_POWER_NORMAL);
else
eEffect = EffectLinkEffects(EffectDamage(Random(RdmVar) + MinDamage, DamageType, DAMAGE_POWER_NORMAL), EffectKnockdown());
// Apply damage (and knockdown if included)
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oPC, 3.0f);
FloatingTextStringOnCreature("Argh!", oPC);
}
// Play the sound associated to the trap
object oSound = GetObjectByTag(SoundObjectTag);
// If the object with the sound tag does not exist
if(!GetIsObjectValid(oSound))
WriteTimestampedLogEntry("Error: No such sound exists with tag: " + SoundObjectTag);
else
SoundObjectPlay(oSound);
}
void main()
{
int ContinuousDmg = GetLocalInt(OBJECT_SELF, "ContinuousDmg");
int Triggered = GetLocalInt(OBJECT_SELF, "Triggered");
object oPC = GetEnteringObject();
// Exit if trap has not yet been "reset" (when its not a "Continuous Damage" trap
if(Triggered && !ContinuousDmg)
return;
// Exit if it is a continuous trap, but the oPC has escaped the trap
else if(ContinuousDmg && GetLocalInt(oPC, "EscapedTrap"))
{
DeleteLocalInt(oPC, "EscapedTrap");
return;
}
// do not trigger the trap on a DM
else if (GetIsDM(oPC))
return;
// do not trigger on a non-PC if the IncludeNonPC flag is set to 0 (FALSE)
else
{
int IncludeNonPC = GetLocalInt(OBJECT_SELF, "IncludeNonPC");
if(!GetIsPC(oPC) && !IncludeNonPC)
return;
}
// Local variables stored on the trigger serving as trigger/trap parameters
int ResetTime = GetLocalInt(OBJECT_SELF, "ResetTime");
string TrapTag = GetLocalString(OBJECT_SELF, "TrapTag");
int DeactivateTime = GetLocalInt(OBJECT_SELF, "DeactivateTime");
int HiddenTrap = GetLocalInt(OBJECT_SELF, "HiddenTrap");
string TrapResRef = GetLocalString(OBJECT_SELF, "TrapResRef");
object oTrap;
// If the trap has not yet been "triggered"
if(!GetLocalInt(OBJECT_SELF, "Triggered"))
{
// If the trap is supposed to be hidden prior to trigger, create the trap
// on trigger.
if(HiddenTrap)
oTrap = CreateObject(OBJECT_TYPE_PLACEABLE, GetLocalString(OBJECT_SELF, "TrapResRef"), GetLocation(OBJECT_SELF));
else
oTrap = GetObjectByTag(TrapTag);
// If the object with the trap tag does not exist
if(!GetIsObjectValid(oTrap))
{
WriteTimestampedLogEntry("Error: No such trap exists with tag: " + TrapTag);
return;
}
// initiate trap placeable animation
DelayCommand(0.5, AssignCommand(oTrap, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)));
// Flag the trap as being triggered
SetLocalInt(OBJECT_SELF, "Triggered", TRUE);
// Remove the variable (preventing the trap from being triggered) based on the
// number of seconds in "ResetTime"
DelayCommand(IntToFloat(ResetTime), DeleteLocalInt(OBJECT_SELF, "Triggered"));
}
oTrap = GetObjectByTag(TrapTag);
// If the object with the trap tag does not exist
if(!GetIsObjectValid(oTrap))
{
WriteTimestampedLogEntry("Error: No such trap exists with tag: " + TrapTag);
return;
}
// Check to see if the trap does damage to the entering object
DelayCommand(0.5, Check_For_Trap_Damage(oPC));
// Deactivate the trap by placing it back in its "deactivate" state after the number
// of seconds stored in DeactivateTime
if(!GetLocalInt(OBJECT_SELF, "DeactivationDelaySet"))
{
DelayCommand(IntToFloat(DeactivateTime), AssignCommand(oTrap, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE)));
SetLocalInt(OBJECT_SELF, "DeactivationDelaySet", TRUE);
DelayCommand(IntToFloat(DeactivateTime), DeleteLocalInt(OBJECT_SELF, "DeactivationDelaySet"));
// Make the trap disappear on deactivation (destroy it)
if(HiddenTrap)
DelayCommand(1.0, DestroyObject(oTrap, IntToFloat(DeactivateTime)));
}
// if the trap is supposed to continuously distribute damage every 2 seconds
if(ContinuousDmg)
DelayCommand(2.0f, ExecuteScript("cs_oe_trapcep", OBJECT_SELF));
}