• 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
Farm.mac

Release [Macro] Farm.mac 1.21

No permission to download
I've been unable to reproduce the bug that the previous member mentioned. I turn on farm
Code:
/mac farm 1000
and it goes and kills things.

Code:
Sub Main(int Param0, string Param1)
    /declare PullRange int outer ${Param0}
    /declare FarmMob string outer ${Param1}

Above is the entrance to Sub Main. So here it's saying that the first parameter is the PullRange, if you don't give it a 1st parameter, it doesn't have a pullrange. If you start it without a parameter, you can type /farm radius ###, where the number is the pullrange to use. As I said in my previous post, these are the only two ways to set the pullrange.

/call CheckINI ${Settings} Camp CampRadius int 60
The CampRadius was never used in Farm.mac, but rather was part of PullFarm. I simply never removed it. So my fault there as it's apparently causing confusion. It's in the INI, but it affects nothing. I'll be sure and remove it from any following copies of the macro and encourage you to read the overview.

In the overview where I posted the initial comments on this plugin I also put
Code:
|Usage: /mac Farm radius target ~~ /mac farm 500 pyrilen
| /mac farm radius ~~ /mac farm 1000

You'll see above that it specifies a range. Which based on current issues users are having with reading and understanding those two line would imply I should just do away with the range as an option all together and set it to just encompass the entire zone. In the mean time, if you want to see what your current radius for pulling is, simply type /pull radius and it should output your current radius.

If you find that it reports a radius, that mobs fall inside of and it's still not pulling, try /farm zradius and it should tell you your current zradius, if the mob falls inside of both of those and the issue persists, then verify your MedAt, HealAt, MedEndAt values. to get a full list of commands in game /farm help. Alternately you can go to the commands list for Farm.mac on the overview page, which will tell you all the commands and what they do.

I hope this gets you going.
 
I went and tried again today and now it works /boggle. Either way, thank you for sticking to helping me. My ranger is owning POF now. Ty :)
 
Very happy I "found" this. I was having significant problems with Kiss11.001 farming haze panthers in Wakening Lands. Kiss in Hunter mode will frequently stop operating with no errors or feedback. (I've tried 3 different meshes too!) While in the process of writing up the Problem Report over on that thread it dawned on me that I was "farming" and I had seen macros for doing just that.

This works so much cleaner, simpler and faster!

Thanks for this!
 
Very happy I "found" this. I was having significant problems with Kiss11.001 farming haze panthers in Wakening Lands. Kiss in Hunter mode will frequently stop operating with no errors or feedback. (I've tried 3 different meshes too!) While in the process of writing up the Problem Report over on that thread it dawned on me that I was "farming" and I had seen macros for doing just that.

This works so much cleaner, simpler and faster!

Thanks for this!

Yea, this saved my freakin life when I was doing the slayer achievements.
 
I ran into an issue for the first time today that had my mage stuck in a corpse lock. He wouldn’t clear the previous corpse, and would spam that he couldn’t find any of that name around.
 
I see people posting the issues and I'm not without a dislike of my own for seeing those issues. I'm currently occupied working on a private project for a paying customer, once I'm done with that I'll be able to look into the issues mentioned here.

For those of you using Farm.mac to farm dervishes, Dervishes are reporting higher than 100% health in most cases and that is causing Farm.mac to pass them up (it was an attempt to avoid pulling mobs with less than 100% health) You can fix -that- issue by changing the health check to be >=100 instead of ==100. The following snippit is the current code.

Code:
/if (${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].PctHPs} == 100) {

it should be changed to

Code:
/if (${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].PctHPs} >= 100) {

On my existing copy this is line 135, but a copy of the current code and a CTRL+F followed by pasting the code into the search box should take you there. I'm not sure that this issue doesn't exist in other locations and it may fix issues with people passing up valid targets that recently started occurring.

If anyone would like to test that and let me know if that solves any issues it would be greatly appreciated. I will revisit the thread and try to address specific issues once my current task is complete.
 
I tried the farm.mac today but my chars are stuck in an Mana / HP check. How can this be fixed ?
 
Is there a way to use a Ranger's autofire capability with this? I have endless quiver and it seems like a better plan to use my bow rather than my swords. Thank you.
 
Ok I tried Range earlier and never even tried with a d. thank you for that.
 
Awesome little macro, I've been using it to do a few remaining hunters in old world, saved me a lot of carpal tunnel running in circles.

I have noticed at times it ignores the ignore list. I'll set up ignore list (especially for friendly npcs) and come back to find myself killing them. Tanked a few city factions, but no big deal.

Also it insta crashes out my toon if the ignore list is too long. Only really happened in rathe mountains for example, I threw a the City npcs on ignore as well as the various guards scattered around. Instant crash when I'd start it. Delete ignore list or shrink it and it doesn't crash anymore.
Any ideas?
Thanks!
 
mq2 only lets you store up to 2048 characters of text. So when using the INI to store the ignore list, try to ignore the things in your area if the list is going to be too big.
1558522199498.png

In the code I only collect NPC's in the groups up to 1900 characters, if it exceeds that then it just doesn't add them. The lil lists are just to make copy/paste easy though. But they shouldn't ever exeed 1900 characters to avoid crashes.
 
Ah that makes sense! Rathe has a Ton of npcs. Thankfully the respawn is fast enough that I don't get too much wandering from start position. Didn't wanna find the toon murdering frog town, but doesn't seem an issue thus far. I'll definitely keep in mind that limitation moving forward though.
 
Ah that makes sense! Rathe has a Ton of npcs. Thankfully the respawn is fast enough that I don't get too much wandering from start position. Didn't wanna find the toon murdering frog town, but doesn't seem an issue thus far. I'll definitely keep in mind that limitation moving forward though.

What model are you trying to kill in Rathe?
 
Pretty much everything in a given area, multiple types of placeholders for the named I was working on. I considered dragging a full group out and setting them each to one model for the area but ended up just with the one for now
 
Pretty much everything in a given area, multiple types of placeholders for the named I was working on. I considered dragging a full group out and setting them each to one model for the area but ended up just with the one for now

oh, sorry, I confused hunter with slayer. I thought you were doing slayer stuff.
 
No worries! Appreciate trying to help :)
For now seem to have gotten the right NPCs blocked and just the right distance so toon doesn't end up finding stuff outside her spot. Hopefully I'll get the named to spawn today before work, last two for original EQ.
 
One more question! Is there any way to disable assisting?
I've been taking multiple toons to a zone and running them with specific targets (E.g. You go kill beetles, you spiders, you rats), or sometimes just on general in different spots of the zone for different named.
Very quickly in some zones (and not others, no idea why), one toon will attack something and the others will all assist, from way outside the farm range. Example: Had one toon up around Kurn's in FoB and one in the pit near PoK. Turned both on like ~400 range, and the one around PoK just beelined to the other one to attack their targets. Even if I told that toon to farm a specific mob.

So I'll start off with 4-5 toons spread through the zone and end with 4 toons following another toon while that one oneshots everything, which makes the other 4 kind of pointless.

Appreciate it!

Edit: This has now started doing something different with the assist. Took them to another zone (jaggedpine) to poke around a bit.
Soon as a second toon gets aggro on anything it breaks the macro. I get spammed with a billion 'Navigating to X' messages without ever moving. If I /end and restart it immediately resumes the spam. Soon as the mob dies it'll tell me there's nothing around, even if the toon is surrounded by mobs.
Has happened with several different mob types so far (poachers, bears, griffons, potamides) in Jaggedpine. Guess I'll stick to one toon for now.
 
Last edited:
I'm aware this has some issues. Just been rather occupied with plugins. There is a plugin version of this that should be in the plugin directory already. I never felt it was finished and it was my first plugin, but it's /plugin mq2farmtest

This uses the same command as /mac farm, never use them together as to my knowledge it will crash you.

with that said. you could see if that does any better.

Farm uses the XTarget1 slot pretty consistently and was one of my earlier creations. If you have aggro in XTarget1 slot then it tries to make it's way there to kill it. If there is no path to that location it's going to keep trying anyway. Some logic wasn't handled correctly when I wrote this and honestly requires an overhaul to get it back up to par with the way I expect my things to work.

Moving forward. Try /farm or /farm help

I created a bind to handle all the commands available to the user and you'll find all the options there.
https://www.redguides.com/community/resources/farm-mac.5/field?field=commands
or use the above link to find the list I created in the "Commands" section of this resource.

"AssistMe" is one of those options, but all that did was get other toons in the eqbc to assist you in combat.
 
Wasn't trying to complain, I'm loving this!
Has let me grab some hunters I refused before due to too much work.
Just got frustrated with toons acting weird.
I'll try playing with the xt slots tomorrow :) appreciate it.
 
This is a default macro in RedGuides releases, but is very buggy these days. It will frequently freeze up and fail to locate mobs that require restarting the macro. Not sure if it was intended, but /mac farm 500 should not leave the character on the other side of the zone in an hour. It should hunt within 500 feet of where the mac was started and return to those bounds. Instead, it just continually looks within 500 feet of where the character is -- effectively making the radius unlimited as it moves from kill to kill.

A nice idea back then, but I recommend just using /mac kissassist hunter. It provides the same functionality with more options/reliability.
 
Chat, is it possible to reduce the number of detrimental spells? I farm with my SK and he throws 5 spells at the naeya, and they are light blue to green. It's overkill and he has to constantly med. The only alternative is to turn them off completely and then it takes too long. How can I reduce the number?
 
Last edited:
I kept getting stuck in a shrubbery. (Blightfire Moors, 1633.04 -1766.91 75.59 Facing NW, for an example of one time I got stuck.) It happened a lot. The nav command couldn't find me in the mesh, so I needed a way to twitch myself out. I hacked in a jitter command to the farm macro to resolve this. Since this was the first time I messed with a macro, I also added a bunch of new debug commands to help me track down where things were breaking. In case anyone else has the same problem, here's my diff from the default macro.

[CODE lang="ini" title="Diff with Jitter and Debugs"]--- Farm.mac Fri Feb 5 18:15:01 2021
+++ MalletFarm.mac Fri Feb 5 18:11:41 2021
@@ -110,16 +110,21 @@
/declare i int local 0
/declare j int local 1
/if (${MobsInRange}) {
+ /if (${Debugging}) /echo I found ${MobsInRange} mobs. Let's try to get one. Macroline: ${Macro.CurLine}
/if (${MobsInRange} > 100) {
- /if (${Debugging}) /echo There were more than 100 mobs in range, cutting down the list.
+ /if (${Debugging}) /echo There were more than 100 mobs in range, cutting down the list. Macroline: ${Macro.CurLine}
/varset MobsInRange 100
}
- |** PullList[#,1] = ID of mob, PullList[#,2] = PathLength **|
+ |** PullList[#,1] = ID of mob, PullList[#,2] = PathLength **|
/declare PullList[${MobsInRange},2] int local 0
/for i 1 to ${MobsInRange}
+ /if (${Debugging}) {
+ /echo \at${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].Name} was not a valid pull target.
+ /echo \ar${Navigation.PathExists[id ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}]} && ${Int[${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].Distance3D}]} <= ${Int[${Navigation.PathLength[id ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}]}]}
+ }
/if (${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].Name.NotEqual[NULL]} && !${Ini[${MobIgnore},${Zone.ShortName},Ignored].Find[${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].CleanName}|]}) {
/if (${Navigation.PathExists[id ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}]} && ${Int[${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].Distance3D}]} <= ${Int[${Navigation.PathLength[id ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}]}]}) {
- /if (${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].PctHPs} == 100) {
+ /if (${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].PctHPs} >= 100) {
/varset PullList[${j},1] ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}
/varset PullList[${j},2] ${Int[${Navigation.PathLength[id ${NearestSpawn[${i},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}]}]}
/if (${j}==1) {
@@ -140,15 +145,28 @@
}
/next i
/if (${PullTargetID}) {
+ /if (${Debugging}) /echo Found a pull target: ${PullTargetID} Macroline: ${Macro.CurLine}
/varset myTargetID ${PullTargetID}
/setchattitle Going to kill ${Spawn[id ${myTargetID}].CleanName}!
+ } else /if (${Jitter}) {
+ | Add to jitter toon if there is no path to anything. You're probably in a plant. Could add /circle, but this seems sufficient.
+ /if (${Debugging}) /echo You found mobs but can't get to anything. Jittering your toon to unstick them. Macroline: ${Macro.CurLine}
+ /target id ${NearestSpawn[${Math.Rand[${MobsInRange}]},npc noalert 1 targetable radius ${PullRange} zradius ${ZRadius} "${FarmMob}"].ID}
+ /face fast
+ /delay 1s
}
} else /if (${Me.Standing}) {
/if (!${Me.Casting.ID} && !${SitDelay} && !${Me.Moving} && !${Me.Mount.ID}) {
/sit
/varset SitDelay ${SitDelay.OriginalValue}
}
- }
+ } else {
+ | Added a no-mob delay. Here's hoping "delay" uses an interupt and isn't some sort of for-loop spinner.
+ /if (${Debugging}) /echo I found ${MobsInRange} mobs. Waiting 2s. Macroline: ${Macro.CurLine}
+ /delay 2s
+ }
+
+
} else /if (!${Me.XTarget[1].Type.Equal[Corpse]}) {
/varset myTargetID ${Me.XTarget[1].ID}
}
@@ -458,10 +476,10 @@
/return

Sub WaitNav(NavTargetID, distance)
- /if (${Debugging} && ${distance}) /echo Distance from mob nav target to stop: ${distance}
+ /if (${Debugging} && ${distance}) /echo Distance from mob nav target ${NavTargetID} to stop: ${distance}
:keepGoing
/call BindCheck
- /if (${Debugging}) /echo NavTest Variables: [SpawnHasID]${Spawn[id ${NavTargetID}].ID} [Distance from mob]${Spawn[id ${NavTargetID}].Distance} > [Distance To Stop]${If[${distance},${distance},20]} || [Line Of Sight]!${Spawn[id ${NavTargetID}].LineOfSight}
+ /if (${Debugging}) /echo NavTest Variables: [SpawnHasID]${Spawn[id ${NavTargetID}].ID} AND [Distance from mob]${Spawn[id ${NavTargetID}].Distance} > [Distance To Stop]${If[${distance},${distance},20]} || [Line Of Sight]!${Spawn[id ${NavTargetID}].LineOfSight}
/if (${Spawn[id ${NavTargetID}].ID} && (${Spawn[id ${NavTargetID}].Distance} > ${If[${distance},${distance},20]} || !${Spawn[id ${NavTargetID}].LineOfSight})) {
/if (${Navigation.Active}) {
/if (${Me.XTarget[1].ID}) {
@@ -563,17 +581,20 @@

Sub FarmStuff(string Enemy)
/if (${Bool[${Enemy}]}) {
+ /if (${Debugging}) /echo Set Farmmob to ${Enemy} Macroline: ${Macro.CurLine}
/varset FarmMob "${Enemy}"
/if (${Debugging} && !${reportTarget}) {
/echo Looking for: ${FarmMob}
/varset reportTarget ${reportTarget.OriginalValue}
}
} else /if (!${reportTarget}) {
- /squelch /echo Attacking anything I can get my grubby paws on.
+ /echo Attacking anything I can get my grubby paws on.
/varset reportTarget ${reportTarget.OriginalValue}
}
:findMob
+
/if (${Target.Type.Equal[corpse]}) {
+ /if (${Debugging}) /echo You are targetting a corpse: ${Target.ID} (You: ${myTargetID} ) Macroline: ${Macro.CurLine}
/if (${Target.ID} == ${myTargetID}) /varset myTargetID 0
/squelch /target clear
}
@@ -584,21 +605,21 @@
/call GroupEndChk
/call GroupManaChk
}
- |/if (${Debugging}) /echo \aymyTargetID has an ID: ${Spawn[id ${myTargetID}].ID} - is a corpse: ${Spawn[id ${myTargetID}].Type.Equal[Corpse]} - I have an XTarget: !${Me.XTarget[1].ID}
+ /if (${Debugging}) /echo myTargetID has an ID: ${Spawn[id ${myTargetID}].ID} - IsCorpse: ${Spawn[id ${myTargetID}].Type.Equal[Corpse]} - HaveXTarget: ${Me.XTarget[1].ID} Macroline: ${Macro.CurLine}
/if (!${Spawn[id ${myTargetID}].ID} || ${Spawn[id ${myTargetID}].Type.Equal[Corpse]} && !${Me.XTarget[1].ID}) {
/varset myTargetID 0
/call TargetShortest
- /if (${Debugging} && ${myTargetID} && ${Spawn[id ${myTargetID}].Type.NotEqual[corpse]}) /echo Target is ${Spawn[id ${myTargetID}]}
+ /if (${Debugging}) /echo Target is ${Spawn[id ${myTargetID}]} ( ${myTargetID} ) Macroline: ${Macro.CurLine}
} else {
- /if (${Debugging}) /echo \ayI have an XTarget so I'm going to set that as my target.
+ /if (${Debugging}) /echo I have an XTarget ( ${Me.XTarget[1].ID} ) so I'm going to set that as my target. Macroline: ${Macro.CurLine}
/varset myTargetID ${Me.XTarget[1].ID}
/call Combat
}
:navto
- |/if (${Debugging}) /echo ${Spawn[${myTargetID}].Distance} > ${If[${PullAbilityRange},${PullAbilityRange},1]} && !${Me.XTarget[1].ID} ${If[${PullRequiresLineOfSight}, || !${Spawn[${myTargetID}].LineOfSight},]}
+ /if (${Debugging}) /echo ${Spawn[${myTargetID}].Distance} > ${If[${PullAbilityRange},${PullAbilityRange},1]} && !${Me.XTarget[1].ID} ${If[${PullRequiresLineOfSight}, || !${Spawn[${myTargetID}].LineOfSight},]}
/if (${Spawn[${myTargetID}].Distance} > ${If[${PullAbilityRange},${PullAbilityRange},1]} && !${Me.XTarget[1].ID} ${If[${PullRequiresLineOfSight}, || !${Spawn[id ${myTargetID}].LineOfSight},]}) {
/if (!${Bool[${Spawn[${myTargetID}].ID}]}) {
- |/if (${Debugging}) /echo \ar My target ID was null, so I'm returning out of the sub.
+ /if (${Debugging}) /echo \ar My target ID was null, so I'm returning out of the sub.
/varset myTargetID 0
/return
}
@@ -622,11 +643,13 @@
/call PullAbility
} else {
/call WaitNav ${myTargetID} 20
+ /if (${Debugging}) /echo I have an XTarget ( ${myTargetID} ) so I'm going to set that as my target. Macroline: ${Macro.CurLine}
/call Combat
}
/return

Sub Combat
+ /if (${Debugging}) /echo Entering Combat Subroutine
/if (${Target.ID} && (${Target.Type.Equal[npc]} || ${Target.Type.Equal[pet]})) {
/if (${Navigation.Active}) /squelch /nav stop
/if (!${Me.Class.PureCaster}) /stick uw loose moveback behind 8
@@ -776,6 +799,7 @@
/squelch /target id ${Me.XTarget[1].ID}
/delay 2s ${Target.ID}==${Me.XTarget[1].ID}
/if (${Target.ID} != ${myTargetID}) /varset myTargetID ${Target.ID}
+ /if (${Debugging}) /echo Pull to combat Macroline: ${Macro.CurLine}
/call Combat
} else /if (${Spawn[id ${myTargetID}].Type.NotEqual[Corpse]} && ${Spawn[id ${myTargetID}].ID}) {
|/if (${Debugging}) /echo \aymyTargetID not a corpse: ${Spawn[id ${myTargetID}].Type.NotEqual[Corpse]} - Has an ID: ${Spawn[id ${myTargetID}].ID} == ${myTargetID}
@@ -1521,6 +1545,46 @@
/echo \aoPullRequiresLineOfSight is now\aw: \arOFF!
} else {
/echo \arError\aw: \ap${Param1} \aris not a valid option for /farm LineOfSight
+ }
+ }
+ }
+ |If /farm Jitter
+ } else /if (${Param0.Equal[Jitter]}) {
+ /if (!${Defined[Param1]}) {
+ /echo \Jitter\aw: \ag${Jitter}\aw.
+ } else {
+ /call IsNumber "${Param1}"
+ /if (${Macro.Return.Equal[TRUE]}) {
+ /if (${Param1}==1) {
+ /if (!${Jitter}) {
+ /varset Jitter TRUE
+ /call IniChange "General" "Jitter" "TRUE"
+ /echo \aoJitter is now\aw: \agON\aw!
+ } else {
+ /echo \arJitter is already on.
+ }
+ } else /if (${Param1} == 0) {
+ /if (${Jitter}) {
+ /varset Jitter FALSE
+ /call IniChange "General" "Jitter" "FALSE"
+ /echo \aoJitter is now\aw: \arOFF\aw!
+ } else {
+ /echo \arJitter is already off.
+ }
+ } else {
+ /echo \arError\aw: \ap${Param1} \aris not a valid option for /farm Jitter
+ }
+ } else {
+ /if (${Param1.Equal[on]}) {
+ /varset Jitter TRUE
+ /call IniChange "General" "Jitter" "TRUE"
+ /echo \aoJitter is now\aw: \agON\aw!
+ } else /if (${Param1.Equal[off]}) {
+ /varset Jitter FALSE
+ /call IniChange "General" "Jitter" "FALSE"
+ /echo \aoJitter is now\aw: \arOFF\aw!
+ } else {
+ /echo \arError\aw: \ap${Param1} \aris not a valid option for /farm Jitter
}
}
}
@@ -1644,6 +1708,7 @@
/call CheckINI ${Settings} Mana MedAt int 30
/call CheckINI ${Settings} Mana MedTill int 100
/call CheckINI ${Settings} General CastDetrimental bool TRUE
+ /call CheckINI ${Settings} General Jitter bool FALSE
/call GetRangedInfo
/call GetPullAbilityCommand
/return
[/CODE]
 
That's probably the RIGHT way to do it, but that sounds like a lot more work. :D

I appreciate the link the the video showing the better way to do it, though. Thanks.

I just assumed this would be a common problem in the "plants touching the ground" places in all the outdoor zones, so I went for a one-stop fix and did the easy thing.
 
That's probably the RIGHT way to do it, but that sounds like a lot more work. :D

I appreciate the link the the video showing the better way to do it, though. Thanks.

I just assumed this would be a common problem in the "plants touching the ground" places in all the outdoor zones, so I went for a one-stop fix and did the easy thing.
oh yeah, i mean anything that can solve a problem you have is good - just adding a bunch of extra stuff when you can clean up the mesh is usually more work.
 
I keep playing with this macro and extending it to suit my needs, and today I learned that mobs will feign death, which makes the macro stand over them forever. It never occurred to me that they could do that, so I spend a lot of time trying to figure out what weird bug was making MQ think a corpse was still alive. And now I know.
 
Last edited:
I've been continuing to play with this macro and my changes might suit some other people as well, so I've attached my modified file. I fixed a bunch of bugs (I didn't keep an issue log, so do a diff if you're curious what all got changed), removed the ability to farm a specific mob because it was buggy and it wasn't what I was trying to do anyway, and then added a bunch of features to do specific things I wanted; the ability to cast only a few specific detrimental spells, the ability to stop when a zone got crowded, the ability to pin my pull area to a specific area, the ability to assist mobs off people who aren't my tank, and special action for when I overpull or am about to die.

Keep in mind I built this for the play style I happen to enjoy, which is wandering around killing things. I don't do that camp and pull method.

New Help listing:

Farm.mac by Chatwiththisname. Ruined (forked) by Mallet.
[Commands]
/farm or /farm Help -- Displays this help window.
/farm assistMe --- Will tell you if assistMe is on or off.
/farm assistMe On|1|Off|0 --- /farm assistMe on or /farm assistMe 1 will turn on assistMe, /farm assistMe off or /farm assistMe 0 will turn off assistMe.
/farm CastDetrimental --- Will tell you if CastDetrimental is on or off.
/farm CastDetrimental On|1|Off|0 --- /farm CastDetrimental on or /farm CastDetrimental 1 will turn on CastDetrimental, /farm CastDetrimental off or /farm CastDetrimental 0 will turn off CastDetrimental.
/farm CastOnce --- Will tell you if CastOnce is on or off.
/farm CastOnce On|1|Off|0 --- /farm CastOnce on or /farm CastOnce 1 will turn on casting up to 3 detrimental spell at each enemy (as long as they're not targeting you) and aggro is below 33%, /farm CastOnce off or /farm CastOnce 0 will turn this mode off.
/farm CastTill ### --- Sets the Mana to wait stop casting once at. (You will keep pulling if above your MedAt limit.)
/farm CastTill --- Displays the current Mana to stop CastOnce at.
/farm Debug --- Will tell you if Debugging is on or off.
/farm Debug On|1|Off|0 --- /farm debug on or /farm debug 1 will turn on debugging, /farm debug off or /farm debug 0 will turn off debugging.
/farm DoMelee --- Will tell you if DoMelee is on or off.
/farm DoMelee On|1|Off|0 --- /farm DoMelee on or /farm DoMelee 1 will make you stay in DoMelee range (30), /farm DoMelee off or /farm DoMelee
/farm HealAt ### --- Sets the health to wait for before pulling.
/farm HealAt --- Displays the current health to wait for before pulling.
/farm Healtill ### --- Sets the health to wait until after stopping pulls to heal.
/farm HealTill --- Displays the current health to wait until after stopping for HealAt.
/farm HPPanicAt --- Displays the current health to initiate HPPanicActions at.
/farm HPPanicAt ### --- Sets the health to initiate HPPanicActions at.
/farm HPPanicAction --- Displays the current HPPanic Actions (up to 3).
/farm HPPanicAction # string --- Sets HPPanicAction # to string. Use "unset" to turn off an action. Otherwise, use things like "/cast 1" or "/alt act 1217"
/farm IgnoreEnd --- Displays whether we stop pulling for low endurance on characters.
/farm IgnoreEndOn|1|Off|0 --- Turns ignoring endurance status to on or off.
/Farm Jitter On|1|Off|0 --- /farm jitter on or /farm jitter 1 will turn on facing changes when you get stuck in no-path areas, /farm jitter off or /farm jitter 0 will turn this off. Maybe fix your meshes as a long term solution. Default is on.
/farm LineOfSight --- Will tell you if PullRequiresLineOfSight is on or off.
/farm LineOfSight On|1|Off|0 --- /farm LineOfSight on or /farm LineOfSight 1 will turn on PullRequiresLineOfSight, /farm LineOfSight off or /farm LineOfSight 0 will turn off PullRequiresLineOfSight.
/farm MainTank <target> --- /Will set the targetted Person to be your main tank and you'll try to keep aggro on them.
/farm MainTank --- Will tell you the name of your current Main Tank.
/farm MedAt ### --- Sets the Mana to wait for before pulling.
/farm MedAt --- Displays the current Mana to wait for before pulling.
/farm MedEndAt ### --- Sets the Endurance to wait for before pulling.
/farm MedEndAt --- Displays the current Endurance to wait for before pulling.
/farm MedEndTill ### --- Sets the Endurance to wait until after stopping pulls for MedEndAt.
/farm MedEndTill --- Displays the current Endurance to wait until after stopping for MedEndAt.
/farm MedTill ### --- Sets the Mana to wait until after stopping pulls for MedAt.
/farm MedTill --- Displays the current Mana to wait until after stopping for MedAt.
/farm OverpullAt --- Displays the current health to initiate OverpullActions at.
/farm OverpullAt ### --- Sets the health to initiate OverpullActions at. These are done every time you kill a mob until you're below this level.
/farm OverpullAction --- Displays the current Overpull Actions (up to 3).
/farm OverpullAction # string --- Sets OverpullAction # to string. Use "unset" to turn off an action. Otherwise, use things like "/cast 1" or "/alt act 1217". Use quotes.
/farm OverpullActionDelay # ## --- Sets OverpullAction #'s delay to ##. This should be long enough for the action to complete. (like casting time, etc.) ## is tenths of a second.
/farm Paranoia # --- /farm Paranoia # will force you into paranoia mode when the zone population hits that number. You will resume when the population drops below that number. To turn off, set to 0.
/farm Paranoia --- Will tell you your paranoia population level (Stop hunting and get alerts when the zone PC population hits that number.)
/farm Pause --- Toggles if the macro should pause or not. Will wait till out of combat. But won't react after current combat is done.
/farm Pin --- Will drop a pin and you will only pull spawns within PullRadius of that pin.
/farm Pin Off --- /Will remove the pin and put you back in wander mode.
/farm Radius #### --- Set the radius around you to search for spawns.
/farm Radius --- Displays the current Radius to engage mobs from your current location.
/farm SpellGem # ## --- Sets CastOnce's spell # to use spell gem ##. # is 1-3, ## is 1-13.
/farm SpellGem --- Displays the current current SpellGem numbers being used for CastOnce. 0 means not used.
/Farm TargetEveryone On|1|Off|0 --- /farm TargetEveryone on or /farm TargetEveryone 1 will turn on checking to see if anyone is targetting you and targeting them in turn, /farm TargetEveryone off or /farm TargetEveryone 0 will turn this off. Default is on.
/farm UseEQBC --- Will tell you if UseEQBC is on or off.
/farm UseEQBC On|1|Off|0 --- /farm UseEQBC on or /farm UseEQBC 1 will turn on UseEQBC, /farm UseEQBC off or /farm UseEQBC 0 will turn off UseEQBC.
/farm UseLogOut --- Will tell you if UseLogOut is on or off.
/farm UseLogOut On|1|Off|0 --- /farm UseLogOut on or /farm UseLogOut 1 will turn on UseLogOut, /farm UseLogOut off or /farm UseLogOut 0 will turn off UseLogOut.
/farm UseMerc --- Will tell you if UseMerc is on or off.
/farm UseMerc On|1|Off|0 --- /farm UseMerc on or /farm UseMerc 1 will turn on UseMerc, /farm UseMerc off or /farm UseMerc 0 will turn off UseMerc.
/farm ZRadius --- Displays the current ZRadius to engage mobs from your current location.
/farm Settings --- Will show you the current settings.
 

Attachments

so i've been toying with this to help clear old zones for named and slayer achievements (none while afk). Well i have noticed in some zones there are actually quite a few mobs that spawn under the world or maybe they are high in the air.. i can target them through the map and cast on them, but the farm mac does not recognize they exist. is there anyway to adjust the axis for it to see these mobs? particularly to target a mob and /pet attack. i found using a pet was most reliable way to attack them


*Edit*

found if i just turned off LineOfSight that the problem went away.
 
Last edited:
standing over corpse... fix... just /hidecorpse always when using the macro. :D
 
I'm sure I'm doing something wrong, but I am trying to farm Wasp Wings and Bixie Wings in the Moors for fishing. I just installed this and every time I run the macro, it just repopulates the ignore list with the stuff I want to kill (I manually go in and remove the wasps and the bixies).

I am using /mac farm 1000

Any help would be TREMENDOUSLY appreciated!
 
I'm using farm.mac on an EMU server, so I need to be able to loot as part of the macro. Since MQ2AdvLoot is for live/test servers, I've been trying Ninjadvloot, but haven't had any success in getting it to play nice with Farm.mac. I only want to loot one item that may/may not drop from each mob killed. Any help to be had?
 
Farm.mac does not loot I'm afraid. Wasn't designed with EMU in mind. I'm not really that familiar with NinjaAdvLoot.inc enough to make any recommendations for incorporating it into the macro. If someone was to incorporate it into the macro though I could see no issues with that support being added to the official version.
 
| Usage: add the following to your macro for looting
| #include Ninjadvloot.inc
| /call SetupAdvLootVars
| /call LootMobs or /call UseAdvLoot

you just have the include, and then add calls to do looting
 
Thanks for the quick response!! Sic, I copy/pasted those lines into CWTN's farm macro, but no dice. It occurred to me that those lines probably need to be placed in a specific spot, not just copy/pasted at the top of the macro.

"#include Ninjadvloot.inc" should be placed on a line under "|#bind showignored /showignored", correct?

And "/call SetupAdvLootVars" should be placed at line 66?

And "/call LootMobs" should be placed at line 477 after "/call CheckMerc" correct?

And yet, no dice.
 
That's a very fair point. Since the previous post, I've managed to fiddle a bit with the placement of /call LootMobs. I can now get my toon to run to a corpse and loot it, but seemingly at random times. Once the loot window is open, I get the error message "slot is null could not send notification to 60 rightmouse up" then after a few seconds "slot is null could not send notification to 61 rightmouse up". It will tick a few more times up and then abandon looting and try the next corpse.

I need help figuring out where to put /call LootMobs. It needs to be at a point in the macro that is after "okay, I killed all the mobs I was engaging" but before "okay, lets find something else to kill". Also I suppose I'd have to find a way to call "okay, lets find something else to kill", but only after looting is done.
 
That's a very fair point. Since the previous post, I've managed to fiddle a bit with the placement of /call LootMobs. I can now get my toon to run to a corpse and loot it, but seemingly at random times. Once the loot window is open, I get the error message "slot is null could not send notification to 60 rightmouse up" then after a few seconds "slot is null could not send notification to 61 rightmouse up". It will tick a few more times up and then abandon looting and try the next corpse.

I need help figuring out where to put /call LootMobs. It needs to be at a point in the macro that is after "okay, I killed all the mobs I was engaging" but before "okay, lets find something else to kill". Also I suppose I'd have to find a way to call "okay, lets find something else to kill", but only after looting is done.
this
/nomodkey /shift /itemnotify ${Corpse.Item[${i}].InvSlot} ${WhichButton}mouseup
would become this
/nomodkey /shift /itemnotify loot${i} ${WhichButton}mouseup

Actually, ignore that I posted an update to the resource. Download it here https://www.redguides.com/community/resources/ninjadvloot-inc.973/updates
 
Last edited:
Actually, ignore that I posted an update to the resource. Download it here https://www.redguides.com/community/resources/ninjadvloot-inc.973/updates
Amazing! Just updated injadvloot.inc and it's working perfectly! Thank you!

To others who come across the thread: I haven't yet been able to find where to plug in /call LootMobs in farm.mac, so while I work on that I'm using kissassist with the format "/mac kissassist <charactername> hunter". I also input "/maxradius 2000" and "/maxzrange 200". Adjust those as you see fit - I'm working in an instance, so don't have to worry about running into other players' camps.
 
Last edited:
Release [Macro] Farm.mac

Users who are viewing this thread

Back
Top
Cart