-- Declard color codes for console messages local RED = "|cffff0000"; local GREEN = "|cff00ff00"; local BLUE = "|cff0000ff"; local MAGENTA = "|cffff00ff"; local YELLOW = "|cffffff00"; local CYAN = "|cff00ffff"; local WHITE = "|cffffffff"; local ORANGE = "|cffffba00"; ----------------------------------- -- global variables ----------------------------------- known_times = {}; activeTransitName = ""; activeSelect = 1; activeTransit = -1; ----------------------------------- -- local variables ----------------------------------- local vars_loaded = false; local update_int = 0.8; local ctime_elapse = 0; local dataChannel = "ZeppelinMaster"; local Pre_ChatFrame_OnEvent; local ZSM_version = "1.87"; local protoVersion = "1.7"; local varsVersion = 1.0; local newVerAvail = false; local known_times_session = {}; local req_timeout; local known_times_req = {}; local dropdownvalues = {}; local dropdownindex = {}; local prox = 2; local debug = false; function ZSM_OnLoad() this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("CHAT_MSG_CHANNEL"); this:RegisterEvent("ZONE_CHANGED_NEW_AREA"); this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("CHAT_MSG_CHANNEL_JOIN"); this:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE"); -- Register slash command SLASH_ZSM1 = "/zsm"; SLASH_ZSM2 = "/zm"; SlashCmdList["ZSM"] = function(msg) ZSM_SlashCommandHandler(msg); end Pre_ChatFrame_OnEvent = ChatFrame_OnEvent; ChatFrame_OnEvent = ZSM_ChatFrame_OnEvent; Pre_message = message; message = ZSM_message; --OpenMailFrame end function ZSM_message ( message ) -- Very bad way to supress popup errors, shhhh if ( string.find(message, "Too many buttons in UIDropDownMenu:") ) then --DEFAULT_CHAT_FRAME:AddMessage("Error Message intercepted: "..message); return; else return Pre_message ( message ); end end function ZSM_ChatFrame_OnEvent ( event ) if ((event == "CHAT_MSG_CHANNEL") and (string.lower(arg9) == string.lower(dataChannel))) then -- Silence if (debug) then return Pre_ChatFrame_OnEvent ( event ); end else return Pre_ChatFrame_OnEvent ( event ); end end function ZSM_OnUpdate( elapse ) if (not WorldMapFrame:IsVisible()) then SetMapZoom(0); x,y = GetPlayerMapPosition("player"); x = format("%0.3f", x); y = format("%0.3f", y); SetMapToCurrentZone(); else return; end if (req_timeout ~= nil) then req_timeout = req_timeout - elapse; if (req_timeout <= 0) then local highPlayer = {}; local highTimestamp = {}; local highTime = {}; local tmpTransTimestamps = {}; for playerName,data in known_times_req do for transport,transData in data do DEFAULT_CHAT_FRAME:AddMessage(playerName..":"..transport); --DEFAULT_CHAT_FRAME:AddMessage(highTimestamp); if (tmpTransTimestamps[transport] == nil) then highPlayer[transport] = playerName; highTimestamp[transport] = transData['timestamp']; highTime[transport] = transData['time']; elseif (tmpTransTimestamps[transport] > highTimestamp[transport]) then highPlayer[transport] = playerName; highTimestamp[transport] = transData['timestamp']; highTime[transport] = transData['time']; end end end -- Highest Timestamp wins for transport, timestamp in highTimestamp do ZSM_Data[transport] = {}; ZSM_Data[transport]['timestamp'] = highTimestamp[transport]; known_times[transport] = highTime[transport]; req_timeout = nil; known_times_req = {}; if (debug) then DEFAULT_CHAT_FRAME:AddMessage("["..highPlayer[transport].."] has most recent transport time:"..highTime[transport]..", with timestamp:".. highTimestamp[transport].." for ".. transport); end end end end ctime_elapse = ctime_elapse + elapse; if (ctime_elapse > update_int) then ctime_elapse = 0; if ((activeTransit ~= -1) and (known_times[activeTransit] ~= nil)) then local transit = activeTransit; local cycle = ZSM_CalcTripCycle(transit); local coord_data = ZSM_GetZepCoords(transit, cycle); if (tonumber(coord_data[3]) > 10) then --DEFAULT_CHAT_FRAME:AddMessage("Transit:org2gg Cyc:"..cycle_pos['org2gg']); for index, data in zsm_data[transit..'_plats'] do if ((tonumber(x) == data['x']) and (tonumber(y) == data['y'])) then local depart_time = ZSM_CalcTripCycleTime(transit,cycle) - (cycle*zsm_data[transit..'_time']) - data['adj'] ; --DEFAULT_CHAT_FRAME:AddMessage("At platform:".. data['name'].." depart time:"..depart_time); if ((depart_time < 10) and (depart_time >= 0)) then --SendChatMessage("Departure Time: ".. format("%0.0f", depart_time) .." sec.", "SAY"); end end end end for index, data in zsm_data[transit..'_plats'] do --ZSM_CalcTripCycleTime(transit,cycle) --DEFAULT_CHAT_FRAME:AddMessage(data['name']..":"..ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1)); local arrival_time = 0; if (ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1) > (cycle*zsm_data[transit..'_time'])) then arrival_time = ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1) - (cycle*zsm_data[transit..'_time']); --DEFAULT_CHAT_FRAME:AddMessage("Arrival Time of "..data['name']..": "..arrival_time .." sec."); else arrival_time = zsm_data[transit..'_time'] - (cycle*zsm_data[transit..'_time']); arrival_time = arrival_time + ZSM_CalcTripCycleTimeByIndex(transit,data['index']-1); --DEFAULT_CHAT_FRAME:AddMessage("Arrival Time of "..data['name']..": "..arrival_time .." sec."); end --DEFAULT_CHAT_FRAME:AddMessage(GetRealZoneText()); local platname; if (ZSM_Data['Opts']['CityAlias']) then platname = data['alias']; else platname = data['name']; end getglobal("ZSMFramePlat"..(index+1).."Name"):SetText(platname); local coord_data = ZSM_GetZepCoords(transit, cycle); local depart_time = ZSM_CalcTripCycleTime(transit,cycle) - (cycle*zsm_data[transit..'_time']) - data['adj']; local formated_depart_time = ""; if (depart_time > 59) then local time_min = format("%0.0f",math.floor(depart_time/60)); local time_sec = format("%0.0f",depart_time-(math.floor(depart_time/60)*60)); formated_depart_time = time_min.."m, "..time_sec.."s"; else formated_depart_time = format("%0.0f",depart_time).."s"; end local formated_arrival_time = ""; if (arrival_time > 59) then local time_min = format("%0.0f",math.floor(arrival_time/60)); local time_sec = format("%0.0f",arrival_time-(math.floor(arrival_time/60)*60)); formated_arrival_time = time_min.."m, "..time_sec.."s"; else formated_arrival_time = format("%0.0f",arrival_time).."s"; end if ((data['x'] == tonumber(coord_data[1])) and (data['y'] == tonumber(coord_data[2])) and (depart_time > 0)) then local color; if (depart_time > 30) then color = YELLOW; else color = RED; end getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText(color.."Dep: ".. formated_depart_time); else local color = GREEN; getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText(color.."Arr: ".. formated_arrival_time); end if (floor((floor(arrival_time) / 10)) == (floor(arrival_time) / 10)) then if (arrival_time < 60) then if ((floor(arrival_time) == 20) or (floor(arrival_time) == 21)) then --SendChatMessage("Want to know arrival departure times of any Zeppelin/Ship/Tram in Azeroth on GUI?","SAY"); --SendChatMessage("Visit curse-gaming.com and download addon called ZeppelinMaster :)","SAY"); else --SendChatMessage("Arrival Time in "..data['name']..": "..format("%0.0f", arrival_time) .." sec.", "SAY"); end end end end elseif ((activeTransit ~= -1) and (known_times[activeTransit] == nil)) then local transit = activeTransit; for index, data in zsm_data[transit..'_plats'] do local platname; if (ZSM_Data['Opts']['CityAlias']) then platname = data['alias']; else platname = data['name']; end getglobal("ZSMFramePlat"..(index+1).."Name"):SetText(platname); getglobal("ZSMFramePlat"..(index+1).."ArrivalDepature"):SetText("-- N/A --"); end elseif (activeTransit == -1) then for index = 1, 2 do getglobal("ZSMFramePlat"..(index).."Name"):SetText(ZSM_STR_NONESELECT); getglobal("ZSMFramePlat"..(index).."ArrivalDepature"):SetText("-- N/A --"); end end end if (ZSM_ProxyCheck(x,'0.315',prox) and ZSM_ProxyCheck(y,'0.450',prox) and (not known_times_session['org2uc'])) then ZSM_SetKnownTime(25, 'org2uc'); known_times_session['org2uc'] = true; elseif (ZSM_ProxyCheck(x,'0.725',prox) and ZSM_ProxyCheck(y,'0.227',prox) and (not known_times_session['org2uc'])) then ZSM_SetKnownTime(131, 'org2uc'); known_times_session['org2uc'] = true; elseif (ZSM_ProxyCheck(x,'0.311',prox) and ZSM_ProxyCheck(y,'0.443',prox) and (not known_times_session['org2gg'])) then ZSM_SetKnownTime(16, 'org2gg'); known_times_session['org2gg'] = true; elseif (ZSM_ProxyCheck(x,'0.717',prox) and ZSM_ProxyCheck(y,'0.759',prox) and (not known_times_session['org2gg'])) then ZSM_SetKnownTime(63, 'org2gg'); known_times_session['org2gg'] = true; elseif (ZSM_ProxyCheck(x,'0.741',prox) and ZSM_ProxyCheck(y,'0.723',prox) and (not known_times_session['grom2uc'])) then ZSM_SetKnownTime(42 ,'grom2uc'); known_times_session['grom2uc'] = true; elseif (ZSM_ProxyCheck(x,'0.711',prox) and ZSM_ProxyCheck(y,'0.747',prox) and (not known_times_session['grom2uc'])) then ZSM_SetKnownTime(118 ,'grom2uc'); known_times_session['grom2uc'] = true; elseif (ZSM_ProxyCheck(x,'0.712',prox) and ZSM_ProxyCheck(y,'0.811',prox) and (not known_times_session['ratch2bb'])) then ZSM_SetKnownTime(93, 'ratch2bb'); known_times_session['ratch2bb'] = true; elseif (ZSM_ProxyCheck(x,'0.285',prox) and ZSM_ProxyCheck(y,'0.532',prox) and (not known_times_session['ratch2bb'])) then ZSM_SetKnownTime(162, 'ratch2bb'); known_times_session['mh2bb'] = true; elseif (ZSM_ProxyCheck(x,'0.740',prox) and ZSM_ProxyCheck(y,'0.436',prox) and (not known_times_session['mh2aub'])) then ZSM_SetKnownTime(30, 'mh2aub'); known_times_session['mh2aub'] = true; elseif (ZSM_ProxyCheck(x,'0.170',prox) and ZSM_ProxyCheck(y,'0.288',prox) and (not known_times_session['mh2aub'])) then ZSM_SetKnownTime(84, 'mh2aub'); known_times_session['mh2ds'] = true; elseif (ZSM_ProxyCheck(x,'0.734',prox) and ZSM_ProxyCheck(y,'0.464',prox) and (not known_times_session['mh2thera'])) then ZSM_SetKnownTime(21, 'mh2thera'); known_times_session['mh2thera'] = true; elseif (ZSM_ProxyCheck(x,'0.312',prox) and ZSM_ProxyCheck(y,'0.620',prox) and (not known_times_session['mh2thera'])) then ZSM_SetKnownTime(83, 'mh2thera'); known_times_session['mh2thera'] = true; elseif (ZSM_ProxyCheck(x,'0.171',prox) and ZSM_ProxyCheck(y,'0.252',prox) and (not known_times_session['rtv2ds'])) then ZSM_SetKnownTime(28, 'rtv2ds'); known_times_session['rtv2ds'] = true; elseif (ZSM_ProxyCheck(x,'0.180',prox) and ZSM_ProxyCheck(y,'0.221',prox) and (not known_times_session['rtv2ds'])) then ZSM_SetKnownTime(94, 'rtv2ds'); known_times_session['rtv2ds'] = true; end end function ZSM_ProxyCheck(curpos, checkpos, prox) for i=0, prox do --DEFAULT_CHAT_FRAME:AddMessage("Checking loc:"..curpos.." for desired loc:"..checkpos); if ((tonumber(curpos)-(i*0.001)) == tonumber(checkpos)) then return true; elseif ((tonumber(curpos)+(i*0.001)) == tonumber(checkpos)) then return true; end end return false; end function ZSM_CalcTripCycleTimeByIndex(transit, index) local sum_time = 0; for i = 1, index do local Args = GetArgs(zsm_data[transit..'_data'][i], ":"); sum_time = sum_time + tonumber(Args[3]); end return sum_time; end function ZSM_CalcTripCycle(transit) local div_time = GetTime() - known_times[transit]; div_time = div_time / zsm_data[transit..'_time']; div_time = div_time - floor(div_time); return div_time; end function ZSM_CalcTripCycleTime(transit, cycle) local sum_time = 0; for i = 1, table.getn(zsm_data[transit..'_data']) do local Args = GetArgs(zsm_data[transit..'_data'][i], ":"); sum_time = sum_time + tonumber(Args[3]); if ((cycle*zsm_data[transit..'_time']) <= sum_time) then return sum_time; end end end function ZSM_GetZepCoords(transit, cycle) local sum_time = 0; for i = 1, table.getn(zsm_data[transit..'_data']) do local Args = GetArgs(zsm_data[transit..'_data'][i], ":"); sum_time = sum_time + tonumber(Args[3]); if ((cycle*zsm_data[transit..'_time']) <= sum_time) then return Args; end end end function ZSM_SetKnownTime( value, transit ) local sum_time = 0; for i = 1, value do local Args = GetArgs(zsm_data[transit..'_data'][i], ":"); sum_time = sum_time + Args[3]; end known_times[transit] = GetTime() - sum_time; known_times['uptime'] = GetTime(); if (debug) then DEFAULT_CHAT_FRAME:AddMessage(transit .." Zep Time Set :"..known_times[transit]); end ZSM_Data[transit] = {}; ZSM_Data[transit]['timestamp'] = time(); local id, name = GetChannelName(dataChannel); SendChatMessage('KNOWN:'..protoVersion..":"..transit..":"..value, "CHANNEL", nil, id); end ------------------- -- DB Drop Down function ZSM_TransportSelect_Initialize() local info; dropdownvalues = {}; for i = 0, getn(zsm_data['transports']), 1 do dropdownindex[zsm_data['transports'][i]['label']] = i; local textdesc; if (ZSM_Data['Opts']['CityAlias']) then if (known_times[zsm_data['transports'][i]['label']]) then textdesc = GREEN..zsm_data['transports'][i]['namealias']; else textdesc = zsm_data['transports'][i]['namealias']; end else if (known_times[zsm_data['transports'][i]['label']]) then textdesc = GREEN .. zsm_data['transports'][i]['name']; else textdesc = zsm_data['transports'][i]['name']; end end info = { text = textdesc; func = ZSM_TransportSelect_OnClick; }; local addtrans = false; if (ZSM_Data['Opts']['FactionSpecific']) then local faction = UnitFactionGroup("player"); if ((zsm_data['transports'][i]['faction'] == faction) or (zsm_data['transports'][i]['faction'] == "Nuetral")) then addtrans = true; end else addtrans = true; end if (ZSM_Data['Opts']['ZoneSpecific'] and (addtrans)) then local zonestr = string.lower(zsm_data['transports'][i]['name']); local czonestr = string.lower(GetRealZoneText()); if (not string.find(zonestr, czonestr)) then addtrans = false; end end if ((addtrans) or (zsm_data['transports'][i]['faction'] == -1)) then UIDropDownMenu_AddButton(info); table.insert(dropdownvalues, zsm_data['transports'][i]['label']); end end end -- DB Drop Down function ZSM_TransportSelect_PreInitialize() local info; info = { text = 'loading variables'; func = ZSM_TransportSelect_OnClick; }; UIDropDownMenu_AddButton(info); end function ZSM_TransportSelect_OnShow() if (vars_loaded) then ZSM_TransportSelect_OnLoaded(); UIDropDownMenu_SetWidth(150); return; end UIDropDownMenu_ClearAll(ZSMFrameTransportSelect); UIDropDownMenu_Initialize(ZSMFrameTransportSelect, ZSM_TransportSelect_PreInitialize); UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, 1); UIDropDownMenu_SetWidth(150); end function ZSM_TransportSelect_OnLoaded() UIDropDownMenu_ClearAll(ZSMFrameTransportSelect); UIDropDownMenu_Initialize(ZSMFrameTransportSelect, ZSM_TransportSelect_Initialize); UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, activeSelect); end function ZSM_TransportSelect_OnClick() if (req_timeout ~= nil) then -- Can't change selection while data request is in process return; end i = this:GetID(); UIDropDownMenu_SetSelectedID(ZSMFrameTransportSelect, i); activeTransit = dropdownvalues[i]; activeSelect = i; if (ZSM_Data['Opts']['CityAlias']) then activeTransitName = zsm_data['transports'][dropdownindex[activeTransit]]['namealias']; else activeTransitName = zsm_data['transports'][dropdownindex[activeTransit]]['name']; end if (known_times[activeTransit] == nil) then local id, name = GetChannelName(dataChannel); SendChatMessage('REQ:'..protoVersion..":"..activeTransit, "CHANNEL", nil, id); end end function ZSM_TransportRequestData(transport) local id, name = GetChannelName(dataChannel); SendChatMessage('REQ:'..protoVersion..":"..transport, "CHANNEL", nil, id); if (debug) then DEFAULT_CHAT_FRAME:AddMessage("Data requested for transport ".. transport); end end ----------------- function ZSM_Minimize_OnClick () if( not ZSMFrame:IsVisible() )then ZSMFrame:Show(); ZSMHeaderFrameMinimizeButton:SetText("v"); ZSM_Data['Opts']['ShowLowerGUI'] = true; else ZSMFrame:Hide(); ZSMHeaderFrameMinimizeButton:SetText("^"); ZSM_Data['Opts']['ShowLowerGUI'] = false; end end function ZSM_Close_OnClick () ZSMHeaderFrame:Hide(); ZSM_Data['Opts']['ShowGUI'] = false; DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster -- GUI Closed! ("..GREEN.."Type /zm to show again"..YELLOW..")"); end function ZSM_Options_OnClick () if( not ZSMOptionsFrame:IsVisible() )then ZSMOptionsFrame:Show(); else ZSMOptionsFrame:Hide(); end end function ZSM_OptionsSave_OnClick () ZSM_Data['Opts']['ZoneGUI'] = ZSMOptionsFrameOptZoneGUI:GetChecked(); ZSM_Data['Opts']['FactionSpecific'] = ZSMOptionsFrameOptFactionSpecific:GetChecked(); ZSM_Data['Opts']['ZoneSpecific'] = ZSMOptionsFrameOptZoneSpecific:GetChecked(); ZSM_Data['Opts']['CityAlias'] = ZSMOptionsFrameOptCityAlias:GetChecked(); -- Refresh Dropdown with current options applied ZSM_TransportSelect_OnLoaded(); --DEFAULT_CHAT_FRAME:AddMessage(OptCityAlias); ZSMOptionsFrame:Hide(); end function ZSM_OptionsClose_OnClick () if (ZSM_Data['Opts']['ZoneGUI']) then ZSMOptionsFrameOptZoneGUI:SetChecked(); end if (ZSM_Data['Opts']['FactionSpecific']) then ZSMOptionsFrameOptFactionSpecific:SetChecked(); end if (ZSM_Data['Opts']['ZoneSpecific']) then ZSMOptionsFrameOptZoneSpecific:SetChecked(); end if (ZSM_Data['Opts']['CityAlias']) then ZSMOptionsFrameOptCityAlias:SetChecked(); end ZSMOptionsFrame:Hide(); end ----------------- function ZSM_OnEvent( event ) if (event == "VARIABLES_LOADED") then vars_loaded = true; -- Initialize Saved Variables if (ZSM_Opts == nil) then ZSM_Opts = {}; end if (ZSM_Opts['dataChannel'] == nil) then ZSM_Opts['dataChannel'] = dataChannel; end if (ZSM_Data == nil) then ZSM_Data = {}; known_times = {}; end if (ZSM_Data['protoVersion'] == nil) then ZSM_Data['protoVersion'] = protoVersion; end if (ZSM_Data['protoVersion'] ~= protoVersion) then -- If protocol is different, reset data known_times = {}; ZSM_Data['protoVersion'] = protoVersion; if (debug) then DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster - DEBUG - ".. RED .."Protocol changed, data reset!!"); end end if (ZSM_Data['Opts'] == nil) then ZSM_Data['Opts'] = {}; ZSM_Data['Opts']['ZoneGUI'] = false; ZSM_Data['Opts']['FactionSpecific'] = true; ZSM_Data['Opts']['ZoneSpecific'] = false; ZSM_Data['Opts']['CityAlias'] = true; end if ((ZSM_Data['Opts']['version'] == nil) or (ZSM_Data['Opts']['version'] < varsVersion)) then ZSM_Data['Opts']['version'] = varsVersion; ZSM_Data['Opts']['ZoneGUI'] = false; end if (ZSM_Data['Opts']['ShowGUI'] == nil) then ZSM_Data['Opts']['ShowGUI'] = true; end if (ZSM_Data['Opts']['ShowLowerGUI'] == nil) then ZSM_Data['Opts']['ShowLowerGUI'] = true; end -- Set GUI Options if (ZSM_Data['Opts']['ZoneGUI']) then ZSMOptionsFrameOptZoneGUI:SetChecked(); end if (ZSM_Data['Opts']['FactionSpecific']) then ZSMOptionsFrameOptFactionSpecific:SetChecked(); end if (ZSM_Data['Opts']['ZoneSpecific']) then ZSMOptionsFrameOptZoneSpecific:SetChecked(); end if (ZSM_Data['Opts']['CityAlias']) then ZSMOptionsFrameOptCityAlias:SetChecked(); end ZSM_TransportSelect_OnLoaded(); -- dataChannel = ZSM_Opts['dataChannel']; if (ZSM_Data['Opts']['ShowLowerGUI']) then ZSMFrame:Show(); else ZSMFrame:Hide(); end if (ZSM_Data['Opts']['ShowGUI']) then ZSMHeaderFrame:Show(); else ZSMHeaderFrame:Hide(); end if ((ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] > time())) then ZSM_Data['agedTimestamp'] = time(); DEFAULT_CHAT_FRAME:AddMessage("ZeppelinMaster: Aged timestamp was too old, setting oldest timestamp to current system time."); end --ZSMHeaderFrameAddonName:SetText("ZeppelinMaster "..ZSM_version); ZSMOptionsFrameOptionsTitle:SetText("ZeppelinMaster Options (v"..ZSM_version..")"); DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster v"..ZSM_version.." -- Loaded. (type /zsm to toggle interface)"); if ((known_times['uptime'] ~= nil) and (known_times['uptime'] > GetTime())) then -- Since uptime is less than last known zep time, reset must have occured -- Clear known times known_times = {}; known_times['uptime'] = GetTime(); DEFAULT_CHAT_FRAME:AddMessage(YELLOW.. "ZeppelinMaster -- ".. RED .."Sync Data Out-Of-Date ... Data Reset!"); end elseif (event == "CHAT_MSG_SYSTEM") then if (string.find(string.lower(arg1), "restart in") or string.find(string.lower(arg1), "shutdown in")) then -- Server is going down, clear zeppelin times also record down time server went down so we can -- inform other clients that their data is out of date if their data timestamp is less than -- server reset. known_times = {}; ZSM_Data['agedTimestamp'] = time(); end elseif ((event == "CHAT_MSG_CHANNEL_NOTICE")) then joinedch = true; -- Automatically join data channel JoinChannelByName(dataChannel); if (arg9 == dataChannel) then local id, name = GetChannelName(dataChannel); SendChatMessage('REQVER:1:1', "CHANNEL", nil, id); -- Transmit all our known data when someone joins a channel for index, data in zsm_data['transports'] do if (data['label'] ~= -1) then ZSM_TransportRequestData(data['label']); end end end elseif (event == "CHAT_MSG_CHANNEL_JOIN") then -- if our client was around for a server shutdown or restart, let other clients know data before this date is out-of-date if ((ZSM_Data['agedTimestamp'] ~= nil) and (string.lower(arg9) == string.lower(dataChannel))) then local id, name = GetChannelName(dataChannel); SendChatMessage('DATED:'..protoVersion..":"..ZSM_Data['agedTimestamp'], "CHANNEL", nil, id); end elseif ((event == "CHAT_MSG_CHANNEL") and (arg9 == dataChannel) and (arg2 ~= UnitName("player"))) then local Args = GetArgs(arg1, ":"); local numArgs = table.getn(Args); if (numArgs <= 2) then return; end local command = Args[1]; local version = Args[2]; --DEFAULT_CHAT_FRAME:AddMessage(arg4..":"..arg2..":"..arg1); if ((tonumber(protoVersion) < tonumber(version)) and (not newVerAvail)) then newVerAvail = true; DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster ::".. RED .." There is a new version of ZeppelinMaster available at curse-gaming.com!"); return; end if (command == "REQVER") then local id, name = GetChannelName(dataChannel); SendChatMessage('VER:'..protoVersion..":"..ZSM_version, "CHANNEL", nil, id); elseif (command == "VER") then local clientversion = Args[3]; if ((tonumber(ZSM_version) < tonumber(clientversion)) and (not newVerAvail)) then newVerAvail = true; DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster ::".. RED .." There is a new version of ZeppelinMaster available at curse-gaming.com!"); return; end elseif ((command == "DATED") and (protoVersion == version)) then local dated_timestamp = tonumber(Args[3]); if ((ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] < dated_timestamp) and (dated_timestamp < time())) then ZSM_Data['agedTimestamp'] = dated_timestamp; elseif ((ZSM_Data['agedTimestamp'] == nil) and (dated_timestamp < time())) then ZSM_Data['agedTimestamp'] = dated_timestamp; end -- Check to see any of this clients data is older than last aged timestamp -- if so clear it for transport, time in known_times do if ((ZSM_Data[transport] ~= nil) and (ZSM_Data[transport]['timestamp'] ~= nil) and (ZSM_Data['agedTimestamp'] ~= nil) and (ZSM_Data[transport]['timestamp'] < ZSM_Data['agedTimestamp'])) then known_times[transport] = nil; ZSM_Data[transport] = nil; if (debug) then DEFAULT_CHAT_FRAME:AddMessage(transport.." timestamp is too old, removing."); end end end elseif ((command == "KNOWN") and (protoVersion == version)) then local transit = Args[3]; local value = tonumber(Args[4]); local sum_time = 0; for i = 1, value do local Args = GetArgs(zsm_data[transit..'_data'][i], ":"); sum_time = sum_time + Args[3]; end known_times[transit] = GetTime() - sum_time; ZSM_Data[transit] = {}; ZSM_Data[transit]['timestamp'] = time(); if (debug) then DEFAULT_CHAT_FRAME:AddMessage(RED.."Zep Time Broadcast Received from ".. arg2 .." -- ".. transit .." Zep Time Set :"..known_times[transit]); end elseif ((command == "REQ") and (protoVersion == version)) then local transit = Args[3]; if (debug) then DEFAULT_CHAT_FRAME:AddMessage(arg2.." requested ".. transit); end if (known_times[transit] ~= nil) then local cycle = ZSM_CalcTripCycle(transit); local time = cycle*zsm_data[transit..'_time']; local id, name = GetChannelName(dataChannel); SendChatMessage('RESP:'..protoVersion..":"..transit..":"..time..":"..ZSM_Data[transit]['timestamp'], "CHANNEL", nil, id); if (debug) then DEFAULT_CHAT_FRAME:AddMessage(dataChannel.." -- ".. id); end end elseif ((command == "RESP") and (protoVersion == version)) then local transit = Args[3]; local time = tonumber(Args[4]); local timestamp = tonumber(Args[5]); if (known_times[transit] == nil) then req_timeout = 1; if (known_times_req[arg2] == nil) then known_times_req[arg2] = {}; end known_times_req[arg2][transit] = {}; known_times_req[arg2][transit]['timestamp'] = timestamp; known_times_req[arg2][transit]['time'] = GetTime() - time; if (debug) then DEFAULT_CHAT_FRAME:AddMessage(RED.."Zep Time Brocast Received from ".. arg2 .." -- ".. transit .." Zep Time Set :"..known_times_req[arg2][transit]['time']); end end ZM_tempText = RED.."Receiving Data.."; ZM_tempTextCount = 2; end elseif (event == "ZONE_CHANGED_NEW_AREA") then if (not ZSM_Data['Opts']['ZoneGUI']) then -- Opt: Show GUI when zone change contains a transport return; end -- Open GUI if entering zone with transport for index, zone_data in zsm_data['transports'] do if (zone_data['label'] ~= -1) then local plat_data = zsm_data[zone_data['label']..'_plats']; if (plat_data ~= nil) then for index, trans_data in plat_data do --DEFAULT_CHAT_FRAME:AddMessage(trans_data['name'] ); if (trans_data['name'] == GetRealZoneText()) then ZSMHeaderFrame:Show(); ZSMFrame:Show(); end end end end end end end function ZSM_SlashCommandHandler(msg) local msgArgs; local numArgs; -- Get the arguments msg = string.lower(msg); msgArgs = GetArgs(msg, " "); -- Get the number of arguments numArgs = table.getn(msgArgs); -- Check if command is for DKP, for 1 argument only if (numArgs == 0) then DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster -- Display GUI"); ZSMHeaderFrame:Show(); ZSM_Data['Opts']['ShowGUI'] = true; elseif (numArgs == 1) then if (msgArgs[1] == "reset") then DEFAULT_CHAT_FRAME:AddMessage(RED.."ZeppelinMaster -- Session Reset!"); known_times_session = {}; known_times = {}; end elseif (numArgs == 2) then if (msgArgs[1] == "channel") then LeaveChannelByName(dataChannel); ZSM_Opts['dataChannel'] = msgArgs[2]; dataChannel = ZSM_Opts['dataChannel']; JoinChannelByName(dataChannel); DEFAULT_CHAT_FRAME:AddMessage(YELLOW.."ZeppelinMaster -- Data Channel set to [".. msgArgs[2] .."]"); end end end --[[ Extract key/value from message. ]]-- function GetArgs(message, separator) -- Declare 'args' variable. local args = {}; -- Declare 'i' integer. i = 0; -- Search for seperators in the string and return -- the separated data. for value in string.gfind(message, "[^"..separator.."]+") do i = i + 1; args[i] = value; end -- end for -- Submit the filtered data. return args; end -- end GetArgs()