• 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

The AFK Bard Macro

ok i have done all this and it will not load what file do i put this in
do i have to have afk turned on all my other macs work the trade skill macros work great and i looted your files and i dont know where to put it at
 
i have aol instant messanger going and my scran name is kidder60 can someone please help me or walk me through this im compiling fine im not doing something right for the twist
 
ok i had someone look at the files and boom they said i did it right so it still says wont load mq2twist
aol im is kidder60 and msn mess is kidder60 as well send me a tell please
 
ok first off did you
/plugin mq2moveutils
/plugin mq2twist
then /twist (insert song numbers here)

if that does not work delete old moveutils and twist and redownload and extract
 
i had him re-dl the mq2 folder and try it w/updated files incase his are older, but the same thing seems to happend...
 
Anyone ever try this on the undead vassals camp in PoV? I've seen a bard macroing in PoV at WW, but that seems to be asking to be /petitioned since a lot of people go to OC/WW/EW. No one ever goes to the undead camp, and if someone just happened to see you they probably couldn't care less. Never fought these guys, though.
 
lol, just go to the NE desert, nobody pull from up there
 
siddin said:
lol, just go to the NE desert, nobody pull from up there

LOL


you think PoHate or PoFear would be any good places for bard macro?
Im 35 so i got ways to go and im trying to find the best spots as i go hehe :D
 
naa, i still used the old, kite the whole zone.... grats on your 10+ levels
 
well i would have to say on Luclin server NE corner of PoV is always camped normally by groupin Necro's and druids been over there with my necro in a 4nec 2 druid group was fun fast xp(never took damage) 55+ i'd say Nadox firepit or take your but to blood fields that should be easy pickins (only 51 meself) could you post your Path to 55 what lvl and where you used macro?
 
Guys i need some advice!

I'm trying to get Poachers in Jaggedpine Forest down pat. My bard is now 41. My circle takes me throught he fire pit in front of the tents (don't have loc but if you know the camp you know what I'm talking about). When I start everything runs like clockwork. I get about 4 mobs in tow. I kill a few mobs but then something always goes awry. Randomly the poachers catch up to me and kill/nearly kill me. I have nostun up and running. Fortunately Siddin hooked up the modified macro to /warp succor when things get ugly but it's really getting on my nerves.
I do not believe lag to be the issue. I'm using FPS to keep lag down and I've found that by looking all the way down at the ground while circling it helps with the lag even better. I've brought in the far clip plane to 0 to top it off.

I am twisting Selo's (slot 2), Amplification (slot 4), Tuyen's Flame (slot 6), and then a few Brusco's (slot 7). Twist looks like "/twist 2 4 6 2 7 7 2 7 7". Mobs don't run because there's always at least a couple there so no need to snare.

I would appreciate any input from those of you who have run the AFK macro at Poachers. I do not want to park my druid there and bot him if I don't have to. I'm going to run it again tonight and watch it to see if I can gather any more information.

Thx
 
To level up to 40 to go to Poachers hit the cave bailisks in Jaggedpine.

When you zone into Jaggedpine Forest /warp succor. To the west will be the entrance to the gnoll mines. Use your in game map to locate the cave basilisks in the northernmost cave. It's big enough in there to use a circle 60 and always have mobs to pull. You WILL have to twist in a snare to keep em from running away. They aren't social but a the cave basilisk genitor will aggro on you.
When I tried Poachers at 38 it didn't work out-ever so I did this to pick up a couple levels before I tried again.
Basilisks are about level 31-33.
 
at 40 go to poachers ahnd between poacher hut and river is a p\open area set up so your cirle takes you close to that hut thats closest and use cirlce 75 did it till 51 there
 
Considering the poachers are social? So they wont run as long as there is more than 1 on me? If you guys know a place that things are social like that, it would be it even faster and safer. Thanks :)
*(had bad experience w/ non social stuff... basicly waiste of time heh)
 
Infernal said:
Considering the poachers are social? So they wont run as long as there is more than 1 on me? If you guys know a place that things are social like that, it would be it even faster and safer. Thanks :)
*(had bad experience w/ non social stuff... basicly waiste of time heh)

Social creatures will not run if there is more than one of them with a certain radius. There are exceptions, I'm sure, but you can always assume this to be the case by default. More specifically, it has to be the same type of creature. When I'm doing Poachers, if a black panther jumps in he'll run when he gets to 20% health, unless I happen to aggro another panther in which case he'll continue following me like a retard patiently waiting his turn to die.
 
Taken from a PM that I thought others may find useful

Skorpyon said:
I am going to ding 38+ today in overthere is going quickly 3 levels in 3 hours or so...


Once i get home tonight where should i setup in jagged pine so that the target macro and raidus wont run into any trees/ rocks and get stuck but i can still agro the camp and other mobs?


any locs or anything to help me out when i get there?

what spells do you use I find it myself if i cast more then 2 songs before Selos i will loose my run song seems to me it doesnt last long enough to do /twist 2 3 4 8 (8) being selos.... time i get to 3rd song i am running slow...(does the song lasting longer = skills in skill and level? if that is the case i was trying to do /twist 2 2 2 8 when i was 30 at gnolls and it couldnt do it.


Maybe now being 38+ tonight with my updated skills and lvls I can do 3 songs before refreshing?

You have officially been busted for not checking the forums. I had to get used twist in threes to make sure that Selo's didn't run out. Redbot used 5 songs in a twist but I never bothered after level 20. Read through the AFk bard macro forum for examples of what I twist in Jaggedpine. Also, Siddin posted a modified AFK macro that will automatically twist a selo's if it within 5 seconds of running out. This is really just in case you "miss a note" and don;t get selo;s in on that round. In addition to this feature, Sid's macro will /warp succor if you fall below 30% health and camp you out. WOrks out nicely.

To answer your question of where to go, check my last post in AFK Bard Macro thread. I left a tip for Koneman that you may find useful.
 
Koneman said:
at 40 go to poachers ahnd between poacher hut and river is a p\open area set up so your cirle takes you close to that hut thats closest and use cirlce 75 did it till 51 there

Poachers will stick on you until 1 is left alone.. correct?
 
Poachers will stick on you until 1 is left alone.. correct?
Well, its still kinda close to WW/EW plus there are tons of hills. I would imagine I would get the "You cannot see target." message a lot. I'm doing undead vassals at 58, and its going ok. Nadox is just too slow.
 
I know that The Great Divide was mentioned earlier, and that they felt uneasy using it, but I have been doing it for a couple hours now and there is no problem, I am lvl 30 and I am actually near the spires, since everyone used the POK books, no one has even seen me running around in cirlces. its working pretty good, my twist is Selo's, Amplification, Snare, selos, Bellow, Fufil's. havn't slowed down once :)
 
Koneman,
Tried your stat last night a I will say it worked, but not quite like I think it should be. Can you post the center of your circle? I end up running over boulders and come close to treees. The poachers occasionally get caught on them and end up waiting for me to come around the circle again. Got raped. Hardcore. There are 2 spots I can see that would let me get away with a circle, but I'm still struggling to get it to work properly.

Also, when you were there did you twist in a snare or go right after DoT and DD? I've discovered that at the loc I'm using it's a real pain once you run out of mobs. The circle doesn't keep me close enough to the tent to aggro more poachers. It takes a while.
 
Heh, well im lvl 40 atm, trying to kill at poachers, iv been doing a circle around the campfire there (kind of dangerous) but if you guys know a better spot, please let me know. I'm lvl 40 atm so just throw me some new ideas :p

Thanks in advanced
 
Complete guide to JFP forever till xp gets bad
stand at -915 -1275 -11

Hot Key:

/plugin MQ2twist
/plugin MQ2moveutils
/twist (selos, chant of poison, chant of frost)
/circle 40
/mac target

then hit number lock

if you are plin a alt while afk
sit them at -929 -1402 -15

follow this and you'll only die if they catch you on the pull and stun and beat you to death
 
Does the target.mac file need to be compiled?
I compiled mq2, twist and moveutils and they all work file - just cant get the most important part to work for the whole afk thing - autotarget.
When I tried to load it, it said 'Subroutine Main wasn't found'
Also, got mq2zone to compile, but warp had some errors during compile procedure, same with doacrack
Sent new auth codes, with hopes that it would just all be compiled in a complete package - realizing it may take some time. In the meantime I am trying to learn how to do things myself and would love some info on how to make target.mac to work. I copied everything in the box in this link, including the text at the begining. Thx
 
make sure you read all the forums.. mac files do NOT need to be compiled, and you have to do some special things for the warp.
as for when it says subroutine main not found, make sure you use a text editor and are saving it in dos format along with the encoding being ansi
 
Koneman said:
Complete guide to JFP forever till xp gets bad
stand at -915 -1275 -11

Hot Key:

/plugin MQ2twist
/plugin MQ2moveutils
/twist (selos, chant of poison, chant of frost)
/circle 40
/mac target

then hit number lock

if you are plin a alt while afk
sit them at -929 -1402 -15

follow this and you'll only die if they catch you on the pull and stun and beat you to death

thats why i use docrack nostun :)
 
I have copied the macro from the post here, and saved the file in my F:\Macroquest\release\macros\target.mac directory. When i try to start the macro up for some reason, I get error "couldnt open the file F:\macroquest\macros\target.mac". I have also tried moving the macro directory into the path that it is lookin for and still will not work. This isnt that hard am i missing something. I compiled MQ2 fine and plugins fine and am using them just the target.mac eludes me... =( Love the twisting plugin is teh win! and the moveutil as well mad props... Just as stated i can not get darn target.mac to work....

Any help would be most appreciated =)
 
make sure that windows isn't hiding your extensions and make sure there aren't any extensions after .mac
 
Excellent got it working =) when checking the ext for some reason Quicktime wanted to use the files.. File association i think was the problem i looked at the files and the icons had the little quicktime logo. Changed the association to notepad and this works great =) thank you for the help =) also the macro rocks... I am running around at lvl 21 in Oasis of mar killing dem ebil orcs! =) just gotta becareful darn cleric orcs like to stun me... I run it attended for now i guess on my second comp =) Again thank you for you help Siddin =p
 
go to the nomez plugin thread and copy/pase the code there into the bottom of mq2map.cpp
it'll keep you from being stunned/mezzed
 
inside the building in dulak harbor is ok i found it slow xp
i stayed at Jagged pine forest till 51

BTW anyone know a place at 51 to crank aa so i can get run3 so i can take him to nadox
 
is that a crowded place? or nobody there?
Btw, do you know any other place thats faster xp than dulak?
Ty in advanced
 
I pasted to the end of the file as you said but i am still getting stunned, do i need to recompile it? So It looks like this now:

// MQ2Map.cpp : Defines the entry point for the DLL application.
//

// PLUGIN_API is only to be used for callbacks. All existing callbacks at this time
// are shown below. Remove the ones your plugin does not use. Always use Initialize
// and Shutdown for setup and cleanup, do NOT do it in DllMain.



#include "../MQ2Plugin.h"
#include "MQ2Map.h"
PreSetup("MQ2Map");




unsigned long bmMapRefresh=0;

DWORD HighlightColor=0xFF700070;

CHAR MapSpecialClickString[16][MAX_STRING]=
{
"",// unused, will always target
"",//SHIFT
"/maphide id %i",//CTRL
"",//CTRL|SHIFT
"/highlight id %i",//LALT
"",//LALT|SHIFT
"",//LALT|CTRL
"",//LALT|SHIFT|CTRL
"",//RALT
"",//RALT|SHIFT
"",//RALT|CTRL
"",//RALT|SHIFT|CTRL
"",//RALT|LALT
"",//RALT|LALT|SHIFT
"",//RALT|LALT|CTRL
"" //RALT|LALT|SHIFT|CTRL
};

CHAR MapNameString[MAX_STRING]={"%N"};
CHAR MapTargetNameString[MAX_STRING]={"%N"};
SEARCHSPAWN MapFilterCustom = {0};
MAPFILTER MapFilterOptions[] = {
{"All", TRUE,-1, TRUE,MAPFILTER_Invalid,TRUE, "Enables/disables map functions"},
{"PC", FALSE,0xFF00FF, TRUE,MAPFILTER_All,TRUE, "Displays PCs"},
{"PCConColor", FALSE,-1, TRUE,MAPFILTER_PC,FALSE, "Displays PCs in consider colors"},
{"Group", FALSE,0x0080C0, TRUE,MAPFILTER_PC,FALSE, "Displays group members in a specific color"},
{"Mount", FALSE,0x707070, TRUE,MAPFILTER_All,TRUE, "Displays mounts"},
{"NPC", FALSE,0x404040, TRUE,MAPFILTER_All,TRUE, "Displays NPCs"},
{"NPCConColor", FALSE,-1, TRUE,MAPFILTER_NPC,FALSE, "Displays NPCs in consider colors"},
{"Untargetable", FALSE,0x404040, TRUE,MAPFILTER_All,TRUE, "Displays Untargetable NPCs"},
{"Pet", FALSE,0x707070, TRUE,MAPFILTER_All,TRUE, "Displays pets"},
{"Corpse", FALSE,0x00C000, TRUE,MAPFILTER_All,TRUE, "Displays corpses"},
{"Chest", FALSE,0xC08000, TRUE,MAPFILTER_All,TRUE, "Displays chestesses"},
{"Trigger", FALSE,0xC08000, TRUE,MAPFILTER_All,TRUE, "Displays hidden triggers"},
{"Trap", FALSE,0xC08000, TRUE,MAPFILTER_All,TRUE, "Displays hidden traps"},
{"Timer", FALSE,0xC08000, TRUE,MAPFILTER_All,TRUE, "Displays hidden timers"},
{"Ground", FALSE,0xC0C0C0, TRUE,MAPFILTER_All,TRUE, "Displays ground items"},
{"Target", FALSE,0xC00000, TRUE,MAPFILTER_All,FALSE, "Displays your target"},
{"TargetLine", FALSE,0x808080, TRUE,MAPFILTER_Target,FALSE, "Displays a line to your target"},
{"TargetRadius", FALSE,0x808080, FALSE,MAPFILTER_Target,FALSE, "Sets radius of a circle around your target to # (omit or set to 0 to disable)"},
{"TargetMelee", FALSE,0xFF8080, FALSE,MAPFILTER_Target,FALSE, "Draws a melee-range circle around your target"},
{"Vector", FALSE,-1, TRUE,MAPFILTER_All,TRUE, "Displays heading vectors"},
{"Custom", FALSE,-1, FALSE,MAPFILTER_All,TRUE, "Sets custom filter (omit to disable)"},
{"CastRadius", FALSE,0x808080, FALSE,MAPFILTER_All,FALSE, "Sets radius of casting circle to # (omit or set to 0 to disable)"},
{"NormalLabels", 0,-1, TRUE,MAPFILTER_Invalid,FALSE, "Toggles non-MQ2 label display"},
{"Menu", FALSE,-1, TRUE,MAPFILTER_Invalid,FALSE, "Allows display of right-click context menu"},
{NULL, FALSE,-1, FALSE,MAPFILTER_Invalid,FALSE, NULL}
};





PCSIDLWNDVFTABLE CMyMapViewWnd__OldvfTable=0;
DWORD CMyMapViewWnd__OldDestructor=0;
DWORD CMyMapViewWnd__OldHandleRButtonDown=0;
DWORD CMyMapViewWnd__OldPostDraw=0;

DWORD __declspec(naked) CMyMapViewWnd__Destructor(const BOOL Deallocate)
{
__asm {
push ecx;
push eax;
}

if (CMyMapViewWnd__OldvfTable) {
// make our own little stack frame here
// operator delete assumes that it is there
// it uses (unnecessarily) ebp-4
__asm {
push ebp
push eax
push eax
mov ebp, esp
}
delete pMapViewWnd->pvfTable;
pMapViewWnd->pvfTable=CMyMapViewWnd__OldvfTable;
CMyMapViewWnd__OldvfTable = NULL;
__asm {
pop eax
pop eax
pop ebp
}
}

__asm {
pop eax;
pop ecx;
jmp [CMyMapViewWnd__OldDestructor];
}
}

bool RButtonDown()
{
CHAR szOut[MAX_STRING]={0};
if (pCurrentMapLabel)
{
MapSelectTarget();
return false;
}
if (!IsOptionEnabled(MAPFILTER_ContextMenu))
return false;
return true;
}

VOID __declspec(naked) CMyMapViewWnd__HandleRButtonDown(DWORD point, DWORD unknown)
{
__asm {
push ecx;
push eax;
}
if (RButtonDown())
{
__asm {
pop eax;
pop ecx;
jmp [CMyMapViewWnd__OldHandleRButtonDown];
};
}
else
{
__asm {
pop eax;
pop ecx;
xor eax, eax;
retn 8;
}
}
}


VOID __declspec(naked) CMyMapViewWnd__PostDraw()
{
__asm {

push esi;
mov esi, ecx;

call [MapUpdate];
call [MapAttach];

mov ecx, esi;
call [CMyMapViewWnd__OldPostDraw];
push eax;

call [MapDetach];
pop eax;
mov ecx, esi;
pop esi;
ret;
};
}

class CMyMapViewWnd
{
public:
DWORD Constructor_Trampoline(class CXWnd *);
DWORD Constructor_Detour(class CXWnd *wnd)
{
CMapViewWnd *pWnd=(CMapViewWnd*)this;
DWORD Ret=Constructor_Trampoline(wnd);
PCSIDLWNDVFTABLE pvfTable = new CSIDLWNDVFTABLE;
*pvfTable=*pWnd->pvfTable;

CMyMapViewWnd__OldvfTable=pWnd->pvfTable;
pWnd->pvfTable=pvfTable;
CMyMapViewWnd__OldPostDraw=(DWORD)pWnd->pvfTable->PostDraw2;
CMyMapViewWnd__OldHandleRButtonDown=(DWORD)pWnd->pvfTable->HandleRButtonDown;
CMyMapViewWnd__OldDestructor=(DWORD)pWnd->pvfTable->vector_deleting_destructor;
pWnd->pvfTable->vector_deleting_destructor=CMyMapViewWnd__Destructor;
pWnd->pvfTable->HandleRButtonDown=CMyMapViewWnd__HandleRButtonDown;
pWnd->pvfTable->PostDraw2=CMyMapViewWnd__PostDraw;
return Ret;
}

static void StealVFTable()
{
if (CMapViewWnd *pWnd=(CMapViewWnd*)pMapViewWnd)
{
PCSIDLWNDVFTABLE pvfTable = new CSIDLWNDVFTABLE;
*pvfTable=*pWnd->pvfTable;

CMyMapViewWnd__OldvfTable=pWnd->pvfTable;
pWnd->pvfTable=pvfTable;
CMyMapViewWnd__OldPostDraw=(DWORD)pWnd->pvfTable->PostDraw2;
CMyMapViewWnd__OldHandleRButtonDown=(DWORD)pWnd->pvfTable->HandleRButtonDown;
CMyMapViewWnd__OldDestructor=(DWORD)pWnd->pvfTable->vector_deleting_destructor;
pWnd->pvfTable->vector_deleting_destructor=CMyMapViewWnd__Destructor;
pWnd->pvfTable->HandleRButtonDown=CMyMapViewWnd__HandleRButtonDown;
pWnd->pvfTable->PostDraw2=CMyMapViewWnd__PostDraw;
}
}

static void RestoreVFTable()
{
if (CMapViewWnd *pWnd=(CMapViewWnd*)pMapViewWnd)
{
if (CMyMapViewWnd__OldvfTable) {
delete pWnd->pvfTable;
pWnd->pvfTable=CMyMapViewWnd__OldvfTable;
}
}
}
};

DETOUR_TRAMPOLINE_EMPTY(DWORD CMyMapViewWnd::Constructor_Trampoline(class CXWnd *));

bool Update=true;

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
DebugSpewAlways("Initializing MQ2Map");

bmMapRefresh=AddMQ2Benchmark("Map Refresh");
unsigned long i;
CHAR szBuffer[MAX_STRING]={0};
for (i=0;MapFilterOptions.szName;i++) {
sprintf(szBuffer,"%s-Color",MapFilterOptions.szName);
MapFilterOptions.Enabled = GetPrivateProfileInt("Map Filters",MapFilterOptions.szName,MapFilterOptions.Default,INIFileName);
MapFilterOptions.Color = GetPrivateProfileInt("Map Filters",szBuffer,MapFilterOptions.DefaultColor,INIFileName) | 0xFF000000;
}
MapInit();
GetPrivateProfileString("Naming Schemes","Normal","%N",MapNameString,MAX_STRING,INIFileName);
GetPrivateProfileString("Naming Schemes","Target","%N",MapTargetNameString,MAX_STRING,INIFileName);

for (i=1;i<16;i++)
{
sprintf(szBuffer,"KeyCombo%d",i);
GetPrivateProfileString("Right Click",szBuffer,MapSpecialClickString,MapSpecialClickString,MAX_STRING,INIFileName);
}

// Do not use Custom, since the string isn't stored
MapFilterOptions[MAPFILTER_Custom].Enabled = 0;


AddCommand("/mapfilter",MapFilters,0,1,1);
AddCommand("/maphide",MapHideCmd,0,1,1);
AddCommand("/mapshow",MapShowCmd,0,1,1);
AddCommand("/highlight",MapHighlightCmd,0,1,1);
AddCommand("/mapnames",MapNames,0,1,1);
AddCommand("/mapclick",MapClickCommand,0,1,0);

// EasyClassDetour(CMapViewWnd__CMapViewWnd,CMyMapViewWnd,Constructor_Detour,DWORD,(CXWnd*),Constructor_Trampoline);
EzDetour(CMapViewWnd__CMapViewWnd,CMyMapViewWnd::Constructor_Detour,CMyMapViewWnd::Constructor_Trampoline);
CMyMapViewWnd::StealVFTable();
AddMQ2Data("MapSpawn",dataMapSpawn);
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
DebugSpewAlways("Shutting down MQ2Map");
Update=false;
RemoveMQ2Data("MapSpawn");

RemoveDetour(CMapViewWnd__CMapViewWnd);

MapClear();
CMyMapViewWnd::RestoreVFTable();

RemoveMQ2Benchmark(bmMapRefresh);
RemoveCommand("/maphide");
RemoveCommand("/mapshow");
RemoveCommand("/mapfilter");
RemoveCommand("/highlight");
RemoveCommand("/mapnames");
RemoveCommand("/mapclick");
}

// This is called each time a spawn is added to a zone (inserted into EQ's list of spawns),
// or for each existing spawn when a plugin first initializes
// NOTE: When you zone, these will come BEFORE OnZoned
PLUGIN_API VOID OnAddSpawn(PSPAWNINFO pNewSpawn)
{
if (Update && pNewSpawn->SpawnID != 0) {
DebugSpewAlways("MQ2Map::OnAddSpawn(%s)",pNewSpawn->Name);
AddSpawn(pNewSpawn);
}
}

// This is called each time a spawn is removed from a zone (removed from EQ's list of spawns).
// It is NOT called for each existing spawn when a plugin shuts down.
PLUGIN_API VOID OnRemoveSpawn(PSPAWNINFO pSpawn)
{
DebugSpewAlways("MQ2Map::OnRemoveSpawn(%s)",pSpawn->Name);
if (Update)
RemoveSpawn(pSpawn);
}

PLUGIN_API VOID SetGameState(DWORD GameState)
{
if (GameState==3)
{
MapClear();
}
}

// This is called each time a ground item is added to a zone
// or for each existing ground item when a plugin first initializes
// NOTE: When you zone, these will come BEFORE OnZoned
PLUGIN_API VOID OnAddGroundItem(PGROUNDITEM pNewGroundItem)
{
DebugSpewAlways("MQ2Map::OnAddGroundItem(%d)",pNewGroundItem->DropID);
if (Update)
AddGroundItem(pNewGroundItem);
}

// This is called each time a ground item is removed from a zone
// It is NOT called for each existing ground item when a plugin shuts down.
PLUGIN_API VOID OnRemoveGroundItem(PGROUNDITEM pGroundItem)
{
DebugSpewAlways("MQ2Map::OnRemoveGroundItem(%d)",pGroundItem->DropID);
if (Update)
RemoveGroundItem(pGroundItem);
}

#include "../MQ2Plugin.h"
PreSetup("MQ2NoMez");
PLUGIN_API VOID OnDrawHUD(VOID)
{
BYTE nostun = 00;
GetCharInfo()->Stunned = nostun;
}
 
Last edited:
delete this
#include "../MQ2Plugin.h"
PreSetup("MQ2NoMez");

and recompile
 
The AFK Bard Macro

Users who are viewing this thread

Back
Top
Cart