• You've discovered RedGuides 📕 an EverQuest multi-boxing community 🛡️🧙🗡️. We want you to play several EQ characters at once, come join us and say hello! 👋
  • IS THIS SITE UGLY? Change the look. To dismiss this notice, click the X --->

Question - Any way to target splash heals? (1 Viewer)

Meistro

Member
Joined
Nov 19, 2014
RedCents
554¢
I was wondering if there was a way to somehow target splash heals onto MA or MA target area using holys/downs (to use it kindof like a healing rain)?

Ever since the advent of mercs, Raid Clerics have been a bit hard to come by. We usually end up with more Pallys than we do healer classes, let alone Clerics.
We have got to using them to cycle splash heals, thn spot heal while waiting for it to refesh.
This seems like a good concept, but a hard thing to do boxing. So was hoping for ideas on how one might utilize this spell line n MQ2.
 
eqmule mentioned he would like to make this happen, then i think it fell off his plate. what I and everyone else does is to target you want to splash, /face fast, /keypress f10 to hid hud, /click target, /click target, /keypress f10. it is silly, but effective enough. there are delays between each of those actions. in order to do it via holy, youd need to have it added into mq2cast as a plugin, or youd have to have a macro running that can support the process/delays involved. i had it in my spell_routines.inc as an option, and use it in mq2bot. havent particularly seen it for holyshit usage otherwise.
 
I have been working on this as well, I happen to notice EQMules code he never finished and tried to get it to work, but found that I can get it to work on the currently displayed window, but have yet been able to find a way to move the cursor on a minimized window. The windows cursor controls, like SetCursorPos() only works on the currently displayed window. If anyone knows a way to move the cursor on a minimized window, not using the SendMessage() function. This could be done.
 
Haven't tried MQ2Bot yet, but it sounds like this won't work with a mac that casts, due to possible interrupt.

I don't use the hud (and maybe I should), so wouldn't need the /keypress f10, so what kind of delays are we talking abour here?

Quick thought on down (using what you stated above)
Rich (BB code):
downshitx=/if (${Me.CombatState.Equal[COMBAT]} && ${Cast.Ready[Splash Spell]}) /multiline ; /assist MA (or /target MA) ; /face fast ; /cast "Splash Spell" gemx ] ; /click target ; /click target
Think something like this might work?
 
The way the target ring works is by passing in an extra location parameter to the CastSpell function. We should be able to do this with passing in our location that we want. I did send some offsets to functions to eqmule in hopes it would help him get it implemented, but I think he's busy right now so he has limited time to look into it.
 
I have been working on this as well, I happen to notice EQMules code he never finished and tried to get it to work, but found that I can get it to work on the currently displayed window, but have yet been able to find a way to move the cursor on a minimized window. The windows cursor controls, like SetCursorPos() only works on the currently displayed window. If anyone knows a way to move the cursor on a minimized window, not using the SendMessage() function. This could be done.

So if Cleric was "on top" of the winsows stack (or even on his own computer) we could get this to work, but nit if he was minimized or in background?

Any chance of a "beta" implement I could use in those fashions?

- - - Updated - - -

it uses splash under you not your target

So would work well "Pally Style"....75% useful, Pally could AE heal at melee location....Cleric could AE heal at "caster" location.

- - - Updated - - -

IDEAS/THOUGHTS/POSSIBILITIES .....OH MY!!
 
So if Cleric was "on top" of the winsows stack (or even on his own computer) we could get this to work, but nit if he was minimized or in background?

eqmule mentioned to me that he has an implementation that works only when in foreground (as in it will click at a target) but we should be able to provide the location if we figure out the extra location struct that is passed into EQLIB_OBJECT unsigned char EQ_Character1::CastSpell(unsigned char,int,class EQ_Item * *,int,int slot,int,int,int,int,bool,int y=1); (if memory servers me right, that int before that bool near the end is actually a pointer to a struct that is XYZ of where you clicked)

We would probably have to find the function that determines if the location makes the target ring red/green too ...

This method should also work while not in foreground :P
 
then that bool isn't a bool. the memory offset wouldn't be 2 bytes, it would need to be 3 floats, which is a lot more. it does make sense to have a location though.

It's a pointer. I'm not 100% sure that function signature is correct either >>

edit:

Well did some more poking

Rich (BB code):
struct TargetRing {
  DWORD slot; // spell gem
  float in_range;
  DWORD itemlocationstuff[3]; // item location slot or something?
  DWORD something; // something passed into CastSpell
  float squared_range;
  bool in_focus;
  BYTE pad[3];
};

Nothing useful in this struct :P This lives at 0x5c0 in _EVERQUEST, well it's a pointer to it, haven't double checked live, probably the same location.
 
Last edited:
It didn't exactly fall of my plate it's just that I moved it to the side, basically yes I can target that ring perfectly and cast splash as well as long as the window is focused, and that's also the reason why I haven't mentioned it in changes.txt... It's kinda lame to have to have the window that does it at the top all the time...

Anyway I really want to get this to work in the background as well and I will make an effort to look at it some more, the people above that have contacted me and talk to me on skype have some good ideas on how it could work, and I have taken their advice to heart and will follow every lead, the assembly for this stuff is not trivial, but I feel we are close now.

Keep bugging me until it gets done. I need the push cause it's like super boring to mess with.
 
(any addresses are from test server build Oct 27 2015)

Here is the normal run down of what happens when you cast a target ring spell.
Click gem, this will eventually call CastSpell where it will see it's got a target type of 45 and checks to see if pinstCEverQuest + 0x5c0 is null, if so it will create the TargetRing struct I posted above and return. You will have have your target ring on your screen. The TargetRing struct/class is created in the function at 0x551030 (which appears to be part of the CEverQuest class)

When you click (green or red reticle) it will call ProcessMouseEvents then CEverQuest::LMouseUp. In LMouseUp it checks if there is a target ring up at pinstCEverQuest + 0x5c0. If it is it will create another object (still need to decode this one, but the first 12 bytes are float X, float Y, float Z) in function at 0x5ffc90. This then calls the function at 0x585990 passing in the target ring object (so most likely part of this struct/class) and the newly created object that contains the location info. I haven't analyzed this function enough, but it will call CastSpell passing in the objected created in 0x5ffc90. CastSpell does do error checking and should safely return if we pass in a bad location, so we might be able to just create our own TargetRing object and place it in CEverQuest, create our own 0x5ffc90 object then call CastSpell without DBG knowing the difference, although it might be safest to emulate what a real person does to avoid any potential detection if they change stuff. Also worth noting that after returning from 0x585990 the client will delete the object at pinstCEverQuest + 0x5c0 and set it to null, so we will need to do this as well.

That's about all I've figured out so far.

Also this is what we have the RoF2 cast spell struct looking like on EQEmu (live looks the same, or mostly the same)

Rich (BB code):
struct CastSpell_Struct
{
/*00*/	uint32	slot;
/*04*/	uint32	spell_id;
/*08*/	ItemSlotStruct inventoryslot;  // slot for clicky item, Seen unknown of 131 = normal cast
/*20*/	uint32	target_id;
/*24*/	uint32	cs_unknown[2];
/*32*/	float	y_pos;
/*36*/	float	x_pos;
/*40*/	float	z_pos;
/*44*/
};

TL;DR we just really need to decode the struct created in 0x5ffc90 (test Oct 27 2015 client) or 0x5fe480 (live Oct 26 2015 client) and maybe fix up CastSpell.

Okay 0x5ffc90 is CTargetManager::Get()

EDIT:

Okay 0x600800 has something to do with making it red or green I think. -- it's the render method.

Here is the relevant stuff to target rings in CTargetManager
Rich (BB code):
//.text:005FFC99                 push    1A4h            ; size_t
//.text:005FFC9E                 call    ??2@YAPAXI@Z    ; operator new(uint)
struct CTargetManager {
/* 0x000 */ BYTE unknown[0x18c]; // other shit not used by target ring
/* 0x18c */ BYTE target_ring_in_foucs;
/* 0x18d */ BYTE padding[3];
/* 0x190 */ float target_ring_range; // squared for easier math
/* 0x194 */ float target_ring_x; // probably vec3 type class, this is whats passed to castspell
/* 0x198 */ float target_ring_y;
/* 0x19c */ float target_ring_z;
/* 0x1a0 */ BYTE target_ring_good; // red/green
/* 0x1a1 */ BYTE padding[3];
/* 0x1a4 */
};

- - - Updated - - -

Did some testing tonight, this appeared to work :P (ugly code is ugly)

Rich (BB code):
class CTargetRing {
public:
 void Cast(int);
};

DWORD CTargetRing__Cast = FixOffset(0x585990);
FUNCTION_AT_ADDRESS(void CTargetRing::Cast(int), CTargetRing__Cast);

struct Vec3 { float Y; float X; float Z; };

VOID trcast(PSPAWNINFO pChar, PCHAR szLine)
{
	if (!pTarget)
		return;
	//EzCommand("/cast 12");
	CTargetRing *pTR = (CTargetRing *)((PEVERQUEST)pEverQuest)->TargetRing;
	if (!pTR) {
		WriteChatf("No Target Ring?");
		return;
	}
	Vec3 test;
	test.Y = ((PSPAWNINFO)pTarget)->Y;
	test.X = ((PSPAWNINFO)pTarget)->X;
	test.Z = ((PSPAWNINFO)pTarget)->Z;
	pTR->Cast((int)&test);
	// need to delete the target ring object here so it stops rendering
}

typing /trcast would cast the splash at my target :D (I hit the spell gem first)
 
Last edited:
/cast 3
/keypress F10
/delay 5
/click left center
/keypress F10

change /cast 3 to the gem you have splash memmed in.

ok was actualy able to try this as hotkey.. didn't work. Wont /click left center.
Is there anyway (using EQ macro hotkey) to get it to "left mosueclick" (trired leftmouseup).
Or a way to just get it to click ANYWHERE on screen that mouse is sitting at that moment. I could work with this if i could just get the actual firing of it ....

and as far as the coding above goes.. im glad we are making progress...i understand NONE of whats there, but looks good...
 
ALL splash spells now work

11 Nov 2015 by EqMule and Demonstar55
- Please don't use MQ2 for unattended gameplay (afk botting)
- BIG NEWS!
- After a really long time, messing with this on and off
I'm proud to present support for splash spells in the cast command.
You can now cast any splash spell as long as you have a target.
If you dont have a target it will just cast it at your own location.
There is no need for window in focus, or full screen or any of that stuff
you dont even have to be facing the target.
Basically the only requirement is that its in lineofsight and in range.
The splash feature was brought to you as a joined effort
with Demonstar55 as the main contributor, his tireless dissasembling
and reverse engineering as well as updates on the progress on skype, irc etc
was a major help in bringing this to you all, so give him a shoutout!
I need to mention ctaylor22 as well for pushing me to work on it at all.
Anyway... enjoy.
- Added a new member to the Spawn TLO: CanSplashLand, it returns true or false
usage: /echo ${Target.CanSplashLand}
I suggest you use this tlo member in your macros BEFORE you try to cast a splashspell
there is no point in casting it if it wont land due to a line of sight problem.
NOTE! This check is ONLY for line of sight to the targetindicator (red/green circle)
its NOT a range check, you need to check range yourself like for every other spell
before you cast it..
 
11 Nov 2015 by EqMule and Demonstar55
- Please don't use MQ2 for unattended gameplay (afk botting)
- BIG NEWS!
- After a really long time, messing with this on and off
I'm proud to present support for splash spells in the cast command.
You can now cast any splash spell as long as you have a target.
If you dont have a target it will just cast it at your own location.
There is no need for window in focus, or full screen or any of that stuff
you dont even have to be facing the target.
Basically the only requirement is that its in lineofsight and in range.
The splash feature was brought to you as a joined effort
with Demonstar55 as the main contributor, his tireless dissasembling
and reverse engineering as well as updates on the progress on skype, irc etc
was a major help in bringing this to you all, so give him a shoutout!
I need to mention ctaylor22 as well for pushing me to work on it at all.
Anyway... enjoy.
- Added a new member to the Spawn TLO: CanSplashLand, it returns true or false
usage: /echo ${Target.CanSplashLand}
I suggest you use this tlo member in your macros BEFORE you try to cast a splashspell
there is no point in casting it if it wont land due to a line of sight problem.
NOTE! This check is ONLY for line of sight to the targetindicator (red/green circle)
its NOT a range check, you need to check range yourself like for every other spell
before you cast it..
WOOT WOOT WOOT1!!!!
Now just to figure out WHERE to put the spell in the line up.....8).

///My major thanks to all those that worked so hard to make my dream come true///

- - - Updated - - -

Still a sorta related question tho... IS there a way to make the "mouseclick" ingame using a STANDARD hot key without MQ2?
 
11 Nov 2015 by EqMule and Demonstar55
- Please don't use MQ2 for unattended gameplay (afk botting)
- BIG NEWS!
- After a really long time, messing with this on and off
I'm proud to present support for splash spells in the cast command.
You can now cast any splash spell as long as you have a target.
If you dont have a target it will just cast it at your own location.
There is no need for window in focus, or full screen or any of that stuff
you dont even have to be facing the target.
Basically the only requirement is that its in lineofsight and in range.
The splash feature was brought to you as a joined effort
with Demonstar55 as the main contributor, his tireless dissasembling
and reverse engineering as well as updates on the progress on skype, irc etc
was a major help in bringing this to you all, so give him a shoutout!
I need to mention ctaylor22 as well for pushing me to work on it at all.
Anyway... enjoy.
- Added a new member to the Spawn TLO: CanSplashLand, it returns true or false
usage: /echo ${Target.CanSplashLand}
I suggest you use this tlo member in your macros BEFORE you try to cast a splashspell
there is no point in casting it if it wont land due to a line of sight problem.
NOTE! This check is ONLY for line of sight to the targetindicator (red/green circle)
its NOT a range check, you need to check range yourself like for every other spell
before you cast it..

Curious as to why mackal wasn't listed on this or is mackal Demonstar55?
 
Question - Any way to target splash heals?

Users who are viewing this thread

Back
Top