⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gatherer.lua

📁 时间太紧了
💻 LUA
📖 第 1 页 / 共 5 页
字号:

	-- Enable/Disable event processing for zoning
	if (event == "PLAYER_ENTERING_WORLD" ) then
		this:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF"); -- standard gathering event
		this:RegisterEvent("UI_ERROR_MESSAGE"); -- event added for impossible to gather item
		this:RegisterEvent("CHAT_MSG_LOOT"); -- event added for fishing node
		Gatherer_InWorld = true;
	
	elseif (event == "PLAYER_LEAVING_WORLD" ) then
		this:UnregisterEvent("CHAT_MSG_SPELL_SELF_BUFF"); -- standard gathering event
		this:UnregisterEvent("UI_ERROR_MESSAGE"); -- event added for impossible to gather item
		this:UnregisterEvent("CHAT_MSG_LOOT"); -- event added for fishing node
		Gatherer_InWorld = false;
	
	-- process loot received message for fishing node trigger
	elseif (strfind(event, "CHAT_MSG_LOOT")) then
		local _, _, fishItem = string.find(arg1, GATHERER_ReceivesLoot );
		local gfishTooltip = Gatherer_ExtractItemFromTooltip()

		if ( fishItem and not UnitExists("mouseover") ) then
			Gatherer_ReadBuff(event, fishItem, gfishTooltip);
		end
	-- process event to record, normally not possible gather (low/inexistant skill)
	elseif (strfind(event, "UI_ERROR_MESSAGE")) then
		-- process gather error message
		-- need to be in standard gather range to get the correct message to process.
		if (arg1 and
		    (strfind(arg1, GATHERER_REQUIRE.." "..OLD_TRADE_HERBALISM) or strfind(arg1, GATHERER_NOSKILL.." "..OLD_TRADE_HERBALISM) or
		     strfind(arg1, GATHERER_REQUIRE.." "..TRADE_MINING) or strfind(arg1, GATHERER_NOSKILL.." "..TRADE_MINING))) then
			Gatherer_ReadBuff(event);
		end
	-- process chatmessages
	elseif (strfind(event, "CHAT_MSG")) then
		Gatherer_ReadBuff(event);

	-- process tooltips text for 1.12
	elseif (strfind(event, "SPELLCAST_START")) then
	--	ChatFrame1:AddMessage("DEBUG |cffffffffEvent :|r "..event.." => "..arg1);
		
		if ( arg1 and (arg1 == GATHER_HERBALISM or arg1 == TRADE_MINING or arg1 == TRADE_OPENING or arg1 =="") ) then

			Gatherer_currentNode = GameTooltipTextLeft1:GetText();
			Gatherer_currentAction = arg1;
	--	ChatFrame1:AddMessage("DEBUG |cffffffffarg1 :|r "..GATHER_HERBALISM.."and "..TRADE_OPENING);
--ChatFrame1:AddMessage("DEBUG Current node: "..Gatherer_currentNode);
			Gatherer_RecordFlag=1;
		end
	elseif (strfind(event, "SPELLCAST_STOP") and Gatherer_RecordFlag==1) then
		Gatherer_ReadBuff(event);
		Gatherer_currentNode=nil;
	elseif (strfind(event, "SPELLCAST_STOP") and Gatherer_RecordFlag==0) then
		Gatherer_currentNode=nil;
		Gatherer_RecordFlag = 0;
	    
	elseif (strfind(event, "SPELLCAST_FAILED")) then
		Gatherer_RecordFlag = 0;

	elseif (event == "WORLD_MAP_UPDATE") then
		if (WorldMapFrame:IsVisible()) then
			local serverTime = GetTime();
			if (GatherConfig.mapMinder == true and Gatherer_MapOpen == false) then 
				-- Enhancement to open to last opened map if we were there less than a minute ago
				-- Otherwise, go to the player's current position
				local startContinent, startZone;
				if (Gatherer_CloseMap and (serverTime - Gatherer_CloseMap.time < GatherConfig.minderTime)) then
					startContinent = Gatherer_CloseMap.continent;
					startZone = Gatherer_CloseMap.zone;
				else
					startContinent, startZone = Gatherer_GetCurrentZone();
				end

				Gatherer_MapOpen = true;
				if ( GetCurrentMapContinent()>0 and startZone and startZone > 0 ) then 
					SetMapZoom(startContinent, startZone);
				end
			end
			Gatherer_MapOpen = true;
			local mapContinent = GetCurrentMapContinent();
			local mapZone = GetCurrentMapZone();
			Gatherer_CloseMap = { continent = mapContinent, zone = mapZone, time = GetTime() };
			GatherMain_Draw();
		elseif (Gatherer_MapOpen) then
			Gatherer_MapOpen = false;
			Gatherer_ChangeMap();
			GatherMain_Draw();
		end
	elseif ( event == "CLOSE_WORLD_MAP") then
		-- never called apparently
		Gatherer_MapOpen = false;

		Gatherer_ChangeMap()
		GatherMain_Draw();
	elseif( event == "ADDON_LOADED") then
		if ( myAddOnsFrame_Register ) then
			-- myAddons Support
			GathererDetails["name"] = "Gatherer";
			GathererDetails["version"] = GATHERER_VERSION;
			GathererDetails["author"] = "Norganna";
			GathererDetails["website"] = "http://gathereraddon.com";
			GathererDetails["category"] = MYADDONS_CATEGORY_PROFESSIONS;
			GathererDetails["frame"] = "Gatherer";
			GathererDetails["optionsframe"] = "GathererUI_DialogFrame";

			-- Register the addon in myAddOns
			if(myAddOnsFrame_Register) then
				myAddOnsFrame_Register(GathererDetails, GathererHelp);
			end
		end
		
		if (arg1 and string.lower(arg1) == "gatherer") then
			GATHERER_LOADED = true;
			Gatherer_OnUpdate(0, true);

			Gatherer_Print("Gatherer v"..GATHERER_VERSION.." -- Loaded!");
			GatherConfig.useMinimap = GatherConfig.useMinimap or true;
			GatherConfig.useMainmap = GatherConfig.useMainmap or true;

			if (GatherConfig.useMainmap == true) then
				Gatherer_WorldMapDisplay:SetText("Hide Items");
			else
				Gatherer_WorldMapDisplay:SetText("Show Items");
			end
			GatherConfig.iconSet = GatherConfig.iconSet or "shaded";
			GatherConfig.number = GatherConfig.number or 10;
			GatherConfig.maxDist = GatherConfig.maxDist or 20;
			GatherConfig.fadeDist = GatherConfig.fadeDist or 40;
			GatherConfig.fadePerc = GatherConfig.fadePerc or 80;
			GatherConfig.miniIconDist = GatherConfig.miniIconDist or 40;
			GatherConfig.minderTime = GatherConfig.minderTime or 5;
			GatherConfig.rareOre = GatherConfig.rareOre or 0;
			GatherConfig.logInfo = GatherConfig.logInfo or "on";
			if (not GatherConfig.mapMinder) then GatherConfig.mapMinder = false; end;

			if (not GatherConfig.users) then
				GatherConfig.users = {};
			end
			
			if (not Gather_Player) then Gather_Player = playerName; end
			if (not GatherConfig.users ) then GatherConfig.users = {}; end;
			if (not GatherConfig.users[Gather_Player]) then GatherConfig.users[Gather_Player] = {}; end
			
			if (not GatherConfig.users[Gather_Player].filterRecording ) then
				GatherConfig.users[Gather_Player].filterRecording = {};
			end
			
			-- Warning at logon on Gatherer Version number change to check for localization zone change (commented, not needed in 1.12)
			--if ( GetLocale() == "deDE" and (not GatherConfig.Version or (GatherConfig.Version and GatherConfig.Version ~= GATHERER_VERSION ))) then
			--	StaticPopup_Show("GATHERER_VERSION_DIALOG");
			--end
			
			-- record current version number in order to identify the data for backup utilities
			GatherConfig.Version = GATHERER_VERSION;

			-- Get values for World Map once for all
			Gatherer_WorldMapDetailFrameWidth = WorldMapDetailFrame:GetWidth();
			Gatherer_WorldMapDetailFrameHeight = WorldMapDetailFrame:GetHeight();
			Gatherer_WorldMapPlayerFrameLevel = WorldMapPlayer:GetFrameLevel();
			
			-- New backup format allows the user to permenantly save their data
			-- in an automatically restoring file "GatherBase.lua"
			-- All data in this file will be loaded "under" the saved data every
			-- time the addon loads so that in the event of a savedVariables wipe
			-- the next time they run WoW, their data will be back to the last
			-- backed up point. (This utility will appear in a later version of
			-- Gatherer as a Java applet)
			if (GatherItemBase ~= nil) then
				for c, cd in GatherItems do
					for z, zd in cd do
						for n,nd in zd do
							for i,id in nd do
								local matched = 0;
								local max = 0;
								for j,jd in GatherItemBase[c][z][n] do
									if (math.abs(id.x- jd.y) < 0.05) then
										matched = j;
									end
									max = j;
								end
								if (matched > 0) then
									GatherItemBase[c][z][n][matched] = id;
								else
									GatherItemBase[c][z][n][max+1] = id;
								end
							end
						end
					end
				end
				GatherItems = GatherItemBase;
			end
		end
	elseif ( event == "PLAYER_LOGIN" ) then
		if ( GatherConfig ) then
			local useMinimap = "Off";
			if (GatherConfig.useMinimap) then useMinimap = "On"; end
			local useMainmap = "Off";
			if (GatherConfig.useMainmap) then useMainmap = "On"; end
			local mapMinder = "Off";
			if (GatherConfig.mapMinder) then mapMinder = "On"; end
			
			local minderTime = "5s";
			if (GatherConfig.minderTime) then minderTime = GatherConfig.minderTime.."s"; end
			
			if (not GathererLogInfoDisplayed and GatherConfig.logInfo and GatherConfig.logInfo == "on" ) then
				Gatherer_Print("[Player: "..Gather_Player..", Theme: "..GatherConfig.iconSet..", Mainmap: "..useMainmap..", Minimap: "..useMinimap..", MaxDist: "..GatherConfig.maxDist.." units, NoteCount: "..GatherConfig.number..", Fade: "..GatherConfig.fadePerc.."% at "..GatherConfig.fadeDist.." units, IconDist: "..GatherConfig.miniIconDist.."px on minimap, MapMinder: "..mapMinder.." ("..minderTime.."), Filters: herbs="..Gatherer_GetFilterVal("herbs")..", mining="..Gatherer_GetFilterVal("mining")..", treasure="..Gatherer_GetFilterVal("treasure").."]");
				GathererLogInfoDisplayed=true;
			end
		end
	
	elseif ( event == "LEARNED_SPELL_IN_TAB" or event == "SPELLS_CHANGED" ) then
		local numSkills = tonumber(GetNumSkillLines());
		if ( GetNumSkillLines() > 0 ) then 
			Gatherer_GetSkills();
		end
	elseif ( event == "SKILL_LINES_CHANGED" ) then
		local numSkills = tonumber(GetNumSkillLines());
		if ( GetNumSkillLines() > 0 ) then 
			Gatherer_GetSkills();
		end
	else
		Gatherer_ChatPrint("Gatherer Unknown event: "..event);
	end
end

-- *************************************************************************
-- Filter related functions

function Gatherer_SetFilter(type, value)
	if (not Gather_Player) then return; end
	if (not GatherConfig.users) then GatherConfig.users = {}; end
	if (not GatherConfig.users[Gather_Player]) then GatherConfig.users[Gather_Player] = {}; end
	if (not GatherConfig.users[Gather_Player].filters) then GatherConfig.users[Gather_Player].filters = {}; end

	GatherConfig.users[Gather_Player].filters[type] = value;
end

function Gatherer_GetFilterVal(type)
	if (not Gather_Player) then return "off"; end
	if (not GatherConfig.users) then GatherConfig.users = {}; end
	if (not GatherConfig.users[Gather_Player]) then GatherConfig.users[Gather_Player] = {}; end
	if (not GatherConfig.users[Gather_Player].filters) then GatherConfig.users[Gather_Player].filters = {}; end
	value = GatherConfig.users[Gather_Player].filters[type];
	if (not value) then return "auto"; end
	return value;
end

function Gatherer_GetFilter(filter)
	local value = Gatherer_GetFilterVal(filter);
	local filterVal = false;

	if (value == "on") then 
		filterVal = true;
	elseif (value == "off") then
		filterVal = false; 
	elseif (value == "auto") then
		if (filter == "treasure") then 
			filterVal = true; 
		end
		if (not GatherSkills) then 
			filterVal = true; 
		end
		if ((GatherSkills[filter]) and (GatherSkills[filter] > 0)) then 
			filterVal = true; 
		end
	end

	return filterVal;
end
	
function Gatherer_GetSkills()
	local GatherExpandedHeaders = {};
	local i, j;

	if ( not GatherSkills ) then GatherSkills = {}; end;
	Gatherer:UnregisterEvent("SKILL_LINES_CHANGED");

	-- search the skill tree for gathering skills
	for i=0, GetNumSkillLines(), 1 do
		local skillName, header, isExpanded, skillRank, _, _, _, _, _, _, _, _ = GetSkillLineInfo(i);

		-- expand the header if necessary
		if ( header and not isExpanded ) then 
			GatherExpandedHeaders[i] = skillName;
		end
	end

	ExpandSkillHeader(0);
	for i=1, GetNumSkillLines(), 1 do
		local skillName, header, _, skillRank, _, _, _, _, _, _, _, _ = GetSkillLineInfo(i);
		-- check for the skill name
		if (skillName and not header) then
			if (skillName == TRADE_HERBALISM) then
				GatherSkills.herbs = skillRank;
			elseif (skillName == TRADE_MINING) then
				GatherSkills.mining = skillRank;
			end
		end

		-- once we got both, no need to look the rest
		if ( GatherSkills.herbs and GatherSkills.mining ) then
			break;
		end
	end   

	-- close headers expanded during search process
	for i=0, GetNumSkillLines() do
		local skillName, header, isExpanded, _, _, _, _, _, _, _, _, _ = GetSkillLineInfo(i);
		for j in  GatherExpandedHeaders do
			if ( header and skillName == GatherExpandedHeaders[j] ) then
				CollapseSkillHeader(i);
				GatherExpandedHeaders[j] = nil;
			end
		end
	end
end

-- *************************************************************************
-- Update related functions

function Gatherer_TimeCheck(timeDelta)
	if (not GatherNotes) then
		GatherNotes = { timeDiff=0, checkDiff=0 };
	else
		GatherNotes.checkDiff = GatherNotes.checkDiff + timeDelta;
		if (GatherNotes.checkDiff > GATHERNOTE_CHECK_INTERVAL) then
			GatherNotes.checkDiff = 0;
			Gatherer_OnUpdate(0,true);
		end
	end
end

function Gatherer_OnUpdate(timeDelta, force)
	if (not GATHERER_LOADED) then
		Gatherer_Print("Gatherer not loaded");
		return; 
	end

	if (Gatherer_InWorld == false ) then
		return;
	end
	
	if (not GatherConfig.useMinimap) then
		Gatherer_HideAll();
		return;
	end
	
	local recalculate = false;
	local needsUpdate = false;
	if (not GatherNotes) then
		GatherNotes = { timeDiff=0, checkDiff=0 };
		needsUpdate = true;
	else
		GatherNotes.timeDiff = GatherNotes.timeDiff + timeDelta;
		if (GatherNotes.timeDiff > GATHERNOTE_UPDATE_INTERVAL) then
			needsUpdate = true;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -