--[[ Enigma Auto Equip http://luodan.com Quickly swap/define your suites with one click. Code inspired by Bigfoot autoequip, but totally re-wrote. Thanks to Bigfoot staff. History 2005.09.13 Version 1.0.1 * Localization string adjusted. 2005.09.07 Version 1.0 * Initial release. 2007-9-12 update 1.1.1 by Bryan ]] -- Consts EAE_Version = "1.1.1"; EAE_Slots = { "HeadSlot", "NeckSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "Finger0Slot", "Finger1Slot", "Trinket0Slot", "Trinket1Slot", "MainHandSlot", "SecondaryHandSlot", "RangedSlot", "AmmoSlot", } EAE_Attach_X = 100 EAE_Attach_Y = 6 EAE_Lock = true; StaticPopupDialogs["EAE_SAVE"] = { text = EAE_SAVE_CONFIRM, button1 = TEXT(YES), button2 = TEXT(NO), OnAccept = function() EAE_SavePlayerEquipSet(EAE_GetCurrentSetId()) end, OnCancel = function(arg1) end, showAlert = 1, timeout = 0, } StaticPopupDialogs["EAE_NULL"] = { text = EAE_NULL_CONFIRM, button1 = TEXT(YES), button2 = TEXT(NO), OnAccept = function() EAE_Reset() end, OnCancel = function(arg1) end, showAlert = 1, timeout = 0, } local function to_string(str) if str ~= nil then if type(str) == "table" then return ""; elseif type(str) == "function" then return ""; else return tostring(str) end else return "" end end local function debug_print(txt) local _, class = UnitClass("player") local color = RAID_CLASS_COLORS[class].colorStr if (DEFAULT_CHAT_FRAME) then DEFAULT_CHAT_FRAME:AddMessage("|cffffd200E|c" .. color .. "AE|r - " .. txt) end end local function EAE_GameTooltip_AddNewbieTip(normalText, r, g, b, newbieText, noNormalText) if (newbieText ~= nil) then GameTooltip_SetDefaultAnchor(GameTooltip, this); if (normalText) then GameTooltip:SetText(normalText, r, g, b); GameTooltip:AddLine(newbieText, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1); else GameTooltip:SetText(newbieText, r, g, b, 1, 1); end GameTooltip:Show(); else if (not noNormalText) then GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(normalText, r, g, b); end end end local function getPlayerFrame() if LUFUnitplayer then return LUFUnitplayer elseif pfUI and pfUI.uf and pfUI.uf.player then return pfUI.uf.player else return PlayerFrame end end function EAE_Display_EAE_Frame_Info() local frame = EAE_Frame; if (frame) then local left, top, right, bottom = frame:GetLeft(), frame:GetTop(), frame:GetRight(), frame:GetBottom(); local str = format("x = %d, y = %d, w = %d, h = %d", left, top, (right - left), (top - bottom)); debug_print("EAE_Frame:Rect(): "..str); local playerFrame = getPlayerFrame() left, top, right, bottom = playerFrame:GetLeft(), playerFrame:GetTop(), playerFrame:GetRight(), playerFrame:GetBottom(); str = format("x = %d, y = %d, w = %d, h = %d", left, top, (right - left), (top - bottom)); debug_print("PlayerFrame:Rect(): "..str); debug_print("EAE_Frame:IsMovable(): "..to_string(frame:IsMovable())); debug_print("EAE_Frame:EnableMouse(): "..to_string(frame:IsMouseEnabled())); --[[ local nums = frame:GetNumPoints(); for n = 1, nums do local pts = { frame:GetPoint(n); } debug_print("EAE_Frame:GetPoint(): n = "..n) for i, v in ipairs(pts) do if type(v) == "table" then debug_print("["..i.."] = "..to_string(v:GetName())); elseif type(v) == "function" then if v == UIParent then debug_print("["..i.."] = UIParent"); else debug_print("["..i.."] = Unknown"); end else debug_print("["..i.."] = "..to_string(v)); end end end --]] end end function EAE_CheckNeedAttachToPlayerFrame(frame) local diffuseX, minDiffuseY, maxDiffuseY = 10, -20, 2; local playerFrame = getPlayerFrame() if playerFrame ~= nil then local deltaX, deltaY; local left, top = frame:GetLeft(), frame:GetTop(); local pleft, ptop = playerFrame:GetLeft(), playerFrame:GetTop(); deltaX = left - pleft; deltaY = top - ptop; -- debug_print("deltaX = "..deltaX..", deltaY = "..deltaY); if deltaX > (EAE_Attach_X - diffuseX) and deltaX < (EAE_Attach_X + diffuseX) then if deltaY > (EAE_Attach_Y + minDiffuseY) and deltaY < (EAE_Attach_Y + maxDiffuseY) then -- debug_print("EAE_Frame - AttachToPlayerFrame = true"); frame:ClearAllPoints(); frame:SetPoint("TOPLEFT", playerFrame, "TOPLEFT", EAE_Attach_X, EAE_Attach_Y); end end end end -- Events handlers function EAE_OnLoad() -- Register events this:RegisterEvent("ADDON_LOADED"); this:RegisterEvent("PLAYER_ENTERING_WORLD"); -- Init data if (not EAE_Config) then EAE_Config = {}; end; EAE_RealmName = GetCVar("realmName"); if (not EAE_RealmName) then EAE_RealmName = "Enigma"; end; EAE_PlayerName = UnitName("player"); if (not EAE_PlayerName) then EAE_PlayerName = "Unknown"; end; EAE_PlayerId = EAE_PlayerName .. "@" .. EAE_RealmName; SLASH_EAE1 = "/eae"; SlashCmdList["EAE"] = EAE_Command; end function EAE_OnEvent(event) if (event == "ADDON_LOADED" and arg1 == "EN_AutoEquip") then setId = EAE_GetCurrentSetId(); if (not setId or setId == 0) then --[[ EAE_SetCurrentSetId(1); EAE_SavePlayerEquipSet(1); EAE_FrameSetButton1:SetChecked(1); ]] else --not auto changes -- EAE_LoadPlayerEquipSet(setId, 0); local objSetButton = getglobal("EAE_FrameSetButton" .. setId); if (objSetButton) then objSetButton:SetChecked(1); end; end; --Change Texture if (EUF_Options) then EAE_FrameTexture:SetTexture("Interface\\AddOns\\EN_AutoEquip\\EN_AutoEquip"); end -- 解锁窗口, 使其默认可以移动 if (EAE_Frame) then EAE_Frame:SetMovable(true); EAE_Frame:EnableMouse(true); end EAE_Lock = false; --EAE_Display_EAE_Frame_Info(); elseif (event == "PLAYER_ENTERING_WORLD") then --debug_print("event == 'PLAYER_ENTERING_WORLD'"); -- 判断是否需要依附在 PlayerFrame 框体上 if (EAE_Frame) then if LUFUnitplayer then EAE_Attach_X = 0 EAE_Attach_Y = 24 EAE_Frame:SetParent(LUFUnitplayer) EAE_Frame:Show() elseif pfUI and pfUI.uf and pfUI.uf.player then EAE_Attach_X = 0 EAE_Attach_Y = 24 EAE_Frame:SetParent(pfUI.uf.player) EAE_Frame:Show() end EAE_CheckNeedAttachToPlayerFrame(EAE_Frame); end end end function EAE_SetButton_OnClick(setId) if (CursorHasItem() or UnitIsDeadOrGhost("player")) then return; end if (setId == 1) then EAE_FrameSetButton1:SetChecked(1); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(nil); EAE_FrameNakedButton:SetChecked(nil); NakedObj.Nakie = false; elseif (setId == 2) then EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(1); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(nil); EAE_FrameNakedButton:SetChecked(nil); NakedObj.Nakie = false; elseif (setId == 3) then EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(1); EAE_FrameSetButton4:SetChecked(nil); EAE_FrameNakedButton:SetChecked(nil); NakedObj.Nakie = false; elseif (setId == 4) then EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(1); EAE_FrameNakedButton:SetChecked(nil); NakedObj.Nakie = false; elseif (setId == 5) then local id = EAE_GetCurrentSetId() EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(nil); getglobal("EAE_FrameSetButton"..id):SetChecked(1); EAE_FrameNakedButton:SetChecked(nil); NakedObj.Nakie = false; else EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(nil); end -- if (setId or CursorHasItem()) then -- return -- end -- if (setId ~= EAE_GetCurrentSetId()) then if (setId ~= nil and setId > 0 and setId < 5) then EAE_LoadPlayerEquipSet(setId, 1); PlaySound("igChatEmoteButton"); end end function EAE_SaveButton_OnClick(arg1) if (not IsShiftKeyDown()) then if (arg1 == "LeftButton") then local id = EAE_GetCurrentSetId(); if (id < 1 or id > 4) then DEFAULT_CHAT_FRAME:AddMessage(BINDING_HEADER_EAE_TITLE..": "..string.format(EAE_MSG_NULL_SAVED, setId), 1, 0.75 , 0); return end StaticPopup_Show("EAE_SAVE"); elseif (arg1 == "RightButton") then StaticPopup_Show("EAE_NULL"); end end end function EAE_NakedButton_OnClick() SlashCmdList.NAKEDTOGGLE(); if (this:GetChecked()) then EAE_SetButton_OnClick() else EAE_SetButton_OnClick(5) end end function EAE_SaveButton_OnEnter() EAE_GameTooltip_AddNewbieTip(EAE_HELP_SAVE_BTN_TITLE, 1, 1, 1, EAE_HELP_SAVE_BTN_DESC); end function EAE_NakedButton_OnEnter() EAE_GameTooltip_AddNewbieTip(EAE_HELP_NAKED_BTN_TITLE, 1, 1, 1, EAE_HELP_NAKED_BTN_DESC); end function EAE_SetButton_OnEnter(arg1) EAE_GameTooltip_AddNewbieTip(string.format(EAE_HELP_SET_BTN_TITLE, arg1), 1, 1, 1, string.format(EAE_HELP_SET_BTN_DESC, arg1)); end function EAE_Reset() EAE_Config[EAE_PlayerId] = {}; EAE_SetCurrentSetId(0); EAE_FrameSetButton1:SetChecked(nil); EAE_FrameSetButton2:SetChecked(nil); EAE_FrameSetButton3:SetChecked(nil); EAE_FrameSetButton4:SetChecked(nil); end function EAE_SavePlayerEquipSet(setId) local index, value; local equipSet = EAE_GetPlayerEquipSet(setId); for index, value in pairs(EAE_Slots) do local itemName, itemLinkId = EAE_GetItemInfo("inventory", value); if (itemName and itemLinkId) then equipSet[value] = {name = itemName, link = itemLinkId}; else equipSet[value] = {name = nil, link = nil}; end end DEFAULT_CHAT_FRAME:AddMessage(BINDING_HEADER_EAE_TITLE..": "..string.format(EAE_MSG_SET_SAVED, setId), 1, 0.75 , 0); end function EAE_LoadPlayerEquipSet(setId, showMsg) EAE_GetPlayerItems() local equipSet = EAE_GetPlayerEquipSet(setId) if (not equipSet) then EAE_SetCurrentSetId(setId); return end EAE_LoadSet = {} EAE_LoadSetFirst = {} if (showMsg == 1) then DEFAULT_CHAT_FRAME:AddMessage(BINDING_HEADER_EAE_TITLE..": "..string.format(EAE_MSG_LOAD_SET, setId), 1, 0.75 , 0); end local slotName, itemData local UnequipItems = {}; for slotName, itemData in pairs(equipSet) do if (itemData.link) then local srcSlot = EAE_PlayerItems[itemData.link] if (srcSlot) then local dstSlot = {} dstSlot.type = "inventory"; dstSlot.slotId = GetInventorySlotInfo(slotName); if (EAE_MustPickUp(srcSlot, dstSlot, setId)) then if (srcSlot.type == "inventory") then local index, s, b for index,s in pairs(EAE_LoadSetFirst) do if (EAE_IsSlotEqual(dstSlot, s.srcSlot)) then table.remove(EAE_LoadSetFirst, index) EAE_SaveItemPareToLoadSet(srcSlot, dstSlot, 1) b = true; break; end end if (not b) then EAE_SaveItemPareToLoadSet(srcSlot, dstSlot, 0) end elseif (EAE_IfExist(srcSlot)) then local srcSlot2 = EAE_PlayerItems[itemData.link..":2"]; if (srcSlot2) then if (srcSlot2.type == "inventory") then if (not EAE_IsSlotEqual(srcSlot2, dstSlot)) then EAE_SaveItemPareToLoadSet(srcSlot2, dstSlot, 0) end else EAE_SaveItemPareToLoadSet(srcSlot2, dstSlot, 1) end else EAE_SaveItemPareToLoadSet(srcSlot, dstSlot, 1) end else EAE_SaveItemPareToLoadSet(srcSlot, dstSlot, 1) end end else if (showMsg == 1) then DEFAULT_CHAT_FRAME:AddMessage(string.format(EAE_MSG_ITEM_NOTEXISTS, itemData.name), 1, 0.75, 0); end; end elseif (slotName ~= "AmmoSlot" and GetInventorySlotInfo(slotName)) then local dstSlot = {} dstSlot.type = "inventory"; dstSlot.slotId = GetInventorySlotInfo(slotName); table.insert(UnequipItems, dstSlot); end end if (EAE_IsLoadSetLocked() and showMsg == 1) then DEFAULT_CHAT_FRAME:AddMessage(EAE_MSG_ITEM_LOCKED, 1, 0.75, 0); return; end; local index, value, slotPare, slot2 EAE_GetBagEmptyNums(); for index, slotPare in pairs(EAE_LoadSetFirst) do if (TotalBagEmptyNums == 0 and showMsg == 1) then DEFAULT_CHAT_FRAME:AddMessage(EAE_MSG_BAG_FULL, 1, 0.75, 0); break; end EAE_PickUpItem(slotPare.dstSlot) if (CursorHasItem()) then for bag = 0, 4 do if (BagEmptyNums[bag] > 0) then if (bag == 0) then PutItemInBackpack(); else PutItemInBag(19+bag); end BagEmptyNums[bag] = BagEmptyNums[bag] - 1; TotalBagEmptyNums = TotalBagEmptyNums - 1; break; end end end EAE_PickUpItem(slotPare.srcSlot) if (CursorHasItem()) then EquipCursorItem(slotPare.dstSlot.slotId-1) end end for index, slotPare in pairs(EAE_LoadSet) do EAE_PickUpItem(slotPare.srcSlot) if (CursorHasItem()) then EAE_PickUpItem(slotPare.dstSlot) end end for index, slot2 in pairs(UnequipItems) do if (TotalBagEmptyNums == 0 and showMsg == 1) then DEFAULT_CHAT_FRAME:AddMessage(EAE_MSG_BAG_FULL, 1, 0.75, 0); break; end EAE_PickUpItem(slot2) if (CursorHasItem()) then for bag = 0, 4 do if (BagEmptyNums[bag] > 0) then if (bag == 0) then PutItemInBackpack(); else PutItemInBag(19+bag); end BagEmptyNums[bag] = BagEmptyNums[bag] - 1; TotalBagEmptyNums = TotalBagEmptyNums - 1; break; end end end end EAE_PlayerItems = {}; EAE_LoadSet = {}; EAE_LoadSetFirst = {}; EAE_SetCurrentSetId(setId) end function EAE_IfExist(slot) for _,s in pairs(EAE_LoadSet) do if (EAE_IsSlotEqual(slot, s.srcSlot)) then return true; end end return false; end function EAE_GetBagEmptyNums() local bag, totalSlots, slot; BagEmptyNums = {}; TotalBagEmptyNums = 0; for bag = 0, 4 do BagEmptyNums[bag] = 0; totalSlots = GetContainerNumSlots(bag); for slot=1, totalSlots do if not GetContainerItemInfo(bag, slot) then BagEmptyNums[bag] = BagEmptyNums[bag] + 1; TotalBagEmptyNums = TotalBagEmptyNums + 1; end end end end function EAE_MustPickUp(srcSlot, dstSlot, setId) if (srcSlot.type == "container") then -- if source slot is in container, return true (from container to inventory); return 1; else if (EAE_IsSlotEqual(srcSlot, dstSlot)) then -- if source slot equals to destination slot, return false (no pickup needed); return; end return 1; end end function EAE_GetSetItemInventorySlot(itemLinkId, setId) -- Return a set item's inventory location (where to equip this set item). local equipSet = EAE_GetPlayerEquipSet(setId); if (not equipSet) then return; end local slotName, itemData; for slotName, itemData in equipSet do if (itemData.link == itemLinkId) then local slot = {}; slot.type = "inventory"; slot.slotId = GetInventorySlotInfo(slotName); return slot; end end end -- Base Functions function EAE_SaveItemPareToLoadSet(srceLoc, destLoc, flag) local index, value, TempLoadSet if (flag == 0) then TempLoadSet = EAE_LoadSetFirst; else TempLoadSet = EAE_LoadSet; end -- Check if they are already in load set for index, itemPare in pairs(TempLoadSet) do if (EAE_IsSlotEqual(itemPare.srcSlot, srceLoc) and EAE_IsSlotEqual(itemPare.dstSlot, destLoc)) then return; end if (EAE_IsSlotEqual(itemPare.srcSlot, destLoc) and EAE_IsSlotEqual(itemPare.dstSlot, srceLoc)) then return; end end local itemPare = {} itemPare.srcSlot = srceLoc; itemPare.dstSlot = destLoc; table.insert(TempLoadSet, itemPare); end function EAE_IsSlotEqual(slot1, slot2) return (slot1.type == slot2.type and slot1.bagId == slot2.bagId and slot1.slotId == slot2.slotId) end function EAE_IsSlotItemLocked(slot) if (slot.type == "container") then local _, _, isLocked, _, _ = GetContainerItemInfo(slot.bagId, slot.slotId); return isLocked; elseif (slot.type == "inventory") then return IsInventoryItemLocked(slot.slotId); end end function EAE_IsLoadSetLocked() local index, itemPare for index, itemPare in pairs(EAE_LoadSet) do if (EAE_IsSlotItemLocked(itemPare.srcSlot) or EAE_IsSlotItemLocked(itemPare.dstSlot)) then return 1; end end end function EAE_PickUpItem(slot) if (slot.type == "container") then PickupContainerItem(slot.bagId, slot.slotId) elseif (slot.type == "inventory") then PickupInventoryItem(slot.slotId) end end function EAE_GetPlayerItems() -- Generate a dataset, index is item linkid, value is item's slotinfo EAE_PlayerItems = {}; local bagIndex; for bagIndex = 0, NUM_CONTAINER_FRAMES, 1 do local slotIndex; for slotIndex = 1, GetContainerNumSlots(bagIndex), 1 do local itemName, itemLinkId = EAE_GetItemInfo("container", bagIndex, slotIndex); if (itemName and itemLinkId) then local slot = {}; slot.type = "container"; slot.bagId = bagIndex; slot.slotId = slotIndex; if (EAE_PlayerItems[itemLinkId]) then EAE_PlayerItems[itemLinkId..":2"] = slot; else EAE_PlayerItems[itemLinkId] = slot; end end; end; end; local index, value; for index, slotName in pairs(EAE_Slots) do local itemName, itemLinkId = EAE_GetItemInfo("inventory", slotName); if (itemName and itemLinkId) then local slot = {}; slot.type = "inventory"; slot.slotId = GetInventorySlotInfo(slotName); if (EAE_PlayerItems[itemLinkId]) then EAE_PlayerItems[itemLinkId..":2"] = slot; else EAE_PlayerItems[itemLinkId] = slot; end end; end; end; function EAE_GetPlayerEquipSet(setId) local numSetId = tonumber(setId) if (not numSetId) then return end if (not EAE_Config[EAE_PlayerId][numSetId]) then EAE_Config[EAE_PlayerId][numSetId] = {} end return EAE_Config[EAE_PlayerId][numSetId] end function EAE_GetCurrentSetId() if (not EAE_Config[EAE_PlayerId]) then EAE_Config[EAE_PlayerId] = {}; end; if (not EAE_Config[EAE_PlayerId].CurrentSetId) then EAE_Config[EAE_PlayerId].CurrentSetId = 0; end; return EAE_Config[EAE_PlayerId].CurrentSetId; end; function EAE_SetCurrentSetId(setId) if (not EAE_Config[EAE_PlayerId]) then EAE_Config[EAE_PlayerId] = {}; end; EAE_Config[EAE_PlayerId].CurrentSetId = setId; end; -- Framework Functions function EAE_GetInventoryItemLinkId(slotId) local itemLink = GetInventoryItemLink("player", slotId); local itemName, itemLinkId = EAE_GetItemInfoByLink(itemLink); return itemLinkId; end function EAE_GetItemInfoByLink(itemLink) if (not itemLink or type(itemLink) ~= "string") then return; end local _, _, itemLinkId, itemName = string.find(itemLink, "^|c%x+|H(.+)|h%[(.+)%]"); if (itemLinkId and itemName) then return itemName, itemLinkId; end end function EAE_GetItemInfo(itemType, arg1, arg2) if (itemType == "container") then --arg1, 2 for bagId, slotId local itemLink = GetContainerItemLink(arg1, arg2) return EAE_GetItemInfoByLink(itemLink) elseif (itemType == "inventory") then --arg1 for slotName local itemLink = GetInventoryItemLink("player", GetInventorySlotInfo(arg1)) return EAE_GetItemInfoByLink(itemLink) end end function EAE_DEBUG(arg1,arg2) local msg = ""; if (arg1) then msg = msg .. arg1; end; if (arg2) then msg = msg .. "=" .. arg2; end; DEFAULT_CHAT_FRAME:AddMessage(msg); end; function EAE_Command(cmd) if (cmd == "lock") then EAE_Frame:SetMovable(false); EAE_Frame:EnableMouse(false); EAE_Lock = true; DEFAULT_CHAT_FRAME:AddMessage("EN_AutoEquip 窗口已锁定"); elseif (cmd == "unlock") then EAE_Frame:SetMovable(true); EAE_Frame:EnableMouse(true); EAE_Lock = false; DEFAULT_CHAT_FRAME:AddMessage("EN_AutoEquip 窗口已解锁"); else DEFAULT_CHAT_FRAME:AddMessage("Usage /eae [lock][unlock]"); end end function EAE_SaveButton_OnDragStart(button) local frame = EAE_Frame; if (frame) then --debug_print("button = "..to_string(button)) if ((button == "LeftButton") and IsShiftKeyDown() and (EAE_Lock == false)) then frame.isMoving = true; frame:ClearAllPoints(); frame:StartMoving(); end end end function EAE_SaveButton_OnDragStop(button) local frame = EAE_Frame; if (frame and frame.isMoving) then frame:StopMovingOrSizing(); frame.isMoving = false; if (IsShiftKeyDown() and (EAE_Lock == false)) then --EAE_Display_EAE_Frame_Info(); EAE_CheckNeedAttachToPlayerFrame(frame); end end end function EAE_SaveButton_OnHide() local frame = EAE_Frame; if (frame and frame.isMoving) then frame:StopMovingOrSizing(); frame.isMoving = false; end end function EAE_MouseDown(button) if (EAE_Lock == false and (button == "LeftButton")) then this.isMoving = true; this:StartMoving(); end end function EAE_MouseUp() if (this.isMoving) then this:StopMovingOrSizing(); this.isMoving = false; end end function EAE_OnShow() -- end function EAE_OnHide() if (this.isMoving) then this:StopMovingOrSizing(); this.isMoving = false; end end