Compare with Previous | Blame | View Log
--[[ Addon: util Author: TProg Taonnor Created by @Taonnor ]]-- -- Version Control local VERSION = 3 --[[ Class definition (Static class) ]]-- -- A table in hole lua workspace must be unique -- The group helper is global util table, used in several of my addons -- The table is created as "static" class without constructor and static helper methods if (TaosGroupHelper == nil or TaosGroupHelper.Version == nil or TaosGroupHelper.Version < VERSION) then TaosGroupHelper = {} TaosGroupHelper.__index = TaosGroupHelper TaosGroupHelper.Version = VERSION -- Global Callback Variables TAO_GROUP_CHANGED = "TAO-GroupChanged" TAO_UNIT_GROUPED_CHANGED = "TAO-UnitGroupedChanged" -- local members local REFRESH_TIME = 1000 -- ms local _name = "TaosGroupHelper" local _isUnitGrouped = false local _groupPlayers = {} --[[ ============== PUBLIC METHODS ============== ]]-- --[[ GetIsUnitGrouped Gets the current UnitGrouped state ]]-- function GetIsUnitGrouped() return _isUnitGrouped end --[[ IsTargetGroupMember Gets the information if target is group member ]]-- function IsTargetGroupMember(targetName) for i = 1, GetGroupSize() do local unitTag = GetGroupUnitTagByIndex(i) if (unitTag and zo_strformat("<<1>>", targetName) == GetUnitName(unitTag)) then return true, unitTag end end return false end --[[ IsGroupInCombat Gets the information if group is in combat ]]-- function IsGroupInCombat() for i = 1, GetGroupSize() do local unitTag = GetGroupUnitTagByIndex(i) if (unitTag and IsUnitInCombat(unitTag)) then return true end end return false end --[[ =============== PRIVATE METHODS =============== ]]-- --[[ Called when group updated ]]-- local function OnGroupUpdate() local isGrouped = IsUnitGrouped("player") if (isGrouped ~= _isUnitGrouped) then _isUnitGrouped = isGrouped FireCallbacksAsync(TAO_UNIT_GROUPED_CHANGED, isGrouped) end end --[[ Called when group member joined group ]]-- local function OnGroupMemberJoined(eventCode, memberName) local playerName = zo_strformat("<<1>>", memberName) local isGroupMember, unitTag = IsTargetGroupMember(playerName) if (isGroupMember) then _groupPlayers[playerName] = true FireCallbacksAsync(TAO_GROUP_CHANGED, playerName, true) end OnGroupUpdate() end --[[ Called when group member left group ]]-- local function OnGroupMemberLeft(eventCode, memberCharacterName, reason, isLocalPlayer, isLeader, memberDisplayName, actionRequiredVote) local playerName = zo_strformat("<<1>>", memberCharacterName) _groupPlayers[playerName] = nil FireCallbacksAsync(TAO_GROUP_CHANGED, playerName, false) OnGroupUpdate() end --[[ Called when loading UI finished ]]-- local function OnPlayerActivated(eventCode) -- Initial state _isUnitGrouped = IsUnitGrouped("player") FireCallbacksAsync(TAO_UNIT_GROUPED_CHANGED, _isUnitGrouped) FireCallbacksAsync(TAO_GROUP_CHANGED, "player", false) end --[[ Called REFRESH_TIME finished and updates group players if not catched via MemberJoined ]]-- local function OnTimedUpdate() for i = 1, GetGroupSize() do local unitTag = GetGroupUnitTagByIndex(i) if (unitTag and unitTag ~= "invalid") then local playerName = GetUnitName(unitTag) if (_groupPlayers[playerName] == nil) then _groupPlayers[playerName] = true FireCallbacksAsync(TAO_GROUP_CHANGED, playerName, true) end end end end --[[ Register events ]]-- EVENT_MANAGER:RegisterForUpdate(_name, REFRESH_TIME, OnTimedUpdate) EVENT_MANAGER:RegisterForEvent(_name, EVENT_GROUP_MEMBER_JOINED, OnGroupMemberJoined) EVENT_MANAGER:RegisterForEvent(_name, EVENT_GROUP_MEMBER_LEFT, OnGroupMemberLeft) EVENT_MANAGER:RegisterForEvent(_name, EVENT_PLAYER_ACTIVATED, OnPlayerActivated) end