Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
177 lines
6.1 KiB
Plaintext
177 lines
6.1 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Spell Name Telekinetic Sphere: Movement
|
|
//:: Spell FileName PHS_S_TelekinSpA
|
|
//:://////////////////////////////////////////////
|
|
//:: Spell Effects Applied / Notes
|
|
//:://////////////////////////////////////////////
|
|
This moves the nearest person affected with Telekinetic Sphere from this
|
|
caster, to move to the target location (20M range from the caster). The
|
|
cutscene immobilis is removed and reset (to permanent) when they get to the
|
|
target place.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "PHS_INC_SPELLS"
|
|
|
|
// Moves the person to lTarget.
|
|
void TeleMove(location lTarget, effect Stop);
|
|
// Wrappers Cutscene mode off, and commandable as approprate, into
|
|
// one function
|
|
void TeleSetOff(object oSelf, int bResetFalse, effect eStop);
|
|
|
|
void main()
|
|
{
|
|
// Delcare Major Variables
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget;
|
|
location lTarget = GetSpellTargetLocation();
|
|
|
|
// Declare effects
|
|
effect eStop = EffectCutsceneImmobilize(); // Applied seperatly.
|
|
// Make the "effect eStop = EffectCutsceneImmobilize();" supernatural,
|
|
// so it isn't dispelled (will be removed if the spell is though)
|
|
eStop = SupernaturalEffect(eStop);
|
|
|
|
// Get nearest person with the spells effects
|
|
int nCnt = 1;
|
|
object oCreature = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
|
|
while(GetIsObjectValid(oCreature) && !GetIsObjectValid(oTarget))
|
|
{
|
|
// Distance check
|
|
if(GetDistanceToObject(oCreature) <= 20.0)
|
|
{
|
|
// Check if the effects are from us
|
|
if(PHS_GetHasSpellEffectFromCaster(PHS_SPELL_TELEKINETIC_SPHERE, oCreature, oCaster))
|
|
{
|
|
// Make oTarget oCreature
|
|
oTarget = oCreature;
|
|
}
|
|
}
|
|
// Get next nearest creature
|
|
nCnt++;
|
|
oCreature = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
|
|
}
|
|
|
|
if(GetIsObjectValid(oTarget))
|
|
{
|
|
// Now, we assign the special movement to oTarget
|
|
FloatingTextStringOnCreature("*You telekinetically move " + GetName(oTarget) + " to the specified location*", oCaster, FALSE);
|
|
AssignCommand(oTarget, TeleMove(lTarget, eStop));
|
|
}
|
|
else
|
|
{
|
|
FloatingTextStringOnCreature("*You can force nothing to move*", oCaster, FALSE);
|
|
}
|
|
}
|
|
|
|
// Moves the person to lTarget.
|
|
void TeleMove(location lTarget, effect eStop)
|
|
{
|
|
// Target is self now, we are assigned this action
|
|
object oSelf = OBJECT_SELF;
|
|
|
|
// Remove the immobilis
|
|
PHS_RemoveSpecificEffectFromSpell(EFFECT_TYPE_CUTSCENEIMMOBILIZE, PHS_SPELL_TELEKINETIC_SPHERE, oSelf, SUBTYPE_SUPERNATURAL);
|
|
PHS_RemoveSpecificEffectFromSpell(EFFECT_TYPE_CUTSCENEIMMOBILIZE, PHS_SPELL_TELEKINETIC_SPHERE_MOVEMENT, oSelf, SUBTYPE_SUPERNATURAL);
|
|
|
|
// Check plot flag + Some other things.
|
|
// * As the cutscene function is used, this captures two attempts at it.
|
|
// * Shouldn't break anything much. This move back should take no time at all.
|
|
// * Note: Some effects seem to stop moving, dispite the SetCommandable() flag.
|
|
if(PHS_GetIsImmuneToRepel(oSelf)) return;
|
|
|
|
// We need the commandable flag to put it back correctly.
|
|
int bCommandable = GetCommandable(oSelf);
|
|
|
|
// Time taken will be 1/4 of fDisance
|
|
float fTime = GetDistanceBetweenLocations(lTarget, GetLocation(oSelf)) / 4;
|
|
|
|
// Clear all actions - must stop what we are doing to move.
|
|
ClearAllActions();
|
|
|
|
// Set local saying we are moving
|
|
SetLocalInt(oSelf, "PHS_REPELLING", TRUE);
|
|
|
|
// Set it ON
|
|
SetCutsceneMode(oSelf, TRUE);
|
|
|
|
// Set cutscene cameraman movement rate to high
|
|
// * Reset after complete automatically
|
|
SetCutsceneCameraMoveRate(oSelf, 2.0);
|
|
|
|
// Move them
|
|
int bResetFalse = FALSE;
|
|
if(!bCommandable)
|
|
{
|
|
// Needs to be set commandable
|
|
SetCommandable(TRUE, oSelf);
|
|
bResetFalse = TRUE;
|
|
}
|
|
|
|
// Application of effects to make the slide look better.
|
|
effect eMove = EffectMovementSpeedIncrease(99);
|
|
|
|
// Apply the effects using Actions, as to not go on before falling dead
|
|
ActionDoCommand(PHS_ApplyDuration(oSelf, eMove, fTime));
|
|
|
|
// Move to point
|
|
ActionMoveToLocation(lTarget, TRUE);
|
|
|
|
ActionDoCommand(TeleSetOff(oSelf, bResetFalse, eStop));
|
|
|
|
// Make sure to Set Commandable to FALSE, no AOO's, no actions changing
|
|
SetCommandable(FALSE, oSelf);
|
|
|
|
// Delay the cutscene mode OFF, and any commandable things, not an action.
|
|
DelayCommand(fTime, TeleSetOff(oSelf, bResetFalse, eStop));
|
|
}
|
|
|
|
// Wrappers Cutscene mode off, and commandable as approprate, into
|
|
// one function
|
|
void TeleSetOff(object oSelf, int bResetFalse, effect eStop)
|
|
{
|
|
// Do not remove twice
|
|
if(!GetLocalInt(oSelf, "PHS_REPELLING")) return;
|
|
// Delete local saying we are moving
|
|
DeleteLocalInt(oSelf, "PHS_REPELLING");
|
|
|
|
// Store current camerea position
|
|
StoreCameraFacing();
|
|
|
|
// Turn of cutscene mode.
|
|
SetCutsceneMode(oSelf, FALSE);
|
|
|
|
// Restore camera position after the reset of cutscene mode changed it
|
|
RestoreCameraFacing();
|
|
|
|
// Remove the effects (movement increase, ETC)
|
|
effect eCheck = GetFirstEffect(oSelf);
|
|
while(GetIsEffectValid(eCheck))
|
|
{
|
|
// Check effect type, creator, spell Id, subtype, and duration tpye,
|
|
// to only remove the correct ones.
|
|
if(GetEffectType(eCheck) == EFFECT_TYPE_MOVEMENT_SPEED_INCREASE &&
|
|
GetEffectCreator(eCheck) == oSelf &&
|
|
GetEffectSpellId(eCheck) == SPELL_INVALID &&
|
|
GetEffectSubType(eCheck) == SUBTYPE_SUPERNATURAL &&
|
|
GetEffectDurationType(eCheck) == DURATION_TYPE_TEMPORARY)
|
|
{
|
|
RemoveEffect(oSelf, eCheck);
|
|
}
|
|
// Get next effect
|
|
eCheck = GetNextEffect(oSelf);
|
|
}
|
|
|
|
// Reset the state of commandable if need be.
|
|
if(bResetFalse == FALSE)
|
|
{
|
|
// Reset commandable state after delay so we can move again
|
|
SetCommandable(TRUE, oSelf);
|
|
}
|
|
// Stop what we are doing too
|
|
ClearAllActions();
|
|
// Reapply the immobilis
|
|
PHS_ApplyPermanent(oSelf, eStop);
|
|
}
|