Skip to content

Commit

Permalink
Merge pull request #10 from CitiesSkylinesMods/v_0.6
Browse files Browse the repository at this point in the history
Version 0.6
  • Loading branch information
krzychu124 authored May 16, 2021
2 parents 0b32df5 + 65b9cad commit c9b41ca
Show file tree
Hide file tree
Showing 18 changed files with 911 additions and 69 deletions.
65 changes: 65 additions & 0 deletions BrokenNodeDetector/BndResultHighlightManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System.Collections.Generic;
using BrokenNodeDetector.Highlighter;
using UnityEngine;

namespace BrokenNodeDetector {
public class BndResultHighlightManager: SimulationManagerBase<BndResultHighlightManager, ResultHighlightProperties>, IRenderableManager {
private static bool _instantiated;

private static BndResultHighlightManager _instance;

private IHighlightable _highlightable;

private Dictionary<HighlightType, IHighlightable> _highlightables = new Dictionary<HighlightType, IHighlightable>();
private void Awake() {
_highlightables = new Dictionary<HighlightType, IHighlightable> {
{HighlightType.Building, new BuildingHighlight()},
{HighlightType.Segment, new SegmentHighlight()},
{HighlightType.PTStop, new PTStopHighlight()},
{HighlightType.Node, new BrokenNodeHighlight()}
};
_instantiated = true;
}

private void OnDestroy() {
_instance = null;
_instantiated = false;
_highlightables.Clear();
}

private void OnDisable() {
_highlightable?.SetHighlightData(default);
}

public void Highlight(HighlightData data) {
if (data.Type == HighlightType.Unknown) return;

Debug.Log($"Highlighting " + data);
EnsureHighlighter(data);
enabled = true;
}

private void EnsureHighlighter(HighlightData data) {
if (_highlightable == null) {
_highlightable = _highlightables[data.Type];
} else {
if (_highlightable.Type != data.Type) {
_highlightable.SetHighlightData(default);
_highlightable = _highlightables[data.Type];
}
}
_highlightable.SetHighlightData(data);
}

protected override void BeginOverlayImpl(RenderManager.CameraInfo cameraInfo) {
base.BeginOverlayImpl(cameraInfo);
if (!IsInstanceValid()) return;

_highlightable.Render(cameraInfo);
}

private bool IsInstanceValid() {
return _highlightable != null && _highlightable.IsValid;
}
}
}
7 changes: 5 additions & 2 deletions BrokenNodeDetector/BrokenNodeDetector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
namespace BrokenNodeDetector
{
public class BrokenNodeDetector : IUserMod {
public static readonly string Version = "0.5";
public static readonly string Version = "0.6";

public string Name => "Broken Node Detector " + Version;

Expand All @@ -15,14 +15,17 @@ public class BrokenNodeDetector : IUserMod {
public void OnEnabled() {
Debug.Log($"[BND] Broken Node Detector enabled. Version {Version}");
HarmonyHelper.EnsureHarmonyInstalled();
Keybinds.Ensure();
ModSettings.Ensure();
#if DEBUG
LoadingExtension.Patcher.PatchAll();
#endif
}

public void OnDisabled() {
Debug.Log("[BND] Broken Node Detector disabled.");
if (LoadingExtension.MainUi) {
Object.Destroy(LoadingExtension.MainUi);
}
#if DEBUG
LoadingExtension.Patcher.UnpatchAll();
#endif
Expand Down
21 changes: 14 additions & 7 deletions BrokenNodeDetector/BrokenNodeDetector.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,25 +35,32 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="BrokenNodeDetector.cs" />
<Compile Include="Keybinds.cs" />
<Compile Include="Highlighter\BrokenNodeHighlight.cs" />
<Compile Include="Highlighter\BuildingHighlight.cs" />
<Compile Include="Highlighter\IHighlightable.cs" />
<Compile Include="Highlighter\PTStopHighlight.cs" />
<Compile Include="Highlighter\SegmentHighlight.cs" />
<Compile Include="ModSettings.cs" />
<Compile Include="LoadingExtension.cs" />
<Compile Include="ModService.cs" />
<Compile Include="Patch\_NetNode\UpdateLaneConnectionPatch.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ResultHighlight.cs" />
<Compile Include="BndResultHighlightManager.cs" />
<Compile Include="UI\MainPanel.cs" />
<Compile Include="UI\MainUI.cs" />
<Compile Include="UI\SettingsUI.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="0Harmony, Version=2.0.1.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Lib.Harmony.2.0.1\lib\net35\0Harmony.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\Dependencies\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="CitiesHarmony.API, Version=1.0.5.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\CitiesHarmony.API.1.0.5\lib\net35\CitiesHarmony.API.dll</HintPath>
<Reference Include="CitiesHarmony.API, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\CitiesHarmony.API.2.0.0\lib\net35\CitiesHarmony.API.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="CitiesHarmony.Harmony, Version=2.0.4.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\CitiesHarmony.Harmony.2.0.4\lib\net35\CitiesHarmony.Harmony.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ColossalManaged, Version=0.3.0.0, Culture=neutral, PublicKeyToken=null">
Expand Down
52 changes: 52 additions & 0 deletions BrokenNodeDetector/Highlighter/BrokenNodeHighlight.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using ColossalFramework.Math;
using UnityEngine;

namespace BrokenNodeDetector.Highlighter {
public class BrokenNodeHighlight: IHighlightable {
private HighlightData _data;
public bool IsValid => IsValidData();
public HighlightType Type => HighlightType.Node;

public void SetHighlightData(HighlightData data) {
_data = data;
}

public void Render(RenderManager.CameraInfo cameraInfo) {
if (!IsValidData()) return;

NetManager manager = NetManager.instance;
for (int i = 0; i < 8; i++) {

uint segmentId = manager.m_nodes.m_buffer[_data.NodeID].GetSegment(i);
if (segmentId == 0)
continue;
ref NetSegment segment = ref manager.m_segments.m_buffer[segmentId];
Color color = Color.white;
color.a = 0.8f;
Bezier3 bezier;
bezier.a = NetManager.instance.m_nodes.m_buffer[segment.m_startNode].m_position;
bezier.d = NetManager.instance.m_nodes.m_buffer[segment.m_endNode].m_position;
NetSegment.CalculateMiddlePoints(bezier.a, segment.m_startDirection, bezier.d, segment.m_endDirection, false, false, out bezier.b, out bezier.c);
Bounds bounds = bezier.GetBounds();
RenderManager.instance.OverlayEffect.DrawBezier(cameraInfo, color, bezier, segment.Info.m_halfWidth * 2f, -100f, -100f, bounds.min.y - 10f, bounds.max.y + 10f, false, true);
}

ref NetNode node = ref manager.m_nodes.m_buffer[_data.NodeID];
Color nodeColor = Color.red;
nodeColor.a = 0.8f;
RenderManager.instance.OverlayEffect.DrawCircle(cameraInfo, nodeColor, node.m_position, node.m_bounds.size.x, node.m_position.y - 30f, node.m_position.y + 30f, true, false);
}

public bool IsValidData() {
if (_data != null && _data.Type == HighlightType.Node && _data.NodeID != 0) {
if ((NetManager.instance.m_nodes.m_buffer[_data.NodeID].m_flags & NetNode.Flags.Created) != 0) {
return true;
}

_data.Reset(Type);
}

return false;
}
}
}
39 changes: 39 additions & 0 deletions BrokenNodeDetector/Highlighter/BuildingHighlight.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using UnityEngine;

namespace BrokenNodeDetector.Highlighter {
public class BuildingHighlight : IHighlightable {
private HighlightData _data;
public bool IsValid => IsValidData();
public HighlightType Type => HighlightType.Building;

public void SetHighlightData(HighlightData data) {
_data = data;
}

public void Render(RenderManager.CameraInfo cameraInfo) {
if (!IsValidData()) return;

BuildingManager buildingManager = BuildingManager.instance;
uint buildingId = _data.BuildingID;
BuildingInfo info = buildingManager.m_buildings.m_buffer[buildingId].Info;
int length = buildingManager.m_buildings.m_buffer[buildingId].Length;
Vector3 position = buildingManager.m_buildings.m_buffer[buildingId].m_position;
float angle = buildingManager.m_buildings.m_buffer[buildingId].m_angle;
Color color = Color.red;
color.a = 0.7f;
BuildingTool.RenderOverlay(cameraInfo, info, length, position, angle, color, false);
}

private bool IsValidData() {
if (_data != null && _data.Type == HighlightType.Building && _data.BuildingID != 0) {
if ((BuildingManager.instance.m_buildings.m_buffer[_data.BuildingID].m_flags & Building.Flags.Created) != 0) {
return true;
}

_data.Reset(Type);
}

return false;
}
}
}
12 changes: 12 additions & 0 deletions BrokenNodeDetector/Highlighter/IHighlightable.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace BrokenNodeDetector.Highlighter {
public interface IHighlightable {
bool IsValid { get; }

HighlightType Type { get; }

void SetHighlightData(HighlightData data);

void Render( RenderManager.CameraInfo cameraInfo);
}

}
34 changes: 34 additions & 0 deletions BrokenNodeDetector/Highlighter/PTStopHighlight.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using UnityEngine;

namespace BrokenNodeDetector.Highlighter {
public class PTStopHighlight: IHighlightable {
private HighlightData _data;
public bool IsValid => IsValidData();
public HighlightType Type => HighlightType.PTStop;

public void SetHighlightData(HighlightData data) {
_data = data;
}

public void Render(RenderManager.CameraInfo cameraInfo) {
if (!IsValidData()) return;

NetNode node = NetManager.instance.m_nodes.m_buffer[_data.NodeID];
Color color = Color.red;
color.a = 0.7f;
RenderManager.instance.OverlayEffect.DrawCircle(cameraInfo, color, node.m_position, node.m_bounds.size.x, node.m_position.y - 20f, node.m_position.y + 20f, false, false);
}

private bool IsValidData() {
if (_data != null && _data.Type == HighlightType.PTStop && _data.NodeID != 0) {
if ((NetManager.instance.m_nodes.m_buffer[_data.NodeID].m_flags & NetNode.Flags.Created) != 0) {
return true;
}

_data.Reset(Type);
}

return false;
}
}
}
42 changes: 42 additions & 0 deletions BrokenNodeDetector/Highlighter/SegmentHighlight.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using ColossalFramework.Math;
using UnityEngine;

namespace BrokenNodeDetector.Highlighter {
public class SegmentHighlight : IHighlightable {
private HighlightData _data;
public bool IsValid => IsValidData();
public HighlightType Type => HighlightType.Segment;

public void SetHighlightData(HighlightData data) {
_data = data;
}

public void Render(RenderManager.CameraInfo cameraInfo) {
if (!IsValidData()) return;

NetManager netManager = NetManager.instance;
ref NetSegment segment = ref netManager.m_segments.m_buffer[_data.SegmentID];
Color color = Color.red;
color.a = 0.7f;

Bezier3 bezier;
bezier.a = NetManager.instance.m_nodes.m_buffer[segment.m_startNode].m_position;
bezier.d = NetManager.instance.m_nodes.m_buffer[segment.m_endNode].m_position;
NetSegment.CalculateMiddlePoints(bezier.a, segment.m_startDirection, bezier.d, segment.m_endDirection, false, false, out bezier.b, out bezier.c);
Bounds bounds = bezier.GetBounds();
RenderManager.instance.OverlayEffect.DrawBezier(cameraInfo, color, bezier, segment.Info.m_halfWidth * 2f, -100f, -100f, bounds.min.y - 10f, bounds.max.y + 10f, false, true);
}

private bool IsValidData() {
if (_data != null && _data.Type == HighlightType.Segment && _data.SegmentID != 0) {
if ((NetManager.instance.m_segments.m_buffer[_data.SegmentID].m_flags & NetSegment.Flags.Created) != NetSegment.Flags.None) {
return true;
}

_data.Reset(Type);
}

return false;
}
}
}
18 changes: 0 additions & 18 deletions BrokenNodeDetector/Keybinds.cs

This file was deleted.

2 changes: 1 addition & 1 deletion BrokenNodeDetector/LoadingExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private void RevertDetours() {
}

internal static class Patcher {
private const string HarmonyId = "yourname.YourModName";
private const string HarmonyId = "krzychu124.broken-node-detector";
private static bool patched = false;

public static void PatchAll() {
Expand Down
Loading

0 comments on commit c9b41ca

Please sign in to comment.