Skip to content

Commit

Permalink
Merge branch 'main' into enable-nullable
Browse files Browse the repository at this point in the history
  • Loading branch information
Hamunii committed Jul 31, 2024
2 parents b25499c + 820ff7e commit 3cc9221
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 18 deletions.
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,50 @@
**Changelog**
--

**<details><summary>Version 1.3.8</summary>**

**<details><summary>Features</summary>**

* Added interior selection history to DayHistory

</details>

</details>

**<details><summary>Version 1.3.7</summary>**

**<details><summary>Fixes</summary>**

* Added additional safety checks to ExtendedFootstepSurface patches

</details>

</details>

**<details><summary>Version 1.3.6</summary>**

**<details><summary>Features</summary>**

* Added content restoration support for basegame water shader

</details>

</details>

**<details><summary>Version 1.3.5</summary>**

**<details><summary>Fixes</summary>**

* Added safety checks to new FootstepSurface Material cache system.
* Added safety checks to new ExtendedLevel override fog size feature.
* Changed ContentRestoring of EnemyType's to use ScriptableObject name rather than enemyName
* Fixed issue where synced audio clip that plays when previewing enemy beastiary file was not playing for custom enemies
* Fixed issue where custom Enemy beastiary files did not have Info as a default keyword

</details>

</details>

**<details><summary>Version 1.3.4</summary>**

**<details><summary>Fixes</summary>**
Expand All @@ -10,6 +54,8 @@

</details>

</details>

**<details><summary>Version 1.3.3</summary>**

**<details><summary>Features</summary>**
Expand All @@ -18,6 +64,8 @@

</details>

</details>

**<details><summary>Version 1.3.2</summary>**

**<details><summary>Fixes</summary>**
Expand Down
4 changes: 4 additions & 0 deletions LethalLevelLoader/Components/ExtendedContent/ExtendedMod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ internal void UnregisterAllExtendedContent()
ExtendedEnemyTypes.Clear();
ExtendedWeatherEffects.Clear();
ExtendedFootstepSurfaces.Clear();
ExtendedStoryLogs.Clear();
ExtendedBuyableVehicles.Clear();
}

internal void SortRegisteredContent()
Expand All @@ -247,6 +249,8 @@ internal void SortRegisteredContent()
ExtendedEnemyTypes.Sort((s1, s2) => s1.name.CompareTo(s2.name));
ExtendedWeatherEffects.Sort((s1, s2) => s1.name.CompareTo(s2.name));
ExtendedFootstepSurfaces.Sort((s1, s2) => s1.name.CompareTo(s2.name));
ExtendedStoryLogs.Sort((s1, s2) => s1.name.CompareTo(s2.name));
ExtendedBuyableVehicles.Sort((s1, s2) => s1.name.CompareTo(s2.name));
}

internal void Example()
Expand Down
9 changes: 7 additions & 2 deletions LethalLevelLoader/General/Patches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -656,8 +656,13 @@ internal static void RoundManagerSpawnOutsideHazards_Prefix()
[HarmonyPostfix]
internal static void RoundManagerFinishGeneratingNewLevelClientRpc_Prefix()
{
LevelLoader.RefreshFootstepSurfaces();
LevelLoader.BakeSceneColliderMaterialData(RoundManager.dungeonGenerator.gameObject.scene);
if (TimeOfDay.sunAnimator != null)
{
LevelLoader.RefreshFootstepSurfaces();
LevelLoader.BakeSceneColliderMaterialData(TimeOfDay.sunAnimator.gameObject.scene);
if (LevelLoader.vanillaWaterShader != null)
LevelLoader.TryRestoreWaterShaders(TimeOfDay.sunAnimator.gameObject.scene);
}
}

/*
Expand Down
60 changes: 46 additions & 14 deletions LethalLevelLoader/Loaders/LevelLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using UnityEngine.AI;
using LethalLevelLoader.Tools;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;

namespace LethalLevelLoader
{
Expand Down Expand Up @@ -37,6 +38,7 @@ public static class LevelLoader
internal static Dictionary<string, FootstepSurface> activeExtendedFootstepSurfaceDictionary = new Dictionary<string, FootstepSurface>();
internal static LayerMask triggerMask;

internal static Shader vanillaWaterShader;

internal static async void EnableMeshColliders()
{
Expand Down Expand Up @@ -76,8 +78,10 @@ internal static void RefreshShipAnimatorClips(ExtendedLevel extendedLevel)

internal static void RefreshFogSize(ExtendedLevel extendedLevel)
{
dustCloudFog.parameters.size = extendedLevel.OverrideDustStormVolumeSize;
foggyFog.parameters.size = extendedLevel.OverrideFoggyVolumeSize;
if (dustCloudFog != null)
dustCloudFog.parameters.size = extendedLevel.OverrideDustStormVolumeSize;
if (foggyFog != null)
foggyFog.parameters.size = extendedLevel.OverrideFoggyVolumeSize;
}

internal static void RefreshFootstepSurfaces()
Expand All @@ -92,6 +96,22 @@ internal static void RefreshFootstepSurfaces()
Patches.StartOfRound.footstepSurfaces = activeFootstepSurfaces.ToArray();
}

internal static void TryRestoreWaterShaders(Scene scene)
{
List<Material> uniqueMaterials = new List<Material>();
foreach (MeshRenderer meshRenderer in Object.FindObjectsByType<MeshRenderer>(FindObjectsSortMode.None))
if (meshRenderer.gameObject.scene == scene)
foreach (Material sharedMaterial in meshRenderer.sharedMaterials)
{
if (sharedMaterial != null && !string.IsNullOrEmpty(sharedMaterial.name))
if (!uniqueMaterials.Contains(sharedMaterial))
uniqueMaterials.Add(sharedMaterial);
}

foreach (Material sharedMaterial in uniqueMaterials)
ContentRestorer.TryRestoreWaterShader(sharedMaterial);
}

internal static void BakeSceneColliderMaterialData(Scene scene)
{
cachedLevelColliderMaterialDictionary.Clear();
Expand All @@ -100,29 +120,35 @@ internal static void BakeSceneColliderMaterialData(Scene scene)

triggerMask = LayerMask.NameToLayer("Triggers");

List<Collider> allSceneColliders = new List<Collider>();
List<Collider> allValidSceneColliders = new List<Collider>();

foreach (GameObject rootObject in scene.GetRootGameObjects())
{
foreach (Collider collider in rootObject.GetComponents<Collider>())
{
if (ValidateCollider(collider) && !allSceneColliders.Contains(collider))
allSceneColliders.Add(collider);
if (ValidateCollider(collider) && !allValidSceneColliders.Contains(collider))
allValidSceneColliders.Add(collider);
}
foreach (Collider collider in rootObject.GetComponentsInChildren<Collider>())
{
if (ValidateCollider(collider) && !allSceneColliders.Contains(collider))
allSceneColliders.Add(collider);
if (ValidateCollider(collider) && !allValidSceneColliders.Contains(collider))
allValidSceneColliders.Add(collider);
}
}

foreach (Collider sceneCollider in allSceneColliders)
foreach (Collider sceneCollider in allValidSceneColliders)
{
if (sceneCollider.TryGetComponent(out MeshRenderer meshRenderer))
{
if (!cachedLevelColliderMaterialDictionary.ContainsKey(sceneCollider))
cachedLevelColliderMaterialDictionary.Add(sceneCollider, new List<Material>(meshRenderer.sharedMaterials));
List<Material> validMaterials = new List<Material>();
foreach (Material material in meshRenderer.sharedMaterials)
if (material != null && !string.IsNullOrEmpty(material.name))
validMaterials.Add(material);

if (!cachedLevelColliderMaterialDictionary.ContainsKey(sceneCollider))
cachedLevelColliderMaterialDictionary.Add(sceneCollider, new List<Material>(validMaterials));

foreach (Material material in validMaterials)
{
if (!cachedLevelMaterialColliderDictionary.ContainsKey(material.name))
cachedLevelMaterialColliderDictionary.Add(material.name, new List<Collider> { sceneCollider });
Expand Down Expand Up @@ -152,8 +178,9 @@ internal static Dictionary<string, FootstepSurface> GetActiveExtendedFoostepSurf

foreach (ExtendedFootstepSurface extendedFootstepSurface in LevelManager.CurrentExtendedLevel.ExtendedMod.ExtendedFootstepSurfaces)
foreach (Material material in extendedFootstepSurface.associatedMaterials)
if (!returnDict.ContainsKey(material.name))
returnDict.Add(material.name, extendedFootstepSurface.footstepSurface);
if (material != null && !string.IsNullOrEmpty(material.name))
if (!returnDict.ContainsKey(material.name))
returnDict.Add(material.name, extendedFootstepSurface.footstepSurface);


return (returnDict);
Expand All @@ -163,9 +190,14 @@ public static bool TryGetFootstepSurface(Collider collider, out FootstepSurface?
{
footstepSurface = null;

if (collider == null)
return (false);

if (cachedLevelColliderMaterialDictionary.TryGetValue(collider, out List<Material> materials))
foreach (Material material in materials)
activeExtendedFootstepSurfaceDictionary.TryGetValue(material.name, out footstepSurface);
if (materials != null)
foreach (Material material in materials)
if (material != null && !string.IsNullOrEmpty(material.name))
activeExtendedFootstepSurfaceDictionary.TryGetValue(material.name, out footstepSurface);

return (footstepSurface != null);
}
Expand Down
2 changes: 2 additions & 0 deletions LethalLevelLoader/Patches/LevelManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,7 @@ public static void LogDayHistory()
DayHistory newDayHistory = new DayHistory();
daysTotal++;

newDayHistory.allViableOptions = DungeonManager.GetValidExtendedDungeonFlows(CurrentExtendedLevel, false).Select(e => e.extendedDungeonFlow).ToList();
newDayHistory.extendedLevel = LevelManager.CurrentExtendedLevel;
newDayHistory.extendedDungeonFlow = DungeonManager.CurrentExtendedDungeonFlow;
newDayHistory.day = daysTotal;
Expand Down Expand Up @@ -389,6 +390,7 @@ public class DayHistory
public int quota;
public int day;
public ExtendedLevel? extendedLevel;
public List<ExtendedDungeonFlow>? allViableOptions; // this whole class should have a constructor that set all these variables
public ExtendedDungeonFlow? extendedDungeonFlow;
public LevelWeatherType weatherEffect;
}
Expand Down
2 changes: 2 additions & 0 deletions LethalLevelLoader/Patches/TerminalManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -815,12 +815,14 @@ internal static void CreateEnemyTypeTerminalData(ExtendedEnemyType extendedEnemy
TerminalKeyword newEnemyInfoKeyword = CreateNewTerminalKeyword();
newEnemyInfoKeyword.name = extendedEnemyType.name + "BestiaryKeyword";
newEnemyInfoKeyword.word = extendedEnemyType.EnemyDisplayName.ToLower();
newEnemyInfoKeyword.defaultVerb = routeInfoKeyword;

TerminalNode newEnemyInfoNode = CreateNewTerminalNode();
newEnemyInfoNode.name = extendedEnemyType.name + "BestiaryNode";
newEnemyInfoNode.displayText = extendedEnemyType.InfoNodeDescription;
newEnemyInfoNode.creatureFileID = extendedEnemyType.EnemyID;
newEnemyInfoNode.creatureName = extendedEnemyType.EnemyDisplayName;
newEnemyInfoNode.playSyncedClip = 2;

if (extendedEnemyType.InfoNodeVideoClip != null)
{
Expand Down
8 changes: 7 additions & 1 deletion LethalLevelLoader/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Device;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using Application = UnityEngine.Application;

Expand All @@ -23,7 +24,7 @@ public class Plugin : BaseUnityPlugin
{
public const string ModGUID = "imabatby.lethallevelloader";
public const string ModName = "LethalLevelLoader";
public const string ModVersion = "1.3.4";
public const string ModVersion = "1.3.8";

internal static Plugin Instance = null!;

Expand All @@ -47,6 +48,11 @@ private void Awake()

Logger.LogInfo($"LethalLevelLoader loaded!!");

//We do this here to try and assure this doesn't accidently catch anything from any AssetBundles
LevelLoader.vanillaWaterShader = Shader.Find("Shader Graphs/WaterShaderHDRP");
if (LevelLoader.vanillaWaterShader == null)
DebugHelper.LogError("Could Not Find Water Shader", DebugType.User);

Harmony.PatchAll(typeof(LethalLevelLoaderNetworkManager));
Harmony.PatchAll(typeof(DungeonLoader));

Expand Down
21 changes: 20 additions & 1 deletion LethalLevelLoader/Tools/ContentRestorer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Text;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Rendering;
using Object = UnityEngine.Object;

namespace LethalLevelLoader.Tools
Expand Down Expand Up @@ -60,7 +61,7 @@ internal static void RestoreVanillaLevelAssetReferences(ExtendedLevel extendedLe

foreach (EnemyType vanillaEnemyType in OriginalContent.Enemies)
foreach (SpawnableEnemyWithRarity enemyRarityPair in extendedLevel.SelectableLevel.Enemies.Concat(extendedLevel.SelectableLevel.DaytimeEnemies).Concat(extendedLevel.SelectableLevel.OutsideEnemies))
if (enemyRarityPair.enemyType != null && enemyRarityPair.enemyType.enemyName == vanillaEnemyType.enemyName)
if (enemyRarityPair.enemyType != null && !string.IsNullOrEmpty(enemyRarityPair.enemyType.name) && enemyRarityPair.enemyType.name == vanillaEnemyType.name)
enemyRarityPair.enemyType = RestoreAsset(enemyRarityPair.enemyType, vanillaEnemyType);

foreach (SpawnableMapObject spawnableMapObject in extendedLevel.SelectableLevel.spawnableMapObjects)
Expand Down Expand Up @@ -157,6 +158,24 @@ internal static void DestroyRestoredAssets(bool debugAction = false)
objectsToDestroy.Clear();
}

internal static void TryRestoreWaterShader(Material customMaterial)
{
if (customMaterial == null || customMaterial.shader == null || string.IsNullOrEmpty(customMaterial.shader.name))
return;

if (customMaterial.shader == LevelLoader.vanillaWaterShader)
return;

if (customMaterial.shader.name == LevelLoader.vanillaWaterShader.name)
{
customMaterial.shader = LevelLoader.vanillaWaterShader;
customMaterial.DisableKeyword("_BLENDMODE_ALPHA");
customMaterial.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
customMaterial.EnableKeyword("_ENABLE_FOG_ON_TRANSPARENT");
customMaterial.EnableKeyword("_DISABLE_SSR_TRANSPARENT");
}
}


internal static T RestoreAsset<T>(UnityEngine.Object currentAsset, T newAsset, bool debugAction = false, bool destroyOnReplace = true)
{
Expand Down

0 comments on commit 3cc9221

Please sign in to comment.