ADGroupTool = {} -- Written by M0R_Gaming ADGroupTool.name = "AAGroupTool" ADGroupTool.groupList = {} ADGroupTool.adgttToggle = false ADGroupTool.varversion = 1 ADGroupTool.DefaultSettings = { guildID = 341929, offCrownTimer = 600, offCrownTimerMin = 10, discordLink = "[Insert Discord Link Here]", discordInvite = "Come join us in discord! Even if you don't have a mic, it still helps us coordinate attacks! Come join us at", radius = 25500, } -- The range of a forward camp is 25500 units function ADGroupTool.setTimer(minutes) if not minutes then d("Please provide a valid amount of time (in minutes)") else ADGroupTool.vars.offCrownTimerMin = tonumber(minutes) ADGroupTool.vars.offCrownTimer = 60*ADGroupTool.vars.offCrownTimerMin d("Pugs will be kicked after "..minutes.." minutes of not being on crown") end end function ADGroupTool.setDiscord(discord) ADGroupTool.vars.discordLink = discord d("Discord link set: "..ADGroupTool.vars.discordLink) end function ADGroupTool.setDiscordInv(discord) ADGroupTool.vars.discordInvite = discord d("Discord Invite Message set: "..ADGroupTool.vars.discordInvite) end function ADGroupTool.sendDiscord() local channel = CHAT_CHANNEL_PARTY local target = nil local message = ADGroupTool.vars.discordInvite.." "..ADGroupTool.vars.discordLink CHAT_SYSTEM:StartTextEntry(message, channel, target) end function ADGroupTool.startTimer() if ADGroupTool.adgttToggle then EVENT_MANAGER:UnregisterForUpdate("AD Group Tool SOC") --milliseconds EVENT_MANAGER:UnregisterForEvent("AD Group Tool SOC DC", EVENT_GROUP_MEMBER_LEFT) d("|cFFD700AD Group Tool|r: [Stay On Crown] module |cFF0000deactivated|r.") ADGroupTool.adgttToggle = false ADGroupTool.groupList = {} else EVENT_MANAGER:RegisterForUpdate("AD Group Tool SOC", 1000, ADGroupTool.groupTimer) --milliseconds EVENT_MANAGER:RegisterForEvent("AD Group Tool SOC DC", EVENT_GROUP_MEMBER_LEFT, ADGroupTool.SOCDC) d("|cFFD700AD Group Tool|r: [Stay On Crown] module |c00FF00activated|r.") ADGroupTool.adgttToggle = true end end -- Setting up Keybinds and Commands -- ZO_CreateStringId("SI_BINDING_NAME_ADGROUPTOOL_TOGGLE_SOC", "Toggle [Stay On Crown] Module") ZO_CreateStringId("SI_BINDING_NAME_ADGROUPTOOL_POST_DISCORD", "Send Discord Message") SLASH_COMMANDS["/stayoncrown"] = ADGroupTool.startTimer SLASH_COMMANDS["/adtimerset"] = ADGroupTool.setTimer SLASH_COMMANDS["/addiscord"] = ADGroupTool.sendDiscord SLASH_COMMANDS["/adsetdiscord"] = ADGroupTool.setDiscord SLASH_COMMANDS["/adsetdiscordinv"] = ADGroupTool.setDiscordInv function ADGroupTool.groupTimer() local crown = GetGroupLeaderUnitTag() local crownWorld,crownX,crownY,crownZ = GetUnitWorldPosition(crown) for i = 1,GetGroupSize() do local unit = GetGroupUnitTagByIndex(i) local displayName = GetUnitDisplayName(unit) local unitWorld,unitX,unitY,unitZ = GetUnitWorldPosition(unit) local distance = math.sqrt( (crownX-unitX)^2 + (crownZ-unitZ)^2 ) --d(displayName) --d(distance) if distance > ADGroupTool.vars.radius then if ADGroupTool.groupList[displayName] == nil then ADGroupTool.groupList[displayName] = 0 else ADGroupTool.groupList[displayName] = ADGroupTool.groupList[displayName] + 1 if ADGroupTool.groupList[displayName] > ADGroupTool.vars.offCrownTimer then ADGroupTool.groupList[displayName] = nil if GetGuildMemberIndexFromDisplayName(ADGroupTool.vars.guildID, displayName) == nil then if IsUnitGroupLeader('player') then GroupKick(unit) d("Kicked user "..displayName.." for not being on crown.") break else d("User "..displayName.." should be kicked for not being on crown.") break end else d("Guild Member "..displayName.." has not on crown for more than "..ADGroupTool.vars.offCrownTimerMin.." minutes.") end end end else ADGroupTool.groupList[displayName] = nil end end end -- Stay on Crown : Disconnect function ADGroupTool.SOCDC(eventCode, characterName, reason, isLocalPlayer, isLeader, displayName, actionRequiredVote) --d("User "..displayName.." has left the group") if ADGroupTool.groupList[displayName] ~= nil then ADGroupTool.groupList[displayName] = nil end end -- Map Pins Module, some of the base code was taken from the sample code in LibMapPins-1.0.lua --local fd = {} local LMP = LibMapPins local fds = { {name="Castle Bloodmayne",x=0.57472223043442,y=0.76157778501511}, {name="Castle Black Boot",x=0.40770667791367,y=0.76615333557129}, {name="Castle Faregyl",x=0.49927777051926,y=0.67549556493759}, {name="Castle Alessia",x=0.57074224948883,y=0.557148873806}, {name="Castle Roebeck",x=0.41256666183472,y=0.56352001428604}, {name="Castle Brindle",x=0.23523999750614,y=0.56775331497192}, {name="Fort Ash",x=0.33939111232758,y=0.4275244474411}, {name="Fort Aleswell",x=0.40584889054298,y=0.28369554877281}, {name="Drakelow Keep",x=0.76734441518784,y=0.58292669057846}, } local function setRally(pin) local _, pinTag = pin:GetPinTypeAndTag() local x = pinTag.x local y = pinTag.y LibMapPing:SetMapPing(MAP_PIN_TYPE_RALLY_POINT,MAP_TYPE_LOCATION_CENTERED,x,y) end local LMB_handler = { { name = "Set Rally to Front Door", callback = setRally, show = function(pin) return true end, } } --sample layout local pinLayoutData = { level = 5, texture = "esoui/art/icons/mapkey/mapkey_ava_milegate_passable.dds", size = 10, } --tooltip creator local pinTooltipCreator = { creator = function(pin) local _, pinTag = pin:GetPinTypeAndTag() InformationTooltip:AddLine(pinTag.name.." Front Door") end, tooltip = ZO_MAP_TOOLTIP_MODE.INFORMATION, } function ADGroupTool.disableDoors() LibMapPins:Disable("Front Doors") end EVENT_MANAGER:RegisterForEvent("Cyro Transis Active FD", EVENT_START_FAST_TRAVEL_KEEP_INTERACTION, ADGroupTool.disableDoors) function ADGroupTool.enableDoors() LibMapPins:Enable("Front Doors") end EVENT_MANAGER:RegisterForEvent("Cyro Transis Deactive FD", EVENT_END_FAST_TRAVEL_KEEP_INTERACTION, ADGroupTool.enableDoors) local function createDoors() for _, pinInfo in ipairs(fds) do LMP:CreatePin("Front Doors", pinInfo, pinInfo.x, pinInfo.y) end end local function fdcallback() if not LMP:IsEnabled("Front Doors") then return end local zone, subzone = LMP:GetZoneAndSubzone() if not (zone == "cyrodiil") then return end if not (subzone == "ava_whole") then return end --d("IN CYRO!") createDoors() end function ADGroupTool.getCoords(Name) local channel = CHAT_CHANNEL_PARTY local target = nil local x, y, map = GetMapPlayerPosition('player') local message = "{name=\""..Name.."\",x="..x..",y="..y.."}," CHAT_SYSTEM:StartTextEntry(message, channel, target) end SLASH_COMMANDS["/getcoords"] = ADGroupTool.getCoords --LMP:AddPinFilter(FDPinType) -- The following was adapted from https://wiki.esoui.com/Circonians_Stamina_Bar_Tutorial#lua_Structure ------------------------------------------------------------------------------------------------- -- OnAddOnLoaded -- ------------------------------------------------------------------------------------------------- function ADGroupTool.OnAddOnLoaded(event, addonName) if addonName ~= ADGroupTool.name then return end ADGroupTool:Initialize() end ------------------------------------------------------------------------------------------------- -- Initialize Function -- ------------------------------------------------------------------------------------------------- function ADGroupTool:Initialize() ADGroupTool.vars = ZO_SavedVars:NewAccountWide("ADVars", ADGroupTool.varversion, nil, ADGroupTool.DefaultSettings) ADGroupTool.createSettings() LibMapPins:AddPinType("Front Doors", fdcallback, nil, pinLayoutData, pinTooltipCreator) LibMapPins:AddPinFilter("Front Doors") LibMapPins:SetClickHandlers("Front Doors", LMB_handler) EVENT_MANAGER:UnregisterForEvent(ADGroupTool.name, EVENT_ADD_ON_LOADED) end ------------------------------------------------------------------------------------------------- -- Register Events -- ------------------------------------------------------------------------------------------------- EVENT_MANAGER:RegisterForEvent(ADGroupTool.name, EVENT_ADD_ON_LOADED, ADGroupTool.OnAddOnLoaded)