242 lines
9.0 KiB
Plaintext
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()
|