# HG changeset patch
# User madcatzinc@35b17cf1-18cd-47ff-9ca3-31d6b526ef09
# Date 1327425261 0
# Node ID bf9220814fb59faa95007cfb1e322a83253b4924
The first version of the Cyborg MMO7 addon for warcraft
diff -r 000000000000 -r bf9220814fb5 CallbackFactory.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CallbackFactory.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,127 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: CalbackFactory.lua
+--~ Description: Creates lua callbacks that can be executed from a user keycombination
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+CallbackFactory = {
+ new = function()
+ local self = {}
+ self.Frame = CreateFrame("Frame","CallbackFactoryFrame", UIParent);
+ self.Callbacks = {}
+ self.Id = 1;
+
+ self.AddCallback = function(fn)
+ local name = "Button"..self.Id
+ self.Callbacks[name] = CreateFrame("Button", name, self.Frame)
+ self.Callbacks[name]:SetScript("OnClick", fn);
+ self.Id = self.Id + 1;
+ return self.Callbacks[name], self.Frame, name;
+ end
+
+ self.RemoveCallback = function(name)
+ self.Callbacks[name] = nil
+ end
+
+ return self;
+ end,
+
+ m_Instance = nil,
+
+ Instance = function()
+ if(nil == CallbackFactory.m_Instance) then
+ CallbackFactory.m_Instance = CallbackFactory.new();
+ end
+ return CallbackFactory.m_Instance;
+ end
+
+}
+
+
+GetCallback = function(callbackName)
+ local callback = nil
+ if("Map" == callbackName) then
+ callback = ToggleMap;
+ elseif("CharacterPage" == callbackName) then
+ callback = ToggleCharacterPage;
+ elseif("Spellbook" == callbackName) then
+ callback = ToggleSpellbook;
+ elseif("Macros" == callbackName) then
+ callback = ToggleMacros;
+ elseif("QuestLog" == callbackName) then
+ callback = ToggleQuests;
+ elseif("Achievement" == callbackName) then
+ callback = ToggleAchievements;
+ elseif("Inventory" == callbackName) then
+ callback = ToggleBags;
+ end;
+ return callback;
+end
+
+
+ToggleMap = function()
+ ToggleFrame(WorldMapFrame)
+end
+
+ToggleCharacterPage = function()
+ ToggleCharacter("PaperDollFrame")
+end
+
+ToggleSpellbook = function()
+ ToggleFrame(SpellBookFrame)
+ if(SpellBookFrame:IsShown()) then
+ SpellbookMicroButton:SetButtonState("PUSHED", 1);
+ else
+ SpellbookMicroButton:SetButtonState("NORMAL");
+ end
+
+end
+
+ToggleMacros = function()
+ if(MacroFrame:IsShown() and MacroFrame:IsVisible()) then
+ HideUIPanel(MacroFrame);
+ else
+ ShowMacroFrame();
+ end
+end
+
+ToggleQuests = function()
+ ToggleFrame(QuestLogFrame);
+ if ( QuestLogFrame:IsShown() ) then
+ QuestLogMicroButton:SetButtonState("PUSHED", 1);
+ else
+ QuestLogMicroButton:SetButtonState("NORMAL");
+ end
+end
+
+ToggleAchievements = function()
+ ToggleAchievementFrame();
+ if ( AchievementFrame and AchievementFrame:IsShown() ) then
+ AchievementMicroButton:SetButtonState("PUSHED", 1);
+ else
+ if ( ( HasCompletedAnyAchievement() or IsInGuild() ) and CanShowAchievementUI() ) then
+ AchievementMicroButton:Enable();
+ AchievementMicroButton:SetButtonState("NORMAL");
+ else
+ AchievementMicroButton:Disable();
+ end
+ end
+end
+
+ToggleBags = function()
+ ToggleAllBags();
+end
\ No newline at end of file
diff -r 000000000000 -r bf9220814fb5 CurrentProfile/Mmo7Wow.pr0
Binary file CurrentProfile/Mmo7Wow.pr0 has changed
diff -r 000000000000 -r bf9220814fb5 CyborgMMO7.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CyborgMMO7.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,664 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: CyborgMMO7.lua
+--~ Description: Plugin entry point, String tables and other generic crap that I could not think to put anywhere else.
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Mode = {
+ ["enUS"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-["
+ },
+ ["frFR"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-^"
+ },
+ ["deDE"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-ü"
+ },
+ ["zhCN"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-["
+ },
+ ["zhTW"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-["
+ },
+ ["esES"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-'"
+ },
+ ["esMX"] = {
+ "ALT-CTRL-E",
+ "ALT-CTRL-F",
+ "ALT-CTRL-'"
+ }
+}
+
+WowCommands = {
+ ["enUS"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL--",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["frFR"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL-)",
+ "ALT-CTRL-H",
+ "ALT-CTRL-Q",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["deDE"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL-ß",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["zhCN"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL--",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["zhTW"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL--",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["esES"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL-'",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ },
+ ["esMX"] = {
+ "ALT-CTRL-NUMPAD1",
+ "ALT-CTRL-NUMPAD2",
+ "ALT-CTRL-NUMPAD3",
+ "ALT-CTRL-NUMPAD4",
+ "ALT-CTRL-NUMPAD5",
+ "ALT-CTRL-NUMPAD6",
+ "ALT-CTRL-NUMPAD7",
+ "ALT-CTRL-NUMPAD8",
+ "ALT-CTRL-NUMPAD9",
+ "ALT-CTRL-NUMPAD0",
+ "ALT-CTRL-1",
+ "ALT-CTRL-2",
+ "ALT-CTRL-3",
+ "ALT-CTRL-4",
+ "ALT-CTRL-5",
+ "ALT-CTRL-6",
+ "ALT-CTRL-7",
+ "ALT-CTRL-8",
+ "ALT-CTRL-9",
+ "ALT-CTRL-0",
+ "ALT-CTRL-F1",
+ "ALT-CTRL-F2",
+ "ALT-CTRL-F3",
+ "ALT-CTRL-F4",
+ "ALT-CTRL-F5",
+ "ALT-CTRL-F6",
+ "ALT-CTRL-F7",
+ "ALT-CTRL-F8",
+ "ALT-CTRL-F9",
+ "ALT-CTRL-F10",
+ "ALT-CTRL-F11",
+ "ALT-CTRL-F12",
+ "ALT-CTRL-'",
+ "ALT-CTRL-H",
+ "ALT-CTRL-A",
+ "ALT-CTRL-B",
+ "ALT-CTRL-C",
+ "ALT-CTRL-D",
+ "ALT-CTRL-END"
+ }
+}
+
+
+StringTable = {
+ ["enUS"] = {
+ CyborgButtonTitle="Cyborg Button",
+ MiniMapButtonTitle="MiniMap Button",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="Default",
+ CyborgSizeSliderTitle="Cyborg Head Size",
+ PluginSizeSliderTitle="Interface Window Size"
+ },
+ ["frFR"] = {
+ CyborgButtonTitle="Bouton Cyborg",
+ MiniMapButtonTitle="Bouton minimap",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="Par défaut",
+ CyborgSizeSliderTitle="Dimension de la tête Cyborg",
+ PluginSizeSliderTitle="Dimension de la fenêtre d'interface"
+ },
+ ["deDE"] = {
+ CyborgButtonTitle="Cyborg-Taste",
+ MiniMapButtonTitle="MiniMap-Taste",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="Standard",
+ CyborgSizeSliderTitle="Größe des Cyborg-Kopfes",
+ PluginSizeSliderTitle="Größe des Schnittstellenfensters"
+ },
+ ["zhCN"] = {
+ CyborgButtonTitle="Cyborg 按钮",
+ MiniMapButtonTitle="“迷你地图”按钮",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="默认",
+ CyborgSizeSliderTitle="Cyborg 标题大小",
+ PluginSizeSliderTitle="界面窗口大小"
+ },
+ ["zhTW"] = {
+ CyborgButtonTitle="Cyborg 按鈕",
+ MiniMapButtonTitle="MiniMap 按鈕",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="預設",
+ CyborgSizeSliderTitle="Cyborg 頭大小",
+ PluginSizeSliderTitle="介面視窗大小"
+ },
+ ["esES"] = {
+ CyborgButtonTitle="Botón Cyborg",
+ MiniMapButtonTitle="Botón Minimapa",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="Predeterminado",
+ CyborgSizeSliderTitle="Tamaño de la cabeza de Cyborg",
+ PluginSizeSliderTitle="Tamaño de la ventana de la interfaz"
+ },
+ ["esMX"] = {
+ CyborgButtonTitle="Botón de Cyborg",
+ MiniMapButtonTitle="Botón de Minimapa",
+ OptionPageTitle="Cyborg MMO7",
+ OptionPageSetDefaults="Modo predeterminado",
+ CyborgSizeSliderTitle="Tamaño de la cabeza de Cyborg",
+ PluginSizeSliderTitle="Tamaño de la ventana de interfaz"
+ }
+}
+
+function LoadStrings(self)
+ self:SetText(StringTable[GetLocale()][self:GetName()]);
+end
+
+local VarsLoaded = false;
+local EnteredWorld = false;
+local LoadBinding = false;
+local SaveName = GetRealmName().."_"..UnitName("player");
+local Settings = nil;
+
+
+
+function CyborgMiniMapButton_Reposition(pos)
+ CyborgMiniMapFrame:SetPoint("TOPLEFT",
+ "Minimap",
+ "TOPLEFT",
+ 52-(80*cos(pos)),
+ (80*sin(pos))-52)
+end
+
+
+function CyborgMiniMapButton_OnUpdate()
+
+ local xpos,ypos = GetCursorPosition()
+ local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
+
+ xpos = (xmin)-(xpos / UIParent:GetScale())
+ ypos = (ypos/ UIParent:GetScale())-(ymin)
+
+ local degrees = math.deg(math.atan2(ypos,xpos));
+
+ while(degrees < 0) do
+ degrees = degrees + 360;
+ end
+
+
+ CyborgMiniMapButton_Reposition(degrees)
+end
+
+function MouseModeChange(mode)
+ local MiniMapTexture = getglobal("CyborgMiniMapButton_Icon")
+ local MiniMapGlowTexture = getglobal("CyborgMiniMapButton_IconGlow")
+ local OpenButtonTexture = getglobal("OpenButtonPage".."OpenMainForm"):GetNormalTexture();
+ local OpenButtonGlowTexture = getglobal("OpenButtonPage".."OpenMainForm"):GetHighlightTexture();
+ if(1==mode) then
+ MiniMapTexture:SetVertexColor(1,0,0,1)
+ --MiniMapGlowTexture:SetVertexColor(1,0.26,0.26,.75);
+ OpenButtonTexture:SetVertexColor(1,0,0,0.75);
+ --OpenButtonGlowTexture:SetVertexColor(1,0.26,0.26,0.50);
+ elseif(2==mode) then
+ MiniMapTexture:SetVertexColor(0.07,0.22,1,1)
+ MiniMapGlowTexture:SetVertexColor(0.13,0.56,1,.75);
+ OpenButtonTexture:SetVertexColor(0.07,0.22,1,0.75);
+ OpenButtonGlowTexture:SetVertexColor(0.13,0.56,1,0.5);
+ elseif(3==mode) then
+ MiniMapTexture:SetVertexColor(0.52,0.08,0.89,1)
+ MiniMapGlowTexture:SetVertexColor(0.67,0.31,0.85,.75);
+ OpenButtonTexture:SetVertexColor(0.52,0.08,0.89,0.75);
+ OpenButtonGlowTexture:SetVertexColor(0.67,0.31,0.85,0.5);
+ end
+end
+
+function GetSaveData()
+ if(VarsLoaded) then
+ if (CyborgMMO7SaveData == nil) then
+ CyborgMMO7SaveData = {};
+ CyborgMMO7SaveData[SaveName] = {}
+ end
+ return CyborgMMO7SaveData[SaveName];
+ end
+ return nil;
+end
+
+function SetSaveData(data, index)
+ if(VarsLoaded) then
+ GetSaveData()[index] = data
+ end
+end
+
+function Event(self, event, ...)
+ if(event == "VARIABLES_LOADED") then
+ VarsLoaded = true;
+ elseif(event == "PLAYER_ENTERING_WORLD") then
+ EnteredWorld = true;
+ elseif(event == "PLAYER_ENTER_COMBAT") then
+ msg("PLAYER_ENTER_COMBAT");
+ Close();
+ elseif(event == nil) then
+ msg("Event is nil");
+ else
+ msg("Event is not nil");
+ end
+
+
+ -- Fire Loading if and only if the player is in the world and vars are loaded
+ if(false == LoadBinding) then
+ if(VarsLoaded) then
+ if(EnteredWorld) then
+ local data = GetSaveData()
+
+ RatPageModel.Instance().LoadData();
+ LoadBinding = true;
+
+ ShowMacroFrame();
+ HideUIPanel(MacroFrame);
+
+
+ SetupModeCallbacks(1);
+ SetupModeCallbacks(2);
+ SetupModeCallbacks(3);
+
+
+ --Reload Slider values:
+ if(nil == data["Settings"]) then
+ data["Settings"] = {}
+ data["Settings"]["Cyborg"] = 0.75;
+ data["Settings"]["Plugin"] = 0.75;
+ data["Settings"]["MiniMapButton"] = true;
+ data["Settings"]["CyborgButton"] = true;
+ end
+
+ Settings = data["Settings"];
+
+ CyborgSizeSlider:SetValue(Settings["Cyborg"]);
+ SetOpenButtonSize(Settings["Cyborg"])
+ PluginSizeSlider:SetValue(Settings["Plugin"]);
+ SetMainPageSize(Settings["Plugin"]);
+
+ if(Settings["MiniMapButton"] == false) then
+ CyborgMiniMapButton:Hide();
+ end
+
+ local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
+ CyborgMiniMapButton_Reposition(math.deg(math.atan2(ymin,xmin)))
+ -- Close the main window for now
+ Close();
+ end
+ end
+ end
+end
+
+function SetDefaultSettings()
+ OpenButtonPageOpenMainForm:ClearAllPoints();
+ MainPage:ClearAllPoints();
+ OpenButtonPageOpenMainForm:SetPoint("LEFT", UIParent, "LEFT", 0, 0);
+ MainPage:SetPoint("LEFT", UIParent, "LEFT", 0, 0);
+
+ SetOpenButtonSize(0.75);
+ SetMainPageSize(0.75);
+ MiniMapButton:SetChecked();
+ SetMiniMapButton(true);
+ CyborgButton:SetChecked();
+ SetCyborgHeadButton(true);
+end
+
+function SetupModeCallbacks(modeNum)
+
+ fn = function()
+ MouseModeChange(modeNum);
+ RatPageModel.Instance().SetMode(modeNum)
+ end
+
+ local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(fn);
+ if(1 ~= SetOverrideBindingClick(parentFrame, true, Mode[GetLocale()][modeNum], name, "LeftButton")) then
+ msg("Failed to Bind modeChange");
+ end
+end
+
+function Loaded()
+ MainPage:RegisterEvent("VARIABLES_LOADED");
+ MainPage:RegisterEvent("PLAYER_ENTERING_WORLD");
+ MainPage:RegisterEvent("PLAYER_ENTER_COMBAT");
+end
+
+function Close()
+ MainPage:Hide();
+ if(Settings["CyborgButton"] == true) then
+ OpenButtonPage:Show();
+ end
+end
+
+function Open()
+ MainPage:Show();
+ RatQuickPage:Hide();
+ if(Settings["CyborgButton"] == true) then
+ OpenButtonPage:Show();
+ end
+end
+
+function IsOpen()
+ if(MainPage:IsVisible() == 1) then
+ return true;
+ else
+ return false;
+ end
+end
+
+function Toggle()
+ if(IsOpen()) then
+ Close();
+ else
+ Open();
+ end
+end
+
+function msg(m)
+ local id, name = GetChannelName("Debug");
+ SendChatMessage(m, "CHANNEL", nil, id);
+end
+
+function SetMainPageSize(percent)
+ if(VarsLoaded) then
+ if(EnteredWorld) then
+ MainPage:SetScale(percent);
+ Settings["Plugin"] = percent;
+ local data = GetSaveData()
+ data["Settings"] = Settings
+ PluginSizeSlider:SetValue(percent);
+ end
+ end
+end
+
+function SetOpenButtonSize(percent)
+ if(VarsLoaded) then
+ if(EnteredWorld) then
+ OpenButtonPage:SetScale(percent)
+ Settings["Cyborg"] = percent;
+ local data = GetSaveData()
+ data["Settings"] = Settings
+ CyborgSizeSlider:SetValue(percent);
+ end
+ end
+end
+
+function SetCyborgHeadButton(boolVal)
+ Settings["CyborgButton"] = boolVal;
+ if(Settings["CyborgButton"] == true) then
+ Close();
+ else
+ OpenButtonPage:Hide();
+ end
+ local data = GetSaveData()
+ data["Settings"] = Settings
+end
+
+function SetMiniMapButton(boolVal)
+ Settings["MiniMapButton"] = boolVal;
+ if(Settings["MiniMapButton"] == true) then
+ CyborgMiniMapButton:Show();
+ else
+ CyborgMiniMapButton:Hide();
+ end
+ local data = GetSaveData()
+ data["Settings"] = Settings
+end
+
diff -r 000000000000 -r bf9220814fb5 CyborgMMO7.toc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CyborgMMO7.toc Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,19 @@
+## Interface: 40300
+## Title: Cyborg MMO7 Addon
+## DefaultState: Enabled
+## Version: 1.0.0
+## LoadOnDemand: 0
+## SavedVariablesPerCharacter: CyborgMMO7SaveData
+
+OptionView.lua
+CallbackFactory.lua
+WowObjects.lua
+RatPageModel.lua
+RatPageController.lua
+RatPageView.lua
+CyborgMMO7.lua
+RatPage.xml
+RatQuickPage.xml
+MainPage.xml
+OpenButtonPage.xml
+OptionPage.xml
diff -r 000000000000 -r bf9220814fb5 Graphics/AchievementDown.tga
Binary file Graphics/AchievementDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/AchievementOver.tga
Binary file Graphics/AchievementOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/AchievementUnselected.tga
Binary file Graphics/AchievementUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CharacterPageDown.tga
Binary file Graphics/CharacterPageDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CharacterPageOver.tga
Binary file Graphics/CharacterPageOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CharacterPageUnselected.tga
Binary file Graphics/CharacterPageUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CloseButton.tga
Binary file Graphics/CloseButton.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CloseButtonDown.tga
Binary file Graphics/CloseButtonDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CloseButtonOver.tga
Binary file Graphics/CloseButtonOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Cyborg.tga
Binary file Graphics/Cyborg.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/CyborgGlow.tga
Binary file Graphics/CyborgGlow.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Glows.tga
Binary file Graphics/Glows.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/InventoryDown.tga
Binary file Graphics/InventoryDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/InventoryOver.tga
Binary file Graphics/InventoryOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/InventoryUnselected.tga
Binary file Graphics/InventoryUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Lines.tga
Binary file Graphics/Lines.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MacrosDown.tga
Binary file Graphics/MacrosDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MacrosOver.tga
Binary file Graphics/MacrosOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MacrosUnselected.tga
Binary file Graphics/MacrosUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MapDown.tga
Binary file Graphics/MapDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MapOver.tga
Binary file Graphics/MapOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/MapUnselected.tga
Binary file Graphics/MapUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode1Down.tga
Binary file Graphics/Mode1Down.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode1Over.tga
Binary file Graphics/Mode1Over.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode1Selected.tga
Binary file Graphics/Mode1Selected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode2Down.tga
Binary file Graphics/Mode2Down.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode2Over.tga
Binary file Graphics/Mode2Over.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode2Selected.tga
Binary file Graphics/Mode2Selected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode3Down.tga
Binary file Graphics/Mode3Down.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode3Over.tga
Binary file Graphics/Mode3Over.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Mode3Selected.tga
Binary file Graphics/Mode3Selected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/ParchmentAndAllIcons.tga
Binary file Graphics/ParchmentAndAllIcons.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/ParchmentAndLeftSide.tga
Binary file Graphics/ParchmentAndLeftSide.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/QuestLogDown.tga
Binary file Graphics/QuestLogDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/QuestLogOver.tga
Binary file Graphics/QuestLogOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/QuestLogUnselected.tga
Binary file Graphics/QuestLogUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/Slot.tga
Binary file Graphics/Slot.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotDown.tga
Binary file Graphics/SlotDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotLeft.tga
Binary file Graphics/SlotLeft.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotMiddle.tga
Binary file Graphics/SlotMiddle.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotOver.tga
Binary file Graphics/SlotOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotRight.tga
Binary file Graphics/SlotRight.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SlotUp.tga
Binary file Graphics/SlotUp.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SpellbookDown.tga
Binary file Graphics/SpellbookDown.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SpellbookOver.tga
Binary file Graphics/SpellbookOver.tga has changed
diff -r 000000000000 -r bf9220814fb5 Graphics/SpellbookUnselected.tga
Binary file Graphics/SpellbookUnselected.tga has changed
diff -r 000000000000 -r bf9220814fb5 MainPage.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MainPage.xml Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loaded();
+ Event(this, event,...);
+
+
+
diff -r 000000000000 -r bf9220814fb5 OpenButtonPage.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OpenButtonPage.xml Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r bf9220814fb5 OptionPage.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OptionPage.xml Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LoadStrings(getglobal(self:GetName().."Title"));
+
+
+ if(self:GetChecked() == 1) then
+ SetMiniMapButton(true)
+ else
+ SetMiniMapButton(false)
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LoadStrings(getglobal(self:GetName().."Title"));
+
+
+ if(self:GetChecked() == 1) then
+ SetCyborgHeadButton(true)
+ else
+ SetCyborgHeadButton(false)
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LoadStrings(getglobal(self:GetName().."Title"))
+
+ SetOpenButtonSize(self:GetValue())
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LoadStrings(getglobal(self:GetName().."Title"));
+
+
+ SetMainPageSize(self:GetValue())
+
+
+
+
+
+
+
+
+
+ LoadStrings(getglobal(self:GetName().."Title"));
+ msg("Loaded Option Page");
+ self = OptionView.new(self);
+
+
+
+
diff -r 000000000000 -r bf9220814fb5 OptionView.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OptionView.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,28 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: OptionView.lua
+--~ Description: The code for the Option page in the UI, not much here because we dont have many options. Probably could refactor.
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+OptionView = {
+ new = function(self)
+ self.name = "Cyborg MMO7 Plugin"
+ InterfaceOptions_AddCategory(self);
+ return self
+
+ end
+}
diff -r 000000000000 -r bf9220814fb5 RatPage.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPage.xml Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,481 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self = RatPageView.new(self);
+
+
+
+
diff -r 000000000000 -r bf9220814fb5 RatPageController.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageController.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,86 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: RatPageController.lua
+--~ Description: Controller logic for the RatPage
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+RatPageController = {
+ new = function()
+ local self = {};
+ RatPageModel.Instance().SetMode(1);
+
+ self.SlotClicked = function(slot)
+ local slotObject = nil
+ slotObject = RatPageModel.Instance().GetObjectOnButton(slot.Id)
+ RatPageModel.Instance().SetObjectOnButton(slot.Id, RatPageModel.Instance().GetMode(), self.GetCursorObject());
+
+ if(slotObject ~= nil) then
+ slotObject.Pickup();
+ end
+
+ end
+
+ self.ModeClicked = function(mode)
+ msg("Setting mode "..tostring(mode.Id));
+ RatPageModel.Instance().SetMode(mode.Id);
+ end
+
+ self.GetCursorObject = function()
+ local cursorObject = nil;
+ if(nil ~= GetCursorInfo()) then
+ local type, detail, subdetail = GetCursorInfo();
+ cursorObject = WowObject.Create(type, detail, subdetail);
+ ClearCursor();
+ end
+ return cursorObject;
+ end
+
+ self.CallbackDropped = function(callbackObject)
+ local slot = nil;
+ local observers = RatPageModel.Instance().GetAllObservers();
+ for i = 1, (# observers) do
+ if(MouseIsOver(observers[i])) then
+ slot = observers[i];
+ break;
+ end
+ end
+ if(nil ~= slot) then
+ RatPageModel.Instance().SetObjectOnButton(slot.Id, RatPageModel.Instance().GetMode(), callbackObject.wowObject);
+ end
+ end
+
+
+
+ self.Close = function()
+
+ end
+
+ self.Open = function()
+ end
+
+ return self;
+ end,
+
+ m_Instance = nil,
+
+ Instance = function()
+ if(nil == RatPageController.m_Instance) then
+ RatPageController.m_Instance = RatPageController.new();
+ end
+ return RatPageController.m_Instance;
+ end
+}
diff -r 000000000000 -r bf9220814fb5 RatPageModel.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageModel.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,157 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: RatPageModel.lua
+--~ Description: Code model of the MMO7 mouse
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+-- Constants --
+
+local RAT7 = { BUTTONS = 13, MODES = 3, SHIFT = 0}
+
+local MIDDLEMOUSE = 1;
+
+RatPageModel = {
+ new = function()
+ local self = {}
+ self.m_Mode = 1;
+ self.ObserverCount = 0;
+ self.ObserverList = {}
+ self.Data = {}
+
+ for i = 1,RAT7.MODES do
+ self.Data[i] = {}
+ for j = 1, RAT7.BUTTONS do
+ self.Data[i][j] = {};
+ end
+ end
+
+ self.InitSaveData = function(data)
+ for i = 1,RAT7.MODES do
+ if (nil == data["Rat"][i]) then
+ data["Rat"][i] = {}
+ end
+ for j = 1, RAT7.BUTTONS do
+ if (nil == data["Rat"][i][j]) then
+ data["Rat"][i][j] = {}
+ end
+ end
+ end
+ end
+
+
+ self.LoadData = function()
+ msg("Loading...")
+ local data = GetSaveData();
+
+
+ if (nil == data["Rat"]) then
+ data["Rat"] = {}
+ self.InitSaveData(data);
+ end
+
+ self.Data = data["Rat"]
+ if(data ~= nil) then
+ for mode = 1,RAT7.MODES do
+ for button = 1, RAT7.BUTTONS do
+ if(self.Data[mode][button] ~= nil) then
+ object = WowObject.Create(self.Data[mode][button].Type, self.Data[mode][button].Detail, self.Data[mode][button].Subdetail);
+ self.SetObjectOnButtonNoUpdate(button, mode, object);
+ else
+ object = WowObject.Create("", "", "");
+ self.SetObjectOnButtonNoUpdate(button, mode, object);
+ self.Data[mode][button] = object;
+ end
+ end
+ end
+ self.UpdateObservers();
+ end
+ end
+
+ self.SaveData = function()
+ msg("Saving...")
+ SetSaveData(self.Data, "Rat");
+ end
+
+ self.SetMode = function(mode)
+ self.m_Mode = mode;
+ self.UpdateObservers();
+ end
+
+ self.GetMode = function()
+ return self.m_Mode;
+ end
+
+ self.GetData = function()
+ return self.Data, self.m_Mode;
+ end
+
+ self.GetObjectOnButton = function(button)
+ if(nil == self.Data[self.m_Mode][button]) then
+ return nil;
+ else
+ return self.Data[self.m_Mode][button]
+ end
+ end
+
+ self.SetObjectOnButtonNoUpdate = function(button, mode, object)
+ --msg("button = "..tostring(button).." mode = "..tostring(mode))
+ self.Data[mode][button] = object;
+
+ if(nil ~= object) then
+ object.SetBinding(WowCommands[GetLocale()][((mode-1)*RAT7.BUTTONS)+button]);
+ if("callback" == object.Type) then
+ msg("trying to set texture")
+ local slot = getglobal("defaultPageSlot"..button);
+ slot:SetNormalTexture(object.Texture)
+ end
+ else
+ msg("clearing "..button)
+ WowObject.ClearBinding(WowCommands[GetLocale()][((mode-1)*RAT7.BUTTONS)+button])
+ end
+ end
+
+ self.SetObjectOnButton = function(button, mode, object)
+ self.SetObjectOnButtonNoUpdate(button, mode, object);
+ self.UpdateObservers()
+ end
+
+ self.AddObserver = function(view)
+ table.insert(self.ObserverList,view)
+ self.observerCount = # self.ObserverList
+ end
+
+ self.GetAllObservers = function()
+ return self.ObserverList;
+ end
+
+ self.UpdateObservers = function()
+ for i = 1, (# self.ObserverList) do
+ self.ObserverList[i].Update(self.Data, self.m_Mode)
+ end
+ self.SaveData()
+ end
+ return self;
+ end,
+
+ m_Instance = nil,
+
+ Instance = function()
+ if(nil == RatPageModel.m_Instance) then
+ RatPageModel.m_Instance = RatPageModel.new();
+ end
+ return RatPageModel.m_Instance;
+ end
+}
diff -r 000000000000 -r bf9220814fb5 RatPageView.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageView.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,157 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: RatPageView.lua
+--~ Description: Interaction logic for the RatPage
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+RatPageView = {
+ new = function(self)
+ msg("new Rat Page View");
+ for _, child in ipairs(self:GetChildren()) do
+ child.Register();
+ end
+
+ self.SlotClicked = function(slot)
+ msg("View Recieved Click")
+ RatPageController.Instance().SlotClicked(slot)
+ end
+
+ self.ModeClicked = function(mode)
+ msg("View Recieved Click")
+ RatPageController.Instance().ModeClicked(mode)
+ end
+
+ self.RegisterMode = function()
+ msg("ModeRegistered")
+ end
+
+ self.RegisterSlot = function()
+ msg("SlotRegistered")
+ end
+ return self;
+ end
+}
+
+RatQuickPageView = {
+ new = function(self)
+ for _, child in ipairs(self:GetChildren()) do
+ child.Register();
+ end
+
+ self.SlotClicked = function(slot)
+ RatPageController.Instance().SlotClicked(slot)
+ end
+
+ return self;
+ end
+}
+
+-- Slot Class --
+SlotView = {
+ new = function(self, parent)
+ self._assignedWowObject = nil;
+ self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
+ self.Id = self:GetID();
+ RatPageModel.Instance().AddObserver(self);
+ self.UnCheckedTexture = self:GetNormalTexture();
+
+ -- Object Method --
+ self.Clicked = function()
+ self:GetParent().SlotClicked(self)
+
+ GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+ --GameTooltip:SetText(self:GetID());
+ end
+
+ self.Update = function(data, activeMode)
+ local icon = _G[self:GetName().."Icon"];
+ if(nil ~= data[activeMode][self.Id]) then
+ self:SetChecked(true);
+ icon:SetTexture(data[activeMode][self.Id].Texture);
+ else
+ icon:SetTexture(nil);
+ self:SetChecked(false);
+ end
+
+
+ end
+
+ return self;
+ end,
+}
+
+SlotMiniView = {
+ new = function(self, parent)
+ self._assignedWowObject = nil;
+ self.Id = self:GetID();
+ RatPageModel.Instance().AddObserver(self);
+ self.UnCheckedTexture = self:GetNormalTexture();
+
+ self.Update = function(data, activeMode)
+ local icon = _G[self:GetName().."Icon"];
+ if(nil ~= data[activeMode][self.Id]) then
+ self:SetChecked(true);
+
+ icon:SetTexture(data[activeMode][self.Id].Texture);
+ icon:SetAlpha(.5);
+ else
+ icon:SetTexture(nil);
+ self:SetChecked(false);
+ end
+ end
+
+ return self;
+ end
+}
+
+
+-- ModeButton --
+ModeView = {
+ new = function(self)
+ self.Id = self:GetID();
+ self.Name = self:GetName();
+ RatPageModel.Instance().AddObserver(self);
+ if(self.Id ~= 1) then
+ self:Hide()
+ end
+
+ self.Clicked = function()
+ local nextMode;
+ if(self.Id == 1) then
+ nextMode = getglobal("Mode2");
+ else
+ if(self.Id == 2) then
+ nextMode = getglobal("Mode3");
+ else
+ nextMode = getglobal("Mode1");
+ end
+ end
+ self:GetParent().ModeClicked(nextMode)
+ end
+
+ self.Update = function(data, activeMode)
+ if(self.Id == activeMode) then
+ self:Show()
+ else
+ self:Hide()
+ end
+
+ end
+
+ return self;
+ end
+}
diff -r 000000000000 -r bf9220814fb5 RatQuickPage.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RatQuickPage.xml Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RatQuickPageView.new(self);
+
+
+
+
diff -r 000000000000 -r bf9220814fb5 WowObjects.lua
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WowObjects.lua Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,443 @@
+--~ Warcraft Plugin for Cyborg MMO7
+--~ Filename: WowObjects.lua
+--~ Description: Warcraft in game object models
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ of the License, or (at your option) any later version.
+
+--~ This program is distributed in the hope that it will be useful,
+--~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+--~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--~ GNU General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+WowObject = {
+ new = function(type, detail, subdetail)
+ local self = {};
+ self.Texture = nil;
+ self.Name = "NoName";
+ self.Type = type;
+ self.Detail = detail;
+ self.Subdetail = subdetail;
+
+
+ -- Methods --
+ self.DoAction = function()
+ msg("Nothing To Do");
+ end
+
+ self.Pickup = function()
+ msg("Pick up Item");
+ end
+
+ self.SetBinding = function(key)
+ end
+
+ self.PlaySound = function()
+ PlaySound("igAbilityIconDrop");
+ end
+
+ return self;
+ end,
+
+ ClearBinding = function(key)
+ local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(WowObject.DoNothing);
+ if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+ msg("Failed to bind companion to button click");
+ end
+ end,
+
+ DoNothing = function()
+ end,
+
+ Load = function(object)
+ if("item" == type) then
+ object = WowItem.Load(Object)
+ elseif("macro" == type) then
+ object = WowMacro.Load(object)
+ elseif("spell" == type) then
+ object = WowSpell.Load(object)
+ elseif("petaction" == type) then
+ object = WowSpell.Load(object)
+ --elseif("merchant"== type) then
+ --object = SlotMerchant.new(detail,subdetail)
+ elseif("companion" == type) then
+ object = WowCompanion.Load(object)
+ elseif("equipmentset" == type) then
+ object = WowEquipmentSet.Load(object)
+ else
+ object = WowObject.new(type,detail, subdetail)
+ end
+ return object;
+ end,
+
+ -- Static Methods --
+ Create = function(objectType, detail, subdetail)
+ local object;
+ if("item" == objectType) then
+ object = WowItem.new(detail,subdetail)
+ elseif("macro" == objectType) then
+ object = WowMacro.new(detail)
+ elseif("spell" == objectType) then
+ object = WowSpell.new(objectType, detail,subdetail)
+ elseif("petaction" == objectType) then
+ object = WowSpell.new(objectType, detail,subdetail)
+ elseif("merchant"== objectType) then
+ object = SlotMerchant.new(detail,subdetail)
+ elseif("companion" == objectType) then
+ object = WowCompanion.new(detail,subdetail)
+ elseif("equipmentset" == objectType) then
+ object = WowEquipmentSet.new(objectType,detail,subdetail)
+ elseif("callback" == objectType) then
+ object = WowCallback.new(detail);
+ else
+ object = WowObject.new(objectType,detail, subdetail)
+ end
+
+ return object;
+ end
+}
+
+local CallbackCursor = nil;
+
+CallbackIcons = {
+ new = function(self)
+ self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs = self:GetPoint();
+ --self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs);
+ self.strata = self:GetFrameStrata();
+ self.wowObject = WowCallback.new(self:GetName());
+ self.wowObject.SetTextures(self);
+ self:RegisterForDrag("LeftButton","RightButton")
+ self:SetResizable(false);
+
+ self.OnClick = function()
+ self.wowObject.DoAction();
+ end
+
+
+ self.DragStart = function()
+ self:SetMovable(true);
+ self:StartMoving();
+ self.isMoving = true;
+ self:SetFrameStrata("TOOLTIP")
+ end
+
+ self.DragStop = function()
+
+ self:SetFrameStrata(self.strata);
+ self.isMoving = false;
+ self:SetMovable(false);
+ self:StopMovingOrSizing();
+
+ self:ClearAllPoints();
+ self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs);
+ local x, y = GetCursorPosition();
+ RatPageController.Instance().CallbackDropped(self)
+ end
+
+ return self;
+ end
+}
+
+WowCallback = {
+ new = function(callbackName)
+ local self = WowObject.new("callback", callbackName, "");
+ self.CallbackName = callbackName;
+ self.Texture = "Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Unselected.tga"
+
+ self.SetTextures = function(buttonFrame)
+ buttonFrame:SetNormalTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Unselected.tga")
+ buttonFrame:SetPushedTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Down.tga")
+ buttonFrame:SetHighlightTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Over.tga")
+ end
+
+ self.DoAction = function()
+ local action = GetCallback(self.CallbackName)
+ msg("calling callback:- "..self.CallbackName);
+ action();
+
+ end
+
+ self.PickupCallback = function()
+
+ local slot = nil;
+ local observers = RatPageModel.Instance().GetAllObservers();
+ for i = 1, (# observers) do
+ if(MouseIsOver(observers[i])) then
+ slot = observers[i];
+ break;
+ end
+ end
+ slot:SetNormalTexture(slot.UnCheckedTexture)
+ end
+
+
+ self.ClickHandler = function(self, button, down)
+ msg("click handler");
+ CallbackCursor:StopMoving();
+ CallbackCursor:Hide();
+
+ if("LeftButton" == button) then
+ else
+
+ end
+ end
+
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ self.PickupCallback();
+
+ end
+
+
+ self.SetBinding = function(key)
+ local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+ if(1 ~= SetOverrideBindingClick(CallbackFactory.Instance().Frame, true, key, name, "LeftButton")) then
+ msg("Failed to Bind modeChange");
+ end
+ end
+
+ return self;
+ end
+}
+
+-- WowItem Class --
+
+WowItem = {
+ new = function(number, itemID)
+ local self = WowObject.new("item", number, itemID); -- base class
+ -- Set all the item info. --
+ self.Name,
+ self.Link,
+ self.Rarity,
+ self.Level,
+ self.MinLevel,
+ self.Type,
+ self.SubType,
+ self.StackCount,
+ self.EquipLoc,
+ self.Texture,
+ self.SellPrice = GetItemInfo(itemID);
+
+ -- override method --
+ self.DoAction = function()
+ msg("Use Item");
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ --SetCursor(self.Texture);
+ return PickupItem(self.Link);
+ end
+
+ self.SetBinding = function(key)
+ SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "ITEM "..self.Name);
+ end
+
+ return self;
+ end,
+}
+
+-- WowSpell Class --
+
+WowSpell = {
+ new = function(type, spellbookID, spellbook)
+ local self = WowObject.new(type, spellbookID, spellbook) -- base class
+ self.SpellbookID = spellbookID;
+ self.Spellbook = spellbook;
+ self.Name, self.Rank = GetSpellBookItemName(spellbookID, spellbook);
+ self.Texture = GetSpellBookItemTexture(spellbookID, spellbook);
+ self.Type = type;
+
+
+ -- override method --
+ self.DoAction = function()
+ msg("Cast Spell");
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ --SetCursor(self.Texture);
+ return PickupSpellBookItem(self.SpellbookID, self.Spellbook);
+ end
+
+ self.SetBinding = function(key)
+ msg("Binding to key "..key)
+ self.Key = key
+ SetOverrideBinding(CallbackFactory.Instance().Frame, true, self.Key, self.Type.." "..self.Name);
+ end
+
+ return self;
+
+ end,
+
+ Load = function(object)
+ local o = WowSpell.new(object.Type, object.Detail, object.Subdetail);
+ o.Name = object.Name;
+ o.Texture = object.Texture;
+ return o;
+ end
+}
+
+-- WowMacro Class --
+
+WowMacro = {
+ new = function(index)
+ local self = WowObject.new("macro", index, nil); -- base class
+ -- Set all the item info. --
+ self.Name,
+ self.Texture,
+ self.Body,
+ self.isLocal = GetMacroInfo(index);
+ self.Index = index;
+
+ -- override method --
+ self.DoAction = function()
+ msg("Use Item");
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ --SetCursor(self.Texture);
+ return PickupMacro(self.Index);
+ end
+
+ self.SetBinding = function(key)
+ self.Key = key;
+ SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "MACRO "..self.Index);
+ end
+
+ return self;
+ end,
+}
+
+
+-- WowCompanion Class --
+
+WowCompanion = {
+ new = function(index, SubType)
+ local self = WowObject.new("companion", index, SubType); -- base class
+ -- Set all the item info. --
+ self.Id, self.Name, self.SpellId, self.Texture, self.isSummoned = GetCompanionInfo(SubType, index);
+ self.SubType = SubType;
+ self.index = index;
+ -- override method --
+ self.DoAction = function()
+ if((self.SubType == "MOUNT") and IsMounted()) then
+ Dismount();
+ else
+ CallCompanion(self.SubType, self.index);
+ end
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ return PickupCompanion(self.SubType, self.index);
+ end
+
+ self.SetBinding = function(key)
+ self.Key = key
+ local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+ if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+ msg("Failed to bind companion to button click");
+ end
+ --SetOverrideBinding(hiddenModeChanger, true, key, "MACRO "..self.Index);
+ end
+
+ return self;
+ end,
+
+ Load = function(object)
+ local o = WowCompanion.new(object.index, object.SubType);
+ return o;
+ end
+}
+
+-- WowMerchant Class --
+WowMerchant = {
+ new = function(index)
+ local self = WowObject.new("macro", index, nil); -- base class
+ -- Set all the item info. --
+ self.Name,
+ self.Texture,
+ self.Price,
+ self.Quantity,
+ self.NumAvailable,
+ self.IsUsable,
+ self.ExtendedCost = GetMerchantItemInfo(index);
+ self.Index = index;
+
+ -- override method --
+ self.DoAction = function()
+ msg("Use Item");
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ --SetCursor(self.Texture);
+ return PickupMerchantItem(self.Index);
+ end
+
+ self.SetBinding = function(key)
+ self.Key = key
+ SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "MERCHANT "..self.Index);
+ end
+
+ return self;
+ end,
+}
+
+-- WowEquipmentSet Class --
+WowEquipmentSet = {
+ new = function(objectType, name, index)
+ local self = WowObject.new(objectType, name, index); -- base class
+ -- Set all the item info. --
+ texture, lessIndex = GetEquipmentSetInfoByName(name);
+ self.Texture = "Interface\\Icons\\"..texture;
+ self.Name = name
+ self.Index = lessIndex+1;
+
+ -- override method --
+ self.DoAction = function()
+ UseEquipmentSet(self.Name);
+ end
+
+ -- override method --
+ self.Pickup = function()
+ self.PlaySound()
+ ClearCursor();
+ --SetCursor(self.Texture);
+ return PickupEquipmentSetByName(self.Name);
+ end
+
+ self.SetBinding = function(key)
+ self.Key = key
+ local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+ if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+ msg("Failed to bind companion to button click");
+ end
+ end
+
+ return self;
+ end,
+}
+
+
+-- End Of WowObjects --
diff -r 000000000000 -r bf9220814fb5 license.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/license.txt Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
\ No newline at end of file