244 lines
9.5 KiB
Plaintext
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));
|
|
|
|
}
|