private Quaternion OrientCamera(MonitorDisplay md, Camera cam) { Quaternion newCamRot; var radAngle = (cam.fieldOfView + bezelCorrection) * Mathf.Deg2Rad; var radHFOV = (float)(2f * Math.Atan(Mathf.Tan(radAngle / 2) * cam.aspect)); var hFOV = (Mathf.Rad2Deg * radHFOV); //float hFOV = md.assCam.fieldOfView; switch (md.monitorPosition) { case MonitorPosition.center: newCamRot = Quaternion.identity; break; case MonitorPosition.left: newCamRot = Quaternion.Euler(Vector3.up * (-hFOV - bezelCorrection)); break; case MonitorPosition.right: newCamRot = Quaternion.Euler(Vector3.up * (hFOV + bezelCorrection)); break; default: newCamRot = Quaternion.identity; break; } return(newCamRot); }
private Camera CreateCam(MonitorDisplay md) { Camera monCam = Instantiate(Camera.main); monCam.tag = ""; monCam.transform.SetParent(Camera.main.transform.parent); monCam.transform.position = Camera.main.transform.position; monCam.transform.localRotation = OrientCamera(md, monCam); monCam.targetDisplay = md.displayIndex; return(monCam); }
public Vector4 GetBarBackgroundColor(MonitorDisplay display, DisplayTimer timer) { if (!timer.IsComplete) { return(display.BarBackgroundColor); } if (!display.PulseReady) { return(timer.FinishedColor); } var s = (float)Math.Abs((Math.Abs((timer.TimerRemaining - display.CacheAge.TotalSeconds) / (2.5f - display.PulseSpeed)) - (float)Math.Floor(Math.Abs((timer.TimerRemaining - display.CacheAge.TotalSeconds) / (2.5f - display.PulseSpeed))) - 0.5f) / 2) * display.PulseIntensity; if (timer.FinishedColor.W < 0.75) { return(timer.FinishedColor + new Vector4(0, 0, 0, s)); } return(timer.FinishedColor - new Vector4(0, 0, 0, s)); }
private void CreateCameras() { int numDisplays = Display.displays.Length; for (int i = 0; i < numDisplays; i++) { if (i == leftMonitorIndex || i == rightMonitorIndex) { MonitorDisplay md = new MonitorDisplay(); md.displayIndex = i; md.display = Display.displays[i]; md.monitorPosition = i == rightMonitorIndex ? MonitorPosition.right : MonitorPosition.left; md.useDisplay = true; md.renderScale = 0.5f; md.assCam = CreateCam(md); Display.displays[i].Activate(); activatedDisplays.Add(md); } } }
public void DrawDisplaysTab() { ImGui.BeginChild("###displaysScroll", ImGui.GetWindowSize() - (ImGui.GetStyle().WindowPadding * 2) - new Vector2(0, ImGui.GetCursorPosY())); if (ImGui.Button("Add New Display")) { var guid = Guid.NewGuid(); MonitorDisplays.Add(guid, new MonitorDisplay { Guid = guid, Name = $"Display {MonitorDisplays.Count + 1}" }); Save(); } if (MonitorDisplays.Count == 0) { ImGui.Text("Add a display to get started."); } Guid? deletedMonitor = null; MonitorDisplay copiedDisplay = null; foreach (var m in MonitorDisplays.Values) { if (ImGui.CollapsingHeader($"{(m.Enabled ? "":"[Disabled] ")}{m.Name}###configDisplay{m.Guid}")) { m.DrawConfigEditor(this, plugin, ref deletedMonitor, ref copiedDisplay); } } if (deletedMonitor.HasValue) { MonitorDisplays.Remove(deletedMonitor.Value); Save(); } if (copiedDisplay != null && !MonitorDisplays.ContainsKey(copiedDisplay.Guid)) { MonitorDisplays.Add(copiedDisplay.Guid, copiedDisplay); } ImGui.EndChild(); }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { var actionBar = pluginInterface.Framework.Gui.GetUiObjectByName("_ActionBar", 1); if (actionBar == IntPtr.Zero) return false; return Marshal.ReadByte(actionBar, 0x23F) == 0; }
public override ushort GetIconID(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return 5; //60840; }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return((pluginInterface.ClientState.LocalPlayer.ClassJob.Id == 2 || pluginInterface.ClientState.LocalPlayer.ClassJob.Id == 20) && pluginInterface.ClientState.LocalPlayer.Level >= 15 && pluginInterface.ClientState.LocalPlayer.StatusEffects.All(s => s.EffectId != 103 && s.EffectId != 104 && s.EffectId != 105)); }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return "热键栏未锁定"; }
public virtual bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return(false); }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return("Summon Pet"); }
private void DrawDisplayIcons(MonitorDisplay display, List <DisplayTimer> timerList) { if (display.DirectionBtT) { ImGui.SetCursorPosY(ImGui.GetWindowHeight() - (display.RowSize + ImGui.GetStyle().WindowPadding.Y)); } if (display.DirectionRtL) { ImGui.SetCursorPosX(ImGui.GetWindowWidth() - (display.RowSize + ImGui.GetStyle().WindowPadding.X)); } var sPosX = ImGui.GetCursorPosX(); var sPosY = ImGui.GetCursorPosY(); ImGui.SetWindowFontScale(display.TextScale); foreach (var timer in timerList) { var cPosX = ImGui.GetCursorPosX(); var cPosY = ImGui.GetCursorPosY(); var fraction = (float)(timer.TimerCurrent + display.CacheAge.TotalSeconds) / timer.TimerMax; if (display.LimitDisplayTime && timer.TimerMax > display.LimitDisplayTimeSeconds) { fraction = (float)(display.LimitDisplayTimeSeconds - timer.TimerRemaining + display.CacheAge.TotalSeconds) / display.LimitDisplayTimeSeconds; } if (display.FillToComplete && fraction < 1) { fraction = 1 - fraction; } ImGui.BeginGroup(); var drawList = ImGui.GetWindowDrawList(); var barTopLeft = ImGui.GetCursorScreenPos(); var barBottomRight = ImGui.GetCursorScreenPos() + new Vector2(display.RowSize); var barSize = barBottomRight - barTopLeft; var hovered = false; if (display.AllowClicking && timer.ClickAction != null) { // Check Mouse Position var mouse = ImGui.GetMousePos(); var pos1 = ImGui.GetCursorScreenPos(); var pos2 = ImGui.GetCursorScreenPos() + barSize; if (mouse.X > pos1.X && mouse.X < pos2.X && mouse.Y > pos1.Y && mouse.Y < pos2.Y) { display.IsClickableHovered = true; hovered = true; ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); } } var barFractionCompleteSize = new Vector2(0, barSize.Y * (1 - fraction)); var barFractionIncompleteSize = new Vector2(0, barSize.Y * fraction); DrawBar(barTopLeft, barSize, 1 - fraction, display.IconDisplayFillDirection, GetBarBackgroundColor(display, timer), timer.ProgressColor); if (hovered) { drawList.AddRect(barTopLeft, barBottomRight, 0xFF0000FF); drawList.AddRect(barTopLeft + Vector2.One, barBottomRight - Vector2.One, 0xFF0000FF); } if (display.ShowActionIcon && timer.IconId > 0) { var iconSize = new Vector2(display.RowSize * display.ActionIconScale); var icon = IconManager.GetIconTexture(timer.IconId); if (icon != null) { iconSize *= new Vector2((float)icon.Width / Math.Max(icon.Width, icon.Height), (float)icon.Height / Math.Max(icon.Width, icon.Height)); ImGui.SetCursorPosY(cPosY + barSize.Y / 2 - iconSize.X / 2); ImGui.SetCursorPosX(cPosX + barSize.X / 2 - iconSize.X / 2); ImGui.Image(icon.ImGuiHandle, iconSize); } } if (timer.AllowCountdown && display.ShowCountdown && (!timer.IsComplete || display.ShowCountdownReady)) { var countdownText = Math.Abs(timer.TimerRemaining - display.CacheAge.TotalSeconds).ToString("F1"); var countdownSize = ImGui.CalcTextSize(countdownText); ImGui.SetCursorPosY(cPosY + (display.RowSize / 2f) - (countdownSize.Y / 2)); ImGui.SetCursorPosX(cPosX + (display.RowSize / 2f) - (countdownSize.X / 2)); // ImGui.TextColored(display.TextColor, countdownText); TextShadowed(countdownText, display.TextColor, new Vector4(0, 0, 0, 1), 2); } ImGui.EndGroup(); if (timer.ClickAction != null) { if (hovered && ImGui.GetIO().MouseDown[0]) { timer.ClickAction?.Invoke(this, timer.ClickParam); } } var newX = cPosX; var newY = cPosY; if (display.IconVerticalStack) { if (display.DirectionBtT) { newY = cPosY - display.RowSize - display.BarSpacing; if (newY < 0 + ImGui.GetStyle().WindowPadding.Y) { newY = sPosY; if (display.DirectionRtL) { newX = cPosX - display.RowSize - display.BarSpacing; } else { newX = cPosX + display.RowSize + display.BarSpacing; } } } else { newY = cPosY + display.RowSize + display.BarSpacing; newX = cPosX; if (newY > ImGui.GetWindowHeight() - display.RowSize - ImGui.GetStyle().WindowPadding.Y) { newY = sPosY; if (display.DirectionRtL) { newX = cPosX - display.RowSize - display.BarSpacing; } else { newX = cPosX + display.RowSize + display.BarSpacing; } } } } else { if (display.DirectionRtL) { newX = cPosX - display.RowSize - display.BarSpacing; if (newX < 0 + ImGui.GetStyle().WindowPadding.X) { newX = sPosX; if (display.DirectionBtT) { newY = cPosY - display.RowSize - display.BarSpacing; } else { newY = cPosY + display.RowSize + display.BarSpacing; } } } else { newX = cPosX + display.RowSize + display.BarSpacing; newY = cPosY; if (newX > ImGui.GetWindowWidth() - display.RowSize - ImGui.GetStyle().WindowPadding.X) { newX = sPosX; if (display.DirectionBtT) { newY = cPosY - display.RowSize - display.BarSpacing; } else { newY = cPosY + display.RowSize + display.BarSpacing; } } } } ImGui.SetCursorPosY(newY); ImGui.SetCursorPosX(newX); } }
public override ushort GetIconID(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { try { return(pluginInterface.Data.Excel.GetSheet <Action>().GetRow(18322).Icon); } catch { return(0); } }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { if (!_isSetup) { try { _retainerContainer = (RetainerContainer *)pluginInterface.TargetModuleScanner.GetStaticAddressFromSig("48 8B E9 48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 85 C0 74 4E"); _retainers = (Retainer *)_retainerContainer->Retainers; } catch (Exception ex) { PluginLog.LogError(ex, "Failed to find retainer static address"); } _isSetup = true; return(false); } if (_retainers == null || _retainerContainer == null) { return(false); } if (_retainerContainer->Ready == 0) { return(true); } count = 0; var timeNow = DateTime.UtcNow.Ticks / 10000000L - 62135596800L; for (var i = 0; i < _retainerContainer->RetainerCount; i++) { var retainer = _retainers[i]; if (retainer.RetainerID == 0 || retainer.Available == 0 || retainer.ClassJob == 0) { continue; } if (retainer.VentureComplete < timeNow) { count++; } } return(count > 0); }
private void DrawDisplayHorizontal(MonitorDisplay display, List <DisplayTimer> timerList) { if (display.DirectionBtT) { ImGui.SetCursorPosY(ImGui.GetWindowHeight() - (display.RowSize + ImGui.GetStyle().WindowPadding.Y)); } ImGui.SetWindowFontScale(display.TextScale); var barSize = new Vector2(ImGui.GetWindowWidth() - ImGui.GetStyle().WindowPadding.X * 2, display.RowSize); foreach (var timer in timerList) { var barTopLeft = ImGui.GetCursorScreenPos(); var barBottomRight = ImGui.GetCursorScreenPos() + barSize; ImGui.BeginGroup(); var hovered = false; if (display.AllowClicking && timer.ClickAction != null) { // Check Mouse Position var mouse = ImGui.GetMousePos(); var pos1 = ImGui.GetCursorScreenPos(); var pos2 = ImGui.GetCursorScreenPos() + barSize; if (mouse.X > pos1.X && mouse.X < pos2.X && mouse.Y > pos1.Y && mouse.Y < pos2.Y) { display.IsClickableHovered = true; hovered = true; ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); } } var cPosY = ImGui.GetCursorPosY(); var fraction = (float)(timer.TimerCurrent + display.CacheAge.TotalSeconds) / timer.TimerMax; if (display.LimitDisplayTime && timer.TimerMax > display.LimitDisplayTimeSeconds) { fraction = (float)(display.LimitDisplayTimeSeconds - timer.TimerRemaining + display.CacheAge.TotalSeconds) / display.LimitDisplayTimeSeconds; } if (display.FillToComplete && fraction < 1) { fraction = 1 - fraction; } DrawBar(ImGui.GetCursorScreenPos(), barSize, 1 - fraction, display.ReverseFill ? FillDirection.FromRight : FillDirection.FromLeft, GetBarBackgroundColor(display, timer), timer.ProgressColor); var iconSize = new Vector2(display.RowSize) * display.ActionIconScale; if (display.ShowActionIcon) { var x = ImGui.GetCursorPosX(); if (timer.IconId > 0) { var icon = IconManager.GetIconTexture(timer.IconId); if (icon != null) { var iconRatio = new Vector2((float)icon.Width / Math.Max(icon.Width, icon.Height), (float)icon.Height / Math.Max(icon.Width, icon.Height)); var displayedIconSize = iconSize * iconRatio; ImGui.SetCursorPosY(cPosY + (display.RowSize / 2f) - (displayedIconSize.Y / 2)); if (display.ReverseSideIcon) { ImGui.SetCursorPosX(ImGui.GetWindowWidth() - (display.RowSize / 2f) - (displayedIconSize.X / 2) - ImGui.GetStyle().WindowPadding.X); } else { ImGui.SetCursorPosX(ImGui.GetCursorPosX() + (display.RowSize / 2f) - (displayedIconSize.X / 2)); } ImGui.Image(icon.ImGuiHandle, displayedIconSize); } } ImGui.SameLine(); ImGui.SetCursorPosX(x + (display.RowSize / 2f) + (iconSize.X / 2) + ImGui.GetStyle().ItemSpacing.X); } if (timer.AllowCountdown && display.ShowCountdown && (!timer.IsComplete || display.ShowCountdownReady)) { var time = Math.Abs(timer.TimerRemaining - display.CacheAge.TotalSeconds); var countdownText = time.ToString(time >= 100 ? "F0" : "F1"); var countdownSize = ImGui.CalcTextSize(countdownText); ImGui.SetCursorPosY(cPosY + (display.RowSize / 2f - countdownSize.Y / 2f)); if (display.ReverseCountdownSide) { ImGui.SetCursorPosX(ImGui.GetStyle().WindowPadding.X + display.RowSize / 2f - countdownSize.X / 2); } else { ImGui.SetCursorPosX(ImGui.GetWindowWidth() - ImGui.GetStyle().WindowPadding.X - display.RowSize / 2f - countdownSize.X * 0.6f); } if (display.ShowActionIcon && display.ReverseSideIcon != display.ReverseCountdownSide) { TextShadowed(countdownText, display.TextColor, new Vector4(0, 0, 0, 0.5f), 2); } else { ImGui.TextColored(display.TextColor, countdownText); } } if (display.ShowSkillName) { var name = timer.Name; if (display.ShowStatusEffectTarget && !string.IsNullOrEmpty(timer.TargetName)) { name += $" on {timer.TargetName}"; } var size = ImGui.CalcTextSize(name); if (display.SkillNameRight) { ImGui.SetCursorPosX( ImGui.GetWindowWidth() - size.X - ImGui.GetStyle().WindowPadding.X - ImGui.GetStyle().FramePadding.X - ((display.ShowActionIcon && display.ReverseSideIcon) || (display.ShowCountdown && !display.ReverseCountdownSide) ? (iconSize.X + ImGui.GetStyle().ItemSpacing.X) : 0) ); } else { ImGui.SetCursorPosX( ImGui.GetStyle().WindowPadding.X + ImGui.GetStyle().FramePadding.X + ((display.ShowActionIcon && !display.ReverseSideIcon) || (display.ShowCountdown && display.ReverseCountdownSide) ? (iconSize.X + ImGui.GetStyle().ItemSpacing.X) : 0) ); } ImGui.SetCursorPosY(cPosY + (display.RowSize / 2f - size.Y / 2f)); ImGui.TextColored(display.TextColor, name); } if (hovered) { var drawList = ImGui.GetWindowDrawList(); drawList.AddRect(barTopLeft, barBottomRight, 0xFF0000FF); drawList.AddRect(barTopLeft + Vector2.One, barBottomRight - Vector2.One, 0xFF0000FF); } ImGui.EndGroup(); if (ImGui.IsItemClicked(0)) { timer.ClickAction?.Invoke(this, timer.ClickParam); } if (display.DirectionBtT) { ImGui.SetCursorPosY(cPosY - display.RowSize - display.BarSpacing); } else { ImGui.SetCursorPosY(cPosY + display.RowSize + display.BarSpacing); } if (ImGui.GetCursorPosY() + display.RowSize > ImGui.GetWindowHeight()) { return; } } }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { if (_retainers == null || _retainerContainer == null) { return("Error"); } if (_retainerContainer->Ready == 0) { return("Retainer List Unloaded"); } return($"{count} Inactive Retainer{(count>1?"s":"")}"); }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { try { if (pluginInterface.ClientState.LocalPlayer.ClassJob.GameData.Role != 1) { return(false); } // Check have stance if (pluginInterface.ClientState.LocalPlayer.StatusEffects.Any(s => tankStatusEffectIDs.Contains((uint)s.EffectId))) { return(false); } // Check other tanks have stance foreach (var a in pluginInterface.ClientState.Actors) { if (!(a is PlayerCharacter pc)) { continue; } if (pc.ClassJob.GameData.Role != 1 || pc.ActorId == pluginInterface.ClientState.LocalPlayer.ActorId) { continue; } if (pc.StatusEffects.Any(s => tankStatusEffectIDs.Contains((uint)s.EffectId))) { return(false); } } return(true); } catch { return(false); } }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return("Apply Fists"); }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return("Aetherial Mimicry"); }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return("Lock Hotbar"); }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return(pluginInterface.ClientState.LocalPlayer.ClassJob.Id == 36 && pluginInterface.ClientState.LocalPlayer.StatusEffects.All(s => s.EffectId != 2124 && s.EffectId != 2125 && s.EffectId != 2126)); }
public override ushort GetIconID(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { try { var action = pluginInterface.Data.Excel.GetSheet <Action>().GetRow(petIcons[pluginInterface.ClientState.LocalPlayer.ClassJob.Id]); return(action.Icon); } catch { return(0); } }
public virtual string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return("General Reminder"); }
public override string GetText(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { try { var action = pluginInterface.Data.Excel.GetSheet <Action>().GetRow(TankStanceActions[pluginInterface.ClientState.LocalPlayer.ClassJob.Id]); return($"盾姿未开启: {action.Name}"); } catch { return("盾姿未开启"); } }
public virtual ushort GetIconID(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return(0); }
public virtual bool HasClickHandle(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { return(false); }
public override bool ShouldShow(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { if (!petJobs.Contains(pluginInterface.ClientState.LocalPlayer.ClassJob.Id)) { return(false); } if (pluginInterface.ClientState.LocalPlayer.ClassJob.Id == 28 && plugin.ActorsWithStatus.ContainsKey(791) && plugin.ActorsWithStatus[791].Contains(pluginInterface.ClientState.LocalPlayer)) { return(false); } if (pluginInterface.ClientState.Actors.Any(a => a.ObjectKind == ObjectKind.BattleNpc && a is BattleNpc bNpc && bNpc.OwnerId == pluginInterface.ClientState.LocalPlayer.ActorId)) { return(false); } return(true); }
public override ushort GetIconID(DalamudPluginInterface pluginInterface, RemindMe plugin, MonitorDisplay display) { try { return(pluginInterface.Data.Excel.GetSheet <Action>().GetRow(pluginInterface.ClientState.LocalPlayer.Level >= 40 ? 63U : 60U).Icon); } catch { return(0); } }
private List <DisplayTimer> GetTimerList(MonitorDisplay display) { var timerList = new List <DisplayTimer>(); if (InPvP) { return(timerList); } try { if (display.Cooldowns.Count > 0) { foreach (var cd in display.Cooldowns.Where(cd => { if (cd.ClassJob != PluginInterface.ClientState.LocalPlayer.ClassJob.Id) { return(false); } var action = ActionManager.GetAction(cd.ActionId, true); if (action == null || !action.ClassJobCategory.Value.HasClass(PluginInterface.ClientState.LocalPlayer.ClassJob.Id)) { return(false); } if (action.ClassJobLevel > PluginInterface.ClientState.LocalPlayer.Level) { return(false); } if (action.ClassJob.Row == 36 && !BlueMagicSpellbook.Contains(action.RowId)) { return(false); } var cooldown = ActionManager.GetActionCooldown(action); if (display.OnlyShowReady && cooldown.IsOnCooldown) { return(false); } if (display.OnlyShowCooldown && !cooldown.IsOnCooldown) { return(false); } if (display.LimitDisplayTime && cooldown.Countdown > display.LimitDisplayTimeSeconds) { return(false); } if (display.LimitDisplayReadyTime && cooldown.CompleteFor > display.LimitDisplayReadyTimeSeconds) { return(false); } if (actionSpecialChecks.ContainsKey(action.RowId)) { if (!actionSpecialChecks[action.RowId](display, cd, PluginInterface)) { return(false); } } return(true); })) { var action = ActionManager.GetAction(cd.ActionId); if (action != null) { var cooldown = ActionManager.GetActionCooldown(action); timerList.Add(new DisplayTimer { TimerMax = cooldown.CooldownTotal, TimerCurrent = cooldown.CooldownElapsed + cooldown.CompleteFor, FinishedColor = display.AbilityReadyColor, ProgressColor = display.AbilityCooldownColor, IconId = IconManager.GetActionIconId(action), Name = action.Name }); } } } } catch (Exception ex) { PluginLog.LogError("Error parsing cooldowns."); PluginLog.Log(ex.ToString()); } try { if (display.StatusMonitors.Count > 0) { var localPlayerAsList = new List <Actor>() { PluginInterface.ClientState.LocalPlayer }; foreach (var sd in display.StatusMonitors.Where(sm => sm.ClassJob == PluginInterface.ClientState.LocalPlayer.ClassJob.Id)) { foreach (var sid in sd.StatusIDs) { var status = PluginInterface.Data.Excel.GetSheet <Status>().GetRow(sid); if (status == null) { continue; } if (!ActorsWithStatus.ContainsKey(status.RowId)) { continue; } foreach (var a in sd.SelfOnly ? localPlayerAsList : ActorsWithStatus[status.RowId]) { if (a != null) { foreach (var se in a.StatusEffects) { if (sd.IsRaid == false && se.OwnerId != PluginInterface.ClientState.LocalPlayer.ActorId) { continue; } if (sd.LimitedZone > 0 && sd.LimitedZone != PluginInterface.ClientState.TerritoryType) { continue; } if (display.LimitDisplayTime && se.Duration > display.LimitDisplayTimeSeconds) { continue; } if (se.EffectId == (short)status.RowId) { var t = new DisplayTimer { TimerMax = sd.MaxDuration, TimerCurrent = sd.MaxDuration <= 0 ? (1 + generalStopwatch.ElapsedMilliseconds / 1000f) : (sd.MaxDuration - se.Duration), FinishedColor = display.AbilityReadyColor, ProgressColor = display.StatusEffectColor, IconId = (ushort)(status.Icon + (sd.Stacking ? se.StackCount - 1 : 0)), Name = status.Name, AllowCountdown = sd.MaxDuration > 0, StackCount = sd.Stacking ? se.StackCount : -1, }; if (!sd.SelfOnly) { t.TargetName = a.Name; t.TargetNameOnly = display.StatusOnlyShowTargetName; t.ClickAction = sd.ClickHandler; t.ClickParam = a; } timerList.Add(t); } } } } } } } } catch (Exception ex) { PluginLog.LogError("Error parsing statuses."); PluginLog.Log(ex.ToString()); } timerList.Sort((a, b) => { var diff = a.TimerRemaining - b.TimerRemaining; if (Math.Abs(diff) < 0.1) { return(string.CompareOrdinal(a.Name, b.Name)); // Equal } if (diff < 0) { return(-1); } return(1); }); foreach (var reminder in display.GeneralReminders) { if (reminder.ShouldShow(PluginInterface, this, display)) { timerList.Insert(0, new DisplayTimer { TimerMax = 1, TimerCurrent = 1 + generalStopwatch.ElapsedMilliseconds / 1000f, FinishedColor = display.AbilityReadyColor, ProgressColor = display.StatusEffectColor, IconId = reminder.GetIconID(PluginInterface, this, display), Name = reminder.GetText(PluginInterface, this, display), AllowCountdown = false }); } } return(timerList); }
private void DrawDisplayVertical(MonitorDisplay display, List <DisplayTimer> timerList) { if (display.DirectionRtL) { ImGui.SetCursorPosX(ImGui.GetWindowWidth() - (display.RowSize + ImGui.GetStyle().WindowPadding.X)); } ImGui.SetWindowFontScale(display.TextScale); var barSize = new Vector2(display.RowSize, ImGui.GetWindowHeight() - ImGui.GetStyle().WindowPadding.Y * 2); foreach (var timer in timerList) { var cPosX = ImGui.GetCursorPosX(); var cPosY = ImGui.GetCursorPosY(); var fraction = (float)(timer.TimerCurrent + display.CacheAge.TotalSeconds) / timer.TimerMax; if (display.LimitDisplayTime && timer.TimerMax > display.LimitDisplayTimeSeconds) { fraction = (float)(display.LimitDisplayTimeSeconds - timer.TimerRemaining + display.CacheAge.TotalSeconds) / display.LimitDisplayTimeSeconds; } if (display.FillToComplete && fraction < 1) { fraction = 1 - fraction; } ImGui.BeginGroup(); var drawList = ImGui.GetWindowDrawList(); var barTopLeft = ImGui.GetCursorScreenPos(); var barBottomRight = ImGui.GetCursorScreenPos() + barSize; var hovered = false; if (display.AllowClicking && timer.ClickAction != null) { // Check Mouse Position var mouse = ImGui.GetMousePos(); var pos1 = ImGui.GetCursorScreenPos(); var pos2 = ImGui.GetCursorScreenPos() + barSize; if (mouse.X > pos1.X && mouse.X < pos2.X && mouse.Y > pos1.Y && mouse.Y < pos2.Y) { display.IsClickableHovered = true; hovered = true; ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); } } DrawBar(barTopLeft, barSize, 1 - fraction, display.ReverseFill ? FillDirection.FromTop : FillDirection.FromBottom, GetBarBackgroundColor(display, timer), timer.ProgressColor); var iconSize = new Vector2(display.RowSize) * display.ActionIconScale; if (display.ShowActionIcon) { if (timer.IconId > 0) { var icon = IconManager.GetIconTexture(timer.IconId); if (icon != null) { iconSize *= new Vector2((float)icon.Width / Math.Max(icon.Width, icon.Height), (float)icon.Height / Math.Max(icon.Width, icon.Height)); if (display.ReverseSideIcon) { ImGui.SetCursorPosY(cPosY + (barSize.X - iconSize.X) / 2); } else { ImGui.SetCursorPosY(cPosY + barSize.Y - iconSize.Y - (barSize.X - iconSize.X) / 2); } ImGui.SetCursorPosX(cPosX + (display.RowSize / 2f) - (iconSize.X / 2)); ImGui.Image(icon.ImGuiHandle, iconSize); } } } if (timer.AllowCountdown && display.ShowCountdown && (!timer.IsComplete || display.ShowCountdownReady)) { var countdownValue = Math.Abs(timer.TimerRemaining - display.CacheAge.TotalSeconds); var countdownText = countdownValue.ToString(countdownValue >= 100 ? "F0" : "F1"); var countdownSize = ImGui.CalcTextSize(countdownText); if (display.ReverseCountdownSide) { ImGui.SetCursorPosY(cPosY + barSize.Y - (display.RowSize / 2f) - countdownSize.Y / 2); } else { ImGui.SetCursorPosY(cPosY + (display.RowSize / 2f) - countdownSize.Y / 2); } ImGui.SetCursorPosX(cPosX + (display.RowSize / 2f) - (countdownSize.X / 2)); if (display.ShowActionIcon && display.ReverseCountdownSide != display.ReverseSideIcon) { TextShadowed(countdownText, display.TextColor, new Vector4(0, 0, 0, 0.5f), 2); } else { ImGui.TextColored(display.TextColor, countdownText); } } if (display.ShowSkillName) { var size = ImGui.CalcTextSize(timer.Name); ImGui.SetCursorPosX(cPosX + display.RowSize / 2f - size.Y / 2); ImGui.SetCursorPosY(ImGui.GetWindowHeight() - (display.RowSize + (size.X * display.TextScale) + ImGui.GetStyle().ItemSpacing.X)); AddTextVertical(timer.Name, ImGui.GetColorU32(display.TextColor), display.TextScale); } if (hovered) { drawList.AddRect(barTopLeft, barBottomRight, 0xFF0000FF); drawList.AddRect(barTopLeft + Vector2.One, barBottomRight - Vector2.One, 0xFF0000FF); } ImGui.EndGroup(); if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) { timer.ClickAction?.Invoke(this, timer.ClickParam); } ImGui.SameLine(); if (display.DirectionRtL) { ImGui.SetCursorPosX(cPosX - display.RowSize - display.BarSpacing); } else { ImGui.SetCursorPosX(cPosX + display.RowSize + display.BarSpacing); } if (ImGui.GetCursorPosX() + display.RowSize > ImGui.GetWindowWidth()) { return; } } }