Initial upload
Initial upload
This commit is contained in:
270
_module/nss/respawning.nss
Normal file
270
_module/nss/respawning.nss
Normal file
@@ -0,0 +1,270 @@
|
||||
//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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user