Page 1 of 5
Cleric AEHealv1.4 - Heal everyone in range who needs it.
Posted: Wed Sep 22, 2004 1:31 pm
by Neolesh
This is my first macro posting that wasn't mostly ripped off material. I wrote most of this from scratch with a little help from folks over some commands I didn't understand when I started.
Usage for this macro is as follows: /macro AEHeal <#>
Where # is the approximate # of people within 220 feet of you. Usually raid size minus 4 or 5 is what I notice. If you put in a number that is too large the macro will waste time trying to target up to the number you specified. There was a way to stealth check hp instead of actually targeting them but I found that for some reason it wasn't healing people who needed it and those who didn't need it (who had low hp at some point but had been healed already) were getting healed. So I reverted it back to actually targeting each player.
Now supports autointerupt if player is healed!! Save that Mana!! Thank you fantum409 for the tip!
One issue is if someone is using HOTT and targets your cleric they will see your target changing rapidly. Not nearly as fast as it actually is but definately faster than normal so be aware of this. I usually average about 80 - 90 checks per second, your game framerate seems to have a lot to do with how many checks you make per second. If there is a way to make this more efficient or faster please feel free to do it, all I ask is that you post it so we can all benifit.
One more thing, monks are left out intentionally because where I come from they are usually pulling and healing them can be disasterous.
AEHeal.mac
Code: Select all
| Version 1.4
| AE AutoHeal
| Usage /macro AEHeal <Number of players to check for>
| Example: /macro AEHeal 40
| Will check the closest 40 people to the cleric and heal them apropriately.
| Macro will automatically calculate and echo the number of players check per second, every cycle.
| Looking at the ground (Increasing frame rate) seems to increase number of targets per second drastically.
|
|Known Issues:
| Not healing Shadow Knights at this time.
|
#include spell_routines.inc
Sub Main
/echo AEHeal Macro Activated!
/declare PlayersTarg int outer
/declare Targets int outer
/declare Players int outer
/declare CasterList string outer
/declare TankList string outer
/varset Targets 1
/varset TankList |Warrior|Shadow Knight|Paladin|
/varset CasterList |Necromancer|Wizard|Enchanter|Magician|Rogue|Druid|Cleric|Bard|Shaman|Beastlord|Berserker|Ranger|
:verify
/if (!${Defined[Param0]}) {
/echo You must specify the number of players near you first!
/end
} else {
/varset PlayersTarg ${Param0}
/echo ${PlayersTarg} players will be targeted and healed. Every ${PlayersTarg} players targeted, targets per second will be calculated!
:start
/varset Players ${PlayersTarg}
/target ${Me}
/call ClassCheck
| /echo ${Targets}
/if (${Macro.RunTime}>0) {
/echo Players per second! ${Math.Calc[${Targets}/${Macro.RunTime}]}
}
:TargetCycle
/varcalc Players ${Players}-1
/target PC radius 240 Next
/call ClassCheck
/if (${Players}<1) {
/varcalc Targets ${Targets}+${PlayersTarg}
/goto :start
} else {
/goto :TargetCycle
}
/return
Sub ClassCheck
/if (${CasterList.Find[|${Target.Class}|]}) /call HealcheckCaster
/if (${TankList.Find[|${Target.Class}|]}) /call HealcheckTank
/return
Sub HealcheckCaster
/if (${Target.PctHPs}<79) {
/call Cast "Pious Remedy" spell 2s CheckHP
}
/return
Sub HealcheckTank
/if (${Target.PctHPs}<65 && ${Target.Distance}<120) {
/call Cast "Supernal Light" spell 2s CheckHP
}
/return
Sub CheckHP
/if ( ${Target.PctHPs}>=83 ) /call Interrupt
/return
Posted: Wed Sep 22, 2004 2:38 pm
by A_Druid_00
The best way to do this would be systematically targeting the npcs in a given radius and /assist'ing them to find your heal targets. That way you're not wasting time checking targets that aren't even aggro. I'd also have to guess it'd look a lot less suspicious than targeting 80-90 people every second does; might even want to pause for a small amount of time after assisting each mob to allow your target's HPs to update before moving on to the next assist.
At least, that's how our clerics did it on raids before HoTT came about. I suppose the need to /assist the mobs isn't as great if you have HoTT. But, /assist healing still tends to be faster than waiting for the HoTT window to refresh if the mob is changing targets rapidly; which it will be in most clearing situations unless you have really conservative melees or really bad ass aggro tanks.
Also, the ability to duck out of heals if a target gets healed before yours lands is almost a necessity with this method of healing, or your cleric will be OOM pretty fast while actually doing very little healing in comparison to a cleric that's on top of his game.
Anyway, just some pointers on the actual methods that I know some successful assist healers use. I have no idea how to code something like that or I'd have released a macro that does exactly what I describe as soon as I started using MQ; as I hate constantly assist healing on raids.
Posted: Wed Sep 22, 2004 2:47 pm
by peach
people getting rampage arent targeted by the mob, so that wouldnt work in raids
Posted: Wed Sep 22, 2004 2:51 pm
by A_Druid_00
The rampage tank is set on engage, and healers are assigned to heal said rampage tank.
Why would you have to guess who your ramp tank is anyway? It's the very first person to get aggro on the mob; unless of course you manage to let him die, which isn't exactly easy unless A) Your Ramp healers suck ass, or B) Your Ramp tanks sucks ass.
AE ramp is a different animal though; so yes it'd suck there. But, we generally leave AE ramp healing up to the healer in each group. That, and pray our melees are smart enough to know what max melee range is.
Posted: Wed Sep 22, 2004 11:00 pm
by fantum409
When you target someone, you're qerying the server for the hp. Your client is not notified of PC HP within a given radius. Therefore, SONY may not notice if they not looking, but this would show up like a flashing sign "MACROQUEST RUNNING" LOL if they chose to look.
Someone please correct me if I'm wrong on this, cause if there is a way to know HP of a PC without targeting them, and without using HoTT, I would love to incorporate that into AFCleric.
How were you "stealth checking" HP?
Posted: Thu Sep 23, 2004 3:59 pm
by Neolesh
I don't have access to the post where the guy said it could be done, I'll see if I still have the code lying around.
here it is..
Code: Select all
Sub Main
/declare Player int outer
/declare MaxPlayer int outer 50
/declare HPtoHeal int outer
/declare PCID int outer
/declare TankHP int outer 80
/declare CasterHP int outer 70
/declare CasterList string outer
/declare TankList string outer
/declare HealSpell string outer
/varset TankList |Warrior|Shadow|Paladin|Beastlord|Ranger|Berserker|
/varset CasterList |Necromancer|Wizard|Enchanter|Magician|Rogue|Druid|Cleric|Bard|Shaman|
:Mainloop
/for Player 1 to ${MaxPlayer}
/if (${NearestSpawn[${Player}, pc radius 250].ID}) {
/varset PCID ${NearestSpawn[${Player}, pc radius 250].ID}
/call HealCheck
}
/next Player
/goto :Mainloop
/return
Sub HealCheck
/call ClassCheck
/if (${Spawn[${PCID}].PctHPs} < ${HPtoHeal}) {
/target ID ${PCID}
/delay 5
/echo Casting ${HealSpell} on %t
/g ${HealSpell} [ %t ]
/call Cast "${HealSpell}"
}
/return
Sub ClassCheck
/if (${CasterList.Find[|${Spawn[${PCID}].Class}|]}) {
/varset HealSpell Supernal Remedy
/varset HPtoHeal ${CasterHP}
}
/if (${TankList.Find[|${Spawn[${PCID}].Class}|]}) {
/varset HealSpell Supernal Light
/varset HPtoHeal ${TankHP}
}
/return
for the record, this did not work for me.
Posted: Thu Sep 23, 2004 4:03 pm
by Neolesh
I thought about the /assist thing. I didn't think it would work just because of several things. Rampage and AE for 1. Also assisting is just way too slow. Targeting with MQ is seemingly instantanious where as the /assist still works off the regular EQ targeting system which is very slow. With this macro I can target and check 20 people in the time it would take to target and assist 1 mob. Sometimes there are 5 - 10 mobs around and /assisting them all could take a long time and a mob could easily switch targets, hurt someone severely, switch back and you'd never know it because it takes so long to /assist mobs.
Posted: Thu Sep 23, 2004 5:35 pm
by TheAFKBard
Doing class checking by short name will probably mke this work for SKs. It seems like the space is throwing it off.
Posted: Thu Sep 23, 2004 9:48 pm
by A_Druid_00
I find it hard to believe that the macro is actually retrieving the updated HPs for each of those targets every cycle regardless. Each time you target something, you have to wait for an HP update to come back from the server for your target, it's not sending them constantly. That's the reason you couldn't get it to work right without actually targetting people as well. I just can't fathom that you're able to get the server to give you 80-90 actual HP updates per second. More likely, you're basing your decision on whether or not to heal using old HP updates each cycle instead of up to date and accurate ones, at least for the great majority of those 80 or 90 people you're checking. Granted, I haven't given your macro a spin yet; it just screams 'Hi, I'm macroing' to me. And, since all the clerics I bot are guildies; I don't want to risk a suspension/banning on raids to test it out. I need a good mule account
Also, I can't understand how you think assisting 4-5 mobs is slower than cycling through every PC in a 220 foot radius. While you may be cycling through 80-90 people a second, I highly doubt you're getting accurate HP figures for all 80-90 of them anyway, for the reasons I stated above. Sure, the assist method doesn't account for AEs or AE Rampage, but to be honest those things are generally handled by MGB heals and spot healing anyway.
I can't say I'd ever use a macro like this on actual boss encounters regardless; it's more useful for clearing to named and whatnot, where AEs and AE ramp aren't an issue. There are macros that handle the other clerical raid functions better IMO. 90% of the non-MT healing on actual boss mobs is done by the druids and shamans in my guild, since the few clerics we have online are usually busy cycling.
I'm not trying to knock your macro or anything, don't get me wrong. It's really a pretty fine contribution considering your short time spent on the boards. Hell, it's more than I can say I've done. I just felt the need to give some feedback, take it for what its worth.
Posted: Thu Sep 23, 2004 10:13 pm
by Neolesh
I usually use this for clearing and I am very confident that it doesn't miss a beat on getting a current HP check. It seems that you when you target someone you imediately get the lowest HP% that person has been at since the last time you targeted them. Sometimes this causes you to heal someone who is already been healed because as you target them they might show up at 40% then pop to 100% in a split second but the macro heals anyway. This is why I would like for someone to add auto-interupt code :)
Posted: Fri Sep 24, 2004 12:16 am
by fantum409
change the
to
Code: Select all
/call Cast "Supernal Light" spell 2s CheckHP
Then add a sub routine
Code: Select all
Sub CheckHP
/if ( ${Target.PctHPs}>=80 ) /call Interrupt
/return
Thats right out of the spell_routins.inc header btw.
I havent tested your macro either, but I suspect that your client polls the server for HP but actually cycles through targets several times before it has accurate info on hand. Even then, I don't doubt a lot of spells will start to cast then get ducked. It does take a second or more to obtain HP info on any given target, but this is polling data so fast that you can keep a steady stream of info rolling. Cool idea, just hope SONY doesn't bother to check for this type of activity. Then again, there are a lot of active hacks floating around that I have always though should be easy to bust people with, yet people keep on doing it.
Good luck
Posted: Fri Sep 24, 2004 10:00 am
by A_Druid_00
I'm just leery of any macro that hits the servers more times per second than any human reasonably can. And I still can't believe you're getting that many HP updates in the span of a second; I think Fantum has it nailed in his post. It may seem like its getting all those updates, but how can you tell when it's moving faster than you can even blink. Plus, it's impossible to gauge whether or not you got an actual HP update when 95% of the people you're checking aren't taking any damage (well, short of actually sniffing out these sorts of things). You can probably pause 200ms between checks and get the same or better results. That's why I originally suggested the /target NPC, /assist, and pause method.
Posted: Fri Sep 24, 2004 10:48 am
by eqjoe
fantum409 wrote: but this would show up like a flashing sign "MACROQUEST RUNNING" LOL if they chose to look.
Not if you have one of those niffy tinfoil hats on while your playing.....
-j
Posted: Fri Sep 24, 2004 3:32 pm
by Neolesh
A_Druid_00 wrote:I'm just leery of any macro that hits the servers more times per second than any human reasonably can. And I still can't believe you're getting that many HP updates in the span of a second; I think Fantum has it nailed in his post. It may seem like its getting all those updates, but how can you tell when it's moving faster than you can even blink. Plus, it's impossible to gauge whether or not you got an actual HP update when 95% of the people you're checking aren't taking any damage (well, short of actually sniffing out these sorts of things). You can probably pause 200ms between checks and get the same or better results. That's why I originally suggested the /target NPC, /assist, and pause method.
Just try it for yourself. You'll soon understand why I am so confident this works.
Posted: Fri Sep 24, 2004 8:36 pm
by Clueless_Coder
Yes I am a total n00b. I am the first to admit it My knowldge of C++ is zero to none, so anything I'm doing is purely seat of my pants stuff, trying to learn from reading these boards and experimentation with the great work you all do with these macro s and plugins.
That said, I'm having some problems with the AEHeal macro. I'created it and compiled it etc (I'm not THAT much of a n00b

) but when I attempt to run it in game I get an error and I'm at a loss to know how to fix it
To test it, I loaded it using /macro aeheal 10 and received the following error:
failed to parse /if condition "(4=0)" non numeric encountered
aeheal .mac @49 /if (${Players}=0) {
Current macro has ended
I realize it's telling me theres an error in line 49 of the macro, but since I'm (as my name says) a clueless coder, I have no idea what's wrong. With the exception of substituting Holy Light for Supernal Light and Supernal Remedy for Pious Remedy I lifted the code right from the post here (including the small modification fantom409 posted, which occurs much later in the macro)
Can anyone shed any light on what I'm doing wrong?