• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver

MQ2Vish

randomguy_01

Well-known member
Joined
Jul 13, 2005
RedCents
54¢
Updated 7/19/06
Might compile it later today.

I got the idea to write this from the Vish macro that was posted recently by everdead.
Basically, this 'warps' you to the mournful spirit (if one is up) and says 'shoulder my burden' to cure you of the DT ae, similar to what /zone does with translocators.

I haven't gotten a chance yet to test it (maybe later tonight), but it should in theory work. If you get a chance to test it before me and it works/doesn't work- please post. :)

Rich (BB code):
// MQ2Vish.cpp : This plugin automatically cures the Vish Death-touch ae
// by moving you to the NPC that cures it and saying the expression
// 'shoulder my burden'
// This will NOT work if there are no curing NPC's (mournful spirits) up
// Author: randomguy_01, an idea based off a macro by everdead
// **************************************************  ********************
// Syntax:
// /vish - Enables/Disables the automatic curing

#include "../MQ2Plugin.h"

PreSetup("MQ2Vish");
PLUGIN_VERSION(1.0);

#ifdef PKT_UPDATE_POSITION
#undef PKT_UPDATE_POSITION
#endif

#define PKT_UPDATE_POSITION 0x178A
#define PKT_CHANNEL_MESSAGE 0x0B5A

DWORD OverlayColor = CONCOLOR_RED; // can modify this
DWORD OverlayHold = 6000; // in milliseconds
bool bVish = false;

VOID VishCmd(PSPAWNINFO pChar);
CHAR szTriggerMsg[MAX_STRING] = {0};

struct _MOVEPKT {
	unsigned short SpawnID;
	unsigned short TimeStamp;
        unsigned Heading:12;
        unsigned padding0004:20; 
        float DeltaY;       
        int Animation:10;
        unsigned Padding0012:22;
        float DeltaX;
        float Y;
        int DeltaHeading:10;
        int Padding0024:6;       
        int unknown0026:2;
	float DeltaZ;
	float Z;
	float X;
} MovePkt;

struct _MSGPACKET {
	/*0000*/ char target[64];
	/*0064*/ char sender[64];
	/*0128*/ unsigned int language;
	/*0132*/ unsigned int channel;
	/*0136*/ char padding136[8];
	/*0144*/ unsigned int languageskill;
	/*0148*/ char message[100];
} MsgPkt;

VOID VishCmd(PSPAWNINFO pChar, PCHAR szLine)
{
	if(bVish) {
		WriteChatColor("No longer curing Creeping Doom",CONCOLOR_RED);
		bVish = false;
	}
	else {
		WriteChatColor("Automatically curing Creeping Doom",CONCOLOR_GREEN);
		bVish = true;
	}
}

PLUGIN_API DWORD OnWriteChatColor(PCHAR Line, DWORD Color, DWORD Filter)
{
	DebugSpewAlways("MQ2Vish::OnWriteChatColor(%s)",Line);
	if(bVish)
	{
		if (strstr(Line, " sense your doom "))
		{
			PSPAWNINFO pChar = GetCharInfo()->pSpawn;
			ZeroMemory(&MovePkt, sizeof(MovePkt));
			ZeroMemory(&MsgPkt, sizeof(MsgPkt));

			MovePkt.SpawnID = (unsigned short)pChar->SpawnID;
			MovePkt.Heading = (unsigned int)(pChar->Heading * 4);
			
			// clear target
			pTarget = NULL;
			PSPAWNINFO psTarget = NULL;

			// /squelch won't show MQ2 default /target faulure.
			DoCommand(pChar->pSpawn,"/squelch /target mournful npc");

			if (ppTarget && pTarget) {
			   psTarget = (PSPAWNINFO)pTarget;
			}
			if (!psTarget)
			{
				WriteChatf("You have been hit with Creeping Doom!");
				MacroError("There are no mournful spirits up.");
				DisplayOverlayText("NO MOURNFUL SPIRITS UP!",OverlayColor,100,500,500,OverlayHold);
				return 0;
			}

			WriteChatf("You have been hit with Creeping Doom!");
			sprintf(szTriggerMsg,"Using %s to shoulder your burden!",psTarget->DisplayedName);
			DisplayOverlayText(szTriggerMsg,OverlayColor,100,500,500,OverlayHold);
			
			strcpy(MsgPkt.target,psTarget->Name);
			strcpy(MsgPkt.sender,pChar->Name);
			MsgPkt.channel=8;
			MsgPkt.languageskill=100;

			MovePkt.Z = psTarget->Z;
			MovePkt.Y = psTarget->Y;
			MovePkt.X = psTarget->X;

			SendEQMessage(PKT_UPDATE_POSITION, &MovePkt, sizeof(MovePkt));
			sprintf(MsgPkt.message,"shoulder my burden");
			SendEQMessage(PKT_CHANNEL_MESSAGE,&MsgPkt,sizeof(MsgPkt));
			WriteChatf("Using %s at %3.2f, %3.2f, %3.2f to shoulder your burden.",psTarget->Name,psTarget->Y,psTarget->X,psTarget->Z);
		}
	}
	
	return 0;
}

PLUGIN_API VOID InitializePlugin(VOID)
{
	AddCommand("/vish",VishCmd);
}

PLUGIN_API VOID ShutdownPlugin(VOID)
{
	RemoveCommand("/vish");
}
 
Last edited:
Call me crazy, but warping infront of a raid? Seems a bit dangerous to me.
 
no, Vish is a raid. As far as warping infront of your raid; they can only really find out if they themselves are using MQ2/showEQ/anything like that. I'd also like to add that right now the plugin DOES NOT warp you back to your original position (so you will fail casting a spell unless you change your characters heading), I need to test it or hear from others if this works as it is and then make changes.
 
I don't know many people who can one-group Vish, lol.
 
Many? Hell i dont know any.. and we used to take em down alot.

Im no master RG01

But should
Rich (BB code):
MovePkt.SpawnID = (unsigned short)pChar->pSpawn->SpawnID;
MovePkt.Heading = (unsigned int)(pChar->pSpawn->Heading * 4);

be
Rich (BB code):
MovePkt.SpawnID = (unsigned short)pChar->SpawnID;
MovePkt.Heading = (unsigned int)(pChar->Heading * 4);
 
vearroyo said:
Many? Hell i dont know any.. and we used to take em down alot.

Im no master RG01

But should
Rich (BB code):
MovePkt.SpawnID = (unsigned short)pChar->pSpawn->SpawnID;
MovePkt.Heading = (unsigned int)(pChar->pSpawn->Heading * 4);

be
Rich (BB code):
MovePkt.SpawnID = (unsigned short)pChar->SpawnID;
MovePkt.Heading = (unsigned int)(pChar->Heading * 4);

no it shouldnt because i didnt initialize it

PS. apprently phpBB likes to add two spaces needing removal (the first 500 for FadeIn) on line:
Rich (BB code):
DisplayOverlayText(szTriggerMsg,TriggerColor,100,500,500,TriggerHold);
correct that if you want to compile it.
 
So who is this plugin Designed for? IF this is to be ran in front of the open in a raid I will move to Nerfed Until its set in a non Warp way.
 
why would this be nerfed, its useful, and the user uses at his/her own risk. if they want to use it, then they must do it in front of a raid, but that is for the person to decide not a moderator.

EDIT: Why would this be moved to nerfed**
 
It's not really about the individual, but about bringing uneeded attention to MQ2 and it's warp functionality.

I don't think it's stupid to warp in front of your raid... I think it's immensely stupid and kinda like asking for a /petition => ban
 
I don't really give a shit if its moved to nerfed, I just posted it cause i thought it could be potentially useful to certain people on these forums. I don't really see the difference between doing this and using Priest of Discords/Magus to automatically send expressions to /zone (ie. South Ro/North Ro/wish to go to discord).
 
I agree, move it to Nerfed or don't move it to Nerfed. Either way I think this has a lot of potential to be developed further. I csum while standing on a pile of bodies right in front of the raid and no one knows the difference. In the heat of battle during Vish I highly doubt anyone will notice, especially if it was set to move you back to the place where you warped from.
 
mjc said:
In the heat of battle during Vish I highly doubt anyone will notice, especially if it was set to move you back to the place where you warped from.
I disagree there. Remember, each successful cure allows you to take Vish down another percent. So HMs and raid leaders do watch the cures. Summoning a corpse can be explained away with normal game mechanics. (*Shrug* beats me. Guess you died closer than you thought. I just typed /corpse and there you were") Going from one side of an instance to the other, getting cured and coming back in nanoseconds is definitely going to be noticed. Specially by the poor helpless sap that was manually running to the cloud you just warped to.

As a side note: How does the plugin handle clouds that have been used before you hail them? Does it keep moving you till it gets one that's not 'in use' by another player?
 
RedDog said:
As a side note: How does the plugin handle clouds that have been used before you hail them? Does it keep moving you till it gets one that's not 'in use' by another player?

The mournful spirits despawn after curing the DT from someone, the clouds for I guess mana and stuff is another story- this plugin does nothing for those. As of now it just checks for 1 spirit up and attempts to cure as soon as you're hit with Creeping Doom.
 
Ok appears this is working upon testing. Will not be moved to nerfed since some people are using it and it works. Just keep in mind people mass warping in any crowd leads to bans. Guild or not.
 
With audio-triggers, dealing with the death dot is extremely trivial. Warping macros just make this waaaaay too dangerous and waaaaay too noticable. Unless your guild is ok with using hacks, this is a big no-no.

Good thought, but it's very risky. With MQ2, finding the mournful spirits is already extremely trvial.
 
Well a plugin for it, nice....

I had made similar as macro and found it working great .... for me.
What it left was people who where running to a cloud thinking they where first and suddenly had no cloud anymore.
They never had the chance to switch to the next cloud seeing the one they where heading for would be used before they would reach it. Leaving them behind with less to no time to run for another = one dead friend in the guild.
Well done.......

What I found working best is a HUGE popup and Audio Trigger, combined with a target next cloud and face direction to it once, leading to = Plenty time to run to it and use it and everyone seeing you running there.

Hope this helps some to consider what you want to do, beside the pure fuctionality of this plugin.
 
Crystane said:
What I found working best is a HUGE popup
Possibly a bit off topic. If so, sorry. Just wondering, how do you make a HUGE popup? I've put several in my HUD (Invis, Stun etc) but I've never been able to adjust the size. Do you do it via a macro or using your HUD? And if in a macro, what's the syntax? I've got a shit ton of triggers I'd love to set up within the macro I keep running in the background

Back on topic, I've got a Vish event built into that same macro. It works with EQ Watcher (for the audio triggers) and gives me a pop up but it's nowhere near big enough for me to see. I'd love to make it bigger if at all possible.

Thanks
 
Well the Popup with /popup
I cannot rezise unfortunatly, but when ya play with
some chatwindows and fontsizes and so on you can make something more recognizable if the Audio doesnt do it.

Beside that am sure that whoever created /popup knows a way to resize it.

Hope that helps a bit....
 
/target Mournful spirit
/face
/keypress forward hold
/say Shoulder my Burden


delete the warp lines for those bitching about warping. Im sure that is not even close to what really needs to be put in but you get the general idea.
 
Randomguy you could try using the MOVEPACKET commands kinda like piggyzone cpp file does with the NPC Teleporters. Would be a safe way to do this, also another refrence to this is if its done fast enough you can't even notice a warp... Good example is MQ2CSUM.

Review those two plugins and you may be able to use there source to perfect this plugin.
 
Good stuff should be nearly undetectable now... No more ugly warpage lol.

Red Cent for you build master hehe.

Noobhaxor
 
Updated this plugin to check your buff slots for "Creeping Doom" by SPELLID, and if you have it to warp quickly to "Mournful Spirit" and say "shoulder my burden", and warp back ( basically the same except instead of looking for an emote it checks buff slots). Not tested yet on Vish, but have tested it by changing the Phrase (trigger), Mob (quest mob) and Spell inside and it appeared to work.

Rich (BB code):
// MQ2Vish.cpp : This plugin automatically cures the Vish Death-touch ae
// by moving you to the NPC that cures it and saying the expression
// 'shoulder my burden'
// This will NOT work if there are no curing NPC's (mournful spirits) up
// Author: randomguy_01, an idea based off a macro by everdead
// **********************************************************************
// Changed the way it triggers. Now will check Buff slots and if it sees
// Creeping Doom (SpellID 0x6646) it will warp you quickly to mournful
// spirit and say "shoulder my burden" then move you back -- much like
// mq2hail, or saytarget. 
//
// modified by Psycotic and wickedmofo/czarman
//
// Syntax:
// /vish - Enables/Disables the automatic curing

#include "../MQ2Plugin.h"

PreSetup("MQ2Vish");
PLUGIN_VERSION(1.0);

#ifdef PKT_UPDATE_POSITION
#undef PKT_UPDATE_POSITION
#endif

#ifdef PKT_CHANNEL_MESSAGE
#undef PKT_CHANNEL_MESSAGE
#endif


#define PKT_UPDATE_POSITION						0x178a // 6-13-06
#define PKT_CHANNEL_MESSAGE						0x0b5a // 6-13-06

#define VishDTSpellID 0x6646 // Spell ID # for Creeping Doom
#define CureMob "Mournful Spirit"
#define CurePhrase "shoulder my burden"

typedef struct _MSGPACKET {
/*0000*/ char target[64];
/*0064*/ char sender[64];
/*0128*/ unsigned int language;
/*0132*/ unsigned int channel;
/*0136*/ char padding136[8]; //0x01
/*0144*/ unsigned int languageskill;
/*0148*/ char message[100];
} MsgPacket, *pMsgPacket;

MsgPacket M;

typedef struct _MOVEPACKET {
/*0000*/ unsigned short SpawnID;
/*0002*/ unsigned short TimeStamp;
/*0004*/ int Heading:16;
/*0006*/ int unknown1:16;    
/*0008*/ float DeltaZ;   
/*000c*/ int Animation:16;
/*000e*/ int padding014:16;  
/*0010*/ int DeltaHeading:16; 
/*0012*/ int unknown2:16;   
/*0014*/ float Y;
/*0018*/ float DeltaY;       
/*001c*/ float DeltaX; 
/*0020*/ float Z;
/*0024*/ float X;
} MovePacket, *pMovePacket; // 40 Bytes

MovePacket P;

bool Togglevish=false;
bool SentMessage = false;

VOID vish(PSPAWNINFO pChar, PCHAR szLine)
{
	Togglevish=!Togglevish;
	WriteChatf("Auto-Curing Vish Creeping Doom is %s",Togglevish?"ON":"OFF");
}

PLUGIN_API VOID OnPulse(VOID)
{
	if (Togglevish)
	{
		int i;
		PSPAWNINFO pChar = GetCharInfo()->pSpawn;
		PCHARINFO2 pChar2 = GetCharInfo2();		
		for (i = 1; i < 21; i++)
		{
			if (pChar2->Buff.SpellID == VishDTSpellID)  //If this is VISH DT 
			{
				Target(pChar,CureMob);
					if (!pTarget || !ppTarget) return;

	PSPAWNINFO Target = (PSPAWNINFO)pTarget;
	if (Target->Type != SPAWN_NPC) return;

	// init packets
	ZeroMemory(&P, sizeof(P));
	ZeroMemory(&M, sizeof(M));
	P.SpawnID = (unsigned short)pChar->SpawnID;
	P.Heading = (unsigned int)(pChar->Heading * 4);

	strcpy(M.target,Target->Name);

	strcpy(M.sender,pChar->Name);
	M.channel=8;
	M.languageskill=100;

	// jump to
	P.Z = Target->Z;
	P.Y = Target->Y;
	P.X = Target->X;
	SendEQMessage(PKT_UPDATE_POSITION, &P, sizeof(P));

	sprintf(M.message,CurePhrase);
	SendEQMessage(PKT_CHANNEL_MESSAGE,&M,sizeof(M));
			}
		}
	}
}

PLUGIN_API VOID InitializePlugin(VOID)
{
	AddCommand("/vish",vish);
}

PLUGIN_API VOID ShutdownPlugin(VOID)
{
	RemoveCommand("/vish");
}

	
PLUGIN_API VOID OnAddSpawn(PSPAWNINFO pNewSpawn)
{
	DebugSpewAlways("MQ2Vish::OnAddSpawn(%s)",pNewSpawn->Name);
}
 
I'll be honest, I'd put in a ZoneID check. I wouldn't be surprised if a GM tried to catch hackers one day by throwing Creeping Doom on people.
 
TeachersPet said:
I'll be honest, I'd put in a ZoneID check. I wouldn't be surprised if a GM tried to catch hackers one day by throwing Creeping Doom on people.

Hmm good idea. It does have a /vish command to start it but if someone forgets to turn it off they could get nailed.
 
MQ2Vish

Users who are viewing this thread

Back
Top
Cart