HoS_PRC8/_mod/_module/nss/vamp_death.nss
Jaysyn904 04165202c0 Initial upload
Initial upload
2024-11-25 19:36:07 -05:00

242 lines
9.0 KiB
Plaintext

// vamp_death - vampire death for a vampire PC
// modified 06/16/2004 Jeremy Greene
// modified 04/26/2005 Deva Winblood
#include "x2_inc_itemprop"
#include "hos_respawn_h"
#include "prc_inc_skin"
void fnFleeToCoffin();
void fnTrueDeath();
void fnDieInTwoHours();
////////////////////////////////////////////////////////////////////// MAIN
void main()
{
object oMe=OBJECT_SELF;
object oKiller=GetLastKiller();
object oCoffin=GetLocalObject(oMe,"oCoffin");
int bIsDay=GetIsDay();
object oNear=GetNearestObjectByTag("RTS_SURFACE",oMe,1);
SetLocalObject(oMe,"oKiller",oKiller);
SetIsTemporaryFriend(oKiller,oMe,TRUE,20.0);
if (oCoffin!=OBJECT_INVALID)
{
if (bIsDay==TRUE&&oNear!=OBJECT_INVALID) fnTrueDeath();
else { fnFleeToCoffin(); DelayCommand(HoursToSeconds(2),fnDieInTwoHours());}
}
else { fnTrueDeath(); }
}
///////////////////////////////////////////////////////////////////// MAIN
void fnDieInTwoHours()
{
if (GetLocalInt(OBJECT_SELF,"nVampMist")==TRUE)
{ // you have died
SendMessageToPC(OBJECT_SELF,"You failed to make it back to your coffin within 2 hours and have died the true death.");
AssignCommand(OBJECT_SELF,fnTrueDeath());
} // you have died
} // fnDieInTwoHours()
void Raise(object oPlayer)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);
effect eBad = GetFirstEffect(oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);
//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oPlayer, eBad);
}
eBad = GetNextEffect(oPlayer);
}
//Fire cast spell at event for the specified target
SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}
void fnGhost()
{
object oMe=OBJECT_SELF;
effect eCutsceneDominated=EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
effect eCutsceneGhost=EffectCutsceneGhost();
effect eInvis=EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT);
effect eFast=EffectMovementSpeedIncrease(99);
effect eMist=EffectVisualEffect(VFX_DUR_GHOST_SMOKE_2);
effect eSanctuary=EffectSanctuary(1000);
effect eDamage;
effect eSilence=EffectSilence();
effect eConcealment=EffectConcealment(100);
if (GetLocalInt(oMe,"nVampMist")==TRUE)
{ // remain mist
if (GetLocalInt(oMe,"nAppearance")==0)
{ // change appearance
SetLocalInt(oMe,"nAppearance",GetAppearanceType(oMe));
SetCreatureAppearanceType(oMe,298);
} // change appearance
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eCutsceneDominated,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eCutsceneGhost,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eInvis,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFast,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eMist,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanctuary,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_ACID);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_BLUDGEONING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_COLD);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_DIVINE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_ELECTRICAL);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_FIRE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_NEGATIVE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_PIERCING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_POSITIVE);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_SLASHING);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
eDamage=EffectDamageDecrease(1000,DAMAGE_TYPE_SONIC);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eDamage,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSilence,oMe,10.2);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eConcealment,oMe,10.2);
SetPlotFlag(oMe,TRUE);
DelayCommand(9.0,SetPlotFlag(oMe,FALSE));
DelayCommand(10.0,fnGhost());
} // remain mist
else
{ // return to your own form
SetCreatureAppearanceType(oMe,GetLocalInt(oMe,"nAppearance"));
DeleteLocalInt(oMe,"nAppearance");
} // return to your own form
} // fnGhost()
void fnHealAndBecomeMist()
{
Raise(OBJECT_SELF);
SetLocalInt(OBJECT_SELF,"nVampMist",TRUE);
fnGhost();
} // fnHealAndBecomeMist()
void fnRunToCoffin(object oCoffin)
{
object oMe=OBJECT_SELF;
float fDist=GetDistanceBetween(oCoffin,oMe);
if (oCoffin==OBJECT_INVALID) { fnTrueDeath(); }
else
{ // coffin exists
if (GetArea(oMe)!=GetArea(oCoffin)||fDist>3.0)
{
SendMessageToPC(oMe,"You MUST return to your coffin!");
DelayCommand(12.0,fnRunToCoffin(oCoffin));
} // move to coffin
else
{ // arrived at coffin
//SetCommandable(TRUE,oMe);
AssignCommand(oMe,ClearAllActions(TRUE));
SetLocalInt(oMe,"nVampMist",FALSE);
SendMessageToPC(oMe,"You safely return to your coffin!");
} // arrived at coffin
} // coffin exists
} // run to coffin
void fnFleeToCoffin()
{
object oMe=OBJECT_SELF;
object oCoffin=GetLocalObject(oMe,"oCoffin");
fnHealAndBecomeMist();
//SetCommandable(FALSE,oMe);
fnRunToCoffin(oCoffin);
} // fnFleeToCoffin()
void fnDestroySkinProperties(object oSkin)
{ // destroy skin properties
IPRemoveAllItemProperties(oSkin,DURATION_TYPE_PERMANENT);
} // fnDestroySkinProperties()
void fnDestroySkin(object oSkin)
{
fnDestroySkinProperties(oSkin);
} // fnDestroySkin()
void fnTrueDeath()
{
object oPC=OBJECT_SELF;
object oItem;
object oNew;
object oMod=GetModule();
object oCloth;
int nGold=GetGold(oPC);
int nDeath=GetLocalInt(oPC,"nDied");
int nC;
string sTag;
object oHench=GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC,1);
effect eEffect;
object oKiller=GetLocalObject(oPC,"oKiller");
object oKilledBy=oKiller;
// adjust undead hunter reputation
oNew=GetObjectByTag("undeadhunter_dummy");
if (oNew!=OBJECT_INVALID)
{ // found place holder
AdjustReputation(oPC,oNew,60);
} // found place holder
oNew=OBJECT_INVALID;
// end adjust
SetLocalInt(oPC,"nVampMist",FALSE);
if (GetIsObjectValid(oHench)==TRUE) fnRemoveHenchman(oHench,oPC);
if (GetIsPC(oKiller)==FALSE)
{ // check
if (GetMaster(oKiller)!=OBJECT_INVALID) oKiller=GetMaster(oKiller);
else
{
sTag=GetLocalString(oKiller,"sTeamID");
if (GetStringLength(sTag)>2) oKiller=GetLocalObject(oMod,"oTeamLead"+sTag);
sTag="";
}
} // check
if (GetIsPC(oKiller)==TRUE)
{ // give experience
GiveXPToCreature(oPC,500); // 500 XP
} // give experience
SetLocalInt(oPC,"nDied",1);
nC=GetLocalInt(oPC,"nDeaths");
nC++;
SetLocalInt(oPC,"nDeaths",nC);
SetLocalInt(oPC,"nDeadVampire",TRUE);
SendMessageToPC(oPC,"You have died "+IntToString(nC)+" times in this game.");
if (GetLocalInt(oMod,"nGameType")==0) DelayCommand(5.5,fnMessageDeath(oPC,oKilledBy));
SetLocalInt(oPC,"nIsVampire",FALSE);
SetLocalInt(oPC,"nCoffinPlaced",FALSE);
if (GetLocalObject(oPC,"oCoffin")!=OBJECT_INVALID) DestroyObject(GetLocalObject(oPC,"oCoffin"));
DeleteLocalObject(oPC,"oCoffin");
DeleteLocalInt(oPC,"nBloodPool");
DeleteLocalInt(oPC,"nVampireXP");
//oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
oItem = GetPCSkin(oPC);
if (oItem!=OBJECT_INVALID) fnDestroySkin(oItem);
AssignCommand(oPC,RespawnPlayer(oPC));
} // fnTrueDeath()