Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "hg_inc"
- #include "ac_spell_inc"
- int GetIsHeraldAoE(object oAoE) {
- string sTag = GetTag(oAoE);
- if (sTag == "VFX_PER_FOGFREEZE" ||
- sTag == "VFX_AOE_CONSECRATE_20" ||
- sTag == "VFX_PER_FOGACID" ||
- sTag == "VFX_PER_FOGKILL" ||
- sTag == "VFX_PER_FOGMIND" ||
- sTag == "VFX_PER_FOGSTINK")
- return TRUE;
- return FALSE;
- }
- struct SpellInfo GetPersistentAoESpellInfo ();
- #pragma default_function(GetPersistentAoESpellInfo)
- int GetPersistentAoELimit (struct SpellInfo si);
- #pragma default_function(GetPersistentAoELimit)
- int GetPersistentAoEEffect (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEEffect)
- string GetPersistentAoETag (struct SpellInfo si);
- #pragma default_function(GetPersistentAoETag)
- string GetPersistentAoEName (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEName)
- int GetPersistentAoETargetMask (struct SpellInfo si);
- #pragma default_function(GetPersistentAoETargetMask)
- int GetPersistentAoETargetType (struct SpellInfo si);
- #pragma default_function(GetPersistentAoETargetType)
- object GetPersistentAoEPlaceable (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEPlaceable)
- float GetPersistentAoEDuration (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEDuration)
- effect GetPersistentAoEImpactEffect (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEImpactEffect)
- effect GetPersistentAoEDurationEffect (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEDurationEffect)
- effect GetPersistentAoEVisualEffect (struct SpellInfo si);
- #pragma default_function(GetPersistentAoEVisualEffect)
- void ApplyAoEEffect (struct SpellInfo si, object oAoE, object oTarget, effect eEff, effect eDur, effect eVis);
- #pragma default_function(ApplyAoEEffect)
- float GetPersistentAoERemaining (object oAoE) {
- int nRemaining = GetLocalInt(oAoE, "AoEExpires") - GetLocalInt(GetModule(), "uptime");
- return IntToFloat(nRemaining < 1 ? 1 : nRemaining);
- }
- void DoAoEHeartbeat (struct SpellInfo si, object oAoE, effect eEff, effect eDur, effect eVis, object oPlace) {
- int bDestroy = FALSE, bAllPCs = FALSE;
- if (!GetIsObjectValid(oAoE)) {
- SetPlotFlag(oPlace, FALSE);
- DestroyObject(oPlace);
- return;
- }
- /* Storm of Vengeance doesn't destroy properly sometimes */
- if (GetPersistentAoEEffect(si) == AOE_PER_STORM) {
- if (si.id == SPELL_STORM_OF_VENGEANCE && GetLocalInt(GetArea(oAoE), "Area_Underwater"))
- bAllPCs = TRUE;
- if (GetLocalInt(GetModule(), "uptime") > GetLocalInt(oAoE, "AoEExpires"))
- bDestroy = TRUE;
- }
- if (bDestroy ||
- !GetIsObjectValid(si.caster) ||
- GetIsDead(si.caster) ||
- GetArea(si.caster) != si.area) {
- SetPlotFlag(oAoE, FALSE);
- SetPlotFlag(oPlace, FALSE);
- DestroyObject(oAoE);
- DestroyObject(oPlace);
- return;
- }
- DelayCommand(6.0, DoAoEHeartbeat(si, oAoE, eEff, eDur, eVis, oPlace));
- AddLocalInt(oAoE, "AoERounds", 1);
- if (!LineOfSightObject(oAoE, si.caster))
- return;
- si.target = oAoE;
- int nMask = GetPersistentAoETargetMask(si);
- int nType = GetPersistentAoETargetType(si);
- for (si.target = GetFirstInPersistentObject(oAoE, nMask);
- GetIsObjectValid(si.target);
- si.target = GetNextInPersistentObject(oAoE, nMask)) {
- if (GetIsSpellTarget(si, si.target, nType) || (bAllPCs && GetIsPC(si.target))) {
- if (nType == TARGET_TYPE_ALLY)
- SignalEvent(si.target, EventSpellCastAt(si.caster, si.id, FALSE));
- else
- SignalEvent(si.target, EventSpellCastAt(si.caster, si.id));
- AssignCommand(si.caster, DelayCommand(GetRandomDelay(0.5, 4.5), ApplyAoEEffect(si, oAoE, si.target, eEff, eDur, eVis)));
- }
- }
- }
- void StartAoEHeartbeat (struct SpellInfo si, string sTag, effect eEff, effect eDur, effect eVis, object oPlace, int nUntil, int nLimit) {
- int nCount = 1;
- object oLoc, oAoE;
- do {
- oLoc = GetNearestObjectToLocation(OBJECT_TYPE_ALL, si.loc, nCount++);
- } while (GetTag(oLoc) == sTag);
- nCount = 1;
- oAoE = GetNearestObjectByTag(sTag, oLoc);
- while (GetIsObjectValid(oAoE)) {
- if (GetAreaOfEffectCreator(oAoE) == si.caster && !GetLocalInt(oAoE, "AoEHeartbeat")) {
- SetLocalInt(oAoE, "AoEHeartbeat", 1);
- SetLocalInt(oAoE, "AoEExpires", nUntil);
- SetLocalInt(oAoE, "AoESpellId", si.id);
- SetLocalInt(oAoE, "AoESP", si.sp);
- if ((si.id >= HGSPELL_FONT_OF_VISION &&
- si.id <= HGSPELL_FONT_OF_PURIFICATION) ||
- si.id == HGSPELL_FONT_OF_THAUMATURGY)
- SetLocalInt(oAoE, "NoGust", 1);
- if (nLimit == -2)
- SetLocalInt(oAoE, "AoEDispelResistance", 25);
- DelayCommand(0.0, DoAoEHeartbeat(si, oAoE, eEff, eDur, eVis, oPlace));
- return;
- }
- oAoE = GetNearestObjectByTag(sTag, oLoc, ++nCount);
- }
- }
- void main () {
- struct SpellInfo si = GetPersistentAoESpellInfo();
- if (si.id < 0)
- return;
- float fDur = GetPersistentAoEDuration(si);
- string sTag = GetPersistentAoETag(si);
- effect eAoE = EffectAreaOfEffect(GetPersistentAoEEffect(si),
- (si.id == SPELL_GREASE ? "nw_s0_greasea" : "****"), "****", "****");
- int nLimit = GetPersistentAoELimit(si);
- if (nLimit > 0) {
- int nFound = 0, nCount = 1;
- object oOther, oCreator, oArea = GetArea(si.caster);
- while (GetIsObjectValid(oOther = GetNearestObjectByTag(sTag, si.caster, nCount++))) {
- oCreator = GetAreaOfEffectCreator(oOther);
- if (oCreator == oArea || GetLocalInt(oOther, "NoAoEDispel"))
- continue;
- if (GetIsPC(si.caster) && GetIsPC(oCreator)) {
- if (GetIsHeraldAoE(oOther)) {
- if (!GetIsQuasiclass(QUASICLASS_HERALD_OF_STORMS, oCreator))
- nFound++;
- } else
- nFound++;
- } else if (GetFactionEqual(si.caster, oCreator)) {
- nFound++;
- }
- if (nFound >= nLimit) {
- object oPlace = GetLocalObject(oOther, "AoEPlaceable");
- SetPlotFlag(oOther, FALSE);
- SetPlotFlag(oPlace, FALSE);
- DestroyObject(oOther);
- DestroyObject(oPlace);
- if (nFound == nLimit)
- FloatingTextStringOnCreature("To prevent lag, only " +
- IntToString(nLimit) + " " + GetPersistentAoEName(si) +
- " spell" + (nLimit == 1 ? "" : "s") + " may exist in an area at the same time.", si.caster);
- }
- }
- } else if (nLimit == -1) {
- object oOther, oCreator, oArea = GetArea(si.caster);
- string sAoETag;
- for (oOther = GetFirstObjectInArea(oArea); GetIsObjectValid(oOther); oOther = GetNextObjectInArea(oArea)) {
- oCreator = GetAreaOfEffectCreator(oOther);
- if (GetObjectType(oOther) != OBJECT_TYPE_AREA_OF_EFFECT ||
- oCreator != si.caster)
- continue;
- if (GetIsQuasiclass(QUASICLASS_HERALD_OF_STORMS, oCreator) && //heralds ignore herald spells in this check - that limit handled in -2
- GetIsHeraldAoE(oOther))
- continue;
- sAoETag = GetTag(oOther);
- if (GetLocalInt(si.caster, "DebugSpells"))
- FloatingTextStringOnCreature("AoE Tag: " + sAoETag, si.caster, FALSE);
- if (FindSubString(" VFX_PER_FOGACID VFX_PER_FOGFIRE VFX_PER_FOGFREEZE VFX_PER_STORM VFX_PER_RAINFIRE VFX_PER_RAINFREEZE VFX_AOE_CONSECRATE_20 VFX_MOB_MENACE ",
- " " + sAoETag + " ") >= 0) {
- object oPlace = GetLocalObject(oOther, "AoEPlaceable");
- SetPlotFlag(oOther, FALSE);
- SetPlotFlag(oPlace, FALSE);
- DestroyObject(oOther);
- DestroyObject(oPlace);
- FloatingTextStringOnCreature("Only one area of effect damage field may exist per caster in an area at the same time.", si.caster);
- }
- }
- } else if (nLimit == -2) {
- object oOther, oArea = GetArea(si.caster);
- int nFound;
- for (oOther = GetFirstObjectInArea(oArea); GetIsObjectValid(oOther); oOther = GetNextObjectInArea(oArea)) {
- if (GetObjectType(oOther) != OBJECT_TYPE_AREA_OF_EFFECT ||
- !GetIsQuasiclass(QUASICLASS_HERALD_OF_STORMS, GetAreaOfEffectCreator(oOther)))
- continue;
- if (FindSubString(" VFX_PER_FOGACID VFX_PER_FOGSTINK VFX_PER_FOGKILL VFX_AOE_CONSECRATE_20 VFX_PER_FOGFREEZE VFX_PER_FOGMIND ",
- " " + GetTag(oOther) + " ") >= 0) {
- nFound++;
- if (nFound >= 2) {
- object oPlace = GetLocalObject(oOther, "AoEPlaceable");
- SetPlotFlag(oOther, FALSE);
- SetPlotFlag(oPlace, FALSE);
- DestroyObject(oOther);
- DestroyObject(oPlace);
- if (nFound == 2)
- FloatingTextStringOnCreature("Only two herald of storms clouds may exist in an area at the same time.", si.caster);
- }
- }
- }
- }
- effect eEff = GetPersistentAoEImpactEffect(si);
- effect eDur = GetPersistentAoEDurationEffect(si);
- effect eVis = GetPersistentAoEVisualEffect(si);
- object oPlace = GetPersistentAoEPlaceable(si);
- AssignCommand(si.area, DelayCommand(2.0, StartAoEHeartbeat(si, sTag, eEff, eDur, eVis, oPlace,
- GetLocalInt(GetModule(), "uptime") + FloatToInt(fDur), nLimit)));
- ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAoE, si.loc, fDur);
- }
Advertisement
Add Comment
Please, Sign In to add comment