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 System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HG;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Navigation;
using RoR2.Orbs;
using SimpleJSON;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Refightilization")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+b6fd06156617fc9f904edbf90316bf48beb23c7d")]
[assembly: AssemblyProduct("Refightilization")]
[assembly: AssemblyTitle("Refightilization")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace Wonda
{
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.Wonda.Refightilization", "Refightilization", "1.2.3")]
public class Refightilization : BaseUnityPlugin
{
public class PlayerStorage
{
public NetworkUser user;
public CharacterMaster master;
public GameObject origPrefab;
public bool isDead;
public int[] blacklistedInventory = new int[ItemCatalog.itemCount];
public bool giftedAffix;
public EquipmentIndex previousEquipment = (EquipmentIndex)(-1);
public NetworkUser lastDamagedBy;
public float lastDamagedTime;
public bool isLoggedOut;
public int lastStage;
}
private const string guid = "com.Wonda.Refightilization";
private const string modName = "Refightilization";
private const string version = "1.2.3";
private RefightilizationConfig _config;
private RefightilizationLanguage _language;
public List<PlayerStorage> playerStorage = new List<PlayerStorage>();
private List<GameObject> voidWhitelist = new List<GameObject>();
private List<GameObject> finalBossWhitelist = new List<GameObject>();
private List<string> respawnMethodCheck = new List<string> { "RefightRespawn" };
public float respawnTime;
private int respawnLoops;
public List<GameObject> currEnemyWhitelist = new List<GameObject>();
public List<GameObject> currSpecialEnemyWhitelist = new List<GameObject>();
public List<EquipmentIndex> currEliteWhitelist = new List<EquipmentIndex>();
public List<ItemIndex> currItemBlacklist = new List<ItemIndex>();
public bool moonDisabled;
public void Awake()
{
_config = new RefightilizationConfig(((BaseUnityPlugin)this).Config);
SetupHooks();
respawnMethodCheck.AddRange(_config.PreventPrefabResetMethods);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Refightilization!");
}
public void Start()
{
if (Chainloader.PluginInfos.TryGetValue("com.rune580.riskofoptions", out var _))
{
_config.BuildRiskOfOptionsMenu();
}
}
private void SetupHooks()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: 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_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Expected O, but got Unknown
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Expected O, but got Unknown
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Expected O, but got Unknown
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Expected O, but got Unknown
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Expected O, but got Unknown
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Expected O, but got Unknown
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Expected O, but got Unknown
Run.Start += new hook_Start(Run_Start);
GlobalEventManager.OnPlayerCharacterDeath += new hook_OnPlayerCharacterDeath(GlobalEventManager_OnPlayerCharacterDeath);
GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
Run.OnServerSceneChanged += new hook_OnServerSceneChanged(Run_OnServerSceneChanged);
Run.OnUserAdded += new hook_OnUserAdded(Run_OnUserAdded);
Run.OnUserRemoved += new hook_OnUserRemoved(Run_OnUserRemoved);
TeleporterInteraction.OnInteractionBegin += new hook_OnInteractionBegin(TeleporterInteraction_OnInteractionBegin);
GenericPickupController.AttemptGrant += new hook_AttemptGrant(GenericPickupController_AttemptGrant);
Inventory.GiveItem_ItemIndex_int += new hook_GiveItem_ItemIndex_int(Inventory_GiveItem_ItemIndex_int);
CharacterMaster.Respawn += new hook_Respawn(CharacterMaster_Respawn);
CharacterMaster.PickRandomSurvivorBodyPrefab += new hook_PickRandomSurvivorBodyPrefab(CharacterMaster_PickRandomSurvivorBodyPrefab);
CharacterMaster.IsDeadAndOutOfLivesServer += new hook_IsDeadAndOutOfLivesServer(CharacterMaster_IsDeadAndOutOfLivesServer);
Run.BeginGameOver += new hook_BeginGameOver(Run_BeginGameOver);
InfiniteTowerRun.OnWaveAllEnemiesDefeatedServer += new hook_OnWaveAllEnemiesDefeatedServer(InfiniteTowerRun_OnWaveAllEnemiesDefeatedServer);
}
private void Run_Start(orig_Start orig, Run self)
{
orig.Invoke(self);
if (_config.EnableRefightilization)
{
respawnTime = _config.RespawnDelay;
SetupPlayers();
SetupLang();
moonDisabled = false;
}
}
private void GlobalEventManager_OnPlayerCharacterDeath(orig_OnPlayerCharacterDeath orig, GlobalEventManager self, DamageReport damageReport, NetworkUser victimNetworkUser)
{
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Expected O, but got Unknown
orig.Invoke(self, damageReport, victimNetworkUser);
if (!_config.EnableRefightilization)
{
return;
}
if (_config.MurderRevive)
{
PlayerStorage playerStorage = FindPlayerStorage(victimNetworkUser.master);
PlayerStorage playerStorage2 = null;
if (playerStorage != null && (Object)(object)playerStorage.lastDamagedBy != (Object)null && FindPlayerStorage(playerStorage.lastDamagedBy.master) != null)
{
playerStorage2 = FindPlayerStorage(playerStorage.lastDamagedBy.master);
}
if (playerStorage != null && !playerStorage.isDead && playerStorage2 != null && playerStorage2.isDead && Time.time <= playerStorage.lastDamagedTime + _config.MurderWindow)
{
CleanPlayer(playerStorage2);
playerStorage2.master.RespawnExtraLife();
playerStorage2.master.inventory.RemoveItem(Items.ExtraLifeConsumed, 1);
string text = _language.RevengeMessages[Random.Range(0, _language.RevengeMessages.Count - 1)];
text = text.Replace("{0}", playerStorage2.master.playerCharacterMasterController.networkUser.userName);
text = text.Replace("{1}", playerStorage.master.playerCharacterMasterController.networkUser.userName);
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = "<style=cWorldEvent><sprite name=\"Skull\" tint=1> " + text + " <sprite name=\"Skull\" tint=1></style>"
});
}
}
((MonoBehaviour)this).StartCoroutine(RespawnCheck(((Component)victimNetworkUser.master).transform.position, respawnTime));
respawnTime += _config.AdditionalRespawnTime;
}
private void GlobalEventManager_onServerDamageDealt(DamageReport report)
{
if ((_config.EnableRefightilization || _config.MurderRevive) && FindPlayerStorage(report.attackerMaster) != null && FindPlayerStorage(report.victimMaster) != null)
{
PlayerStorage obj = FindPlayerStorage(report.victimMaster);
obj.lastDamagedBy = FindPlayerStorage(report.attackerMaster).user;
obj.lastDamagedTime = Time.time;
}
}
private void Run_OnServerSceneChanged(orig_OnServerSceneChanged orig, Run self, string sceneName)
{
//IL_0011: 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)
if (_config.EnableRefightilization)
{
((MonoBehaviour)this).StopCoroutine(RespawnCheck());
}
orig.Invoke(self, sceneName);
if (_config.EnableRefightilization)
{
if (sceneName.Equals("moon") || sceneName.Equals("moon2"))
{
moonDisabled = true;
}
if (self.stageClearCount > 0)
{
ResetPrefabs();
}
((MonoBehaviour)this).Invoke("UpdateStageWhitelist", 1f);
((MonoBehaviour)this).Invoke("UpdateEliteWhitelist", 1f);
((MonoBehaviour)this).Invoke("UpdateBlacklistedItems", 1f);
respawnTime = _config.RespawnDelay;
}
}
private void Run_OnUserAdded(orig_OnUserAdded orig, Run self, NetworkUser user)
{
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self, user);
if (!(Run.instance.time > 1f) || !_config.EnableRefightilization)
{
return;
}
bool flag = false;
foreach (PlayerStorage item in playerStorage)
{
if (item.user.userName == user.userName)
{
item.user = user;
item.master = user.master;
item.isLoggedOut = false;
flag = true;
((BaseUnityPlugin)this).Logger.LogDebug((object)(user.userName + " returned. Marking them as logged in."));
if (item.lastStage < Run.instance.stageClearCount && Object.op_Implicit((Object)(object)user.master) && Object.op_Implicit((Object)(object)Stage.instance))
{
((MonoBehaviour)this).Invoke("NaturalRespawnCharacter", 3f);
}
else
{
item.isDead = true;
((MonoBehaviour)this).StartCoroutine(RespawnCheck(((Component)item.master).transform.position, 3f));
}
item.blacklistedInventory = new int[ItemCatalog.itemCount];
break;
}
}
if (!flag)
{
SetupPlayers(StageUpdate: false);
}
}
private void NaturalRespawnCharacter()
{
foreach (PlayerStorage item in playerStorage)
{
if (!item.isDead && !item.isLoggedOut && !Object.op_Implicit((Object)(object)item.master.GetBody()))
{
Stage.instance.RespawnCharacter(item.master);
}
}
}
private void Run_OnUserRemoved(orig_OnUserRemoved orig, Run self, NetworkUser user)
{
if (Run.instance.time > 1f && _config.EnableRefightilization)
{
foreach (PlayerStorage item in playerStorage)
{
if (item.user.userName == user.userName)
{
CleanPlayer(item);
break;
}
}
}
orig.Invoke(self, user);
if (!(Run.instance.time > 1f) || !_config.EnableRefightilization)
{
return;
}
foreach (PlayerStorage item2 in playerStorage)
{
if (item2.user.userName == user.userName)
{
item2.isLoggedOut = true;
item2.lastStage = Run.instance.stageClearCount;
((BaseUnityPlugin)this).Logger.LogDebug((object)(user.userName + " left. Marking them as logged out."));
break;
}
}
}
private void TeleporterInteraction_OnInteractionBegin(orig_OnInteractionBegin orig, TeleporterInteraction self, Interactor activator)
{
//IL_0035: 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_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Invalid comparison between Unknown and I4
if (_config.EnableRefightilization)
{
foreach (PlayerStorage item in playerStorage)
{
if (self.isCharged)
{
((MonoBehaviour)this).StopCoroutine(RespawnCheck());
}
if ((Object)(object)item.master != (Object)null && (Object)(object)item.master.GetBody() != (Object)null && (Object)(object)((Component)item.master.GetBody()).gameObject == (Object)(object)((Component)activator).gameObject && item.isDead && (int)item.master.teamIndex != 1 && playerStorage.Count > 1)
{
return;
}
}
}
orig.Invoke(self, activator);
}
private void GenericPickupController_AttemptGrant(orig_AttemptGrant orig, GenericPickupController self, CharacterBody body)
{
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
if (_config.EnableRefightilization)
{
PlayerStorage playerStorage = null;
if (Object.op_Implicit((Object)(object)body.master))
{
playerStorage = FindPlayerStorage(body.master);
}
if (playerStorage != null && playerStorage.isDead && _config.ItemPickupToggle)
{
playerStorage.master.GetBody().teamComponent.teamIndex = (TeamIndex)1;
}
orig.Invoke(self, body);
if (playerStorage != null && playerStorage.isDead && _config.ItemPickupToggle)
{
playerStorage.master.GetBody().teamComponent.teamIndex = _config.RespawnTeam;
}
}
else
{
orig.Invoke(self, body);
}
}
private void WhyDoActionsDoSillySillyThings(ItemTransferOrb orb)
{
}
private void Inventory_GiveItem_ItemIndex_int(orig_GiveItem_ItemIndex_int orig, Inventory self, ItemIndex itemIndex, int count)
{
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: 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_0064: 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_007f: 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)
//IL_00ba: 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)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Expected O, but got Unknown
if (_config.EnableRefightilization && currItemBlacklist.Contains(itemIndex))
{
CharacterMaster component = ((Component)self).GetComponent<CharacterMaster>();
PlayerStorage playerStorage = null;
if ((Object)(object)component != (Object)null)
{
playerStorage = FindPlayerStorage(component);
}
if (playerStorage != null && playerStorage.isDead)
{
playerStorage.blacklistedInventory[itemIndex] += count;
ItemTransferOrb.DispatchItemTransferOrb(component.GetBody().footPosition, component.inventory, itemIndex, 0, (Action<ItemTransferOrb>)WhyDoActionsDoSillySillyThings, default(Either<NetworkIdentity, HurtBox>));
string itemBlacklistWarning = _language.ItemBlacklistWarning;
itemBlacklistWarning = itemBlacklistWarning.Replace("{0}", playerStorage.user.userName);
itemBlacklistWarning = itemBlacklistWarning.Replace("{1}", ItemCatalog.itemNames[itemIndex]);
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = "<style=cStack>" + itemBlacklistWarning
});
return;
}
}
orig.Invoke(self, itemIndex, count);
}
private CharacterBody CharacterMaster_Respawn(orig_Respawn orig, CharacterMaster self, Vector3 footPosition, Quaternion rotation, bool wasRevivedMidStage = false)
{
//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)
if (_config.EnableRefightilization)
{
string currMethod = new StackFrame(2).GetMethod().Name;
if (!respawnMethodCheck.Exists((string x) => x.Equals(currMethod)) && FindPlayerStorage(self) != null)
{
CleanPlayer(FindPlayerStorage(self));
}
}
return orig.Invoke(self, footPosition, rotation, wasRevivedMidStage);
}
private GameObject CharacterMaster_PickRandomSurvivorBodyPrefab(orig_PickRandomSurvivorBodyPrefab orig, Xoroshiro128Plus rng, NetworkUser networkUser, bool allowHidden)
{
if (_config.EnableRefightilization && _config.OverrideMetamorphosis && new StackFrame(6).GetMethod().Name == "RefightRespawn")
{
return currEnemyWhitelist[Random.Range(0, currEnemyWhitelist.Count - 1)];
}
return orig.Invoke(rng, networkUser, allowHidden);
}
private bool CharacterMaster_IsDeadAndOutOfLivesServer(orig_IsDeadAndOutOfLivesServer orig, CharacterMaster self)
{
if (_config.EnableRefightilization)
{
PlayerStorage playerStorage = FindPlayerStorage(self);
if (playerStorage != null && playerStorage.isDead)
{
return true;
}
}
return orig.Invoke(self);
}
private void Run_BeginGameOver(orig_BeginGameOver orig, Run self, GameEndingDef gameEndingDef)
{
//IL_001e: 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)
if (!_config.EnableRefightilization || _config.EndGameWhenEverybodyDead)
{
((MonoBehaviour)this).StopCoroutine(RespawnCheck());
ResetPrefabs();
orig.Invoke(self, gameEndingDef);
}
}
private void InfiniteTowerRun_OnWaveAllEnemiesDefeatedServer(orig_OnWaveAllEnemiesDefeatedServer orig, InfiniteTowerRun self, InfiniteTowerWaveController wc)
{
foreach (PlayerStorage item in playerStorage)
{
if (item == null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Player is null! Continuing.");
}
else if (item.isDead)
{
item.master.TrueKill();
}
}
orig.Invoke(self, wc);
}
private void SetupLang()
{
_language = new RefightilizationLanguage();
}
private void SetupPlayers(bool StageUpdate = true)
{
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Setting up players...");
if (StageUpdate)
{
this.playerStorage.Clear();
}
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
if (this.playerStorage != null && (Object)(object)instance.networkUser == (Object)null)
{
continue;
}
if (!StageUpdate && this.playerStorage != null)
{
bool flag = false;
foreach (PlayerStorage item in this.playerStorage)
{
if ((Object)(object)item.master == (Object)(object)instance.master)
{
flag = true;
break;
}
}
if (flag)
{
continue;
}
}
PlayerStorage playerStorage = new PlayerStorage();
if (Object.op_Implicit((Object)(object)instance.networkUser))
{
playerStorage.user = instance.networkUser;
}
if (Object.op_Implicit((Object)(object)instance.master))
{
playerStorage.master = instance.master;
}
if (Object.op_Implicit((Object)(object)instance.master.bodyPrefab))
{
playerStorage.origPrefab = instance.master.bodyPrefab;
}
if (Object.op_Implicit((Object)(object)instance.master.inventory))
{
playerStorage.blacklistedInventory = new int[ItemCatalog.itemCount];
}
this.playerStorage.Add(playerStorage);
((BaseUnityPlugin)this).Logger.LogDebug((object)(playerStorage.user.userName + " added to PlayerStorage!"));
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Setting up players finished.");
if (!StageUpdate)
{
((MonoBehaviour)this).StartCoroutine(RespawnCheck(new Vector3(0f, 0f, 0f), respawnTime));
}
}
private IEnumerator RespawnCheck(Vector3 deathPos = default(Vector3), float waitTime = 1f)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)("Respawn called! Waiting " + waitTime + " seconds!"));
yield return (object)new WaitForSeconds(waitTime);
if (!Object.op_Implicit((Object)(object)Run.instance) || !((Behaviour)Run.instance).isActiveAndEnabled)
{
yield break;
}
if (!_config.EnableRefightilization)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Nevermind. Mod is disabled via config.");
yield break;
}
if (_config.NoRespawnsAfterTeleporter && Object.op_Implicit((Object)(object)TeleporterInteraction.instance) && TeleporterInteraction.instance.isCharged)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Respawning after teleporter is disabled!");
yield break;
}
if (_config.DisableMoon && moonDisabled)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Respawn prevented due to current stage.");
yield break;
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Checking players...");
bool flag = true;
if (playerStorage == null)
{
((BaseUnityPlugin)this).Logger.LogError((object)"PlayerStorage is null!");
yield break;
}
foreach (PlayerStorage item in playerStorage)
{
if (item == null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Player doesn't exist! Skipping...");
playerStorage.Remove(item);
RespawnCheck(deathPos, waitTime);
yield break;
}
if (item.master.IsDeadAndOutOfLivesServer() && !item.isLoggedOut && (!Object.op_Implicit((Object)(object)item.master.GetBody()) || (Object.op_Implicit((Object)(object)item.master.GetBody()) && !item.master.GetBody().healthComponent.alive)))
{
((BaseUnityPlugin)this).Logger.LogDebug((object)(item.user.userName + " passed spawn check!"));
if (!item.isDead)
{
item.isDead = true;
}
item.master.teamIndex = _config.RespawnTeam;
respawnLoops = 0;
RefightRespawn(item.master, deathPos);
}
else
{
((BaseUnityPlugin)this).Logger.LogDebug((object)(item.user.userName + " failed spawn check."));
if (!item.isDead)
{
flag = false;
}
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Checking players complete.");
if (flag && (!((Object)(object)TeleporterInteraction.instance != (Object)null) || !TeleporterInteraction.instance.isInFinalSequence) && _config.EndGameWhenEverybodyDead)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Everybody is dead. Forcibly ending the game.");
ResetPrefabs();
Run.instance.BeginGameOver(GameEndings.StandardLoss);
}
}
private void RefightRespawn(CharacterMaster player, Vector3 deathPos)
{
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_0264: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_026c: Unknown result type (might be due to invalid IL or missing references)
//IL_0326: Unknown result type (might be due to invalid IL or missing references)
//IL_0327: Unknown result type (might be due to invalid IL or missing references)
//IL_0300: Unknown result type (might be due to invalid IL or missing references)
//IL_0305: Unknown result type (might be due to invalid IL or missing references)
//IL_0307: Unknown result type (might be due to invalid IL or missing references)
//IL_030c: Unknown result type (might be due to invalid IL or missing references)
//IL_0359: Unknown result type (might be due to invalid IL or missing references)
//IL_035a: Unknown result type (might be due to invalid IL or missing references)
//IL_035f: Unknown result type (might be due to invalid IL or missing references)
//IL_0345: Unknown result type (might be due to invalid IL or missing references)
//IL_034a: Unknown result type (might be due to invalid IL or missing references)
//IL_034c: Unknown result type (might be due to invalid IL or missing references)
//IL_0351: Unknown result type (might be due to invalid IL or missing references)
//IL_04df: Unknown result type (might be due to invalid IL or missing references)
//IL_04e4: Unknown result type (might be due to invalid IL or missing references)
//IL_04e8: Unknown result type (might be due to invalid IL or missing references)
//IL_0502: Unknown result type (might be due to invalid IL or missing references)
//IL_0507: Unknown result type (might be due to invalid IL or missing references)
//IL_050c: Unknown result type (might be due to invalid IL or missing references)
//IL_050e: Unknown result type (might be due to invalid IL or missing references)
//IL_0515: Unknown result type (might be due to invalid IL or missing references)
//IL_0521: Unknown result type (might be due to invalid IL or missing references)
//IL_073e: Unknown result type (might be due to invalid IL or missing references)
//IL_0743: Unknown result type (might be due to invalid IL or missing references)
//IL_075f: Expected O, but got Unknown
//IL_060e: Unknown result type (might be due to invalid IL or missing references)
//IL_0614: Invalid comparison between Unknown and I4
//IL_067a: Unknown result type (might be due to invalid IL or missing references)
//IL_0648: Unknown result type (might be due to invalid IL or missing references)
//IL_064d: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Attempting player respawn!");
respawnLoops++;
if (respawnLoops > 99)
{
((BaseUnityPlugin)this).Logger.LogError((object)"INFINITE LOOP CAUGHT! Please file a bug report for Refightilization! This is not intended behavior.");
return;
}
if ((Object)(object)player == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Player is null!? Aborting Respawn.");
return;
}
if ((Object)(object)player.playerCharacterMasterController.networkUser == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Player doesn't have a networkUser!? Aborting Respawn.");
return;
}
if (FindPlayerStorage(player).giftedAffix)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Yoinking that Affix.");
player.inventory.SetEquipmentIndex(FindPlayerStorage(player).previousEquipment);
FindPlayerStorage(player).giftedAffix = false;
}
List<GameObject> list = currEnemyWhitelist;
if (Util.CheckRoll(5f, player.playerCharacterMasterController.master) && currSpecialEnemyWhitelist.Count >= 1)
{
list = new List<GameObject>(currSpecialEnemyWhitelist);
}
if (Util.CheckRoll(0.1f, player.playerCharacterMasterController.master) && finalBossWhitelist.Count >= 1)
{
list = new List<GameObject>(finalBossWhitelist);
}
if (_config.NoRepeatRespawns && list.Count > 1)
{
list.Remove(list.Where((GameObject entity) => ((Object)entity).name == ((Object)player.bodyPrefab).name).FirstOrDefault());
}
GameObject val = list[Random.Range(0, list.Count - 1)];
((BaseUnityPlugin)this).Logger.LogDebug((object)("Found body " + ((Object)val).name + "."));
TakeBlacklistedItems(player);
if (Object.op_Implicit((Object)(object)player.bodyPrefab) && Object.op_Implicit((Object)(object)val))
{
player.bodyPrefab = val;
((BaseUnityPlugin)this).Logger.LogDebug((object)(player.playerCharacterMasterController.networkUser.userName + " was assigned to " + ((Object)player.bodyPrefab).name + "."));
Vector3 val2 = deathPos;
Vector3 val3 = default(Vector3);
((Vector3)(ref val3))..ctor((float)Random.Range(-5, 5), (float)Random.Range(-5, 5), (float)Random.Range(-2, 2));
Random r = new Random();
foreach (PlayerCharacterMasterController item in PlayerCharacterMasterController.instances.OrderBy((PlayerCharacterMasterController x) => r.Next()))
{
if (!item.master.IsDeadAndOutOfLivesServer() && (Object)(object)item.master != (Object)null)
{
val2 = ((Component)item.master).transform.position + val3;
break;
}
}
if (val2 == deathPos && Object.op_Implicit((Object)(object)TeleporterInteraction.instance))
{
val2 = ((Component)TeleporterInteraction.instance).transform.position + val3;
}
player.Respawn(GrabNearestNodePosition(val2), Quaternion.identity, false);
((BaseUnityPlugin)this).Logger.LogDebug((object)("Respawned " + player.playerCharacterMasterController.networkUser.userName + "!"));
CharacterBody body = player.GetBody();
body.baseMaxHealth *= _config.RespawnHealthMultiplier;
CharacterBody body2 = player.GetBody();
body2.baseDamage *= _config.RespawnDamageMultiplier;
if (Object.op_Implicit((Object)(object)((Component)player.GetBody()).GetComponent<DeathRewards>()))
{
DeathRewards component = ((Component)player.GetBody()).GetComponent<DeathRewards>();
component.goldReward *= (uint)_config.RespawnMoneyMultiplier;
}
player.GetBody().baseRegen = 1f;
player.GetBody().levelRegen = 0.2f;
((BaseUnityPlugin)this).Logger.LogDebug((object)"Applied stats.");
if (!Object.op_Implicit((Object)(object)((Component)player.GetBody()).GetComponent<InteractionDriver>()))
{
((Component)player.GetBody()).gameObject.AddComponent<InteractionDriver>();
((BaseUnityPlugin)this).Logger.LogDebug((object)"Granting an interaction driver.");
}
if (Object.op_Implicit((Object)(object)((Component)player.GetBody()).GetComponent<Interactor>()))
{
Interactor component2 = ((Component)player.GetBody()).GetComponent<Interactor>();
Bounds bounds = ((Renderer)((Component)player.GetBody().modelLocator.modelTransform).GetComponent<CharacterModel>().mainSkinnedMeshRenderer).bounds;
Vector3 val4 = Vector3.Scale(((Bounds)(ref bounds)).size, ((Component)player.GetBody().modelLocator).transform.localScale);
float maxInteractionDistance = Mathf.Max(Mathf.Max(val4.x, val4.y), val4.z);
component2.maxInteractionDistance = maxInteractionDistance;
if (player.GetBody().isFlying)
{
component2.maxInteractionDistance *= 1.5f;
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Modifying interaction distance.");
}
ChangeMinionsTeam(player);
player.GetBody().AddTimedBuff(Buffs.ArmorBoost, 15f);
player.GetBody().AddTimedBuff(Buffs.CloakSpeed, 30f);
((BaseUnityPlugin)this).Logger.LogDebug((object)"Applied buffs.");
if (_config.RespawnAffixEnabled && (Util.CheckRoll(_config.RespawnAffixChance, player.playerCharacterMasterController.master) || RunArtifactManager.instance.IsArtifactEnabled(Artifacts.eliteOnlyArtifactDef)))
{
if ((int)player.inventory.GetEquipmentIndex() != -1 && !_config.ForceGrantAffix)
{
return;
}
if (_config.ForceGrantAffix)
{
FindPlayerStorage(player).previousEquipment = player.inventory.GetEquipmentIndex();
}
int index = Random.Range(0, currEliteWhitelist.Count - 1);
player.inventory.SetEquipmentIndex(currEliteWhitelist[index]);
FindPlayerStorage(player).giftedAffix = _config.TakeAffix;
((BaseUnityPlugin)this).Logger.LogDebug((object)"Gifted affix.");
}
player.preventGameOver = false;
respawnLoops = 0;
if (_config.AnnounceRespawns)
{
string text = _language.ReviveMessages[Random.Range(0, _language.ReviveMessages.Count - 1)];
text = text.Replace("{0}", player.playerCharacterMasterController.networkUser.userName);
text = text.Replace("{1}", player.GetBody().GetDisplayName());
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = "<style=cWorldEvent><sprite name=\"Skull\" tint=1> " + text + " <sprite name=\"Skull\" tint=1></style>"
});
}
}
else
{
((BaseUnityPlugin)this).Logger.LogDebug((object)(player.playerCharacterMasterController.networkUser.userName + " has no bodyPrefab!? Retrying..."));
RefightRespawn(player, deathPos);
}
}
private void ResetPrefabs()
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Resetting player prefabs...");
if (playerStorage == null)
{
((BaseUnityPlugin)this).Logger.LogError((object)"PlayerStorage is null!");
return;
}
foreach (PlayerStorage item in playerStorage)
{
if (item == null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Player is null! Continuing.");
continue;
}
if (item.isDead)
{
CleanPlayer(item);
}
((BaseUnityPlugin)this).Logger.LogDebug((object)(item.user.userName + "'s prefab reset."));
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Reset player prefabs!");
}
private void CleanPlayer(PlayerStorage player)
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
player.master.bodyPrefab = player.origPrefab;
player.master.teamIndex = (TeamIndex)1;
ChangeMinionsTeam(player.master);
if (player.giftedAffix)
{
player.master.inventory.SetEquipmentIndex(player.previousEquipment);
player.giftedAffix = false;
}
((MonoBehaviour)this).StartCoroutine(ReturnBlacklistedItemsWait(player.master, 1f));
player.isDead = false;
}
private void ChangeMinionsTeam(CharacterMaster player)
{
//IL_002d: 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_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
if (!_config.ChangeMinionsTeam)
{
return;
}
MinionGroup val = null;
for (int i = 0; i < MinionGroup.instancesList.Count; i++)
{
MinionGroup val2 = MinionGroup.instancesList[i];
if (MinionGroup.instancesList[i].ownerId == ((NetworkBehaviour)player).netId)
{
val = val2;
break;
}
}
if (val == null)
{
return;
}
MinionOwnership[] members = val.members;
foreach (MinionOwnership val3 in members)
{
if (Object.op_Implicit((Object)(object)val3) && Object.op_Implicit((Object)(object)((Component)val3).GetComponent<CharacterMaster>()))
{
((Component)val3).GetComponent<CharacterMaster>().teamIndex = player.teamIndex;
if (Object.op_Implicit((Object)(object)((Component)val3).GetComponent<CharacterMaster>().GetBody()))
{
((Component)val3).GetComponent<CharacterMaster>().GetBody().teamComponent.teamIndex = player.teamIndex;
}
((BaseUnityPlugin)this).Logger.LogDebug((object)("Changed " + ((Object)((Component)val3).GetComponent<CharacterMaster>()).name + "'s team."));
}
}
}
private void UpdateStageWhitelist()
{
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Updating the stage whitelist.");
currEnemyWhitelist.Clear();
((BaseUnityPlugin)this).Logger.LogDebug((object)"Whitelist cleared.");
if (_config.EnableFixedPool)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Fixed pool is enabled.");
string[] fixedPool = _config.FixedPool;
foreach (string text in fixedPool)
{
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab(text));
((BaseUnityPlugin)this).Logger.LogDebug((object)("Adding " + text + " to the currWhitelist."));
}
}
else if ((Object)(object)ClassicStageInfo.instance == (Object)null || ClassicStageInfo.instance.monsterSelection == null || ClassicStageInfo.instance.monsterSelection.choices == null)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"There is no available monster selection!");
if (Object.op_Implicit((Object)(object)VoidRaidGauntletController.instance))
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Void raid detected! Forcing monster selection...");
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab("NullifierBody"));
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab("VoidJailerBody"));
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab("VoidMegaCrabBody"));
}
}
else
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Selection isn't null.");
foreach (ChoiceInfo<DirectorCard> item in ClassicStageInfo.instance.monsterSelection.choices.ToList())
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"Testing choice.");
if (item.value == null)
{
continue;
}
SpawnCard spawnCard = item.value.spawnCard;
if ((Object)(object)spawnCard == (Object)null)
{
continue;
}
GameObject val = BodyCatalog.FindBodyPrefab(((Object)spawnCard.prefab).name.Replace("Master", "Body"));
if ((Object)(object)val == (Object)null)
{
continue;
}
((BaseUnityPlugin)this).Logger.LogDebug((object)("We have found " + ((Object)val).name + "."));
if ((!_config.AllowBosses || Run.instance.loopClearCount < _config.BossRequiredLoopCount) && val.GetComponent<CharacterBody>().isChampion)
{
if (_config.AllowBosses)
{
currSpecialEnemyWhitelist.Add(val);
}
}
else if (((_config.AllowScavengers && Run.instance.loopClearCount >= _config.ScavangerRequiredLoopCount) || !(((Object)val).name == "ScavengerBody")) && !CheckBlacklist(((Object)val).name))
{
currEnemyWhitelist.Add(val);
((BaseUnityPlugin)this).Logger.LogDebug((object)("Adding " + ((Object)val).name + " to the currWhitelist."));
}
}
}
finalBossWhitelist.Add(BodyCatalog.FindBodyPrefab("BrotherBody"));
finalBossWhitelist.Add(BodyCatalog.FindBodyPrefab("MiniVoidRaidCrabBodyBase"));
finalBossWhitelist.Add(BodyCatalog.FindBodyPrefab("FalseSonBossBody"));
if (currEnemyWhitelist.Count <= 0)
{
((BaseUnityPlugin)this).Logger.LogDebug((object)"No enemies were found, pulling out the backup enemies.");
string[] fixedPool = _config.FixedPool;
foreach (string text2 in fixedPool)
{
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab(text2));
((BaseUnityPlugin)this).Logger.LogDebug((object)("Adding " + text2 + " to the currWhitelist."));
}
if (currEnemyWhitelist.Count <= 0)
{
currEnemyWhitelist.Add(BodyCatalog.FindBodyPrefab("LemurianBody"));
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Done updating Whitelist.");
}
private void UpdateEliteWhitelist()
{
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Updating the Elite whitelist.");
if (CombatDirector.instancesList == null && (Object)(object)CombatDirector.instancesList[0] == (Object)null)
{
return;
}
currEliteWhitelist.Clear();
EliteTierDef[] eliteTiers = CombatDirector.eliteTiers;
if (eliteTiers == null || eliteTiers.Length == 0)
{
return;
}
for (int i = 0; i < eliteTiers.Length; i++)
{
if (!eliteTiers[i].isAvailable((EliteRules)0) && !eliteTiers[i].isAvailable((EliteRules)2))
{
continue;
}
for (int j = 0; j < eliteTiers[i].eliteTypes.Length; j++)
{
if (!((Object)(object)eliteTiers[i].eliteTypes[j] == (Object)null) && !((Object)(object)eliteTiers[i].eliteTypes[j].eliteEquipmentDef == (Object)null) && !((Object)(object)eliteTiers[i].eliteTypes[j].eliteEquipmentDef.pickupIconSprite == (Object)null))
{
currEliteWhitelist.Add(eliteTiers[i].eliteTypes[j].eliteEquipmentDef.equipmentIndex);
((BaseUnityPlugin)this).Logger.LogDebug((object)("Added " + eliteTiers[i].eliteTypes[j].eliteEquipmentDef.nameToken + " to the pool."));
}
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Done updating Whitelist.");
}
private Vector3 GrabNearestNodePosition(Vector3 startPos)
{
//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_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
NodeGraph groundNodes = SceneInfo.instance.groundNodes;
NodeIndex val = groundNodes.FindClosestNode(startPos, (HullClassification)2, float.PositiveInfinity);
NodeGraphSpider val2 = new NodeGraphSpider(groundNodes, (HullMask)4);
val2.AddNodeForNextStep(val);
List<StepInfo> list = new List<StepInfo>();
int num = 0;
List<StepInfo> collectedSteps = val2.collectedSteps;
while (val2.PerformStep() && num < 8)
{
num++;
for (int i = 0; i < collectedSteps.Count; i++)
{
list.Add(collectedSteps[i]);
}
collectedSteps.Clear();
}
Vector3 result = default(Vector3);
groundNodes.GetNodePosition(list[Random.Range(0, list.Count - 1)].node, ref result);
return result;
}
private bool CheckBlacklist(string name)
{
bool result = false;
string[] blacklistedEnemies = _config.BlacklistedEnemies;
foreach (string text in blacklistedEnemies)
{
if (name == text)
{
result = true;
break;
}
}
return result;
}
private PlayerStorage FindPlayerStorage(CharacterMaster cMaster)
{
foreach (PlayerStorage item in playerStorage)
{
if ((Object)(object)item.master == (Object)(object)cMaster)
{
return item;
}
}
return null;
}
private void UpdateBlacklistedItems()
{
//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_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Updating the Item blacklist.");
currItemBlacklist = new List<ItemIndex>();
string[] blacklistedItems = _config.BlacklistedItems;
foreach (string text in blacklistedItems)
{
ItemIndex val = ItemCatalog.FindItemIndex(text);
if ((int)val != -1)
{
currItemBlacklist.Add(val);
((BaseUnityPlugin)this).Logger.LogDebug((object)("Added " + ((object)(ItemIndex)(ref val)).ToString() + "|" + text + " to the pool."));
}
else
{
((BaseUnityPlugin)this).Logger.LogDebug((object)("Couldn't find " + text + "."));
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Done updating Blacklist.");
}
private void TakeBlacklistedItems(CharacterMaster player)
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: 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)
//IL_0052: 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_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Taking blacklisted items.");
PlayerStorage playerStorage = FindPlayerStorage(player);
foreach (ItemIndex item in currItemBlacklist)
{
ItemIndex current = item;
if (player.inventory.itemStacks[current] != 0)
{
playerStorage.blacklistedInventory[current] = player.inventory.itemStacks[current];
player.inventory.RemoveItem(current, player.inventory.itemStacks[current]);
ItemTransferOrb.DispatchItemTransferOrb(player.GetBody().footPosition, player.inventory, current, 0, (Action<ItemTransferOrb>)WhyDoActionsDoSillySillyThings, default(Either<NetworkIdentity, HurtBox>));
((BaseUnityPlugin)this).Logger.LogDebug((object)("Took away an item at " + ((object)(ItemIndex)(ref current)).ToString()));
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Done checking for blacklisted items.");
}
private IEnumerator ReturnBlacklistedItemsWait(CharacterMaster player, float time)
{
yield return (object)new WaitForSeconds(time);
ReturnBlacklistedItems(player);
}
private void ReturnBlacklistedItems(CharacterMaster player)
{
//IL_0028: 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_0034: 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_0049: 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_0055: 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_0068: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.LogDebug((object)"Giving blacklisted items.");
PlayerStorage playerStorage = FindPlayerStorage(player);
foreach (ItemIndex item in currItemBlacklist)
{
ItemIndex current = item;
if (playerStorage.blacklistedInventory[current] != 0)
{
ItemTransferOrb.DispatchItemTransferOrb(player.GetBody().footPosition, player.inventory, current, playerStorage.blacklistedInventory[current], (Action<ItemTransferOrb>)null, default(Either<NetworkIdentity, HurtBox>));
playerStorage.blacklistedInventory[current] = 0;
((BaseUnityPlugin)this).Logger.LogDebug((object)("Gave an item at " + ((object)(ItemIndex)(ref current)).ToString()));
}
}
((BaseUnityPlugin)this).Logger.LogDebug((object)"Done checking for blacklisted items.");
}
}
internal class RefightilizationConfig
{
private readonly ConfigEntry<bool> _enableRefightilization;
private readonly ConfigEntry<bool> _allowBosses;
private readonly ConfigEntry<bool> _allowScavengers;
private readonly ConfigEntry<string> _blacklistedEnemies;
private readonly ConfigEntry<int> _bossRequiredLoopCount;
private readonly ConfigEntry<int> _scavangerRequiredLoopCount;
private readonly ConfigEntry<bool> _enableFixedPool;
private readonly ConfigEntry<string> _fixedPool;
private readonly ConfigEntry<float> _respawnDelay;
private readonly ConfigEntry<TeamIndex> _respawnTeam;
private readonly ConfigEntry<float> _respawnHealthMultiplier;
private readonly ConfigEntry<float> _respawnDamageMultiplier;
private readonly ConfigEntry<float> _respawnMoneyMultiplier;
private readonly ConfigEntry<bool> _respawnAffixEnabled;
private readonly ConfigEntry<float> _respawnAffixChance;
private readonly ConfigEntry<float> _additionalRespawnTime;
private readonly ConfigEntry<bool> _noRespawnsAfterTeleporter;
private readonly ConfigEntry<bool> _noRepeatRespawns;
private readonly ConfigEntry<bool> _itemPickupToggle;
private readonly ConfigEntry<bool> _takeAffix;
private readonly ConfigEntry<bool> _forceGrantAffix;
private readonly ConfigEntry<string> _blacklistedItems;
private readonly ConfigEntry<bool> _murderRevive;
private readonly ConfigEntry<float> _murderWindow;
private readonly ConfigEntry<bool> _announceRespawns;
private readonly ConfigEntry<bool> _disableMoon;
private readonly ConfigEntry<bool> _overrideMetamorphosis;
private readonly ConfigEntry<bool> _changeMinionsTeam;
private readonly ConfigEntry<bool> _endGameWhenEverybodyDead;
private readonly ConfigEntry<int> _maxRespawnTries;
private readonly ConfigEntry<string> _preventPrefabResetMethods;
public bool EnableRefightilization => _enableRefightilization.Value;
public bool AllowBosses => _allowBosses.Value;
public bool AllowScavengers => _allowScavengers.Value;
public string[] BlacklistedEnemies => _blacklistedEnemies.Value.Replace(" ", "").Split(',');
public int BossRequiredLoopCount => _bossRequiredLoopCount.Value;
public int ScavangerRequiredLoopCount => _scavangerRequiredLoopCount.Value;
public bool EnableFixedPool => _enableFixedPool.Value;
public string[] FixedPool => _fixedPool.Value.Replace(" ", "").Split(',');
public float RespawnDelay => _respawnDelay.Value;
public TeamIndex RespawnTeam => _respawnTeam.Value;
public float RespawnHealthMultiplier => _respawnHealthMultiplier.Value;
public float RespawnDamageMultiplier => _respawnDamageMultiplier.Value;
public float RespawnMoneyMultiplier => _respawnMoneyMultiplier.Value;
public bool RespawnAffixEnabled => _respawnAffixEnabled.Value;
public float RespawnAffixChance => _respawnAffixChance.Value;
public float AdditionalRespawnTime => _additionalRespawnTime.Value;
public bool NoRespawnsAfterTeleporter => _noRespawnsAfterTeleporter.Value;
public bool NoRepeatRespawns => _noRepeatRespawns.Value;
public bool ItemPickupToggle => _itemPickupToggle.Value;
public bool TakeAffix => _takeAffix.Value;
public bool ForceGrantAffix => _forceGrantAffix.Value;
public string[] BlacklistedItems => _blacklistedItems.Value.Replace(" ", "").Split(',');
public bool MurderRevive => _murderRevive.Value;
public float MurderWindow => _murderWindow.Value;
public bool AnnounceRespawns => _announceRespawns.Value;
public bool DisableMoon => _disableMoon.Value;
public bool OverrideMetamorphosis => _overrideMetamorphosis.Value;
public bool ChangeMinionsTeam => _changeMinionsTeam.Value;
public bool EndGameWhenEverybodyDead => _endGameWhenEverybodyDead.Value;
public int MaxRespawnTries => _maxRespawnTries.Value;
public string[] PreventPrefabResetMethods => _preventPrefabResetMethods.Value.Replace(" ", "").Split(',');
public RefightilizationConfig(ConfigFile config)
{
_enableRefightilization = config.Bind<bool>("Master", "EnableRefightilization", true, "Enables/Disables the entire mod.");
_allowBosses = config.Bind<bool>("Monster Categories", "AllowBosses", true, "Allows players to spawn as bosses.");
_allowScavengers = config.Bind<bool>("Monster Categories", "AllowScavengers", false, "Allows players to spawn as Scavengers.");
_blacklistedEnemies = config.Bind<string>("Monster Categories", "BlacklistedEnemies", "BeetleBody, JellyfishBody, WispBody, MinorConstructBody, VoidBarnacleBody, ClayBossBody", "Sets monsters to prevent players from spawning as. A list of bodies can be grabbed by using body_list in the console.");
_bossRequiredLoopCount = config.Bind<int>("Monster Categories", "BossRequiredLoopCount", 2, "The required amount of loops before a player can spawn as a boss.");
_scavangerRequiredLoopCount = config.Bind<int>("Monster Categories", "ScavangerRequiredLoopCount", 5, "The required amount of loops before a player can spawn as a scavanger.");
_enableFixedPool = config.Bind<bool>("Monster Categories", "EnableFixedPool", false, "Forces players to respawn from a pre-defined list of monsters, instead of the current stage's monsters.");
_fixedPool = config.Bind<string>("Monster Categories", "FixedPool", "LemurianBody", "Provides a fixed list of monsters that the player could spawn as with EnableFixedPool enabled. This list will also be used if there are no available monsters to spawn as.");
_respawnDelay = config.Bind<float>("Respawn Settings", "RespawnDelay", 5f, "Sets the delay until the player can respawn.");
_respawnTeam = config.Bind<TeamIndex>("Respawn Settings", "RespawnTeam", (TeamIndex)0, "Sets the team of the respawned players.");
_respawnHealthMultiplier = config.Bind<float>("Respawn Settings", "RespawnHealthMultiplier", 1.1f, "Multiplies the health a player spawns with.");
_respawnDamageMultiplier = config.Bind<float>("Respawn Settings", "RespawnDamageMultiplier", 5f, "Multiplies the damage a player spawns with.");
_respawnMoneyMultiplier = config.Bind<float>("Respawn Settings", "RespawnMoneyMultiplier", 1.1f, "Multiplies the money rewarded for killing a player.");
_respawnAffixEnabled = config.Bind<bool>("Respawn Settings", "RespawnAffixEnabled", true, "Allows players to spawn with affixes if they have an empty equipment slot.");
_respawnAffixChance = config.Bind<float>("Respawn Settings", "RespawnAffixChance", 60f, "Sets the chance that a respawned player will have an affix.");
_additionalRespawnTime = config.Bind<float>("Respawn Settings", "AdditionalRespawnTime", 0.2f, "Sets how much respawn time will increase per player death. This will effect everyone.");
_noRespawnsAfterTeleporter = config.Bind<bool>("Respawn Settings", "NoRespawnsAfterTeleporter", true, "Disables respawning after the Teleporter event concludes.");
_noRepeatRespawns = config.Bind<bool>("Respawn Settings", "NoRepeatRespawns", true, "Will attempt to prevent the player from respawning as the same monster twice in a row.");
_itemPickupToggle = config.Bind<bool>("Item Settings", "ItemPickupToggle", true, "Allows monster players to pick up items off the ground. (Disabling won't work if RespawnTeam is set to Player.)");
_takeAffix = config.Bind<bool>("Item Settings", "TakeAffix", true, "Will take away granted affixes upon respawning.");
_forceGrantAffix = config.Bind<bool>("Item Settings", "ForceGrantAffix", false, "Will forcibly give the player an aspect, even if they have an equipment item.");
_blacklistedItems = config.Bind<string>("Item Settings", "BlacklistedItems", "HealingPotion, FragileDamageBonus, LunarPrimaryReplacement, LunarSecondaryReplacement, LunarSpecialReplacement, LunarUtilityReplacement, Thorns, ExtraLife, ExtraLifeVoid, AncientScepterItem", "Will take away these items from monster players, returning them after they respawn.");
_murderRevive = config.Bind<bool>("Behavior Settings", "MurderRevive", true, "Will respawn a dead player as a survivor if they kill another player.");
_murderWindow = config.Bind<float>("Behavior Settings", "MurderWindow", 15f, "The amount of time that a player has after damaging a player to respawn as them.");
_announceRespawns = config.Bind<bool>("Behavior Settings", "AnnounceRespawns", true, "Will announce a player respawning in the chat.");
_disableMoon = config.Bind<bool>("Behavior Settings", "DisableMoon", true, "Prevents players from respawning in Commencement.");
_overrideMetamorphosis = config.Bind<bool>("Behavior Settings", "OverrideMetamorphosis", true, "Allows Refightilization to override Artifact of Metamorphosis's behavior.");
_changeMinionsTeam = config.Bind<bool>("Behavior Settings", "ChangeMinionsTeam", true, "Minions will have their team changed to match the player.");
_endGameWhenEverybodyDead = config.Bind<bool>("Debug", "EndGameWhenEverybodyDead", true, "Ends the round when everybody is dead. (Keep this on.)");
_maxRespawnTries = config.Bind<int>("Debug", "MaxRespawnTries", 5, "The maximum attempts the game will make to retry spawning a player.");
_preventPrefabResetMethods = config.Bind<string>("Debug", "PreventPrefabResetMethods", "SwapCharacters, RevertCharacter, CCSpawnAs", "Manually set methods to not be affected by Refight's BodyPrefab-Resetting behavior. (Don't touch this unless you know what you're doing.)");
}
public void BuildRiskOfOptionsMenu()
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Expected O, but got Unknown
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Expected O, but got Unknown
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Expected O, but got Unknown
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Expected O, but got Unknown
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Expected O, but got Unknown
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Expected O, but got Unknown
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Expected O, but got Unknown
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: 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_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Expected O, but got Unknown
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Expected O, but got Unknown
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Expected O, but got Unknown
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Expected O, but got Unknown
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Expected O, but got Unknown
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0195: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Expected O, but got Unknown
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Expected O, but got Unknown
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01db: Expected O, but got Unknown
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Expected O, but got Unknown
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
//IL_01f0: Expected O, but got Unknown
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Expected O, but got Unknown
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_020b: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
//IL_0231: Expected O, but got Unknown
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0236: Expected O, but got Unknown
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_0246: Expected O, but got Unknown
//IL_024c: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Expected O, but got Unknown
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_0266: Expected O, but got Unknown
//IL_026c: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Expected O, but got Unknown
//IL_027c: Unknown result type (might be due to invalid IL or missing references)
//IL_0286: Expected O, but got Unknown
//IL_028c: Unknown result type (might be due to invalid IL or missing references)
//IL_0296: Expected O, but got Unknown
//IL_029c: Unknown result type (might be due to invalid IL or missing references)
//IL_02a6: Expected O, but got Unknown
//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
//IL_02d7: Expected O, but got Unknown
//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
//IL_02dc: Expected O, but got Unknown
//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
//IL_02ec: Expected O, but got Unknown
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02fc: Expected O, but got Unknown
//IL_0302: Unknown result type (might be due to invalid IL or missing references)
//IL_030c: Expected O, but got Unknown
//IL_0312: Unknown result type (might be due to invalid IL or missing references)
//IL_031c: Expected O, but got Unknown
//IL_0322: Unknown result type (might be due to invalid IL or missing references)
//IL_032c: Expected O, but got Unknown
//IL_0332: Unknown result type (might be due to invalid IL or missing references)
//IL_033c: Expected O, but got Unknown
//IL_0342: Unknown result type (might be due to invalid IL or missing references)
//IL_0347: Unknown result type (might be due to invalid IL or missing references)
//IL_0353: Expected O, but got Unknown
//IL_034e: Unknown result type (might be due to invalid IL or missing references)
//IL_0358: Expected O, but got Unknown
byte[] array = File.ReadAllBytes(Assembly.GetExecutingAssembly().Location.Replace("Refightilization.dll", "") + "icon.png");
Texture2D val = new Texture2D(256, 256);
ImageConversion.LoadImage(val, array);
ModSettingsManager.SetModIcon(Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero));
ModSettingsManager.SetModDescriptionToken("REFIGHT_MOD_DESCRIPTION");
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_enableRefightilization));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_allowBosses));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_allowScavengers));
ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(_blacklistedEnemies));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(_bossRequiredLoopCount));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(_scavangerRequiredLoopCount));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_enableFixedPool));
ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(_fixedPool));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_respawnDelay, new StepSliderConfig
{
min = 0f,
max = 60f,
increment = 1f
}));
ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)_respawnTeam));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_respawnHealthMultiplier, new StepSliderConfig
{
min = 0f,
max = 2f,
increment = 0.1f
}));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_respawnDamageMultiplier, new StepSliderConfig
{
min = 0f,
max = 10f,
increment = 0.2f
}));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_respawnMoneyMultiplier, new StepSliderConfig
{
min = 0f,
max = 2f,
increment = 0.1f
}));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_respawnAffixEnabled));
ModSettingsManager.AddOption((BaseOption)new SliderOption(_respawnAffixChance));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_additionalRespawnTime, new StepSliderConfig
{
min = 0f,
max = 2f,
increment = 0.1f
}));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_noRespawnsAfterTeleporter));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_noRepeatRespawns));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_itemPickupToggle));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_takeAffix));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_forceGrantAffix));
ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(_blacklistedItems));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_murderRevive));
ModSettingsManager.AddOption((BaseOption)new StepSliderOption(_murderWindow, new StepSliderConfig
{
min = 1f,
max = 60f,
increment = 1f
}));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_announceRespawns));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_disableMoon));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_overrideMetamorphosis));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_changeMinionsTeam));
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(_endGameWhenEverybodyDead));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(_maxRespawnTries));
ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(_preventPrefabResetMethods, new InputFieldConfig
{
restartRequired = true
}));
}
}
internal class RefightilizationLanguage
{
public List<string> ReviveMessages { get; set; }
public List<string> RevengeMessages { get; set; }
public string ItemBlacklistWarning { get; set; }
public string RiskOfOptionsDescription { get; set; }
public RefightilizationLanguage()
{
ReviveMessages = new List<string>();
RevengeMessages = new List<string>();
ItemBlacklistWarning = "{0}'s {1} will be returned, later.";
string text = Language.currentLanguageName;
StreamReader streamReader = new StreamReader(File.Open(Assembly.GetExecutingAssembly().Location.Replace("Refightilization.dll", "") + "LanguageResource.json", FileMode.Open, FileAccess.Read), Encoding.Unicode);
JSONNode val = JSON.Parse(streamReader.ReadToEnd());
if (val[text] == (object)null)
{
text = "en";
}
ConvertArrayToStringList(val[text]["reviveMessages"].AsArray, ReviveMessages);
ConvertArrayToStringList(val[text]["revengeMessages"].AsArray, RevengeMessages);
ItemBlacklistWarning = JSONNode.op_Implicit(val[text]["itemBlacklistWarning"]);
streamReader.Close();
}
private void ConvertArrayToStringList(JSONArray input, List<string> output)
{
for (int i = 0; i < ((JSONNode)input).Count; i++)
{
output.Add(((JSONNode)input)[i].Value);
}
}
}
}