Skip to content
This repository has been archived by the owner on Feb 19, 2022. It is now read-only.

Fix custom hats #310

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions source/Patches/CustomHats/CustomHatPatch.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using HarmonyLib;
using Reactor.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using HarmonyLib;
using Reactor.Extensions;
using TMPro;
using UnityEngine;
using Object = UnityEngine.Object;
Expand All @@ -21,39 +21,42 @@ public static void Postfix(HatsTab __instance)

foreach (var hat in allHats)
{
if (!hatGroups.ContainsKey(hat.StoreName))
if (!hatGroups.ContainsKey(hat.StoreName))
hatGroups[hat.StoreName] = new List<HatBehaviour>();
hatGroups[hat.StoreName].Add(hat);
}

foreach (ColorChip instanceColorChip in __instance.ColorChips)
foreach (ColorChip instanceColorChip in __instance.ColorChips)
instanceColorChip.gameObject.Destroy();

__instance.ColorChips.Clear();


var groupNameText = __instance.transform.parent.parent.GetComponentInChildren<GameSettingMenu>(true).GetComponentInChildren<TextMeshPro>(true);


var groupNameText = __instance.transform.parent.parent
.GetComponentInChildren<GameSettingMenu>(true)
.GetComponentInChildren<TextMeshPro>(true);

int hatIdx = 0;
foreach ((string groupName, List<HatBehaviour> hats) in hatGroups)
{
var text = Object.Instantiate(groupNameText.gameObject);
text.transform.localScale = Vector3.one;
text.transform.parent = __instance.scroller.Inner;
text.transform.SetParent(__instance.scroller.Inner);

var tmp = text.GetComponent<TextMeshPro>();
tmp.text = groupName;
tmp.alignment = TextAlignmentOptions.Center;
tmp.fontSize = 3f;
tmp.enableAutoSizing = true;
tmp.fontSizeMax = 3f;
tmp.fontSizeMin = 0f;

hatIdx = (hatIdx + 3) / 4 * 4;

float xLerp = __instance.XRange.Lerp(0.5f);
float yLerp = __instance.YStart - (hatIdx / __instance.NumPerRow) * __instance.YOffset;
text.transform.localPosition = new Vector3(xLerp, yLerp, -1f);

hatIdx += 4;
foreach (var hat in hats.OrderBy(HatManager.Instance.GetIdFromHat))
{
Expand All @@ -70,7 +73,7 @@ public static void Postfix(HatsTab __instance)
}

}

__instance.scroller.YBounds.max = -(__instance.YStart - (hatIdx + 1) / __instance.NumPerRow * __instance.YOffset) - 3f;
}
}
Expand Down
56 changes: 37 additions & 19 deletions source/Patches/CustomHats/HatLoader.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
extern alias Il2CppNewtonsoft;
using BepInEx.Logging;
using Il2CppNewtonsoft::Newtonsoft.Json;
using Il2CppNewtonsoft::Newtonsoft.Json.Linq;
using Reactor;
using Reactor.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using BepInEx.Logging;
using Newtonsoft.Json;
using Reactor;
using Reactor.Extensions;
using UnhollowerBaseLib;
using UnityEngine;

namespace TownOfUs.Patches.CustomHats
Expand All @@ -24,9 +28,7 @@ internal static void LoadHats()
Log.LogMessage($"Generating Hats from namespace {HAT_RESOURCE_NAMESPACE}");
try
{
var hatJson = LoadJson();

var hatBehaviours = DiscoverHatBehaviours(hatJson);
var hatBehaviours = DiscoverHatBehaviours(LoadJson());

DestroyableSingleton<HatManager>.Instance.AllHats.ForEach(
(Action<HatBehaviour>)(x => x.StoreName = "Vanilla")
Expand All @@ -36,25 +38,43 @@ internal static void LoadHats()
hatBehaviours[i].Order = HAT_ORDER_BASELINE + i;
HatManager.Instance.AllHats.Add(hatBehaviours[i]);
}

}
catch (Exception e)
{
Log.LogError($"Error while loading hats: {e.Message}\nStack: {e.StackTrace}");
}
}

private static HatMetadataJson LoadJson()
private static List<HatMetadataElement> LoadJson()
{
var element = new List<HatMetadataElement>();

var stream = Assembly.GetManifestResourceStream($"{HAT_RESOURCE_NAMESPACE}.{HAT_METADATA_JSON}");
return JsonConvert.DeserializeObject<HatMetadataJson>(Encoding.UTF8.GetString(stream.ReadFully()));
var streamContent = Encoding.UTF8.GetString(stream.ReadFully());
var obj = JObject.Parse(streamContent);

for (var json = obj["credits"].First; json != null; json = json.Next)
{
var hatdatas = new HatMetadataElement
{
Id = (string)json["id"],
Name = (string)json["name"] ?? string.Empty,
Artist = (string)json["artist"] ?? string.Empty
};

if (hatdatas.Id != null)
element.Add(hatdatas);
}

return element;
}

private static List<HatBehaviour> DiscoverHatBehaviours(HatMetadataJson metadata)
private static List<HatBehaviour> DiscoverHatBehaviours(List<HatMetadataElement> metadata)
{
var hatBehaviours = new List<HatBehaviour>();

foreach (var hatCredit in metadata.Credits)
foreach (var hatCredit in metadata)
{
try
{
Expand All @@ -69,9 +89,8 @@ private static List<HatBehaviour> DiscoverHatBehaviours(HatMetadataJson metadata
}
catch (Exception e)
{
// Log.LogError(
// $"Error loading hat {hatCredit.Id} in metadata file ({HAT_METADATA_JSON})");
// Log.LogError($"{e.Message}\nStack:{e.StackTrace}");
Log.LogError($"Error loading hat {hatCredit.Id} in metadata file ({HAT_METADATA_JSON})");
Log.LogError($"{e.Message}\nStack:{e.StackTrace}");
}
}

Expand All @@ -80,13 +99,12 @@ private static List<HatBehaviour> DiscoverHatBehaviours(HatMetadataJson metadata

private static HatBehaviour GenerateHatBehaviour(byte[] mainImg)
{

//TODO: Move to Graphics Utils class
// TODO: Move to Graphics Utils class
var tex2D = new Texture2D(1, 1, TextureFormat.ARGB32, false);
TownOfUs.LoadImage(tex2D, mainImg, false);
var sprite = Sprite.Create(tex2D, new Rect(0.0f, 0.0f, tex2D.width, tex2D.height), new Vector2(0.5f, 0.5f), 100);


var hat = ScriptableObject.CreateInstance<HatBehaviour>();
hat.MainImage = sprite;
hat.ChipOffset = new Vector2(-0.1f, 0.35f);
Expand Down
7 changes: 0 additions & 7 deletions source/Patches/CustomHats/HatMetadataJson.cs

This file was deleted.

Loading