Skip to content

Commit

Permalink
#6 update car ID offset when switching skins
Browse files Browse the repository at this point in the history
  • Loading branch information
katycat5e committed Sep 6, 2023
1 parent b794b2b commit 8127d6a
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 8 deletions.
16 changes: 13 additions & 3 deletions NumberManager.Mod/NumberManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ private static void SaveDefaultShaders(TrainCarLivery carType)

#region Number Application

private static int GetCarIdNumber( string carId )
public static int GetCarIdNumber( string carId )
{
string idNum = carId.Substring(carId.Length - 3);
return int.Parse(idNum);
Expand All @@ -335,6 +335,14 @@ public static void SetCarNumber(string carGUID, int number)
SavedCarNumbers[carGUID] = number;
}

public static void RemoveCarNumber(string carGUID)
{
if (SavedCarNumbers.ContainsKey(carGUID))
{
SavedCarNumbers.Remove(carGUID);
}
}

public static int GetCurrentCarNumber(TrainCar car)
{
if (SavedCarNumbers.TryGetValue(car.CarGUID, out int n)) return n;
Expand Down Expand Up @@ -390,8 +398,8 @@ public static int GetNewCarNumber(TrainCar car)
/// </summary>
public static void ApplyNumbering(TrainCar car, int number)
{
SkinManager_ReplaceTexture_Patch.Prefix(car, out Dictionary<MeshRenderer, DefaultTexInfo> texDict);
ApplyNumbering(car, number, texDict);
SkinManager_ReplaceTexture_Patch.Prefix(car, out SkinManager_ReplaceTexture_Patch.ReplaceTextureState texDict);
ApplyNumbering(car, number, texDict.DefaultTextureInfo);
}

/// <summary>
Expand All @@ -411,6 +419,8 @@ internal static void ApplyNumbering(TrainCar car, int number, Dictionary<MeshRen
if( (numScheme == null) || (NumShader == null) )
{
// nothing to apply
RemoveCarNumber(car.CarGUID);

foreach( var renderer in car.gameObject.GetComponentsInChildren<MeshRenderer>() )
{
if( !renderer.material.HasProperty("_MainTex") ) continue;
Expand Down
54 changes: 49 additions & 5 deletions NumberManager.Mod/Patches.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using DV.ThingTypes;
using HarmonyLib;
using Newtonsoft.Json.Linq;
using NumberManager.Shared;
using SkinManagerMod;
using UnityEngine;

Expand Down Expand Up @@ -36,17 +38,59 @@ private static DefaultTexInfo GetDefaultTexInfo( MeshRenderer renderer )
else return new DefaultTexInfo(null, 0, 0);
}

internal static void Prefix( TrainCar trainCar, out Dictionary<MeshRenderer, DefaultTexInfo> __state )
internal static void Prefix( TrainCar trainCar, out ReplaceTextureState __state )
{
// Get the default texture names, because the ReplaceTexture method erases them with the new textures
var renderers = trainCar.gameObject.GetComponentsInChildren<MeshRenderer>();
__state = renderers.ToDictionary(mr => mr, mr => GetDefaultTexInfo(mr));
__state = new ReplaceTextureState(renderers.ToDictionary(mr => mr, mr => GetDefaultTexInfo(mr)));

var currentScheme = NumberManager.GetScheme(trainCar);
if (currentScheme != null)
{
__state.HadAppliedScheme = true;

int currentNumber = NumberManager.GetCurrentCarNumber(trainCar);
int carId = NumberManager.GetCarIdNumber(trainCar.ID);
__state.WasOffsetNumber = (currentScheme.Offset + carId) == currentNumber;
}
else
{
__state.WasOffsetNumber = NumberManager.Settings.AllowCarIdOffset;
}
}

static void Postfix( TrainCar trainCar, ReplaceTextureState __state )
{
int number;
if (CarTypes.IsTender(trainCar.carLivery) && NumberManager.LastSteamerNumber.HasValue)
{
number = NumberManager.LastSteamerNumber.Value;
}
else if (__state.WasOffsetNumber)
{
number = NumberManager.GetCarIdNumber(trainCar.ID);
if ((NumberManager.GetScheme(trainCar) is NumberConfig currentScheme) && NumberManager.Settings.AllowCarIdOffset)
{
number += currentScheme.Offset;
}
}
else
{
number = NumberManager.GetCurrentCarNumber(trainCar);
}
NumberManager.ApplyNumbering(trainCar, number, __state.DefaultTextureInfo);
}

static void Postfix( TrainCar trainCar, Dictionary<MeshRenderer, DefaultTexInfo> __state )
public class ReplaceTextureState
{
int number = NumberManager.GetCurrentCarNumber(trainCar);
NumberManager.ApplyNumbering(trainCar, number, __state);
public Dictionary<MeshRenderer, DefaultTexInfo> DefaultTextureInfo;
public bool HadAppliedScheme = false;
public bool WasOffsetNumber = false;

public ReplaceTextureState(Dictionary<MeshRenderer, DefaultTexInfo> defaultTextureInfo)
{
DefaultTextureInfo = defaultTextureInfo;
}
}
}

Expand Down

0 comments on commit 8127d6a

Please sign in to comment.