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 BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using KillThemAll.Extras;
using KillThemAll.Hooks;
using KillThemAll.Managers;
using KillThemAll.Models;
using KillThemAll.Network;
using LethalBestiary.Modules;
using LethalLib.Modules;
using Newtonsoft.Json;
using RuntimeNetcodeRPCValidator;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
using UnityEngine.VFX;
using UnityEngine.VFX.Utility;
[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 = "")]
[assembly: AssemblyCompany("KillThemAll")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("KillThemAll")]
[assembly: AssemblyTitle("KillThemAll")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace KillThemAll
{
[BepInPlugin("KillThemAll.Main", "KillThemAll", "0.1.4")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class KillThemAll : BaseUnityPlugin
{
private const string modGUID = "KillThemAll.Main";
private const string modName = "KillThemAll";
private const string modVersion = "0.1.4";
public static KillThemAll instance;
public static AssetBundle hitMarkAsset;
public static AssetBundle hitMarkSfxAsset;
public static AssetBundle vfxBundle;
public static AssetBundle playerReactionsSfxAsset;
public static AssetBundle notificationAsset;
public static AssetBundle tombstoneAsset;
public static AssetBundle colliderTest;
private readonly Harmony harmony = new Harmony("KillThemAll.Main");
private NetcodeValidator netcodeValidator;
private Dictionary<string, ConfigEntry<int>> enemyConfigEntries = new Dictionary<string, ConfigEntry<int>>();
public ConfigEntry<string> TombSaveEntry;
private void Awake()
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
if ((Object)(object)instance == (Object)null)
{
instance = this;
}
Utils.SetupLog();
Utils.DebugLog("Awaking");
LoadAssetBundles();
harmony.PatchAll(typeof(VanillaHook));
netcodeValidator = new NetcodeValidator("KillThemAll.Main");
netcodeValidator.PatchAll();
netcodeValidator.BindToPreExistingObjectByBehaviour<KillableEnemyEmitter, PlayerControllerB>();
netcodeValidator.BindToPreExistingObjectByBehaviour<UIEmitter, PlayerControllerB>();
netcodeValidator.BindToPreExistingObjectByBehaviour<TombScrapEmitter, PlayerControllerB>();
netcodeValidator.BindToPreExistingObjectByBehaviour<OnSpawnEnemiesEmitter, PlayerControllerB>();
Utils.DebugLog("Awaken");
}
public static List<Type> FindAllDerivedTypes<T>()
{
return FindAllDerivedTypes<T>(Assembly.GetAssembly(typeof(T)));
}
public static List<Type> FindAllDerivedTypes<T>(Assembly assembly)
{
Type baseType = typeof(T);
return (from t in assembly.GetTypes()
where t != baseType && baseType.IsAssignableFrom(t)
select t).ToList();
}
public void Initialise()
{
AddKillThemAllBaseConfigs();
AddBountyConfigs();
Utils.DebugLog("Finding all base enemies...");
List<string> list = new List<string>();
List<Type> list2 = FindAllDerivedTypes<EnemyAI>();
foreach (Type item in list2)
{
if (!(item.Name == "TestEnemy") && !(item.Name == "LassoMan"))
{
string name = item.Name;
name = name.Replace("Enemy", "");
name = name.Replace("(Clone)", "");
name = name.Replace(".prefab", "");
name = name.Replace("AI", "");
Utils.DebugLog("Found enemy: " + name);
list.Add(name);
}
}
Utils.DebugLog("Finding all LethalLib enemies...");
foreach (SpawnableEnemy spawnableEnemy in Enemies.spawnableEnemies)
{
string enemyName = spawnableEnemy.enemy.enemyName;
enemyName = enemyName.Replace("Enemy", "");
enemyName = enemyName.Replace("(Clone)", "");
enemyName = enemyName.Replace(".prefab", "");
enemyName = enemyName.Replace("AI", "");
Utils.DebugLog("Found enemy from LethalLib: " + enemyName);
list.Add(enemyName);
}
string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
directoryName.Replace("OLO-KillThemAll", "");
directoryName += "TheWeavers-LethalBestiary/LethalBestiary/LethalBestiary.dll";
Utils.DebugLog("Finding all LethalBestiary enemies...");
foreach (SpawnableEnemy spawnableEnemy2 in Enemies.spawnableEnemies)
{
string enemyName2 = spawnableEnemy2.enemy.enemyName;
enemyName2 = enemyName2.Replace("Enemy", "");
enemyName2 = enemyName2.Replace("(Clone)", "");
enemyName2 = enemyName2.Replace(".prefab", "");
enemyName2 = enemyName2.Replace("AI", "");
Utils.DebugLog("Found enemy from LethalBestiary: " + enemyName2);
list.Add(enemyName2);
}
Utils.DebugLog("Creating config entries based on enemies found...");
foreach (string item2 in list)
{
string text = "Enemy Health";
string text2 = item2 + " Health";
int num = 3;
ConfigEntry<int> val = ((BaseUnityPlugin)this).Config.Bind<int>(text, text2, num, "Health points for " + item2 + "s");
enemyConfigEntries.Add(item2, val);
KillableEnemyManager.Instance.enemyHealthDictionary.Add(item2, val.Value);
Utils.DebugLog("Config entry created for: " + item2);
}
foreach (KeyValuePair<string, ConfigEntry<int>> entry in enemyConfigEntries)
{
entry.Value.SettingChanged += delegate(object sender, EventArgs value)
{
if (sender is ConfigEntry<int> val2)
{
KillableEnemyManager.Instance.SetEnemyHealth(entry.Key, val2.Value);
Utils.DebugLog("Saved health value for: " + entry.Key + " to: " + val2.Value);
}
else
{
Utils.DebugLog("ERROR: Tried to save config entry but entry = NULL");
}
};
}
Utils.DebugLog("Finished creating config entries based on enemies found!");
TombSaveEntry = ((BaseUnityPlugin)this).Config.Bind<string>("!IGNORE THIS!", "Tomb Saving", "", "DO NOT DELETE");
}
public void AddKillThemAllBaseConfigs()
{
ConfigEntry<bool> debugLogEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("KillThemAll", "Debug Log", true, " if checked, log from this mod is output in the console");
ConfigEntry<bool> showHitmarkVfxEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("KillThemAll", "Hit Marker", true, "If enabled, show hitmarker effect when damaging an enemy");
ConfigEntry<bool> playHitmarkSfxEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("KillThemAll", "Hit Marker Sound Effect", true, "If enabled, play hitmarker sound effect when damaging an enemy");
ConfigEntry<bool> playerReactionAKSfxEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("KillThemAll", "Player Reaction", true, "If enabled, play random sound effect when you or others kill an enemy (Its random if it plays or not)");
ConfigEntry<bool> showEnemyDeathEffectEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("KillThemAll", "Enemy Death Effect", true, "If enabled, play enemy death effect");
KillableEnemyManager.Instance.debugLog = debugLogEntry.Value;
KillableEnemyManager.Instance.showHitmarkVfx = showHitmarkVfxEntry.Value;
KillableEnemyManager.Instance.playHitmarkSfx = playHitmarkSfxEntry.Value;
KillableEnemyManager.Instance.playerReactionAKSfx = playerReactionAKSfxEntry.Value;
KillableEnemyManager.Instance.showEnemyDeathEffect = showEnemyDeathEffectEntry.Value;
debugLogEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.debugLog = debugLogEntry.Value;
};
showHitmarkVfxEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.showHitmarkVfx = showHitmarkVfxEntry.Value;
};
playHitmarkSfxEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.playHitmarkSfx = playHitmarkSfxEntry.Value;
};
playerReactionAKSfxEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.playerReactionAKSfx = playerReactionAKSfxEntry.Value;
};
showEnemyDeathEffectEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.showEnemyDeathEffect = showEnemyDeathEffectEntry.Value;
};
}
public void AddBountyConfigs()
{
ConfigEntry<int> chanceToSpawnPerRoundEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Rarity per round", 75, " Chance to spawn a bounty that round, the number is used like a percentage, the higher it is the higher the chances!");
ConfigEntry<int> chanceToSpawnPerHourEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Rarity per hour", 50, " Chances to spawn a bounty every hour if one has not spawned yet, , the number is used like a percentage, the higher it is the higher the chances!");
ConfigEntry<int> timeBetweenRetryingBountiesEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Retry per failed bounty", 2, " How many hours should it wait before retrying to spawn a bounty that failed the rarity check, In-game hours.");
ConfigEntry<int> timeBetweenSuccesfulBountiesEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Time between next bounty", 4, " How many hours should it wait before spawning another bounty if possible, In-game hours.");
ConfigEntry<int> bountiesPerRoundEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Bounties per round", 2, " How many bounties can spawn per round if they pass the rarity checks");
ConfigEntry<int> spawnAfterHourEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Spawn after specific hour", 11, " Start spawning bounties after a specific hour, 0 = it will try and spawn from that start of the round, this uses a 24 hour clock.");
ConfigEntry<int> rewardMultiplierEntry = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty Settings", "Reward Multiplier", 4, " This value determines the end reward value for a bounty kill, (Enemy Health * Base Reward) * Reward Multiplier = Credit Reward");
ConfigEntry<int> baseKillRewardMultiplierEntry = ((BaseUnityPlugin)this).Config.Bind<int>("KillThemAll", "Base Reward Multiplier", 4, " This value determines the end reward value for a kill, Enemy Health * Base Reward Multiplier = Credit Reward");
BountyManager.Instance.chanceToSpawnPerRound = chanceToSpawnPerRoundEntry.Value;
BountyManager.Instance.chanceToSpawnPerHour = chanceToSpawnPerHourEntry.Value;
BountyManager.Instance.timeBetweenRetryingBounties = timeBetweenRetryingBountiesEntry.Value;
BountyManager.Instance.timeBetweenSuccesfulBounties = timeBetweenSuccesfulBountiesEntry.Value;
BountyManager.Instance.bountiesPerRound = bountiesPerRoundEntry.Value;
BountyManager.Instance.spawnAfterHour = spawnAfterHourEntry.Value;
BountyManager.Instance.rewardMultiplier = rewardMultiplierEntry.Value;
KillableEnemyManager.Instance.baseKillRewardMultiplier = baseKillRewardMultiplierEntry.Value;
chanceToSpawnPerRoundEntry.SettingChanged += delegate
{
BountyManager.Instance.chanceToSpawnPerRound = chanceToSpawnPerRoundEntry.Value;
Utils.DebugLog("BM: chanceToSpawnPerRound to: " + chanceToSpawnPerRoundEntry.Value);
};
chanceToSpawnPerHourEntry.SettingChanged += delegate
{
BountyManager.Instance.chanceToSpawnPerHour = chanceToSpawnPerHourEntry.Value;
Utils.DebugLog("BM: chanceToSpawnPerHourEntry to: " + chanceToSpawnPerHourEntry.Value);
};
timeBetweenRetryingBountiesEntry.SettingChanged += delegate
{
BountyManager.Instance.timeBetweenRetryingBounties = timeBetweenRetryingBountiesEntry.Value;
Utils.DebugLog("BM: timeBetweenRetryingBountiesEntry to: " + timeBetweenRetryingBountiesEntry.Value);
};
timeBetweenSuccesfulBountiesEntry.SettingChanged += delegate
{
BountyManager.Instance.timeBetweenSuccesfulBounties = timeBetweenSuccesfulBountiesEntry.Value;
Utils.DebugLog("BM: timeBetweenSuccesfulBountiesEntry to: " + timeBetweenSuccesfulBountiesEntry.Value);
};
bountiesPerRoundEntry.SettingChanged += delegate
{
BountyManager.Instance.bountiesPerRound = bountiesPerRoundEntry.Value;
Utils.DebugLog("BM: bountiesPerRoundEntry to: " + bountiesPerRoundEntry.Value);
};
spawnAfterHourEntry.SettingChanged += delegate
{
BountyManager.Instance.spawnAfterHour = spawnAfterHourEntry.Value;
Utils.DebugLog("BM: spawnAfterHourEntry to: " + spawnAfterHourEntry.Value);
};
rewardMultiplierEntry.SettingChanged += delegate
{
BountyManager.Instance.rewardMultiplier = rewardMultiplierEntry.Value;
Utils.DebugLog("BM: rewardMultiplierEntry to: " + rewardMultiplierEntry.Value);
};
baseKillRewardMultiplierEntry.SettingChanged += delegate
{
KillableEnemyManager.Instance.baseKillRewardMultiplier = baseKillRewardMultiplierEntry.Value;
};
}
private void LoadAssetBundles()
{
string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
hitMarkAsset = AssetBundle.LoadFromFile(Path.Combine(directoryName, "hitmarkassetbundle"));
if ((Object)(object)hitMarkAsset == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load hitMarkAsset asset bundles");
return;
}
KillableEnemyManager.Instance.hitmarkHUD = hitMarkAsset.LoadAsset<GameObject>("HitmarkImg");
if (Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.hitmarkHUD))
{
Utils.DebugLog("Successfully found object in assetbundle ( hitmark HUD obj) " + ((Object)KillableEnemyManager.Instance.hitmarkHUD).name);
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( hitmark HUD obj)");
}
hitMarkSfxAsset = AssetBundle.LoadFromFile(Path.Combine(directoryName, "hitmarksfxassetbundle"));
if ((Object)(object)hitMarkSfxAsset == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load hit mark sfx asset bundles");
return;
}
KillableEnemyManager.Instance.hitmarkSfx = new List<AudioClip>();
KillableEnemyManager.Instance.hitmarkSfx = hitMarkSfxAsset.LoadAllAssets<AudioClip>().ToList();
if (Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.hitmarkSfx[0]))
{
Utils.DebugLog("Successfully found object in assetbundle ( sfx hitmark )");
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( sfx hitmark )");
}
vfxBundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "vfxbundle.assets"));
if ((Object)(object)vfxBundle == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load enemyExplosionEffect asset bundles");
return;
}
KillableEnemyManager.Instance.enemyDeathEffect = vfxBundle.LoadAsset<GameObject>("Assets/LethalCompany/Mods/VFX/Blood.prefab");
KillableEnemyManager.Instance.tombDropEffect = vfxBundle.LoadAsset<GameObject>("Assets/LethalCompany/Mods/VFX/Smoke.prefab");
KillableEnemyManager.Instance.enemyBountyEffect = vfxBundle.LoadAsset<GameObject>("Assets/LethalCompany/Mods/VFX/BountyAura.prefab");
if (Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.enemyDeathEffect) && Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.tombDropEffect) && Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.enemyBountyEffect))
{
Utils.DebugLog("Successfully found objects in vfx bundle");
}
else
{
Utils.DebugLog("ERROR: Not found object in vfx bundle");
}
playerReactionsSfxAsset = AssetBundle.LoadFromFile(Path.Combine(directoryName, "reactionsfxassetbundle"));
if ((Object)(object)playerReactionsSfxAsset == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load hit mark sfx asset bundles");
return;
}
KillableEnemyManager.Instance.playerReactionSfx = new List<AudioClip>();
KillableEnemyManager.Instance.playerReactionSfx = playerReactionsSfxAsset.LoadAllAssets<AudioClip>().ToList();
if (Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.playerReactionSfx[0]))
{
Utils.DebugLog("Successfully found object in assetbundle ( playerReactionsSfxAsset )");
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( playerReactionsSfxAsset )");
}
notificationAsset = AssetBundle.LoadFromFile(Path.Combine(directoryName, "notificationassetbundle"));
if ((Object)(object)notificationAsset == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load notificationAsset bundles");
return;
}
UIManager.Instance.notificationElementObj = notificationAsset.LoadAllAssets<GameObject>().ToList();
if (Object.op_Implicit((Object)(object)UIManager.Instance.notificationElementObj[0]))
{
Utils.DebugLog("Successfully found object in assetbundle ( notification element obj) " + ((Object)UIManager.Instance.notificationElementObj[0]).name);
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( notification element obj)");
}
if (Object.op_Implicit((Object)(object)UIManager.Instance.notificationElementObj[1]))
{
Utils.DebugLog("Successfully found object in assetbundle ( notification top element obj) " + ((Object)UIManager.Instance.notificationElementObj[1]).name);
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( notification top element obj)");
}
tombstoneAsset = AssetBundle.LoadFromFile(Path.Combine(directoryName, "tombstoneassetbundle.assets"));
if ((Object)(object)tombstoneAsset == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load tombstoneAsset bundles");
return;
}
Item val = tombstoneAsset.LoadAsset<Item>("Assets/LethalCompany/Mods/Scraps/Tombstones/Tombstones.asset");
if (Object.op_Implicit((Object)(object)val))
{
Utils.DebugLog("Successfully found object in assetbundle ( tombScrapAsset ) ");
if (!Object.op_Implicit((Object)(object)val.spawnPrefab.GetComponent<TombScrap>()))
{
((Behaviour)val.spawnPrefab.AddComponent<TombScrap>()).enabled = false;
((GrabbableObject)val.spawnPrefab.GetComponent<TombScrap>()).itemProperties = val;
((GrabbableObject)val.spawnPrefab.GetComponent<TombScrap>()).itemProperties.saveItemVariable = true;
Utils.DebugLog(" TombScrap added to prefab ");
}
else
{
Utils.DebugLog(" TombScrap already on prefab ");
Utils.DebugLog("TombScrap is enabled: " + ((Behaviour)val.spawnPrefab.GetComponent<TombScrap>()).enabled);
}
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( tombScrapAsset )");
}
NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab);
Items.RegisterScrap(val, 0, (LevelTypes)(-1));
Utilities.FixMixerGroups(val.spawnPrefab);
KillableEnemyManager.Instance.enemyTomb = val;
colliderTest = AssetBundle.LoadFromFile(Path.Combine(directoryName, "colidertest"));
if ((Object)(object)colliderTest == (Object)null)
{
Utils.DebugLog("ERROR: Failed to load colidertest asset bundles");
return;
}
KillableEnemyManager.Instance.colliderTest = colliderTest.LoadAsset<GameObject>("Cube");
if (Object.op_Implicit((Object)(object)KillableEnemyManager.Instance.colliderTest))
{
Utils.DebugLog("Successfully found object in assetbundle( colliderTest cube )" + (object)KillableEnemyManager.Instance.colliderTest);
}
else
{
Utils.DebugLog("ERROR: Not found object in assetbundle ( colliderTest cube )");
}
}
public void SaveTombScrapOnShip(string fileSave, int id, int meshIndex, int matIndex, string enemyName, string playerThatKilled)
{
if (isIdInJason(id))
{
Utils.DebugLog("Tomb with id: " + id + " already exists, skipping save!");
return;
}
Tomb tomb = new Tomb(fileSave, id, meshIndex, matIndex, enemyName, playerThatKilled);
string text = JsonConvert.SerializeObject((object)tomb, (Formatting)0);
string value = TombSaveEntry.Value + ((TombSaveEntry.Value == "") ? text : ("|" + text));
Utils.DebugLog("Saving tomb: " + id + ", json: " + text);
TombSaveEntry.Value = value;
}
public Tomb GetTombById(int id, string fileSave)
{
if (TombSaveEntry.Value.StartsWith('|'))
{
TombSaveEntry.Value = TombSaveEntry.Value.Substring(1);
}
string[] array = TombSaveEntry.Value.Split('|');
List<Tomb> list = new List<Tomb>();
if (array.Length == 0)
{
return null;
}
string[] array2 = array;
foreach (string text in array2)
{
if (text == "")
{
continue;
}
Tomb tomb = JsonConvert.DeserializeObject<Tomb>(text);
if (text.Length != 0)
{
if (tomb == null)
{
return null;
}
list.Add(tomb);
}
}
if (list.Count > 0)
{
list.RemoveAll((Tomb t) => t.fileSave != fileSave);
Tomb tomb2 = list.FirstOrDefault((Tomb t) => t.id == id);
if (tomb2 != null)
{
string oldValue = JsonConvert.SerializeObject((object)tomb2);
TombSaveEntry.Value = TombSaveEntry.Value.Replace(oldValue, "");
TombSaveEntry.Value = TombSaveEntry.Value.Replace("||", "|");
}
return tomb2;
}
Utils.DebugLog("Zero saved tombs found, returning null!");
return null;
}
public void OnDeleteGameSave(string fileSave)
{
if (TombSaveEntry.Value.StartsWith('|'))
{
TombSaveEntry.Value = TombSaveEntry.Value.Substring(1);
}
string[] array = TombSaveEntry.Value.Split('|');
if (array.Length == 0)
{
return;
}
List<Tomb> list = new List<Tomb>();
string[] array2 = array;
foreach (string text in array2)
{
if (text.Length != 0)
{
Tomb tomb = JsonConvert.DeserializeObject<Tomb>(text);
if (tomb == null)
{
Utils.DebugLog("Can not deserialize object to save tomb object!");
return;
}
list.Add(tomb);
}
}
if (list.Count > 0)
{
list.RemoveAll((Tomb t) => t.fileSave != fileSave);
{
foreach (Tomb item in list)
{
string oldValue = JsonConvert.SerializeObject((object)item);
TombSaveEntry.Value = TombSaveEntry.Value.Replace(oldValue, "");
TombSaveEntry.Value = TombSaveEntry.Value.Replace("||", "|");
Utils.DebugLog("Removed Tomb from: " + fileSave + ", Tomb id: " + item.id);
}
return;
}
}
Utils.DebugLog("No tombs saved to delete on: " + fileSave);
}
public void RemoveSavedTombThatDontExist(string fileSave)
{
if (TombSaveEntry.Value.StartsWith('|'))
{
TombSaveEntry.Value = TombSaveEntry.Value.Substring(1);
}
string[] array = TombSaveEntry.Value.Split('|');
if (array.Length == 0)
{
return;
}
List<TombScrap> list = Object.FindObjectsByType<TombScrap>((FindObjectsInactive)0, (FindObjectsSortMode)0).ToList();
List<Tomb> list2 = new List<Tomb>();
string[] array2 = array;
foreach (string text in array2)
{
if (text == "")
{
continue;
}
bool flag = false;
Tomb tomb = JsonConvert.DeserializeObject<Tomb>(text);
if (tomb == null)
{
return;
}
foreach (TombScrap item in list)
{
if (tomb.id == item.id)
{
flag = true;
break;
}
}
if (!flag)
{
list2.Add(tomb);
}
}
if (list2.Count <= 0)
{
return;
}
list2.RemoveAll((Tomb t) => t.fileSave != fileSave);
foreach (Tomb item2 in list2)
{
string oldValue = JsonConvert.SerializeObject((object)item2);
TombSaveEntry.Value = TombSaveEntry.Value.Replace(oldValue, "");
TombSaveEntry.Value = TombSaveEntry.Value.Replace("||", "|");
Utils.DebugLog("Removed (NULL)Tomb from: " + fileSave + ", Tomb id: " + item2.id);
}
}
public bool isIdInJason(int id)
{
return TombSaveEntry.Value.Contains(id.ToString());
}
}
public class Tomb
{
public string fileSave;
public int id;
public int meshIndex;
public int matIndex;
public string enemyName;
public string playerThatKilled;
public Tomb(string fileSave, int id, int meshIndex, int matIndex, string enemyName, string playerThatKilled)
{
this.fileSave = fileSave;
this.id = id;
this.meshIndex = meshIndex;
this.matIndex = matIndex;
this.enemyName = enemyName;
this.playerThatKilled = playerThatKilled;
}
}
}
namespace KillThemAll.Network
{
public class KillableEnemyEmitter : NetworkBehaviour
{
[ServerRpc(RequireOwnership = false)]
public void DoDamageServerRpc(ulong enemyObjectId, ulong playerObjectId, int damage)
{
DoDamageClientRpc(enemyObjectId, playerObjectId, damage);
}
[ServerRpc(RequireOwnership = false)]
public void DoKillServerRpc(ulong objectId, ulong playerObjectId)
{
DoKillClientRpc(objectId, playerObjectId);
}
[ClientRpc]
public void DoDamageClientRpc(ulong objectId, ulong playerObjectId, int damage)
{
KillableEnemyManager.Instance.OnEnemyHit(objectId, playerObjectId, damage);
}
[ClientRpc]
public void DoKillClientRpc(ulong objectId, ulong playerObjectId)
{
KillableEnemyManager.Instance.OnEnemyDeath(objectId, playerObjectId);
}
}
public class OnSpawnEnemiesEmitter : NetworkBehaviour
{
[ServerRpc(RequireOwnership = false)]
public void AddObjectServerRpc(ulong enemyObjectId)
{
AddObjectClientRpc(enemyObjectId);
}
[ClientRpc]
public void AddObjectClientRpc(ulong objectId)
{
SpawnEnemyManager.Instance.AddAuraToBounty(objectId);
}
}
internal class TombScrapEmitter : NetworkBehaviour
{
[ServerRpc(RequireOwnership = false)]
public void SpawnTombServerRpc(ulong enemyKilled_Id, ulong playerThatKilled_Id, ulong tombScrap_Id, int scrapValue, int mesh, int mat)
{
SpawnTombClientRpc(enemyKilled_Id, playerThatKilled_Id, tombScrap_Id, scrapValue, mesh, mat);
}
[ClientRpc]
public void SpawnTombClientRpc(ulong enemyKilled_Id, ulong playerThatKilled_Id, ulong tombScrap_Id, int scrapValue, int mesh, int mat)
{
KillableEnemyManager.Instance.OnTombScrapSpawn(enemyKilled_Id, playerThatKilled_Id, tombScrap_Id, scrapValue, mesh, mat);
}
[ServerRpc]
public void SendTombDataSaveServerRpc(ulong tombScrap_Id, string enemyKilled_Id, string playerKilled, int mesh, int mat)
{
SendTombDataSaveClientRpc(tombScrap_Id, enemyKilled_Id, playerKilled, mesh, mat);
}
[ClientRpc]
public void SendTombDataSaveClientRpc(ulong tombScrap_Id, string enemyKilled_Id, string playerKilled, int mesh, int mat)
{
Utils.GetScrapObject(tombScrap_Id).GetComponent<TombScrap>().LoadItemSaveDataOnJoin(enemyKilled_Id, playerKilled, mesh, mat);
}
}
internal class UIEmitter : NetworkBehaviour
{
[ServerRpc(RequireOwnership = false)]
public void DoNotificationOnKillServerRpc(string enemyName, string playerThatKilledName, int rewardForKill, bool isBounty, int secondsOnScreen)
{
DoNotificationOnKillClientRpc(enemyName, playerThatKilledName, rewardForKill, isBounty, secondsOnScreen);
}
[ServerRpc(RequireOwnership = false)]
public void DoNotificationOnBountyServerRpc(string enemyName, int rewardForKill, int secondsOnScreen)
{
DoNotificationOnBountyClientRpc(enemyName, rewardForKill, secondsOnScreen);
}
[ClientRpc]
public void DoNotificationOnKillClientRpc(string enemyName, string playerThatKilledName, int rewardForKill, bool isBounty, int secondsOnScreen)
{
UIManager.Instance.ShowEnemyKilledNotfication(enemyName, playerThatKilledName, rewardForKill, isBounty, secondsOnScreen);
}
[ClientRpc]
public void DoNotificationOnBountyClientRpc(string enemyName, int rewardForKill, int secondsOnScreen)
{
UIManager.Instance.ShowEnemyBountyNotfication(enemyName, rewardForKill, secondsOnScreen);
}
}
}
namespace KillThemAll.Models
{
public class KillableEnemy : MonoBehaviour
{
private int startingHealth = 0;
private int currentHealth = 0;
private int reward = 0;
private bool bounty = false;
private ulong networkObjectId;
private EnemyAI enemyAI;
private GameObject collisionAIObject;
public EnemyAI EnemyAI
{
get
{
return enemyAI;
}
set
{
enemyAI = value;
}
}
public GameObject CollisionAIObject
{
get
{
return collisionAIObject;
}
set
{
collisionAIObject = value;
}
}
public ulong NetworkObjectId
{
get
{
return networkObjectId;
}
set
{
networkObjectId = value;
}
}
public int CurrentHealth
{
get
{
return currentHealth;
}
set
{
currentHealth = value;
}
}
public int StartingHealth
{
get
{
return startingHealth;
}
set
{
startingHealth = value;
}
}
public int Reward
{
get
{
return reward;
}
set
{
reward = value;
}
}
public bool isBounty
{
get
{
return bounty;
}
set
{
bounty = value;
}
}
public void DoDamage(int amount, ulong playerThatKilled_Id)
{
if (currentHealth != 0)
{
currentHealth -= amount;
if (currentHealth < 0)
{
currentHealth = 0;
}
if (currentHealth == 0 && (((NetworkBehaviour)enemyAI).IsHost || ((NetworkBehaviour)enemyAI).IsServer))
{
((Behaviour)((Component)enemyAI).gameObject.GetComponentInChildren<EnemyAICollisionDetect>()).enabled = false;
Utils.DebugLog("KillableEnemy: DoDamage() Enemy died sending ServerRPC");
KillableEnemyManager.Instance.OnEnemyDeathPrepareServerRPC(((NetworkBehaviour)enemyAI).NetworkObjectId, playerThatKilled_Id);
}
else if (((NetworkBehaviour)enemyAI).IsHost || ((NetworkBehaviour)enemyAI).IsServer)
{
Utils.DebugLog("KillableEnemy: DoDamage() Enemy took damge sending ServerRPC");
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<KillableEnemyEmitter>().DoDamageServerRpc(((NetworkBehaviour)enemyAI).NetworkObjectId, playerThatKilled_Id, amount);
}
}
}
public void DespawnEnemy()
{
((MonoBehaviour)this).StartCoroutine(DespawnEnemyOvertime());
}
public IEnumerator DespawnEnemyOvertime()
{
yield return (object)new WaitForSeconds(0.4f);
if (Object.op_Implicit((Object)(object)((NetworkBehaviour)enemyAI).NetworkObject))
{
Utils.DebugLog("Despawning network object: " + ((Object)this).name);
((NetworkBehaviour)enemyAI).NetworkObject.Despawn(true);
}
}
}
public enum EnemyType
{
default_
}
}
namespace KillThemAll.Managers
{
internal class BountyManager
{
public struct EnemyKilled
{
public string name;
public string killerName;
public bool wasBounty;
public int reward;
}
private const string modGUID = "KillThemAll.BManager";
private static BountyManager _instance;
public Terminal __terminal;
public bool isRoundActive = false;
public int chanceToSpawnPerRound = 100;
public int chanceToSpawnPerHour = 100;
public int timeBetweenRetryingBounties = 1;
public int timeBetweenSuccesfulBounties = 3;
public int bountiesPerRound = 1;
public int spawnAfterHour = 12;
public int rewardMultiplier = 16;
public bool isHost = false;
private int bountiesSpawnedThisRound = 0;
private int retryAtThisHour = 0;
private bool shouldSpawnThisRound = false;
private bool checkedIfItShouldSpawn = false;
public List<EnemyKilled> enemyKilledList = new List<EnemyKilled>();
private bool once = false;
public static BountyManager Instance => _instance ?? (_instance = new BountyManager());
static BountyManager()
{
}
public void ServerUpdateOnRoundStart()
{
if (!checkedIfItShouldSpawn)
{
if (CheckIfBountyShouldSpawnThisRound())
{
Utils.DebugLog("Bounty will spawn this round!");
}
else
{
Utils.DebugLog("Bounty will not spawn this round!");
}
checkedIfItShouldSpawn = true;
}
if (!shouldSpawnThisRound || retryAtThisHour >= 24 || bountiesPerRound == 0 || bountiesSpawnedThisRound >= bountiesPerRound || Utils.GetTimeOfRound() < spawnAfterHour)
{
return;
}
if (Utils.GetTimeOfRound() >= retryAtThisHour)
{
Utils.DebugLog("Its time to try again and its: " + Utils.GetTimeOfRound());
once = false;
int num = Random.Range(0, 100);
Utils.DebugLog("Chance = " + num + ", need below" + chanceToSpawnPerHour);
if (num > chanceToSpawnPerHour)
{
retryAtThisHour = Utils.GetTimeOfRound() + timeBetweenRetryingBounties;
Utils.DebugLog("Didnt pass rarity check retrying bounty at: " + retryAtThisHour);
}
else if (bountiesSpawnedThisRound < bountiesPerRound)
{
bountiesSpawnedThisRound++;
retryAtThisHour = Utils.GetTimeOfRound() + timeBetweenSuccesfulBounties;
Utils.DebugLog("Bounty spawned | count: " + bountiesSpawnedThisRound);
Utils.DebugLog("Next spawn try at: " + retryAtThisHour);
OnSpawnBounty();
}
}
else if (!once)
{
Utils.DebugLog("Need to wait till " + retryAtThisHour + ", and its: " + Utils.GetTimeOfRound());
once = true;
}
}
public void ServerUpdateOnRoundEnd()
{
once = false;
checkedIfItShouldSpawn = false;
shouldSpawnThisRound = false;
bountiesSpawnedThisRound = 0;
retryAtThisHour = 0;
enemyKilledList.Clear();
Utils.DebugLog("ServerUpdateOnRoundEnd: resetting values");
}
public bool CheckIfBountyShouldSpawnThisRound()
{
int num = Random.Range(0, 100);
return shouldSpawnThisRound = num <= chanceToSpawnPerRound;
}
public void OnSpawnBounty()
{
int reward = 0;
string enemyName = SpawnEnemyManager.Instance.SpawnRandomEnemy(out reward);
UIManager.Instance.PrepareOnBountyServerRPC_Notification(enemyName, reward);
}
public void SaveKilledEnemy(string name, string player, bool wasBounty, int reward)
{
EnemyKilled item = default(EnemyKilled);
item.name = name;
item.killerName = player;
item.wasBounty = wasBounty;
item.reward = reward;
Utils.DebugLog("Added killed enemy: " + item.name + " that died by: " + item.killerName + " for " + item.reward + (item.wasBounty ? " and was a bounty" : " and was not a bounty"));
enemyKilledList.Add(item);
}
private void GiveCreditsToCrew(int reward)
{
if (!Object.op_Implicit((Object)(object)__terminal))
{
Utils.DebugLog("ERROR: Reference to terminal is null! Cant give credits");
return;
}
Terminal _terminal = __terminal;
_terminal.groupCredits += reward;
__terminal.SyncGroupCreditsServerRpc(__terminal.groupCredits, __terminal.numberOfItemsInDropship);
}
}
internal class KillableEnemyManager
{
private const string modGUID = "KillThemAll.KEManager";
private static KillableEnemyManager _instance;
public Dictionary<string, int> enemyHealthDictionary = new Dictionary<string, int>();
public PlayerControllerB localPlayer;
public bool debugLog = true;
public bool showHitmarkVfx = true;
public bool playHitmarkSfx = true;
public bool showEnemyDeathEffect = true;
public bool playerReactionAKSfx = true;
public int baseKillRewardMultiplier = 10;
public Animator playerHitmarkAnimator;
private AudioSource playerAudioSource;
public GameObject hitmarkHUD;
public List<AudioClip> hitmarkSfx;
public GameObject enemyDeathEffect;
public GameObject tombDropEffect;
public GameObject enemyBountyEffect;
public List<AudioClip> playerReactionSfx;
public Item enemyTomb;
public GameObject colliderTest;
private GameObject hitMarkerHud;
public static KillableEnemyManager Instance => _instance ?? (_instance = new KillableEnemyManager());
public Dictionary<ulong, EnemyAI> NetworkObjectIDToEnemyAI { get; } = new Dictionary<ulong, EnemyAI>();
public Dictionary<EnemyAI, ulong> EnemyAIToNetworkObjectID { get; } = new Dictionary<EnemyAI, ulong>();
static KillableEnemyManager()
{
}
public void SetEnemyHealth(string enemyName, int newHealth)
{
if (enemyHealthDictionary.ContainsKey(enemyName))
{
enemyHealthDictionary[enemyName] = newHealth;
}
}
public void SetupHitmarkerHUD(PlayerControllerB __instance)
{
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)__instance) || Object.op_Implicit((Object)(object)hitMarkerHud))
{
return;
}
localPlayer = __instance;
Transform transform = GameObject.Find("Systems/UI/Canvas/PlayerCursor/Cursor").transform;
if (!Object.op_Implicit((Object)(object)transform))
{
Utils.DebugLog("ERROR: SetupHitmarkerHUD() => parentCanvas = NULL");
return;
}
hitMarkerHud = Object.Instantiate<GameObject>(hitmarkHUD, transform.parent, false);
if (!Object.op_Implicit((Object)(object)hitMarkerHud))
{
Utils.DebugLog("ERROR: SetupHitmarkerHUD() => hitMarkerHudObject = NULL");
return;
}
hitMarkerHud.SetActive(true);
hitMarkerHud.transform.localScale = new Vector3(1f, 1f, 1f);
playerHitmarkAnimator = hitMarkerHud.GetComponent<Animator>();
if (!Object.op_Implicit((Object)(object)playerHitmarkAnimator))
{
Utils.DebugLog("ERROR: SetupHitmarkerHUD() => playerHitmarkAnimator = NULL");
return;
}
playerHitmarkAnimator.speed = 1.9f;
Utils.DebugLog("HUD Instantiated for local player: " + localPlayer.playerUsername);
}
public KillableEnemy AssignKillableClassToEnemy(EnemyAI __instance)
{
if (Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<KillableEnemy>()))
{
return ((Component)__instance).gameObject.GetComponent<KillableEnemy>();
}
int num = 10000;
string name = ((Object)__instance).name;
name = name.Replace("Enemy", "");
name = name.Replace("(Clone)", "");
name = name.Replace(".prefab", "");
double num2 = 0.0;
string text = "null";
if (enemyHealthDictionary.Count == 0)
{
Utils.DebugLog("enemyHealthDictionary is empty");
}
foreach (KeyValuePair<string, int> item in enemyHealthDictionary)
{
double num3 = Utils.SimilarityRatio(name, item.Key);
if (num3 > num2)
{
num2 = num3;
if (item.Value > 0)
{
num = item.Value;
}
text = item.Key;
Utils.DebugLog("Comparing name: " + name + ", against: " + item.Key + " | Similarity = " + num3);
}
}
if (text == "null")
{
Utils.DebugLog("Not found similar name for: " + name + "!!!");
return null;
}
KillableEnemy killableEnemy = InitializeKillableData(__instance);
killableEnemy.StartingHealth = num;
killableEnemy.CurrentHealth = num;
killableEnemy.Reward = num * baseKillRewardMultiplier;
killableEnemy.EnemyAI = __instance;
killableEnemy.NetworkObjectId = ((NetworkBehaviour)__instance).NetworkObjectId;
killableEnemy.CollisionAIObject = ((Component)((Component)((Component)__instance).gameObject.transform.root).GetComponentInChildren<EnemyAICollisionDetect>()).gameObject;
bool flag = false;
MeshRenderer val = null;
bool flag2 = false;
Utils.DebugLog("Registering enemy: " + ((Object)((Component)__instance).gameObject).name + ", new HP: " + num);
return killableEnemy;
}
private KillableEnemy InitializeKillableData(EnemyAI enemyAI)
{
EnemyAIToNetworkObjectID[enemyAI] = ((NetworkBehaviour)enemyAI).NetworkObjectId;
NetworkObjectIDToEnemyAI[((NetworkBehaviour)enemyAI).NetworkObjectId] = enemyAI;
return ((Component)enemyAI).gameObject.AddComponent<KillableEnemy>();
}
public void OnEnemyDeathPrepareServerRPC(ulong enemyHit_Id, ulong playerThatKilled_Id)
{
EnemyAI enemyAIClassFromNetID = Utils.GetEnemyAIClassFromNetID(enemyHit_Id);
KillableEnemy component = ((Component)enemyAIClassFromNetID).GetComponent<KillableEnemy>();
OnServerEnemyDropItem(enemyAIClassFromNetID);
BountyManager.Instance.SaveKilledEnemy(Utils.GetEnemyName(enemyAIClassFromNetID), Utils.GetPlayerClassFromNetID(playerThatKilled_Id).playerUsername, component.isBounty, component.Reward);
UIManager.Instance.PrepareOnKillServerRPC_Notification(((NetworkBehaviour)enemyAIClassFromNetID).NetworkObjectId, playerThatKilled_Id);
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<KillableEnemyEmitter>().DoKillServerRpc(((NetworkBehaviour)enemyAIClassFromNetID).NetworkObjectId, playerThatKilled_Id);
}
private void OnServerEnemyDropItem(EnemyAI enemyAI)
{
//IL_0007: 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_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: 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_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_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((Component)enemyAI).transform.position + new Vector3(0.2f, 5f, 0.2f);
if (Object.op_Implicit((Object)(object)((Component)enemyAI).gameObject.GetComponent<NutcrackerEnemyAI>()))
{
Object.Instantiate<GameObject>(((Component)enemyAI).gameObject.GetComponent<NutcrackerEnemyAI>().gunPrefab, val, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer).GetComponent<NetworkObject>().Spawn(false);
val.x += 0.5f;
val.z += 0.2f;
Object.Instantiate<GameObject>(((Component)enemyAI).gameObject.GetComponent<NutcrackerEnemyAI>().shotgunShellPrefab, val, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer).GetComponent<NetworkObject>().Spawn(false);
val.z += 0.2f;
Object.Instantiate<GameObject>(((Component)enemyAI).gameObject.GetComponent<NutcrackerEnemyAI>().shotgunShellPrefab, val, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer).GetComponent<NetworkObject>().Spawn(false);
Utils.DebugLog("Nutcracker Died: Spawned Shotgun and Ammo!");
}
if (Object.op_Implicit((Object)(object)((Component)enemyAI).gameObject.GetComponent<ButlerEnemyAI>()))
{
val.x += 0.5f;
val.z += 0.5f;
Object.Instantiate<GameObject>(((Component)enemyAI).gameObject.GetComponent<ButlerEnemyAI>().knifePrefab, val, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer).GetComponent<NetworkObject>().Spawn(false);
Utils.DebugLog("Butler Died: Spawned Knife!");
}
}
public void OnEnemyHitPrepareServerRPC(ulong enemyHit_Id, ulong playerThatHit_Id, int damageHit)
{
EnemyAI enemyAIClassFromNetID = Utils.GetEnemyAIClassFromNetID(enemyHit_Id);
if (Object.op_Implicit((Object)(object)enemyAIClassFromNetID))
{
KillableEnemy component = ((Component)enemyAIClassFromNetID).gameObject.GetComponent<KillableEnemy>();
if ((Object)(object)component != (Object)null)
{
((Component)enemyAIClassFromNetID).gameObject.GetComponent<KillableEnemy>().DoDamage(damageHit, playerThatHit_Id);
}
}
}
public void OnEnemyHit(ulong enemyHit_Id, ulong playerThatHit_Id, int damageHit)
{
EnemyAI enemyAIClassFromNetID = Utils.GetEnemyAIClassFromNetID(enemyHit_Id);
PlayerControllerB playerClassFromNetID = Utils.GetPlayerClassFromNetID(playerThatHit_Id);
if (!Object.op_Implicit((Object)(object)enemyAIClassFromNetID))
{
Utils.DebugLog("ERROR: OnEnemyHit() => enemyAI = NULL");
return;
}
if (!Object.op_Implicit((Object)(object)playerClassFromNetID))
{
Utils.DebugLog("ERROR: OnEnemyHit() => playerThatHit = NULL");
return;
}
Utils.DebugLog("OnEnemyHit: " + ((Object)enemyAIClassFromNetID).name + " hit for " + damageHit + " damage! by: " + playerClassFromNetID.playerUsername);
}
public void OnEnemyDeath(ulong enemyKilled_Id, ulong playerThatKilled_Id)
{
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0212: Unknown result type (might be due to invalid IL or missing references)
//IL_021c: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: 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_01cd: Unknown result type (might be due to invalid IL or missing references)
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
//IL_01de: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
EnemyAI enemyAIClassFromNetID = Utils.GetEnemyAIClassFromNetID(enemyKilled_Id);
PlayerControllerB playerClassFromNetID = Utils.GetPlayerClassFromNetID(playerThatKilled_Id);
if (!Object.op_Implicit((Object)(object)enemyAIClassFromNetID))
{
Utils.DebugLog("ERROR: OnEnemyDeath() => enemyAI = NULL");
return;
}
if (!Object.op_Implicit((Object)(object)playerClassFromNetID))
{
Utils.DebugLog("ERROR: OnEnemyDeath() => playerThatKilled = NULL");
return;
}
enemyAIClassFromNetID.KillEnemy(false);
if (Object.op_Implicit((Object)(object)enemyAIClassFromNetID.creatureSFX))
{
enemyAIClassFromNetID.creatureSFX.Stop();
}
if (Object.op_Implicit((Object)(object)enemyAIClassFromNetID.creatureVoice))
{
enemyAIClassFromNetID.creatureVoice.Stop();
}
if (showEnemyDeathEffect)
{
Vector3 val = default(Vector3);
((Vector3)(ref val))..ctor(((Component)enemyAIClassFromNetID).transform.position.x, ((Component)enemyAIClassFromNetID).transform.position.y + 2f, ((Component)enemyAIClassFromNetID).transform.position.z);
GameObject val2 = Object.Instantiate<GameObject>(enemyDeathEffect, val, enemyDeathEffect.transform.rotation);
val2.transform.localScale = val2.transform.localScale * 0.75f;
val2.AddComponent<VfxDespawn>();
}
Utils.DebugLog("OnEnemyDeath: " + ((Object)enemyAIClassFromNetID).name + " Killed by " + playerClassFromNetID.playerUsername);
PlayReactionAfterKillLocal(playerClassFromNetID);
if (Utils.isHost)
{
KillableEnemy component = ((Component)enemyAIClassFromNetID).GetComponent<KillableEnemy>();
Vector3 pos = default(Vector3);
((Vector3)(ref pos))..ctor(((Component)enemyAIClassFromNetID).transform.position.x, ((Component)enemyAIClassFromNetID).transform.position.y + 2f, ((Component)enemyAIClassFromNetID).transform.position.z);
Vector3 val3 = ((Component)playerClassFromNetID).transform.position - ((Component)enemyAIClassFromNetID).transform.position;
val3.y = 0f;
Quaternion rot = Quaternion.LookRotation(val3);
ServerPrepareTombScrapSpawn(enemyKilled_Id, playerThatKilled_Id, component.Reward, pos, rot);
component.DespawnEnemy();
}
((Component)enemyAIClassFromNetID).transform.position = new Vector3(((Component)enemyAIClassFromNetID).transform.position.x, -10000f, ((Component)enemyAIClassFromNetID).transform.position.z);
Utils.DebugLog("Moved enemy more than 6feet under");
}
public void ServerPrepareTombScrapSpawn(ulong enemyKilled_Id, ulong playerThatKilled_Id, int scrapValue, Vector3 pos, Quaternion rot)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
Utilities.FixMixerGroups(enemyTomb.spawnPrefab);
GameObject val = Object.Instantiate<GameObject>(enemyTomb.spawnPrefab, pos, rot);
int mesh = Random.Range(0, 3);
int mat = Random.Range(0, 3);
val.GetComponent<NetworkObject>().Spawn(false);
Utils.DebugLog("KEM: ServerPrepareTombScrapSpawn() Sending Server RPC");
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<TombScrapEmitter>().SpawnTombServerRpc(enemyKilled_Id, playerThatKilled_Id, val.GetComponent<NetworkObject>().NetworkObjectId, scrapValue, mesh, mat);
}
public void OnTombScrapSpawn(ulong enemyKilled_Id, ulong playerThatKilled_Id, ulong tombScrap_Id, int scrapValue, int mesh, int mat)
{
PlayerControllerB playerClassFromNetID = Utils.GetPlayerClassFromNetID(playerThatKilled_Id);
GameObject scrapObject = Utils.GetScrapObject(tombScrap_Id);
if (!Object.op_Implicit((Object)(object)scrapObject))
{
Utils.DebugLog("tombObj not found in spawned objects list");
}
if (!Object.op_Implicit((Object)(object)scrapObject.GetComponent<TombScrap>()))
{
Utils.DebugLog("TombScrap not found on: " + ((Object)scrapObject).name);
}
else
{
TombScrap component = scrapObject.GetComponent<TombScrap>();
component.scrapVal = scrapValue;
component.enemyName = Utils.GetEnemyName(enemyKilled_Id);
component.playerName = playerClassFromNetID.playerUsername;
component.meshIndex = mesh;
component.matIndex = mat;
component.OnSpawnInit();
}
Utils.DebugLog("Tombstone Spawned! Killer: " + playerClassFromNetID.playerUsername + ", Enemy: " + Utils.GetEnemyName(enemyKilled_Id));
}
public void PlayHitmarkerLocal(PlayerControllerB playerController)
{
if (playHitmarkSfx)
{
if (!Object.op_Implicit((Object)(object)hitmarkSfx[0]))
{
Utils.DebugLog("ERROR: PlayHitmarkerLocal() => hitmarkSfx[0] = NULL");
return;
}
if (!Object.op_Implicit((Object)(object)playerAudioSource))
{
if (!Object.op_Implicit((Object)(object)playerController.movementAudio))
{
Utils.DebugLog("ERROR: PlayHitmarkerLocal() => playerController.movementAudio = NULL");
return;
}
playerAudioSource = playerController.movementAudio;
}
playerAudioSource.PlayOneShot(hitmarkSfx[0], 3f);
Utils.DebugLog("Play Hitmark sound effect on local client");
}
if (showHitmarkVfx)
{
if (!Object.op_Implicit((Object)(object)playerHitmarkAnimator))
{
Utils.DebugLog("ERROR: PlayHitmarkerLocal() => playerHitmarkAnimator = NULL");
return;
}
playerHitmarkAnimator.Play("HitmarkAnim", 0, 0f);
Utils.DebugLog("Play Hitmark effect on local client");
}
}
public void PlayReactionAfterKillLocal(PlayerControllerB playerController)
{
if (playerReactionAKSfx)
{
if (!Object.op_Implicit((Object)(object)playerController))
{
Utils.DebugLog("ERROR: PlayReactionAfterKillLocal() => playerController = NULL");
return;
}
if (!Object.op_Implicit((Object)(object)playerReactionSfx[0]))
{
Utils.DebugLog("ERROR: PlayReactionAfterKillLocal() => playerReactionSfx[0] = NULL");
return;
}
if (!Object.op_Implicit((Object)(object)playerController.movementAudio))
{
Utils.DebugLog("ERROR: PlayReactionAfterKillLocal() => playerController.movementAudio = NULL");
return;
}
playerController.movementAudio.PlayOneShot(playerReactionSfx[0], 1f);
Utils.DebugLog("Playing reaction for killing an enemy: " + playerController.playerUsername);
}
}
}
internal class SpawnEnemyManager
{
public struct Enemy
{
public string name;
public GameObject prefab;
public bool isOutside;
}
private const string modGUID = "KillThemAll.SManager";
private static SpawnEnemyManager _instance;
public static List<Enemy> listOfSpawnableEnemies;
public static SpawnEnemyManager Instance => _instance ?? (_instance = new SpawnEnemyManager());
static SpawnEnemyManager()
{
listOfSpawnableEnemies = new List<Enemy>();
}
public string SpawnRandomEnemy(out int reward)
{
Enemy enemy = listOfSpawnableEnemies[Random.Range(0, listOfSpawnableEnemies.Count)];
reward = SpawnEnemy(enemy);
return enemy.name;
}
private int SpawnEnemy(Enemy enemy)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_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_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: 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)
Vector3 zero = Vector3.zero;
zero = ((!enemy.isOutside) ? RoundManager.Instance.allEnemyVents[Random.Range(0, RoundManager.Instance.allEnemyVents.Length)].floorNode.position : RoundManager.Instance.outsideAINodes[Random.Range(0, RoundManager.Instance.outsideAINodes.Length)].transform.position);
if (!Object.op_Implicit((Object)(object)enemy.prefab))
{
Utils.DebugLog("enemy.prefab null");
}
GameObject val = Object.Instantiate<GameObject>(enemy.prefab, zero, Quaternion.identity);
NetworkObject componentInChildren = val.GetComponentInChildren<NetworkObject>();
componentInChildren.Spawn(true);
if (!Object.op_Implicit((Object)(object)val.GetComponent<KillableEnemy>()))
{
if (Object.op_Implicit((Object)(object)val.GetComponent<EnemyAI>()))
{
Utils.DebugLog("ERROR: Cant find EnemyAI Class on " + ((Object)val).name);
}
EnemyAI component = val.GetComponent<EnemyAI>();
if (!Object.op_Implicit((Object)(object)component))
{
Utils.DebugLog("ERROR: Cant find EnemyAI Class on " + ((Object)val).name);
return 0;
}
KillableEnemy killableEnemy = KillableEnemyManager.Instance.AssignKillableClassToEnemy(component);
killableEnemy.isBounty = true;
killableEnemy.Reward = killableEnemy.StartingHealth * KillableEnemyManager.Instance.baseKillRewardMultiplier * BountyManager.Instance.rewardMultiplier;
Utils.DebugLog("(had to attach KE class) spawned bounty: " + ((Object)val).name + ", reward: " + killableEnemy.Reward);
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<OnSpawnEnemiesEmitter>().AddObjectServerRpc(componentInChildren.NetworkObjectId);
return killableEnemy.Reward;
}
KillableEnemy component2 = val.GetComponent<KillableEnemy>();
component2.isBounty = true;
component2.Reward = component2.StartingHealth * KillableEnemyManager.Instance.baseKillRewardMultiplier * BountyManager.Instance.rewardMultiplier;
Utils.DebugLog("(class already attached) spawned bounty: " + ((Object)val).name + ", reward: " + component2.Reward);
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<OnSpawnEnemiesEmitter>().AddObjectServerRpc(componentInChildren.NetworkObjectId);
return component2.Reward;
}
public void AddAuraToBounty(ulong enemy_Id)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: 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_0057: Unknown result type (might be due to invalid IL or missing references)
EnemyAI enemyAIClassFromNetID = Utils.GetEnemyAIClassFromNetID(enemy_Id);
if (Object.op_Implicit((Object)(object)enemyAIClassFromNetID))
{
GameObject val = Object.Instantiate<GameObject>(KillableEnemyManager.Instance.enemyBountyEffect, Vector3.zero, Quaternion.identity);
val.transform.SetParent(((Component)enemyAIClassFromNetID).transform, false);
val.transform.localRotation = Quaternion.identity;
val.transform.localPosition = Vector3.zero;
}
else
{
Utils.DebugLog("Could not find bounty enemy class to spawn aura!");
}
}
}
internal class UIManager
{
private const string modGUID = "KillThemAll.UIManager";
private static UIManager _instance;
public List<GameObject> notificationElementObj;
private Transform topNotificationParent;
private Transform sideNotificationParent;
public static UIManager Instance => _instance ?? (_instance = new UIManager());
static UIManager()
{
}
public void PrepareOnKillServerRPC_Notification(ulong objectKilled_Id, ulong playerThatKilled_Id)
{
Utils.DebugLog("Preparing server rpc call for kill notification");
KillableEnemy component = ((Component)GeneralExtensions.GetValueSafe<ulong, EnemyAI>(KillableEnemyManager.Instance.NetworkObjectIDToEnemyAI, objectKilled_Id)).gameObject.GetComponent<KillableEnemy>();
string name = ((Object)((Component)component).gameObject).name;
string playerUsername = Utils.GetPlayerClassFromNetID(playerThatKilled_Id).playerUsername;
name = name.Replace("Enemy", "");
name = name.Replace("(Clone)", "");
name = name.Replace(".prefab", "");
((Component)StartOfRound.Instance.allPlayerScripts[0]).GetComponent<UIEmitter>().DoNotificationOnKillServerRpc(name, playerUsername, component.Reward, component.isBounty, component.isBounty ? 6 : 4);
}
public void PrepareOnBountyServerRPC_Notification(string enemyName, int rewardAmount)
{
Utils.DebugLog("Preparing server rpc call for bounty notification");
((Component)StartOfRound.Instance.allPlayerScripts[0]).GetComponent<UIEmitter>().DoNotificationOnBountyServerRpc(enemyName, rewardAmount, 8);
}
public void Initialise()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Expected O, but got Unknown
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)sideNotificationParent))
{
GameObject val = new GameObject("SideNotificationParent");
val.transform.SetParent(GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD/TopLeftCorner/Self").transform, false);
VerticalLayoutGroup val2 = val.AddComponent<VerticalLayoutGroup>();
((Component)val2).transform.localPosition = new Vector3(-30f, -75f, 0f);
((Component)val2).transform.localScale = new Vector3(-0.2f, 0.2f, -0.2f);
((HorizontalOrVerticalLayoutGroup)val2).spacing = 15f;
((LayoutGroup)val2).childAlignment = (TextAnchor)4;
((HorizontalOrVerticalLayoutGroup)val2).reverseArrangement = true;
((HorizontalOrVerticalLayoutGroup)val2).childControlWidth = false;
((HorizontalOrVerticalLayoutGroup)val2).childControlHeight = false;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = false;
((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
sideNotificationParent = val.transform;
Utils.DebugLog("sideNotificationParent added " + ((Object)sideNotificationParent).name + ", its parent is " + ((Object)((Component)sideNotificationParent).transform.parent).name);
}
if (!Object.op_Implicit((Object)(object)topNotificationParent))
{
GameObject val3 = new GameObject("topNotificationParent");
Transform parent = ((Component)HUDManager.Instance.Inventory.canvasGroup).transform.parent;
val3.transform.SetParent(parent, false);
VerticalLayoutGroup val4 = val3.AddComponent<VerticalLayoutGroup>();
((Component)val4).transform.localPosition = new Vector3(0f, 150f, 0f);
((Component)val4).transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
((HorizontalOrVerticalLayoutGroup)val4).spacing = 15f;
((LayoutGroup)val4).childAlignment = (TextAnchor)4;
((HorizontalOrVerticalLayoutGroup)val4).reverseArrangement = true;
((HorizontalOrVerticalLayoutGroup)val4).childControlWidth = false;
((HorizontalOrVerticalLayoutGroup)val4).childControlHeight = false;
((HorizontalOrVerticalLayoutGroup)val4).childForceExpandHeight = false;
((HorizontalOrVerticalLayoutGroup)val4).childForceExpandWidth = false;
topNotificationParent = val3.transform;
Utils.DebugLog("topNotificationParent added " + ((Object)topNotificationParent).name + ", its parent is " + ((Object)((Component)topNotificationParent).transform.parent).name);
}
}
public void ShowEnemyKilledNotfication(string enemyName, string playerThatKilledName, int rewardForKill, bool isBounty, int secondsOnScreen)
{
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)sideNotificationParent))
{
Utils.DebugLog("ERROR: UIManager() => sideNotificationParent = NULL");
return;
}
GameObject val = Object.Instantiate<GameObject>(notificationElementObj[0], sideNotificationParent, false);
if (!Object.op_Implicit((Object)(object)val))
{
Utils.DebugLog("ERROR: UIManager() => notificationElement = NULL");
return;
}
val.SetActive(true);
val.transform.localPosition = new Vector3(0f, 0f, 0f);
if (!isBounty)
{
((Component)val.transform.GetChild(0)).gameObject.SetActive(false);
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().fontSize = 50f;
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().fontSize = 50f;
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().text = playerThatKilledName + " killed " + enemyName;
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().text = "The Company values its tomb at " + rewardForKill;
((Component)val.transform.GetChild(1)).gameObject.SetActive(true);
((Component)val.transform.GetChild(2)).gameObject.SetActive(true);
}
else
{
((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>().fontSize = 55f;
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().fontSize = 45f;
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().fontSize = 38f;
((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>().text = "BOUNTY " + enemyName.ToUpper() + " KILLED";
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().text = playerThatKilledName + " stompped it 6 feet down!";
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().text = "The Company values it at " + rewardForKill;
((Component)val.transform.GetChild(0)).gameObject.SetActive(true);
((Component)val.transform.GetChild(1)).gameObject.SetActive(true);
((Component)val.transform.GetChild(2)).gameObject.SetActive(true);
}
Animator component = val.GetComponent<Animator>();
if (!Object.op_Implicit((Object)(object)component))
{
Utils.DebugLog("ERROR: UIManager() => notificationElementAnimator = NULL");
}
else
{
val.AddComponent<ElementDespawn>().StartTimer(secondsOnScreen, component);
}
}
public void ShowEnemyBountyNotfication(string enemyName, int rewardForKill, int secondsOnScreen)
{
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)topNotificationParent))
{
Utils.DebugLog("ERROR: UIManager() => topNotificationParent = NULL");
return;
}
GameObject val = Object.Instantiate<GameObject>(notificationElementObj[1], topNotificationParent, false);
if (!Object.op_Implicit((Object)(object)val))
{
Utils.DebugLog("ERROR: UIManager() => notificationElement = NULL");
return;
}
val.SetActive(true);
val.transform.localPosition = new Vector3(0f, 0f, 0f);
((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>().fontSize = 80f;
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().fontSize = 50f;
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().fontSize = 50f;
((Component)val.transform.GetChild(0)).GetComponent<TMP_Text>().text = "bounty Has Awoken".ToUpper();
((Component)val.transform.GetChild(1)).GetComponent<TMP_Text>().text = "Find and kill " + enemyName;
((Component)val.transform.GetChild(2)).GetComponent<TMP_Text>().text = "The Company will reward with " + rewardForKill + " for its tomb!";
((Component)val.transform.GetChild(0)).gameObject.SetActive(true);
((Component)val.transform.GetChild(1)).gameObject.SetActive(true);
((Component)val.transform.GetChild(2)).gameObject.SetActive(true);
Animator component = val.GetComponent<Animator>();
if (!Object.op_Implicit((Object)(object)component))
{
Utils.DebugLog("ERROR: UIManager() => notificationElementAnimator = NULL");
}
else
{
val.AddComponent<ElementDespawn>().StartTimer(secondsOnScreen, component);
}
}
}
}
namespace KillThemAll.Hooks
{
internal class UnityHook
{
private const string modGUID = "KillThemAll.Unity";
static UnityHook()
{
}
[HarmonyPrefix]
[HarmonyPatch(typeof(NetworkManager), "DespawnObject")]
private static void PrefixDespawn(NetworkSpawnManager __instance, NetworkObject networkObject, bool destroyObject)
{
if (Object.op_Implicit((Object)(object)networkObject))
{
EnemyAI component = ((Component)networkObject).GetComponent<EnemyAI>();
if ((Object)(object)component != (Object)null)
{
KillableEnemyManager.Instance.EnemyAIToNetworkObjectID.Remove(component);
KillableEnemyManager.Instance.NetworkObjectIDToEnemyAI.Remove(((NetworkBehaviour)component).NetworkObjectId);
Utils.DebugLog("Removed " + ((Object)component).name + "'s network object");
}
}
}
}
internal class VanillaHook
{
private const string modGUID = "KillThemAll.Vanilla";
static VanillaHook()
{
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "Start")]
private static void GameNetworkManagerPostStart(GameNetworkManager __instance)
{
KillThemAll.instance.Initialise();
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "SaveItemsInShip")]
private static void SaveItemsInShipPost()
{
Utils.DebugLog("Items saved!------------------------");
if (Utils.isHost)
{
KillThemAll.instance.RemoveSavedTombThatDontExist(GameNetworkManager.Instance.currentSaveFileName);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(StartOfRound), "OnClientConnect")]
private static void OnClientConnectPostfix(ulong clientId)
{
if (!Utils.isHost)
{
return;
}
List<TombScrap> list = Object.FindObjectsByType<TombScrap>((FindObjectsInactive)0, (FindObjectsSortMode)0).ToList();
foreach (TombScrap item in list)
{
ulong networkObjectId = ((Component)item).GetComponent<NetworkObject>().NetworkObjectId;
((Component)StartOfRound.Instance.allPlayerScripts[0]).gameObject.GetComponent<TombScrapEmitter>().SendTombDataSaveServerRpc(networkObjectId, item.enemyName, item.playerName, item.meshIndex, item.matIndex);
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(DeleteFileButton), "DeleteFile")]
private static void PrefixDeleteFileButton()
{
int fileToDelete = Object.FindAnyObjectByType<DeleteFileButton>().fileToDelete;
if (1 == 0)
{
}
string text = fileToDelete switch
{
0 => "LCSaveFile1",
1 => "LCSaveFile2",
2 => "LCSaveFile3",
_ => "LCSaveFile1",
};
if (1 == 0)
{
}
string text2 = text;
KillThemAll.instance.OnDeleteGameSave(text2);
Utils.DebugLog("Delete saved = " + text2);
}
[HarmonyPatch(typeof(RoundManager), "Start")]
[HarmonyPrefix]
private static void GetHost()
{
Utils.isHost = ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost;
Utils.DebugLog("RoundManager start=> Round Started");
}
[HarmonyPatch(typeof(RoundManager), "Update")]
[HarmonyPrefix]
private static void OnRoundManagerUpdate()
{
if (Object.op_Implicit((Object)(object)StartOfRound.Instance) && Utils.isHost && RoundManager.Instance.isSpawningEnemies && !StartOfRound.Instance.shipIsLeaving)
{
BountyManager.Instance.ServerUpdateOnRoundStart();
}
}
[HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")]
[HarmonyPrefix]
private static void OnRoundManagerEnd()
{
if (Object.op_Implicit((Object)(object)StartOfRound.Instance) && Utils.isHost)
{
BountyManager.Instance.ServerUpdateOnRoundEnd();
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
private static void PostfixStartPlayer(PlayerControllerB __instance)
{
if (Utils.IsLocalPlayer(__instance))
{
KillableEnemyManager.Instance.SetupHitmarkerHUD(__instance);
UIManager.Instance.Initialise();
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(EnemyAI), "Start")]
private static void PostfixStartEnemy(EnemyAI __instance)
{
if (Object.op_Implicit((Object)(object)__instance) && Utils.isHost && !Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<KillableEnemy>()))
{
KillableEnemyManager.Instance.AssignKillableClassToEnemy(__instance);
Utils.DebugLog("Assigned values on host?: " + Utils.isHost);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(EnemyAI), "Update")]
private static void PostfixUpdateEnemy(EnemyAI __instance)
{
if (Object.op_Implicit((Object)(object)__instance) && Utils.isHost && !Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<KillableEnemy>()))
{
KillableEnemyManager.Instance.AssignKillableClassToEnemy(__instance);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(EnemyAI), "HitEnemy")]
private static void HitPostfix(EnemyAI __instance, int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false)
{
if (Object.op_Implicit((Object)(object)playerWhoHit))
{
if (Utils.IsLocalPlayer(playerWhoHit))
{
KillableEnemyManager.Instance.PlayHitmarkerLocal(playerWhoHit);
}
if (Utils.isHost)
{
Utils.DebugLog("Hook: OnEnemyHit() Prepare ServerRPC");
KillableEnemyManager.Instance.OnEnemyHitPrepareServerRPC(((NetworkBehaviour)__instance).NetworkObjectId, ((NetworkBehaviour)playerWhoHit).NetworkObjectId, force);
}
}
}
[HarmonyPatch(typeof(Terminal), "Start")]
[HarmonyPostfix]
private static void GetAllEnemies(ref SelectableLevel[] ___moonsCatalogueList, Terminal __instance)
{
SelectableLevel[] array = ___moonsCatalogueList;
SpawnEnemyManager.Enemy item = default(SpawnEnemyManager.Enemy);
SelectableLevel[] array2 = array;
foreach (SelectableLevel level in array2)
{
int e;
for (e = 0; e < level.Enemies.Count; e++)
{
if (!SpawnEnemyManager.listOfSpawnableEnemies.Any((SpawnEnemyManager.Enemy x) => x.name == level.Enemies[e].enemyType.enemyName) && !(level.Enemies[e].enemyType.enemyName == "Lasso"))
{
item.name = level.Enemies[e].enemyType.enemyName;
item.prefab = level.Enemies[e].enemyType.enemyPrefab;
item.isOutside = level.Enemies[e].enemyType.isOutsideEnemy;
Utils.DebugLog("Terminal start=> Enemy Found: " + item.name);
SpawnEnemyManager.listOfSpawnableEnemies.Add(item);
}
}
int i;
for (i = 0; i < level.OutsideEnemies.Count; i++)
{
if (!SpawnEnemyManager.listOfSpawnableEnemies.Any((SpawnEnemyManager.Enemy x) => x.name == level.OutsideEnemies[i].enemyType.enemyName) && !(level.Enemies[i].enemyType.enemyName == "Lasso"))
{
item.name = level.OutsideEnemies[i].enemyType.enemyName;
item.prefab = level.OutsideEnemies[i].enemyType.enemyPrefab;
item.isOutside = level.OutsideEnemies[i].enemyType.isOutsideEnemy;
Utils.DebugLog("Terminal start=> Enemy Found: " + item.name);
SpawnEnemyManager.listOfSpawnableEnemies.Add(item);
}
}
}
BountyManager.Instance.__terminal = __instance;
Utils.DebugLog("server BountyManager.Instance.__terminal " + (object)BountyManager.Instance.__terminal);
}
}
}
namespace KillThemAll.Extras
{
internal class ElementDespawn : MonoBehaviour
{
private float waittimer = 3f;
private Animator animator;
private bool isPlayingEnd = false;
public void StartTimer(float time, Animator animator)
{
Utils.DebugLog("StartTimer for despawn ui " + ((Object)this).name);
waittimer = time;
this.animator = animator;
}
private void Update()
{
waittimer -= Time.deltaTime;
if (waittimer <= 0f && !isPlayingEnd)
{
animator.Play("NotificationEnd", 0);
isPlayingEnd = true;
waittimer = 1f;
}
else if (isPlayingEnd && waittimer <= 0f)
{
Utils.DebugLog("Destroying notificationElement");
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
public class TombScrap : GrabbableObject
{
public bool HasJustSpawned = false;
public int id = -1;
public int meshIndex = -1;
public int matIndex = -1;
public int scrapVal = -1;
public string enemyName = "";
public string playerName = "";
public void OnSpawnInit(bool saveLoaded = false)
{
base.fallTime = 1f;
base.grabbable = true;
base.isInFactory = true;
base.grabbableToEnemies = true;
if (saveLoaded)
{
base.scrapPersistedThroughRounds = true;
base.isInElevator = true;
base.isInShipRoom = true;
}
if (!Object.op_Implicit((Object)(object)base.itemProperties))
{
base.itemProperties = KillableEnemyManager.Instance.enemyTomb;
}
base.itemProperties.saveItemVariable = true;
base.customGrabTooltip = "Grab Tomb : [E]";
base.mainObjectRenderer = ((Component)this).GetComponent<MeshRenderer>();
HasJustSpawned = true;
if (id == -1)
{
id = Random.Range(0, 99999);
}
UpdateObject();
((Behaviour)this).enabled = true;
}
public override int GetItemDataToSave()
{
KillThemAll.instance.SaveTombScrapOnShip(GameNetworkManager.Instance.currentSaveFileName, id, meshIndex, matIndex, enemyName, playerName);
return id;
}
public override void LoadItemSaveData(int saveDataID)
{
Tomb tombById = KillThemAll.instance.GetTombById(saveDataID, GameNetworkManager.Instance.currentSaveFileName);
if (tombById == null)
{
if (!Utils.isHost)
{
return;
}
Utils.DebugLog("not found saved tomb with id of: " + saveDataID);
}
enemyName = tombById.enemyName;
playerName = tombById.playerThatKilled;
meshIndex = tombById.meshIndex;
matIndex = tombById.matIndex;
Utils.DebugLog("Tomb saved loaded: " + saveDataID);
OnSpawnInit(saveLoaded: true);
}
public void LoadItemSaveDataOnJoin(string enemyName, string playerName, int meshIndex, int matIndex)
{
if (!(this.enemyName != ""))
{
this.enemyName = enemyName;
this.playerName = playerName;
this.meshIndex = meshIndex;
this.matIndex = matIndex;
Utils.DebugLog("Tomb saved loaded");
OnSpawnInit(saveLoaded: true);
}
}
public override void Update()
{
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0211: Unknown result type (might be due to invalid IL or missing references)
//IL_022a: Unknown result type (might be due to invalid IL or missing references)
//IL_023b: Unknown result type (might be due to invalid IL or missing references)
if (base.currentUseCooldown >= 0f)
{
base.currentUseCooldown -= Time.deltaTime;
}
if (((NetworkBehaviour)this).IsOwner)
{
if (base.isBeingUsed && base.itemProperties.requiresBattery)
{
if (base.insertedBattery.charge > 0f)
{
if (!base.itemProperties.itemIsTrigger)
{
Battery insertedBattery = base.insertedBattery;
insertedBattery.charge -= Time.deltaTime / base.itemProperties.batteryUsage;
}
}
else if (!base.insertedBattery.empty)
{
base.insertedBattery.empty = true;
if (base.isBeingUsed)
{
Debug.Log((object)"Use up batteries local");
base.isBeingUsed = false;
((GrabbableObject)this).UseUpBatteries();
}
}
}
if (!base.wasOwnerLastFrame)
{
base.wasOwnerLastFrame = true;
}
}
else if (base.wasOwnerLastFrame)
{
base.wasOwnerLastFrame = false;
}
if (base.isHeld || !((Object)(object)base.parentObject == (Object)null))
{
return;
}
if (base.fallTime < 1f)
{
base.reachedFloorTarget = false;
((GrabbableObject)this).FallWithCurve();
if (((Component)this).transform.localPosition.y - base.targetFloorPosition.y < 0.1f && !base.hasHitGround)
{
((GrabbableObject)this).PlayDropSFX();
((GrabbableObject)this).OnHitGround();
}
return;
}
if (!base.reachedFloorTarget)
{
base.reachedFloorTarget = true;
if (base.floorYRot == -1)
{
}
Vector3 val = default(Vector3);
((Vector3)(ref val))..ctor(((Component)this).transform.position.x, ((Component)this).transform.position.y - 0.5f, ((Component)this).transform.position.z);
GameObject val2 = Object.Instantiate<GameObject>(KillableEnemyManager.Instance.tombDropEffect, val, KillableEnemyManager.Instance.tombDropEffect.transform.rotation);
val2.AddComponent<VfxDespawn>();
}
((Component)this).transform.localPosition = base.targetFloorPosition;
}
public override void FallWithCurve()
{
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: 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: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
float num = base.startFallingPosition.y - base.targetFloorPosition.y;
if (!HasJustSpawned)
{
((Component)this).transform.rotation = Quaternion.Euler(base.itemProperties.restingRotation.x, (float)(base.floorYRot + base.itemProperties.floorYOffset) + 90f, base.itemProperties.restingRotation.z);
}
if (base.floorYRot == -1)
{
}
if (num > 5f)
{
((Component)this).transform.localPosition = Vector3.Lerp(base.startFallingPosition, base.targetFloorPosition, StartOfRound.Instance.objectFallToGroundCurveNoBounce.Evaluate(base.fallTime));
}
else
{
((Component)this).transform.localPosition = Vector3.Lerp(base.startFallingPosition, base.targetFloorPosition, StartOfRound.Instance.objectFallToGroundCurve.Evaluate(base.fallTime));
}
base.fallTime += Mathf.Abs(Time.deltaTime * 6f / num);
}
public override void OnHitGround()
{
((GrabbableObject)this).OnHitGround();
if (HasJustSpawned)
{
HasJustSpawned = false;
}
}
public void UpdateObject()
{
if (scrapVal != -1)
{
base.scrapValue = scrapVal;
}
((GrabbableObject)this).SetScrapValue(base.scrapValue);
((Component)this).GetComponent<MeshFilter>().mesh = base.itemProperties.meshVariants[meshIndex];
((Renderer)((Component)this).GetComponent<MeshRenderer>()).material = base.itemProperties.materialVariants[matIndex];
Transform transform = ((Component)((Component)((Component)this).transform.GetChild(1)).transform.GetChild(0)).transform;
((Component)transform.GetChild(0)).GetComponent<TMP_Text>().text = enemyName;
((Component)transform.GetChild(2)).GetComponent<TMP_Text>().text = playerName;
}
}
[VFXBinder("Transform/TransformBinder")]
public class TransformBinder : VFXBinderBase
{
[VFXPropertyBinding(new string[] { "UnityEditor.VFX.Transform" })]
[SerializeField]
[FormerlySerializedAs("m_Parameter")]
protected ExposedProperty m_Property = ExposedProperty.op_Implicit("Transform");
public Transform Target = null;
private ExposedProperty Position;
private ExposedProperty Angles;
private ExposedProperty Scale;
public string Property
{
get
{
return (string)m_Property;
}
set
{
m_Property = ExposedProperty.op_Implicit(value);
UpdateSubProperties();
}
}
protected override void OnEnable()
{
((VFXBinderBase)this).OnEnable();
UpdateSubProperties();
}
private void OnValidate()
{
UpdateSubProperties();
}
private void UpdateSubProperties()
{
Position = m_Property + ExposedProperty.op_Implicit("_position");
Angles = m_Property + ExposedProperty.op_Implicit("_angles");
Scale = m_Property + ExposedProperty.op_Implicit("_scale");
}
public override bool IsValid(VisualEffect component)
{
return (Object)(object)Target != (Object)null && component.HasVector3(ExposedProperty.op_Implicit(Position)) && component.HasVector3(ExposedProperty.op_Implicit(Angles)) && component.HasVector3(ExposedProperty.op_Implicit(Scale));
}
public override void UpdateBinding(VisualEffect component)
{
//IL_0013: 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_004d: Unknown result type (might be due to invalid IL or missing references)
component.SetVector3(ExposedProperty.op_Implicit(Position), Target.position);
component.SetVector3(ExposedProperty.op_Implicit(Angles), Target.eulerAngles);
component.SetVector3(ExposedProperty.op_Implicit(Scale), Target.localScale);
}
public override string ToString()
{
return string.Format("Transform : '{0}' -> {1}", m_Property, ((Object)(object)Target == (Object)null) ? "(null)" : ((Object)Target).name);
}
}
internal class Utils
{
public static bool isHost;
private static ManualLogSource mls;
private const string modGUID = "KillThemAll";
public static void SetupLog()
{
mls = Logger.CreateLogSource("KillThemAll");
}
public static void DebugLog(string log)
{
if (KillableEnemyManager.Instance.debugLog)
{
mls.LogInfo((object)("--KillThemAll | " + log));
}
}
public static bool IsLocalPlayer(PlayerControllerB playerControllerClass)
{
return (Object)(object)StartOfRound.Instance.localPlayerController == (Object)(object)playerControllerClass;
}
internal static void DebugLog(object p)
{
throw new NotImplementedException();
}
public static PlayerControllerB GetPlayerClassFromNetID(ulong clientID)
{
if (clientID < 0 || !Object.op_Implicit((Object)(object)NetworkManager.Singleton) || !Object.op_Implicit((Object)(object)((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[clientID]).gameObject))
{
return null;
}
return ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[clientID]).gameObject.GetComponent<PlayerControllerB>();
}
public static EnemyAI GetEnemyAIClassFromNetID(ulong enemyID)
{
if (enemyID < 0 || !Object.op_Implicit((Object)(object)NetworkManager.Singleton) || !Object.op_Implicit((Object)(object)((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[enemyID]).gameObject))
{
return null;
}
return ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[enemyID]).gameObject.GetComponent<EnemyAI>();
}
public static string GetEnemyName(ulong enemyID)
{
if (enemyID < 0 || !Object.op_Implicit((Object)(object)NetworkManager.Singleton) || !Object.op_Implicit((Object)(object)((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[enemyID]).gameObject))
{
return null;
}
EnemyAI component = ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[enemyID]).gameObject.GetComponent<EnemyAI>();
string name = ((Object)component).name;
name = name.Replace("Enemy", "");
name = name.Replace("(Clone)", "");
name = name.Replace(".prefab", "");
name = name.Replace("default_", "");
name = name.Replace("Obj", "");
name = name.Replace("(", "");
return name.Replace(")", "");
}
public static string GetEnemyName(EnemyAI enemyClass)
{
string name = ((Object)enemyClass).name;
name = name.Replace("Enemy", "");
name = name.Replace("(Clone)", "");
name = name.Replace(".prefab", "");
name = name.Replace("default_", "");
name = name.Replace("Obj", "");
name = name.Replace("(", "");
return name.Replace(")", "");
}
public static double SimilarityRatio(string str1, string str2)
{
int num = LevenshteinDistance(str1, str2);
int num2 = Math.Max(str1.Length, str2.Length);
return 1.0 - (double)num / (double)num2;
}
public static int LevenshteinDistance(string str1, string str2)
{
int[,] array = new int[str1.Length + 1, str2.Length + 1];
for (int i = 0; i <= str1.Length; i++)
{
for (int j = 0; j <= str2.Length; j++)
{
if (i == 0)
{
array[i, j] = j;
continue;
}
if (j == 0)
{
array[i, j] = i;
continue;
}
int num = ((str1[i - 1] != str2[j - 1]) ? 1 : 0);
array[i, j] = Math.Min(array[i - 1, j] + 1, Math.Min(array[i, j - 1] + 1, array[i - 1, j - 1] + num));
}
}
return array[str1.Length, str2.Length];
}
public static GameObject GetScrapObject(ulong scrapID)
{
if (scrapID < 0 || !Object.op_Implicit((Object)(object)NetworkManager.Singleton) || !Object.op_Implicit((Object)(object)((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[scrapID]).gameObject))
{
DebugLog("Scrap ID: " + scrapID + " Not found or Network Manager does not exist");
return null;
}
return ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[scrapID]).gameObject;
}
public static int GetTimeOfRound()
{
int num = (int)(TimeOfDay.Instance.normalizedTimeOfDay * (60f * (float)TimeOfDay.Instance.numberOfHours)) + 360;
return (int)Mathf.Floor((float)(num / 60));
}
}
public class VfxDespawn : MonoBehaviour
{
private float waittimer = 3f;
private void Start()
{
waittimer = 3f;
}
private void Update()
{
waittimer -= Time.deltaTime;
if (waittimer <= 0f)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
}