166 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// Hemophiliacs Always Bleed to Death
 | 
						|
// By Demtrious and OldManWhistler
 | 
						|
//
 | 
						|
// PLEASE READ "habd_include" FOR MORE INFORMATION.
 | 
						|
//
 | 
						|
// OnPlayerRespawn event handler.
 | 
						|
 | 
						|
#include "habd_include"
 | 
						|
 | 
						|
// Change this value if it is causing server lag.
 | 
						|
const float GHOST_LOOP_TIMER = 6.0f;
 | 
						|
 | 
						|
// ****************************************************************************
 | 
						|
 | 
						|
// This function acts as a player heartbeat while the player is under the
 | 
						|
// "respawn effect".
 | 
						|
//   oOldFollow - is the last object the player was told to follow.
 | 
						|
 | 
						|
void Ghost(object oOldFollow = OBJECT_INVALID)
 | 
						|
{
 | 
						|
    object oMod = GetModule();
 | 
						|
    object oPC = OBJECT_SELF;
 | 
						|
    string sID = GetPCPlayerName(oPC)+GetName(oPC);
 | 
						|
 | 
						|
    if (HABD_DEBUG) SpeakString("DEBUG: HABD OnGhostHB, "+GetName(oPC)+", PlotFlag:"+IntToString(GetPlotFlag(OBJECT_SELF))+", CommandableFlag:"+IntToString(GetCommandable())+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT);
 | 
						|
 | 
						|
    if (
 | 
						|
        (GetPlotFlag(OBJECT_SELF)) &&
 | 
						|
        (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) == HABD_STATE_RESPAWNED_GHOST)
 | 
						|
        )
 | 
						|
    {
 | 
						|
        // Is there someone to follow?
 | 
						|
        object oFollow = GetLocalObject(oPC, HABD_GHOST_AUTOFOLLOW);
 | 
						|
        HABDAssociateBusy();
 | 
						|
        SetCommandable(TRUE);
 | 
						|
        // Most important, schedule the next iteration of the heartbeat.
 | 
						|
        DelayCommand(GHOST_LOOP_TIMER, Ghost(oFollow));
 | 
						|
        if (GetIsObjectValid(oFollow))
 | 
						|
        {
 | 
						|
            if (oFollow != oOldFollow) FloatingTextStringOnCreature(GetName(OBJECT_SELF)+" is now following "+ GetName(oFollow), oPC, TRUE);
 | 
						|
            if (GetArea(OBJECT_SELF) != GetArea(oFollow))
 | 
						|
            {
 | 
						|
                SendMessageToPC(oPC, "Jumping to "+GetName(oFollow));
 | 
						|
                // Not in same area, jump them there
 | 
						|
                ClearAllActions();
 | 
						|
                ActionJumpToObject(oFollow);
 | 
						|
            } else {
 | 
						|
                // In same area, move them there
 | 
						|
                ClearAllActions();
 | 
						|
                DelayCommand(0.5, ActionForceFollowObject(oFollow, 6.0f));
 | 
						|
            }
 | 
						|
        }
 | 
						|
        // Remove their ability to control themselves
 | 
						|
        SetCommandable(FALSE);
 | 
						|
    } else {
 | 
						|
        // Respawn state has been removed. Restore the player to normal.
 | 
						|
        SetCommandable(TRUE);
 | 
						|
        SetPlotFlag(OBJECT_SELF, FALSE);
 | 
						|
        // Set playerstate to alive.
 | 
						|
        SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE);
 | 
						|
        FloatingTextStringOnCreature("OOC: You shake off the ghostly effects.", OBJECT_SELF, FALSE);
 | 
						|
        // Restore the player's reputation with HOSTILE faction.
 | 
						|
        SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, GetLocalInt(oPC, HABD_OLD_FACTION), oPC);
 | 
						|
        DeleteLocalInt(oPC, HABD_OLD_FACTION_SET);
 | 
						|
        effect eEffect = GetFirstEffect(OBJECT_SELF);
 | 
						|
        while(GetIsEffectValid(eEffect))
 | 
						|
        {
 | 
						|
            // They are rezzed, remove sanctuary visual effects.
 | 
						|
            if (GetEffectType(eEffect) == EFFECT_TYPE_CONCEALMENT)
 | 
						|
            {
 | 
						|
                RemoveEffect(OBJECT_SELF, eEffect);
 | 
						|
            }
 | 
						|
            eEffect = GetNextEffect(OBJECT_SELF);
 | 
						|
        }
 | 
						|
        HABDAssociateNotBusy();
 | 
						|
        AssignCommand(OBJECT_SELF, ClearAllActions());
 | 
						|
        // Fixes the inital respawn issue with monsters not reattacking.
 | 
						|
        object oMonster = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY,oPC, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN);
 | 
						|
        DelayCommand(9.0, AssignCommand(oMonster, ActionAttack(oPC)));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// ****************************************************************************
 | 
						|
 | 
						|
// OnPlayerRespawn event handler.
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
    // Check to see if the system is supposed to run this script, otherwise
 | 
						|
    // it may be configured improperly.
 | 
						|
    if (HABD_RESPAWN_SCRIPT != "habd_onpcrespawn")
 | 
						|
    {
 | 
						|
        ExecuteScript(HABD_RESPAWN_SCRIPT, OBJECT_SELF);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    object oPC;
 | 
						|
    // Catch if the script was forced to executed.
 | 
						|
    if (GetLocalInt(OBJECT_SELF, HABD_FORCED_RESPAWN) == 1)
 | 
						|
    {
 | 
						|
        oPC = OBJECT_SELF;
 | 
						|
        HABDAssociateBusy();
 | 
						|
    } else {
 | 
						|
        oPC = GetLastRespawnButtonPresser();
 | 
						|
    }
 | 
						|
    object oMod = GetModule();
 | 
						|
    string sID = GetPCPlayerName(oPC)+GetName(oPC);
 | 
						|
 | 
						|
    if (HABD_DEBUG) SpeakString("DEBUG: HABD OnRespawn, "+GetName(oPC)+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT);
 | 
						|
    /*
 | 
						|
    // Set the player state to respawn.
 | 
						|
    SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_RESPAWNED_GHOST); //set playerstate to DM raised.
 | 
						|
 | 
						|
    // Make it look like something happened.
 | 
						|
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOOM), oPC);
 | 
						|
    */
 | 
						|
    // Raise the player.
 | 
						|
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPC);
 | 
						|
    /*
 | 
						|
    // Most important, schedule the ghost heartbeat.
 | 
						|
    AssignCommand(oPC, DelayCommand(3.0, Ghost()));
 | 
						|
 | 
						|
    // If they have a master, set up the master as the autofollow.
 | 
						|
    if (GetIsObjectValid(GetMaster(oPC))) SetLocalObject(oPC, HABD_GHOST_AUTOFOLLOW, GetMaster(oPC));
 | 
						|
    else
 | 
						|
    {
 | 
						|
        // Remove any old autofollow objects.
 | 
						|
        DeleteLocalObject(oPC, HABD_GHOST_AUTOFOLLOW);
 | 
						|
    }
 | 
						|
 | 
						|
    // Apply the user defined effects.
 | 
						|
    AssignCommand(oPC, HABDUserDefinedRespawn());
 | 
						|
    */
 | 
						|
    // Check if we are re-entering this state from persistence.
 | 
						|
    if (GetLocalInt(oPC, HABD_PERSISTANT_REAPPLY) != 1)
 | 
						|
    {
 | 
						|
        // Apply the respawn penalty.
 | 
						|
        HABDApplyPenalty(oPC, HABD_RESPAWN_XP_LOSS, HABD_RESPAWN_GP_LOSS);
 | 
						|
    } else {
 | 
						|
        DeleteLocalInt(oPC, HABD_PERSISTANT_REAPPLY);
 | 
						|
    }
 | 
						|
    /*
 | 
						|
    // Make them invulnerable
 | 
						|
    SetPlotFlag(oPC, TRUE);
 | 
						|
 | 
						|
    // Make them ignored by hostiles
 | 
						|
    if (!GetLocalInt(oPC, HABD_OLD_FACTION_SET))
 | 
						|
    {
 | 
						|
        SetLocalInt(oPC, HABD_OLD_FACTION, GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oPC));
 | 
						|
        SetLocalInt(oPC, HABD_OLD_FACTION_SET, 1);
 | 
						|
    }
 | 
						|
    SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 100, oPC);
 | 
						|
 | 
						|
    // Apply effects to make them a ghost.
 | 
						|
    // Don't set the concealment too high just incase they find a way to abuse the system.
 | 
						|
    effect eBad = EffectConcealment(1);
 | 
						|
    eBad = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR), eBad);
 | 
						|
    eBad = EffectLinkEffects(EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), eBad);
 | 
						|
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBad, oPC);
 | 
						|
 | 
						|
    FloatingTextStringOnCreature("OOC: You are a ghost. Do not interact with the other players.", oPC, FALSE);
 | 
						|
    SetCommandable(FALSE, oPC);
 | 
						|
    */
 | 
						|
}
 | 
						|
 |