/////// // This is the script for the altars of elements // // There are 4 states for each elemental test // 1: elemental killed // 2: elemental stone taken // 3: finished test successfully (left area through portal) // 4: trying to do the test void DoAltar(object oStore, object oPlayer, object oExit, string sTrial, string sMonsterTag, string sEntranceWP, string sElementalSpawn, string sTrialMsg, int iDoOnce, effect eTeleport) { // Variable Declarations effect eMind = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); string sEtherG = "etherealgfriend"; object sWPNW = GetObjectByTag("TrialEthFriNW"); object sWPSE = GetObjectByTag("TrialEthFriNW"); // REMOVE // //SendMessageToPC(oPlayer, "Debug: Start of Script " + sTrialMsg); // REMOVE // if (iDoOnce == 1 && // do-Once GetLocalInt(oStore, sTrial) == 3) // Quest finished { SendMessageToPC(oPlayer, "Someone already did the " + sTrialMsg); } if (GetLocalInt(oStore, sTrial) == 1 || // in progress, elem killed or stone taken GetLocalInt(oStore, sTrial) == 2 || GetLocalInt(oStore, sTrial) == 4) { SendMessageToPC(oPlayer, "Someone is already doing the " + sTrialMsg); } else if (GetLocalInt(oStore, sTrial) == 0) // quest not started yet { // REMOVE // //SendMessageToPC(oPlayer, "Debug: You are the first to start " + sTrialMsg); // REMOVE // SetLocalInt(oStore, sTrial, 4); // mark quest as started SetLocalString(oPlayer, "Trial", sTrial); // store the trial on the player SetLocalObject(oPlayer, "Exit", oExit); // store the entrance point of the player if (GetNearestObjectByTag(sEtherG, sWPNW) != OBJECT_INVALID) // if the friendly ether is still here { // destroy both of them ApplyEffectToObject(DURATION_TYPE_INSTANT, eMind, GetNearestObjectByTag((sEtherG), sWPNW)); DestroyObject(GetNearestObjectByTag(sEtherG, sWPNW)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eMind, GetNearestObjectByTag((sEtherG), sWPSE)); DestroyObject(GetNearestObjectByTag(sEtherG, sWPSE)); } // Before Jumping the player, do some effects DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eTeleport, oPlayer)); DelayCommand(1.8, AssignCommand(oPlayer, ClearAllActions())); DelayCommand(2.0, AssignCommand(oPlayer, ActionJumpToObject(GetObjectByTag(sEntranceWP)))); // jump player to trial // Shout that player does the trial AssignCommand(GetObjectByTag("EtherealShouter"), ActionSpeakString(GetName(oPlayer) + " does the trial of " + sTrial, TALKVOLUME_SHOUT)); } else if (GetLocalInt(oStore, sTrial) == 3 && // quest finished once iDoOnce == 0) // but allowed to be done again { // REMOVE // //SendMessageToPC(oPlayer, "Debug: Quest was finished once, now you do " + sTrialMsg); // REMOVE // CreateObject(OBJECT_TYPE_CREATURE, sMonsterTag, GetLocation(GetObjectByTag(sElementalSpawn))); // create the trial elemental SetLocalInt(oStore, sTrial, 4); // mark trial as started SetLocalString(oPlayer, "Trial", sTrial); // store trial on the player SetLocalObject(oPlayer, "Exit", oExit); // store the entrance point of the player if (GetObjectByTag(sEtherG) != OBJECT_INVALID) // if the friendly ethers are still here { // destroy both of them ApplyEffectToObject(DURATION_TYPE_INSTANT, eMind, GetNearestObjectByTag((sEtherG), sWPNW)); DestroyObject(GetNearestObjectByTag(sEtherG, sWPNW)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eMind, GetNearestObjectByTag((sEtherG), sWPSE)); DestroyObject(GetNearestObjectByTag(sEtherG, sWPSE)); } // Before Jumping the player, do some effects DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eTeleport, oPlayer)); DelayCommand(1.8, AssignCommand(oPlayer, ClearAllActions())); DelayCommand(2.0, AssignCommand(oPlayer, ActionJumpToObject(GetObjectByTag(sEntranceWP)))); // jump player to trial // Shout that player does the trial AssignCommand(GetObjectByTag("EtherealShouter"), ActionSpeakString(GetName(oPlayer) + " does the trial of " + sTrial, TALKVOLUME_SHOUT)); } else if (GetLocalInt(oStore, sTrial) == 1 || // quest in progress, elem killed, or stone taken GetLocalInt(oStore, sTrial) == 2 || GetLocalInt(oStore, sTrial) == 4) { SendMessageToPC(oPlayer, "Someone is already doing the " + sTrialMsg); } } void Elemental_Altar(string sAltarType, object oPlayer) { // string sAltarType = GetName(OBJECT_SELF); // object oPlayer = GetLastUsedBy(); object oStore = GetObjectByTag("TrialStore"); object oExit = GetNearestObjectByTag("TrialExitD"); effect eTeleport; int sHasOne = 0; int iOnlyOnce = 1; // set this to 0 if you want the tests to be available multiple times if (GetItemPossessedBy(oPlayer, "stoneofearth") != OBJECT_INVALID || GetItemPossessedBy(oPlayer, "stoneoffire") != OBJECT_INVALID || GetItemPossessedBy(oPlayer, "stoneofwater") != OBJECT_INVALID || GetItemPossessedBy(oPlayer, "stoneofair") != OBJECT_INVALID) { sHasOne = 1; } if (sHasOne == 1) { SendMessageToPC(oPlayer, "You already did an Elemental Trial"); } // Earth else if (sAltarType == "Altar of Earth") { eTeleport = EffectVisualEffect(VFX_COM_HIT_ACID); DoAltar(oStore, oPlayer, oExit, "earth", "rockdemon", "TrialEntranceEarth", "TrialEarthP2", "Trial of Earth", iOnlyOnce, eTeleport); } // Fire else if (sAltarType == "Altar of Fire") { eTeleport = EffectVisualEffect(VFX_COM_HIT_FIRE); DoAltar(oStore, oPlayer, oExit, "fire", "magmademon", "TrialEntranceFire", "TrialFireP1", "Trial of Fire", iOnlyOnce, eTeleport); } // Water else if (sAltarType == "Altar of Water") { eTeleport = EffectVisualEffect(VFX_COM_HIT_SONIC); DoAltar(oStore, oPlayer, oExit, "water", "wavedemon", "TrialEntranceWater", "TrialWaterP2", "Trial of Water", iOnlyOnce, eTeleport); } // Air else if (sAltarType == "Altar of Air") { eTeleport = EffectVisualEffect(VFX_COM_HIT_FROST); DoAltar(oStore, oPlayer, oExit, "air", "stormdemon", "TrialEntranceAir", "TrialAirP1", "Trial of Air", iOnlyOnce, eTeleport); } }