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