using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using FishNet.Connection;
using FishNet.Object;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HowToFishDevToolsConsole")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HowToFishDevToolsConsole")]
[assembly: AssemblyTitle("HowToFishDevToolsConsole")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace HowToFishConsole
{
public static class BanList
{
private static readonly HashSet<ulong> banned = new HashSet<ulong>();
private static string FilePath => Path.Combine(Paths.ConfigPath, "howtofish_console_bans.txt");
public static void Load()
{
try
{
if (!File.Exists(FilePath))
{
return;
}
banned.Clear();
string[] array = File.ReadAllLines(FilePath);
foreach (string text in array)
{
if (ulong.TryParse(text.Trim(), out var result))
{
banned.Add(result);
}
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)("Could not load ban list: " + ex.Message));
}
}
public static bool IsBanned(ulong steamId)
{
return banned.Contains(steamId);
}
public static void Add(ulong steamId)
{
if (banned.Add(steamId))
{
Save();
}
}
public static void Remove(ulong steamId)
{
if (banned.Remove(steamId))
{
Save();
}
}
private static void Save()
{
try
{
File.WriteAllLines(FilePath, banned.Select((ulong id) => id.ToString()));
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)("Could not save ban list: " + ex.Message));
}
}
}
public class HelpCommand : IConsoleCommand
{
public string Name => "help";
public string Usage => "help / cmds";
public string Description => "Lists all available commands.";
public void Execute(string[] args, ConsoleUI console)
{
console.Log("Available commands:");
foreach (IConsoleCommand item in CommandProcessor.AllCommands.OrderBy((IConsoleCommand c) => c.Name))
{
console.Log(" <color=#4fd6c4>" + item.Usage + "</color> - " + item.Description);
}
}
}
public class ClearCommand : IConsoleCommand
{
public string Name => "clear";
public string Usage => "clear";
public string Description => "Clears the console log.";
public void Execute(string[] args, ConsoleUI console)
{
console.ClearLog();
}
}
public class PluginsCommand : IConsoleCommand
{
public string Name => "plugins";
public string Usage => "plugins [filter]";
public string Description => "Lists loaded BepInEx plugins, optionally filtered by name/GUID.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Plugins_Enabled.Value)
{
console.LogError("'plugins' is disabled in config.");
return;
}
string filter = ((args.Length != 0) ? string.Join(" ", args) : null);
List<PluginInfo> list = (from p in Chainloader.PluginInfos.Values
where string.IsNullOrEmpty(filter) || p.Metadata.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0 || p.Metadata.GUID.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0
orderby p.Metadata.Name
select p).ToList();
if (list.Count == 0)
{
console.Log("No plugins matched.");
return;
}
console.Log($"Loaded plugins ({list.Count}):");
foreach (PluginInfo item in list)
{
console.Log($" <color=#4fd6c4>{item.Metadata.Name}</color> v{item.Metadata.Version} ({item.Metadata.GUID})");
}
}
}
public class GodCommand : IConsoleCommand
{
public string Name => "god";
public string Usage => "god";
public string Description => "Toggles god mode. Global effect (PlayerManager.InGodMode gates all damage).";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_God_Enabled.Value)
{
console.LogError("'god' is disabled in config.");
return;
}
PlayerManager.ToggleGodMode();
console.LogSuccess("God mode is now " + (PlayerManager.InGodMode ? "ON" : "OFF") + " (affects all players).");
}
}
public class FlyCommand : IConsoleCommand
{
public string Name => "fly";
public string Usage => "fly [target]";
public string Description => "Toggles hover/fly (gravity off, still collides). Own client only.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Fly_Enabled.Value)
{
console.LogError("'fly' is disabled in config.");
return;
}
Player val = PlayerFinder.Resolve((args.Length != 0) ? args[0] : null, console);
if (!((Object)(object)val == (Object)null))
{
FreeMoveMode freeMoveMode = FreeMovementPatch.Toggle(val, FreeMoveMode.Fly);
console.LogSuccess("Fly " + ((freeMoveMode == FreeMoveMode.Fly) ? "enabled" : "disabled") + " for " + val.SteamName + ".");
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - movement is client-authoritative, this likely won't be visible for them.");
}
}
}
}
public class NoclipCommand : IConsoleCommand
{
public string Name => "noclip";
public string Usage => "noclip [target]";
public string Description => "Toggles noclip (gravity + collision off). Own client only.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Noclip_Enabled.Value)
{
console.LogError("'noclip' is disabled in config.");
return;
}
Player val = PlayerFinder.Resolve((args.Length != 0) ? args[0] : null, console);
if (!((Object)(object)val == (Object)null))
{
FreeMoveMode freeMoveMode = FreeMovementPatch.Toggle(val, FreeMoveMode.Noclip);
console.LogSuccess("Noclip " + ((freeMoveMode == FreeMoveMode.Noclip) ? "enabled" : "disabled") + " for " + val.SteamName + ".");
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - movement is client-authoritative, this likely won't be visible for them.");
}
}
}
}
public class WalkSpeedCommand : IConsoleCommand
{
public string Name => "walkspeed";
public string Usage => "walkspeed [value] [target]";
public string Description => "Sets base walk speed (sprint scales proportionally). No value = reset to config default.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_WalkSpeed_Enabled.Value)
{
console.LogError("'walkspeed' is disabled in config.");
return;
}
float num = ModConfig.WalkSpeed_Default.Value;
int num2 = 0;
if (args.Length != 0 && float.TryParse(args[0], out var result))
{
num = result;
num2 = 1;
}
Player val = PlayerFinder.Resolve((args.Length > num2) ? args[num2] : null, console);
if (!((Object)(object)val == (Object)null))
{
PlayerMovement movement = val.Movement;
ReflectionUtil.TryGetField<float>(movement, "_walkSpeed", out var value);
ReflectionUtil.TryGetField<float>(movement, "_sprintSpeed", out var value2);
float num3 = ((value > 0.001f) ? (value2 / value) : 1.5f);
bool flag = ReflectionUtil.TrySetField(movement, "_walkSpeed", num);
ReflectionUtil.TrySetField(movement, "_sprintSpeed", num * num3);
if (flag)
{
console.LogSuccess($"Walk speed for {val.SteamName} set to {num} (sprint scaled to {num * num3:0.##}).");
}
else
{
console.LogError("Could not reach PlayerMovement._walkSpeed.");
}
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - this only affects that player's own client.");
}
}
}
}
public class JumpPowerCommand : IConsoleCommand
{
public string Name => "jumppower";
public string Usage => "jumppower [value] [target]";
public string Description => "Sets jump force. No value = reset to config default.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_JumpPower_Enabled.Value)
{
console.LogError("'jumppower' is disabled in config.");
return;
}
float num = ModConfig.JumpPower_Default.Value;
int num2 = 0;
if (args.Length != 0 && float.TryParse(args[0], out var result))
{
num = result;
num2 = 1;
}
Player val = PlayerFinder.Resolve((args.Length > num2) ? args[num2] : null, console);
if (!((Object)(object)val == (Object)null))
{
if (ReflectionUtil.TrySetField(val.Movement, "_jumpForce", num))
{
console.LogSuccess($"Jump power for {val.SteamName} set to {num}.");
}
else
{
console.LogError("Could not reach PlayerMovement._jumpForce.");
}
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - this only affects that player's own client.");
}
}
}
}
public class InfJumpCommand : IConsoleCommand
{
public string Name => "infjump";
public string Usage => "infjump <on/off> [target]";
public string Description => "Enables/disables infinite jumping (bypasses grounded/coyote-time checks).";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_InfJump_Enabled.Value)
{
console.LogError("'infjump' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
bool flag = args[0] == "on";
Player val = PlayerFinder.Resolve((args.Length > 1) ? args[1] : null, console);
if (!((Object)(object)val == (Object)null))
{
InfiniteJumpPatch.SetEnabled(val, flag);
console.LogSuccess("Infinite jump " + (flag ? "enabled" : "disabled") + " for " + val.SteamName + ".");
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - jump input only fires on that player's own client.");
}
}
}
}
public class GiveCommand : IConsoleCommand
{
public string Name => "give";
public string Usage => "give <itemname> [target]";
public string Description => "Spawns an item by (partial) prefab name and gives it to target. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
if (!ModConfig.Cmd_Give_Enabled.Value)
{
console.LogError("'give' is disabled in config.");
return;
}
if (args.Length < 1)
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to spawn items.");
return;
}
if (!Object.op_Implicit((Object)(object)ItemManager.Instance))
{
console.LogError("ItemManager isn't ready yet.");
return;
}
Player val = PlayerFinder.Resolve((args.Length > 1) ? args[1] : null, console);
if (!((Object)(object)val == (Object)null))
{
Item val2 = FindItemPrefab(args[0]);
if ((Object)(object)val2 == (Object)null)
{
console.LogError("No loaded item prefab matches '" + args[0] + "'.");
return;
}
Vector3 val3 = val.Transform.position + val.CamObject.forward * 1.5f + Vector3.up;
Item val4 = ItemManager.Instance.SpawnNewItem(val2, val3, Quaternion.identity);
val4.SetSyncedHolder(val, true);
console.LogSuccess("Gave '" + ((Object)((Component)val2).gameObject).name + "' to " + val.SteamName + ".");
}
}
private static Item FindItemPrefab(string search)
{
//IL_0017: 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)
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val in array)
{
Scene scene = ((Component)val).gameObject.scene;
if (!((Scene)(ref scene)).IsValid() && ((Object)((Component)val).gameObject).name.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
{
return val;
}
}
return null;
}
}
public class HungryCommand : IConsoleCommand
{
public string Name => "hungry";
public string Usage => "hungry <on/off> [target]";
public string Description => "Enables/disables hunger drain and starvation damage. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Hungry_Enabled.Value)
{
console.LogError("'hungry' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change hunger.");
return;
}
bool flag = args[0] == "on";
Player val = PlayerFinder.Resolve((args.Length > 1) ? args[1] : null, console);
if (!((Object)(object)val == (Object)null))
{
HungerPatch.SetHungerEnabled(val.Vitals, flag);
if (!flag)
{
val.Vitals._syncedFullness.Value = 100;
}
console.LogSuccess("Hunger turned " + (flag ? "ON" : "OFF") + " for " + val.SteamName + ".");
}
}
}
public class AddMoneyCommand : IConsoleCommand
{
public string Name => "addmoney";
public string Usage => "addmoney [amount] [target]";
public string Description => "Adds money to the shared server economy. No amount = config default.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_AddMoney_Enabled.Value)
{
console.LogError("'addmoney' is disabled in config.");
return;
}
int num = ModConfig.AddMoney_DefaultAmount.Value;
int num2 = 0;
if (args.Length != 0 && int.TryParse(args[0], out var result))
{
num = result;
num2 = 1;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to add money.");
return;
}
Player val = PlayerFinder.Resolve((args.Length > num2) ? args[num2] : null, console) ?? Player.LocalPlayer;
if ((Object)(object)val == (Object)null)
{
console.LogError("No valid player found.");
return;
}
MoneyManager.AddMoney(num, val);
console.LogSuccess($"Added {num} money. Total is now {MoneyManager.Money}.");
}
}
public class KillCommand : IConsoleCommand
{
public string Name => "kill";
public string Usage => "kill [target]";
public string Description => "Instantly kills the target. Requires host/server; blocked by active god mode.";
public void Execute(string[] args, ConsoleUI console)
{
//IL_009b: 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)
if (!ModConfig.Cmd_Kill_Enabled.Value)
{
console.LogError("'kill' is disabled in config.");
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to kill players.");
return;
}
Player val = PlayerFinder.Resolve((args.Length != 0) ? args[0] : null, console);
if (!((Object)(object)val == (Object)null))
{
if (PlayerManager.InGodMode)
{
console.LogWarning("God mode is currently ON, so damage (and this kill) will be ignored.");
}
val.Vitals.TakeDamage(9999, val.Transform.position, Vector3.zero, true);
console.LogSuccess("Killed " + val.SteamName + ".");
}
}
}
public class SizeCommand : IConsoleCommand
{
public string Name => "size";
public string Usage => "size <scale> [target] OR size <x> <y> <z> [target]";
public string Description => "Scales a player's transform (visual only - not guaranteed to sync to other clients).";
public void Execute(string[] args, ConsoleUI console)
{
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
if (!ModConfig.Cmd_Size_Enabled.Value)
{
console.LogError("'size' is disabled in config.");
return;
}
float result;
float[] array = args.TakeWhile((string a) => float.TryParse(a, out result)).Select(float.Parse).ToArray();
string[] array2 = args.Skip(array.Length).ToArray();
Vector3 val = default(Vector3);
if (array.Length == 1)
{
val = Vector3.one * array[0];
}
else
{
if (array.Length != 3)
{
console.LogError("Usage: " + Usage);
return;
}
((Vector3)(ref val))..ctor(array[0], array[1], array[2]);
}
float value = ModConfig.Size_MinScale.Value;
float value2 = ModConfig.Size_MaxScale.Value;
((Vector3)(ref val))..ctor(Mathf.Clamp(val.x, value, value2), Mathf.Clamp(val.y, value, value2), Mathf.Clamp(val.z, value, value2));
Player val2 = PlayerFinder.Resolve((array2.Length != 0) ? array2[0] : null, console);
if (!((Object)(object)val2 == (Object)null))
{
val2.Transform.localScale = val;
console.LogSuccess($"Set {val2.SteamName}'s scale to {val.x:0.##}, {val.y:0.##}, {val.z:0.##}.");
console.LogWarning("Scale is applied locally - it may not be visible on other clients unless the game networks Transform scale.");
}
}
}
public class GamePauseCommand : IConsoleCommand
{
public string Name => "game_pause";
public string Usage => "game_pause";
public string Description => "Toggles the game's pause state.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_GamePause_Enabled.Value)
{
console.LogError("'game_pause' is disabled in config.");
return;
}
PauseManager.TogglePause(!PauseManager.IsPaused);
console.LogSuccess("Game is now " + (PauseManager.IsPaused ? "PAUSED" : "UNPAUSED") + ".");
}
}
public class GameDifficultyCommand : IConsoleCommand
{
public string Name => "game_difficulty";
public string Usage => "game_difficulty [easy/default/hard]";
public string Description => "Gets or sets server difficulty. Requires host/server to change.";
public void Execute(string[] args, ConsoleUI console)
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
if (!ModConfig.Cmd_GameDifficulty_Enabled.Value)
{
console.LogError("'game_difficulty' is disabled in config.");
return;
}
if (args.Length == 0)
{
console.Log($"Current difficulty: {ServerSettings.Difficulty} " + $"(health x{ServerSettings.HealthMultiplier:0.##}, damage x{ServerSettings.DamageMultiplier:0.##})");
return;
}
if (!Enum.TryParse<Difficulty>(args[0], ignoreCase: true, out Difficulty result))
{
console.LogError("Unknown difficulty '" + args[0] + "'. Try: easy, default, hard.");
return;
}
if (!Object.op_Implicit((Object)(object)ServerSettings.Instance) || !((NetworkBehaviour)ServerSettings.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change difficulty.");
return;
}
ServerSettings.Instance.SetDifficulty(result);
console.LogSuccess($"Difficulty set to {result}.");
}
}
public class OneHitCommand : IConsoleCommand
{
public string Name => "onehit";
public string Usage => "onehit <on/off>";
public string Description => "Enables/disables one-hit-kill damage for all players. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_OneHit_Enabled.Value)
{
console.LogError("'onehit' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)ServerSettings.Instance) || !((NetworkBehaviour)ServerSettings.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change one-hit-kill.");
return;
}
bool flag = args[0] == "on";
ServerSettings.Instance._useOneShot.Value = flag;
console.LogSuccess("One-hit-kill turned " + (flag ? "ON" : "OFF") + ".");
}
}
public class DamageMultiplierCommand : IConsoleCommand
{
public string Name => "dmg";
public string Usage => "dmg <1-99>";
public string Description => "Sets the global damage multiplier (x1-x99). Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Dmg_Enabled.Value)
{
console.LogError("'dmg' is disabled in config.");
return;
}
if (args.Length < 1 || !float.TryParse(args[0], out var result))
{
console.LogError("Usage: " + Usage);
return;
}
result = Mathf.Clamp(result, 1f, 99f);
if (!Object.op_Implicit((Object)(object)ServerSettings.Instance) || !((NetworkBehaviour)ServerSettings.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change the damage multiplier.");
}
else if (ReflectionUtil.TrySetStaticProperty(typeof(ServerSettings), "DamageMultiplier", result))
{
console.LogSuccess($"Damage multiplier set to x{result:0.##}.");
console.LogWarning("Running 'game_difficulty' afterwards will reset this back to the difficulty preset.");
}
else
{
console.LogError("Could not reach ServerSettings.DamageMultiplier.");
}
}
}
public class FriendlyFireCommand : IConsoleCommand
{
public string Name => "ff";
public string Usage => "ff <on/off>";
public string Description => "Enables/disables friendly fire between players. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_FF_Enabled.Value)
{
console.LogError("'ff' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)ServerSettings.Instance) || !((NetworkBehaviour)ServerSettings.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change friendly fire.");
return;
}
bool flag = args[0] == "on";
ServerSettings.Instance._useFriendlyFire.Value = flag;
console.LogSuccess("Friendly fire turned " + (flag ? "ON" : "OFF") + ".");
}
}
public class ThirdPersonCommand : IConsoleCommand
{
public string Name => "thirdperson";
public string Usage => "thirdperson <on/off> [target]";
public string Description => "Toggles third-person camera (offset + wall clipping via raycast).";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_ThirdPerson_Enabled.Value)
{
console.LogError("'thirdperson' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
bool flag = args[0] == "on";
Player val = PlayerFinder.Resolve((args.Length > 1) ? args[1] : null, console);
if (!((Object)(object)val == (Object)null))
{
ThirdPersonPatch.SetEnabled(val, flag);
console.LogSuccess("Third person " + (flag ? "enabled" : "disabled") + " for " + val.SteamName + ".");
if (((NetworkBehaviour)val).Owner == (NetworkConnection)null || !((NetworkBehaviour)val).Owner.IsLocalClient)
{
console.LogWarning("Target isn't your local player - camera position only affects that player's own client.");
}
else
{
console.LogWarning("Aiming/interaction rays likely still originate from the camera - expect ADS and item pickup to feel off in third person.");
}
}
}
}
public class GotoCommand : IConsoleCommand
{
public string Name => "goto";
public string Usage => "goto <player>";
public string Description => "Teleports your local player to the target player.";
public void Execute(string[] args, ConsoleUI console)
{
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
if (!ModConfig.Cmd_Goto_Enabled.Value)
{
console.LogError("'goto' is disabled in config.");
return;
}
if (args.Length < 1)
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Player.LocalPlayer))
{
console.LogError("Local player not found.");
return;
}
Player val = PlayerFinder.Resolve(args[0], console);
if (!((Object)(object)val == (Object)null))
{
if ((Object)(object)val == (Object)(object)Player.LocalPlayer)
{
console.LogError("You're already there.");
return;
}
float num = (Object.op_Implicit((Object)(object)val.CamObject) ? val.CamObject.eulerAngles.y : 0f);
Player.LocalPlayer.LocalTeleport(val.Transform.position, num, true);
console.LogSuccess("Teleported to " + val.SteamName + ".");
}
}
}
public class BringCommand : IConsoleCommand
{
public string Name => "bring";
public string Usage => "bring <player>";
public string Description => "Teleports the target player to your local player. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
//IL_0102: 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)
if (!ModConfig.Cmd_Bring_Enabled.Value)
{
console.LogError("'bring' is disabled in config.");
return;
}
if (args.Length < 1)
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to bring players.");
return;
}
if (!Object.op_Implicit((Object)(object)Player.LocalPlayer))
{
console.LogError("Local player not found.");
return;
}
Player val = PlayerFinder.Resolve(args[0], console);
if (!((Object)(object)val == (Object)null))
{
if ((Object)(object)val == (Object)(object)Player.LocalPlayer)
{
console.LogError("That's you.");
return;
}
float num = (Object.op_Implicit((Object)(object)Player.LocalPlayer.CamObject) ? Player.LocalPlayer.CamObject.eulerAngles.y : 0f);
val.RPCTeleport(((NetworkBehaviour)val).Owner, Player.LocalPlayer.Transform.position, num);
console.LogSuccess("Brought " + val.SteamName + " to you.");
}
}
}
public class KickCommand : IConsoleCommand
{
public string Name => "kick";
public string Usage => "kick <player>";
public string Description => "Disconnects the target player from the server. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Kick_Enabled.Value)
{
console.LogError("'kick' is disabled in config.");
return;
}
if (args.Length < 1)
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to kick players.");
return;
}
Player val = PlayerFinder.Resolve(args[0], console);
if (!((Object)(object)val == (Object)null))
{
if ((Object)(object)val == (Object)(object)Player.LocalPlayer)
{
console.LogError("You can't kick yourself.");
return;
}
string steamName = val.SteamName;
((NetworkBehaviour)val).Owner.Disconnect(true);
console.LogSuccess("Kicked " + steamName + ".");
}
}
}
public class BanCommand : IConsoleCommand
{
public string Name => "ban";
public string Usage => "ban <player>";
public string Description => "Bans and kicks the target player by SteamID. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Ban_Enabled.Value)
{
console.LogError("'ban' is disabled in config.");
return;
}
if (args.Length < 1)
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to ban players.");
return;
}
Player val = PlayerFinder.Resolve(args[0], console);
if (!((Object)(object)val == (Object)null))
{
if ((Object)(object)val == (Object)(object)Player.LocalPlayer)
{
console.LogError("You can't ban yourself.");
return;
}
string steamName = val.SteamName;
ulong steamID = val.SteamID;
BanList.Add(steamID);
((NetworkBehaviour)val).Owner.Disconnect(true);
console.LogSuccess($"Banned and kicked {steamName} ({steamID}).");
console.LogWarning("This only stores the SteamID - auto-kick on rejoin requires patching Server.cs's connection logic.");
}
}
}
public class FreeBuyCommand : IConsoleCommand
{
public string Name => "freebuy";
public string Usage => "freebuy <on/off>";
public string Description => "Toggles free purchases - all shop items cost nothing while enabled. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_FreeBuy_Enabled.Value)
{
console.LogError("'freebuy' is disabled in config.");
}
else if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
}
else if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change free buy.");
}
else
{
console.LogSuccess("Free buy turned " + ((FreeBuyPatch.Enabled = args[0] == "on") ? "ON" : "OFF") + ".");
}
}
}
public class AddSlotCommand : IConsoleCommand
{
private static readonly FieldInfo startingSlotsField = AccessTools.Field(typeof(PlayerInventory), "_startingSlots");
public string Name => "addslot";
public string Usage => "addslot <target> <amount>";
public string Description => "Adds (or removes, with a negative amount) inventory slots for target, capped at the configured total. Requires host/server.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_AddSlot_Enabled.Value)
{
console.LogError("'addslot' is disabled in config.");
return;
}
if (args.Length < 2 || !int.TryParse(args[1], out var result))
{
console.LogError("Usage: " + Usage);
return;
}
if (!Object.op_Implicit((Object)(object)Server.Instance) || !((NetworkBehaviour)Server.Instance).IsServerInitialized)
{
console.LogError("You must be the host/server to change inventory slots.");
return;
}
Player val = PlayerFinder.Resolve(args[0], console);
if ((Object)(object)val == (Object)null)
{
return;
}
PlayerInventory component = ((Component)val).GetComponent<PlayerInventory>();
if (!Object.op_Implicit((Object)(object)component))
{
console.LogError("Target has no PlayerInventory component.");
return;
}
int num = 3;
if (startingSlotsField != null && startingSlotsField.GetValue(component) is int num2)
{
num = num2;
}
int value = ModConfig.AddSlot_MaxTotalSlots.Value;
int num3 = Mathf.Max(0, value - num);
int value2 = component._extraSlots.Value;
int num4 = Mathf.Clamp(value2 + result, 0, num3);
if (num4 == value2)
{
console.LogWarning($"{val.SteamName} is already at the slot cap ({num + num3} total).");
return;
}
component._extraSlots.Value = (byte)num4;
console.LogSuccess($"{val.SteamName} now has {num + num4} total slots ({num4} extra).");
console.LogWarning("The inventory UI has a fixed number of slot objects in the scene - slots beyond what's configured there may not render even though they're unlocked server-side.");
}
}
public class RcsCommand : IConsoleCommand
{
public string Name => "rcs";
public string Usage => "rcs <on/off>";
public string Description => "Toggles Random Creature Size - newly spawned fish get a randomized scale.";
public void Execute(string[] args, ConsoleUI console)
{
if (!ModConfig.Cmd_Rcs_Enabled.Value)
{
console.LogError("'rcs' is disabled in config.");
return;
}
if (args.Length < 1 || (args[0] != "on" && args[0] != "off"))
{
console.LogError("Usage: " + Usage);
return;
}
console.LogSuccess("Random Creature Size turned " + ((RandomCreatureSizePatch.Enabled = args[0] == "on") ? "ON" : "OFF") + ".");
console.LogWarning("Only affects creatures spawned after this is toggled, and the scale is rolled independently per client (visual only, not networked).");
}
}
public interface IConsoleCommand
{
string Name { get; }
string Usage { get; }
string Description { get; }
void Execute(string[] args, ConsoleUI console);
}
public static class CommandProcessor
{
private static readonly Dictionary<string, IConsoleCommand> commands = new Dictionary<string, IConsoleCommand>(StringComparer.OrdinalIgnoreCase);
public static IEnumerable<IConsoleCommand> AllCommands => commands.Values.Distinct();
public static void Register(IConsoleCommand command)
{
commands[command.Name] = command;
}
public static void RegisterAlias(string alias, string existingName)
{
if (commands.TryGetValue(existingName, out var value))
{
commands[alias] = value;
}
}
public static void RegisterDefaultCommands()
{
Register(new HelpCommand());
RegisterAlias("cmds", "help");
Register(new ClearCommand());
Register(new PluginsCommand());
Register(new GodCommand());
Register(new FlyCommand());
Register(new NoclipCommand());
Register(new WalkSpeedCommand());
Register(new JumpPowerCommand());
Register(new InfJumpCommand());
Register(new GiveCommand());
Register(new HungryCommand());
Register(new AddMoneyCommand());
Register(new KillCommand());
Register(new SizeCommand());
Register(new GamePauseCommand());
Register(new GameDifficultyCommand());
Register(new OneHitCommand());
Register(new DamageMultiplierCommand());
Register(new FriendlyFireCommand());
Register(new ThirdPersonCommand());
Register(new GotoCommand());
Register(new BringCommand());
Register(new KickCommand());
Register(new BanCommand());
Register(new FreeBuyCommand());
Register(new AddSlotCommand());
Register(new RcsCommand());
}
public static void Execute(string line, ConsoleUI console)
{
string[] array = Tokenize(line);
if (array.Length == 0)
{
return;
}
string text = array[0];
string[] args = array.Skip(1).ToArray();
if (!commands.TryGetValue(text, out var value))
{
console.LogError("Unknown command '" + text + "'. Type 'help' for a list.");
return;
}
try
{
value.Execute(args, console);
}
catch (Exception ex)
{
console.LogError("'" + text + "' threw an exception: " + ex.Message);
Plugin.Log.LogError((object)ex);
}
}
private static string[] Tokenize(string line)
{
List<string> list = new List<string>();
bool flag = false;
StringBuilder stringBuilder = new StringBuilder();
foreach (char c in line)
{
if (c == '"')
{
flag = !flag;
}
else if (char.IsWhiteSpace(c) && !flag)
{
if (stringBuilder.Length > 0)
{
list.Add(stringBuilder.ToString());
stringBuilder.Clear();
}
}
else
{
stringBuilder.Append(c);
}
}
if (stringBuilder.Length > 0)
{
list.Add(stringBuilder.ToString());
}
return list.ToArray();
}
}
public static class PlayerFinder
{
public static Player Resolve(string token, ConsoleUI console)
{
if (string.IsNullOrWhiteSpace(token))
{
if (!Object.op_Implicit((Object)(object)Player.LocalPlayer))
{
console.LogError("Local player not found (not spawned yet?).");
}
return Player.LocalPlayer;
}
if (ulong.TryParse(token, out var steamId))
{
Player val = ((IEnumerable<Player>)PlayerManager.Players).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && p.SteamID == steamId));
if (Object.op_Implicit((Object)(object)val))
{
return val;
}
}
Player val2 = ((IEnumerable<Player>)PlayerManager.Players).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && string.Equals(p.SteamName, token, StringComparison.OrdinalIgnoreCase)));
if (Object.op_Implicit((Object)(object)val2))
{
return val2;
}
Player val3 = ((IEnumerable<Player>)PlayerManager.Players).FirstOrDefault((Func<Player, bool>)((Player p) => Object.op_Implicit((Object)(object)p) && p.SteamName != null && p.SteamName.IndexOf(token, StringComparison.OrdinalIgnoreCase) >= 0));
if (Object.op_Implicit((Object)(object)val3))
{
return val3;
}
console.LogError("No player found matching '" + token + "'.");
return null;
}
}
public static class ReflectionUtil
{
private static readonly Dictionary<(Type, string), FieldInfo> fieldCache = new Dictionary<(Type, string), FieldInfo>();
private static FieldInfo GetField(Type type, string name)
{
(Type, string) key = (type, name);
if (fieldCache.TryGetValue(key, out var value))
{
return value;
}
FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
fieldCache[key] = field;
return field;
}
public static bool TrySetField<T>(object target, string fieldName, T value)
{
if (target == null)
{
return false;
}
FieldInfo field = GetField(target.GetType(), fieldName);
if (field == null)
{
return false;
}
field.SetValue(target, value);
return true;
}
public static bool TryGetField<T>(object target, string fieldName, out T value)
{
value = default(T);
if (target == null)
{
return false;
}
FieldInfo field = GetField(target.GetType(), fieldName);
if (field == null)
{
return false;
}
if (!(field.GetValue(target) is T val) || 1 == 0)
{
return false;
}
value = val;
return true;
}
public static bool TrySetStaticProperty<T>(Type type, string propertyName, T value)
{
PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (property == null || !property.CanWrite)
{
return false;
}
property.SetValue(null, value);
return true;
}
}
public class ConsoleUI : IDisposable
{
private class LogBridge : ILogListener, IDisposable
{
private readonly Action<LogLevel, string> callback;
public LogBridge(Action<LogLevel, string> callback)
{
this.callback = callback;
}
public void LogEvent(object sender, LogEventArgs eventArgs)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
callback(eventArgs.Level, ((object)eventArgs).ToString());
}
public void Dispose()
{
}
}
private GameObject canvasObject;
private GameObject windowObject;
private RectTransform windowRect;
private ScrollRect scrollRect;
private Text logText;
private RectTransform logContentRect;
private RectTransform logViewportRect;
private InputField commandInput;
private InputField searchInput;
private GameObject searchRow;
private InputField copyField;
private Font font;
private readonly List<string> rawLines = new List<string>();
private readonly List<string> plainLines = new List<string>();
private readonly List<string> history = new List<string>();
private int historyIndex = -1;
private LogBridge logBridge;
private readonly ConcurrentQueue<(DateTime time, string message, Color color)> pendingLogs = new ConcurrentQueue<(DateTime, string, Color)>();
private CursorLockMode prevLockState;
private bool prevCursorVisible;
private bool loadedInitialLogFile;
private int framesUntilInputClear;
private readonly Color windowColor = new Color(0.04f, 0.04f, 0.05f, 0.96f);
private readonly Color headerColor = new Color(0.07f, 0.07f, 0.09f, 1f);
private readonly Color inputBgColor = new Color(0.09f, 0.09f, 0.11f, 1f);
private readonly Color accentColor = new Color(0.3f, 0.85f, 0.78f, 1f);
private readonly Color accentColorSoft = new Color(0.3f, 0.85f, 0.78f, 0.35f);
private readonly Color textColor = new Color(0.85f, 0.86f, 0.9f, 1f);
private static readonly Regex LogLevelRegex = new Regex("^\\[(\\w+)\\s*:", RegexOptions.Compiled);
private static readonly Regex TagStripRegex = new Regex("<[^>]+>", RegexOptions.Compiled);
public bool Visible => (Object)(object)windowObject != (Object)null && windowObject.activeSelf;
public ConsoleUI()
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
font = Resources.GetBuiltinResource<Font>("Arial.ttf");
CreateCanvas();
CreateWindow();
windowObject.SetActive(false);
logBridge = new LogBridge(delegate(LogLevel level, string message)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
EnqueueBepInExLog(level, message);
});
Logger.Listeners.Add((ILogListener)(object)logBridge);
Log("Console UI initialized.");
}
public void Dispose()
{
if (logBridge != null)
{
Logger.Listeners.Remove((ILogListener)(object)logBridge);
}
}
public void Tick()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
(DateTime, string, Color) result;
while (pendingLogs.TryDequeue(out result))
{
AppendLineInternal(result.Item2, result.Item3, result.Item1);
flag = true;
}
if (flag)
{
RefreshLogText();
}
if (framesUntilInputClear > 0)
{
framesUntilInputClear--;
if (framesUntilInputClear == 0 && (Object)(object)commandInput != (Object)null)
{
commandInput.text = string.Empty;
}
}
}
public void Log(string message)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
AppendLine(message, textColor);
}
public void LogSuccess(string message)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
AppendLine(message, new Color(0.45f, 0.9f, 0.55f));
}
public void LogWarning(string message)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
AppendLine(message, new Color(0.55f, 0.9f, 0.5f));
}
public void LogError(string message)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
AppendLine(message, new Color(1f, 0.4f, 0.4f));
}
public void ClearLog()
{
rawLines.Clear();
plainLines.Clear();
RefreshLogText();
}
public void Toggle()
{
if (Visible)
{
Close();
}
else
{
Open();
}
}
public void Open()
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
windowObject.SetActive(true);
prevLockState = Cursor.lockState;
prevCursorVisible = Cursor.visible;
Cursor.lockState = (CursorLockMode)0;
Cursor.visible = true;
commandInput.text = string.Empty;
framesUntilInputClear = 2;
EventSystem current = EventSystem.current;
if (current != null)
{
current.SetSelectedGameObject(((Component)commandInput).gameObject);
}
commandInput.ActivateInputField();
if (!loadedInitialLogFile && ModConfig.LoadLogOutputOnFirstOpen.Value)
{
loadedInitialLogFile = true;
LoadLogOutputTail();
}
RefreshLogText();
}
public void Close()
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
windowObject.SetActive(false);
Cursor.lockState = prevLockState;
Cursor.visible = prevCursorVisible;
}
public void HandleGlobalShortcuts()
{
if (!Visible)
{
return;
}
bool flag = Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305);
if (flag && Input.GetKeyDown((KeyCode)102))
{
ToggleSearch();
}
if (flag && Input.GetKeyDown((KeyCode)97))
{
SelectAllInFocusedField();
}
if (Input.GetKeyDown((KeyCode)27))
{
if (searchRow.activeSelf)
{
ToggleSearch();
}
else
{
Close();
}
}
if (Input.GetKeyDown((KeyCode)273) && commandInput.isFocused)
{
NavigateHistory(-1);
}
if (Input.GetKeyDown((KeyCode)274) && commandInput.isFocused)
{
NavigateHistory(1);
}
}
private void SelectAllInFocusedField()
{
if (commandInput.isFocused)
{
commandInput.selectionAnchorPosition = 0;
commandInput.selectionFocusPosition = commandInput.text.Length;
}
else if (searchInput.isFocused)
{
searchInput.selectionAnchorPosition = 0;
searchInput.selectionFocusPosition = searchInput.text.Length;
}
else if ((Object)(object)copyField != (Object)null)
{
EventSystem current = EventSystem.current;
if (current != null)
{
current.SetSelectedGameObject(((Component)copyField).gameObject);
}
copyField.ActivateInputField();
copyField.selectionAnchorPosition = 0;
copyField.selectionFocusPosition = copyField.text.Length;
}
}
private void NavigateHistory(int direction)
{
if (history.Count != 0)
{
historyIndex = Mathf.Clamp(historyIndex + direction, 0, history.Count - 1);
commandInput.text = history[historyIndex];
commandInput.caretPosition = commandInput.text.Length;
}
}
private void CreateCanvas()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
canvasObject = new GameObject("HowToFishConsoleCanvas");
Object.DontDestroyOnLoad((Object)(object)canvasObject);
Canvas val = canvasObject.AddComponent<Canvas>();
val.renderMode = (RenderMode)0;
val.sortingOrder = 10000;
CanvasScaler val2 = canvasObject.AddComponent<CanvasScaler>();
val2.uiScaleMode = (ScaleMode)1;
val2.referenceResolution = new Vector2(1920f, 1080f);
val2.screenMatchMode = (ScreenMatchMode)0;
val2.matchWidthOrHeight = 0.5f;
canvasObject.AddComponent<GraphicRaycaster>();
}
private void CreateWindow()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
windowObject = new GameObject("DevConsoleWindow");
windowObject.transform.SetParent(canvasObject.transform, false);
windowRect = windowObject.AddComponent<RectTransform>();
windowRect.anchorMin = new Vector2(0.5f, 0.5f);
windowRect.anchorMax = new Vector2(0.5f, 0.5f);
windowRect.pivot = new Vector2(0.5f, 0.5f);
windowRect.sizeDelta = new Vector2(820f, 480f);
Image val = windowObject.AddComponent<Image>();
((Graphic)val).color = windowColor;
Outline val2 = windowObject.AddComponent<Outline>();
((Shadow)val2).effectColor = accentColorSoft;
((Shadow)val2).effectDistance = new Vector2(1.5f, 1.5f);
CreateHeader(windowObject.transform);
CreateSearchRow(windowObject.transform);
CreateLog(windowObject.transform);
CreateInputRow(windowObject.transform);
}
private void CreateHeader(Transform parent)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: 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_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("Header");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.anchorMin = new Vector2(0f, 1f);
val2.anchorMax = new Vector2(1f, 1f);
val2.pivot = new Vector2(0.5f, 1f);
val2.sizeDelta = new Vector2(0f, 42f);
((Graphic)val.AddComponent<Image>()).color = headerColor;
ConsoleDragHandle consoleDragHandle = val.AddComponent<ConsoleDragHandle>();
consoleDragHandle.Target = windowRect;
Text val3 = CreateText(val.transform, "CONSOLE", 20, (FontStyle)1, (TextAnchor)3, accentColor);
((Graphic)val3).rectTransform.anchorMin = new Vector2(0f, 0f);
((Graphic)val3).rectTransform.anchorMax = new Vector2(0.6f, 1f);
((Graphic)val3).rectTransform.offsetMin = new Vector2(15f, 0f);
((Graphic)val3).rectTransform.offsetMax = Vector2.zero;
Text val4 = CreateText(val.transform, "~ / F1 close • Ctrl+F search • Ctrl+A select all", 12, (FontStyle)0, (TextAnchor)5, new Color(0.5f, 0.5f, 0.55f));
((Graphic)val4).rectTransform.anchorMin = new Vector2(0.4f, 0f);
((Graphic)val4).rectTransform.anchorMax = new Vector2(1f, 1f);
((Graphic)val4).rectTransform.offsetMin = Vector2.zero;
((Graphic)val4).rectTransform.offsetMax = new Vector2(-15f, 0f);
}
private void CreateSearchRow(Transform parent)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
searchRow = new GameObject("SearchRow");
searchRow.transform.SetParent(parent, false);
RectTransform val = searchRow.AddComponent<RectTransform>();
val.anchorMin = new Vector2(0f, 1f);
val.anchorMax = new Vector2(1f, 1f);
val.pivot = new Vector2(0.5f, 1f);
val.sizeDelta = new Vector2(-20f, 32f);
val.anchoredPosition = new Vector2(0f, -48f);
((Graphic)searchRow.AddComponent<Image>()).color = inputBgColor;
searchInput = CreateInputField(searchRow.transform, "Search log...");
((UnityEvent<string>)(object)searchInput.onValueChanged).AddListener((UnityAction<string>)delegate
{
RefreshLogText();
});
searchRow.SetActive(false);
}
private void CreateLog(Transform parent)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Expected O, but got Unknown
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: 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)
//IL_015a: Expected O, but got Unknown
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01c1: 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_01e3: Unknown result type (might be due to invalid IL or missing references)
//IL_024a: Unknown result type (might be due to invalid IL or missing references)
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
//IL_02b8: Expected O, but got Unknown
//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0329: Unknown result type (might be due to invalid IL or missing references)
//IL_0362: Unknown result type (might be due to invalid IL or missing references)
//IL_0375: Unknown result type (might be due to invalid IL or missing references)
//IL_0387: Unknown result type (might be due to invalid IL or missing references)
//IL_0399: Unknown result type (might be due to invalid IL or missing references)
//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
//IL_0437: Unknown result type (might be due to invalid IL or missing references)
//IL_0469: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("LogScrollView");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.anchorMin = Vector2.zero;
val2.anchorMax = Vector2.one;
val2.offsetMin = new Vector2(15f, 55f);
val2.offsetMax = new Vector2(-15f, -55f);
logViewportRect = val2;
Image val3 = val.AddComponent<Image>();
((Graphic)val3).color = new Color(0f, 0f, 0f, 0f);
((Graphic)val3).raycastTarget = true;
scrollRect = val.AddComponent<ScrollRect>();
scrollRect.horizontal = false;
scrollRect.vertical = true;
scrollRect.movementType = (MovementType)2;
scrollRect.scrollSensitivity = 25f;
GameObject val4 = new GameObject("LogMask");
val4.transform.SetParent(val.transform, false);
RectTransform val5 = val4.AddComponent<RectTransform>();
val5.anchorMin = Vector2.zero;
val5.anchorMax = Vector2.one;
val5.offsetMin = Vector2.zero;
val5.offsetMax = Vector2.zero;
val4.AddComponent<RectMask2D>();
scrollRect.viewport = val5;
GameObject val6 = new GameObject("LogContent");
val6.transform.SetParent(val4.transform, false);
logContentRect = val6.AddComponent<RectTransform>();
logContentRect.anchorMin = new Vector2(0f, 1f);
logContentRect.anchorMax = new Vector2(1f, 1f);
logContentRect.pivot = new Vector2(0.5f, 1f);
logContentRect.sizeDelta = Vector2.zero;
logContentRect.anchoredPosition = Vector2.zero;
ContentSizeFitter val7 = val6.AddComponent<ContentSizeFitter>();
val7.horizontalFit = (FitMode)0;
val7.verticalFit = (FitMode)2;
logText = val6.AddComponent<Text>();
logText.font = font;
logText.fontSize = 15;
logText.alignment = (TextAnchor)0;
((Graphic)logText).color = textColor;
logText.supportRichText = true;
logText.horizontalOverflow = (HorizontalWrapMode)0;
logText.verticalOverflow = (VerticalWrapMode)1;
((Graphic)logText).raycastTarget = false;
logText.text = "";
scrollRect.content = logContentRect;
GameObject val8 = new GameObject("LogCopyField");
val8.transform.SetParent(val6.transform, false);
RectTransform val9 = val8.AddComponent<RectTransform>();
val9.anchorMin = Vector2.zero;
val9.anchorMax = Vector2.one;
val9.offsetMin = Vector2.zero;
val9.offsetMax = Vector2.zero;
Image val10 = val8.AddComponent<Image>();
((Graphic)val10).color = new Color(0f, 0f, 0f, 0f);
((Graphic)val10).raycastTarget = true;
Text val11 = CreateText(val8.transform, "", 15, (FontStyle)0, (TextAnchor)0, new Color(0f, 0f, 0f, 0f));
((Graphic)val11).rectTransform.anchorMin = Vector2.zero;
((Graphic)val11).rectTransform.anchorMax = Vector2.one;
((Graphic)val11).rectTransform.offsetMin = Vector2.zero;
((Graphic)val11).rectTransform.offsetMax = Vector2.zero;
val11.horizontalOverflow = (HorizontalWrapMode)0;
val11.verticalOverflow = (VerticalWrapMode)1;
((Graphic)val11).raycastTarget = false;
val11.supportRichText = false;
copyField = val8.AddComponent<InputField>();
((Selectable)copyField).targetGraphic = (Graphic)(object)val10;
copyField.textComponent = val11;
copyField.lineType = (LineType)2;
copyField.readOnly = true;
copyField.selectionColor = new Color(0.3f, 0.85f, 0.78f, 0.35f);
copyField.customCaretColor = true;
copyField.caretColor = new Color(0f, 0f, 0f, 0f);
copyField.caretWidth = 0;
copyField.text = "";
}
private void CreateInputRow(Transform parent)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("InputRow");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.anchorMin = new Vector2(0f, 0f);
val2.anchorMax = new Vector2(1f, 0f);
val2.pivot = new Vector2(0.5f, 0f);
val2.sizeDelta = new Vector2(-20f, 40f);
val2.anchoredPosition = new Vector2(0f, 10f);
((Graphic)val.AddComponent<Image>()).color = inputBgColor;
Outline val3 = val.AddComponent<Outline>();
((Shadow)val3).effectColor = accentColorSoft;
((Shadow)val3).effectDistance = new Vector2(1f, 1f);
Text val4 = CreateText(val.transform, ">", 18, (FontStyle)1, (TextAnchor)4, accentColor);
((Graphic)val4).rectTransform.anchorMin = new Vector2(0f, 0f);
((Graphic)val4).rectTransform.anchorMax = new Vector2(0f, 1f);
((Graphic)val4).rectTransform.sizeDelta = new Vector2(28f, 0f);
((Graphic)val4).rectTransform.anchoredPosition = new Vector2(14f, 0f);
commandInput = CreateInputField(val.transform, "Type a command... (help)");
RectTransform component = ((Component)commandInput).GetComponent<RectTransform>();
component.offsetMin = new Vector2(34f, component.offsetMin.y);
((UnityEvent<string>)(object)commandInput.onEndEdit).AddListener((UnityAction<string>)OnCommandSubmitted);
}
private InputField CreateInputField(Transform parent, string placeholder)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: 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_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("InputField");
val.transform.SetParent(parent, false);
RectTransform val2 = val.AddComponent<RectTransform>();
val2.anchorMin = Vector2.zero;
val2.anchorMax = Vector2.one;
val2.offsetMin = new Vector2(12f, 4f);
val2.offsetMax = new Vector2(-12f, -4f);
Image val3 = val.AddComponent<Image>();
((Graphic)val3).color = new Color(0f, 0f, 0f, 0f);
InputField val4 = val.AddComponent<InputField>();
((Selectable)val4).targetGraphic = (Graphic)(object)val3;
Text val5 = CreateText(val.transform, placeholder, 15, (FontStyle)2, (TextAnchor)3, new Color(0.45f, 0.45f, 0.5f));
((Graphic)val5).rectTransform.anchorMin = Vector2.zero;
((Graphic)val5).rectTransform.anchorMax = Vector2.one;
((Graphic)val5).rectTransform.offsetMin = Vector2.zero;
((Graphic)val5).rectTransform.offsetMax = Vector2.zero;
Text val6 = CreateText(val.transform, "", 15, (FontStyle)0, (TextAnchor)3, textColor);
((Graphic)val6).rectTransform.anchorMin = Vector2.zero;
((Graphic)val6).rectTransform.anchorMax = Vector2.one;
((Graphic)val6).rectTransform.offsetMin = Vector2.zero;
((Graphic)val6).rectTransform.offsetMax = Vector2.zero;
val4.textComponent = val6;
val4.placeholder = (Graphic)(object)val5;
return val4;
}
private Text CreateText(Transform parent, string text, int size, FontStyle style, TextAnchor alignment, Color color)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_003f: 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)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("Text");
val.transform.SetParent(parent, false);
Text val2 = val.AddComponent<Text>();
val2.font = font;
val2.text = text;
val2.fontSize = size;
val2.fontStyle = style;
val2.alignment = alignment;
((Graphic)val2).color = color;
val2.horizontalOverflow = (HorizontalWrapMode)0;
val2.verticalOverflow = (VerticalWrapMode)0;
return val2;
}
private void ToggleSearch()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
bool flag = !searchRow.activeSelf;
searchRow.SetActive(flag);
logViewportRect.offsetMax = new Vector2(-15f, (float)(flag ? (-91) : (-55)));
RefreshLogText();
if (flag)
{
EventSystem current = EventSystem.current;
if (current != null)
{
current.SetSelectedGameObject(((Component)searchInput).gameObject);
}
searchInput.ActivateInputField();
return;
}
searchInput.text = "";
RefreshLogText();
EventSystem current2 = EventSystem.current;
if (current2 != null)
{
current2.SetSelectedGameObject(((Component)commandInput).gameObject);
}
commandInput.ActivateInputField();
}
private void OnCommandSubmitted(string text)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
if ((Input.GetKeyDown((KeyCode)13) || Input.GetKeyDown((KeyCode)271)) && !string.IsNullOrWhiteSpace(text))
{
AppendLine("<color=#4fd6c4>></color> " + text, textColor);
history.Add(text);
historyIndex = history.Count;
commandInput.text = string.Empty;
commandInput.ActivateInputField();
CommandProcessor.Execute(text, this);
}
}
private Color ColorForLevelName(string levelName)
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
string text = levelName.ToLowerInvariant();
if (1 == 0)
{
}
Color result = (Color)(text switch
{
"fatal" => new Color(1f, 0.35f, 0.35f),
"error" => new Color(1f, 0.4f, 0.4f),
"warning" => new Color(0.55f, 0.9f, 0.5f),
"debug" => new Color(0.5f, 0.5f, 0.55f),
_ => textColor,
});
if (1 == 0)
{
}
return result;
}
private Color ColorForLevel(LogLevel level)
{
//IL_0004: 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_001c: Expected I4, but got Unknown
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: 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_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Invalid comparison between Unknown and I4
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
if (1 == 0)
{
}
Color result;
switch (level - 1)
{
default:
if ((int)level != 32)
{
goto case 2;
}
result = new Color(0.5f, 0.5f, 0.55f);
break;
case 0:
result = new Color(1f, 0.35f, 0.35f);
break;
case 1:
result = new Color(1f, 0.4f, 0.4f);
break;
case 3:
result = new Color(0.55f, 0.9f, 0.5f);
break;
case 2:
result = textColor;
break;
}
if (1 == 0)
{
}
return result;
}
private void LoadLogOutputTail()
{
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
try
{
string path = Path.Combine(Paths.BepInExRootPath, "LogOutput.log");
if (!File.Exists(path))
{
return;
}
using FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using StreamReader streamReader = new StreamReader(stream);
string[] array = (from l in streamReader.ReadToEnd().Split('\n')
where !string.IsNullOrWhiteSpace(l)
select l).ToArray();
int num = Mathf.Min(array.Length, ModConfig.LoadLogOutputLineCount.Value);
foreach (string item in array.Skip(array.Length - num))
{
string text = item.TrimEnd('\r');
Match match = LogLevelRegex.Match(text);
Color val = (Color)(match.Success ? ColorForLevelName(match.Groups[1].Value) : new Color(0.5f, 0.5f, 0.55f));
AddRawLine((val == textColor) ? text : WrapColor(text, val));
}
RefreshLogText();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)("Could not read LogOutput.log tail: " + ex.Message));
}
}
private void EnqueueBepInExLog(LogLevel level, string formattedLine)
{
//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)
pendingLogs.Enqueue((DateTime.Now, formattedLine, ColorForLevel(level)));
}
private void AppendLine(string message, Color color)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
AppendLineInternal(message, color, DateTime.Now);
RefreshLogText();
}
private void AppendLineInternal(string message, Color color, DateTime time)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
string text = ((color == textColor) ? message : WrapColor(message, color));
string coloredLine = (ModConfig.ShowTimestamps.Value ? (WrapColor("[" + time.ToString(ModConfig.TimestampFormat.Value) + "] ", new Color(0.5f, 0.5f, 0.55f)) + text) : text);
AddRawLine(coloredLine);
}
private void AddRawLine(string coloredLine)
{
rawLines.Add(coloredLine);
plainLines.Add(StripTags(coloredLine));
int value = ModConfig.MaxLogLines.Value;
while (rawLines.Count > value)
{
rawLines.RemoveAt(0);
plainLines.RemoveAt(0);
}
}
private static string StripTags(string s)
{
return TagStripRegex.Replace(s, string.Empty);
}
private static string WrapColor(string message, Color color)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
string text = ColorUtility.ToHtmlStringRGBA(color);
return "<color=#" + text + ">" + message + "</color>";
}
private void RefreshLogText()
{
if ((Object)(object)logText == (Object)null)
{
return;
}
bool flag = (Object)(object)scrollRect != (Object)null && scrollRect.verticalNormalizedPosition < 0.02f;
string value = (((Object)(object)searchInput != (Object)null) ? searchInput.text : null);
List<string> list = new List<string>();
List<string> list2 = new List<string>();
for (int i = 0; i < rawLines.Count; i++)
{
if (string.IsNullOrEmpty(value) || plainLines[i].IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
{
list.Add(rawLines[i]);
list2.Add(plainLines[i]);
}
}
logText.text = string.Join("\n", list);
if ((Object)(object)copyField != (Object)null)
{
copyField.text = string.Join("\n", list2);
}
Canvas.ForceUpdateCanvases();
LayoutRebuilder.ForceRebuildLayoutImmediate(logContentRect);
if (flag)
{
scrollRect.verticalNormalizedPosition = 0f;
}
}
}
public class ConsoleDragHandle : MonoBehaviour, IDragHandler, IEventSystemHandler, IBeginDragHandler
{
public RectTransform Target;
private Vector2 startMousePos;
private Vector2 startWindowPos;
public void OnBeginDrag(PointerEventData eventData)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
startMousePos = eventData.position;
startWindowPos = Target.anchoredPosition;
}
public void OnDrag(PointerEventData eventData)
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
Target.anchoredPosition = startWindowPos + (eventData.position - startMousePos);
}
}
[HarmonyPatch(typeof(PlayerVitals))]
public static class HungerPatch
{
private static readonly HashSet<PlayerVitals> hungerDisabledFor = new HashSet<PlayerVitals>();
public static void SetHungerEnabled(PlayerVitals vitals, bool enabled)
{
if (enabled)
{
hungerDisabledFor.Remove(vitals);
}
else
{
hungerDisabledFor.Add(vitals);
}
}
public static bool IsHungerDisabled(PlayerVitals vitals)
{
return hungerDisabledFor.Contains(vitals);
}
[HarmonyPatch("LowerFullnessTick")]
[HarmonyPrefix]
private static bool LowerFullnessTick_Prefix(PlayerVitals __instance)
{
return !hungerDisabledFor.Contains(__instance);
}
[HarmonyPatch("DamageFromFullness")]
[HarmonyPrefix]
private static bool DamageFromFullness_Prefix(PlayerVitals __instance)
{
return !hungerDisabledFor.Contains(__instance);
}
}
public static class ModConfig
{
public static ConfigEntry<KeyCode> ToggleKeyPrimary;
public static ConfigEntry<KeyCode> ToggleKeySecondary;
public static ConfigEntry<int> MaxLogLines;
public static ConfigEntry<bool> ShowTimestamps;
public static ConfigEntry<string> TimestampFormat;
public static ConfigEntry<bool> LoadLogOutputOnFirstOpen;
public static ConfigEntry<int> LoadLogOutputLineCount;
public static ConfigEntry<bool> Cmd_God_Enabled;
public static ConfigEntry<bool> Cmd_Fly_Enabled;
public static ConfigEntry<float> Fly_Speed;
public static ConfigEntry<bool> Cmd_Noclip_Enabled;
public static ConfigEntry<float> Noclip_Speed;
public static ConfigEntry<bool> Cmd_WalkSpeed_Enabled;
public static ConfigEntry<float> WalkSpeed_Default;
public static ConfigEntry<bool> Cmd_JumpPower_Enabled;
public static ConfigEntry<float> JumpPower_Default;
public static ConfigEntry<bool> Cmd_InfJump_Enabled;
public static ConfigEntry<bool> Cmd_Give_Enabled;
public static ConfigEntry<bool> Cmd_Hungry_Enabled;
public static ConfigEntry<bool> Cmd_AddMoney_Enabled;
public static ConfigEntry<int> AddMoney_DefaultAmount;
public static ConfigEntry<bool> Cmd_Kill_Enabled;
public static ConfigEntry<bool> Cmd_Size_Enabled;
public static ConfigEntry<float> Size_MinScale;
public static ConfigEntry<float> Size_MaxScale;
public static ConfigEntry<bool> Cmd_GamePause_Enabled;
public static ConfigEntry<bool> Cmd_GameDifficulty_Enabled;
public static ConfigEntry<bool> Cmd_Plugins_Enabled;
public static ConfigEntry<bool> Cmd_OneHit_Enabled;
public static ConfigEntry<bool> Cmd_Dmg_Enabled;
public static ConfigEntry<bool> Cmd_FF_Enabled;
public static ConfigEntry<bool> Cmd_ThirdPerson_Enabled;
public static ConfigEntry<float> ThirdPerson_Distance;
public static ConfigEntry<float> ThirdPerson_HeightOffset;
public static ConfigEntry<float> ThirdPerson_ClipRadius;
public static ConfigEntry<bool> Cmd_Goto_Enabled;
public static ConfigEntry<bool> Cmd_Bring_Enabled;
public static ConfigEntry<bool> Cmd_Kick_Enabled;
public static ConfigEntry<bool> Cmd_Ban_Enabled;
public static ConfigEntry<bool> Cmd_FreeBuy_Enabled;
public static ConfigEntry<bool> Cmd_AddSlot_Enabled;
public static ConfigEntry<int> AddSlot_MaxTotalSlots;
public static ConfigEntry<bool> Cmd_Rcs_Enabled;
public static ConfigEntry<float> RCS_MinScale;
public static ConfigEntry<float> RCS_MaxScale;
public static void Bind(ConfigFile config)
{
ToggleKeyPrimary = config.Bind<KeyCode>("General", "ToggleKeyPrimary", (KeyCode)96, "Key to open/close the console.");
ToggleKeySecondary = config.Bind<KeyCode>("General", "ToggleKeySecondary", (KeyCode)282, "Secondary (fallback) key to open/close the console.");
MaxLogLines = config.Bind<int>("General", "MaxLogLines", 500, "Maximum number of lines kept in the console log buffer.");
ShowTimestamps = config.Bind<bool>("General", "ShowTimestamps", true, "Show [HH:mm:ss] before each log line.");
TimestampFormat = config.Bind<string>("General", "TimestampFormat", "HH:mm:ss", "Time format (.NET DateTime format string).");
LoadLogOutputOnFirstOpen = config.Bind<bool>("General", "LoadLogOutputOnFirstOpen", true, "Load the tail of BepInEx/LogOutput.log when the console is first opened.");
LoadLogOutputLineCount = config.Bind<int>("General", "LoadLogOutputLineCount", 200, "How many trailing lines of LogOutput.log to load on first open.");
Cmd_God_Enabled = config.Bind<bool>("Commands", "god.Enabled", true, "Enable the 'god' command.");
Cmd_Fly_Enabled = config.Bind<bool>("Commands", "fly.Enabled", true, "Enable the 'fly' command.");
Fly_Speed = config.Bind<float>("Commands", "fly.Speed", 8f, "Fly mode movement speed.");
Cmd_Noclip_Enabled = config.Bind<bool>("Commands", "noclip.Enabled", true, "Enable the 'noclip' command.");
Noclip_Speed = config.Bind<float>("Commands", "noclip.Speed", 10f, "Noclip movement speed.");
Cmd_WalkSpeed_Enabled = config.Bind<bool>("Commands", "walkspeed.Enabled", true, "Enable the 'walkspeed' command.");
WalkSpeed_Default = config.Bind<float>("Commands", "walkspeed.Default", 5f, "Default value used when 'walkspeed' is called without a number (reset).");
Cmd_JumpPower_Enabled = config.Bind<bool>("Commands", "jumppower.Enabled", true, "Enable the 'jumppower' command.");
JumpPower_Default = config.Bind<float>("Commands", "jumppower.Default", 6f, "Default value used when 'jumppower' is called without a number (reset).");
Cmd_InfJump_Enabled = config.Bind<bool>("Commands", "infjump.Enabled", true, "Enable the 'infjump' command.");
Cmd_Give_Enabled = config.Bind<bool>("Commands", "give.Enabled", true, "Enable the 'give' command.");
Cmd_Hungry_Enabled = config.Bind<bool>("Commands", "hungry.Enabled", true, "Enable the 'hungry' command.");
Cmd_AddMoney_Enabled = config.Bind<bool>("Commands", "addmoney.Enabled", true, "Enable the 'addmoney' command.");
AddMoney_DefaultAmount = config.Bind<int>("Commands", "addmoney.DefaultAmount", 1000, "Default amount used when 'addmoney' is called without a number.");
Cmd_Kill_Enabled = config.Bind<bool>("Commands", "kill.Enabled", true, "Enable the 'kill' command.");
Cmd_Size_Enabled = config.Bind<bool>("Commands", "size.Enabled", true, "Enable the 'size' command.");
Size_MinScale = config.Bind<float>("Commands", "size.MinScale", 0.1f, "Minimum scale per axis.");
Size_MaxScale = config.Bind<float>("Commands", "size.MaxScale", 5f, "Maximum scale per axis.");
Cmd_GamePause_Enabled = config.Bind<bool>("Commands", "game_pause.Enabled", true, "Enable the 'game_pause' command.");
Cmd_GameDifficulty_Enabled = config.Bind<bool>("Commands", "game_difficulty.Enabled", true, "Enable the 'game_difficulty' command.");
Cmd_Plugins_Enabled = config.Bind<bool>("Commands", "plugins.Enabled", true, "Enable the 'plugins' command.");
Cmd_OneHit_Enabled = config.Bind<bool>("Commands", "onehit.Enabled", true, "Enable the 'onehit' command.");
Cmd_Dmg_Enabled = config.Bind<bool>("Commands", "dmg.Enabled", true, "Enable the 'dmg' command.");
Cmd_FF_Enabled = config.Bind<bool>("Commands", "ff.Enabled", true, "Enable the 'ff' command.");
Cmd_ThirdPerson_Enabled = config.Bind<bool>("Commands", "thirdperson.Enabled", true, "Enable the 'thirdperson' command.");
ThirdPerson_Distance = config.Bind<float>("Commands", "thirdperson.Distance", 3.5f, "Camera distance behind the player in third person.");
ThirdPerson_HeightOffset = config.Bind<float>("Commands", "thirdperson.HeightOffset", 0.3f, "Extra vertical offset added to the third-person camera.");
ThirdPerson_ClipRadius = config.Bind<float>("Commands", "thirdperson.ClipRadius", 0.2f, "SphereCast radius used to keep the camera out of walls.");
Cmd_Goto_Enabled = config.Bind<bool>("Commands", "goto.Enabled", true, "Enable the 'goto' command.");
Cmd_Bring_Enabled = config.Bind<bool>("Commands", "bring.Enabled", true, "Enable the 'bring' command.");
Cmd_Kick_Enabled = config.Bind<bool>("Commands", "kick.Enabled", true, "Enable the 'kick' command.");
Cmd_Ban_Enabled = config.Bind<bool>("Commands", "ban.Enabled", true, "Enable the 'ban' command.");
Cmd_FreeBuy_Enabled = config.Bind<bool>("Commands", "freebuy.Enabled", true, "Enable the 'freebuy' command.");
Cmd_AddSlot_Enabled = config.Bind<bool>("Commands", "addslot.Enabled", true, "Enable the 'addslot' command.");
AddSlot_MaxTotalSlots = config.Bind<int>("Commands", "addslot.MaxTotalSlots", 9, "Maximum total inventory slots (starting slots + extra slots) that 'addslot' will allow.");
Cmd_Rcs_Enabled = config.Bind<bool>("Commands", "rcs.Enabled", true, "Enable the 'rcs' command.");
RCS_MinScale = config.Bind<float>("Commands", "rcs.MinScale", 0.5f, "Minimum random scale applied to newly spawned creatures.");
RCS_MaxScale = config.Bind<float>("Commands", "rcs.MaxScale", 2.5f, "Maximum random scale applied to newly spawned creatures.");
}
}
public enum FreeMoveMode
{
None,
Fly,
Noclip
}
[HarmonyPatch(typeof(PlayerMovement))]
public static class FreeMovementPatch
{
private static readonly Dictionary<Player, FreeMoveMode> activeModes = new Dictionary<Player, FreeMoveMode>();
private static readonly Dictionary<Player, bool> originalGravity = new Dictionary<Player, bool>();
private static readonly Dictionary<Player, bool> originalDetectCollisions = new Dictionary<Player, bool>();
private static readonly FieldInfo playerField = AccessTools.Field(typeof(PlayerMovement), "_player");
public static FreeMoveMode GetMode(Player player)
{
FreeMoveMode value;
return activeModes.TryGetValue(player, out value) ? value : FreeMoveMode.None;
}
public static FreeMoveMode Toggle(Player player, FreeMoveMode mode)
{
FreeMoveMode mode2 = GetMode(player);
if (mode2 == mode)
{
SetMode(player, FreeMoveMode.None);
return FreeMoveMode.None;
}
SetMode(player, mode);
return mode;
}
private static void SetMode(Player player, FreeMoveMode mode)
{
Rigidbody rigidbody = player.Rigidbody;
if (mode != FreeMoveMode.None)
{
if (!originalGravity.ContainsKey(player) && Object.op_Implicit((Object)(object)rigidbody))
{
originalGravity[player] = rigidbody.useGravity;
}
if (!originalDetectCollisions.ContainsKey(player) && Object.op_Implicit((Object)(object)rigidbody))
{
originalDetectCollisions[player] = rigidbody.detectCollisions;
}
activeModes[player] = mode;
return;
}
activeModes.Remove(player);
if (Object.op_Implicit((Object)(object)rigidbody))
{
if (originalGravity.TryGetValue(player, out var value))
{
rigidbody.useGravity = value;
}
if (originalDetectCollisions.TryGetValue(player, out var value2))
{
rigidbody.detectCollisions = value2;
}
}
originalGravity.Remove(player);
originalDetectCollisions.Remove(player);
}
[HarmonyPatch("FixedUpdate")]
[HarmonyPostfix]
private static void FixedUpdate_Postfix(PlayerMovement __instance)
{
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
if (activeModes.Count == 0)
{
return;
}
object? obj = playerField?.GetValue(__instance);
Player val = (Player)((obj is Player) ? obj : null);
if (val == null || !activeModes.TryGetValue(val, out var value))
{
return;
}
Rigidbody rigidbody = val.Rigidbody;
if (!Object.op_Implicit((Object)(object)rigidbody))
{
return;
}
rigidbody.useGravity = false;
rigidbody.detectCollisions = value != FreeMoveMode.Noclip;
Vector3 val2 = Vector3.zero;
if (((NetworkBehaviour)val).Owner != (NetworkConnection)null && ((NetworkBehaviour)val).Owner.IsLocalClient)
{
Transform camObject = val.CamObject;
float axisRaw = Input.GetAxisRaw("Horizontal");
float axisRaw2 = Input.GetAxisRaw("Vertical");
val2 = camObject.forward * axisRaw2 + camObject.right * axisRaw;
if (((Vector3)(ref val2)).sqrMagnitude > 1f)
{
((Vector3)(ref val2)).Normalize();
}
if (Input.GetKey((KeyCode)32))
{
val2 += Vector3.up;
}
if (Input.GetKey((KeyCode)306))
{
val2 -= Vector3.up;
}
float num = ((value == FreeMoveMode.Noclip) ? ModConfig.Noclip_Speed.Value : ModConfig.Fly_Speed.Value);
val2 *= num;
}
rigidbody.linearVelocity = val2;
}
}
[HarmonyPatch(typeof(PlayerMovement))]
public static class InfiniteJumpPatch
{
private static readonly HashSet<Player> enabledFor = new HashSet<Player>();
private static readonly FieldInfo playerField = AccessTools.Field(typeof(PlayerMovement), "_player");
public static void SetEnabled(Player player, bool enabled)
{
if (enabled)
{
enabledFor.Add(player);
}
else
{
enabledFor.Remove(player);
}
}
public static bool IsEnabled(Player player)
{
return enabledFor.Contains(player);
}
[HarmonyPatch("JumpInput")]
[HarmonyPrefix]
private static bool JumpInput_Prefix(PlayerMovement __instance)
{
object? obj = playerField?.GetValue(__instance);
Player val = (Player)((obj is Player) ? obj : null);
if (val == null || !enabledFor.Contains(val))
{
return true;
}
if (!val.BlockInputs)
{
__instance.Jump();
}
return false;
}
}
[HarmonyPatch(typeof(PlayerCamera))]
public static class ThirdPersonPatch
{
private static readonly HashSet<Player> enabledFor = new HashSet<Player>();
private static readonly FieldInfo playerField = AccessTools.Field(typeof(PlayerCamera), "_player");
public static void SetEnabled(Player player, bool enabled)
{
if (enabled)
{
enabledFor.Add(player);
}
else
{
enabledFor.Remove(player);
}
}
public static bool IsEnabled(Player player)
{
return (Object)(object)player != (Object)null && enabledFor.Contains(player);
}
[HarmonyPatch("SetCamPosRot")]
[HarmonyPostfix]
private static void SetCamPosRot_Postfix(PlayerCamera __instance)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: 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)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
if (enabledFor.Count == 0)
{
return;
}
object? obj = playerField?.GetValue(__instance);
Player val = (Player)((obj is Player) ? obj : null);
if (val == null || !enabledFor.Contains(val))
{
return;
}
Transform camTransform = __instance.CamTransform;
Vector3 position = camTransform.position;
Quaternion rotation = camTransform.rotation;
float value = ModConfig.ThirdPerson_Distance.Value;
float value2 = ModConfig.ThirdPerson_HeightOffset.Value;
float value3 = ModConfig.ThirdPerson_ClipRadius.Value;
Vector3 val2 = position - rotation * Vector3.forward * value + Vector3.up * value2;
Vector3 val3 = val2 - position;
float magnitude = ((Vector3)(ref val3)).magnitude;
if (magnitude > 0.001f)
{
Vector3 val4 = val3 / magnitude;
RaycastHit[] array = Physics.SphereCastAll(position, value3, val4, magnitude, -1, (QueryTriggerInteraction)1);
float num = magnitude;
RaycastHit[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
RaycastHit val5 = array2[i];
if (!((Component)((RaycastHit)(ref val5)).collider).transform.IsChildOf(val.Transform) && !((Object)(object)((Component)((RaycastHit)(ref val5)).collider).transform == (Object)(object)val.Transform) && ((RaycastHit)(ref val5)).distance < num)
{
num = ((RaycastHit)(ref val5)).distance;
}
}
if (num < magnitude)
{
val2 = position + val4 * Mathf.Max(num - value3, 0.05f);
}
}
camTransform.position = val2;
}
}
[HarmonyPatch(typeof(MoneyManager), "CanAfford", new Type[] { typeof(int) })]
public static class FreeBuyPatch
{
public static bool Enabled;
[HarmonyPrefix]
private static bool CanAfford_Prefix(ref bool __result)
{
if (!Enabled)
{
return true;
}
__result = true;
return false;
}
}
[HarmonyPatch(typeof(Creature), "Awake")]
public static class RandomCreatureSizePatch
{
public static bool Enabled;
[HarmonyPostfix]
private static void Awake_Postfix(Creature __instance)
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
if (Enabled)
{
float value = ModConfig.RCS_MinScale.Value;
float value2 = ModConfig.RCS_MaxScale.Value;
float num = Random.Range(value, value2);
((Component)__instance).transform.localScale = Vector3.one * num;
}
}
}
[BepInPlugin("com.neko.howtofish.console", "How To Fish Dev Console", "1.1.0")]
public class Plugin : BaseUnityPlugin
{
internal static ManualLogSource Log;
private Harmony harmony;
private ConsoleUI consoleUI;
public static Plugin Instance { get; private set; }
private void Awake()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected O, but got Unknown
Instance = this;
Log = ((BaseUnityPlugin)this).Logger;
ModConfig.Bind(((BaseUnityPlugin)this).Config);
harmony = new Harmony("com.neko.howtofish.console");
harmony.PatchAll();
CommandProcessor.RegisterDefaultCommands();
consoleUI = new ConsoleUI();
Log.LogInfo((object)"How To Fish Dev Console loaded. Press ~ or F1 to open.");
}
private void Update()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown(ModConfig.ToggleKeyPrimary.Value) || Input.GetKeyDown(ModConfig.ToggleKeySecondary.Value))
{
consoleUI.Toggle();
}
consoleUI.Tick();
consoleUI.HandleGlobalShortcuts();
}
private void OnDestroy()
{
Harmony obj = harmony;
if (obj != null)
{
obj.UnpatchSelf();
}
consoleUI?.Dispose();
}
}
}