Skip to content

Commit

Permalink
Implement new clone and enhance interfaces and rework CustomModelData…
Browse files Browse the repository at this point in the history
… targeting system.
  • Loading branch information
MrPurple6411 committed Jan 19, 2023
1 parent 314cb70 commit e76e595
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 28 deletions.
11 changes: 5 additions & 6 deletions SMLHelper/Assets/CustomModelData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@
/// </summary>
public class CustomModelData
{
//TODO: Expand on this to include keyword settings and other settings for Renderers/Shaders/Materials


/// <summary>
/// Name of the model to target with these changes.
/// </summary>
public string TargetName { get; init; } = "";
public string TargetPath { get; init; } = "";

/// <summary>
/// The custom skin for the item.<br/>
Expand Down Expand Up @@ -47,9 +50,8 @@ public class CustomModelData
/// </summary>
public static class Targets
{
//TODO: ADD MORE Targets.... Maybe a dictionary to get target list based on techtype?
#pragma warning disable 1591
//TODO..... ADD MORE.

#region Buildables

public static string Fabricator = "submarine_fabricator_01/fabricator_01";
Expand Down Expand Up @@ -84,9 +86,6 @@ public static class Targets
public static string BeaconFP = "model_FP/beacon_fp/beacon_geo1";

#endregion



#pragma warning restore
}
}
152 changes: 130 additions & 22 deletions SMLHelper/Assets/PrefabInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using SMLHelper.Patchers;
using SMLHelper.Utility;
using UnityEngine;
using UWE;

/// <summary>
/// The core of the new Prefab system. <br/>
Expand Down Expand Up @@ -506,8 +507,11 @@ internal IEnumerator GetGameObjectInternalAsync(IOut<GameObject> gameObject)
{
if(ModPrefabCache.CachedPrefabs.TryGetValue(ClassID, out var cache))
{
gameObject.Set(cache.Item2);
yield break;
if(!cache.Item1)
{
gameObject.Set(cache.Item2);
yield break;
}
}

GameObject prefab = null;
Expand Down Expand Up @@ -595,8 +599,70 @@ internal IEnumerator GetGameObjectInternalAsync(IOut<GameObject> gameObject)
}
}

if(ModPrefab is ICloneTechType cloneTech)
{
if(cloneTech.TypeToClone != TechType.None)
{
yield return CraftData.InstantiateFromPrefabAsync(cloneTech.TypeToClone, taskResult);
prefab = taskResult.Get();
if(prefab != null)
{
ProcessPrefabInternal(prefab);
gameObject.Set(prefab);
yield break;
}
}
else
{
InternalLogger.Warn($"{ClassID} is a ICloneTechType but TypeToClone is returning TechType.None");
}
}

if(ModPrefab is ICloneClassID cloneID)
{
if(!string.IsNullOrWhiteSpace(cloneID.ClassID))
{
var request = PrefabDatabase.GetPrefabAsync(cloneID.ClassID);
yield return request;

if(request.TryGetPrefab(out prefab))
{
ProcessPrefabInternal(prefab);
gameObject.Set(prefab);
yield break;
}
}
else
{
InternalLogger.Warn($"{ClassID} is a ICloneClassID but ClassID is null or whitespaces.");
}
}

if(ModPrefab is ICloneFileName clonePath)
{
if(!string.IsNullOrWhiteSpace(clonePath.FileName))
{
var request = PrefabDatabase.GetPrefabForFilenameAsync(clonePath.FileName);
yield return request;

if(request.TryGetPrefab(out prefab))
{
ProcessPrefabInternal(prefab);
gameObject.Set(prefab);
yield break;
}
}
else
{
InternalLogger.Warn($"{ClassID} is a IClonePath but clonePath is null or whitespaces.");
}
}

if(ModPrefab is not IModPrefab modPrefab || modPrefab.GetGameObjectAsync == null)
{
InternalLogger.Error($"{ClassID} has no valid way to produce a GameObject currently set!");
yield break;
}

yield return modPrefab.GetGameObjectAsync(taskResult);

Expand Down Expand Up @@ -641,8 +707,6 @@ internal void ProcessPrefabInternal(GameObject prefab)
pid.ClassId = ClassID;
}

ModPrefabCache.AddPrefab(prefab, false);

if(ModPrefab is ICustomBattery customBattery)
{
Battery battery = prefab.EnsureComponent<Battery>();
Expand All @@ -666,29 +730,36 @@ internal void ProcessPrefabInternal(GameObject prefab)
CustomModelData[] modelDatas = CustomModelData.ModelDatas;
if(modelDatas != null)
{
var renderers = prefab.GetComponentsInChildren<Renderer>(true) ?? Array.Empty<Renderer>();
foreach(Renderer renderer in renderers)
foreach(var modelData in modelDatas)
{
foreach(var modelData in modelDatas)
if(string.IsNullOrWhiteSpace(modelData.TargetPath))
{
if(modelData.TargetName != renderer.name)
continue;
TargetAll(prefab, modelData);
continue;
}

Renderer renderer = prefab.transform.Find(modelData.TargetPath)?.gameObject.GetComponent<Renderer>();

if(modelData.CustomTexture != null)
renderer.material.SetTexture(ShaderPropertyID._MainTex, modelData.CustomTexture);
if(renderer != null)
{
InternalLogger.Warn($"{ClassID} unable to find {modelData.TargetPath} on {prefab.name} when trying to apply CustomModelData.");
continue;
}

if(modelData.CustomNormalMap != null)
renderer.material.SetTexture(ShaderPropertyID._BumpMap, modelData.CustomNormalMap);
if(modelData.CustomTexture != null)
renderer.material.SetTexture(ShaderPropertyID._MainTex, modelData.CustomTexture);

if(modelData.CustomSpecMap != null)
renderer.material.SetTexture(ShaderPropertyID._SpecTex, modelData.CustomSpecMap);
if(modelData.CustomNormalMap != null)
renderer.material.SetTexture(ShaderPropertyID._BumpMap, modelData.CustomNormalMap);

if(modelData.CustomIllumMap != null)
{
renderer.material.SetTexture(ShaderPropertyID._Illum, modelData.CustomIllumMap);
renderer.material.SetFloat(ShaderPropertyID._GlowStrength, modelData.CustomIllumStrength);
renderer.material.SetFloat(ShaderPropertyID._GlowStrengthNight, modelData.CustomIllumStrength);
}
if(modelData.CustomSpecMap != null)
renderer.material.SetTexture(ShaderPropertyID._SpecTex, modelData.CustomSpecMap);

if(modelData.CustomIllumMap != null)
{
renderer.material.SetTexture(ShaderPropertyID._Illum, modelData.CustomIllumMap);
renderer.material.SetFloat(ShaderPropertyID._GlowStrength, modelData.CustomIllumStrength);
renderer.material.SetFloat(ShaderPropertyID._GlowStrengthNight, modelData.CustomIllumStrength);
}
}
}
Expand Down Expand Up @@ -770,6 +841,43 @@ internal void ProcessPrefabInternal(GameObject prefab)

crafter.powerRelay = PowerSource.FindRelay(prefab.transform);
}

if(ModPrefab is IPrefabEnhancer enhancer)
{
if(enhancer.EnhancePrefab != null)
{
enhancer.EnhancePrefab(prefab);
}
else
{
InternalLogger.Warn($"{ClassID} is a IPrefabEnhancer but EnhancePrefab returned null!");
}
}

ModPrefabCache.AddPrefab(prefab, false);
}
#endregion

private void TargetAll(GameObject prefab, CustomModelData modelData)
{
var renderers = prefab.GetComponentsInChildren<Renderer>(true) ?? Array.Empty<Renderer>();
foreach(Renderer renderer in renderers)
{
if(modelData.CustomTexture != null)
renderer.material.SetTexture(ShaderPropertyID._MainTex, modelData.CustomTexture);

if(modelData.CustomNormalMap != null)
renderer.material.SetTexture(ShaderPropertyID._BumpMap, modelData.CustomNormalMap);

if(modelData.CustomSpecMap != null)
renderer.material.SetTexture(ShaderPropertyID._SpecTex, modelData.CustomSpecMap);

if(modelData.CustomIllumMap != null)
{
renderer.material.SetTexture(ShaderPropertyID._Illum, modelData.CustomIllumMap);
renderer.material.SetFloat(ShaderPropertyID._GlowStrength, modelData.CustomIllumStrength);
renderer.material.SetFloat(ShaderPropertyID._GlowStrengthNight, modelData.CustomIllumStrength);
}
}
}
#endregion
}

0 comments on commit e76e595

Please sign in to comment.