• 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
Resource icon

Release MQ2TributeManager

alt228

Member
Joined
Jan 8, 2007
RedCents
274¢
If accepted, I would like access to the EQ1 forums.

This original MQ2 plugin adds a /tribute command in game with automatic tribute status management capabilities.
Usage: /tribute <auto|manual|on|off|forceoff|show>

Rich (BB code):
// MQ2TributeManager.cpp : Defines the entry point for the DLL application.
//

// MQ2TributeManager
// Manages tribute for you based on combat status
// Author: alt228, [email protected]

#include "../MQ2Plugin.h"

enum TributeMode
{
	TributeMode_Manual,
	TributeMode_Auto,
	TributeMode_OffWhenExpired,
	TributeMode_Unused
};

enum CombatState
{
	CombatState_COMBAT,
	CombatState_DEBUFFED,
	CombatState_COOLDOWN,
	CombatState_ACTIVE,
	CombatState_RESTING
};

PreSetup("MQ2TributeManager");

//defaults
TributeMode mode = TributeMode_Manual;
int tributeFudge = 2000;

VOID SetTributeStatus(bool tributeOn)
{
	if( tributeOn )
	{
		if( !(bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning on tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
	else
	{
		if( (bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning off tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
}

VOID TributeManagerCmd(PSPAWNINFO characterSpawn, PCHAR line)
{
	bool syntaxError = false;
	if (line[0]==0)
	{
		syntaxError = true;
	}
	
	bool setMode = false;
	TributeMode newMode = TributeMode_Unused;

	bool setStatus = false;
	bool newStatus = true;

	bool showStatus = false;

    CHAR thisArg[MAX_STRING] = {0};
	int argNumber = 1;
	bool moreArgs = true;

	while(moreArgs && argNumber<10 )
	{
		DebugSpewAlways("MQ2TributeManager:: GetArg(%i)", argNumber);
		GetArg(thisArg,line,argNumber);
		argNumber++;

	
		if( !thisArg || (strlen(thisArg)==0) )
		{
			moreArgs = false;
		}
		else if(stricmp(thisArg,"on") == 0)
		{
			setStatus = true;
			newStatus = true;
		}
		else if(stricmp(thisArg,"off") == 0)
		{
			setMode = true;
			newMode = TributeMode_OffWhenExpired;
		}
		else if(stricmp(thisArg,"forceoff") == 0)
		{
			setStatus = true;
			newStatus = false;
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"auto") == 0)
		{
			setMode = true;
			newMode = TributeMode_Auto;
		}
		else if(stricmp(thisArg,"manual") == 0)
		{
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"show") == 0)
		{
			showStatus = true;
		}
		else
		{
			syntaxError = true;
		}
	}

	if( syntaxError )
	{
		SyntaxError("Usage: /tribute <auto|manual|on|off|forceoff|show>");
		return;
	}

	if( setStatus )
	{
		SetTributeStatus(newStatus);
	}

	if( setMode )
	{
		mode = newMode;
	}

	if( showStatus )
	{
		if( mode == TributeMode_Manual )
		{
			WriteChatColor("Tribute mode: manual");
		}
		else if( mode == TributeMode_Auto )
		{
			WriteChatColor("Tribute mode: automatic");
		}
		else if( mode == TributeMode_OffWhenExpired )
		{
			WriteChatColor("Tribute mode: off when expired");
		}

		if( gGameState == GAMESTATE_INGAME )
		{
			DebugSpewAlways("MQ2TributeManager:: Active Favor Cost: %i", pEQMisc->GetActiveFavorCost());
			DebugSpewAlways("MQ2TributeManager:: Combat State: %i", (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState);
			DebugSpewAlways("MQ2TributeManager:: Tribute Active: %i", *pTributeActive);
			DebugSpewAlways("MQ2TributeManager:: Current Favor: %i", GetCharInfo()->CurrFavor);
			DebugSpewAlways("MQ2TributeManager:: Tribute Timer: %i ms", GetCharInfo()->TributeTimer);
		}
	}


}

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
	DebugSpewAlways("Initializing MQ2TributeManager");
	AddCommand("/tribute",TributeManagerCmd);
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
	DebugSpewAlways("Shutting down MQ2TributeManager");
	RemoveCommand("/tribute");
}


// This is called every time MQ pulses
PLUGIN_API VOID OnPulse(VOID)
{
	if( gGameState != GAMESTATE_INGAME )
	{
		return;
	}

	if( mode == TributeMode_Auto )
	{
		CombatState combatState = (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState;
		bool inCombat = false;
		if( combatState == CombatState_COMBAT )
		{
			inCombat = true;
		}

		int activeFavorCost = pEQMisc->GetActiveFavorCost();
		PCHARINFO myCharInfo = GetCharInfo();

		if( (inCombat) && (!*pTributeActive) && (activeFavorCost <= myCharInfo->CurrFavor) && (pEQMisc->GetActiveFavorCost() > 0) )
		{
			//activate tribute
			SetTributeStatus(true);
		}
		else if( (!inCombat) && (*pTributeActive) && (myCharInfo->TributeTimer < tributeFudge) )
		{
			SetTributeStatus(false);
		}
	}
	else if( mode == TributeMode_OffWhenExpired )
	{
		if( (bool)*pTributeActive == false )
		{
			mode = TributeMode_Manual;
			return;
		}

		if( GetCharInfo()->TributeTimer < tributeFudge )
		{
			mode = TributeMode_Manual;
			SetTributeStatus(false);
		}

	}

}
 
Last edited:
I'm getting a "Forbidden" error making posts larger than what is currently in the message, so please view the usage.txt attached for details on what the plugin does.
 
The source (MQ2TributeManager.cpp) and the compiled DLL (MQ2TributeManager.dll) are both included in the attached zip file. I wanted to put the source in a code block in the message, but the forum was giving me errors with that long post. /shrug
 
If the post will excede the limitation, simply split the code into two or more posts, each with its own code tags.
 
Since I do not play EQ, and because our regular EQ guy seems to be /afrg (away from redguides) TP and you other EQ members are going to have to let me know if this is free access worthy.
 
No source in the .txt.


/edit .cpp is included in the .zip

Rich (BB code):
// MQ2TributeManager.cpp : Defines the entry point for the DLL application.
//

// MQ2TributeManager
// Manages tribute for you based on combat status
// Author: alt228, [email protected]

#include "../MQ2Plugin.h"

enum TributeMode
{
	TributeMode_Manual,
	TributeMode_Auto,
	TributeMode_OffWhenExpired,
	TributeMode_Unused
};

enum CombatState
{
	CombatState_COMBAT,
	CombatState_DEBUFFED,
	CombatState_COOLDOWN,
	CombatState_ACTIVE,
	CombatState_RESTING
};

PreSetup("MQ2TributeManager");

//defaults
TributeMode mode = TributeMode_Manual;
int tributeFudge = 2000;

VOID SetTributeStatus(bool tributeOn)
{
	if( tributeOn )
	{
		if( !(bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning on tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
	else
	{
		if( (bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning off tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
}

VOID TributeManagerCmd(PSPAWNINFO characterSpawn, PCHAR line)
{
	bool syntaxError = false;
	if (line[0]==0)
	{
		syntaxError = true;
	}
	
	bool setMode = false;
	TributeMode newMode = TributeMode_Unused;

	bool setStatus = false;
	bool newStatus = true;

	bool showStatus = false;

    CHAR thisArg[MAX_STRING] = {0};
	int argNumber = 1;
	bool moreArgs = true;

	while(moreArgs && argNumber<10 )
	{
		DebugSpewAlways("MQ2TributeManager:: GetArg(%i)", argNumber);
		GetArg(thisArg,line,argNumber);
		argNumber++;

	
		if( !thisArg || (strlen(thisArg)==0) )
		{
			moreArgs = false;
		}
		else if(stricmp(thisArg,"on") == 0)
		{
			setStatus = true;
			newStatus = true;
		}
		else if(stricmp(thisArg,"off") == 0)
		{
			setMode = true;
			newMode = TributeMode_OffWhenExpired;
		}
		else if(stricmp(thisArg,"forceoff") == 0)
		{
			setStatus = true;
			newStatus = false;
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"auto") == 0)
		{
			setMode = true;
			newMode = TributeMode_Auto;
		}
		else if(stricmp(thisArg,"manual") == 0)
		{
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"show") == 0)
		{
			showStatus = true;
		}
		else
		{
			syntaxError = true;
		}
	}

	if( syntaxError )
	{
		SyntaxError("Usage: /tribute <auto|manual|on|off|forceoff|show>");
		return;
	}

	if( setStatus )
	{
		SetTributeStatus(newStatus);
	}

	if( setMode )
	{
		mode = newMode;
	}

	if( showStatus )
	{
		if( mode == TributeMode_Manual )
		{
			WriteChatColor("Tribute mode: manual");
		}
		else if( mode == TributeMode_Auto )
		{
			WriteChatColor("Tribute mode: automatic");
		}
		else if( mode == TributeMode_OffWhenExpired )
		{
			WriteChatColor("Tribute mode: off when expired");
		}

		if( gGameState == GAMESTATE_INGAME )
		{
			DebugSpewAlways("MQ2TributeManager:: Active Favor Cost: %i", pEQMisc->GetActiveFavorCost());
			DebugSpewAlways("MQ2TributeManager:: Combat State: %i", (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState);
			DebugSpewAlways("MQ2TributeManager:: Tribute Active: %i", *pTributeActive);
			DebugSpewAlways("MQ2TributeManager:: Current Favor: %i", GetCharInfo()->CurrFavor);
			DebugSpewAlways("MQ2TributeManager:: Tribute Timer: %i ms", GetCharInfo()->TributeTimer);
		}
	}


}

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
	DebugSpewAlways("Initializing MQ2TributeManager");
	AddCommand("/tribute",TributeManagerCmd);
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
	DebugSpewAlways("Shutting down MQ2TributeManager");
	RemoveCommand("/tribute");
}


// This is called every time MQ pulses
PLUGIN_API VOID OnPulse(VOID)
{
	if( gGameState != GAMESTATE_INGAME )
	{
		return;
	}

	if( mode == TributeMode_Auto )
	{
		CombatState combatState = (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState;
		bool inCombat = false;
		if( combatState == CombatState_COMBAT )
		{
			inCombat = true;
		}

		int activeFavorCost = pEQMisc->GetActiveFavorCost();
		PCHARINFO myCharInfo = GetCharInfo();

		if( (inCombat) && (!*pTributeActive) && (activeFavorCost <= myCharInfo->CurrFavor) && (pEQMisc->GetActiveFavorCost() > 0) )
		{
			//activate tribute
			SetTributeStatus(true);
		}
		else if( (!inCombat) && (*pTributeActive) && (myCharInfo->TributeTimer < tributeFudge) )
		{
			SetTributeStatus(false);
		}
	}
	else if( mode == TributeMode_OffWhenExpired )
	{
		if( (bool)*pTributeActive == false )
		{
			mode = TributeMode_Manual;
			return;
		}

		if( GetCharInfo()->TributeTimer < tributeFudge )
		{
			mode = TributeMode_Manual;
			SetTributeStatus(false);
		}

	}

}
 
Last edited:
It works well, it's useful, as far as I know it's original. Quite a bit of different commands to do just a few certain things and I hope that will be streamlined as this plugin evolves but I have an affinity towards all you plugin writers and a new one would be sweet, I say yes.
 
I agree, This is the first time i've seen something like this.


YES
 
I haven't used this yet, but with the way tribute is used, wouldn't turning it off and on when in and out of combat actually use more then would be used in leaving it on? Remember, every time you turn tribute on, it takes the total of what you use out right at the start.
 
ib6ft9 said:
I haven't used this yet, but with the way tribute is used, wouldn't turning it off and on when in and out of combat actually use more then would be used in leaving it on? Remember, every time you turn tribute on, it takes the total of what you use out right at the start.

It doesn't actually turn it off until there are less than 2 seconds left on your tribute timer, just to avoid that.
 
I haven't had time to play with this yet, but is there a way to turn on tribute while casting on a mob? I use tribute for spell focus so it would be nice if the focus was active when the first spell landed.

I may take a stab at this myself if no updates occur. Very cool idea though, I like it
 
vladus2000 said:
is there a way to turn on tribute while casting on a mob?

An automatic way? No, not in the plugin at the moment.

There are a couple of workarounds you could do though...

1) In whatever macro you run, make an event for "You being casting..." that does a /tribute on

2) Make a casting hotkey like this:
/tribute on
/cast #

As a sidenote... you could make that hotkey be:
/tribute on auto
/cast #

and it would turn it on if it's not and switch into auto mode.
 
Those would help, I would also make sure I am casting a detrimental spell with a npc target. I could write the code and post it if you do not object, I would prefer it in the plugin.
 
If you want to write code to enhance the plugin, be my guest. Right now I'm working on some enhancements for it (INI file support, options for only turning off tribute if you are fm/fh, etc - slated for sometime this weekend) and I can merge the changes in.
 
Version 1.1 of MQ2TributeManager is now available. (I completed it a little while back, actually)

I'm still having issues with making large posts on these forums so the newest MQ2TributeManager source is located at http://alt228.kicks-ass.net/forums/viewtopic.php?f=4&t=3

Included in this release are:
-INI support (hooray!)
-Support for turning on tribute when casting detrimental spells (configurable, defaults to off)
-Workaround for issue requiring the tribute window to be opened once per session before notification events were received.

The windows that this plugin uses were not modified with this latest patch, so I expect it to fully remain working when MQ is back up and running.

-alt228
 
Anyone know if this plugin needs an update or just a recompile with latest MQ2 version?
 
Whatever happened to this plugin? Haven't seen an updated version in a long time...

For that matter, whatever happened to mq2powersource ? I can't even find that thread after searching all forums...

WTB updates for these 2 pls! :D
 
What happened to MQ2TributeManager is that I got married and stopped playing EQ for a few months. Now that I'm back and whatnot, I'll see about getting it updated.

I haven't seen MQ2PowerSource, but a friend told me it existed and was based on the MQ2TributeManager code. It'll probably be easy to whip up a replacement for that as well. Does anybody know exactly when a power source's power is decremented? I don't want to waste power source power switching it in and out too often. (If nobody knows, I'll see if I can make a macro to test swapping it a lot and burn out a couple of my own power sources.)
 
Now updated! When I had a drive failure I lost the Ini file support I was working on, but you can still put "/tribute auto " into your servername_charactername.cfg file.

Rich (BB code):
// MQ2TributeManager.cpp : Defines the entry point for the DLL application.
//

// MQ2TributeManager
// Manages tribute for you based on combat status
// Author: alt228, [email protected]

#include "../MQ2Plugin.h"

enum TributeMode
{
	TributeMode_Manual,
	TributeMode_Auto,
	TributeMode_OffWhenExpired,
	TributeMode_Unused
};

enum CombatState
{
	CombatState_COMBAT,
	CombatState_DEBUFFED,
	CombatState_COOLDOWN,
	CombatState_ACTIVE,
	CombatState_RESTING
};

PreSetup("MQ2TributeManager");

//defaults
TributeMode mode = TributeMode_Manual;
int tributeFudge = 2000;

VOID SetTributeStatus(bool tributeOn)
{
	if( tributeOn )
	{
		if( !(bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning on tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
	else
	{
		if( (bool)*pTributeActive )
		{
			DebugSpewAlways("MQ2TributeManager::Turning off tribute");
			DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );
		}
	}
}

VOID TributeManagerCmd(PSPAWNINFO characterSpawn, PCHAR line)
{
	bool syntaxError = false;
	if (line[0]==0)
	{
		syntaxError = true;
	}
	
	bool setMode = false;
	TributeMode newMode = TributeMode_Unused;

	bool setStatus = false;
	bool newStatus = true;

	bool showStatus = false;

    CHAR thisArg[MAX_STRING] = {0};
	int argNumber = 1;
	bool moreArgs = true;

	while(moreArgs && argNumber<10 )
	{
		DebugSpewAlways("MQ2TributeManager:: GetArg(%i)", argNumber);
		GetArg(thisArg,line,argNumber);
		argNumber++;
	
		if( !thisArg || (strlen(thisArg)==0) )
		{
			moreArgs = false;
		}
		else if(stricmp(thisArg,"on") == 0)
		{
			setStatus = true;
			newStatus = true;
		}
		else if(stricmp(thisArg,"off") == 0)
		{
			setMode = true;
			newMode = TributeMode_OffWhenExpired;
		}
		else if(stricmp(thisArg,"forceoff") == 0)
		{
			setStatus = true;
			newStatus = false;
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"auto") == 0)
		{
			setMode = true;
			newMode = TributeMode_Auto;
		}
		else if(stricmp(thisArg,"manual") == 0)
		{
			setMode = true;
			newMode = TributeMode_Manual;
		}
		else if(stricmp(thisArg,"show") == 0)
		{
			showStatus = true;
		}
		else
		{
			syntaxError = true;
		}
	}

	if( syntaxError )
	{
		SyntaxError("Usage: /tribute <auto|manual|on|off|forceoff|show>");
		return;
	}

	if( setStatus )
	{
		SetTributeStatus(newStatus);
	}

	if( setMode )
	{
		mode = newMode;
	}

	if( showStatus )
	{
		if( mode == TributeMode_Manual )
		{
			WriteChatColor("Tribute mode: manual");
		}
		else if( mode == TributeMode_Auto )
		{
			WriteChatColor("Tribute mode: automatic");
		}
		else if( mode == TributeMode_OffWhenExpired )
		{
			WriteChatColor("Tribute mode: off when expired");
		}

		if( gGameState == GAMESTATE_INGAME )
		{
			DebugSpewAlways("MQ2TributeManager:: Active Favor Cost: %i", pEQMisc->GetActiveFavorCost());
			DebugSpewAlways("MQ2TributeManager:: Combat State: %i", (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState);
			DebugSpewAlways("MQ2TributeManager:: Tribute Active: %i", *pTributeActive);
			DebugSpewAlways("MQ2TributeManager:: Current Favor: %i", GetCharInfo()->CurrFavor);
			DebugSpewAlways("MQ2TributeManager:: Tribute Timer: %i ms", GetCharInfo()->TributeTimer);
		}
	}
}

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
	DebugSpewAlways("Initializing MQ2TributeManager");
	AddCommand("/tribute",TributeManagerCmd);
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
	DebugSpewAlways("Shutting down MQ2TributeManager");
	RemoveCommand("/tribute");
}

PLUGIN_API VOID SetGameState(DWORD GameState)
{
    DebugSpewAlways("MQ2TributeManager::SetGameState()");
    if (GameState==GAMESTATE_INGAME)
	{
		// have to do a little hack here or else other /notify commands will not work
		DebugSpewAlways("MQ2TributeManager::SetGameState::initializing tribute window");
		DoCommand((PSPAWNINFO)pCharSpawn, "/keypress TOGGLE_TRIBUTEBENEFITWIN");
		DoCommand((PSPAWNINFO)pCharSpawn, "/keypress TOGGLE_TRIBUTEBENEFITWIN");
	}
}

// This is called every time MQ pulses
PLUGIN_API VOID OnPulse(VOID)
{
	if( gGameState != GAMESTATE_INGAME )
	{
		return;
	}

	if( mode == TributeMode_Auto )
	{
		CombatState combatState = (CombatState)((PCPLAYERWND)pPlayerWnd)->CombatState;
		bool inCombat = false;
		if( combatState == CombatState_COMBAT )
		{
			inCombat = true;
		}

		int activeFavorCost = pEQMisc->GetActiveFavorCost();
		PCHARINFO myCharInfo = GetCharInfo();

		if( (inCombat) && (!*pTributeActive) && (activeFavorCost <= myCharInfo->CurrFavor) && (pEQMisc->GetActiveFavorCost() > 0) )
		{
			//activate tribute
			SetTributeStatus(true);
		}
		else if( (!inCombat) && (*pTributeActive) && (myCharInfo->TributeTimer < tributeFudge) )
		{
			SetTributeStatus(false);
		}
	}
	else if( mode == TributeMode_OffWhenExpired )
	{
		if( (bool)*pTributeActive == false )
		{
			mode = TributeMode_Manual;
			return;
		}

		if( GetCharInfo()->TributeTimer < tributeFudge )
		{
			mode = TributeMode_Manual;
			SetTributeStatus(false);
		}
	}
}
 
This plugin is severely broke and you shouldnt use it. By setting it to auto, every time you arent in combat and it tries to turn it off it spams on and off.. i had 750k tribute yesterday and have 80k now.. with a 200 cost...
 
if you fix it, maybe fix it for trophy tribute too :) i would love to use this again, as it does save tribute, but not in the current form lol
 
you can get various trophies for your player housing which unlock various tribute bonuses, but it uses a separate tribute tab and tribute total, so you can run both at the same time
 
Tried using this today and it wasn't working. Appears to be a change with the activate button name. Changed that, recompiled and it's fine. Maybe my source was old, not really sure. Anyway here is the fix.

Change both instances of
Rich (BB code):
DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd DowngradeButton leftmouseup" );

to

Rich (BB code):
DoCommand( (PSPAWNINFO)pCharSpawn, "/notify TributeBenefitWnd TBWP_ActivateButton leftmouseup" );
 
Thank you for sharing,

Is it turning tribute on/off correctly for you with this fix?
 
awesome i will compile that dll quick and ad it to the attachments in very vanilla
 
MQ2TributeManager - This plugin Adds a /tribute command in game for automatic tribute management.

Commands
Rich (BB code):
/tribute on - Toggle tribute on.
/tribute off - Toggle tribute off.
/tribute auto* - Toggle tribute on or off based on combat state automatically.
/tribute forceoff - Toggle tribute off immediately ignoring any remaining time left.
/tribute show - Shows the current mode the plugin is running in (i.e. on/off/auto).
*Recommended
 
i noticed tonight that MQ2TributeManager is not turning on tribute or turning it off. is anyone else seeing this?

- - - Updated - - -

bump Redbot
 
Release MQ2TributeManager

Users who are viewing this thread

Back
Top
Cart