212 lines
6.1 KiB
C#
212 lines
6.1 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using System.Linq;
|
|
using System.IO;
|
|
|
|
using Barotrauma;
|
|
using HarmonyLib;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using QICrabUI;
|
|
using QIDependencyInjection;
|
|
|
|
namespace QuickInteractions
|
|
{
|
|
public class QuickInteractionsUI : CUIFrame
|
|
{
|
|
public static string SavePath => Path.Combine(Mod.Instance.Paths.DataUI, "QuickInteractionsUI.xml");
|
|
[Dependency] public GameStageTracker GameStageTracker { get; set; }
|
|
[Dependency] public Logger Logger { get; set; }
|
|
[Dependency] public Debugger Debugger { get; set; }
|
|
[Dependency] public QuickTalk QuickTalk { get; set; }
|
|
[Dependency] public Fabricators Fabricators { get; set; }
|
|
[Dependency] public Debouncer Debouncer { get; set; }
|
|
|
|
private bool textVisible;
|
|
public bool TextVisible
|
|
{
|
|
get => textVisible;
|
|
set
|
|
{
|
|
if (textVisible == value) return;
|
|
textVisible = value;
|
|
|
|
//BackgroundColor = value ? new Color(0, 0, 0, 150) : Color.Transparent;
|
|
|
|
UpdateAnchor();
|
|
this["layout"].Children.ForEach(c =>
|
|
{
|
|
if (c is QuickTalkButton qtb) qtb.TextVisible = value;
|
|
if (c is FabricatorButton fb) fb.TextVisible = value;
|
|
});
|
|
}
|
|
}
|
|
|
|
public CUIDirection ButtonDirection => Real.Left < CUI.GameScreenSize.X / 2.0f ? CUIDirection.Straight : CUIDirection.Reverse;
|
|
|
|
public void UpdateAnchor()
|
|
{
|
|
bool onTheLeft = Real.Left < CUI.GameScreenSize.X / 2.0f;
|
|
if (onTheLeft)
|
|
{
|
|
if (Anchor == CUIAnchor.BottomRight)
|
|
{
|
|
Anchor = CUIAnchor.BottomLeft;
|
|
Absolute = Absolute with { Left = Real.Left };
|
|
}
|
|
BackgroundSprite.Effects = SpriteEffects.None;
|
|
}
|
|
else
|
|
{
|
|
if (Anchor == CUIAnchor.BottomLeft)
|
|
{
|
|
Anchor = CUIAnchor.BottomRight;
|
|
Absolute = Absolute with { Left = (Real.Left + Real.Width) - CUI.GameScreenSize.X };
|
|
}
|
|
BackgroundSprite.Effects = SpriteEffects.FlipHorizontally;
|
|
}
|
|
}
|
|
public void CreateUI()
|
|
{
|
|
OutlineColor = Color.Transparent;
|
|
BackgroundColor = new Color(255, 255, 255, 255);//Color.Transparent;
|
|
BackgroundSprite = CUI.TextureManager.GetCUISprite(4, 1);
|
|
Absolute = new CUINullRect(y: -50);
|
|
Anchor = CUIAnchor.BottomLeft;
|
|
Relative = new CUINullRect(-0.5f, 0);
|
|
Resizible = false;
|
|
FitContent = new CUIBool2(true, true);
|
|
//DragHandle.DragRelative = true;
|
|
DragHandle.OutputRealPos = true;
|
|
|
|
this["layout"] = new CUIVerticalList()
|
|
{
|
|
Relative = new CUINullRect(0, 0, 1, 1),
|
|
FitContent = new CUIBool2(true, true),
|
|
Scrollable = true,
|
|
BreakSerialization = true,
|
|
BottomGap = 0,
|
|
};
|
|
|
|
//SaveToFile(SavePath);
|
|
LoadSelfFromFile(SavePath);
|
|
}
|
|
|
|
public override void Hydrate()
|
|
{
|
|
OnDrag += (x, y) =>
|
|
{
|
|
bool onTheLeft = x < CUI.GameScreenSize.X / 2.0f;
|
|
|
|
if (onTheLeft && BackgroundSprite.Effects == SpriteEffects.FlipHorizontally)
|
|
{
|
|
BackgroundSprite.Effects = SpriteEffects.None;
|
|
}
|
|
if (!onTheLeft && BackgroundSprite.Effects == SpriteEffects.None)
|
|
{
|
|
BackgroundSprite.Effects = SpriteEffects.FlipHorizontally;
|
|
}
|
|
|
|
//UpdateAnchor();
|
|
this["layout"].Children.ForEach(c =>
|
|
{
|
|
if (c is CUIHorizontalList button)
|
|
{
|
|
button.Direction = onTheLeft ? CUIDirection.Straight : CUIDirection.Reverse;
|
|
}
|
|
});
|
|
};
|
|
|
|
OnMouseOn += (e) => TextVisible = MouseOver;
|
|
OnMouseOff += (e) => TextVisible = MouseOver;
|
|
|
|
AddCommand("interact", (o) =>
|
|
{
|
|
if (o is Character character)
|
|
{
|
|
QuickTalk.InteractWith(character);
|
|
}
|
|
|
|
if (o is Item item)
|
|
{
|
|
Fabricators.SelectItem(item);
|
|
}
|
|
});
|
|
}
|
|
|
|
public void AfterInject()
|
|
{
|
|
Mod.Instance.OnPluginLoad += () => { Revealed = Utils.IsThisAnOutpost; Refresh(); };
|
|
Mod.Instance.OnPluginUnload += () => { SaveToFile(SavePath); };
|
|
|
|
GameStageTracker.OnRoundStart += () => { Revealed = Utils.IsThisAnOutpost; ScheduleRefresh(500); }; // bruh
|
|
GameStageTracker.OnRoundStartOrInitialize += () => { Revealed = Utils.IsThisAnOutpost; ScheduleRefresh(500); };
|
|
GameStageTracker.OnRoundEnd += () => Revealed = false;
|
|
|
|
QuickTalk.CharacterStatusUpdated += (c) => Refresh();
|
|
|
|
CreateUI();
|
|
}
|
|
|
|
public void ScheduleRefresh(int delay = 100)
|
|
{
|
|
Debugger.Log("ScheduleRefresh", DebugLevel.UIRefresh);
|
|
GameMain.LuaCs.Timer.Wait((object[] args) => Refresh(), delay);
|
|
}
|
|
|
|
public void Refresh()
|
|
{
|
|
if (!Revealed) return;
|
|
|
|
Debouncer.Debounce("refresh", 100, () =>
|
|
{
|
|
try
|
|
{
|
|
if (this["layout"] == null) return;
|
|
|
|
if (GUI.DisableHUD)
|
|
{
|
|
ScheduleRefresh(500);
|
|
return;
|
|
}
|
|
Debugger.Log("Refresh", DebugLevel.UIRefresh);
|
|
|
|
bool onTheLeft = Real.Left < CUI.GameScreenSize.X / 2.0f;
|
|
|
|
this["layout"].RemoveAllChildren();
|
|
|
|
foreach (Character character in QuickTalk.WantToTalk)
|
|
{
|
|
this["layout"].Append(new QuickTalkButton(character, ButtonDirection));
|
|
}
|
|
|
|
foreach (Character character in QuickTalk.Merchants)
|
|
{
|
|
this["layout"].Append(new QuickTalkButton(character, ButtonDirection));
|
|
}
|
|
|
|
if (Fabricators.OutpostFabricator != null)
|
|
{
|
|
this["layout"].Append(new FabricatorButton(Fabricators.OutpostFabricator, ButtonDirection));
|
|
}
|
|
|
|
if (Fabricators.OutpostMedFabricator != null)
|
|
{
|
|
this["layout"].Append(new FabricatorButton(Fabricators.OutpostMedFabricator, ButtonDirection));
|
|
}
|
|
|
|
if (Fabricators.OutpostDeconstructor != null)
|
|
{
|
|
this["layout"].Append(new FabricatorButton(Fabricators.OutpostDeconstructor, ButtonDirection));
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
|
|
}
|
|
});
|
|
}
|
|
}
|
|
} |