UW2_PRC8/_module/nss/respawning.nss
Jaysyn904 5197ad9a4d Initial upload
Initial upload
2023-09-25 20:24:01 -04:00

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);
}
}
}