Aschbourne_PRC8/_module/nss/vamp_sunsystem.nss
GetOffMyYarn 69879d6957 Areas and Fixes
Added CCOH and missing areas
Changed some areas to be craftable,
Fixed some on death issues,
Fixed the Gaurd
2024-08-30 11:38:44 -04:00

104 lines
4.3 KiB
Plaintext

//Optional Sun system. This one wont take as much cpu time as original.
//This script loops as long as vampire is in same area and he is living.
#include "vamp_checkarmor"
//Get Module to get LocalInteger
object oMod = GetModule();
void vamp_sundamage(object oPC)
{
// To what area he is coming.
object oArea = GetLocalObject(oPC, "VampArea");
PrintString("vamp_sunsystem: vamp_sundamage() called for " + GetName(oPC) + " in "+GetName(oArea)+".");
// End scipt if object is not vampire
// vampire is not anymore on same area or if vampire is dead.
if (GetSubRace(oPC)!="Vampire"
|| GetArea(oPC) != oArea
|| GetIsDead(oPC)
|| GetIsAreaInterior(oArea)==TRUE
|| GetIsAreaAboveGround(oArea)==FALSE )
{
PrintString("SUN HALT! vamp_sunsystem: vamp_sundamage() - " + GetName(oPC) + " is dead, not a vampire, not in "+GetName(GetLocalObject(oPC, "VampArea"))+" anymore, or "+GetName(oArea)+" does not apply to SunDamage.");
// Sunsystem is no longer running.
return;
}
string sItem = vamp_checkArmor(oPC);
//If area is aboveground and sun is shining and oPC is vampire and vampire has on proper helmet/hood. Make vampire blind and give ability penalties.
if (GetIsDay()==TRUE
// if you don't include this next line, indoors can kill you if you add the script to on enter.
&& GetIsAreaInterior(oArea)==FALSE
&& GetIsAreaAboveGround(oArea)==TRUE
//&& GetWeather(oArea)==WEATHER_CLEAR
&& GetSubRace(oPC)=="Vampire"
&& GetIsDead(oPC)==FALSE
&& (sItem == "Vamp"))
{
//Lets apply -2 to attack and saves.
effect eAttack = EffectAttackDecrease(2);
effect eSave = EffectSavingThrowDecrease(SAVING_THROW_ALL,2);
effect eBlind = EffectBlindness();
effect eLink = EffectLinkEffects(eAttack,eSave);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,5.0f);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlind,oPC,5.0f);
}
//If area is aboveground and sun is shining and oPC is vampire and vampire dont have helmet/hood. Deal some damage to vampire.
if (GetIsDay()==TRUE
// if you don't include this next line, indoors can kill you if you add the script to on enter.
&& GetIsAreaInterior(oArea)==FALSE
&& GetIsAreaAboveGround(oArea)==TRUE
//&& GetWeather(oArea)==WEATHER_CLEAR
&& GetSubRace(oPC)=="Vampire"
&& GetIsDead(oPC)==FALSE
&& (GetItemInSlot(INVENTORY_SLOT_HEAD,oPC)==OBJECT_INVALID
|| sItem != "Vamp"))
{
//Lets apply -2 to attack and saves.
effect eAttack = EffectAttackDecrease(2);
effect eSave = EffectSavingThrowDecrease(SAVING_THROW_ALL,2);
effect eBlind = EffectBlindness();
effect eLink = EffectLinkEffects(eAttack,eSave);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,5.0f);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlind,oPC,5.0f);
PrintString("SUN DAMAGE! vamp_sunsystem: vamp_sundamage() - " + GetName(oPC) + " - It is daytime, the area is above ground and a natural area, the weather is clear, the object's subclass is Vampire and they are not dead (yet) so they will take DAMAGE!");
//Is Sun system set to kill instant?
//If yes kill vampire.
if ( GetLocalInt(oMod, "iSunKillInstant")==1 )
{
//And kills vampire.
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),oPC);
//Applies death effect
effect vDamage = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
ApplyEffectToObject(DURATION_TYPE_INSTANT,vDamage,oPC);
}
//If not do x damage.
else
{
int iDamage = GetLocalInt(oMod, "iSunDamageX");
effect eDamage = EffectDamage(iDamage,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_NORMAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oPC);
effect eSunDamage = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_FIRE);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eSunDamage,oPC);
}
}
// if they are not dead keep checking
if (GetIsDead(oPC)!=TRUE)
{
DelayCommand(5.0f,vamp_sundamage(oPC));
}
}
void vamp_sunsystem(object oPC)
{
PrintString("SUN START: vamp_sunsystem: " + GetName(oPC) + "| Function called.");
DelayCommand(5.4f, SetLocalObject(oPC, "VampArea", GetArea(oPC)));
DelayCommand(5.5f, vamp_sundamage(oPC));
}