PRC8/trunk/smp/phs_s_refugea.nss
Jaysyn904 1662218bb4 Initial upload.
Adding base PRC 4.19a files to repository.
2022-10-07 13:51:24 -04:00

108 lines
3.6 KiB
Plaintext

/*:://////////////////////////////////////////////
//:: Spell Name Refuge - On Activated
//:: Spell FileName PHS_S_RefugeA
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Can be cast on any item.
Once the item has the spell, it has the caster's name set on it. Only PCs
can cast this spell.
Once used, the item power set (permamently) on the thing that is, it will
transport the PC to the caster, or, Vice Versa.
Cannot be dispelled, for easyness sakes, and needs a material component.
It was also "to the casters Abode", but heck, that'd be so much more complicated
and unfun.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
// Get the PC of sName - noting sName must be GetPCPlayerName(oCaster) + GetName(oCaster)
object GetPCOfName(string sName);
void main()
{
//Declare major variables
object oPerson = OBJECT_SELF;
object oItem = GetSpellCastItem();
// Get the caster of the spell
object oCaster = GetPCOfName(GetLocalString(oItem, "PHS_REFUGE_CASTER_NAME"));
// Get the boolean value
// If TRUE, the caster is teleported to the target, so
// it defaults to FALSE, which means the person using it (the target) is
// teleported to the caster.
// * It is kinda a "Move the caster to the target?" question for the name reference.
int bMoveCaster = GetLocalInt(oItem, "PHS_SPELL_REFUGE_MOVE_CASTER");
// Make sure they are a valid caster - else wasted spell
if(!GetIsObjectValid(oCaster) || oCaster == oPerson)
{
// Failed
FloatingTextStringOnCreature("*Refuge attempt failed, no caster of Refuge found*", oPerson, FALSE);
// Make sure always to destroy the item
PHS_CompletelyDestroyObject(oItem);
return;
}
// Check faction alignment
if(!GetFactionEqual(oCaster, oPerson))
{
// Failed
FloatingTextStringOnCreature("*Refuge attempt failed, caster of Refuge not in party*", oPerson, FALSE);
// Make sure always to destroy the item
PHS_CompletelyDestroyObject(oItem);
return;
}
// Get locations
location lPerson = GetLocation(oPerson);
location lCaster = GetLocation(oCaster);
// Must be on the same plane - no going from maze or to prismatic plane :-)
if(PHS_CheckIfSamePlane(lPerson, lCaster))
{
// Failed
FloatingTextStringOnCreature("*Refuge attempt failed, caster of Refuge not on the same plane*", oPerson, FALSE);
// Make sure always to destroy the item
PHS_CompletelyDestroyObject(oItem);
return;
}
// If not, we work the magic
if(bMoveCaster == TRUE)
{
// oCaster to oPerson
AssignCommand(oCaster, PHS_ForceMovementToLocation(PHS_GetRandomLocation(lPerson, 6), VFX_FNF_TELEPORT_OUT, VFX_FNF_TELEPORT_IN));
}
else
{
// oPerson to oCaster
AssignCommand(oPerson, PHS_ForceMovementToLocation(PHS_GetRandomLocation(lCaster, 6), VFX_FNF_TELEPORT_OUT, VFX_FNF_TELEPORT_IN));
}
// Make sure always to destroy the item
PHS_CompletelyDestroyObject(oItem);
}
// Get the PC of sName - nothing sName must be GetPCPlayerName(oCaster) + GetName(oCaster)
object GetPCOfName(string sName)
{
object oPC = GetFirstPC();
while(GetIsObjectValid(oPC))
{
// Check name
if(GetPCPlayerName(oPC) + GetName(oPC) == sName)
{
return oPC;
}
// Get next PC
oPC = GetNextPC();
}
return OBJECT_INVALID;
}