Reapplying Status Effects after Rest
Shongu
Member Posts: 3
So I'm currently helping a friend with an item. Its main purpose is to restore spell casts during fights, however to my knowledge that requires a rest, so you will have to restore their hit points to what it was before the rest as well as reapplying any status effects. I can manage to restore their health to what it was before the rest, but I've hit a snag in reapplying status effects. Here's what I've managed so far:
#include "x2_inc_switches" #include "nw_i0_spells" #include "x0_i0_match" #include "nw_o0_itemmaker" void TrySavingHPWithoutTempHP(object oPC, int OldHP); int FindStatuses(object oPC); void main() { int nEvent = GetUserDefinedItemEventNumber(); if (nEvent == X2_ITEM_EVENT_ACTIVATE) { object oPC = GetItemActivator(); int OldHP = GetCurrentHitPoints(oPC); //Save Current hitpoints with Temp. HP if (GetHasEffect(EFFECT_TYPE_TEMPORARY_HITPOINTS, oPC) == TRUE) //Only do when there is Temp. HP { effect THP = EffectTemporaryHitpoints(1); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, THP, oPC, 0.1); //Apply Temp. HP for a short amount of time DelayCommand(1.3, TrySavingHPWithoutTempHP(oPC, OldHP)); //Should trigger after Temp. HP wears off } else { TrySavingHPWithoutTempHP(oPC, OldHP); } } SetExecutedScriptReturnValue(X2_EXECUTE_SCRIPT_END); } void TrySavingHPWithoutTempHP(object oPC, int OldHP) { int OldHP_T = GetCurrentHitPoints(oPC); //Saves hitpoints with Temp. HP int OldTHP = OldHP - OldHP_T; //Gets previous Temp. HP int NumberStatus = FindStatuses(oPC); //Finds total number of Statuses on character int StatusNum = 1; effect eEffect = GetFirstEffect(oPC); while (GetIsEffectValid(eEffect)) { SetLocalArrayInt(oPC, "DurType", StatusNum, GetEffectDurationType(eEffect)); //Arrays for various variables needed later SetLocalArrayInt(oPC, "SubType", StatusNum, GetEffectSubType(eEffect)); SetLocalArrayInt(oPC, "DurRem", StatusNum, GetEffectDurationRemaining(eEffect)); StatusNum += 1; RemoveEffect(oPC, eEffect); //Removes effects - don't want to double stack SupernaturalEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC); //Applies effect back on to character - should persist through rest eEffect = GetNextEffect(oPC); } ForceRest(oPC); StatusNum = 1; eEffect = GetFirstEffect(oPC); while (StatusNum <= NumberStatus) { RemoveEffect(oPC,eEffect); //Removes previously applied supernatural effect if (GetLocalArrayInt(oPC,"SubType",StatusNum) == 8) //Is Magical { if (GetLocalArrayInt(oPC,"DurType",StatusNum) == 1) //Is Temporary { MagicalEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,IntToFloat(GetLocalArrayInt(oPC,"DurRem",StatusNum))); } else { MagicalEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC); } } else if (GetLocalArrayInt(oPC,"SubType",StatusNum) == 16) //Is Supernatural { if (GetLocalArrayInt(oPC,"DurType",StatusNum) == 1) { SupernaturalEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,IntToFloat(GetLocalArrayInt(oPC,"DurRem",StatusNum))); } else { SupernaturalEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC); } } else if (GetLocalArrayInt(oPC,"SubType",StatusNum) == 24) //Is Extraordinary { if (GetLocalArrayInt(oPC,"DurType",StatusNum) == 1) { ExtraordinaryEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,IntToFloat(GetLocalArrayInt(oPC,"DurRem",StatusNum))); } else { ExtraordinaryEffect(eEffect); ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC); } } else { if (GetLocalArrayInt(oPC,"DurType",StatusNum) == 1) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,IntToFloat(GetLocalArrayInt(oPC,"DurRem",StatusNum))); } else { ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC); } } StatusNum += 1; eEffect = GetNextEffect(oPC); } SetCurrentHitPoints(oPC, OldHP_T); //Sets hitpoints to what they were previously if (OldTHP != 0) //Previously had Temp. HP { effect THP = EffectTemporaryHitpoints(OldTHP); ApplyEffectToObject(DURATION_TYPE_PERMANENT, THP, oPC); //Applies previous Temp. HP } } int FindStatuses(object oPC) { int NumStatuses = 0; effect eEffect = GetFirstEffect(oPC); while (GetIsEffectValid(eEffect)) { NumStatuses += 1; eEffect = GetNextEffect(oPC); } return NumStatuses; }
0
Comments
I'm trying to remember if the new effect overrides the old effect or gets ignored because the effect is already applied.
Also, I just realized, this gets more complicated if you want to include popular buffs like Greater Magic Weapon and other effects that get placed on items.
It seems that with ForceRest(); removing every status effect this is a lost cause.
The only other way I can think of is to make a giant switch case, basically copying all the buff and debuff spell scripts, but applying the effects with the duration left.
This definitely should not be the case. In testing, I added several supernatural effects followed by a ForceRest and all SupernaturalEffects remained. If they are permanent SupernaturalEffects that is.