Thread Tools Display Modes
09-06-11, 03:28 AM   #1
cakhuang2
A Murloc Raider
Join Date: Sep 2011
Posts: 5
The error aboult "ADDON_ACTION_BLOCKED"

While I falling down for Vehicle in combat ,it will call sevel errors like that.
Code:
"[ADDON_ACTION_BLOCKED] 插件 'AspectPosionBar' 尝试调用保护功能 'PossessButton1:Show()'。:\n<in C code>: in function `Show'\nInterface\\FrameXML\\BonusActionBarFrame.lua:501: in function `PossessBar_UpdateState':\nInterface\\FrameXML\\BonusActionBarFrame.lua:476: in function `PossessBar_Update':\nInterface\\FrameXML\\MainMenuBar.lua:127: in function `MainMenuBar_ToPlayerArt':\nInterface\\FrameXML\\MainMenuBar.lua:63: in function `MainMenuBar_UpdateArt':\nInterface\\FrameXML\\MainMenuBar.lua:50: in function `animPostFunc':\nInterface\\FrameXML\\AnimationSystem.lua:22: in function <Interface\\FrameXML\\AnimationSystem.lua:10>:\nInterface\\FrameXML\\AnimationSystem.lua:35: in function <Interface\\FrameXML\\AnimationSystem.lua:29>:\n\n  ---"
But I dont know how to solve them.
This is the Addon.
Code:
------------------------------------------------------------------------------------------

AspectPosionBarFrame = LibStub("AceAddon-3.0"):NewAddon("AspectPosionBarFrame",  "AceEvent-3.0", "AceHook-3.0");
local L = {};
local A = AspectPosionBarFrame;
A._DEBUG = false;
A.name = "AspectPosionBar";
A.class = select(2, UnitClass("player"));
A.enable = true;
local GetSpellName = GetSpellName or GetSpellBookItemName



if (GetLocale() == "zhCN") then
	L["左键 - 上毒主手"] = "左键 - 主手上毒";
	L["右键 - 上毒副手"] = "右键 - 副手上毒";
	L["中键 - 上毒投掷"] = "中键 - 投掷上毒";
	L["麻醉药膏"] = "麻醉药膏";
	L["速效药膏"] = "速效药膏";
	L["致伤药膏"] = "致伤药膏";
	L["致命药膏"] = "致命药膏";
	L["麻痹药膏"] = "麻痹药膏";
	L["减速药膏"] = "减速药膏";

	L["埃索达"] = "埃索达";
	L["塞拉摩"] = "塞拉摩";
	L["奥格瑞玛"] = "奥格瑞玛";
	L["幽暗城"] = "幽暗城";
	L["斯通纳德"] = "斯通纳德";
	L["暴风城"] = "暴风城";
	L["沙塔斯"] = "沙塔斯";
	L["达拉然"] = "达拉然";
	L["达纳苏斯"] = "达纳苏斯";
	L["铁炉堡"] = "铁炉堡";
	L["银月城"] = "银月城";
	L["雷霆崖"] = "雷霆崖";
	L["托尔巴拉德"] = "托尔巴拉德"

	L["传送门: "] = "传送门:";
	L["传送: "] = "传送:";
	L["左键 - 传送: "] = "左键 - 传送: ";
	L["右键 - 传送门: "] = "右键 - 传送门: ";
	BINDING_HEADER_AspectPosionBar_TITLE = "守护/毒药/传送门条";
	_G["BINDING_NAME_CLICK AspectPosionBarButton1:LeftButton"] = "快捷键1";
	_G["BINDING_NAME_CLICK AspectPosionBarButton2:LeftButton"] = "快捷键2";
	_G["BINDING_NAME_CLICK AspectPosionBarButton3:LeftButton"] = "快捷键3";
	_G["BINDING_NAME_CLICK AspectPosionBarButton4:LeftButton"] = "快捷键4";
	_G["BINDING_NAME_CLICK AspectPosionBarButton5:LeftButton"] = "快捷键5";
	_G["BINDING_NAME_CLICK AspectPosionBarButton6:LeftButton"] = "快捷键6";
	_G["BINDING_NAME_CLICK AspectPosionBarButton7:LeftButton"] = "快捷键7";
	_G["BINDING_NAME_CLICK AspectPosionBarButton8:LeftButton"] = "快捷键8";
	_G["BINDING_NAME_CLICK AspectPosionBarButton9:LeftButton"] = "快捷键9";
	_G["BINDING_NAME_CLICK AspectPosionBarButton10:LeftButton"] = "快捷键10";
elseif (GetLocale() == "zhTW") then
	L["左键 - 上毒主手"] = "左鍵 - 主手上毒";
	L["右键 - 上毒副手"] = "右鍵 - 副手上毒";	
	L["中鍵 - 上毒投掷"] = "中键 - 投擲上毒";
	L["麻醉药膏"] = "麻醉毒藥";
	L["速效药膏"] = "速效毒藥";
	L["致伤药膏"] = "致傷毒藥";
	L["致命药膏"] = "致命毒藥";
	L["麻痹药膏"] = "麻痹毒藥";
	L["减速药膏"] = "致殘毒藥";

	L["埃索达"] = "艾克索達";
	L["塞拉摩"] = "塞拉摩";
	L["奥格瑞玛"] = "奧格瑪";
	L["幽暗城"] = "幽暗城";
	L["斯通纳德"] = "斯通納德";
	L["暴风城"] = "暴風城";
	L["沙塔斯"] = "撒塔斯";
	L["达拉然"] = "達拉然";
	L["达纳苏斯"] = "達納蘇斯";
	L["铁炉堡"] = "鐵爐堡";
	L["银月城"] = "銀月城";
	L["雷霆崖"] = "雷霆崖";
	L["托尔巴拉德"] = "托巴拉德"

	L["传送门: "] = "傳送門:";
	L["传送: "] = "傳送:";
	L["左键 - 传送: "] = "左鍵 - 傳送:";
	L["右键 - 传送门: "] = "右鍵 - 傳送門:";
else
	L["左键 - 上毒主手"] = "左键 - 主手上毒";
	L["右键 - 上毒副手"] = "右键 - 副手上毒";	
	L["中键 - 上毒投掷"] = "中键 - 投掷上毒";
	L["麻醉药膏"] = "Anesthetic Poison";
	L["速效药膏"] = "Instant Poison";
	L["致伤药膏"] = "Wound Poison";
	L["致命药膏"] = "Deadly Poison";
	L["麻痹药膏"] = "Mind-numbing Poison";
	L["减速药膏"] = "Crippling Poison";

	L["埃索达"] = "埃索达";
	L["塞拉摩"] = "塞拉摩";
	L["奥格瑞玛"] = "奥格瑞玛";
	L["幽暗城"] = "幽暗城";
	L["斯通纳德"] = "斯通纳德";
	L["暴风城"] = "暴风城";
	L["沙塔斯"] = "撒塔斯";
	L["达拉然"] = "達拉然";
	L["达纳苏斯"] = "达纳苏斯";
	L["铁炉堡"] = "铁炉堡";
	L["银月城"] = "银月城";
	L["雷霆崖"] = "雷霆崖";
	L["托尔巴拉德"] = "托尔巴拉德"

	L["传送门: "] = "传送门:";
	L["传送: "] = "传送:";
	L["左键 - 传送: "] = "左键 - 传送: ";
	L["右键 - 传送门: "] = "右键 - 传送门: ";
end


A.spellsDB = {
	["HUNTER"] = {
		[1] = 13165,		-- 雄鹰守
		[2] = 82661, 		--獵狐守護
		[3] = 5118,		-- 猎豹守护
		[4] = 13159,		-- 豹群守护
		[5] = 20043,		-- 野性守护

	},
	["ROGUE"] = {
		[1] = 1784,		-- 潜行
		[2] = 51713,		-- 暗影之舞
		-- 毒药(itemID可能获取不到信息...)
		[3] = {t = "p", name = L["麻醉药膏"]},
		[4] = {t = "p", name = L["速效药膏"]},
		[5] = {t = "p", name = L["致伤药膏"]},
		[6] = {t = "p", name = L["致命药膏"]},
		[7] = {t = "p", name = L["麻痹药膏"]},
		[8] = {t = "p", name = L["减速药膏"]},
	},
	["MAGE"] = {
		[1] = {t = "d", name = L["埃索达"]},
		[2] = {t = "d", name = L["塞拉摩"]},
		[3] = {t = "d", name = L["奥格瑞玛"]},
		[4] = {t = "d", name = L["幽暗城"]},
		[5] = {t = "d", name = L["斯通纳德"]},
		[6] = {t = "d", name = L["暴风城"]},
		[7] = {t = "d", name = L["沙塔斯"]},
		[8] = {t = "d", name = L["达拉然"]},
		[9] = {t = "d", name = L["达纳苏斯"]},
		[10] = {t = "d", name = L["铁炉堡"]},	
		[11] = {t = "d", name = L["银月城"]},
		[12] = {t = "d", name = L["雷霆崖"]},
		[13] = {t = "d", name = L["托尔巴拉德"]},
	},
	["WARLOCK"] = {
		[1] = 47241,	-- 恶魔变形61610
		[2] = 688,		-- 召唤小鬼
		[3] = 697,		-- 召唤虚空行者
		[4] = 712,		-- 召唤魅魔
		[5] = 691,		-- 召唤地狱猎犬
		[6] = 30146,	-- 召唤恶魔卫士
		[7] = 1122,	-- 地狱火
		[8] = 18540,	-- 末日仪式
	},
};
A.ROMAN = {" IX", " VIII", " VII", " V",  " IV", " III", " II"," VI", ""};
A.order = {"spells", "teleport", "items"};
A.actions = {
	spells = {};
	teleport = {};
	items = {};
};
A.tmp = {
	spells = {};
	teleport = {};
	items = {};
};
A.buttons = {};
A.hooks = {};
A.hooked = false;
A.loaded = false;

function A:debug(fmt, ...)
	if (self._DEBUG) then
		print(format(fmt, ...));
	end	
end
local function SecureCall( ...)
	local func = select(1, ...);
	if (type(func) == "function") then	
		if (InCombatLockdown()) then
			--dwPush(func, ...);
			return;
		end

		pcall(...);
	end 
end
function AspectPosionButton_OnLoad(self)
	self:SetNormalTexture("");
	self:RegisterForClicks("AnyUp");	
	self.cooldown = _G[self:GetName() .. "Cooldown"];
	self.icon = _G[self:GetName() .. "Icon"];
	self.spellID = -1;
	self.buttonType = "AspectPosionButtonTemplate"; --11
	ActionButton_UpdateHotkeys(self, self.buttonType);--11
	self:RegisterEvent("UPDATE_BINDINGS")--11
end
function AspectPosionButton_OnEvent(self,event,...)
	if event=="UPDATE_BINDINGS" then
		ActionButton_UpdateHotkeys(self, self.buttonType)
	end
end

function AspectPosionButton_OnEnter(self)
	if ( GetCVar("UberTooltips") == "1" ) then
		GameTooltip_SetDefaultAnchor(GameTooltip, self);
	else
		GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
	end
	local link, isItem;
	if (self:GetAttribute("type") == "spell") then
		if (self.teleportID) then
			isteleport = true;
		elseif (self.spellID) then
			link = GetSpellLink(self.spellID);
		end
	elseif (self:GetAttribute("type") == "item" and self.itemID) then
		-- _, link = GetItemInfo(self.itemID);
		isItem = true;
	end
	if (link) then
		GameTooltip:SetHyperlink(link);
	else
		GameTooltip:SetText(self.spellName);
		if (isItem) then
			GameTooltip:AddLine(L["左键 - 上毒主手"], 0.7, 0.7, 0.7);
			GameTooltip:AddLine(L["右键 - 上毒副手"], 0.7, 0.7, 0.7);
			GameTooltip:AddLine(L["中键 - 上毒投掷"], 0.7, 0.7, 0.7);	
		elseif (isteleport) then					
			GameTooltip:AddLine(L["左键 - 传送: "] .. self.spellName, 0.7, 0.7, 0.7);
			GameTooltip:AddLine(L["右键 - 传送门: "] .. self.spellName, 0.7, 0.7, 0.7);	
		end
	end
	
	GameTooltip:Show();
end

function AspectPosionButton_PostClick(self)
	if (self.isActive) then
		self:SetChecked(1);
	else
		self:SetChecked(0);
	end
end

function A:CreateButton(index)
	if (index <= NUM_SHAPESHIFT_SLOTS) then
		local button = _G["AspectPosionBarButton" .. index];
		return button;
	end
	return false;
end

function A:CheckSpell(spellID)
	if sepllID=="传送 :托尔巴拉德" then
		sepllID = 88344
	end
	--[[ local i = 1;
	local spell = GetSpellInfo(spellID);
	local spellName = GetSpellName(i, BOOKTYPE_SPELL);
	while (spellName) do
		if (spellName == spell) then
			--print(spellName)
			return true;
		end
		i = i + 1;
		spellName = GetSpellName(i, BOOKTYPE_SPELL);		
	end ]]
	local spelllink=GetSpellLink(spellID)
	spellID=spelllink and string.match(spelllink,"spell:(%d*)")
	return spellID and IsSpellKnown(spellID);
end

function A:CheckItem(itemName)	
	local id, name;
	if (itemName) then
		for _, i in ipairs(self.ROMAN) do
			name = format("%s%s", itemName, i);			
			local count = GetItemCount(name);
			if (count and count > 0) then
				return true, name;
			end
		end
	end
	
	return false;
end

function A:hasNewSpell()
	if (#(self.actions) ~= #(self.tmp) or #(self.actions.spells) ~= #(self.tmp.spells) or #(self.actions.teleport) ~= #(self.tmp.teleport) or #(self.actions.items) ~= #(self.tmp.items)) then
		return true;
	end
	return false;
end

function A:CloneTable(t)
	assert(t and type(t) == "table", "CloneTable #! param must be a table value");
	local tmp = {};
	for k, v in pairs(t) do
		if (type(v) == "table") then
			tmp[k] = self:CloneTable(v);
		else
			tmp[k] = v;
		end
	end
	return tmp;
end

function A:UpdateAspect()
	self.tmp.spells = {};
	self.tmp.teleport = {};
	self.tmp.items = {};	
	if (self.spellsDB[	self.class]) then
		for i, spellID in ipairs(self.spellsDB[self.class]) do
			if (type(spellID) == "table") then				
				if (spellID.t and spellID.t == "p") then		-- 毒药
					local hasItem, name = self:CheckItem(spellID.name)
					if (hasItem) then
						tinsert(self.tmp.items, name);
					end
				elseif (spellID.t and spellID.t == "d") then	-- 传送门
					local check1, check2 = self:CheckSpell(L["传送门: "] .. spellID.name), self:CheckSpell(L["传送: "] .. spellID.name);
					if (check1 or check2) then
						tinsert(self.tmp.teleport, spellID.name);
					end
				end
			else
				if (self:CheckSpell(spellID)) then
					tinsert(self.tmp.spells, spellID);	
				end
			end
		end	
	end

	if (self:hasNewSpell()) then
		self.actions = self:CloneTable(self.tmp);
		return true;
	end

	return false;
end

function A:CreateBar()
	for i = 1, NUM_SHAPESHIFT_SLOTS do
		A.buttons[i] = self:CreateButton(i);
	end
end

function A:GetNumShapeshiftForms()
	local num = #(self.actions.spells) + #(self.actions.items) + #(self.actions.teleport);
	num = (num > 0 and num) or GetNumShapeshiftForms() or 0;
	if (num > NUM_SHAPESHIFT_SLOTS) then
		num = NUM_SHAPESHIFT_SLOTS;	-- 猜测有错误
	end

	return tonumber(num);
end

function A:IsBuffActive(name)
	local i = 1;
	local buffName = UnitBuff("player", i);
	while (buffName) do
		if (buffName == name) then
			return i;
		end
		i = i +1;
		buffName = UnitBuff("player", i);
	end

	return false;	
end

function A:GetShapeshiftFormInfo(buttonId)
	local isActive, isCastable, name, _, texture, type;	
	local sn = #(self.actions.spells)
	local tn = #(self.actions.teleport);
	
	if (self.actions["spells"][buttonId]) then		
		name, _, texture = GetSpellInfo(self.actions.spells[buttonId]);
		isActive = self:IsBuffActive(name);
		isCastable = true;
		type = "spell";
	elseif (self.actions["teleport"][buttonId - sn]) then
		_, _, texture = GetSpellInfo(L["传送: "] .. self.actions.teleport[buttonId - sn]) 
		texture = texture or select(3,GetSpellInfo(L["传送门: "] .. self.actions.teleport[buttonId - sn]))	--11	
		name = self.actions.teleport[buttonId - sn];
		isActive = false;
		isCastable = true;
		type = "teleport";
	elseif (self.actions["items"][buttonId - sn - tn]) then
		name, _, _, _, _, _, _, _, _, texture = GetItemInfo(self.actions.items[buttonId - sn - tn]);
		isActive = false;
		isCastable = true;
		type = "item";		
	end

	if (not texture) then
		texture, name, isActive, isCastable = GetShapeshiftFormInfo(buttonId);
	end

	--self:debug("texture: %s name: %s", texture, name);	
	return texture, name or "", isActive, isCastable, type;
end

function A:GetShapeshiftForm(var)
	local texture, name, isActive, isCastable;
	for i=1, NUM_SHAPESHIFT_SLOTS, 1 do
		texture, name, isActive, isCastable = self:GetShapeshiftFormInfo(i);
		if (isActive) then
			return i;
		end
	end
end

function A:GetShapeshiftFormCooldown(buttonId)
	local sn = #(self.actions.spells);
	local tn = #(self.actions.teleport);
	if (self.actions.spells and self.actions.spells[buttonId]) then
		local name = GetSpellInfo(self.actions.spells[buttonId]);
		return GetSpellCooldown(name);
	--[[ elseif (self.actions.teleport and self.actions.teleport[buttonId - sn]) then
		local name = GetSpellInfo(self.actions.teleport[buttonId - sn]);
		return GetItemCooldown(name);
	elseif (self.actions.items and self.actions.items[buttonId - sn - tn]) then
		return GetItemCooldown(self.actions.items[buttonId - sn - tn]); ]]
	end

	return GetShapeshiftFormCooldown(buttonId);	
end

function A:UpdateAspectCooldown()
	local numForms = self:GetNumShapeshiftForms();
	local start, duration, enable, cooldown, button;
	for i=1, numForms do
		button = self.buttons[i];
		cooldown = _G[button:GetName() .. "Cooldown"];
		start, duration, enable = self:GetShapeshiftFormCooldown(i);
		if (cooldown and start and duration) then
			CooldownFrame_SetTimer(cooldown, start, duration, enable);
		end
	end
end

function A:AspectBarUpdate()
	if not InCombatLockdown() then--for  blocked

		local numForms = self:GetNumShapeshiftForms();
		if (numForms > 0) then
			if ( numForms == 1 ) then
				AspectPosionBarMiddle:Hide();
				AspectPosionBarRight:SetPoint("LEFT", "AspectPosionBarLeft", "LEFT", 12, 0);
				SecureCall(AspectPosionBarButton1.ClearAllPoints, AspectPosionBarButton1);
				SecureCall(AspectPosionBarButton1.SetPoint, AspectPosionBarButton1, "BOTTOMLEFT", "AspectPosionBar", "BOTTOMLEFT", 12, 3);
			elseif ( numForms == 2 ) then
				AspectPosionBarMiddle:Hide();
				AspectPosionBarRight:SetPoint("LEFT", "AspectPosionBarLeft", "RIGHT", 0, 0);
			else
				AspectPosionBarMiddle:Show();
				AspectPosionBarMiddle:SetPoint("LEFT", "AspectPosionBarLeft", "RIGHT", 0, 0);
				AspectPosionBarMiddle:SetWidth(37 * (numForms-2));
				AspectPosionBarMiddle:SetTexCoord(0, numForms-2, 0, 1);
				AspectPosionBarRight:SetPoint("LEFT", "AspectPosionBarMiddle", "RIGHT", 0, 0);
			end
			SecureCall(AspectPosionBar.Show, AspectPosionBar);
		else
			SecureCall(AspectPosionBar.Hide, AspectPosionBar);

		end
	end
	self:AspectBarUpdateState();	
end


function A:AspectBarUpdateState()

	local numForms = self:GetNumShapeshiftForms();
	self:debug("number forms %d", numForms);
	local texture, name, isActive, isCastable, type;
	local button, icon, cooldown, ssb;
	local start, duration, enable;
	local sn = #(self.actions.spells);
	local tn = #(self.actions.teleport);

	for i=1, NUM_SHAPESHIFT_SLOTS do
		button =self.buttons[i];		
		if ( i <= numForms ) then			
			texture, name, isActive, isCastable, type = self:GetShapeshiftFormInfo(i);		
			button.icon:SetTexture(texture);
			if ( texture ) then
				button.cooldown:Show();
			else
				button.cooldown:Hide();
			end
			self:UpdateAspectCooldown();
			
			if ( isActive ) then
				button:SetChecked(1);
				button.isActive = true;
			else
				button:SetChecked(0);
				button.isActive = false;
			end

			if ( isCastable ) then
				button.icon:SetVertexColor(1.0, 1.0, 1.0);
			else
				button.icon:SetVertexColor(0.4, 0.4, 0.4);
			end
			if (type == "spell") then
				SecureCall(button.SetAttribute, button, "type", "spell");
				SecureCall(button.SetAttribute, button, "spell", name);				
				button.spellID = self.actions.spells[i];
			elseif (type == "teleport") then
				SecureCall(button.SetAttribute, button, "type", "spell");	
				SecureCall(button.SetAttribute, button, "spell1", name~=L["托尔巴拉德"] and L["传送: "] .. name or 88344);--11
				SecureCall(button.SetAttribute, button, "spell2", L["传送门: "] .. name);
				button.teleportID = true;
			elseif (type == "item") then
				SecureCall(button.SetAttribute, button, "type", "item");
				SecureCall(button.SetAttribute, button, "item", name);
				SecureCall(button.SetAttribute, button, "target-slot1", "16");
				SecureCall(button.SetAttribute, button, "target-slot2", "17");
				SecureCall(button.SetAttribute, button, "target-slot3", "18");--11
				button.itemID = self.actions.items[i - sn - tn];
			end			
			button.spellName = name;
			SecureCall(button.Show, button);
		else
			SecureCall(button.Hide, button);
		end
	end
	self:UpdateItemCount();
	SecureCall(UIParent_ManageFramePositions);
end

function A:UpdateItemCount()
	local button, count, label;
	for i=1, NUM_SHAPESHIFT_SLOTS do
		button =self.buttons[i];
		if (button:IsShown() and button:GetAttribute("type") == "item") then
			count = GetItemCount(button:GetAttribute("item"));
			label = _G[button:GetName() .. "Count"];
			label:SetText(count);
			if (count > 9) then
				label:SetTextColor(0.0, 1.0, 0.0)
			elseif (count > 4) then
				label:SetTextColor(1.0, 1.0, 0.0)
			elseif (count > 0) then
				label:SetTextColor(1.0, 0.0, 0.0)
			end
		elseif _G[button:GetName() .. "Count"] then--11
			_G[button:GetName() .. "Count"]:SetText("")
		end
	end
end

function A:UNIT_AURA(event, unit)
	if (unit == "player") then
		self:AspectBarUpdate();
	end	
end

function A:LEARNED_SPELL_IN_TAB()
	if (self:UpdateAspect()) then
		self:AspectBarUpdate();
		--RePositionPetActionBar();
	end
end

function A:ACTIONBAR_UPDATE_USABLE()
	self:AspectBarUpdate();
end

function A:ACTIONBAR_UPDATE_COOLDOWN()
	self:UpdateAspectCooldown();
end

function A:UPDATE_BINDINGS(self,actionButtonType)
	local numForms = A:GetNumShapeshiftForms();	
	--ClearOverrideBindings(ShapeshiftBarFrame);
	for i = 1, numForms do
		local buttonName = "AspectPosionBarButton" .. i;
		local key1, key2 = GetBindingKey("SHAPESHIFTBUTTON"..i);
		if (key1) then
			--SetOverrideBindingClick(AspectPosionBar, true, key1, buttonName);
		end
		if (key2) then
			--SetOverrideBindingClick(AspectPosionBar, true, key2, buttonName);
		end	
	end

end

function A:SPELLS_CHANGED()
	if (self:UpdateAspect()) then
		self:AspectBarUpdate();
		--RePositionPetActionBar();
	end	
	self:UnregisterEvent("SPELLS_CHANGED");
end

function A:BAG_UPDATE()
	if (self:UpdateAspect()) then
		self:AspectBarUpdate();
		--RePositionPetActionBar();
	else
		self:UpdateItemCount();
	end
end

function A:PLAYER_ENTERING_WORLD()
	self:AspectBarUpdate();
	if not ChatFrame1:IsUserPlaced() then--11
		ChatFrame1:SetPoint("BOTTOMLEFT",UIParent, "BOTTOMLEFT" ,32 ,155)
		ChatFrame1:SetUserPlaced(true)
	end
end

function A:UIParent_ManageFramePositions()
	if (not self.enable) then return end

	local hasBottomLeft;
	
	if ( MultiBarBottomLeft:IsShown() ) then			
		hasBottomLeft = 1;
	end
	local YOffset = hasBottomLeft and 45 or 0;
	if ( ReputationWatchBar:IsShown() and MainMenuExpBar:IsShown() ) then
		YOffset = YOffset + 8;
	end
	if ( MainMenuBarMaxLevelBar:IsShown() ) then
		YOffset = YOffset -5;
	end
	if ( hasBottomLeft ) then		
		if ( AspectPosionBar ) then
			AspectPosionBarLeft:SetAlpha(0);
			AspectPosionBarRight:SetAlpha(0);
			AspectPosionBarMiddle:SetAlpha(0);
		end
	else
		if ( AspectPosionBar ) then
			if ( self:GetNumShapeshiftForms() > 2 ) then
				AspectPosionBarMiddle:SetAlpha(1);
			end
			AspectPosionBarLeft:SetAlpha(1);
			AspectPosionBarRight:SetAlpha(1);
		end
	end


	self:debug("UIParent_ManageFramePositions YOffset %d", YOffset);
	--SecureCall(AspectPosionBar.ClearAllPoints, AspectPosionBar);--11
	--SecureCall(AspectPosionBar.SetPoint, AspectPosionBar, "BOTTOMLEFT", "MainMenuBar", "TOPLEFT", 80, YOffset);	

end
-----------------------------------------
--	OnX
-----------------------------------------
function A:OnModuleEnable()
	self:RegisterEvent("UNIT_AURA");	
	self:RegisterEvent("SPELLS_CHANGED");
	self:RegisterEvent("LEARNED_SPELL_IN_TAB");
	self:RegisterEvent("ACTIONBAR_UPDATE_USABLE");
	self:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN");
	self:RegisterEvent("UPDATE_BINDINGS");
	self:RegisterEvent("BAG_UPDATE");
	self:RegisterEvent("PLAYER_ENTERING_WORLD");
	SecureCall(ShapeshiftBarFrame.Hide, ShapeshiftBarFrame);	
	ShapeshiftBarFrame.orgShow = ShapeshiftBarFrame.Show;
	ShapeshiftBarFrame.Show = DUMMY_FUNC;
	ShapeshiftBarFrame.orgHide = ShapeshiftBarFrame.Hide;
	ShapeshiftBarFrame.Hide = DUMMY_FUNC;
	self:SecureHook("UIParent_ManageFramePositions");

	SecureCall(AspectPosionBar.ClearAllPoints, AspectPosionBar);
	AspectPosionBarDB = AspectPosionBarDB or {}--11
	if AspectPosionBarDB.a then
		SecureCall(AspectPosionBar.SetPoint, AspectPosionBar, AspectPosionBarDB.a, "UIParent", AspectPosionBarDB.a, AspectPosionBarDB.x, AspectPosionBarDB.y);
	elseif IsAddOnLoaded("LUI") then--11

		SecureCall(AspectPosionBar.SetPoint, AspectPosionBar, "BOTTOMLEFT", "ChatFrame1Tab", "TOPLEFT", 50, 5);
	else
		SecureCall(AspectPosionBar.SetPoint, AspectPosionBar, "BOTTOMLEFT", "MainMenuBar", "TOPLEFT", 80, 45);
	end
	self:AspectBarUpdate();
end
function DUMMY_FUNC() end
function A:OnModuleDisable()	
	self:UnregisterAllEvents();
	self:AspectBarUpdate();
	self:Unhook("UIParent_ManageFramePositions");	
	ShapeshiftBarFrame.Show = ShapeshiftBarFrame.orgShow;
	ShapeshiftBarFrame.orgShow = nil;	
	ShapeshiftBarFrame.Hide = ShapeshiftBarFrame.orgHide;
	ShapeshiftBarFrame.orgHide = nil;
	SecureCall(AspectPosionBar.Hide, AspectPosionBar);	
	ShapeshiftBar_Update();
end


function A:ToggleManageFrame(switch)
	if (switch) then
		self.enable = true;

	else
		self.enable = false;	

	end
end

function A:OnInitialize()	
	if (not self.loaded) then
		self.loaded = true;
		self:UpdateAspect();
		self:CreateBar();
	end
end

function AspectPosionBar_OnLoad(self)
	self:SetClampedToScreen()

end

function AspectPosionBar_OnEvent(self, event, arg1)
	
end

function AspectPosionBar_OnShow(self)
	SecureCall(UIParent_ManageFramePositions);
end

function AspectPosionBar_OnHide(self)
	SecureCall(UIParent_ManageFramePositions);
end

--[[function PetActionBarFrameRePosition_Toggle(switch)
	PetActionBarFrame:ClearAllPoints()
	if (switch) then
		PetActionBarFrame:SetPoint(poa,pob,poc,pod+350,poe)
	else
		PetActionBarFrame:SetPoint(poa,pob,poc,pod,poe)
	end
end]]
local petpo=PetActionBarFrame.SetPoint
function PetActionBarFrame.SetPoint(...)
	if InCombatLockdown() then--for  blocked
		return
	end
	local poa,pob,poc,pod,poe,pof=...
	if AspectPosionBar:IsShown() and not GetSpellLink("恶魔变形")  and not A.class=="HUNTER" then--11
		poe=poe+350
	end
	petpo(poa,pob,poc,pod,poe,pof)
end 
function AspectPosionBar_Toggle(switch)
	if (switch) then
		A:OnModuleEnable();
	else
		A:OnModuleDisable();
	end	
	--PetActionBarFrameRePosition_Toggle(switch);

end

function AspectPosionBar_Jieguan(switch)
	local apb, ssb, la;
	for i=1, NUM_SHAPESHIFT_SLOTS do
		apb = _G["AspectPosionBarButton" .. i];
		ssb = _G["ShapeshiftButton" .. i];
		SecureCall(apb.ClearAllPoints, apb);
		if (switch) then			
			SecureCall(apb.SetPoint, apb, "CENTER", ssb, "CENTER", 0, 0);
		else			

			if (i == 1) then				
				SecureCall(apb.SetPoint, apb, "BOTTOMLEFT", AspectPosionBar, "BOTTOMLEFT", 10, 3);
			else				
				SecureCall(apb.SetPoint, apb, "LEFT", la, "RIGHT", 8, 0);
			end
			la = apb;
		end
		
	end

	if (switch) then
		AspectPosionBarFrame:ToggleManageFrame(false);
	else
		AspectPosionBarFrame:ToggleManageFrame(true);
	end
	SecureCall(UIParent_ManageFramePositions);
end
function AspectPosionBar_ShowKeyBindingFrame(key) --11
	if ( key == nil ) then 
		KeyBindingFrame_LoadUI(); 
		ShowUIPanel(KeyBindingFrame); 
		return; 
	end 
	local bindings = GetNumBindings();
	for i = 1, bindings, 1 do
		local value = GetBinding(i); 
		if ( value == key ) then
			KeyBindingFrame_LoadUI(); 
			ShowUIPanel(KeyBindingFrame);
			KeyBindingFrameScrollFrameScrollBar:SetValue((i-1)*KEY_BINDING_HEIGHT); 
		end 
	end 
end
Code:
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="svn://113.106.98.20/repos/Duowan-Work/UI.xsd">
	<Script file="AspectPosionBar.lua"/>
	<CheckButton name="AspectPosionButtonTemplate" enableMouse="true" inherits="SecureActionButtonTemplate, ActionButtonTemplate" virtual="true">
		<Size>
			<AbsDimension x="30" y="30"/>
		</Size>
		<Scripts>
			<OnLoad>
				AspectPosionButton_OnLoad(self);
			</OnLoad>
			<OnEnter>
				AspectPosionButton_OnEnter(self);				
			</OnEnter>
			<OnEvent>
				AspectPosionButton_OnEvent(self,event,...);				
			</OnEvent>
			<PostClick>
				AspectPosionButton_PostClick(self);
			</PostClick>
			<OnLeave function="GameTooltip_Hide"/>
		</Scripts>
	</CheckButton>
	<Frame name="AspectPosionBar" movable="true" parent="UIParent" enableMouse="true" hidden="false">
		<Size>
			<AbsDimension x="29" y="32"/>
		</Size>
		<Anchors>
			<Anchor point="BOTTOMLEFT" relativeTo="MainMenuBar" relativePoint="TOPLEFT">
				<Offset>
					<AbsDimension x="30" y="0"/>
				</Offset>
			</Anchor>
		</Anchors>
		<Layers>
			<Layer level="BACKGROUND">
				<Texture name="$parentLeft" file="Interface\ShapeshiftBar\ShapeshiftBar">
					<Size x="47" y="38"/>
					<Anchors>
						<Anchor point="BOTTOMLEFT"/>
					</Anchors>
					<TexCoords left="0" right="0.734375" top="0" bottom="0.296875"/>
				</Texture>
				<Texture name="$parentMiddle" file="Interface\ShapeshiftBar\ShapeshiftBarMiddle">
					<Size x="37" y="38"/>
					<Anchors>
						<Anchor point="LEFT" relativeTo="ShapeshiftBarLeft" relativePoint="RIGHT"/>
					</Anchors>
					<TexCoords left="0" right="2" top="0" bottom="1"/>
				</Texture>
			</Layer>
			<Layer level="BORDER">		
				<Texture name="$parentRight" file="Interface\ShapeshiftBar\ShapeshiftBar">
					<Size x="43" y="38"/>
					<Anchors>
						<Anchor point="LEFT" relativeTo="ShapeshiftBarMiddle" relativePoint="RIGHT"/>
					</Anchors>
					<TexCoords left="0.328125" right="1" top="0.3125" bottom="0.6015625"/>
				</Texture>				
			</Layer>
		</Layers>
		<Frames>
		
			<Button name="$parentTab" frameStrata="HIGH" hidden="false" alpha="0.4">
				<Size>
					<AbsDimension x="16" y="50"/>
				</Size>
				<Layers>
					<Layer level="BACKGROUND">
						<Texture name="$parentTexture" file="Interface\Addons\AspectPosionBar\MOGUBarTab">
							<Size>
								<AbsDimension x="16" y="50"/>
							</Size>
						</Texture>
				</Layer>
				</Layers>
				<Anchors>
					<Anchor point="LEFT">
						<Offset>
							<AbsDimension x="-5" y="2"/>
						</Offset>
					</Anchor>
				</Anchors>
				<Scripts>
					<!-- <OnMouseDown>
						if (not self.isMoving) then
							self:GetParent():StartMoving();
							self.isMoving = true;							
						end
					</OnMouseDown>
					<OnMouseUp>
						if (self.ismoving) then
							self.ismoving = false;				
							self:GetParent():StopMovingOrSizing();
							AspectPosionBar_Jieguan(true);

						end
					</OnMouseUp> -->
					<OnEnter>
						GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
						GameTooltip:ClearLines()
						GameTooltip:AddLine("点击拖动位置")
						GameTooltip:Show()
					</OnEnter>
					<OnLeave>
						GameTooltip:Hide()
					</OnLeave>
					 <OnMouseDown>
						self:GetParent():StartMoving()
					</OnMouseDown>
					<OnMouseUp>
						self:GetParent():StopMovingOrSizing()
						AspectPosionBarDB.a, _, AspectPosionBarDB.a, AspectPosionBarDB.x, AspectPosionBarDB.y=self:GetParent():GetPoint()
					</OnMouseUp> 
				</Scripts>
				<HighlightTexture file="Interface\Addons\MoguBar\MOGUBarTabHighlight" alphaMode="ADD"/>
			</Button>
			
			<CheckButton name="$parentButton1" inherits="AspectPosionButtonTemplate" id="1">
				<Anchors>
					<Anchor point="BOTTOMLEFT">
						<Offset>
							<AbsDimension x="10" y="3"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton2" inherits="AspectPosionButtonTemplate" id="2">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton1" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="8" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton3" inherits="AspectPosionButtonTemplate" id="3">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton2" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton4" inherits="AspectPosionButtonTemplate" id="4">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton3" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton5" inherits="AspectPosionButtonTemplate" id="5">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton4" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton6" inherits="AspectPosionButtonTemplate" id="6">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton5" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton7" inherits="AspectPosionButtonTemplate" id="7">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton6" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton8" inherits="AspectPosionButtonTemplate" id="8">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton7" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton9" inherits="AspectPosionButtonTemplate" id="9">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton8" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
			<CheckButton name="$parentButton10" inherits="AspectPosionButtonTemplate" id="10">
				<Anchors>
					<Anchor point="LEFT" relativeTo="$parentButton9" relativePoint="RIGHT">
						<Offset>
							<AbsDimension x="7" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
			</CheckButton>
		</Frames>
		<Scripts>
			<OnLoad>
				AspectPosionBar_OnLoad(self);
			</OnLoad>
			<OnEvent>
				AspectPosionBar_OnEvent(self, event, arg1);
			</OnEvent>
			<OnShow>
				AspectPosionBar_OnShow(self);
			</OnShow>
			<OnHide>
				AspectPosionBar_OnHide(self);
			</OnHide>
		</Scripts>
	</Frame>
</Ui>
It's sorry that the addon olny can be use in zhCN or zhTW local ,and my English is very poor.

Last edited by cakhuang2 : 09-06-11 at 07:57 PM.
  Reply With Quote
09-06-11, 03:30 AM   #2
Nibelheim
local roygbi-
 
Nibelheim's Avatar
AddOn Author - Click to view addons
Join Date: Jan 2010
Posts: 1,600
Originally Posted by cakhuang2 View Post
While I falling down for Vehicle in combat ,it will call sevel errors like that.
But I dont know how to solve them.
Problem is caused by AspectPoisonBar trying to show a secure-frame during combat. Only way to solve is to change AspectPoisonBar's code to only show secure frames out-of-combat.
  Reply With Quote
09-06-11, 03:50 AM   #3
cakhuang2
A Murloc Raider
Join Date: Sep 2011
Posts: 5
Originally Posted by Nibelheim View Post
Problem is caused by AspectPoisonBar trying to show a secure-frame during combat. Only way to solve is to change AspectPoisonBar's code to only show secure frames out-of-combat.
But this Addon have no action about "'PossessButton1" ,and the function named "SecureCall" make sure all the secure-frame will be show or hide or setpoint out-of-combat.
  Reply With Quote
09-06-11, 04:10 AM   #4
Nibelheim
local roygbi-
 
Nibelheim's Avatar
AddOn Author - Click to view addons
Join Date: Jan 2010
Posts: 1,600
Originally Posted by cakhuang2 View Post
But this Addon have no action about "'PossessButton1" ,and the function named "SecureCall" make sure all the secure-frame will be show or hide or setpoint out-of-combat.
In that case, it's probably Ace-inherited taint. An Ace component is triggering the taint, and that gets attributed to the addon that loaded that library (AspectPoisonBar being low on the alphabetical order list, probably loaded the library first). Gonna have to find the original addon responsible.
  Reply With Quote
09-06-11, 05:09 PM   #5
Phanx
Cat.
 
Phanx's Avatar
AddOn Author - Click to view addons
Join Date: Mar 2006
Posts: 5,617
Does the error still occur when AspectPoisonBar is the only addon enabled (all other addons are disabled at the character selection screen)? If it does not, then the problem is caused by some other addon, as Nibelheim suggested.

However, an addon doesn't have to call a function directly to taint it. It's entirely possible that your addon (I did not read through the code) is doing something else that indirectly taints PossessButton1, and then when the default UI tries to show that button, some part of the code path is no longer secure, and the action fails.

Also, your code will be much easier to read if you use [ CODE ] tags instead of [ QUOTE ] tags around it.
  Reply With Quote
09-06-11, 07:34 PM   #6
cakhuang2
A Murloc Raider
Join Date: Sep 2011
Posts: 5
Originally Posted by Nibelheim View Post
In that case, it's probably Ace-inherited taint. An Ace component is triggering the taint, and that gets attributed to the addon that loaded that library (AspectPoisonBar being low on the alphabetical order list, probably loaded the library first). Gonna have to find the original addon responsible.
AspectPoisonBar is marked as LoadOnDemand:1 ,It's loaded at the time of VARIABLES_LOADED.I'm sure that the library is loaded by other addon.
  Reply With Quote
09-06-11, 07:52 PM   #7
cakhuang2
A Murloc Raider
Join Date: Sep 2011
Posts: 5
Originally Posted by Phanx View Post
However, an addon doesn't have to call a function directly to taint it. It's entirely possible that your addon (I did not read through the code) is doing something else that indirectly taints PossessButton1, and then when the default UI tries to show that button, some part of the code path is no longer secure, and the action fails.
Thanks, I change the code type using of [code] now.
When I disable AspectPoisonBar the error disappear. I read through the code for many times,buy cann't find where have changed the default UI things.
  Reply With Quote
09-08-11, 01:11 AM   #8
cakhuang2
A Murloc Raider
Join Date: Sep 2011
Posts: 5
Finally I find out the error.
The addon use code "ShapeshiftBarFrame.Show=function() end " to let the ShapeshiftBarFrame never be shown. It causes taints.
  Reply With Quote

WoWInterface » Developer Discussions » General Authoring Discussion » The error aboult "ADDON_ACTION_BLOCKED"


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off