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 Assets.RoR2.Scripts.Platform;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.AI.Walker;
using EntityStates.Commando;
using EntityStates.Commando.CommandoWeapon;
using EntityStates.ImpMonster;
using EntityStates.Missions.BrotherEncounter;
using GhoulMod.Modules;
using GhoulMod.Modules.Achievements;
using GhoulMod.Modules.BaseStates;
using GhoulMod.Modules.Characters;
using GhoulMod.Survivors.Ghoul;
using GhoulMod.Survivors.Ghoul.Components;
using GhoulMod.Survivors.Ghoul.Items;
using GhoulMod.Survivors.Ghoul.SkillStates;
using GhoulMod.Survivors.Ghoul.SkillStates.Cling;
using HG;
using HG.BlendableTypes;
using KinematicCharacterController;
using ModdedEntityStates.Ghoul;
using On.EntityStates.Missions.BrotherEncounter;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Achievements;
using RoR2.Audio;
using RoR2.CharacterAI;
using RoR2.ContentManagement;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using UnityEngine.UI;
[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("GhoulSurvMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+513bda4b90bcbb6968126a6e585a100c748e2e3d")]
[assembly: AssemblyProduct("GhoulSurvMod")]
[assembly: AssemblyTitle("GhoulSurvMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
public class GhoulInvasionManager : MonoBehaviour
{
private readonly float invasionInterval = 300f;
private int previousInvasionCycle;
private Run run;
private GhoulWeaponComponent _ghoul;
private CharacterBody characterBody;
public int lastStageCount = -1;
public int currentStageCount;
private PickupDropTable dropTable;
private static readonly Xoroshiro128Plus treasureRng = new Xoroshiro128Plus(0uL);
private SceneDef lastSpawnSceneDef;
public List<string> restrictedStages = new List<string> { "moon", "moon2", "limbo", "bazaar", "voidstage", "arena", "mysteryspace", "meridian", "voidraid" };
public static event Action<DamageReport> onFeralGhoulDeath;
private void Start()
{
run = Run.instance;
dropTable = (PickupDropTable)(object)ScriptableObject.CreateInstance<GhoulItemDropTable>();
}
private void OnEnable()
{
GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeathGlobal;
}
private void OnDisable()
{
GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeathGlobal;
}
private void FixedUpdate()
{
int currentInvasionCycle = GetCurrentInvasionCycle();
if (!hasSpawnedThisStage() && !isRestrictedStage() && (previousInvasionCycle < currentInvasionCycle || (isRageFull(_ghoul) && _ghoul.rageThreshold > 0f)))
{
lastSpawnSceneDef = SceneCatalog.mostRecentSceneDef;
previousInvasionCycle = currentInvasionCycle;
PerformInvasion();
}
currentStageCount = run.stageClearCount;
}
public void SetGhoul(GhoulWeaponComponent ghoul)
{
_ghoul = ghoul;
}
private void OnCharacterDeathGlobal(DamageReport damageReport)
{
//IL_00bb: 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_007a: Unknown result type (might be due to invalid IL or missing references)
CharacterMaster victimMaster = damageReport.victimMaster;
Inventory val = ((victimMaster != null) ? victimMaster.inventory : null);
if (Object.op_Implicit((Object)(object)val) && damageReport.victimBody.HasBuff(GhoulBuffs.feralAffix) && val.GetItemCountEffective(Items.ExtraLife) == 0 && val.GetItemCountEffective(Items.ExtraLifeVoid) == 0 && !damageReport.victimBody.HasBuff(Buffs.ExtraLifeBuff) && damageReport.victimBody.equipmentSlot.equipmentIndex != Equipment.HealAndRevive.equipmentIndex && isRageFull(damageReport.attacker.GetComponent<GhoulWeaponComponent>()))
{
_ghoul.rageValue = 0f;
ItemDrop(GhoulAssets.essenceObject, ((Component)damageReport.victim).transform.position);
}
}
public void ItemDrop(GameObject drop, Vector3 position)
{
//IL_001f: 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_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_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: 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)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//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_006c: Unknown result type (might be due to invalid IL or missing references)
if (!NetworkServer.active)
{
Debug.LogWarning((object)"[Server] function 'System.Void RoR2.OptionChestBehavior::ItemDrop()' called on client");
return;
}
CreatePickupInfo val = default(CreatePickupInfo);
val.pickerOptions = PickupPickerController.GenerateOptionsFromDropTable(2, dropTable, treasureRng);
val.position = position;
val.rotation = Quaternion.identity;
val.prefabOverride = drop;
CreatePickupInfo val2 = val;
PickupDropletController.CreatePickupDroplet(val2, val2.position, Vector3.up * 20f);
}
private bool isRageFull(GhoulWeaponComponent wep)
{
if (Object.op_Implicit((Object)(object)wep) && wep.rageValue >= wep.rageThreshold)
{
return true;
}
return false;
}
private int GetCurrentInvasionCycle()
{
return Mathf.FloorToInt(run.GetRunStopwatch() / invasionInterval);
}
private bool isRestrictedStage()
{
if (restrictedStages.Contains(SceneCatalog.GetSceneDefForCurrentScene().baseSceneName))
{
return true;
}
return false;
}
public bool hasSpawnedThisStage()
{
if ((Object)(object)SceneCatalog.mostRecentSceneDef == (Object)(object)lastSpawnSceneDef)
{
previousInvasionCycle = GetCurrentInvasionCycle();
return true;
}
return false;
}
public static void PerformInvasion()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Invalid comparison between Unknown and I4
for (int num = CharacterMaster.readOnlyInstancesList.Count - 1; num >= 0; num--)
{
CharacterMaster val = CharacterMaster.readOnlyInstancesList[num];
if ((int)val.teamIndex == 1 && Object.op_Implicit((Object)(object)val.playerCharacterMasterController) && val.GetBody().baseNameToken == "VCR_GHOUL_NAME")
{
CreateDoppelganger(val);
}
}
}
private static void CreateDoppelganger(CharacterMaster srcCharacterMaster)
{
//IL_0052: 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_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: 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_0069: Expected O, but got Unknown
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
SpawnCard spawnCard = (SpawnCard)(object)GhoulFeralSpawnCard.GetSpawnCard(srcCharacterMaster);
if (!Object.op_Implicit((Object)(object)spawnCard))
{
return;
}
Transform spawnOnTarget;
MonsterSpawnDistance val;
if (Object.op_Implicit((Object)(object)TeleporterInteraction.instance))
{
spawnOnTarget = ((Component)TeleporterInteraction.instance).transform;
val = (MonsterSpawnDistance)0;
}
else
{
spawnOnTarget = srcCharacterMaster.GetBody().coreTransform;
val = (MonsterSpawnDistance)2;
}
DirectorPlacementRule val2 = new DirectorPlacementRule
{
spawnOnTarget = spawnOnTarget,
placementMode = (PlacementMode)3
};
DirectorCore.GetMonsterSpawnDistance(val, ref val2.minDistance, ref val2.maxDistance);
DirectorSpawnRequest val3 = new DirectorSpawnRequest(spawnCard, val2, (Xoroshiro128Plus)null);
val3.teamIndexOverride = (TeamIndex)2;
val3.ignoreTeamMemberLimit = true;
CombatSquad combatSquad = null;
val3.onSpawnedServer = (Action<SpawnResult>)Delegate.Combine(val3.onSpawnedServer, (Action<SpawnResult>)delegate(SpawnResult result)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Expected I4, but got Unknown
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)combatSquad))
{
combatSquad = Object.Instantiate<GameObject>(LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/Encounters/ShadowCloneEncounter")).GetComponent<CombatSquad>();
}
result.spawnedInstance.GetComponent<CharacterMaster>().GetBody().AddBuff(GhoulBuffs.feralAffix);
result.spawnedInstance.GetComponent<CharacterMaster>().inventory.GiveRandomItems(1, (ItemTier[])(object)new ItemTier[1] { (ItemTier)(int)GhoulItems.mutationTier.tier });
combatSquad.AddMember(result.spawnedInstance.GetComponent<CharacterMaster>());
});
DirectorCore.instance.TrySpawnObject(val3);
if (Object.op_Implicit((Object)(object)combatSquad))
{
NetworkServer.Spawn(((Component)combatSquad).gameObject);
}
Object.Destroy((Object)(object)spawnCard);
}
}
namespace GhoulSurvMod.Modules
{
public class Enemies
{
}
}
namespace ModdedEntityStates.Ghoul
{
public class AltGrappleThrownState : BaseSkillState
{
public float throwVelocity = 25f;
public BlastAttack attack;
public GameObject ghoulAttacker;
public static float blastRadius = 8f;
public static float blastProcCoefficient = 1f;
public static float blastForce = 40f;
public static Vector3 blastBonusForce = Vector3.down;
public GameObject slamExplosion;
public GameObject slamDecal;
private bool slamNextFrame;
public Vector3 throwDir;
public override void OnEnter()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
//IL_003e: 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_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: 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)
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.onMovementHit += new MovementHitDelegate(OnMovementHit);
}
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.velocity = throwDir * throwVelocity;
}
if (Object.op_Implicit((Object)(object)((EntityState)this).rigidbodyMotor))
{
RigidbodyMotor rigidbodyMotor = ((EntityState)this).rigidbodyMotor;
PhysForceInfo val = new PhysForceInfo
{
force = throwDir * throwVelocity
};
rigidbodyMotor.ApplyForceImpulse(ref val);
}
((BaseState)this).OnEnter();
}
public override void OnExit()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.onMovementHit -= new MovementHitDelegate(OnMovementHit);
}
((EntityState)this).OnExit();
}
public override void FixedUpdate()
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
if ((Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && ((EntityState)this).characterMotor.isGrounded) || slamNextFrame || isRigidBodyCollision())
{
FireBlastAttack();
if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor))
{
((EntityState)this).characterMotor.velocity = throwDir * throwVelocity;
}
((EntityState)this).outer.SetNextStateToMain();
}
((EntityState)this).FixedUpdate();
}
private void OnMovementHit(ref MovementHitInfo movementHitInfo)
{
}
private bool isRigidBodyCollision()
{
//IL_0009: 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_003e: 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)
Ray val = default(Ray);
((Ray)(ref val))..ctor(((EntityState)this).transform.position, ((EntityState)this).transform.forward);
RaycastHit val2 = default(RaycastHit);
if (Object.op_Implicit((Object)(object)((EntityState)this).rigidbodyMotor) && !Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && Util.CharacterSpherecast(((EntityState)this).gameObject, val, 3f, ref val2, 0f, LayerMask.op_Implicit(LayerIndex.world.intVal), (QueryTriggerInteraction)2))
{
return true;
}
return false;
}
public void FireBlastAttack()
{
//IL_0007: 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_0028: 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_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//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_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: 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)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: 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_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)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Expected O, but got Unknown
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
Vector3 footPosition = ((EntityState)this).characterBody.footPosition;
slamDecal = Object.Instantiate<GameObject>(GhoulAssets.slamDecal);
slamDecal.transform.position = footPosition;
attack = new BlastAttack
{
attacker = ((EntityState)this).gameObject,
baseDamage = ((BaseState)this).damageStat * 6f,
baseForce = blastForce,
bonusForce = blastBonusForce,
crit = ((BaseState)this).RollCrit(),
damageType = DamageTypeCombo.op_Implicit((DamageType)32),
falloffModel = (FalloffModel)0,
procCoefficient = blastProcCoefficient,
radius = blastRadius,
position = footPosition,
attackerFiltering = (AttackerFiltering)3,
teamIndex = (TeamIndex)1
};
attack.Fire();
}
}
}
namespace GhoulMod
{
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.vcr.GhoulSurvMod", "GhoulMod", "1.0.0")]
public class GhoulPlugin : BaseUnityPlugin
{
public const string MODUID = "com.vcr.GhoulSurvMod";
public const string MODNAME = "GhoulMod";
public const string MODVERSION = "1.0.0";
public const string DEVELOPER_PREFIX = "VCR";
public static GhoulPlugin instance;
public static bool rooInstalled => Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions");
private void Awake()
{
instance = this;
Log.Init(((BaseUnityPlugin)this).Logger);
Language.Init();
new GhoulSurvivor().Initialize();
new ContentPacks().Initialize();
NetworkingAPI.RegisterMessageType<Helpers.SyncHeal>();
}
}
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 GhoulMod.Modules
{
internal static class Asset
{
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
{
val = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)GhoulPlugin.instance).Info.Location), "AssetBundles", bundleName));
}
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 crosshairName)
{
GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/Crosshair/" + crosshairName + "Crosshair");
if ((Object)(object)val == (Object)null)
{
Log.Error("could not load crosshair with the name " + crosshairName + ". 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)GhoulPlugin.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> val = MyConfig.Bind<T>(section, name, defaultValue, description);
if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
TryRegisterOption<T>(val, min, max, restartRequired);
}
return val;
}
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)
{
//IL_0015: 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_0021: 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_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Expected O, but got Unknown
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Expected O, but got Unknown
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: 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_007b: Expected O, but got Unknown
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Expected O, but got Unknown
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Expected O, but got Unknown
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Expected O, but got Unknown
if (entry is ConfigEntry<float>)
{
ModSettingsManager.AddOption((BaseOption)new SliderOption(entry as ConfigEntry<float>, new SliderConfig
{
min = min,
max = max,
formatString = "{0:0.00}",
restartRequired = restartRequired
}));
}
if (entry is ConfigEntry<int>)
{
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(entry as ConfigEntry<int>, new IntSliderConfig
{
min = (int)min,
max = (int)max,
restartRequired = restartRequired
}));
}
if (entry is ConfigEntry<bool>)
{
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry as ConfigEntry<bool>, restartRequired));
}
if (entry is ConfigEntry<KeyboardShortcut>)
{
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(entry as ConfigEntry<KeyboardShortcut>, 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);
}
public static void InitROO(Sprite modSprite, string modDescription)
{
if (GhoulPlugin.rooInstalled)
{
_InitROO(modSprite, modDescription);
}
}
public static void _InitROO(Sprite modSprite, string modDescription)
{
ModSettingsManager.SetModIcon(modSprite);
ModSettingsManager.SetModDescription(modDescription);
}
public static bool RobGetKeyPressed(ConfigEntry<KeyboardShortcut> entry)
{
//IL_0003: 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_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: 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)
KeyboardShortcut value = entry.Value;
foreach (KeyCode modifier in ((KeyboardShortcut)(ref value)).Modifiers)
{
if (!Input.GetKey(modifier))
{
return false;
}
}
value = entry.Value;
return Input.GetKeyDown(((KeyboardShortcut)(ref value)).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)
{
//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;
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
{
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.vcr.GhoulSurvMod";
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);
}
public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args)
{
contentPack.identifier = identifier;
contentPack.bodyPrefabs.Add(bodyPrefabs.ToArray());
contentPack.masterPrefabs.Add(masterPrefabs.ToArray());
contentPack.projectilePrefabs.Add(projectilePrefabs.ToArray());
contentPack.survivorDefs.Add(survivorDefs.ToArray());
contentPack.unlockableDefs.Add(unlockableDefs.ToArray());
contentPack.skillDefs.Add(skillDefs.ToArray());
contentPack.skillFamilies.Add(skillFamilies.ToArray());
contentPack.entityStateTypes.Add(entityStates.ToArray());
contentPack.buffDefs.Add(buffDefs.ToArray());
contentPack.effectDefs.Add(effectDefs.ToArray());
contentPack.networkSoundEventDefs.Add(networkSoundEventDefs.ToArray());
args.ReportProgress(1f);
yield break;
}
public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args)
{
ContentPack.Copy(contentPack, args.output);
args.ReportProgress(1f);
yield break;
}
public IEnumerator FinalizeAsync(FinalizeAsyncArgs args)
{
args.ReportProgress(1f);
yield break;
}
}
internal class Helpers
{
internal class SyncHeal : INetMessage, ISerializableObject
{
private NetworkInstanceId netId;
private int healFraction;
public SyncHeal()
{
}
public SyncHeal(NetworkInstanceId netId, int healFraction)
{
//IL_0009: 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)
this.netId = netId;
this.healFraction = healFraction;
}
public void Deserialize(NetworkReader reader)
{
//IL_0003: 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)
netId = reader.ReadNetworkId();
healFraction = reader.ReadInt32();
}
public void OnReceived()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: 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)
GameObject val = Util.FindNetworkObject(netId);
if (Object.op_Implicit((Object)(object)val) && (!Object.op_Implicit((Object)(object)val.GetComponent<CharacterBody>()) || val.GetComponent<CharacterBody>().isPlayerControlled))
{
HealthComponent component = val.GetComponent<HealthComponent>();
if (Object.op_Implicit((Object)(object)component))
{
component.HealFraction((float)healFraction * 0.01f, default(ProcChainMask));
}
}
}
public void Serialize(NetworkWriter writer)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
writer.Write(netId);
writer.Write(healFraction);
}
}
public static bool isLocalUserGhoul
{
get
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if ((Object)(object)instance != (Object)null && (Object)(object)instance.networkUser != (Object)null)
{
GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(instance.networkUser.bodyIndexPreference);
if (Object.op_Implicit((Object)(object)bodyPrefab) && Object.op_Implicit((Object)(object)bodyPrefab.GetComponent<GhoulWeaponComponent>()) && ((NetworkBehaviour)instance).hasAuthority)
{
return true;
}
}
}
return false;
}
}
public static PlayerCharacterMasterController getLocalPlayer
{
get
{
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (((NetworkBehaviour)instance).hasAuthority)
{
return instance;
}
}
return null;
}
}
public static NetworkUser getLocalUser
{
get
{
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (((NetworkBehaviour)instance).hasAuthority)
{
return instance.networkUser;
}
}
return null;
}
}
}
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 = false;
public static bool printingEnabled = false;
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)GhoulPlugin.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)GhoulPlugin.instance).Info.Location).FullName, "Language", "en", fileName);
File.WriteAllText(path, text);
}
TokensOutput = "";
}
}
}
internal static class Materials
{
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;
}
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;
Asset.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_01fc: Unknown result type (might be due to invalid IL or missing references)
//IL_020a: 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)1;
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.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 EntityStateMachine AddEntityStateMachine(GameObject prefab, string machineName, Type mainStateType = null, Type initalStateType = null, bool addToHurt = true, bool addToDeath = true)
{
//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) && addToDeath)
{
component2.idleStateMachine = component2.idleStateMachine.Append(val).ToArray();
}
SetStateOnHurt component3 = prefab.GetComponent<SetStateOnHurt>();
if (Object.op_Implicit((Object)(object)component3) && addToHurt)
{
component3.idleStateMachine = component3.idleStateMachine.Append(val).ToArray();
}
return val;
}
public static EntityStateMachine 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;
}
return val;
}
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)
{
SkillSlot[] array = new SkillSlot[4];
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
CreateSkillFamilies(targetPrefab, (SkillSlot[])(object)array);
}
public static void CreateSkillFamilies(GameObject targetPrefab, params SkillSlot[] slots)
{
//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)
//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_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected I4, but got Unknown
SkillLocator component = targetPrefab.GetComponent<SkillLocator>();
foreach (SkillSlot val in slots)
{
SkillSlot val2 = val;
switch (val2 - -1)
{
case 1:
component.primary = CreateGenericSkillWithSkillFamily(targetPrefab, "Primary");
break;
case 2:
component.secondary = CreateGenericSkillWithSkillFamily(targetPrefab, "Secondary");
break;
case 3:
component.utility = CreateGenericSkillWithSkillFamily(targetPrefab, "Utility");
break;
case 4:
component.special = CreateGenericSkillWithSkillFamily(targetPrefab, "Special");
break;
}
}
}
public static void ClearGenericSkills(GameObject targetPrefab)
{
GenericSkill[] componentsInChildren = targetPrefab.GetComponentsInChildren<GenericSkill>();
foreach (GenericSkill val in componentsInChildren)
{
Object.DestroyImmediate((Object)(object)val);
}
}
public static GenericSkill CreateGenericSkillWithSkillFamily(GameObject targetPrefab, SkillSlot skillSlot, bool hidden = false)
{
//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_000a: 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)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Expected I4, but got Unknown
SkillLocator component = targetPrefab.GetComponent<SkillLocator>();
switch (skillSlot - -1)
{
case 1:
return component.primary = CreateGenericSkillWithSkillFamily(targetPrefab, "Primary", hidden);
case 2:
return component.secondary = CreateGenericSkillWithSkillFamily(targetPrefab, "Secondary", hidden);
case 3:
return component.utility = CreateGenericSkillWithSkillFamily(targetPrefab, "Utility", hidden);
case 4:
return component.special = CreateGenericSkillWithSkillFamily(targetPrefab, "Special", hidden);
case 0:
Log.Error("Failed to create GenericSkill with skillslot None. If making a GenericSkill outside of the main 4, specify a familyName, and optionally a genericSkillName");
return null;
default:
return null;
}
}
public static GenericSkill CreateGenericSkillWithSkillFamily(GameObject targetPrefab, string familyName, bool hidden = false)
{
return CreateGenericSkillWithSkillFamily(targetPrefab, familyName, familyName, hidden);
}
public static GenericSkill CreateGenericSkillWithSkillFamily(GameObject targetPrefab, string genericSkillName, string familyName, bool hidden = false)
{
GenericSkill val = targetPrefab.AddComponent<GenericSkill>();
val.skillName = genericSkillName;
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 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 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).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 = Array.Empty<string>();
public Sprite skillIcon;
public SerializableEntityStateType activationState;
public string activationStateMachineName;
public InterruptPriority interruptPriority;
public float baseRechargeInterval;
public int baseMaxStock = 1;
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 SkillDefInfo()
{
}
public SkillDefInfo(string skillName, string skillNameToken, string skillDescriptionToken, Sprite skillIcon, SerializableEntityStateType activationState, string activationStateMachineName = "Weapon", bool agile = false)
{
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: 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 = !agile;
if (agile)
{
keywordTokens = new string[1] { "KEYWORD_AGILE" };
}
interruptPriority = (InterruptPriority)0;
isCombatSkill = true;
baseRechargeInterval = 0f;
requiredStock = 0;
stockToConsume = 0;
}
}
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 Damage