108 lines
3.6 KiB
Plaintext
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;
|
|
}
|