MMOBugs MQ2 For EQMac PC Client - Beta Release

Yes I have plans to activate the spellset button so it acts exactly as on live servers.

Also about the empty spell menu, do you have spells in the spell book? On a new char with no spells there won't be a spell menu, also right now I only update the menu on first entering the game so if u scribe a new spell in the spell book it won't show up on the spell menu until you camp out/in. I will address that issue later.

About macros, today I checked in /combine ,

NOTE: This is an old server, this was 10 years before /useitem
you absolutely MUST have bags open for macros that deals with picking up items from them to work.

This means that you can now do tradesskill macros.
Use /itemnotify ${FindItem[=Rat Meat].InvSlot} leftmouseup
To pick it up then place in the spit with spices and you can
Do a /combine Spit
Or /combine pack 1 (assuming your spit is in bagslot 1)
/combine enviro would click the combine button if u have a worldcontainer open instead of a spit you carry around.

The only thing I haven't tried is how to put the rat meat which is on the cursor
Into the spit/enviro. Ill be posting a solution shortly unless someone beats me to it.

me loves you long time :)
 
Paeala.mac

Here is an example of a macro for raising your skill in brewing.

This example will work for you as soon as the new version is pushed.

As you can see, I'm not an expert at macro writing, in fact, this macro has 4 parts that basically does the same thing, and I'm sure someone with more skill than me can rip it out into its own function and make this macro like 4 times smaller, however it is pretty easy to follow what's happening in it when there is just one sub... so I'm not going to mess with optimization, after all it is an example.

Code:
| - Paeala.mac - Idea from kiola.mac
| - Version 1.0
| - This version By EqMule
| - To demonstrate a combine macro for the eqmac version of MQ2
| - This will take you to skill 46 in brewing
| 
| Open a brew barrel and your bags before you start this macro.
| You can buy Packet of Paeala Sap from Sirekoth Eshe
| in plane of knowledge at loc 110,266
| he stands just outside the building to the right
| when you cross bridge from soul binder
| he is looking right at the main bank

#turbo
#event CombineFail "You lacked the skills to fashion the items together."
#event CombineSuceed "You have fashioned the items together to create something new!"


Sub Main

/declare v61 int outer 0
/declare t9 timer
/declare slotfound int outer
/declare WAITCOUNTER int outer 0

:MakePaeala
   :DoWaterFlask
      /varset slotfound ${FindItem[=Water Flask].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a Water Flask in slot ${slotfound} 
      } else {
          /echo out of Water Flasks
          /goto :Done
      }
      :retrywater
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorWater
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for Water Flask timed out
              /goto :retrywater
          }
          /delay 1s
          /echo waiting for Water Flask...
          /goto :WaitforCursorWater
      }
      /if (${Cursor.Name.Equal[Water Flask]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in enviro
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoWaterFlask
      }
   :DoBottle
      |ok now do the Bottle
      /varset slotfound ${FindItem[=Bottle].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a Bottle in slot ${slotfound}
      } else {
          /echo out of Bottles
          /goto :Done
      }
      :retrybottle
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorBottle
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for Bottle timed out
              /goto :retrybottle
          }
          /delay 1s
          /echo waiting for Bottle...
          /goto :WaitforCursorBottle
      }
      /if (${Cursor.Name.Equal[Bottle]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in enviro
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoBottle
      }
   :DoPaealasap1
      |ok now do the Packet of Paeala Sap 1
      /varset slotfound ${FindItem[=Packet of Paeala Sap].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a Packet of Paeala Sap in slot ${slotfound}
      } else {
          /echo out of Packet of Paeala Saps
          /goto :Done
      }
      :retryPaeala1
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorPaeala1
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for Packet of Paeala Sap timed out
              /goto :retryPaeala1
          }
          /delay 1s
          /echo waiting...
          /goto :WaitforCursorPaeala1
      }
      /if (${Cursor.Name.Equal[Packet of Paeala Sap]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in enviro
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoPaealasap1
      }
   :DoPaealasap2
      |ok now do the Packet of Paeala Sap 2
      /varset slotfound ${FindItem[=Packet of Paeala Sap].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a Packet of Paeala Sap in slot ${slotfound}
      } else {
          /echo out of Packet of Paeala Saps
          /goto :Done
      }
      :retryPaeala2
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorPaeala2
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for Packet of Paeala Sap timed out
              /goto :retryPaeala2
          }
          /delay 1s
          /echo waiting...
          /goto :WaitforCursorPaeala2
      }
      /if (${Cursor.Name.Equal[Packet of Paeala Sap]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in enviro
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoPaealasap2
      }
   :DoCombine
      /varset v61 0 
      /doevents flush
      /varset t9 30s
      /combine enviro

   :DropPaeala
      /doevents
      /if (${t9}==0) {
         /echo timer was 0
         /goto :DoCombine
      }
      /if (${v61}==0) {
         /goto :DropPaeala
      }
      /echo combine time 30 - ${t9} 
      /doevents flush
   :WaitCursorBack
      /if (!${Cursor.ID}) {
         /delay 0
         /goto :WaitCursorBack
      }
      /delay 2
   :retrydrop
      /varset t9 4s
      /notify InventoryWindow IW_CharacterView leftmouseup
      /delay 1
   :WaitCursorEmpty
      /if (${Cursor.ID}) {
         /if (${t9}==0) {
             /echo timed out waiting for empty cursor
             /goto :retrydrop
         }
         /delay 0
         /goto :WaitCursorEmpty
      }
      /goto :MakePaeala
   :Done
      | yes /envclose WILL close the brew barrel (or any other open worldcontainer)
      | but I want to add some code here to empty it first
      | just in case we have stuff in it, so for now its remarked.
      |/envclose
/return

Sub Event_CombineFail
   |we got to set this to 1 even when failed cause
   /echo we get a bottle back
   /varset v61 1
/return 

Sub Event_CombineSuceed 
   /echo we succeded
   /varset v61 1
/return
 
Custom UIs and the MQ2MapWnd do not get along (or at least none of the ones I have). It can result in everything from a failure to load the UI and loading default instead to CTD when loading the character into the world or CTD when trying to loadskin. I once even got it to give me a popup that said Hey, I can't make this work, you should talk to EQMule (or something close, I may have paraphrased slightly.) Depending on exactly when the crash occurs you may have to manually edit the character UI ini and set UISkin=default in order to load the character into the world again. Some people in this thread have been experiencing some odd CTD issues, so maybe this might help them in the short term.

I realize making this custom UI friendly is probably not as big of a deal to some people as compared to say macros or moveutils so I'm offering to help do some of the work on this so it doesn't take away from other potentially higher priorities. I've dug into the custom XML that EQMMQ creates and understand what's going on. Since I don't have the source for MQ2MapWnd I can't work any further than I have to come up with a workaround or suggestion though I have some theories. If you'd like me to go into details or would like to delegate some of that work to me, please drop me a note!
 
Are you saying you can use a custom ui when running without mq2 loaded but it will crash when it's injected? I patch a few files to make map work, but I would be interested which ui files you are using that has anything to do with the map window...
 
i use the vert UI, and he is correct, i cannot get past the Character select screen without EQ crashing if i use my custom UI and MQ2. So if i want to use MQ2 i load without custom UI.
 
Any chance you can zip up your ui and pm it to me and I'll have a better chance at figuring out which file I mess with that makes it crash. Thinking some more about this, I only patch files in the default ui folder so I guess when map loads and it can't find the XML file in your custom ui folder it will crash eq... Hmm have you guys tried copying the files I patch from default ui folder to your custom ui folder? You can easily see what's needed since the files I replace are backed up with a .mq2mapold extension

here is the list of ALL the files I patch (unless they match the hash already):
Code:
	PatchEq("uifiles\\default\\EQUI.xml",IDR_EQUI,"XML",0xb2447bf0);
	PatchEq("eqstr_en.txt",IDR_EQSTR_EN,"BIN",0x3a770e94);
	PatchEq("uifiles\\default\\EQUI_MapViewWnd.xml",IDR_MAPVIEW,"XML",0x5ef0f114);
	PatchEq("uifiles\\default\\EQUI_BugReportWnd.xml",IDR_BUGREPORT,"XML",0xf698b5ec);
	PatchEq("uifiles\\default\\EQUI_EditLabelWnd.xml",IDR_EDITLABEL,"XML",0xe30247d8);
	PatchEq("uifiles\\default\\EQUI_MapToolbarWnd.xml",IDR_MAPTOOLBAR,"XML",0x627ebf06);
	PatchEq("uifiles\\default\\window_pieces04.tga",IDR_WINDOW_PIECES04,"BIN",0x7ce6605b);
	PatchEq("uifiles\\default\\cart01.tga",IDR_CART01,"BIN",0x6dea7944);
	PatchEq("uifiles\\default\\cart02.tga",IDR_CART02,"BIN",0xb72b9143);
	PatchEq("uifiles\\default\\cart03.tga",IDR_CART03,"BIN",0x269e876f);
	PatchEq("uifiles\\default\\cart04.tga",IDR_CART04,"BIN",0xd5175a57);
Basically if you copy those over to your custom ui folder, you shouldn't crash... that's just a theory though until I get a ui to test with...
 
Last edited:
Are you saying you can use a custom ui when running without mq2 loaded but it will crash when it's injected?
It will crash when MQ2MapWnd is injected. I can say a few more things too now as I have since figured out a work around and some hopefully useful details.

A fresh install of EQMac for PC with a default install of EQMMQ (which means MQ2MapWnd is loaded) on a toon with the default UI specified in their UI_toon_52.ini will work as expected.

Bug: A fresh install of EQMac for PC with MQ2MapWnd unloaded on a toon with the default UI specified in their UI_toon_52.ini will work as expected (no maps, only error is the XML error caused by old bug window). However, if you then /plugin MQ2MapWnd in game the four expected files will be created/edited but then the Consult EQMule popup appears. Click OK. CTD.

Attempts to load a character with a custom UI in the ini file or using loadskin to change to a custom UI while in game will also result in a CTD.

The fix for getting the maps working on a Custom UI required going through each of the four window XMLs and adding any missing parts from the default EQUI_Templates and EQUI_Animations files to their respective custom counterparts.

Also, due to the minimal number of windows in the EQMac UI the bug and feedback windows are often repurposed for other things by UI authors.

So, since you can't know which UI someone might be using and each one could be different the only way I can think of to make it universally custom UI friendly would be to make updating the bug window optional or even manual, rename each DrawTemplate required for the map and bug windows to something unique to the window and embed the definitions of those new DrawTemplates inside the individual window files.

To account for the different UI folders you could maybe expect the user to do something to help (i.e. copy their custom UI over the default in the default folder), change the MQ2MapWnd to act on the active UI folder instead of default, and also circumvent the loadskin command and then (re)execute the UI update.

Or you could tell people, hey, use default and be grateful we have a working MQ, you fix your UI if you want it pretty. /grin
 
Last edited:
I use a custom UI and it never crashes, I'm using a UI from a player called Pouky its on EQMac forums somewhere.
 
Or you could tell people, hey, use default and be grateful we have a working MQ, you fix your UI if you want it pretty. /grin

I think this is the best option for now.
That and removing the forced patch for bug report.
After all I only added that cause the message about missing/corrupt XML files bothered me.
 
Last edited:
I use a custom UI and it never crashes, I'm using a UI from a player called Pouky its on EQMac forums somewhere.

Its going to be entirely dependent on the design of the Custom UI. I'm very comfortable with custom UIs so if anyone gets stuck getting a particular custom UI up and running pm me.

Until then for those to whom this matters, make sure you set your toon to default before launching EQMMQ the first time and for best results, make sure MQ2MapWnd is set to load with EQMMQ the first time you run it. If you crash trying to load a custom UI after that, you know the UI needs editing.

REQUEST
Can you squelch the map window address spam, please?
 
Last edited:
anyone else having issues with /mac follow? its keeps facing the npc/pc but wont move forward/back
 
JC.MAC

yes im going to fix that follow problem, its on my todolist:

But first, here is another tradeskill macro for jewelry making:

I improved a bit on my earlier attempt and this one
is a lot easier to modify to create other stuff,
it also stops when bags are full...

Code:
| - JC.mac - Idea from kiola.mac
| - This version By EqMule
| - To demonstrate a combine macro for the eqmac version of MQ2
| - This will take you to skill 20 in Jewellery
| 
| Open your bags before you start this macro.
| Place Planar Jeweller's Kit in your last bagslot in your inventory


#turbo
#event CombineFail "You lacked the skills to fashion the items together."
#event CombineSuceed "You have fashioned the items together to create something new!"


Sub Main

/declare v61 int outer 0
/declare t9 timer
/declare slotfound int outer
/declare WAITCOUNTER int outer 0
/declare Item1 Silver Bar
/declare Item2 Malachite
/declare packname Planar Jeweller's Kit
/declare packslots int outer 0

|we get the number of slots the combinepack has for use later
/varset packslots ${FindItem[=${packname}].Container}

:MakeStuff
   :DoFirst
      /varset slotfound ${FindItem[=${Item1}].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a ${Item1} in slot ${slotfound} 
      } else {
          /echo out of ${Item1}s
          /goto :Done
      }
      :retryitem1
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorItem1
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for ${Item1} timed out
              /goto :retryitem1
          }
          /delay 1s
          /echo waiting for ${Item1}...
          /goto :WaitforCursorItem1
      }
      /if (${Cursor.Name.Equal[${Item1}]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in "${packname}"
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoFirst
      }
   :DoSecond
      |ok now do the Second Item
      /varset slotfound ${FindItem[=${Item2}].InvSlot}
      /if (${slotfound}!=NULL) {
          /echo we found a ${Item2} in slot ${slotfound}
      } else {
          /echo out of ${Item2}s
          /goto :Done
      }
      :retrysecond
      /varset WAITCOUNTER 0
      /ctrl /itemnotify ${slotfound} leftmouseup
      :WaitforCursorItem2
      /if (!${Cursor.ID}) {
          /varcalc WAITCOUNTER (${WAITCOUNTER} + 1)
          /if (${WAITCOUNTER}>5) {
              /echo wait for ${Item2} timed out
              /goto :retrysecond
          }
          /delay 1s
          /echo waiting for ${Item2}...
          /goto :WaitforCursorItem2
      }
      /if (${Cursor.Name.Equal[${Item2}]}) {
          /echo wait finished we got ${Cursor.Name} on the cursor
          |drop it into the enviro
          /itemnotify in "${packname}"
      } else {
          |crap this shouldnt happen
          /echo we had a ${Cursor.Name} on the cursor...
          /echo dropping it in inventory
          /notify InventoryWindow IW_CharacterView leftmouseup
          /delay 1s
          /goto :DoSecond
      }
   :DoCombine
      /varset v61 0
      /doevents flush
      /varset t9 30s
      /combine "${packname}"

   :DropItemIntoInventory
      /doevents
      /if (${t9}==0) {
         /echo timer was 0
         /goto :DoCombine
      }
      /if (${v61}==0) {
         /goto :DropItemIntoInventory
      }
	  /if (${v61}==1) {
         /goto :WaitCursorEmpty
      }
      /echo combine time 30 - ${t9} 
      /doevents flush
   :WaitCursorBack
      /if (!${Cursor.ID}) {
         /delay 0
         /goto :WaitCursorBack
      }
      /delay 2
   :retrydrop
      /varset t9 4s
          | as long as your combinebag is in last invslot, this will make it stop before items fill it up
	  /if (${Me.FreeInventory}==${packslots}) {
	     /echo No more room in bags
		 /goto :Done
	  }
      /notify InventoryWindow IW_CharacterView leftmouseup
      /delay 1
   :WaitCursorEmpty
      /if (${Cursor.ID}) {
         /if (${t9}==0) {
             /echo timed out waiting for empty cursor
             /goto :retrydrop
         }
         /delay 0
         /goto :WaitCursorEmpty
      }
      /goto :MakeStuff
   :Done
      | yes /envclose WILL close the open worldcontainer
      | but I want to add some code here to empty it first
      | just in case we have stuff in it, so for now its remarked.
      |/clearenviro is what im gonna call the command that does this...
      |/envclose
/return

Sub Event_CombineFail
   /echo we failed
   /varset v61 1
/return 

Sub Event_CombineSuceed 
   /echo we succeded
   /varset v61 2
/return
 
Last edited:
Any chance of getting mq2twist added please? (if possible ofc)
 
I'm certain we can fix all non invasive plugins eventually. Mq2twist is on our todo list.
I've been busy with the macro handling and also I just got mq2moveutils to work expect an update in a day or so, follow is fixed as well I just wanted to get some more stuff in before the next release.
 
Last edited:
I've completed MQ2Twist for this. I also did MQ2Exchange - I had to do that anyway, so that twist could swap items properly.

It'll be in next push, maybe today, we'll see.

htw