using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using StaticNetcodeLib;
using TheCompany.AI;
using TheCompany.Components;
using TheCompany.Enemy;
using TheCompany.Patches;
using TheCompany.Patches.Enemy;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("TheCompany")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TheCompany")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("cb833b0f-d0cd-4e40-bf49-09f5f36ff617")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace TheCompany
{
internal class ItemUtils
{
public static void GetItems(string name)
{
Dictionary<string, Item> all = new Dictionary<string, Item>();
StartOfRound.Instance.allItemsList.itemsList.ForEach(delegate(Item item)
{
all.Add(((Object)item).name, item);
TheCompanyMod.logger.LogInfo((object)((Object)item).name);
});
}
}
internal class ModMenu : MonoBehaviour
{
internal static ModMenu Instance;
internal bool Visible = false;
private const int MENUWIDTH = 600;
private const int MENUHEIGHT = 800;
private int MENUX;
private int MENUY;
private int ITEMWIDTH = 200;
private int CENTERX;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
MENUX = Screen.width / 2;
MENUY = Screen.height / 2;
CENTERX = MENUX + (300 - ITEMWIDTH / 2);
}
private void Update()
{
}
private void OnGUI()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
if (Visible)
{
GUI.Box(new Rect((float)MENUX, (float)MENUY, 600f, 800f), "The word of The Company");
}
}
private Texture2D MakeTex(int width, int height, Color color)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Expected O, but got Unknown
Color[] array = (Color[])(object)new Color[width * height];
for (int i = 0; i < array.Length; i++)
{
array[i] = color;
}
Texture2D val = new Texture2D(width, height);
val.SetPixels(array);
val.Apply();
return val;
}
}
[BepInPlugin("Xexplotion.TheCompany", "The Company", "0.1.6")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class TheCompanyMod : BaseUnityPlugin
{
private const string modGUID = "Xexplotion.TheCompany";
private const string modName = "The Company";
private const string modVersion = "0.1.6";
private readonly Harmony harmony = new Harmony("Xexplotion.TheCompany");
internal static TheCompanyMod Instance;
internal static ManualLogSource logger;
internal ModMenu modMenu;
public static GameObject poofExplosion;
public static AudioClip poofSFX;
internal static AssetBundle EasterEggBundle;
public static TheCompanyConfig BoundConfig { get; private set; }
private void Awake()
{
//IL_01db: Unknown result type (might be due to invalid IL or missing references)
//IL_01e1: Expected O, but got Unknown
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_025d: Unknown result type (might be due to invalid IL or missing references)
BoundConfig = new TheCompanyConfig(((BaseUnityPlugin)this).Config);
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
logger = Logger.CreateLogSource("Xexplotion.TheCompany");
logger.LogInfo((object)"All shall provail under my rain >:)");
harmony.PatchAll(typeof(TheCompanyMod));
harmony.PatchAll(typeof(PlayerControllerBPatch));
harmony.PatchAll(typeof(ShovelPatch));
harmony.PatchAll(typeof(GameNetworkManagerPatch));
harmony.PatchAll(typeof(StartOfRoundPatch));
harmony.PatchAll(typeof(IHitablePatch));
harmony.PatchAll(typeof(ShotGunPatch));
harmony.PatchAll(typeof(ThumperPatch));
harmony.PatchAll(typeof(BaboonHawkPatch));
harmony.PatchAll(typeof(BunkerSpiderPatch));
harmony.PatchAll(typeof(CoilheadPatch));
harmony.PatchAll(typeof(CentipedePatch));
harmony.PatchAll(typeof(PufferPatch));
harmony.PatchAll(typeof(BlobPatch));
harmony.PatchAll(typeof(CoilheadPatch));
harmony.PatchAll(typeof(MaskedPatch));
harmony.PatchAll(typeof(EyelessDogPatch));
harmony.PatchAll(typeof(ForestGiantAI));
GameObject val = new GameObject("ModMenu");
Object.DontDestroyOnLoad((Object)(object)val);
((Object)val).hideFlags = (HideFlags)61;
val.AddComponent<ModMenu>();
modMenu = (ModMenu)(object)val.GetComponent("ModMenu");
string text = ((BaseUnityPlugin)Instance).Info.Location.TrimEnd("TheCompany.dll".ToCharArray()) + "Assets/easteregg.assetbundle";
EasterEggBundle = AssetBundle.LoadFromFile(text);
GameObject val2 = EasterEggBundle.LoadAsset<GameObject>("EasterEgg.prefab");
GameObject val3 = Object.Instantiate<GameObject>(val2, default(Vector3), Quaternion.identity);
StunGrenadeItem component = val3.GetComponent<StunGrenadeItem>();
poofExplosion = component.stunGrenadeExplosion;
poofSFX = component.explodeSFX;
Object.Destroy((Object)(object)val2);
Object.Destroy((Object)(object)val3);
}
}
public static class ReflectionsExtensions
{
public static T GetFieldValue<T>(this object obj, string name)
{
BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo field = obj.GetType().GetField(name, bindingAttr);
if (field == null)
{
return default(T);
}
return (T)(field?.GetValue(obj));
}
}
public class TheCompanyConfig
{
public readonly ConfigEntry<bool> enableGod;
public readonly ConfigEntry<bool> disableNonServerExplosions;
public TheCompanyConfig(ConfigFile cfg)
{
cfg.SaveOnConfigSet = false;
enableGod = cfg.Bind<bool>("General", "GodEnabled", true, "Enables or disables god.");
disableNonServerExplosions = cfg.Bind<bool>("General", "NoExplosionClients", false, "Disabled explosions from non server hosts.");
ClearOrphanedEntries(cfg);
cfg.Save();
cfg.SaveOnConfigSet = true;
}
private static void ClearOrphanedEntries(ConfigFile cfg)
{
PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries");
Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(cfg);
dictionary.Clear();
}
}
}
namespace TheCompany.Patches
{
[HarmonyPatch(typeof(EnemyAI))]
internal class EnemyAIPatch
{
[HarmonyPatch("OnCollideWithPlayer")]
[HarmonyPostfix]
public static void OnPlayerKilled(Collider other, EnemyAI __instance)
{
if ((Object)(object)__instance != (Object)null && (Object)(object)other != (Object)null)
{
PlayerControllerB val = __instance.MeetsStandardPlayerCollisionConditions(other, __instance.GetFieldValue<bool>("inKillAnimation"), false);
DivineMessenger divineMessenger = default(DivineMessenger);
if ((Object)(object)val != (Object)null && ((Component)__instance).TryGetComponent<DivineMessenger>(ref divineMessenger) && (Object)(object)divineMessenger.target != (Object)null && !((Object)(object)val == (Object)(object)divineMessenger.target))
{
}
}
}
private static IEnumerator Explode(GameObject entity, PlayerControllerB player)
{
if (!((Object)(object)TheCompanyMod.poofExplosion == (Object)null) && !((Object)(object)TheCompanyMod.poofSFX == (Object)null))
{
yield return (object)new WaitForSeconds(2f);
Object.Instantiate<GameObject>(TheCompanyMod.poofExplosion, entity.transform.position, Quaternion.identity);
Object.Destroy((Object)(object)entity.gameObject);
}
}
}
[HarmonyPatch(typeof(GameNetworkManager))]
internal class GameNetworkManagerPatch
{
[HarmonyPatch("Start")]
[HarmonyPrefix]
public static void StartPatch()
{
}
}
[HarmonyPatch(typeof(GrabbableObject))]
internal class GrabbableObjectPatch
{
[HarmonyPatch("OnHitGround")]
[HarmonyPrefix]
public static void postOnHitGround(GrabbableObject __instance)
{
if (__instance.scrapValue != 0 && __instance.isInShipRoom && StartOfRound.Instance.inShipPhase)
{
}
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class IHitablePatch
{
[HarmonyTargetMethod]
public static MethodBase TargetMethod()
{
return AccessTools.Method(typeof(PlayerControllerB), "IHittable.Hit", new Type[5]
{
typeof(int),
typeof(Vector3),
typeof(PlayerControllerB),
typeof(bool),
typeof(int)
}, (Type[])null);
}
[HarmonyPostfix]
public static bool Prefix(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit, bool playHitSFX, int hitID, PlayerControllerB __instance)
{
if (__instance.criticallyInjured && __instance.health - 20 <= 0)
{
GodClient.CastJudgementManual(GodClient.JudgementType.Action, __instance.actualClientId, playerWhoHit.actualClientId);
}
return true;
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
[StaticNetcode]
internal class PlayerControllerBPatch
{
[HarmonyPatch("Awake")]
[HarmonyPostfix]
public static void postAwake(PlayerControllerB __instance)
{
((Component)__instance).gameObject.AddComponent<GodsOpinion>();
}
[HarmonyPatch("KillPlayerClientRpc")]
[HarmonyPostfix]
public static void postKilledPlayer(int playerId, bool spawnBody, Vector3 bodyVelocity, int causeOfDeath, int deathAnimation, Vector3 positionOffset)
{
DivineMessenger[] array = Object.FindObjectsOfType<DivineMessenger>();
foreach (DivineMessenger divineMessenger in array)
{
if ((Object)(object)StartOfRound.Instance.allPlayerScripts[playerId] == (Object)(object)divineMessenger.target && !divineMessenger.completed)
{
divineMessenger.Despawn();
}
}
}
[HarmonyPatch("SetItemInElevator")]
[HarmonyPostfix]
public static void PostSetItemInElevator(bool droppedInShipRoom, bool droppedInElevator, GrabbableObject gObject, PlayerControllerB __instance)
{
if (droppedInShipRoom && (Object)(object)((Component)gObject).gameObject.GetComponent<CollectComponent>() == (Object)null)
{
((Component)gObject).gameObject.AddComponent<CollectComponent>();
((Component)gObject).gameObject.GetComponent<CollectComponent>().Collect();
((Component)__instance).GetComponent<GodsOpinion>().ChangeBias((float)gObject.scrapValue / 100f);
}
}
[HarmonyPatch("Update")]
[HarmonyPostfix]
public static void postUpdate(PlayerControllerB __instance)
{
if ((!TheCompanyMod.BoundConfig.disableNonServerExplosions.Value || ((NetworkBehaviour)__instance).IsHost) && ((__instance.isPlayerControlled && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject)) || __instance.isTestingPlayer) && ((ButtonControl)Keyboard.current.xKey).wasPressedThisFrame)
{
TheCompanyMod.logger.LogInfo((object)"Exploding...");
explode(__instance);
if (((NetworkBehaviour)__instance).IsServer)
{
SyncExplosionClientRpc(__instance.actualClientId);
}
}
}
private static void explode(PlayerControllerB sendingPlayer)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)TheCompanyMod.poofExplosion == (Object)null) && !((Object)(object)TheCompanyMod.poofSFX == (Object)null))
{
Object.Instantiate<GameObject>(TheCompanyMod.poofExplosion, ((Component)sendingPlayer).transform.position, Quaternion.identity);
AudioSource.PlayClipAtPoint(TheCompanyMod.poofSFX, ((Component)sendingPlayer).transform.position);
}
}
[ServerRpc(RequireOwnership = false)]
public static void SyncExplosionServerRpc(ulong sendingClientId)
{
SyncExplosionClientRpc(sendingClientId);
}
[ClientRpc]
public static void SyncExplosionClientRpc(ulong sendingClientId)
{
TheCompanyMod.logger.LogInfo((object)$"received rpc for {sendingClientId}");
if (!((NetworkBehaviour)StartOfRound.Instance.allPlayerScripts[sendingClientId]).IsOwner)
{
PlayerControllerB sendingPlayer = StartOfRound.Instance.allPlayerScripts[sendingClientId];
explode(sendingPlayer);
}
}
}
internal class QuickMenuManagerPatch
{
[HarmonyPatch("OpenQuickMenu")]
[HarmonyPrefix]
public static void OpenMenu()
{
TheCompanyMod.Instance.modMenu.Visible = true;
}
[HarmonyPatch("CloseQuickMenu")]
[HarmonyPrefix]
public static void CloseMenu()
{
TheCompanyMod.Instance.modMenu.Visible = false;
}
[HarmonyPatch("LeaveGameConfirm")]
[HarmonyPrefix]
public static void CloseMenuOnLeaveGame()
{
TheCompanyMod.Instance.modMenu.Visible = false;
}
}
[HarmonyPatch(typeof(ShotgunItem))]
[StaticNetcode]
internal class ShotGunPatch
{
[HarmonyPatch("ShootGun")]
[HarmonyPostfix]
public static void PostShoot(Vector3 shotgunPosition, Vector3 shotgunForward, ShotgunItem __instance)
{
//IL_006e: 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_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: 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_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
if (((GrabbableObject)__instance).isHeld && (Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)null && (Object)(object)((GrabbableObject)__instance).playerHeldBy == (Object)(object)GameNetworkManager.Instance.localPlayerController)
{
flag = true;
}
if (((GrabbableObject)__instance).isHeldByEnemy)
{
return;
}
PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
if ((Object)(object)localPlayerController == (Object)null)
{
return;
}
Vector3 val = localPlayerController.playerCollider.ClosestPoint(shotgunPosition);
if (!flag && !Physics.Linecast(shotgunPosition, val, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1) && Vector3.Angle(shotgunForward, val - shotgunPosition) < 30f)
{
float num = Vector3.Distance(((Component)localPlayerController).transform.position, ((Component)__instance.shotgunRayPoint).transform.position);
int num2 = 0;
if (num < 5f)
{
num2 = 100;
}
if (num < 15f)
{
num2 = 100;
}
else if (num < 23f)
{
num2 = 40;
}
else if (num < 30f)
{
num2 = 20;
}
if (localPlayerController.health - num2 <= 0 && !localPlayerController.hasBegunSpectating)
{
IWasShotServerRpc(localPlayerController.actualClientId, ((GrabbableObject)__instance).playerHeldBy.actualClientId);
}
}
}
[ServerRpc(RequireOwnership = false)]
public static void IWasShotServerRpc(ulong sendingClientId, ulong whoShotMeId)
{
GodClient.CastJudgementManual(GodClient.JudgementType.Action, sendingClientId, whoShotMeId);
}
}
[HarmonyPatch(typeof(Shovel))]
internal class ShovelPatch
{
[HarmonyPatch("HitShovel")]
[HarmonyPostfix]
public static void postUpdate(bool cancel, Shovel __instance)
{
}
}
[HarmonyPatch(typeof(RoundManager))]
internal class SpawnScrapInLevelPatch
{
[HarmonyPatch("SpawnScrapInLevel")]
[HarmonyPostfix]
public static void postSpawnScrapInLevel(RoundManager __instance)
{
__instance.currentLevel.spawnableScrap.ForEach(delegate(SpawnableItemWithRarity scrap)
{
//IL_002a: 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_0032: Unknown result type (might be due to invalid IL or missing references)
if (((Object)scrap.spawnableItem).name.Equals("EasterEgg"))
{
GameObject spawnPrefab = scrap.spawnableItem.spawnPrefab;
GameObject val = Object.Instantiate<GameObject>(spawnPrefab, default(Vector3), Quaternion.identity, __instance.spawnedScrapContainer);
StunGrenadeItem component = val.GetComponent<StunGrenadeItem>();
if ((Object)(object)component != (Object)null)
{
TheCompanyMod.poofExplosion = component.stunGrenadeExplosion;
TheCompanyMod.poofSFX = component.explodeSFX;
}
Object.Destroy((Object)(object)val);
}
});
}
}
[StaticNetcode]
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("EndOfGame")]
[HarmonyPostfix]
public static void PostEndOfGame(int bodiesInsured, int connectedPlayersOnServer, int scrapCollected, StartOfRound __instance)
{
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: 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)
int num = 0;
int num2 = 0;
for (int i = 0; i < __instance.gameStats.allPlayerStats.Length; i++)
{
if (__instance.gameStats.allPlayerStats[i].isActivePlayer && __instance.gameStats.allPlayerStats[i].profitable < num2)
{
num = i;
num2 = __instance.gameStats.allPlayerStats[i].profitable;
}
}
PlayerStats val = __instance.gameStats.allPlayerStats[num];
PlayerControllerB val2 = StartOfRound.Instance.allPlayerScripts[num];
if (!(((Component)val2).GetComponent<GodsOpinion>().GetBias() >= 3f))
{
return;
}
HashSet<Item> source = (from item in Resources.FindObjectsOfTypeAll<Item>()
where Object.op_Implicit((Object)(object)item.spawnPrefab)
select item).ToHashSet();
HashSet<Item> hashSet = source.Where((Item scrap) => scrap.isScrap).ToHashSet();
foreach (Item item in hashSet)
{
if (((Object)item).name == "Zeddog")
{
GameObject val3 = Object.Instantiate<GameObject>(item.spawnPrefab, ((Component)val2).transform.position, Quaternion.identity);
int num3 = Mathf.RoundToInt(((Component)val2).GetComponent<GodsOpinion>().GetBias() * 30f);
val3.GetComponent<GrabbableObject>().SetScrapValue(num3);
val3.GetComponent<GrabbableObject>().Start();
val3.GetComponent<GrabbableObject>().isInShipRoom = true;
NetworkObject componentInChildren = val3.gameObject.GetComponentInChildren<NetworkObject>();
((Component)val2).GetComponent<GodsOpinion>().ChangeBias(((Component)val2).GetComponent<GodsOpinion>().GetBias() * 0f);
componentInChildren.Spawn(true);
UpdateRewardClientRpc(NetworkBehaviourReference.op_Implicit((NetworkBehaviour)(object)val3.GetComponent<GrabbableObject>()), num3);
}
}
}
[ClientRpc]
public static void UpdateRewardClientRpc(NetworkBehaviourReference rewardObject, int reward)
{
GrabbableObject val = default(GrabbableObject);
if (((NetworkBehaviourReference)(ref rewardObject)).TryGet<GrabbableObject>(ref val, (NetworkManager)null))
{
val.SetScrapValue(reward);
}
}
}
}
namespace TheCompany.Patches.Enemy
{
[HarmonyPatch(typeof(BaboonBirdAI))]
internal class BaboonHawkPatch
{
[HarmonyPatch("killPlayerAnimation")]
[HarmonyPostfix]
public static void OnKillPlayerAnimation(int playerObject, BaboonBirdAI __instance)
{
if ((Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(BlobAI))]
internal class BlobPatch
{
[HarmonyPatch("eatPlayerBody")]
[HarmonyPostfix]
public static void PostEatBody(BlobAI __instance)
{
if ((Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(SandSpiderAI))]
internal class BunkerSpiderPatch
{
[HarmonyPatch("turnBodyIntoWeb")]
[HarmonyPostfix]
public static void OnTurnBodyIntoWeb(SandSpiderAI __instance)
{
if ((Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(CentipedeAI))]
internal class CentipedePatch
{
[HarmonyPatch("UnclingFromPlayer")]
[HarmonyPostfix]
public static void OnUnclingFromPlayer(PlayerControllerB playerBeingKilled, bool playerDead, CentipedeAI __instance)
{
if (playerDead && (Object)(object)playerBeingKilled == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(SpringManAI))]
internal class CoilheadPatch
{
[HarmonyPatch("OnCollideWithPlayer")]
[HarmonyPrefix]
public static void OnOnCollideWithPlayer(Collider other, SpringManAI __instance)
{
PlayerControllerB val = ((EnemyAI)__instance).MeetsStandardPlayerCollisionConditions(other, false, false);
if (val.health - 90 <= 0 && (Object)(object)val == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(MouthDogAI))]
internal class EyelessDogPatch
{
[HarmonyPatch("StopKillAnimation")]
[HarmonyPostfix]
public static void OnStopKillAnimation(MouthDogAI __instance)
{
if ((Object)(object)__instance.GetFieldValue<DeadBodyInfo>("carryingBody") != (Object)null && (Object)(object)__instance.GetFieldValue<DeadBodyInfo>("carryingBody").playerScript == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(ForestGiantAI))]
internal class ForestKeeperPatch
{
[HarmonyPatch("EatPlayerAnimation")]
[HarmonyPostfix]
private static IEnumerator OnEatPlayerAnimation(PlayerControllerB playerBeingEaten, Vector3 enemyPosition, int enemyYRot, ForestGiantAI __instance)
{
//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)
yield return (object)new WaitForSeconds(4.5f);
if ((Object)(object)playerBeingEaten == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(JesterAI))]
internal class JesterPatch
{
[HarmonyPatch("killPlayerAnimation")]
[HarmonyPostfix]
private static IEnumerator OnKillPlayerAnimation(int playerId, JesterAI __instance)
{
yield return (object)new WaitForSeconds(4.5f);
if ((Object)(object)StartOfRound.Instance.allPlayerScripts[playerId] == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(MaskedPlayerEnemy))]
internal class MaskedPatch
{
[HarmonyPatch("FinishKillAnimation")]
[HarmonyPostfix]
public static void OnFinishKillAnimation(bool killedPlayer, MaskedPlayerEnemy __instance)
{
if (killedPlayer && (Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(PufferAI))]
internal class PufferPatch
{
[HarmonyPatch("stompAnimation")]
[HarmonyPostfix]
public static void OnStompAnimation(PufferAI __instance)
{
if ((Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
[HarmonyPatch(typeof(CrawlerAI))]
internal class ThumperPatch
{
[HarmonyPatch("EatPlayerBodyAnimation")]
[HarmonyPostfix]
public static void OnEatBody(CrawlerAI __instance)
{
if ((Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)((Component)__instance).GetComponent<DivineMessenger>()?.target)
{
((Component)__instance).GetComponent<DivineMessenger>()?.Complete();
}
}
}
}
namespace TheCompany.Enemy
{
[StaticNetcode]
internal class DivineMessenger : NetworkBehaviour
{
public PlayerControllerB target;
public bool completed;
public void Complete()
{
completed = true;
((MonoBehaviour)this).StartCoroutine(Explode(((Component)this).gameObject, target));
}
public void Despawn()
{
//IL_0007: 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)
explode(((Component)this).transform.position);
if (((NetworkBehaviour)this).IsServer)
{
SyncExplosionServerRpc(((Component)this).transform.position);
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
private IEnumerator Explode(GameObject entity, PlayerControllerB player)
{
if (!((Object)(object)TheCompanyMod.poofExplosion == (Object)null) && !((Object)(object)TheCompanyMod.poofSFX == (Object)null))
{
if (((Object)((Component)this).gameObject).name.Contains("MouthDog"))
{
yield return (object)new WaitForSeconds(3.02f);
}
if (((Object)((Component)this).gameObject).name.Contains("ForestGiant"))
{
yield return (object)new WaitForSeconds(5f);
}
if (((Object)((Component)this).gameObject).name.Contains("Jester"))
{
yield return (object)new WaitForSeconds(2.5f);
}
if (((Object)((Component)this).gameObject).name.Contains("Masked"))
{
yield return (object)new WaitForSeconds(2.5f);
}
explode(((Component)this).transform.position);
if (((NetworkBehaviour)this).IsServer)
{
SyncExplosionServerRpc(((Component)this).transform.position);
}
Object.Destroy((Object)(object)entity);
}
}
[ServerRpc(RequireOwnership = true)]
public static void SyncExplosionServerRpc(Vector3 pos)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
SyncExplosionClientRpc(pos);
}
[ClientRpc]
public static void SyncExplosionClientRpc(Vector3 pos)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
TheCompanyMod.logger.LogInfo((object)$"received explode rpc at {pos}");
explode(pos);
}
private static void explode(Vector3 pos)
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)TheCompanyMod.poofExplosion == (Object)null) && !((Object)(object)TheCompanyMod.poofSFX == (Object)null))
{
Object.Instantiate<GameObject>(TheCompanyMod.poofExplosion, pos, Quaternion.identity);
AudioSource.PlayClipAtPoint(TheCompanyMod.poofSFX, pos);
}
}
}
internal class EnemyUtil
{
public static void spawn(string name, Vector3 pos, PlayerControllerB target)
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = default(Vector3);
FlowermanAI val3 = default(FlowermanAI);
PufferAI val4 = default(PufferAI);
for (int i = 0; (float)i < Mathf.Floor(((Component)target).GetComponent<GodsOpinion>().GetBias() * -1f - 0.5f); i++)
{
((Vector3)(ref val))..ctor(Random.Range(-7f, 7f), 0f, Random.Range(-7f, 7f));
GameObject val2 = Object.Instantiate<GameObject>(GeneralExtensions.GetValueSafe<string, EnemyType>(GetEnemies(), name).enemyPrefab, pos + val, Quaternion.identity);
if (val2.TryGetComponent<FlowermanAI>(ref val3))
{
val3.AvoidClosestPlayer();
}
if (val2.TryGetComponent<PufferAI>(ref val4))
{
val4.ShakeTailServerRpc();
}
DivineMessenger divineMessenger = val2.AddComponent(typeof(DivineMessenger)) as DivineMessenger;
divineMessenger.target = target;
divineMessenger.completed = false;
val2.GetComponentInChildren<NetworkObject>().Spawn(true);
}
}
public static Dictionary<string, EnemyType> GetEnemies()
{
Dictionary<string, EnemyType> dictionary = new Dictionary<string, EnemyType>();
SelectableLevel[] levels = StartOfRound.Instance.levels;
foreach (SelectableLevel val in levels)
{
if (!((Object)(object)val != (Object)null))
{
continue;
}
IEnumerable<SpawnableEnemyWithRarity> enumerable = val.OutsideEnemies.Concat(val.DaytimeEnemies);
foreach (SpawnableEnemyWithRarity item in enumerable)
{
if ((Object)(object)item.enemyType != (Object)null && !dictionary.ContainsKey(item.enemyType.enemyName))
{
dictionary.Add(item.enemyType.enemyName, item.enemyType);
}
}
foreach (SpawnableEnemyWithRarity enemy in val.Enemies)
{
if ((Object)(object)enemy.enemyType != (Object)null && !dictionary.ContainsKey(enemy.enemyType.enemyName))
{
dictionary.Add(enemy.enemyType.enemyName, enemy.enemyType);
}
}
}
return dictionary;
}
}
}
namespace TheCompany.Components
{
internal class CollectComponent : NetworkBehaviour
{
private bool wasCollected;
public void Collect()
{
wasCollected = true;
}
public bool WasCollected()
{
return wasCollected;
}
}
internal class GodsOpinion : NetworkBehaviour
{
private float bias;
public void Awake()
{
bias = 0f;
}
public float GetBias()
{
return bias;
}
public void ChangeBias(float amount)
{
bias += amount;
}
}
}
namespace TheCompany.AI
{
[StaticNetcode]
internal class GodClient
{
public enum JudgementType
{
SpokenWord,
Action
}
private static readonly HttpClient client = new HttpClient();
private static Random random = new Random();
private static List<string> spokenWordPunishments = new List<string> { "[Commiter], for your blasphemy, you shall be punished with a [Punishment], a fitting end for one who dares defy a god's will.", "[Commiter], your blasphemy has brought forth the wrath of the divine. I condemn you to die by a [Punishment], a sentence befitting your arrogance.", "[Commiter], for your blasphemous words, I sentence you to a [Punishment]. Let this punishment remind all that the divine is not to be questioned.", "[Commiter], your blasphemy echoes through the realms. As a result, you shall endure a [Punishment], a fate designed to crush the pride you dared show.", "[Commiter], for your affront against divinity, you are cursed with a [Punishment]. May this punishment haunt you, as your words have desecrated the sacred." };
private static List<string> actionPunishments = new List<string> { "[Commiter], for your transgression against [Victim], I deem you worthy of retribution. You have violated the natural order with your actions, and thus, you shall face a [Punishment]. Know that your cruelty cannot go unanswered.", "In your reckless pursuit of power, [Commiter], you have wronged [Victim]. Such a vile deed cannot go unpunished. I sentence you to deal with a [Punishment], as a reminder that no soul escapes judgment.", "Your actions, [Commiter], have brought harm to [Victim], disturbing the balance of this realm. For this crime, you shall suffer from a [Punishment], for balance must be restored, and your wrongdoing cannot be ignored.", "For the betrayal of [Victim], I, as ruler of this realm, decree that [Commiter] shall endure a [Punishment]. Let this serve as a lesson that those who harm others shall be repaid tenfold in suffering.", "[Commiter], you have crossed a line that should never have been breached. Your cruelty toward [Victim] brings you to my attention. As penance, you are condemned to die by a [Punishment]. Such malice will never go unpunished under my gaze." };
private static Dictionary<string, string> outdoorEnemies = new Dictionary<string, string>
{
{ "Eyeless Dog", "MouthDog" },
{ "Forest Giant", "ForestGiant" },
{ "Earthworm", "Earth Leviatian" },
{ "Baboon Hawk", "Baboon Hawk" },
{ "Old Bird", "RadMech" }
};
private static Dictionary<string, string> indoorEnemies = new Dictionary<string, string>
{
{ "Bracken", "Flowerman" },
{ "Jester", "Jester" },
{ "Nutcracker", "Nutcracker" },
{ "Coilhead", "Spring" },
{ "Bunker Spider", "Bunker Spider" },
{ "Thumper", "Crawler" },
{ "Mimic", "Masked" },
{ "Maneater", "Maneater" },
{ "Butler", "Butler" },
{ "Snare Flea", "Centipede" },
{ "Spore Lizard", "Puffer" }
};
public static void CastJudgementManual(JudgementType type, ulong victimId, ulong commiterId)
{
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
if (TheCompanyMod.BoundConfig.enableGod.Value && ((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsOwner && GameNetworkManager.Instance.localPlayerController.playerClientId == 0)
{
string text = "";
switch (type)
{
case JudgementType.SpokenWord:
text = spokenWordPunishments[random.Next(spokenWordPunishments.Count)];
break;
case JudgementType.Action:
text = actionPunishments[random.Next(actionPunishments.Count)];
break;
}
PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[commiterId];
if (type == JudgementType.Action)
{
((Component)val).gameObject.GetComponent<GodsOpinion>().ChangeBias(-1.5f);
}
text = text.Replace("[Commiter]", val.playerUsername);
text = text.Replace("[Victim]", StartOfRound.Instance.allPlayerScripts[victimId].playerUsername);
string punishment = getPunishment(val.isInsideFactory);
text = text.Replace("[Punishment]", punishment);
if (val.isInsideFactory)
{
EnemyUtil.spawn(GeneralExtensions.GetValueSafe<string, string>(indoorEnemies, punishment), ((Component)val).transform.position, val);
}
else
{
EnemyUtil.spawn(GeneralExtensions.GetValueSafe<string, string>(outdoorEnemies, punishment), ((Component)val).transform.position, val);
}
SendTipServerRpc(text, ((Component)StartOfRound.Instance.allPlayerScripts[commiterId]).transform.position);
}
}
private static string getPunishment(bool inside)
{
if (inside)
{
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(indoorEnemies);
int index = random.Next(list.Count);
return list[index].Key;
}
List<KeyValuePair<string, string>> list2 = new List<KeyValuePair<string, string>>(outdoorEnemies);
int index2 = random.Next(list2.Count);
return list2[index2].Key;
}
[ServerRpc(RequireOwnership = true)]
public static void SendTipServerRpc(string tip, Vector3 pos)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
List<ulong> list = new List<ulong>();
PlayerControllerB[] array = Object.FindObjectsByType<PlayerControllerB>((FindObjectsSortMode)0);
foreach (PlayerControllerB val in array)
{
float num = Vector3.Distance(((Component)val).transform.position, pos);
if (num <= 50f)
{
TheCompanyMod.logger.LogInfo((object)$"Found PlayerController {((Object)((Component)val).gameObject).name} within {num} units.");
list.Add(val.actualClientId);
}
}
SendTipClientRpc(tip, pos, list);
}
[ClientRpc]
public static void SendTipClientRpc(string tip, Vector3 pos, List<ulong> clientIds)
{
if (clientIds.Contains(GameNetworkManager.Instance.localPlayerController.actualClientId))
{
HUDManager.Instance.DisplayTip("Divine Guidence", tip, true, false, "LC_Tip1");
}
}
}
}