271 lines
7.8 KiB
Plaintext
271 lines
7.8 KiB
Plaintext
//Created by Guile 12/31/07
|
|
//Goes OnPlayerRespawn of the module properties
|
|
effect eEffect;
|
|
location lTarget;
|
|
int nInt;
|
|
object oTarget;
|
|
|
|
#include "nw_i0_plot"
|
|
|
|
//Void function to tell the functions below how to appropriately remove xp.
|
|
void RemoveXPFromParty(int nXP, object oPC, int bAllParty=TRUE)
|
|
{
|
|
if (!bAllParty)
|
|
{
|
|
nXP=(GetXP(oPC)-nXP)>=0 ? GetXP(oPC)-nXP : 0;
|
|
SetXP(oPC, nXP);
|
|
}
|
|
else
|
|
{
|
|
object oMember=GetFirstFactionMember(oPC, TRUE);
|
|
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
nXP=(GetXP(oMember)-nXP)>=0 ? GetXP(oMember)-nXP : 0;
|
|
SetXP(oMember, nXP);
|
|
oMember=GetNextFactionMember(oPC, TRUE);
|
|
}
|
|
}
|
|
}
|
|
//Main Script
|
|
void main()
|
|
{
|
|
//This script may seem very complex, but it's not, each function is noted
|
|
//so there is no confusion on what each thing does.
|
|
//You can simply void a function by typing // before the line, all functions
|
|
//<<<like so are uncommented and highlighted in green, as they don't work at all.
|
|
object oPC = GetLastRespawnButtonPresser();
|
|
if (!GetIsPC(oPC)) return;
|
|
//On Player Respawn, they cannot die for 15 seconds, though they still take damage.
|
|
SetPlotFlag(oPC, TRUE);
|
|
//After 15 Seconds make them killable.
|
|
DelayCommand(15.0, SetPlotFlag(oPC,FALSE));
|
|
//Resurrect the player
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC);
|
|
//Commented out because a bugg was found removing all effects from PC.
|
|
//RemoveEffects(oPC);
|
|
|
|
//Play a cool effect when the player respawns
|
|
object oTarget;
|
|
oTarget = oPC;
|
|
int nInt;
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_TORNADO), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_TORNADO), GetLocation(oTarget));
|
|
|
|
//If the player is in the arena and has this token they respawn in arena
|
|
//With no death penalty what soever, and you don't gain xp as a reward either.
|
|
if (GetItemPossessedBy(oPC, "arenatoken")!= OBJECT_INVALID)
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), GetLocation(oTarget));
|
|
//Here you will want to create a Way Point and give it the tagname below.
|
|
//This is where the player who died in the arena only will respawn to.
|
|
oTarget = GetWaypointByTag("arenaway1");
|
|
|
|
lTarget = GetLocation(oTarget);
|
|
|
|
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
|
|
|
|
AssignCommand(oPC, ClearAllActions());
|
|
|
|
AssignCommand(oPC, ActionJumpToLocation(lTarget));
|
|
|
|
oTarget = oPC;
|
|
|
|
eEffect = EffectCutsceneImmobilize();
|
|
|
|
eEffect = SupernaturalEffect(eEffect);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 4.0f);
|
|
|
|
FloatingTextStringOnCreature("The Gods have restored you to the arena.", oPC);
|
|
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
//You will want to give your low level players a plot item, which will
|
|
//allow them to respawn where they died, with a cool effect telling them
|
|
//why they were ressurected magically.
|
|
//Note if you don't hand out this item, they will respawn normally
|
|
//This could also be used as a reward for immortality as well!
|
|
else if (GetItemPossessedBy(oPC, "plotitemtagname")!= OBJECT_INVALID)
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_NATURES_BALANCE), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_NATURES_BALANCE), GetLocation(oTarget));
|
|
|
|
FloatingTextStringOnCreature("The magic of the lands has restored you to life!", oPC);
|
|
|
|
RemoveXPFromParty(50, oPC, FALSE);
|
|
|
|
AssignCommand(oPC, TakeGoldFromCreature(1000, oPC, TRUE));
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
//No matter what happens, they are going to lose xp/gold, unless in arena.
|
|
else if (GetHitDice(oPC) >= 40)
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), GetLocation(oTarget));
|
|
|
|
oTarget = GetWaypointByTag("home");
|
|
|
|
lTarget = GetLocation(oTarget);
|
|
|
|
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
|
|
|
|
DelayCommand(3.0, AssignCommand(oPC, ClearAllActions()));
|
|
|
|
DelayCommand(3.3, AssignCommand(oPC, ActionJumpToLocation(lTarget)));
|
|
|
|
AssignCommand(oPC, TakeGoldFromCreature(50000, oPC, TRUE));
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
|
|
}
|
|
else if (GetHitDice(oPC) >= 30)
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), GetLocation(oTarget));
|
|
|
|
RemoveXPFromParty(5000, oPC, FALSE);
|
|
|
|
AssignCommand(oPC, TakeGoldFromCreature(50000, oPC, TRUE));
|
|
|
|
oTarget = GetWaypointByTag("home");
|
|
|
|
lTarget = GetLocation(oTarget);
|
|
|
|
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
|
|
|
|
DelayCommand(2.0, AssignCommand(oPC, ClearAllActions()));
|
|
|
|
DelayCommand(2.2, AssignCommand(oPC, ActionJumpToLocation(lTarget)));
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
else if (GetHitDice(oPC) >= 20)
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), GetLocation(oTarget));
|
|
|
|
RemoveXPFromParty(3000, oPC, FALSE);
|
|
|
|
AssignCommand(oPC, TakeGoldFromCreature(30000, oPC, TRUE));
|
|
|
|
oTarget = GetWaypointByTag("home");
|
|
|
|
lTarget = GetLocation(oTarget);
|
|
|
|
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
|
|
|
|
DelayCommand(2.0, AssignCommand(oPC, ClearAllActions()));
|
|
|
|
DelayCommand(2.2, AssignCommand(oPC, ActionJumpToLocation(lTarget)));
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
oTarget = oPC;
|
|
|
|
nInt = GetObjectType(oTarget);
|
|
|
|
if (nInt != OBJECT_TYPE_WAYPOINT) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oTarget);
|
|
else ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), GetLocation(oTarget));
|
|
|
|
RemoveXPFromParty(1000, oPC, FALSE);
|
|
|
|
AssignCommand(oPC, TakeGoldFromCreature(5000, oPC, TRUE));
|
|
|
|
oTarget = GetWaypointByTag("home");
|
|
|
|
lTarget = GetLocation(oTarget);
|
|
|
|
if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return;
|
|
|
|
DelayCommand(2.0, AssignCommand(oPC, ClearAllActions()));
|
|
|
|
DelayCommand(2.2, AssignCommand(oPC, ActionJumpToLocation(lTarget)));
|
|
|
|
object oItem;
|
|
oItem = GetFirstItemInInventory(oPC);
|
|
|
|
while (GetIsObjectValid(oItem))
|
|
{
|
|
if (GetTag(oItem)=="death") DestroyObject(oItem);
|
|
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
}
|
|
}
|
|
|