using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using AK.Wwise;
using AncientScepter;
using BansheeMod.BansheeCharacter;
using BansheeMod.BansheeCharacter.Components;
using BansheeMod.BansheeCharacter.Content;
using BansheeMod.BansheeCharacter.SkillStates;
using BansheeMod.Modules;
using BansheeMod.Modules.Achievements;
using BansheeMod.Modules.BaseContent.BaseStates;
using BansheeMod.Modules.BaseStates;
using BansheeMod.Modules.Characters;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EmotesAPI;
using EntityStates;
using EntityStates.AI.Walker;
using EntityStates.Huntress;
using EntityStates.Mage;
using Grumpy;
using HG;
using HG.BlendableTypes;
using JetBrains.Annotations;
using KinematicCharacterController;
using On.RoR2;
using On.RoR2.Orbs;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using Rewired.ComponentControls.Effects;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using ShaderSwapper;
using ThreeEyedGames;
using TrueFirstPerson;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("BansheeMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d39432e033483abd3ea1a707a9c6f659f3f81b82")]
[assembly: AssemblyProduct("BansheeMod")]
[assembly: AssemblyTitle("BansheeMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
internal enum BansheeCameraParams
{
DEFAULT,
LAST_BREATH,
AIM_SNIPER,
EMOTE
}
namespace BansheeMod
{
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.kenko.Banshee", "Banshee", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class BansheePlugin : BaseUnityPlugin
{
public const string MODUID = "com.kenko.Banshee";
public const string MODNAME = "Banshee";
public const string MODVERSION = "1.0.0";
public const string DEVELOPER_PREFIX = "KENKO";
public static BansheePlugin instance;
private static bool? _emotesInstalled;
private static bool? _scepterInstalled;
private static bool? _fpInstalled;
public static bool emotesInstalled
{
get
{
if (!_emotesInstalled.HasValue)
{
_emotesInstalled = Chainloader.PluginInfos.ContainsKey("com.weliveinasociety.CustomEmotesAPI");
}
return _emotesInstalled.Value;
}
}
public static bool scepterInstalled
{
get
{
if (!_scepterInstalled.HasValue)
{
_scepterInstalled = Chainloader.PluginInfos.ContainsKey("com.DestroyedClone.AncientScepter");
}
return _scepterInstalled.Value;
}
}
public static bool fpInstalled
{
get
{
if (!_fpInstalled.HasValue)
{
_fpInstalled = Chainloader.PluginInfos.ContainsKey("com.brynzananas.truefirstperson");
}
return _fpInstalled.Value;
}
}
private void Awake()
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
instance = this;
NetworkingAPI.RegisterMessageType<SyncSecondaryStock>();
Log.Init(((BaseUnityPlugin)this).Logger);
BansheeConfig.Init();
BansheeAssets.Init();
((MonoBehaviour)this).StartCoroutine(ShaderSwapper.UpgradeStubbedShadersAsync(BansheeAssets.mainAssetBundle));
if (fpInstalled)
{
SurvivorCatalog.Init += new hook_Init(FirstPersonCompat);
}
Language.Init();
new BansheeSurvivor().Initialize();
new ContentPacks().Initialize();
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private void FirstPersonCompat(orig_Init orig)
{
Main.survivorClipDefaultValues.Add("BansheeBody", 0.24f);
orig.Invoke();
}
}
internal static class Log
{
internal static ManualLogSource _logSource;
internal static void Init(ManualLogSource logSource)
{
_logSource = logSource;
}
internal static void Debug(object data)
{
_logSource.LogDebug(data);
}
internal static void Error(object data)
{
_logSource.LogError(data);
}
internal static void ErrorAssetBundle(string assetName, string bundleName)
{
Error("failed to load asset, " + assetName + ", because it does not exist in asset bundle, " + bundleName);
}
internal static void Fatal(object data)
{
_logSource.LogFatal(data);
}
internal static void Info(object data)
{
_logSource.LogInfo(data);
}
internal static void Message(object data)
{
_logSource.LogMessage(data);
}
internal static void Warning(object data)
{
_logSource.LogWarning(data);
}
}
}
namespace BansheeMod.Modules
{
internal static class CameraParams
{
internal static CharacterCameraParamsData defaultCameraParams;
internal static CharacterCameraParamsData lastBreathCameraParams;
internal static CharacterCameraParamsData sniperAimCameraParams;
internal static CharacterCameraParamsData emoteCameraParams;
internal static void InitializeParams()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
defaultCameraParams = NewCameraParams("ccpUnforgiven", 70f, 1.37f, new Vector3(0f, 0f, -8.1f));
lastBreathCameraParams = NewCameraParams("ccpUnforgivenSpecial", 70f, 0.8f, new Vector3(1f, 0f, -5f));
sniperAimCameraParams = NewCameraParams("ccpUnforgivenSniperAim", 70f, 0.8f, new Vector3(0f, 0f, 0.75f));
emoteCameraParams = NewCameraParams("ccpUnforgivenEmote", 70f, 0.4f, new Vector3(0f, 0f, -6f));
}
private static CharacterCameraParamsData NewCameraParams(string name, float pitch, float pivotVerticalOffset, Vector3 standardPosition)
{
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
return NewCameraParams(name, pitch, pivotVerticalOffset, standardPosition, 0.1f);
}
private static CharacterCameraParamsData NewCameraParams(string name, float pitch, float pivotVerticalOffset, Vector3 idealPosition, float wallCushion)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
CharacterCameraParamsData result = default(CharacterCameraParamsData);
result.maxPitch = BlendableFloat.op_Implicit(pitch);
result.minPitch = BlendableFloat.op_Implicit(0f - pitch);
result.pivotVerticalOffset = BlendableFloat.op_Implicit(pivotVerticalOffset);
result.idealLocalCameraPos = BlendableVector3.op_Implicit(idealPosition);
result.wallCushion = BlendableFloat.op_Implicit(wallCushion);
return result;
}
internal static CameraParamsOverrideHandle OverrideCameraParams(CameraTargetParams camParams, BansheeCameraParams camera, float transitionDuration = 0.5f)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
CharacterCameraParamsData newParams = GetNewParams(camera);
CameraParamsOverrideRequest val = default(CameraParamsOverrideRequest);
val.cameraParamsData = newParams;
val.priority = 0f;
CameraParamsOverrideRequest val2 = val;
return camParams.AddParamsOverride(val2, transitionDuration);
}
internal static CharacterCameraParams CreateCameraParamsWithData(BansheeCameraParams camera)
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
CharacterCameraParams val = ScriptableObject.CreateInstance<CharacterCameraParams>();
((Object)val).name = camera.ToString().ToLower() + "Params";
val.data = GetNewParams(camera);
return val;
}
internal static CharacterCameraParamsData GetNewParams(BansheeCameraParams camera)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
CharacterCameraParamsData val = defaultCameraParams;
return (CharacterCameraParamsData)(camera switch
{
BansheeCameraParams.LAST_BREATH => lastBreathCameraParams,
BansheeCameraParams.AIM_SNIPER => sniperAimCameraParams,
BansheeCameraParams.EMOTE => emoteCameraParams,
_ => defaultCameraParams,
});
}
}
internal static class CharacterAssets
{
internal static Dictionary<string, AssetBundle> loadedBundles = new Dictionary<string, AssetBundle>();
internal static AssetBundle LoadAssetBundle(string bundleName)
{
if (bundleName == "myassetbundle")
{
Log.Error("AssetBundle name hasn't been changed. not loading any assets to avoid conflicts.\nMake sure to rename your assetbundle filename and rename the AssetBundleName field in your character setup code ");
return null;
}
if (loadedBundles.ContainsKey(bundleName))
{
return loadedBundles[bundleName];
}
AssetBundle val = null;
try
{
using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("BansheeMod." + bundleName);
val = AssetBundle.LoadFromStream(stream);
}
catch (Exception arg)
{
Log.Error($"Error loading asset bundle, {bundleName}. Your asset bundle must be in a folder next to your mod dll called 'AssetBundles'. Follow the guide to build and install your mod correctly!\n{arg}");
}
loadedBundles[bundleName] = val;
return val;
}
internal static GameObject CloneTracer(string originalTracerName, string newTracerName)
{
if ((Object)(object)LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/" + originalTracerName) == (Object)null)
{
return null;
}
GameObject val = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/Tracers/" + originalTracerName), newTracerName, true);
if (!Object.op_Implicit((Object)(object)val.GetComponent<EffectComponent>()))
{
val.AddComponent<EffectComponent>();
}
if (!Object.op_Implicit((Object)(object)val.GetComponent<VFXAttributes>()))
{
val.AddComponent<VFXAttributes>();
}
if (!Object.op_Implicit((Object)(object)val.GetComponent<NetworkIdentity>()))
{
val.AddComponent<NetworkIdentity>();
}
val.GetComponent<Tracer>().speed = 250f;
val.GetComponent<Tracer>().length = 50f;
Content.CreateAndAddEffectDef(val);
return val;
}
internal static void ConvertAllRenderersToHopooShader(GameObject objectToConvert)
{
if (!Object.op_Implicit((Object)(object)objectToConvert))
{
return;
}
MeshRenderer[] componentsInChildren = objectToConvert.GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer val in componentsInChildren)
{
if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)((Renderer)val).sharedMaterial))
{
((Renderer)val).sharedMaterial.ConvertDefaultShaderToHopoo();
}
}
SkinnedMeshRenderer[] componentsInChildren2 = objectToConvert.GetComponentsInChildren<SkinnedMeshRenderer>();
foreach (SkinnedMeshRenderer val2 in componentsInChildren2)
{
if (Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)((Renderer)val2).sharedMaterial))
{
((Renderer)val2).sharedMaterial.ConvertDefaultShaderToHopoo();
}
}
}
internal static GameObject LoadCrosshair(string crosshairAddress)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Addressables.LoadAssetAsync<GameObject>((object)crosshairAddress).WaitForCompletion();
if ((Object)(object)val == (Object)null)
{
Log.Error("could not load crosshair with the name " + crosshairAddress + ". defaulting to Standard");
return LegacyResourcesAPI.Load<GameObject>("Prefabs/Crosshair/StandardCrosshair");
}
return val;
}
internal static GameObject LoadEffect(this AssetBundle assetBundle, string resourceName, bool parentToTransform)
{
return assetBundle.LoadEffect(resourceName, "", parentToTransform);
}
internal static GameObject LoadEffect(this AssetBundle assetBundle, string resourceName, string soundName = "", bool parentToTransform = false)
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
GameObject val = assetBundle.LoadAsset<GameObject>(resourceName);
if (!Object.op_Implicit((Object)(object)val))
{
Log.ErrorAssetBundle(resourceName, ((Object)assetBundle).name);
return null;
}
val.AddComponent<DestroyOnTimer>().duration = 12f;
val.AddComponent<NetworkIdentity>();
val.AddComponent<VFXAttributes>().vfxPriority = (VFXPriority)2;
EffectComponent val2 = val.AddComponent<EffectComponent>();
val2.applyScale = false;
val2.effectIndex = (EffectIndex)(-1);
val2.parentToReferencedTransform = parentToTransform;
val2.positionAtReferencedTransform = true;
val2.soundName = soundName;
Content.CreateAndAddEffectDef(val);
return val;
}
internal static GameObject CreateProjectileGhostPrefab(this AssetBundle assetBundle, string ghostName)
{
GameObject val = assetBundle.LoadAsset<GameObject>(ghostName);
if ((Object)(object)val == (Object)null)
{
Log.Error("Failed to load ghost prefab " + ghostName);
}
if (!Object.op_Implicit((Object)(object)val.GetComponent<NetworkIdentity>()))
{
val.AddComponent<NetworkIdentity>();
}
if (!Object.op_Implicit((Object)(object)val.GetComponent<ProjectileGhostController>()))
{
val.AddComponent<ProjectileGhostController>();
}
ConvertAllRenderersToHopooShader(val);
return val;
}
internal static GameObject CloneProjectilePrefab(string prefabName, string newPrefabName)
{
return PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/Projectiles/" + prefabName), newPrefabName);
}
internal static GameObject LoadAndAddProjectilePrefab(this AssetBundle assetBundle, string newPrefabName)
{
GameObject val = assetBundle.LoadAsset<GameObject>(newPrefabName);
if ((Object)(object)val == (Object)null)
{
Log.ErrorAssetBundle(newPrefabName, ((Object)assetBundle).name);
return null;
}
Content.AddProjectilePrefab(val);
return val;
}
}
public static class Config
{
public static ConfigFile MyConfig = ((BaseUnityPlugin)BansheePlugin.instance).Config;
public static ConfigEntry<bool> CharacterEnableConfig(string section, string characterName, string description = "", bool enabledByDefault = true)
{
if (string.IsNullOrEmpty(description))
{
description = "Set to false to disable this character and as much of its code and content as possible";
}
return BindAndOptions(section, "Enable " + characterName, enabledByDefault, description, restartRequired: true);
}
public static ConfigEntry<T> BindAndOptions<T>(string section, string name, T defaultValue, string description = "", bool restartRequired = false)
{
return BindAndOptions(section, name, defaultValue, 0f, 20f, description, restartRequired);
}
public static ConfigEntry<T> BindAndOptions<T>(string section, string name, T defaultValue, float min, float max, string description = "", bool restartRequired = false)
{
if (string.IsNullOrEmpty(description))
{
description = name;
}
if (restartRequired)
{
description += " (restart required)";
}
ConfigEntry<T> result = MyConfig.Bind<T>(section, name, defaultValue, description);
if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
}
return result;
}
public static ConfigEntry<float> BindAndOptionsSlider(string section, string name, float defaultValue, string description, float min = 0f, float max = 20f, bool restartRequired = false)
{
return BindAndOptions(section, name, defaultValue, min, max, description, restartRequired);
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static void TryRegisterOption<T>(ConfigEntry<T> entry, float min, float max, bool restartRequired)
{
}
public static bool GetKeyPressed(KeyboardShortcut entry)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
foreach (KeyCode modifier in ((KeyboardShortcut)(ref entry)).Modifiers)
{
if (!Input.GetKey(modifier))
{
return false;
}
}
return Input.GetKeyDown(((KeyboardShortcut)(ref entry)).MainKey);
}
}
internal class Content
{
internal static void AddCharacterBodyPrefab(GameObject bprefab)
{
ContentPacks.bodyPrefabs.Add(bprefab);
}
internal static void AddMasterPrefab(GameObject prefab)
{
ContentPacks.masterPrefabs.Add(prefab);
}
internal static void AddProjectilePrefab(GameObject prefab)
{
ContentPacks.projectilePrefabs.Add(prefab);
}
internal static void AddSurvivorDef(SurvivorDef survivorDef)
{
ContentPacks.survivorDefs.Add(survivorDef);
}
internal static void CreateSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
CreateSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, null, 100f);
}
internal static void CreateSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, float sortPosition)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
CreateSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, null, sortPosition);
}
internal static void CreateSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, UnlockableDef unlockableDef)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
CreateSurvivor(bodyPrefab, displayPrefab, charColor, tokenPrefix, unlockableDef, 100f);
}
internal static void CreateSurvivor(GameObject bodyPrefab, GameObject displayPrefab, Color charColor, string tokenPrefix, UnlockableDef unlockableDef, float sortPosition)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
SurvivorDef val = ScriptableObject.CreateInstance<SurvivorDef>();
val.bodyPrefab = bodyPrefab;
val.displayPrefab = displayPrefab;
val.primaryColor = charColor;
val.cachedName = ((Object)bodyPrefab).name.Replace("Body", "");
val.displayNameToken = tokenPrefix + "NAME";
val.descriptionToken = tokenPrefix + "DESCRIPTION";
val.outroFlavorToken = tokenPrefix + "OUTRO_FLAVOR";
val.mainEndingEscapeFailureFlavorToken = tokenPrefix + "OUTRO_FAILURE";
val.desiredSortPosition = sortPosition;
val.unlockableDef = unlockableDef;
AddSurvivorDef(val);
}
internal static void AddUnlockableDef(UnlockableDef unlockableDef)
{
ContentPacks.unlockableDefs.Add(unlockableDef);
}
internal static UnlockableDef CreateAndAddUnlockbleDef(string identifier, string nameToken, Sprite achievementIcon)
{
UnlockableDef val = ScriptableObject.CreateInstance<UnlockableDef>();
val.cachedName = identifier;
val.nameToken = nameToken;
val.achievementIcon = achievementIcon;
AddUnlockableDef(val);
return val;
}
internal static void AddSkillDef(SkillDef skillDef)
{
ContentPacks.skillDefs.Add(skillDef);
}
internal static void AddSkillFamily(SkillFamily skillFamily)
{
ContentPacks.skillFamilies.Add(skillFamily);
}
internal static void AddEntityState(Type entityState)
{
ContentPacks.entityStates.Add(entityState);
}
internal static void AddBuffDef(BuffDef buffDef)
{
ContentPacks.buffDefs.Add(buffDef);
}
internal static BuffDef CreateAndAddBuff(string buffName, Sprite buffIcon, Color buffColor, bool canStack, bool isDebuff, bool isCooldown)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
BuffDef val = ScriptableObject.CreateInstance<BuffDef>();
((Object)val).name = buffName;
val.buffColor = buffColor;
val.canStack = canStack;
val.isDebuff = isDebuff;
val.eliteDef = null;
val.iconSprite = buffIcon;
val.isCooldown = isCooldown;
AddBuffDef(val);
return val;
}
internal static void AddEffectDef(EffectDef effectDef)
{
ContentPacks.effectDefs.Add(effectDef);
}
internal static EffectDef CreateAndAddEffectDef(GameObject effectPrefab)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
EffectDef val = new EffectDef(effectPrefab);
AddEffectDef(val);
return val;
}
internal static void AddNetworkSoundEventDef(NetworkSoundEventDef networkSoundEventDef)
{
ContentPacks.networkSoundEventDefs.Add(networkSoundEventDef);
}
internal static NetworkSoundEventDef CreateAndAddNetworkSoundEventDef(string eventName)
{
NetworkSoundEventDef val = ScriptableObject.CreateInstance<NetworkSoundEventDef>();
val.akId = AkSoundEngine.GetIDFromString(eventName);
val.eventName = eventName;
AddNetworkSoundEventDef(val);
return val;
}
}
internal class ContentPacks : IContentPackProvider
{
[CompilerGenerated]
private sealed class <FinalizeAsync>d__18 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public FinalizeAsyncArgs args;
public ContentPacks <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <FinalizeAsync>d__18(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
if (<>1__state != 0)
{
return false;
}
<>1__state = -1;
args.ReportProgress(1f);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <GenerateContentPackAsync>d__17 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public GetContentPackAsyncArgs args;
public ContentPacks <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GenerateContentPackAsync>d__17(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
if (<>1__state != 0)
{
return false;
}
<>1__state = -1;
ContentPack.Copy(<>4__this.contentPack, args.output);
args.ReportProgress(1f);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <LoadStaticContentAsync>d__16 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public LoadStaticContentAsyncArgs args;
public ContentPacks <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <LoadStaticContentAsync>d__16(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
if (<>1__state != 0)
{
return false;
}
<>1__state = -1;
<>4__this.contentPack.identifier = <>4__this.identifier;
<>4__this.contentPack.bodyPrefabs.Add(bodyPrefabs.ToArray());
<>4__this.contentPack.masterPrefabs.Add(masterPrefabs.ToArray());
<>4__this.contentPack.projectilePrefabs.Add(projectilePrefabs.ToArray());
<>4__this.contentPack.survivorDefs.Add(survivorDefs.ToArray());
<>4__this.contentPack.unlockableDefs.Add(unlockableDefs.ToArray());
<>4__this.contentPack.skillDefs.Add(skillDefs.ToArray());
<>4__this.contentPack.skillFamilies.Add(skillFamilies.ToArray());
<>4__this.contentPack.entityStateTypes.Add(entityStates.ToArray());
<>4__this.contentPack.buffDefs.Add(buffDefs.ToArray());
<>4__this.contentPack.effectDefs.Add(effectDefs.ToArray());
<>4__this.contentPack.networkSoundEventDefs.Add(networkSoundEventDefs.ToArray());
args.ReportProgress(1f);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
internal ContentPack contentPack = new ContentPack();
public static List<GameObject> bodyPrefabs = new List<GameObject>();
public static List<GameObject> masterPrefabs = new List<GameObject>();
public static List<GameObject> projectilePrefabs = new List<GameObject>();
public static List<SurvivorDef> survivorDefs = new List<SurvivorDef>();
public static List<UnlockableDef> unlockableDefs = new List<UnlockableDef>();
public static List<SkillFamily> skillFamilies = new List<SkillFamily>();
public static List<SkillDef> skillDefs = new List<SkillDef>();
public static List<Type> entityStates = new List<Type>();
public static List<BuffDef> buffDefs = new List<BuffDef>();
public static List<EffectDef> effectDefs = new List<EffectDef>();
public static List<NetworkSoundEventDef> networkSoundEventDefs = new List<NetworkSoundEventDef>();
public string identifier => "com.kenko.Banshee";
public void Initialize()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(ContentManager_collectContentPackProviders);
}
private void ContentManager_collectContentPackProviders(AddContentPackProviderDelegate addContentPackProvider)
{
addContentPackProvider.Invoke((IContentPackProvider)(object)this);
}
[IteratorStateMachine(typeof(<LoadStaticContentAsync>d__16))]
public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <LoadStaticContentAsync>d__16(0)
{
<>4__this = this,
args = args
};
}
[IteratorStateMachine(typeof(<GenerateContentPackAsync>d__17))]
public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GenerateContentPackAsync>d__17(0)
{
<>4__this = this,
args = args
};
}
[IteratorStateMachine(typeof(<FinalizeAsync>d__18))]
public IEnumerator FinalizeAsync(FinalizeAsyncArgs args)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <FinalizeAsync>d__18(0)
{
<>4__this = this,
args = args
};
}
}
internal static class ItemDisplayCheck
{
public static List<Object> allDisplayedItems;
public static void PrintUnused(ItemDisplayRuleSet itemDisplayRuleSet, string bodyName = "")
{
PrintUnused((IEnumerable<KeyAssetRuleGroup>)itemDisplayRuleSet.keyAssetRuleGroups.ToList(), bodyName);
}
public static void PrintUnused(IEnumerable<KeyAssetRuleGroup> ruleSet = null, string bodyName = "")
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
string text = "generating item displays for " + bodyName;
if (allDisplayedItems == null)
{
LazyGatherAllItems();
}
List<Object> list = new List<Object>(allDisplayedItems);
string text2 = "";
if (ruleSet != null)
{
foreach (KeyAssetRuleGroup item in ruleSet)
{
if (item.displayRuleGroup.rules.Length != 0)
{
list.Remove(item.keyAsset);
if (string.IsNullOrEmpty(text2))
{
text2 = item.displayRuleGroup.rules[0].childName;
}
}
}
}
if (string.IsNullOrEmpty(text2))
{
text2 = "Chest";
}
foreach (Object item2 in list)
{
string text3 = "";
if (ItemDisplays.KeyAssetDisplayPrefabs.ContainsKey(item2))
{
text3 += SpitOutNewRule(item2, text2, ItemDisplays.KeyAssetDisplayPrefabs[item2]);
}
else
{
Log.Error($"COULD NOT FIND DISPLAY PREFABS FOR KEYASSET {item2}");
}
text += text3;
}
Log.Message(text);
}
private static void LazyGatherAllItems()
{
allDisplayedItems = new List<Object>(ItemDisplays.KeyAssetDisplayPrefabs.Keys);
allDisplayedItems.Sort(delegate(Object item1, Object item2)
{
if (item1 is ItemDef && item2 is ItemDef)
{
return item1.name.CompareTo(item2.name);
}
if (item1 is EquipmentDef && item2 is EquipmentDef)
{
return item1.name.CompareTo(item2.name);
}
if (item1 is ItemDef && item2 is EquipmentDef)
{
return -1;
}
return (item1 is EquipmentDef && item2 is ItemDef) ? 1 : 0;
});
}
private static string SpitOutNewRule(Object asset, string firstCompatibleChild, ItemDisplayRule[] displayRules)
{
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Invalid comparison between Unknown and I4
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
if (displayRules.Length == 0)
{
return $"\n[NO DISPLAY RULES FOUND FOR THE KEYASSET {asset}";
}
string text = "\n itemDisplayRules.Add(ItemDisplays.CreateDisplayRuleGroupWithRules(ItemDisplays.KeyAssets[\"" + asset.name + "\"]";
for (int i = 0; i < displayRules.Length; i++)
{
text = (((int)displayRules[i].limbMask != 0) ? (text + ",\n" + $" ItemDisplays.CreateLimbMaskDisplayRule(LimbFlags.{displayRules[i].limbMask})") : (text + ",\n ItemDisplays.CreateDisplayRule(ItemDisplays.LoadDisplay(\"" + ((Object)displayRules[i].followerPrefab).name + "\"),\n \"" + firstCompatibleChild + "\",\n new Vector3(2, 2, 2),\n new Vector3(0, 0, 0),\n new Vector3(1, 1, 1)\n )"));
}
return text + "\n ));";
}
}
internal static class ItemDisplays
{
private static Dictionary<string, GameObject> itemDisplayPrefabs = new Dictionary<string, GameObject>();
public static Dictionary<Object, ItemDisplayRule[]> KeyAssetDisplayPrefabs = new Dictionary<Object, ItemDisplayRule[]>();
public static Dictionary<string, Object> KeyAssets = new Dictionary<string, Object>();
public static int queuedDisplays;
public static bool initialized = false;
public static void LazyInit()
{
if (!initialized)
{
initialized = true;
PopulateDisplays();
}
}
internal static void DisposeWhenDone()
{
queuedDisplays--;
if (queuedDisplays <= 0 && initialized)
{
initialized = false;
itemDisplayPrefabs = null;
KeyAssetDisplayPrefabs = null;
KeyAssets = null;
}
}
internal static void PopulateDisplays()
{
PopulateFromBody("LoaderBody");
}
private static void PopulateFromBody(string bodyName)
{
ItemDisplayRuleSet itemDisplayRuleSet = ((Component)LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterBodies/" + bodyName).GetComponent<ModelLocator>().modelTransform).GetComponent<CharacterModel>().itemDisplayRuleSet;
KeyAssetRuleGroup[] keyAssetRuleGroups = itemDisplayRuleSet.keyAssetRuleGroups;
for (int i = 0; i < keyAssetRuleGroups.Length; i++)
{
ItemDisplayRule[] rules = keyAssetRuleGroups[i].displayRuleGroup.rules;
KeyAssetDisplayPrefabs[keyAssetRuleGroups[i].keyAsset] = rules;
KeyAssets[keyAssetRuleGroups[i].keyAsset.name] = keyAssetRuleGroups[i].keyAsset;
for (int j = 0; j < rules.Length; j++)
{
GameObject followerPrefab = rules[j].followerPrefab;
if (Object.op_Implicit((Object)(object)followerPrefab))
{
string key = ((Object)followerPrefab).name?.ToLowerInvariant();
if (!itemDisplayPrefabs.ContainsKey(key))
{
itemDisplayPrefabs[key] = followerPrefab;
}
}
}
}
}
private static void PopulateCustomLightningArm()
{
GameObject val = PrefabAPI.InstantiateClone(itemDisplayPrefabs["displaylightningarmright"], "DisplayLightningCustom", false);
LimbMatcher component = val.GetComponent<LimbMatcher>();
component.limbPairs[0].targetChildLimb = "LightningArm1";
component.limbPairs[1].targetChildLimb = "LightningArm2";
component.limbPairs[2].targetChildLimb = "LightningArmEnd";
itemDisplayPrefabs["displaylightningarmcustom"] = val;
}
public static GameObject LoadDisplay(string name)
{
if (itemDisplayPrefabs.ContainsKey(name.ToLowerInvariant()) && Object.op_Implicit((Object)(object)itemDisplayPrefabs[name.ToLowerInvariant()]))
{
return itemDisplayPrefabs[name.ToLowerInvariant()];
}
Log.Error("item display " + name + " returned null");
return null;
}
public static KeyAssetRuleGroup CreateDisplayRuleGroupWithRules(string itemName, params ItemDisplayRule[] rules)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
return CreateDisplayRuleGroupWithRules(GetKeyAssetFromString(itemName), rules);
}
public static KeyAssetRuleGroup CreateDisplayRuleGroupWithRules(Object keyAsset_, params ItemDisplayRule[] rules)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
if (keyAsset_ == (Object)null)
{
Log.Error("could not find keyasset");
}
KeyAssetRuleGroup result = default(KeyAssetRuleGroup);
result.keyAsset = keyAsset_;
result.displayRuleGroup = new DisplayRuleGroup
{
rules = rules
};
return result;
}
public static ItemDisplayRule CreateDisplayRule(string prefabName, string childName, Vector3 position, Vector3 rotation, Vector3 scale)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
return CreateDisplayRule(LoadDisplay(prefabName), childName, position, rotation, scale);
}
public static ItemDisplayRule CreateDisplayRule(GameObject itemPrefab, string childName, Vector3 position, Vector3 rotation, Vector3 scale)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
ItemDisplayRule result = default(ItemDisplayRule);
result.ruleType = (ItemDisplayRuleType)0;
result.childName = childName;
result.followerPrefab = itemPrefab;
result.limbMask = (LimbFlags)0;
result.localPos = position;
result.localAngles = rotation;
result.localScale = scale;
return result;
}
public static ItemDisplayRule CreateLimbMaskDisplayRule(LimbFlags limb)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
ItemDisplayRule result = default(ItemDisplayRule);
result.ruleType = (ItemDisplayRuleType)1;
result.limbMask = limb;
result.childName = "";
result.followerPrefab = null;
return result;
}
private static Object GetKeyAssetFromString(string itemName)
{
Object val = (Object)(object)LegacyResourcesAPI.Load<ItemDef>("ItemDefs/" + itemName);
if (val == (Object)null)
{
val = (Object)(object)LegacyResourcesAPI.Load<EquipmentDef>("EquipmentDefs/" + itemName);
}
if (val == (Object)null)
{
Log.Error("Could not load keyasset for " + itemName);
}
return val;
}
}
internal static class Language
{
public static string TokensOutput = "";
public static bool usingLanguageFolder = true;
public static bool printingEnabled = true;
public static void Init()
{
if (usingLanguageFolder)
{
Language.collectLanguageRootFolders += Language_collectLanguageRootFolders;
}
}
private static void Language_collectLanguageRootFolders(List<string> obj)
{
string text = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)BansheePlugin.instance).Info.Location), "Language");
if (Directory.Exists(text))
{
obj.Add(text);
}
}
public static void Add(string token, string text)
{
if (!usingLanguageFolder)
{
LanguageAPI.Add(token, text);
}
if (printingEnabled)
{
TokensOutput = TokensOutput + "\n \"" + token + "\" : \"" + text.Replace(Environment.NewLine, "\\n").Replace("\n", "\\n") + "\",";
}
}
public static void PrintOutput(string fileName = "")
{
if (printingEnabled)
{
string text = "{\n strings:\n {" + TokensOutput + "\n }\n}";
Log.Message(fileName + ": \n" + text);
if (!string.IsNullOrEmpty(fileName))
{
string path = Path.Combine(Directory.GetParent(((BaseUnityPlugin)BansheePlugin.instance).Info.Location).FullName, "Language", "en", fileName);
File.WriteAllText(path, text);
}
TokensOutput = "";
}
}
}
internal static class Materials
{
[CompilerGenerated]
private sealed class <FixRenderQueues>d__6 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <FixRenderQueues>d__6(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
BansheeAssets.mainAssetBundle.LoadAsset<Material>("matGlass").renderQueue = 3000;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static List<Material> cachedMaterials = new List<Material>();
internal static Shader hotpoo = LegacyResourcesAPI.Load<Shader>("Shaders/Deferred/HGStandard");
public static Material LoadMaterial(this AssetBundle assetBundle, string materialName)
{
return assetBundle.CreateHopooMaterialFromBundle(materialName);
}
public static Material CreateHopooMaterialFromBundle(this AssetBundle assetBundle, string materialName)
{
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Expected O, but got Unknown
Material val = cachedMaterials.Find(delegate(Material mat)
{
materialName.Replace(" (Instance)", "");
return ((Object)mat).name.Contains(materialName);
});
if (Object.op_Implicit((Object)(object)val))
{
Log.Debug(((Object)val).name + " has already been loaded. returning cached");
return val;
}
val = assetBundle.LoadAsset<Material>(materialName);
if (!Object.op_Implicit((Object)(object)val))
{
Log.ErrorAssetBundle(materialName, ((Object)assetBundle).name);
return new Material(hotpoo);
}
return val.ConvertDefaultShaderToHopoo();
}
public static Material SetHopooMaterial(this Material tempMat)
{
return tempMat.ConvertDefaultShaderToHopoo();
}
public static Material ConvertDefaultShaderToHopoo(this Material tempMat)
{
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
if (cachedMaterials.Contains(tempMat))
{
Log.Debug(((Object)tempMat).name + " has already been converted. returning cached");
return tempMat;
}
string text = ((Object)tempMat.shader).name.ToLowerInvariant();
if (!text.StartsWith("standard") && !text.StartsWith("autodesk"))
{
Log.Debug(((Object)tempMat).name + " is not unity standard shader. aborting material conversion");
return tempMat;
}
float? num = null;
Color? val = null;
if (tempMat.IsKeywordEnabled("_NORMALMAP"))
{
num = tempMat.GetFloat("_BumpScale");
}
if (tempMat.IsKeywordEnabled("_EMISSION"))
{
val = tempMat.GetColor("_EmissionColor");
}
tempMat.shader = hotpoo;
tempMat.SetTexture("_EmTex", tempMat.GetTexture("_EmissionMap"));
tempMat.EnableKeyword("DITHER");
if (num.HasValue)
{
tempMat.SetFloat("_NormalStrength", num.Value);
tempMat.SetTexture("_NormalTex", tempMat.GetTexture("_BumpMap"));
}
if (val.HasValue)
{
tempMat.SetColor("_EmColor", val.Value);
tempMat.SetFloat("_EmPower", 1f);
}
if (tempMat.IsKeywordEnabled("NOCULL"))
{
tempMat.SetInt("_Cull", 0);
}
if (tempMat.IsKeywordEnabled("LIMBREMOVAL"))
{
tempMat.SetInt("_LimbRemovalOn", 1);
}
cachedMaterials.Add(tempMat);
return tempMat;
}
[IteratorStateMachine(typeof(<FixRenderQueues>d__6))]
public static IEnumerator FixRenderQueues()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <FixRenderQueues>d__6(0);
}
public static Material MakeUnique(this Material material)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
if (cachedMaterials.Contains(material))
{
return new Material(material);
}
return material;
}
public static Material SetColor(this Material material, Color color)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
material.SetColor("_Color", color);
return material;
}
public static Material SetNormal(this Material material, float normalStrength = 1f)
{
material.SetFloat("_NormalStrength", normalStrength);
return material;
}
public static Material SetEmission(this Material material)
{
return material.SetEmission(1f);
}
public static Material SetEmission(this Material material, float emission)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
return material.SetEmission(emission, Color.white);
}
public static Material SetEmission(this Material material, float emission, Color emissionColor)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
material.SetFloat("_EmPower", emission);
material.SetColor("_EmColor", emissionColor);
return material;
}
public static Material SetCull(this Material material, bool cull = false)
{
material.SetInt("_Cull", cull ? 1 : 0);
return material;
}
public static Material SetSpecular(this Material material, float strength)
{
material.SetFloat("_SpecularStrength", strength);
return material;
}
public static Material SetSpecular(this Material material, float strength, float exponent)
{
material.SetFloat("_SpecularStrength", strength);
material.SetFloat("SpecularExponent", exponent);
return material;
}
}
internal static class Prefabs
{
private static PhysicMaterial ragdollMaterial;
public static GameObject CreateDisplayPrefab(AssetBundle assetBundle, string displayPrefabName, GameObject prefab)
{
GameObject val = assetBundle.LoadAsset<GameObject>(displayPrefabName);
if ((Object)(object)val == (Object)null)
{
Log.Error("could not load display prefab " + displayPrefabName + ". Make sure this prefab exists in assetbundle " + ((Object)assetBundle).name);
return null;
}
CharacterModel val2 = val.GetComponent<CharacterModel>();
if (!Object.op_Implicit((Object)(object)val2))
{
val2 = val.AddComponent<CharacterModel>();
}
val2.baseRendererInfos = prefab.GetComponentInChildren<CharacterModel>().baseRendererInfos;
CharacterAssets.ConvertAllRenderersToHopooShader(val);
return val;
}
public static GameObject LoadCharacterModel(AssetBundle assetBundle, string modelName)
{
GameObject val = assetBundle.LoadAsset<GameObject>(modelName);
if ((Object)(object)val == (Object)null)
{
Log.Error("could not load model prefab " + modelName + ". Make sure this prefab exists in assetbundle " + ((Object)assetBundle).name);
return null;
}
return val;
}
public static GameObject LoadCharacterBody(AssetBundle assetBundle, string bodyName)
{
GameObject val = assetBundle.LoadAsset<GameObject>(bodyName);
if ((Object)(object)val == (Object)null)
{
Log.Error("could not load body prefab " + bodyName + ". Make sure this prefab exists in assetbundle " + ((Object)assetBundle).name);
return null;
}
return val;
}
public static GameObject CloneCharacterBody(BodyInfo bodyInfo)
{
GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterBodies/" + bodyInfo.bodyNameToClone + "Body");
if (!Object.op_Implicit((Object)(object)val))
{
Log.Error(bodyInfo.bodyNameToClone + " Body to clone is not a valid body, character creation failed");
return null;
}
GameObject val2 = PrefabAPI.InstantiateClone(val, bodyInfo.bodyName);
for (int num = val2.transform.childCount - 1; num >= 0; num--)
{
Object.DestroyImmediate((Object)(object)((Component)val2.transform.GetChild(num)).gameObject);
}
return val2;
}
public static GameObject CreateBodyPrefab(AssetBundle assetBundle, string modelPrefabName, BodyInfo bodyInfo)
{
return CreateBodyPrefab(LoadCharacterModel(assetBundle, modelPrefabName), bodyInfo);
}
public static GameObject CreateBodyPrefab(GameObject model, BodyInfo bodyInfo)
{
return CreateBodyPrefab(CloneCharacterBody(bodyInfo), model, bodyInfo);
}
public static GameObject CreateBodyPrefab(GameObject newBodyPrefab, AssetBundle assetBundle, string modelName, BodyInfo bodyInfo)
{
return CreateBodyPrefab(newBodyPrefab, LoadCharacterModel(assetBundle, modelName), bodyInfo);
}
public static GameObject CreateBodyPrefab(AssetBundle assetBundle, string bodyPrefabName, string modelPrefabName, BodyInfo bodyInfo)
{
return CreateBodyPrefab(LoadCharacterBody(assetBundle, bodyPrefabName), LoadCharacterModel(assetBundle, modelPrefabName), bodyInfo);
}
public static GameObject CreateBodyPrefab(GameObject newBodyPrefab, GameObject model, BodyInfo bodyInfo)
{
if ((Object)(object)model == (Object)null || (Object)(object)newBodyPrefab == (Object)null)
{
Log.Error($"Character creation failed. Model: {model}, Body: {newBodyPrefab}");
return null;
}
SetupCharacterBody(newBodyPrefab, bodyInfo);
Transform modelBaseTransform = AddCharacterModelToSurvivorBody(newBodyPrefab, model.transform, bodyInfo);
SetupModelLocator(newBodyPrefab, modelBaseTransform, model.transform);
SetupCharacterDirection(newBodyPrefab, modelBaseTransform, model.transform);
SetupCameraTargetParams(newBodyPrefab, bodyInfo);
SetupCapsuleCollider(newBodyPrefab);
Content.AddCharacterBodyPrefab(newBodyPrefab);
return newBodyPrefab;
}
private static void SetupCharacterBody(GameObject newBodyPrefab, BodyInfo bodyInfo)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
//IL_020b: Unknown result type (might be due to invalid IL or missing references)
CharacterBody component = newBodyPrefab.GetComponent<CharacterBody>();
component.baseNameToken = bodyInfo.bodyNameToken;
component.subtitleNameToken = bodyInfo.subtitleNameToken;
component.portraitIcon = bodyInfo.characterPortrait;
component.bodyColor = bodyInfo.bodyColor;
component._defaultCrosshairPrefab = bodyInfo.crosshair;
component.hideCrosshair = false;
component.preferredPodPrefab = bodyInfo.podPrefab;
component.baseMaxHealth = bodyInfo.maxHealth;
component.baseRegen = bodyInfo.healthRegen;
component.baseArmor = bodyInfo.armor;
component.baseMaxShield = bodyInfo.shield;
component.baseDamage = bodyInfo.damage;
component.baseAttackSpeed = bodyInfo.attackSpeed;
component.baseCrit = bodyInfo.crit;
component.baseMoveSpeed = bodyInfo.moveSpeed;
component.baseJumpPower = bodyInfo.jumpPower;
component.autoCalculateLevelStats = bodyInfo.autoCalculateLevelStats;
if (bodyInfo.autoCalculateLevelStats)
{
component.levelMaxHealth = Mathf.Round(component.baseMaxHealth * 0.3f);
component.levelMaxShield = Mathf.Round(component.baseMaxShield * 0.3f);
component.levelRegen = component.baseRegen * 0.2f;
component.levelMoveSpeed = 0f;
component.levelJumpPower = 0f;
component.levelDamage = component.baseDamage * 0.2f;
component.levelAttackSpeed = 0f;
component.levelCrit = 0f;
component.levelArmor = 0f;
}
else
{
component.levelMaxHealth = bodyInfo.healthGrowth;
component.levelMaxShield = bodyInfo.shieldGrowth;
component.levelRegen = bodyInfo.regenGrowth;
component.levelMoveSpeed = bodyInfo.moveSpeedGrowth;
component.levelJumpPower = bodyInfo.jumpPowerGrowth;
component.levelDamage = bodyInfo.damageGrowth;
component.levelAttackSpeed = bodyInfo.attackSpeedGrowth;
component.levelCrit = bodyInfo.critGrowth;
component.levelArmor = bodyInfo.armorGrowth;
}
component.baseAcceleration = bodyInfo.acceleration;
component.baseJumpCount = bodyInfo.jumpCount;
component.sprintingSpeedMultiplier = 1.45f;
component.bodyFlags = (BodyFlags)16;
component.rootMotionInMainState = false;
component.hullClassification = (HullClassification)0;
component.isChampion = false;
}
private static Transform AddCharacterModelToSurvivorBody(GameObject bodyPrefab, Transform modelTransform, BodyInfo bodyInfo)
{
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
Transform val = bodyPrefab.transform.Find("ModelBase");
if ((Object)(object)val == (Object)null)
{
val = new GameObject("ModelBase").transform;
val.parent = bodyPrefab.transform;
val.localPosition = bodyInfo.modelBasePosition;
val.localRotation = Quaternion.identity;
}
modelTransform.parent = ((Component)val).transform;
modelTransform.localPosition = Vector3.zero;
modelTransform.localRotation = Quaternion.identity;
Transform val2 = bodyPrefab.transform.Find("CameraPivot");
if ((Object)(object)val2 == (Object)null)
{
val2 = new GameObject("CameraPivot").transform;
val2.parent = bodyPrefab.transform;
val2.localPosition = bodyInfo.cameraPivotPosition;
val2.localRotation = Quaternion.identity;
}
Transform val3 = bodyPrefab.transform.Find("AimOrigin");
if ((Object)(object)val3 == (Object)null)
{
val3 = new GameObject("AimOrigin").transform;
val3.parent = bodyPrefab.transform;
val3.localPosition = bodyInfo.aimOriginPosition;
val3.localRotation = Quaternion.identity;
}
bodyPrefab.GetComponent<CharacterBody>().aimOriginTransform = val3;
return ((Component)val).transform;
}
private static void SetupCharacterDirection(GameObject prefab, Transform modelBaseTransform, Transform modelTransform)
{
if (Object.op_Implicit((Object)(object)prefab.GetComponent<CharacterDirection>()))
{
CharacterDirection component = prefab.GetComponent<CharacterDirection>();
component.targetTransform = modelBaseTransform;
component.overrideAnimatorForwardTransform = null;
component.rootMotionAccumulator = null;
component.modelAnimator = ((Component)modelTransform).GetComponent<Animator>();
component.driveFromRootRotation = false;
component.turnSpeed = 720f;
}
}
private static void SetupCameraTargetParams(GameObject prefab, BodyInfo bodyInfo)
{
CameraTargetParams component = prefab.GetComponent<CameraTargetParams>();
component.cameraParams = bodyInfo.cameraParams;
component.cameraPivotTransform = prefab.transform.Find("CameraPivot");
}
private static void SetupModelLocator(GameObject prefab, Transform modelBaseTransform, Transform modelTransform)
{
ModelLocator component = prefab.GetComponent<ModelLocator>();
component.modelTransform = modelTransform;
component.modelBaseTransform = modelBaseTransform;
}
private static void SetupCapsuleCollider(GameObject prefab)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
CapsuleCollider component = prefab.GetComponent<CapsuleCollider>();
component.center = new Vector3(0f, 0f, 0f);
component.radius = 0.5f;
component.height = 1.82f;
component.direction = 1;
}
public static CharacterModel SetupCharacterModel(GameObject bodyPrefab, CustomRendererInfo[] customInfos = null)
{
CharacterModel val = ((Component)bodyPrefab.GetComponent<ModelLocator>().modelTransform).gameObject.GetComponent<CharacterModel>();
bool flag = (Object)(object)val != (Object)null;
if (!flag)
{
val = ((Component)bodyPrefab.GetComponent<ModelLocator>().modelTransform).gameObject.AddComponent<CharacterModel>();
}
val.body = bodyPrefab.GetComponent<CharacterBody>();
val.autoPopulateLightInfos = true;
val.invisibilityCount = 0;
val.temporaryOverlays = new List<TemporaryOverlayInstance>();
if (!flag)
{
SetupCustomRendererInfos(val, customInfos);
}
else
{
SetupPreAttachedRendererInfos(val);
}
SetupHurtboxGroup(bodyPrefab, ((Component)val).gameObject);
SetupAimAnimator(bodyPrefab, ((Component)val).gameObject);
SetupFootstepController(((Component)val).gameObject);
SetupRagdoll(((Component)val).gameObject);
return val;
}
public static void SetupPreAttachedRendererInfos(CharacterModel characterModel)
{
for (int i = 0; i < characterModel.baseRendererInfos.Length; i++)
{
if ((Object)(object)characterModel.baseRendererInfos[i].defaultMaterial == (Object)null)
{
characterModel.baseRendererInfos[i].defaultMaterial = characterModel.baseRendererInfos[i].renderer.sharedMaterial;
}
if ((Object)(object)characterModel.baseRendererInfos[i].defaultMaterial == (Object)null)
{
Log.Error($"no material for rendererinfo of this renderer: {characterModel.baseRendererInfos[i].renderer}");
}
characterModel.baseRendererInfos[i].defaultMaterial.ConvertDefaultShaderToHopoo();
}
}
public static void SetupCustomRendererInfos(CharacterModel characterModel, CustomRendererInfo[] customInfos)
{
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
ChildLocator component = ((Component)characterModel).GetComponent<ChildLocator>();
if (!Object.op_Implicit((Object)(object)component))
{
Log.Error("Failed CharacterModel setup: ChildLocator component does not exist on the model");
return;
}
List<RendererInfo> list = new List<RendererInfo>();
for (int i = 0; i < customInfos.Length; i++)
{
if (!Object.op_Implicit((Object)(object)component.FindChild(customInfos[i].childName)))
{
Log.Error("Trying to add a RendererInfo for a renderer that does not exist: " + customInfos[i].childName);
continue;
}
Renderer component2 = ((Component)component.FindChild(customInfos[i].childName)).GetComponent<Renderer>();
if (Object.op_Implicit((Object)(object)component2))
{
Material val = customInfos[i].material;
if ((Object)(object)val == (Object)null)
{
val = ((!customInfos[i].dontHotpoo) ? component2.sharedMaterial.ConvertDefaultShaderToHopoo() : component2.sharedMaterial);
}
list.Add(new RendererInfo
{
renderer = component2,
defaultMaterial = val,
ignoreOverlays = customInfos[i].ignoreOverlays,
defaultShadowCastingMode = (ShadowCastingMode)1
});
}
}
characterModel.baseRendererInfos = list.ToArray();
}
private static void SetupHurtboxGroup(GameObject bodyPrefab, GameObject model)
{
SetupMainHurtboxesFromChildLocator(bodyPrefab, model);
SetHurtboxesHealthComponents(bodyPrefab);
}
private static void SetupMainHurtboxesFromChildLocator(GameObject bodyPrefab, GameObject model)
{
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)bodyPrefab.GetComponent<HurtBoxGroup>() != (Object)null)
{
Log.Debug("Hitboxgroup already exists on model prefab. aborting code setup");
return;
}
ChildLocator component = model.GetComponent<ChildLocator>();
if (string.IsNullOrEmpty(component.FindChildNameInsensitive("MainHurtbox")))
{
Log.Error("Could not set up main hurtbox: make sure you have a transform pair in your prefab's ChildLocator called 'MainHurtbox'");
return;
}
HurtBoxGroup val = model.AddComponent<HurtBoxGroup>();
HurtBox val2 = null;
GameObject val3 = component.FindChildGameObjectInsensitive("HeadHurtbox");
if (Object.op_Implicit((Object)(object)val3))
{
Log.Debug("HeadHurtboxFound. Setting up");
val2 = val3.AddComponent<HurtBox>();
((Component)val2).gameObject.layer = LayerIndex.entityPrecise.intVal;
val2.healthComponent = bodyPrefab.GetComponent<HealthComponent>();
val2.isBullseye = false;
val2.isSniperTarget = true;
val2.damageModifier = (DamageModifier)0;
val2.hurtBoxGroup = val;
val2.indexInGroup = 1;
}
HurtBox val4 = component.FindChildGameObjectInsensitive("MainHurtbox").AddComponent<HurtBox>();
((Component)val4).gameObject.layer = LayerIndex.entityPrecise.intVal;
val4.healthComponent = bodyPrefab.GetComponent<HealthComponent>();
val4.isBullseye = true;
val4.isSniperTarget = (Object)(object)val2 == (Object)null;
val4.damageModifier = (DamageModifier)0;
val4.hurtBoxGroup = val;
val4.indexInGroup = 0;
if (Object.op_Implicit((Object)(object)val2))
{
val.hurtBoxes = (HurtBox[])(object)new HurtBox[2] { val4, val2 };
}
else
{
val.hurtBoxes = (HurtBox[])(object)new HurtBox[1] { val4 };
}
val.mainHurtBox = val4;
val.bullseyeCount = 1;
}
private static string FindChildNameInsensitive(this ChildLocator childLocator, string child)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
return childLocator.transformPairs.Where((NameTransformPair pair) => pair.name.ToLowerInvariant() == child.ToLowerInvariant()).FirstOrDefault().name;
}
private static Transform FindChildInsensitive(this ChildLocator childLocator, string child)
{
return childLocator.FindChild(childLocator.FindChildNameInsensitive(child));
}
private static GameObject FindChildGameObjectInsensitive(this ChildLocator childLocator, string child)
{
return childLocator.FindChildGameObject(childLocator.FindChildNameInsensitive(child));
}
public static void SetHurtboxesHealthComponents(GameObject bodyPrefab)
{
HealthComponent component = bodyPrefab.GetComponent<HealthComponent>();
HurtBoxGroup[] componentsInChildren = bodyPrefab.GetComponentsInChildren<HurtBoxGroup>();
foreach (HurtBoxGroup val in componentsInChildren)
{
val.mainHurtBox.healthComponent = component;
for (int j = 0; j < val.hurtBoxes.Length; j++)
{
val.hurtBoxes[j].healthComponent = component;
}
}
}
private static void SetupFootstepController(GameObject model)
{
FootstepHandler val = model.AddComponent<FootstepHandler>();
val.baseFootstepString = "Play_player_footstep";
val.sprintFootstepOverrideString = "";
val.enableFootstepDust = true;
val.footstepDustPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/GenericFootstepDust");
}
private static void SetupRagdoll(GameObject model)
{
RagdollController component = model.GetComponent<RagdollController>();
if (!Object.op_Implicit((Object)(object)component))
{
return;
}
if ((Object)(object)ragdollMaterial == (Object)null)
{
ragdollMaterial = ((Component)LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterBodies/CommandoBody").GetComponentInChildren<RagdollController>().bones[1]).GetComponent<Collider>().material;
}
Transform[] bones = component.bones;
foreach (Transform val in bones)
{
if (Object.op_Implicit((Object)(object)val))
{
((Component)val).gameObject.layer = LayerIndex.ragdoll.intVal;
Collider component2 = ((Component)val).GetComponent<Collider>();
if (Object.op_Implicit((Object)(object)component2))
{
component2.sharedMaterial = ragdollMaterial;
}
else
{
Log.Error($"Ragdoll bone {((Component)val).gameObject} doesn't have a collider. Ragdoll will break.");
}
}
}
}
private static void SetupAimAnimator(GameObject prefab, GameObject model)
{
AimAnimator val = model.AddComponent<AimAnimator>();
val.directionComponent = prefab.GetComponent<CharacterDirection>();
val.pitchRangeMax = 60f;
val.pitchRangeMin = -60f;
val.yawRangeMin = -80f;
val.yawRangeMax = 80f;
val.pitchGiveupRange = 30f;
val.yawGiveupRange = 10f;
val.giveupDuration = 3f;
val.inputBank = prefab.GetComponent<InputBankTest>();
}
public static void CreateGenericDoppelganger(GameObject bodyPrefab, string masterName, string masterToCopy)
{
CloneDopplegangerMaster(bodyPrefab, masterName, masterToCopy);
}
public static GameObject CloneDopplegangerMaster(GameObject bodyPrefab, string masterName, string masterToCopy)
{
GameObject val = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/" + masterToCopy + "MonsterMaster"), masterName, true);
val.GetComponent<CharacterMaster>().bodyPrefab = bodyPrefab;
Content.AddMasterPrefab(val);
return val;
}
public static GameObject CreateBlankMasterPrefab(GameObject bodyPrefab, string masterName)
{
GameObject val = PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/CharacterMasters/CommandoMonsterMaster"), masterName, true);
ContentPacks.masterPrefabs.Add(val);
CharacterMaster component = val.GetComponent<CharacterMaster>();
component.bodyPrefab = bodyPrefab;
AISkillDriver[] components = val.GetComponents<AISkillDriver>();
for (int i = 0; i < components.Length; i++)
{
Object.Destroy((Object)(object)components[i]);
}
return val;
}
public static GameObject LoadMaster(this AssetBundle assetBundle, GameObject bodyPrefab, string assetName)
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
GameObject val = assetBundle.LoadAsset<GameObject>(assetName);
BaseAI val2 = val.GetComponent<BaseAI>();
if ((Object)(object)val2 == (Object)null)
{
val2 = val.AddComponent<BaseAI>();
val2.aimVectorDampTime = 0.1f;
val2.aimVectorMaxSpeed = 360f;
}
val2.scanState = new SerializableEntityStateType(typeof(Wander));
EntityStateMachine component = val.GetComponent<EntityStateMachine>();
if ((Object)(object)component == (Object)null)
{
AddEntityStateMachine(val, "AI", typeof(Wander), typeof(Wander));
}
val2.stateMachine = component;
CharacterMaster val3 = val.GetComponent<CharacterMaster>();
if ((Object)(object)val3 == (Object)null)
{
val3 = val.AddComponent<CharacterMaster>();
}
val3.bodyPrefab = bodyPrefab;
val3.teamIndex = (TeamIndex)2;
Content.AddMasterPrefab(val);
return val;
}
public static void ClearEntityStateMachines(GameObject bodyPrefab)
{
EntityStateMachine[] components = bodyPrefab.GetComponents<EntityStateMachine>();
for (int num = components.Length - 1; num >= 0; num--)
{
Object.DestroyImmediate((Object)(object)components[num]);
}
NetworkStateMachine component = bodyPrefab.GetComponent<NetworkStateMachine>();
component.stateMachines = Array.Empty<EntityStateMachine>();
CharacterDeathBehavior component2 = bodyPrefab.GetComponent<CharacterDeathBehavior>();
if (Object.op_Implicit((Object)(object)component2))
{
component2.idleStateMachine = Array.Empty<EntityStateMachine>();
}
SetStateOnHurt component3 = bodyPrefab.GetComponent<SetStateOnHurt>();
if (Object.op_Implicit((Object)(object)component3))
{
component3.idleStateMachine = Array.Empty<EntityStateMachine>();
}
CharacterBody component4 = bodyPrefab.GetComponent<CharacterBody>();
if (Object.op_Implicit((Object)(object)component4))
{
component4.vehicleIdleStateMachine = Array.Empty<EntityStateMachine>();
}
}
public static void AddMainEntityStateMachine(GameObject bodyPrefab, string machineName = "Body", Type mainStateType = null, Type initalStateType = null)
{
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
EntityStateMachine val = EntityStateMachine.FindByCustomName(bodyPrefab, machineName);
if ((Object)(object)val == (Object)null)
{
val = bodyPrefab.AddComponent<EntityStateMachine>();
}
else
{
Log.Message("An Entity State Machine already exists with the name " + machineName + ". replacing.");
}
val.customName = machineName;
if (mainStateType == null)
{
mainStateType = typeof(GenericCharacterMain);
}
val.mainStateType = new SerializableEntityStateType(mainStateType);
if (initalStateType == null)
{
initalStateType = typeof(SpawnTeleporterState);
}
val.initialStateType = new SerializableEntityStateType(initalStateType);
NetworkStateMachine component = bodyPrefab.GetComponent<NetworkStateMachine>();
if (Object.op_Implicit((Object)(object)component))
{
component.stateMachines = component.stateMachines.Append(val).ToArray();
}
CharacterDeathBehavior component2 = bodyPrefab.GetComponent<CharacterDeathBehavior>();
if (Object.op_Implicit((Object)(object)component2))
{
component2.deathStateMachine = val;
}
SetStateOnHurt component3 = bodyPrefab.GetComponent<SetStateOnHurt>();
if (Object.op_Implicit((Object)(object)component3))
{
component3.targetStateMachine = val;
}
}
public static void AddEntityStateMachine(GameObject prefab, string machineName, Type mainStateType = null, Type initalStateType = null)
{
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
EntityStateMachine val = EntityStateMachine.FindByCustomName(prefab, machineName);
if ((Object)(object)val == (Object)null)
{
val = prefab.AddComponent<EntityStateMachine>();
}
else
{
Log.Message("An Entity State Machine already exists with the name " + machineName + ". replacing.");
}
val.customName = machineName;
if (mainStateType == null)
{
mainStateType = typeof(Idle);
}
val.mainStateType = new SerializableEntityStateType(mainStateType);
if (initalStateType == null)
{
initalStateType = typeof(Idle);
}
val.initialStateType = new SerializableEntityStateType(initalStateType);
NetworkStateMachine component = prefab.GetComponent<NetworkStateMachine>();
if (Object.op_Implicit((Object)(object)component))
{
component.stateMachines = component.stateMachines.Append(val).ToArray();
}
CharacterDeathBehavior component2 = prefab.GetComponent<CharacterDeathBehavior>();
if (Object.op_Implicit((Object)(object)component2))
{
component2.idleStateMachine = component2.idleStateMachine.Append(val).ToArray();
}
SetStateOnHurt component3 = prefab.GetComponent<SetStateOnHurt>();
if (Object.op_Implicit((Object)(object)component3))
{
component3.idleStateMachine = component3.idleStateMachine.Append(val).ToArray();
}
}
public static void SetupHitBoxGroup(GameObject modelPrefab, string hitBoxGroupName, params string[] hitboxChildNames)
{
ChildLocator component = modelPrefab.GetComponent<ChildLocator>();
Transform[] array = (Transform[])(object)new Transform[hitboxChildNames.Length];
for (int i = 0; i < hitboxChildNames.Length; i++)
{
array[i] = component.FindChild(hitboxChildNames[i]);
if ((Object)(object)array[i] == (Object)null)
{
Log.Error("missing hitbox for " + hitboxChildNames[i]);
}
}
SetupHitBoxGroup(modelPrefab, hitBoxGroupName, array);
}
public static void SetupHitBoxGroup(GameObject prefab, string hitBoxGroupName, params Transform[] hitBoxTransforms)
{
List<HitBox> list = new List<HitBox>();
foreach (Transform val in hitBoxTransforms)
{
if ((Object)(object)val == (Object)null)
{
Log.Error("Error setting up hitboxGroup for " + hitBoxGroupName + ": hitbox transform was null");
continue;
}
HitBox item = ((Component)val).gameObject.AddComponent<HitBox>();
((Component)val).gameObject.layer = LayerIndex.projectile.intVal;
list.Add(item);
}
if (list.Count == 0)
{
Log.Error("No hitboxes were set up. aborting setting up hitboxGroup for " + hitBoxGroupName);
return;
}
HitBoxGroup val2 = prefab.AddComponent<HitBoxGroup>();
val2.hitBoxes = list.ToArray();
val2.groupName = hitBoxGroupName;
}
}
public class CustomRendererInfo
{
public string childName;
public Material material = null;
public bool dontHotpoo = false;
public bool ignoreOverlays = false;
}
internal static class Skills
{
public static void CreateSkillFamilies(GameObject targetPrefab, bool destroyExisting = true)
{
SkillSlot[] array = new SkillSlot[4];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
CreateSkillFamilies(targetPrefab, destroyExisting, (SkillSlot[])(object)array);
}
public static void CreateSkillFamilies(GameObject targetPrefab, bool destroyExisting, params SkillSlot[] slots)
{
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Expected I4, but got Unknown
if (destroyExisting)
{
GenericSkill[] componentsInChildren = targetPrefab.GetComponentsInChildren<GenericSkill>();
foreach (GenericSkill val in componentsInChildren)
{
Object.DestroyImmediate((Object)(object)val);
}
}
SkillLocator component = targetPrefab.GetComponent<SkillLocator>();
BansheePassive component2 = targetPrefab.GetComponent<BansheePassive>();
if (Object.op_Implicit((Object)(object)component2))
{
component2.passiveSkillSlot = CreateGenericSkillWithSkillFamily(targetPrefab, "Passive");
}
foreach (SkillSlot val2 in slots)
{
SkillSlot val3 = val2;
switch ((int)val3)
{
case 0:
component.primary = CreateGenericSkillWithSkillFamily(targetPrefab, "Primary");
break;
case 1:
component.secondary = CreateGenericSkillWithSkillFamily(targetPrefab, "Secondary");
break;
case 2:
component.utility = CreateGenericSkillWithSkillFamily(targetPrefab, "Utility");
break;
case 3:
component.special = CreateGenericSkillWithSkillFamily(targetPrefab, "Special");
break;
}
}
}
internal static void CreateDecoySkillFamilies(GameObject targetPrefab)
{
GenericSkill[] componentsInChildren = targetPrefab.GetComponentsInChildren<GenericSkill>();
foreach (GenericSkill val in componentsInChildren)
{
Object.DestroyImmediate((Object)(object)val);
}
}
public static GenericSkill CreateGenericSkillWithSkillFamily(GameObject targetPrefab, string familyName, bool hidden = false)
{
GenericSkill val = targetPrefab.AddComponent<GenericSkill>();
val.skillName = familyName;
val.hideInCharacterSelect = hidden;
SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
((Object)val2).name = ((Object)targetPrefab).name + familyName + "Family";
val2.variants = (Variant[])(object)new Variant[0];
val._skillFamily = val2;
Content.AddSkillFamily(val2);
return val;
}
public static void AddSkillToFamily(SkillFamily skillFamily, SkillDef skillDef, UnlockableDef unlockableDef = null)
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Expected O, but got Unknown
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
Variant[] variants = skillFamily.variants;
int num = skillFamily.variants.Length - 1;
Variant val = new Variant
{
skillDef = skillDef,
unlockableDef = unlockableDef
};
((Variant)(ref val)).viewableNode = new Node(skillDef.skillNameToken, false, (Node)null);
variants[num] = val;
}
public static void AddSkillsToFamily(SkillFamily skillFamily, params SkillDef[] skillDefs)
{
foreach (SkillDef skillDef in skillDefs)
{
AddSkillToFamily(skillFamily, skillDef);
}
}
public static void AddPrimarySkills(GameObject targetPrefab, params SkillDef[] skillDefs)
{
AddSkillsToFamily(targetPrefab.GetComponent<SkillLocator>().primary.skillFamily, skillDefs);
}
public static void AddSecondarySkills(GameObject targetPrefab, params SkillDef[] skillDefs)
{
AddSkillsToFamily(targetPrefab.GetComponent<SkillLocator>().secondary.skillFamily, skillDefs);
}
public static void AddUtilitySkills(GameObject targetPrefab, params SkillDef[] skillDefs)
{
AddSkillsToFamily(targetPrefab.GetComponent<SkillLocator>().utility.skillFamily, skillDefs);
}
public static void AddSpecialSkills(GameObject targetPrefab, params SkillDef[] skillDefs)
{
AddSkillsToFamily(targetPrefab.GetComponent<SkillLocator>().special.skillFamily, skillDefs);
}
public static void AddPassiveSkills(SkillFamily passiveSkillFamily, params SkillDef[] skillDefs)
{
AddSkillsToFamily(passiveSkillFamily, skillDefs);
}
public static void AddUnlockablesToFamily(SkillFamily skillFamily, params UnlockableDef[] unlockableDefs)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
for (int i = 0; i < unlockableDefs.Length; i++)
{
Variant val = skillFamily.variants[i];
val.unlockableDef = unlockableDefs[i];
skillFamily.variants[i] = val;
}
}
public static SkillDef CreateSkillDef(SkillDefInfo skillDefInfo)
{
return Skills.CreateSkillDef<SkillDef>(skillDefInfo);
}
public static ReloadSkillDef CreateReloadSkillDef(ReloadSkillDefInfo skillDefInfo)
{
return Skills.CreateReloadSkillDef<ReloadSkillDef>(skillDefInfo);
}
public static T CreateSkillDef<T>(SkillDefInfo skillDefInfo) where T : SkillDef
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
T val = ScriptableObject.CreateInstance<T>();
((SkillDef)val).skillName = skillDefInfo.skillName;
((Object)(object)val).name = skillDefInfo.skillName;
((SkillDef)val).skillNameToken = skillDefInfo.skillNameToken;
((SkillDef)val).skillDescriptionToken = skillDefInfo.skillDescriptionToken;
((SkillDef)val).icon = skillDefInfo.skillIcon;
((SkillDef)val).activationState = skillDefInfo.activationState;
((SkillDef)val).activationStateMachineName = skillDefInfo.activationStateMachineName;
((SkillDef)val).interruptPriority = skillDefInfo.interruptPriority;
((SkillDef)val).baseMaxStock = skillDefInfo.baseMaxStock;
((SkillDef)val).baseRechargeInterval = skillDefInfo.baseRechargeInterval;
((SkillDef)val).rechargeStock = skillDefInfo.rechargeStock;
((SkillDef)val).requiredStock = skillDefInfo.requiredStock;
((SkillDef)val).stockToConsume = skillDefInfo.stockToConsume;
((SkillDef)val).dontAllowPastMaxStocks = skillDefInfo.dontAllowPastMaxStocks;
((SkillDef)val).beginSkillCooldownOnSkillEnd = skillDefInfo.beginSkillCooldownOnSkillEnd;
((SkillDef)val).canceledFromSprinting = skillDefInfo.canceledFromSprinting;
((SkillDef)val).forceSprintDuringState = skillDefInfo.forceSprintDuringState;
((SkillDef)val).fullRestockOnAssign = skillDefInfo.fullRestockOnAssign;
((SkillDef)val).resetCooldownTimerOnUse = skillDefInfo.resetCooldownTimerOnUse;
((SkillDef)val).isCombatSkill = skillDefInfo.isCombatSkill;
((SkillDef)val).mustKeyPress = skillDefInfo.mustKeyPress;
((SkillDef)val).cancelSprintingOnActivation = skillDefInfo.cancelSprintingOnActivation;
((SkillDef)val).autoHandleLuminousShot = skillDefInfo.autoHandleLuminousShot;
((SkillDef)val).keywordTokens = skillDefInfo.keywordTokens;
Content.AddSkillDef((SkillDef)(object)val);
return val;
}
public static T CreateReloadSkillDef<T>(ReloadSkillDefInfo skillDefInfo) where T : ReloadSkillDef
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
T val = ScriptableObject.CreateInstance<T>();
((SkillDef)(object)val).skillName = skillDefInfo.skillName;
((Object)(object)val).name = skillDefInfo.skillName;
((SkillDef)(object)val).skillNameToken = skillDefInfo.skillNameToken;
((SkillDef)(object)val).skillDescriptionToken = skillDefInfo.skillDescriptionToken;
((SkillDef)(object)val).icon = skillDefInfo.skillIcon;
((SkillDef)(object)val).activationState = skillDefInfo.activationState;
((ReloadSkillDef)val).reloadState = skillDefInfo.reloadState;
((SkillDef)(object)val).activationStateMachineName = skillDefInfo.activationStateMachineName;
((SkillDef)(object)val).interruptPriority = skillDefInfo.interruptPriority;
((ReloadSkillDef)val).reloadInterruptPriority = skillDefInfo.reloadInterruptPriority;
((SkillDef)(object)val).baseMaxStock = skillDefInfo.baseMaxStock;
((SkillDef)(object)val).baseRechargeInterval = skillDefInfo.baseRechargeInterval;
((ReloadSkillDef)val).graceDuration = skillDefInfo.graceDuration;
((SkillDef)(object)val).rechargeStock = skillDefInfo.rechargeStock;
((SkillDef)(object)val).requiredStock = skillDefInfo.requiredStock;
((SkillDef)(object)val).stockToConsume = skillDefInfo.stockToConsume;
((SkillDef)(object)val).dontAllowPastMaxStocks = skillDefInfo.dontAllowPastMaxStocks;
((SkillDef)(object)val).beginSkillCooldownOnSkillEnd = skillDefInfo.beginSkillCooldownOnSkillEnd;
((SkillDef)(object)val).canceledFromSprinting = skillDefInfo.canceledFromSprinting;
((SkillDef)(object)val).forceSprintDuringState = skillDefInfo.forceSprintDuringState;
((SkillDef)(object)val).fullRestockOnAssign = skillDefInfo.fullRestockOnAssign;
((SkillDef)(object)val).resetCooldownTimerOnUse = skillDefInfo.resetCooldownTimerOnUse;
((SkillDef)(object)val).isCombatSkill = skillDefInfo.isCombatSkill;
((SkillDef)(object)val).mustKeyPress = skillDefInfo.mustKeyPress;
((SkillDef)(object)val).cancelSprintingOnActivation = skillDefInfo.cancelSprintingOnActivation;
((SkillDef)(object)val).keywordTokens = skillDefInfo.keywordTokens;
Content.AddSkillDef((SkillDef)(object)val);
return val;
}
}
internal class SkillDefInfo
{
public string skillName;
public string skillNameToken;
public string skillDescriptionToken;
public string[] keywordTokens = new string[0];
public Sprite skillIcon;
public SerializableEntityStateType activationState;
public string activationStateMachineName;
public InterruptPriority interruptPriority;
public int baseMaxStock = 1;
public float baseRechargeInterval;
public int rechargeStock = 1;
public int requiredStock = 1;
public int stockToConsume = 1;
public bool resetCooldownTimerOnUse = false;
public bool fullRestockOnAssign = true;
public bool dontAllowPastMaxStocks = false;
public bool beginSkillCooldownOnSkillEnd = false;
public bool mustKeyPress = false;
public bool isCombatSkill = true;
public bool canceledFromSprinting = false;
public bool cancelSprintingOnActivation = true;
public bool forceSprintDuringState = false;
public bool autoHandleLuminousShot = true;
public SkillDefInfo()
{
}
public SkillDefInfo(string skillName, string skillNameToken, string skillDescriptionToken, Sprite skillIcon, SerializableEntityStateType activationState, string activationStateMachineName = "Weapon")
{
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
this.skillName = skillName;
this.skillNameToken = skillNameToken;
this.skillDescriptionToken = skillDescriptionToken;
this.skillIcon = skillIcon;
this.activationState = activationState;
this.activationStateMachineName = activationStateMachineName;
cancelSprintingOnActivation = false;
keywordTokens = new string[1] { Tokens.agileKeyword };
interruptPriority = (InterruptPriority)0;
isCombatSkill = true;
baseRechargeInterval = 0f;
requiredStock = 0;
stockToConsume = 0;
autoHandleLuminousShot = true;
}
}
internal class ReloadSkillDefInfo
{
public string skillName;
public string skillNameToken;
public string skillDescriptionToken;
public string[] keywordTokens = new string[0];
public Sprite skillIcon;
public SerializableEntityStateType activationState;
public SerializableEntityStateType reloadState;
public string activationStateMachineName;
public InterruptPriority interruptPriority;
public InterruptPriority reloadInterruptPriority;
public int baseMaxStock = 1;
public float baseRechargeInterval;
public float graceDuration;
public int rechargeStock = 1;
public int requiredStock = 1;
public int stockToConsume = 1;
public bool resetCooldownTimerOnUse = false;
public bool fullRestockOnAssign = true;
public bool dontAllowPastMaxStocks = false;
public bool beginSkillCooldownOnSkillEnd = false;
public bool mustKeyPress = false;
public bool isCombatSkill = true;
public bool canceledFromSprinting = false;
public bool cancelSprintingOnActivation = true;
public bool forceSprintDuringState = false;
public bool autoHandleLuminousShot = true;
public ReloadSkillDefInfo()
{
}
public ReloadSkillDefInfo(string skillName, string skillNameToken, string skillDescriptionToken, Sprite skillIcon, SerializableEntityStateType activationState, SerializableEntityStateType reloadState, string activationStateMachineName = "Weapon")
{
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
this.skillName = skillName;
this.skillNameToken = skillNameToken;
this.skillDescriptionToken = skillDescriptionToken;
this.skillIcon = skillIcon;
this.activationState = activationState;
this.reloadState = reloadState;
this.activationStateMachineName = activationStateMachineName;
cancelSprintingOnActivation = false;
keywordTokens = new string[1] { Tokens.agileKeyword };
interruptPriority = (InterruptPriority)0;
reloadInterruptPriority = (InterruptPriority)0;
isCombatSkill = true;
baseRechargeInterval = 0f;
requiredStock = 0;
stockToConsume = 0;
autoHandleLuminousShot = true;
}
}
internal static class Skins
{
internal struct SkinDefInfo
{
internal SkinDef[] BaseSkins;
internal Sprite Icon;
internal string NameToken;
internal UnlockableDef UnlockableDef;
internal GameObject RootObject;
internal RendererInfo[] RendererInfos;
internal MeshReplacement[] MeshReplacements;
internal GameObjectActivation[] GameObjectActivations;
internal ProjectileGhostReplacement[] ProjectileGhostReplacements;
internal MinionSkinReplacement[] MinionSkinReplacements;
internal string Name;
}
internal static SkinDef CreateSkinDef(string skinName, Sprite skinIcon, RendererInfo[] defaultRendererInfos, GameObject root, UnlockableDef unlockableDef = null)
{
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Expected O, but got Unknown
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Expected O, but got Unknown
SkinDefInfo skinDefInfo = default(SkinDefInfo);
skinDefInfo.BaseSkins = Array.Empty<SkinDef>();
skinDefInfo.GameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[0];
skinDefInfo.Icon = skinIcon;
skinDefInfo.MeshReplacements = (MeshReplacement[])(object)new MeshReplacement[0];
skinDefInfo.MinionSkinReplacements = (MinionSkinReplacement[])(object)new MinionSkinReplacement[0];
skinDefInfo.Name = skinName;
skinDefInfo.NameToken = skinName;
skinDefInfo.ProjectileGhostReplacements = (ProjectileGhostReplacement[])(object)new ProjectileGhostReplacement[0];
skinDefInfo.RendererInfos = (RendererInfo[])(object)new RendererInfo[defaultRendererInfos.Length];
skinDefInfo.RootObject = root;
skinDefInfo.UnlockableDef = unlockableDef;
SkinDefInfo skinDefInfo2 = skinDefInfo;
SkinDef.Awake += new hook_Awake(DoNothing);
SkinDef val = ScriptableObject.CreateInstance<SkinDef>();
val.baseSkins = skinDefInfo2.BaseSkins;
val.icon = skinDefInfo2.Icon;
val.unlockableDef = skinDefInfo2.UnlockableDef;
val.rootObject = skinDefInfo2.RootObject;
defaultRendererInfos.CopyTo(skinDefInfo2.RendererInfos, 0);
val.rendererInfos = skinDefInfo2.RendererInfos;
val.gameObjectActivations = skinDefInfo2.GameObjectActivations;
val.meshReplacements = skinDefInfo2.MeshReplacements;
val.projectileGhostReplacements = skinDefInfo2.ProjectileGhostReplacements;
val.minionSkinReplacements = skinDefInfo2.MinionSkinReplacements;
val.nameToken = skinDefInfo2.NameToken;
((Object)val).name = skinDefInfo2.Name;
SkinDef.Awake -= new hook_Awake(DoNothing);
return val;
}
private static void DoNothing(orig_Awake orig, SkinDef self)
{
}
private static RendererInfo[] getRendererMaterials(RendererInfo[] defaultRenderers, params Material[] materials)
{
RendererInfo[] array = (RendererInfo[])(object)new RendererInfo[defaultRenderers.Length];
defaultRenderers.CopyTo(array, 0);
for (int i = 0; i < array.Length; i++)
{
try
{
array[i].defaultMaterial = materials[i];
}
catch
{
Log.Error("error adding skin rendererinfo material. make sure you're not passing in too many");
}
}
return array;
}
internal static MeshReplacement[] getMeshReplacements(AssetBundle assetBundle, RendererInfo[] defaultRendererInfos, params string[] meshes)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
List<MeshReplacement> list = new List<MeshReplacement>();
for (int i = 0; i < defaultRendererInfos.Length; i++)
{
if (!string.IsNullOrEmpty(meshes[i]))
{
list.Add(new MeshReplacement
{
renderer = defaultRendererInfos[i].renderer,
mesh = assetBundle.LoadAsset<Mesh>(meshes[i])
});
}
}
return list.ToArray();
}
}
internal static class Tokens
{
public const string agilePrefix = "<style=cIsUtility>Agile</style>";
public static string agileKeyword = KeywordText("Agile", "The skill can be used while sprinting.");
public const string omenPrefix = "<color=#ba8fff>Omen</color>";
public static string omenKeyword = KeywordText("Omen", "This skill fires an <color=#ba8fff>Ethereal Wisp</color> when completed which deals" + $" <style=cIsDamage>{BansheeConfig.wispDamageCoefficient.Value * 100f}% damage</style> on hit and restores <style=cIsUtility>1</style> stock to your secondary skill.");
public const string aerodynamicPrefix = "<style=cIsUtility>Aerodynamic</style>";
public static string aerodynamicKeyword = KeywordText("Aerodynamic", "The skill deals more damage the longer the distance traveled before impact.");
public static string DamageText(string text)
{
return "<style=cIsDamage>" + text + "</style>";
}
public static string DamageValueText(float value)
{
return $"<style=cIsDamage>{value * 100f}% damage</style>";
}
public static string UtilityText(string text)
{
return "<style=cIsUtility>" + text + "</style>";
}
public static string RedText(string text)
{
return HealthText(text);
}
public static string HealthText(string text)
{
return "<style=cIsHealth>" + text + "</style>";
}
public static string KeywordText(string keyword, string sub)
{
return "<style=cKeywordName>" + keyword + "</style><style=cSub>" + sub + "</style>";
}
public static string ScepterDescription(string desc)
{
return "\n<color=#d299ff>SCEPTER: " + desc + "</color>";
}
public static string GetAchievementNameToken(string identifier)
{
return "ACHIEVEMENT_" + identifier.ToUpperInvariant() + "_NAME";
}
public static string GetAchievementDescriptionToken(string identifier)
{
return "ACHIEVEMENT_" + identifier.ToUpperInvariant() + "_DESCRIPTION";
}
}
}
namespace BansheeMod.Modules.Characters
{
public abstract class CharacterBase<T> where T : CharacterBase<T>, new()
{
public abstract string bodyName { get; }
public abstract string modelPrefabName { get; }
public abstract BodyInfo bodyInfo { get; }
public virtual CustomRendererInfo[] customRendererInfos { get; }
public virtual ItemDisplaysBase itemDisplays { get; }
public static T instance { get; private set; }
public abstract AssetBundle assetBundle { get; protected set; }
public abstract GameObject bodyPrefab { get; protected set; }
public abstract CharacterBody prefabCharacterBody { get; protected set; }
public abstract GameObject characterModelObject { get; protected set; }
public abstract CharacterModel prefabCharacterModel { get; protected set; }
public virtual void Initialize()
{
instance = this as T;
assetBundle = BansheeAssets.mainAssetBundle;
InitializeCharacter();
}
public virtual void InitializeCharacter()
{
InitializeCharacterBodyPrefab();
InitializeItemDisplays();
}
protected virtual void InitializeCharacterBodyPrefab()
{
charac