View Full Version : [Addon] MultiBoxMacro v0.1
pipakin
05-15-2008, 11:23 PM
So, I was toying around with libRpc/libTrust and I came up with this little beauty. It allows you to control all your macros from you main without switching windows (Which is a pain on my setup with the small alt windows).
Here's a pic of it (Yes, I completely ripped off the UI from SuperMacro. No I don't feel bad).
http://www.thekinfamily.com/mbm.jpg
I'ts still in development, so if it screws up one of your macros, then don't yell at me. Always make a backup :)
There's a bit of delay when refreshing an alt's macros or creating/deleting one (This is fixed in the development version). Editing is pretty much instant though. Be advised, it'll probably error if either you or the alt is in combat. Also, you'll need libRpc and libTrust, as I was too lazy to embed them.
Oh right, how to use it:
You need to be in a party with your alts.
You need to setup your trust settings. You main needs to trust your alts, and your alts need to trust your main.
Then just type /mbm show
I'll post the code for the interested/paranoid later.
the download links are here:
http://www.thekinfamily.com/MultiBoxMacro.zip - Stable release
http://www.thekinfamily.com/MultiBoxMacro-0.2a.zip - Unstable development
Chorizotarian
05-15-2008, 11:42 PM
Very cool! I'll have to give this a try.
pipakin
05-16-2008, 08:45 AM
Code: (Sorry for the lack of useful commenting. I only worked on this yesterday, so it was a bit thrown together).
-- ****************************************
-- * Library definitions *
-- ****************************************
local libTrust = LibStub("LibTrust-0.1")
local libRpc = LibStub("LibRpc-0.2")
-- ****************************************
-- * Constants *
-- ****************************************
NUM_MACRO_ICONS_SHOWN = 30;
NUM_ICONS_PER_ROW = 5;
NUM_ICON_ROWS = 6;
MACRO_ROW_HEIGHT = 36;
MACRO_ICON_ROW_HEIGHT = 36;
-- ****************************************
-- * Ace3 addon creation line *
-- * - Only uses AceConsole ATM, though *
-- * the plan is to use AceGUI for the *
-- * GUI at some point *
-- ****************************************
MultiBoxMacro = LibStub("AceAddon-3.0"):NewAddon("MultiBoxMacro", "AceConsole-3.0")
-- ****************************************
-- * Command line setup *
-- * - Options are "show" or "display" *
-- * they both do the same thing *
-- ****************************************
local options = {
name = "MultiBoxMacro",
handler = MultiBoxMacro,
type = 'group',
args = {
display = {
name = "display",
type = "execute",
func = "Display",
},
show = {
name = "show",
type = "execute",
func = "Display",
},
},
}
-- ****************************************
-- * Display method *
-- * - Called by the command line option. *
-- * Displays the window *
-- ****************************************
function MultiBoxMacro:Display()
-- Show the window.
MultiBoxMacroFrame:Show();
end
function MultiBoxMacro:OnInitialize()
-- Register the command line options
LibStub("AceConfig-3.0"):RegisterOptionsTable("MultiBoxMacro", options, {"multiboxmacro", "mbm"})
end
-- Macro Display functions
MultiBoxMacro.cachedMacros = {};
MultiBoxMacro.selectedMacro = -1;
function MultiBoxMacro:ClearMacroButtons()
for i=1,36 do
local macroID = i;
getglobal("MultiBoxMacroButton"..macroID.."ID"):SetText(macroID);
local macroButton = getglobal("MultiBoxMacroButton"..macroID);
local macroIcon = getglobal("MultiBoxMacroButton"..macroID.."Icon");
local macroName = getglobal("MultiBoxMacroButton"..macroID.."Name");
macroButton:SetID(macroID);
macroIcon:SetTexture("");
macroName:SetText("");
macroButton:Enable();
macroButton:SetChecked(0);
end
self:SetSelectedMacro(-1);
MultiBoxMacroFrameSelectedMacroName:SetText("");
MultiBoxMacroFrameText:SetText("");
MultiBoxMacroFrameSelectedMacroButton:SetID(0);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re("");
end
function MultiBoxMacro:SetMacroButtons(macros)
for i=1,36 do
local macroID = i;
getglobal("MultiBoxMacroButton"..macroID.."ID"):SetText(macroID);
local macroButton = getglobal("MultiBoxMacroButton"..macroID);
local macroIcon = getglobal("MultiBoxMacroButton"..macroID.."Icon");
local macroName = getglobal("MultiBoxMacroButton"..macroID.."Name");
if macros[i] ~= 0 and macros[i] ~= -1 then
macroButton:SetID(macroID);
macroIcon:SetTexture(macros[i].texture);
macroName:SetText(macros[i].name);
macroButton:Enable();
-- Highlight Selected Macro
if ( i == MultiBoxMacro.selectedMacro ) then
macroButton:SetChecked(1);
MultiBoxMacroFrameSelectedMacroName:SetText(macros[i].name);
MultiBoxMacroFrameText:SetText(macros[i].body);
MultiBoxMacroFrameSelectedMacroButton:SetID(macroI D);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re(macros[i].texture);
else
macroButton:SetChecked(0);
end
else
macroButton:SetID(macroID);
macroIcon:SetTexture("");
macroName:SetText("");
macroButton:Enable();
macroButton:SetChecked(0);
end
end
self:UpdateNewButtonStatus();
end
function MultiBoxMacro:UpdateNewButtonStatus()
self:UpdateNewAccountButtonStatus();
self:UpdateNewCharacterButtonStatus();
end
function MultiBoxMacro:UpdateNewAccountButtonStatus()
for i=1,18 do
if self.cachedMacros[self:GetNameFromTab()][i] == 0 then
MultiBoxMacroNewAccountButton:Enable();
return;
end
end
MultiBoxMacroNewAccountButton:Disable();
end
function MultiBoxMacro:UpdateNewCharacterButtonStatus()
for i=1,18 do
if self.cachedMacros[self:GetNameFromTab()][i] == 0 then
MultiBoxMacroNewCharacterButton:Enable();
return;
end
end
MultiBoxMacroNewCharacterButton:Disable();
end
-- Player Macro functions
function MultiBoxMacro:LoadPlayerMacros()
local numAccountMacros, numCharacterMacros = GetNumMacros();
local numMacros = 0;
self.cachedMacros["player"] = {}
for j=0, 18, 18 do
if ( j == 0 ) then
numMacros = numAccountMacros;
else
numMacros = numCharacterMacros;
end
for i=1, 18 do
if i <= numMacros then
local thename, thetexture, thebody, theisLocal = GetMacroInfo(i+j);
--self:Print("Got macro info for"..thename);
self.cachedMacros["player"][i+j] = {
name = thename,
texture = thetexture,
body = thebody,
isLocal = theisLocal,
};
else
self.cachedMacros["player"][i+j] = 0;
end
end
end
self:SetMacroButtons(self.cachedMacros["player"]);
end
-- Party Macro functions
function MultiBoxMacro:LoadPartyMacros(member)
libRpc:RemoteCall(member, MBM_RPC_NumMacros, "GetNumMacros");
end
function MultiBoxMacro:EndLoadPartyMacros(member)
self:SetMacroButtons(self.cachedMacros[member]);
end
-- Selected macro management
function MultiBoxMacro:SetSelectedMacro(index)
if index == -1 then
MultiBoxMacroDeleteButton:Disable();
MultiBoxMacroSaveButton:Disable();
MultiBoxMacroEditButton:Disable();
else
MultiBoxMacroDeleteButton:Enable();
MultiBoxMacroSaveButton:Enable();
MultiBoxMacroEditButton:Enable();
end
MultiBoxMacroPopupFrame:Hide();
self.selectedMacro = index;
end
-- RPC callbacks
function MBM_RPC_NumMacros(info)
local numAccountMacros, numCharacterMacros = unpack(info.rval);
local numMacros = 0;
MultiBoxMacro.cachedMacros[info.target] = {}
for j=0, 18, 18 do
if ( j == 0 ) then
numMacros = numAccountMacros;
else
numMacros = numCharacterMacros;
end
for i=1, 18 do
if i <= numMacros then
MultiBoxMacro.cachedMacros[info.target][i+j] = -1;
else
MultiBoxMacro.cachedMacros[info.target][i+j] = 0;
end
end
end
for j=0, 18, 18 do
if ( j == 0 ) then
numMacros = numAccountMacros;
else
numMacros = numCharacterMacros;
end
for i=1, 18 do
if i <= numMacros then
libRpc:RemoteCall(info.target, MBM_RPC_MacroInfo, "GetMacroInfo", i+j);
end
end
end
end
function MBM_RPC_MacroInfo(info)
local id = unpack(info.args);
local thename, thetexture, thebody, theisLocal = unpack(info.rval);
MultiBoxMacro.cachedMacros[info.target][id] = {
name = thename,
texture = thetexture,
body = thebody,
isLocal = theisLocal,
};
if MultiBoxMacro:GetNameFromTab() == info.target then
MultiBoxMacro:SetMacroButtons(MultiBoxMacro.cached Macros[info.target]);
end
for i=1,36 do
if MultiBoxMacro.cachedMacros[info.target][i] == -1 then
return;
end
end
if MultiBoxMacro:GetNameFromTab() == info.target then
MultiBoxMacro:EndLoadPartyMacros(info.target)
end
end
function MBM_RPC_CreateMacro(info)
local id = unpack(info.rval);
local thename, icon, thebody, theisLocal = unpack(info.args);
local thetexture = GetMacroIconInfo(icon);
MultiBoxMacro.cachedMacros[info.target][id] = {
name = thename,
texture = thetexture,
body = thebody,
isLocal = theisLocal,
};
MultiBoxMacro:SetSelectedMacro(id);
MultiBoxMacro:LoadPartyMacros(info.target);
end
-- Main Frame methods
function MultiBoxMacro:Frame_OnShow()
self.Tab = 0;
MultiBoxMacro:OnTabChange(1);
MultiBoxMacroFrameTab1:SetText(UnitName("player"));
for i=1,4 do
if UnitExists("party"..i) then
if libTrust:IsAllowed(UnitName("party"..i)) then
getglobal("MultiBoxMacroFrameTab"..(i+1)):Show();
getglobal("MultiBoxMacroFrameTab"..(i+1)):SetText(UnitName("party"..i));
else
getglobal("MultiBoxMacroFrameTab"..(i+1)):Hide();
end
else
getglobal("MultiBoxMacroFrameTab"..(i+1)):Hide();
end
end
end
function MultiBoxMacro:Frame_OnHide()
MultiBoxMacroPopupFrame:Hide();
self.cachedMacros = {};
end
--Tab methods
MultiBoxMacro.Tab = 1
function MultiBoxMacro:OnTabChange(selectedTab)
if selectedTab ~= self.Tab then
self.Tab = selectedTab
if self.Tab == 1 then
MultiBoxMacroRefreshButton:Disable();
else
MultiBoxMacroRefreshButton:Enable();
end
self:ClearMacroButtons();
if self.Tab == 1 then
if self.cachedMacros["player"] == nil then
self:LoadPlayerMacros();
else
self:SetMacroButtons(self.cachedMacros["player"]);
end
MultiBoxMacroFrameCharacterMacroText:SetText(UnitN ame("player").."'s Macros");
else
if self.cachedMacros[self:GetNameFromTab()] == nil then
self:LoadPartyMacros(self:GetNameFromTab());
else
self:SetMacroButtons(self.cachedMacros[self:GetNameFromTab()]);
end
MultiBoxMacroFrameCharacterMacroText:SetText(self: GetNameFromTab().."'s Macros");
end
end
end
function MultiBoxMacro:GetNameFromTab()
if self.Tab == 1 then
return "player";
else
return UnitName("party"..(self.Tab-1));
end
end
pipakin
05-16-2008, 08:45 AM
Code (cont):
--Button methods
function MultiBoxMacro:RefreshButton_OnClick()
if self.Tab == 1 then
self:LoadPlayerMacros();
else
self:LoadPartyMacros(self:GetNameFromTab());
end
end
function MultiBoxMacro:MacroButton_OnClick(mbutton, id)
if mbutton ~= "LeftButton" then
return;
end
local macroButton = getglobal("MultiBoxMacroButton"..id);
local macroIcon = getglobal("MultiBoxMacroButton"..id.."Icon");
local macroName = getglobal("MultiBoxMacroButton"..id.."Name");
if self.cachedMacros[self:GetNameFromTab()][id] == 0 or self.cachedMacros[self:GetNameFromTab()][id] == -1 then
if MultiBoxMacro.selectedMacro ~= -1 then
getglobal("MultiBoxMacroButton"..MultiBoxMacro.selectedMacro):SetChecked(0);
end
self:SetSelectedMacro(-1);
macroButton:SetChecked(0);
MultiBoxMacroFrameSelectedMacroName:SetText("");
MultiBoxMacroFrameText:SetText("");
MultiBoxMacroFrameSelectedMacroButton:SetID(0);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re("");
return;
end
if ( id ~= MultiBoxMacro.selectedMacro ) then
if MultiBoxMacro.selectedMacro ~= -1 then
getglobal("MultiBoxMacroButton"..MultiBoxMacro.selectedMacro):SetChecked(0);
end
self:SetSelectedMacro(id);
macroButton:SetChecked(1);
MultiBoxMacroFrameSelectedMacroName:SetText(self.c achedMacros[self:GetNameFromTab()][id].name);
MultiBoxMacroFrameText:SetText(self.cachedMacros[self:GetNameFromTab()][id].body);
MultiBoxMacroFrameSelectedMacroButton:SetID(id);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re(self.cachedMacros[self:GetNameFromTab()][id].texture);
else
self:SetSelectedMacro(-1);
macroButton:SetChecked(0);
MultiBoxMacroFrameSelectedMacroName:SetText("");
MultiBoxMacroFrameText:SetText("");
MultiBoxMacroFrameSelectedMacroButton:SetID(0);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re("");
end
end
function MultiBoxMacro:SaveButton_OnClick()
if self.selectedMacro ~= -1 then
if self.Tab == 1 then
EditMacro(self.selectedMacro, nil, nil, MultiBoxMacroFrameText:GetText());
else
libRpc:RemoteCall(self:GetNameFromTab(), nil, "EditMacro", self.selectedMacro, nil, nil, MultiBoxMacroFrameText:GetText());
end
self.cachedMacros[self:GetNameFromTab()][self.selectedMacro].body = MultiBoxMacroFrameText:GetText();
end
end
function MultiBoxMacro:EditNameIconButton_OnClick()
if self.selectedMacro ~= -1 then
self.NameIconMode = "edit";
MultiBoxMacroPopupFrame:Show();
end
end
function MultiBoxMacro:DeleteButton_OnClick()
if self.selectedMacro ~= -1 then
local macroButton = getglobal("MultiBoxMacroButton"..(self.selectedMacro));
macroButton:SetChecked(0);
MultiBoxMacroFrameSelectedMacroName:SetText("");
MultiBoxMacroFrameText:SetText("");
MultiBoxMacroFrameSelectedMacroButton:SetID(0);
MultiBoxMacroFrameSelectedMacroButtonIcon:SetTextu re("");
if self.Tab == 1 then
DeleteMacro(self.selectedMacro);
self:SetSelectedMacro(-1);
else
libRpc:RemoteCall(self:GetNameFromTab(), nil, "DeleteMacro", self.selectedMacro);
self:SetSelectedMacro(-1);
end
self:RefreshButton_OnClick();
end
end
function MultiBoxMacro:NewAccountButton_OnClick()
self:SetSelectedMacro(-1);
self.NameIconMode = "newAccount";
MultiBoxMacroPopupFrame:Show();
end
function MultiBoxMacro:NewCharacterButton_OnClick()
self:SetSelectedMacro(-1);
self.NameIconMode = "newCharacter";
MultiBoxMacroPopupFrame:Show();
end
-- PopUp Fram methods
function MultiBoxMacro:PopupFrame_OnShow()
if self.NameIconMode == "edit" then
MultiBoxMacroPopupEditBox:SetText(MultiBoxMacroFra meSelectedMacroName:GetText());
end
MultiBoxMacro.selectedIcon = -1;
MBM_PopupScrollFrame_Update();
end
function MultiBoxMacro:PopupFrame_OnHide()
self.NameIconMode = nil;
end
-- PopUp Button methods
function MultiBoxMacro:PopupOkayButton_OnClick()
if self.selectedMacro ~= -1 then
local selicon = nil;
if self.selectedIcon ~= -1 then
selicon = self.selectedIcon;
end
if self.Tab == 1 then
EditMacro(self.selectedMacro, MultiBoxMacroPopupEditBox:GetText(), selicon, nil);
else
libRpc:RemoteCall(self:GetNameFromTab(), nil, "EditMacro", self.selectedMacro, MultiBoxMacroPopupEditBox:GetText(), selicon, nil);
end
MultiBoxMacroFrameSelectedMacroName:SetText(MultiB oxMacroPopupEditBox:GetText());
self.cachedMacros[self:GetNameFromTab()][self.selectedMacro].name = MultiBoxMacroPopupEditBox:GetText();
if self.selectedIcon ~= -1 then
self.cachedMacros[self:GetNameFromTab()][self.selectedMacro].texture = GetMacroIconInfo(self.selectedIcon);
end
else
local perCharacterMode = 0;
if self.NameIconMode == "newCharacter" then
perCharacterMode = 1;
end
if self.Tab == 1 then
local createdmacro = CreateMacro(MultiBoxMacroPopupEditBox:GetText(), self.selectedIcon, "", 1, perCharacterMode);
self:LoadPlayerMacros();
self:SetSelectedMacro(createdmacro);
else
libRpc:RemoteCall(self:GetNameFromTab(), MBM_RPC_CreateMacro, "CreateMacro", MultiBoxMacroPopupEditBox:GetText(), self.selectedIcon, "", 1, perCharacterMode);
end
end
MultiBoxMacroPopupFrame:Hide();
local tempselected = self.selectedMacro;
self:SetMacroButtons(self.cachedMacros[self:GetNameFromTab()]);
self:SetSelectedMacro(tempselected);
end
function MultiBoxMacro:PopupOkayButton_Update()
if MultiBoxMacroPopupEditBox:GetText() ~= "" then
if self.NameIconMode == "edit" or self.selectedIcon ~= -1 then
MultiBoxMacroPopupOkayButton:Enable();
end
else
MultiBoxMacroPopupOkayButton:Disable();
end
end
function MultiBoxMacro:PopupButton_OnClick(id)
self.selectedIcon = this:GetID() + (FauxScrollFrame_GetOffset(MultiBoxMacroPopupScrol lFrame) * NUM_ICONS_PER_ROW);
self:PopupOkayButton_Update()
end
-- Icon update for scrolling and such
MultiBoxMacro.selectedIcon = -1;
function MBM_PopupScrollFrame_Update()
local numMacroIcons = GetNumMacroIcons();
local macroPopupIcon, macroPopupButton;
local macroPopupOffset = FauxScrollFrame_GetOffset( MultiBoxMacroPopupScrollFrame );
local index;
-- Icon list
for i=1, NUM_MACRO_ICONS_SHOWN do
macroPopupIcon = getglobal("MultiBoxMacroPopupButton"..i.."Icon");
macroPopupButton = getglobal("MultiBoxMacroPopupButton"..i);
index = (macroPopupOffset * NUM_ICONS_PER_ROW) + i;
if ( index <= numMacroIcons ) then
macroPopupIcon:SetTexture(GetMacroIconInfo(index)) ;
macroPopupButton:Show();
else
macroPopupIcon:SetTexture("");
macroPopupButton:Hide();
end
if ( index == MultiBoxMacro.selectedIcon ) then
macroPopupButton:SetChecked(1);
else
macroPopupButton:SetChecked(nil);
end
end
-- Scrollbar stuff
FauxScrollFrame_Update(MultiBoxMacroPopupScrollFra me, ceil(numMacroIcons / NUM_ICONS_PER_ROW) , NUM_ICON_ROWS, MACRO_ICON_ROW_HEIGHT );
end
pipakin
05-17-2008, 01:47 PM
Been doing some performance tweaks for a new version, anyone out there running this? Was hoping for some bug reports :)
bugilt
05-17-2008, 02:21 PM
I'll install it today.
bigjt
05-18-2008, 07:26 AM
Butting my head at the wall here.
Installed it on my 5 toons, and it works on only one. Copied the addon folder from that toon to another, and cleared the savedvariables. still no go.
Got a error saying: [string "MultiBoxMacroframe.OnLoad"];|;attempt to index global 'MultiBoxMacro' (a nil value)
Looks nice on the toon it is working on tho..... Looking forward to using it on all 5. Going to make my life so much easier.
pipakin
05-18-2008, 09:43 AM
Do you have libRpc/libTrust installed on all the toons?
Chorizotarian
05-18-2008, 12:43 PM
And if so do you have any other addons that use LibTrust installed?
Icetech
05-18-2008, 03:54 PM
anything special needed to run this? i installed the 2libs.. did a /trust allow toon1 on all the alts.. i do a /mbm show or display and it just shows the main toon.. no tabs for other toons?
pipakin
05-18-2008, 04:04 PM
your main needs to trust them as well. So do a /trust allow altname for each alt.
bigjt
05-18-2008, 05:12 PM
Do you have libRpc/libTrust installed on all the toons?Yes, and to be sure I'm not missing a lib, I copied the addon folder from the working toon to the others. Did try to wipe the savedvariables to.
Icetech
05-18-2008, 06:40 PM
trusting both ways fixed it:) amazing addon! thanks..
pipakin
05-19-2008, 10:40 AM
Added a new version which should fix the slow response time on creating/deleting macros on alts. I haven't tested it at all since I did the edit on my work computer, so d/l it at your own risk :)
moosejaw
05-21-2008, 10:10 AM
Ok, three thumbs up for this mod. I love it. I really like the carryover on new macro name. Works great when creating the same macro on multiple clones.
This is so much better than trying to read the tiny font on my clones. Thank You!!!
Shinigami
05-30-2008, 08:09 AM
gonna try it this evening as far as i can see it is really a nice add-on (Y) :thumbsup:
pipakin
05-30-2008, 09:53 AM
gonna try it this evening as far as i can see it is really a nice add-on (Y) :thumbsup:
I'm tossing around all sorts of ideas for new features, but with all that's going on for me right now (new job, etc) I haven't even had time to thoroughly test version 0.2, lol
Aaron
05-30-2008, 03:21 PM
I'm a little lost here, where exactly does one get libtrust and librpc from? I've ran a search on wowace.com/files/ and wowinterface and nothing comes up, not even "trust" or "rpc".
Thanks :)
Aaron
05-30-2008, 05:43 PM
cheers
razorbax
09-04-2008, 10:03 AM
This is the Addon I have been looking for all this time. Has anyone got a copy? Does it still work? I know there is code but I have no idea how to make that into an addon;)
Maybe one of our great authors wants to add this into thier own compelation;)
So, I was toying around with libRpc/libTrust and I came up with this little beauty. It allows you to control all your macros from you main without switching windows (Which is a pain on my setup with the small alt windows).
Here's a pic of it (Yes, I completely ripped off the UI from SuperMacro. No I don't feel bad).
http://www.thekinfamily.com/mbm.jpg
I'ts still in development, so if it screws up one of your macros, then don't yell at me. Always make a backup :)
There's a bit of delay when refreshing an alt's macros or creating/deleting one (This is fixed in the development version). Editing is pretty much instant though. Be advised, it'll probably error if either you or the alt is in combat. Also, you'll need libRpc and libTrust, as I was too lazy to embed them.
Oh right, how to use it:
You need to be in a party with your alts.
You need to setup your trust settings. You main needs to trust your alts, and your alts need to trust your main.
Then just type /mbm show
I'll post the code for the interested/paranoid later.
the download links are here:
http://www.thekinfamily.com/MultiBoxMacro.zip - Stable release
http://www.thekinfamily.com/MultiBoxMacro-0.2a.zip - Unstable development
cheeseprophet
09-04-2008, 10:46 AM
Hm ye why did ppl stop replying to this post, pwng!
Otlecs
09-04-2008, 11:01 AM
Hm ye why did ppl stop replying to this post, pwng!
Probably because they didn't have anything of any value to add?
You could learn something from that.
cheeseprophet
09-04-2008, 11:30 AM
Hm ye why did ppl stop replying to this post, pwng!
Probably because they didn't have anything of any value to add?
You could learn something from that.So your suggestion is let every great post that doesnt get stickied to page 999
=.=
Otlecs
09-05-2008, 02:56 AM
So your suggestion is let every great post that doesnt get stickied to page 999
My suggestion is to not keep posting crap.
You remind me of a puppy I used to have.
For the first few months of its life, it did nothing but yap non-stop and shit everywhere. The only difference between you and the puppy is that it was actually cute, and eventually grew up.
Seriously. I just read all 23 posts you've made since you registered 4 whole days ago and not a single one adds any value at all. If you just want somewhere to post because you're an attention seeker, there are plenty of other platforms for that - don't do it here.
As for letting important threads slip, we have this wonderful new thing called "search" that people can use to find old threads. We also have a thing called a "Wiki" which is a slightly more persistent repository for important information.
If you find an old thread that you believe to be especially important and somehow difficult to find through search, feel free to take the initiative by adding it to the Wiki.
Until then you're just another noisy, yappy know-nothing taking up space on my forum ignore list.
Slavik
09-05-2008, 12:40 PM
Anyone have a link for this, the download site seems down?
vBulletin® v4.2.2, Copyright ©2000-2025, Jelsoft Enterprises Ltd.