using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.Encodings.Web; using System.Text.Json; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using NPCs.Data; using NPCs.Services; using ProjectM; using ProjectM.Shared; using Stunlock.Core; using Unity.Collections; using Unity.Entities; using Unity.Mathematics; using Unity.Transforms; using UnityEngine; using VampireCommandFramework; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("NPCs")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("NPCs is a server-side V Rising mod featuring automated scheduled NPC spawning, manual spawning and despawning, custom NPC teams, and multiple spawn points.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("NPCs")] [assembly: AssemblyTitle("NPCs")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace NPCs { internal static class Core { private static bool _hasInitialized; private static World _server; private static EntityManager _entityManager; public static World Server { get { object obj = _server; if (obj == null) { obj = GetWorld("Server") ?? throw new Exception("There is no Server world (yet). Did you install a server mod on the client?"); _server = (World)obj; } return (World)obj; } } public static EntityManager EntityManager => (!(_entityManager == default(EntityManager))) ? _entityManager : (_entityManager = Server.EntityManager); public static ManualLogSource Log => Plugin.PluginLog; public static void LogException(Exception e, [CallerMemberName] string caller = null) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ManualLogSource log = Log; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(52, 5, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failure in "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(caller); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nMessage: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.Message); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Inner: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.InnerException?.Message); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\n\nStack: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.StackTrace); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nInner Stack: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(e.InnerException?.StackTrace); } log.LogError(val); } internal static void InitializeAfterLoaded() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown if (!_hasInitialized) { _server = GetWorld("Server") ?? throw new Exception("There is no Server world (yet). Did you install a server mod on the client?"); _entityManager = _server.EntityManager; NpcService.Initialize(); _hasInitialized = true; ManualLogSource log = Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(10, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("InitializeAfterLoaded"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" completed"); } log.LogInfo(val); } } internal static World GetWorld(string name) { Enumerator enumerator = World.s_AllWorlds.GetEnumerator(); while (enumerator.MoveNext()) { World current = enumerator.Current; if (current != null && current.Name == name) { return current; } } return null; } } public static class ECSExtensions { public unsafe static void Write(this Entity entity, T componentData) where T : struct { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); byte[] array = StructureToByteArray(componentData); int num = Marshal.SizeOf(); fixed (byte* ptr = array) { EntityManager entityManager = Core.EntityManager; ((EntityManager)(ref entityManager)).SetComponentDataRaw(entity, val.TypeIndex, (void*)ptr, num); } } public unsafe static T Read(this Entity entity) where T : struct { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); EntityManager entityManager = Core.EntityManager; void* componentDataRawRO = ((EntityManager)(ref entityManager)).GetComponentDataRawRO(entity, val.TypeIndex); return Marshal.PtrToStructure(new IntPtr(componentDataRawRO)); } public unsafe static T ReadRW(this Entity entity) where T : struct { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); EntityManager entityManager = Core.EntityManager; void* componentDataRawRW = ((EntityManager)(ref entityManager)).GetComponentDataRawRW(entity, val.TypeIndex); return Marshal.PtrToStructure(new IntPtr(componentDataRawRW)); } public static bool Has(this Entity entity) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); EntityManager entityManager = Core.EntityManager; return ((EntityManager)(ref entityManager)).HasComponent(entity, val); } public static void Add(this Entity entity) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); EntityManager entityManager = Core.EntityManager; ((EntityManager)(ref entityManager)).AddComponent(entity, val); } public static void Remove(this Entity entity) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ComponentType val = default(ComponentType); ((ComponentType)(ref val))..ctor(Il2CppType.Of(), (AccessMode)0); EntityManager entityManager = Core.EntityManager; ((EntityManager)(ref entityManager)).RemoveComponent(entity, val); } private static byte[] StructureToByteArray(T structure) where T : struct { int num = Marshal.SizeOf(structure); byte[] array = new byte[num]; IntPtr intPtr = Marshal.AllocHGlobal(num); Marshal.StructureToPtr(structure, intPtr, fDeleteOld: true); Marshal.Copy(intPtr, array, 0, num); Marshal.FreeHGlobal(intPtr); return array; } } internal static class Helper { public static List GetAllEntitiesInRadius(float2 center2D, float radius) where T : struct { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_0085: 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_009c: Unknown result type (might be due to invalid IL or missing references) EntityManager entityManager = Core.EntityManager; List list = new List(); EntityQuery val = ((EntityManager)(ref entityManager)).CreateEntityQuery((ComponentType[])(object)new ComponentType[2] { ComponentType.ReadOnly(), ComponentType.ReadOnly() }); NativeArray val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); float num = radius * radius; Enumerator enumerator = val2.GetEnumerator(); float2 val3 = default(float2); while (enumerator.MoveNext()) { Entity current = enumerator.Current; LocalToWorld componentData = ((EntityManager)(ref entityManager)).GetComponentData(current); float3 position = ((LocalToWorld)(ref componentData)).Position; ((float2)(ref val3))..ctor(position.x, position.z); if (math.distancesq(center2D, val3) <= num) { list.Add(current); } } val2.Dispose(); return list; } public static void BroadcastSystemMessage(string message) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) try { FixedString512Bytes val = default(FixedString512Bytes); ((FixedString512Bytes)(ref val))..ctor(message ?? string.Empty); ServerChatUtils.SendSystemMessageToAllClients(Core.EntityManager, ref val); } catch (Exception e) { Core.LogException(e, "BroadcastSystemMessage"); } } } [BepInPlugin("NPCs", "NPCs", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { internal static Harmony Harmony; internal static ManualLogSource PluginLog; internal static Plugin Instance; public static ConfigEntry ModEnabled; public static ConfigEntry BroadcastEnable; public static ConfigEntry BroadcastMessage; public static ConfigEntry LifetimeSeconds; public static ConfigEntry HourlySpawnAtMinute; public static ConfigEntry HourlySpawnAtSecond; public override void Load() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Expected O, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Expected O, but got Unknown if (!(Application.productName != "VRisingServer")) { Instance = this; PluginLog = ((BasePlugin)this).Log; ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("NPCs"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" version "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("1.0.0"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!"); } log.LogInfo(val); ModEnabled = ((BasePlugin)this).Config.Bind("General", "ModEnabled", true, "Enable or disable the mod"); BroadcastEnable = ((BasePlugin)this).Config.Bind("General", "BroadcastEnable", true, "Enable or disable the broadcast message when NPCs spawn"); BroadcastMessage = ((BasePlugin)this).Config.Bind("General", "BroadcastMessage", "NPCs have spawned", "Broadcast message shown when NPCs spawn"); LifetimeSeconds = ((BasePlugin)this).Config.Bind("Timer", "LifetimeSeconds", 1200f, new ConfigDescription("How long NPCs stay alive in seconds before auto-despawning", (AcceptableValueBase)(object)new AcceptableValueRange(10f, 3599f), Array.Empty())); HourlySpawnAtMinute = ((BasePlugin)this).Config.Bind("Schedule", "HourlySpawnAtMinute", 0, new ConfigDescription("Minute of each hour to spawn", (AcceptableValueBase)(object)new AcceptableValueRange(0, 59), Array.Empty())); HourlySpawnAtSecond = ((BasePlugin)this).Config.Bind("Schedule", "HourlySpawnAtSecond", 0, new ConfigDescription("Second of each hour to spawn", (AcceptableValueBase)(object)new AcceptableValueRange(0, 59), Array.Empty())); Harmony = new Harmony("NPCs"); Harmony.PatchAll(Assembly.GetExecutingAssembly()); NpcService.Initialize(); CommandRegistry.RegisterAll(); } } public override bool Unload() { CommandRegistry.UnregisterAssembly(); Harmony harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } return true; } internal static bool HasLoaded() { World world = Core.GetWorld("Server"); if (world == null) { return false; } PrefabCollectionSystem existingSystemManaged = world.GetExistingSystemManaged(); return existingSystemManaged != null && existingSystemManaged.SpawnableNameToPrefabGuidDictionary.Count > 0; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "NPCs"; public const string PLUGIN_NAME = "NPCs"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace NPCs.Services { internal static class NpcService { private static readonly string CONFIG_DIR = Path.Combine(Paths.ConfigPath, "NPCs"); private static readonly string CONFIG_NPC_TEAMS_FILE = Path.Combine(CONFIG_DIR, "npc_teams.json"); private static readonly object IO_LOCK = new object(); private const float DespawnExtraRadius = 12f; private static DateTime _nextSpawnLocal; private static bool _schedulerInited; private static bool _despawnArmed; private static DateTime _despawnDueLocal; private static DateTime _nextErrorLogLocal = DateTime.MinValue; public static Dictionary Teams = new Dictionary(StringComparer.OrdinalIgnoreCase); private static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions { AllowTrailingCommas = true, PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; public static DateTime NextSpawnLocal => _nextSpawnLocal; public static void Initialize() { Load(); InitScheduler(); } public static void InitScheduler() { if (!_schedulerInited) { _schedulerInited = true; _nextSpawnLocal = ComputeNextHourAt(DateTime.Now); } } public static void Reload() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown DespawnNpc(); ((BasePlugin)Plugin.Instance).Config.Reload(); Load(); _despawnArmed = false; _nextSpawnLocal = ComputeNextHourAt(DateTime.Now); ManualLogSource log = Core.Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(54, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[NPCs] Config reloaded. Next auto-spawn scheduled at: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(_nextSpawnLocal, "HH:mm:ss"); } log.LogInfo(val); } public static void Load() { try { lock (IO_LOCK) { if (!Directory.Exists(CONFIG_DIR)) { Directory.CreateDirectory(CONFIG_DIR); } if (!File.Exists(CONFIG_NPC_TEAMS_FILE)) { GenerateDefaultConfig(); return; } string json = File.ReadAllText(CONFIG_NPC_TEAMS_FILE); Teams = JsonSerializer.Deserialize>(json, JsonOptions) ?? new Dictionary(StringComparer.OrdinalIgnoreCase); } } catch (Exception e) { Core.LogException(e, "Load"); Teams = new Dictionary(StringComparer.OrdinalIgnoreCase); } } public static void Save() { try { lock (IO_LOCK) { if (!Directory.Exists(CONFIG_DIR)) { Directory.CreateDirectory(CONFIG_DIR); } string contents = JsonSerializer.Serialize(Teams, JsonOptions); File.WriteAllText(CONFIG_NPC_TEAMS_FILE, contents); } } catch (Exception e) { Core.LogException(e, "Save"); } } public static void SpawnNpc(Entity user) { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) try { if (!Plugin.ModEnabled.Value) { return; } DespawnNpc(); UnitSpawnerUpdateSystem existingSystemManaged = Core.Server.GetExistingSystemManaged(); Random random = new Random(); bool flag = default(bool); PrefabGUID val2 = default(PrefabGUID); float3 val3 = default(float3); foreach (TeamConfig value2 in Teams.Values) { if (value2?.SpawnPoints == null || value2.SpawnPoints.Count == 0 || value2.Prefabs == null || value2.Prefabs.Count == 0) { continue; } foreach (SimpleVec3 spawnPoint in value2.SpawnPoints) { foreach (KeyValuePair prefab in value2.Prefabs) { if (!int.TryParse(prefab.Key, out var result)) { continue; } if (!WhitelistPrefabs.IsAllowed(result)) { ManualLogSource log = Core.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(42, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[NPCs] Spawn skipped for unlisted prefab: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(result); } log.LogWarning(val); continue; } ((PrefabGUID)(ref val2))..ctor(result); int value = prefab.Value; for (int i = 0; i < value; i++) { float num = (float)(random.NextDouble() * 2.0 - 1.0) * value2.RandomAround; float num2 = (float)(random.NextDouble() * 2.0 - 1.0) * value2.RandomAround; ((float3)(ref val3))..ctor(spawnPoint.X + num, spawnPoint.Y, spawnPoint.Z + num2); existingSystemManaged.SpawnUnit(Entity.Null, val2, val3, 1, 1f, 1f, Plugin.LifetimeSeconds.Value); } } } } if (Plugin.BroadcastEnable.Value) { Helper.BroadcastSystemMessage(Plugin.BroadcastMessage.Value); } Core.Log.LogInfo((object)"[NPCs] Spawned NPCs successfully."); } catch (Exception e) { Core.LogException(e, "SpawnNpc"); } } public static int DespawnNpc(float extraRadius = 12f, string specificTeam = null, string specificPrefab = null) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Expected O, but got Unknown //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02d9: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: 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_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_0358: Unknown result type (might be due to invalid IL or missing references) //IL_035d: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_03a9: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected O, but got Unknown //IL_01fc: Unknown result type (might be due to invalid IL or missing references) try { int num = 0; EntityManager entityManager = Core.EntityManager; Dictionary> dictionary = new Dictionary>(); bool flag = default(bool); float2 item2 = default(float2); foreach (KeyValuePair team in Teams) { if (specificTeam != null && !string.Equals(team.Key, specificTeam, StringComparison.OrdinalIgnoreCase)) { continue; } TeamConfig value = team.Value; if (value.SpawnPoints == null || value.SpawnPoints.Count == 0 || value.Prefabs == null || value.Prefabs.Count == 0) { continue; } float item = (value.RandomAround + extraRadius) * (value.RandomAround + extraRadius); List list = new List(); foreach (KeyValuePair prefab in value.Prefabs) { if ((!string.IsNullOrEmpty(specificPrefab) && !string.Equals(prefab.Key, specificPrefab, StringComparison.OrdinalIgnoreCase)) || !int.TryParse(prefab.Key, out var result)) { continue; } if (WhitelistPrefabs.IsAllowed(result)) { list.Add(result); continue; } ManualLogSource log = Core.Log; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[NPCs] Despawn skipped for unlisted prefab: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(result); } log.LogWarning(val); } foreach (SimpleVec3 spawnPoint in value.SpawnPoints) { ((float2)(ref item2))..ctor(spawnPoint.X, spawnPoint.Z); foreach (int item3 in list) { if (!dictionary.ContainsKey(item3)) { dictionary[item3] = new List<(float2, float)>(); } dictionary[item3].Add((item2, item)); } } } if (dictionary.Count == 0) { return 0; } EntityQueryDesc val2 = new EntityQueryDesc(); val2.All = Il2CppStructArray.op_Implicit((ComponentType[])(object)new ComponentType[3] { ComponentType.ReadOnly(), ComponentType.ReadOnly(), ComponentType.ReadOnly() }); val2.Options = (EntityQueryOptions)2; EntityQueryDesc val3 = val2; EntityQuery val4 = ((EntityManager)(ref entityManager)).CreateEntityQuery((EntityQueryDesc[])(object)new EntityQueryDesc[1] { val3 }); NativeArray val5 = ((EntityQuery)(ref val4)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)); NativeArray val6 = ((EntityQuery)(ref val4)).ToComponentDataArray(AllocatorHandle.op_Implicit((Allocator)2)); NativeArray val7 = ((EntityQuery)(ref val4)).ToComponentDataArray(AllocatorHandle.op_Implicit((Allocator)2)); List list2 = new List(); float2 val9 = default(float2); for (int i = 0; i < val5.Length; i++) { PrefabGUID val8 = val6[i]; int guidHash = ((PrefabGUID)(ref val8)).GuidHash; if (!dictionary.TryGetValue(guidHash, out var value2)) { continue; } ((float2)(ref val9))..ctor(val7[i].Value.x, val7[i].Value.z); foreach (var item4 in value2) { if (math.distancesq(val9, item4.Item1) <= item4.Item2) { list2.Add(val5[i]); break; } } } val5.Dispose(); val6.Dispose(); val7.Dispose(); foreach (Entity item5 in list2) { if (((EntityManager)(ref entityManager)).Exists(item5)) { DestroyUtility.Destroy(entityManager, item5, (DestroyDebugReason)13, (string)null, 0); num++; } } Core.Log.LogInfo((object)"[NPCs] Despawned NPCs successfully."); return num; } catch (Exception e) { Core.LogException(e, "DespawnNpc"); return 0; } } public static void TickScheduler() { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.ModEnabled.Value) { return; } DateTime now = DateTime.Now; if (_despawnArmed && now >= _despawnDueLocal) { _despawnArmed = false; try { DespawnNpc(); } catch (Exception e) { if (now > _nextErrorLogLocal) { Core.LogException(e, "TickScheduler"); _nextErrorLogLocal = now.AddMinutes(5.0); } } } if (!(now >= _nextSpawnLocal)) { return; } _nextSpawnLocal = ComputeNextHourAt(now); _despawnArmed = true; _despawnDueLocal = now.AddSeconds(Plugin.LifetimeSeconds.Value + 1f); try { SpawnNpc(Entity.Null); } catch (Exception e2) { if (now > _nextErrorLogLocal) { Core.LogException(e2, "TickScheduler"); _nextErrorLogLocal = now.AddMinutes(5.0); } } } private static DateTime ComputeNextHourAt(DateTime now) { DateTime dateTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, Plugin.HourlySpawnAtMinute.Value, Plugin.HourlySpawnAtSecond.Value); if (dateTime <= now) { return dateTime.AddHours(1.0); } return dateTime; } private static void GenerateDefaultConfig() { Teams.Clear(); Teams.Add("villager", new TeamConfig { RandomAround = 18f, Prefabs = new Dictionary { { "-1670130821", 1 }, { "-1224027101", 5 }, { "-2025921616", 5 } } }); Teams.Add("nun", new TeamConfig { RandomAround = 4f, Prefabs = new Dictionary { { "-700632469", 1 }, { "1772642154", 4 } } }); Teams.Add("guard", new TeamConfig { RandomAround = 8f, Prefabs = new Dictionary { { "847893333", 1 }, { "203103783", 1 }, { "37713289", 1 }, { "1730498275", 2 }, { "2005508157", 2 }, { "-249647316", 1 } } }); Teams.Add("warrior", new TeamConfig { RandomAround = 12f, Prefabs = new Dictionary { { "426583055", 2 }, { "2128996433", 2 }, { "-930333806", 2 }, { "794228023", 2 }, { "1148936156", 2 }, { "1728773109", 2 }, { "1745498602", 1 }, { "-1464869978", 1 }, { "1185952775", 1 }, { "1406393857", 1 }, { "-700632469", 1 }, { "1660801216", 1 } } }); Teams.Add("vamp", new TeamConfig { RandomAround = 10f, Prefabs = new Dictionary { { "-1076780215", 2 }, { "1912966420", 2 }, { "981369753", 2 }, { "-65981941", 1 }, { "-494298686", 1 }, { "-1009917656", 1 }, { "-653348998", 1 }, { "1980594081", 1 }, { "16593505050", 4 } } }); Teams.Add("horse", new TeamConfig { RandomAround = 5f, Prefabs = new Dictionary { { "1149585723", 4 } } }); Save(); } } } namespace NPCs.Patches { [HarmonyPatch(typeof(ServerBootstrapSystem), "OnUpdate")] internal static class InitializationPatch { private static void Postfix() { if (Plugin.HasLoaded()) { Core.InitializeAfterLoaded(); } } } [HarmonyPatch(typeof(ServerBootstrapSystem), "OnUpdate")] internal static class NpcAutoSpawnPatch { private static float _nextTick; private static bool _loggedOnce; private static void Postfix() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown if (Time.time < _nextTick) { return; } _nextTick = Time.time + 1f; try { NpcService.TickScheduler(); } catch (Exception ex) { if (!_loggedOnce) { _loggedOnce = true; ManualLogSource log = Core.Log; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[NPCs] Scheduler not ready yet: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } log.LogWarning(val); } } } } } namespace NPCs.Data { public class TeamConfig { public float RandomAround { get; set; } = 5f; public Dictionary Prefabs { get; set; } = new Dictionary(); public List SpawnPoints { get; set; } = new List(); } public struct SimpleVec3 { public float X { get; set; } public float Y { get; set; } public float Z { get; set; } public SimpleVec3(float3 v) { //IL_0002: 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) //IL_001c: Unknown result type (might be due to invalid IL or missing references) X = v.x; Y = v.y; Z = v.z; } public float3 ToFloat3() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new float3(X, Y, Z); } } internal static class WhitelistPrefabs { private static readonly Dictionary AllowedPrefabs = new Dictionary { { 2138173476, "CHAR_ArchMage_FlameSphere" }, { -2013903325, "CHAR_ArchMage_VBlood" }, { 692079022, "CHAR_Arena_HealthOrb" }, { -1128238456, "CHAR_Bandit_Bomber" }, { 1896428751, "CHAR_Bandit_Bomber_VBlood" }, { 1854211210, "CHAR_Bandit_Chaosarrow_GateBoss_Minor" }, { 763273073, "CHAR_Bandit_Chaosarrow_VBlood" }, { -1030822544, "CHAR_Bandit_Deadeye" }, { -2122682556, "CHAR_Bandit_Fisherman_VBlood" }, { 2122229952, "CHAR_Bandit_Foreman_VBlood" }, { 17609984, "CHAR_Bandit_Foreman_VBlood_GateBoss_Minor" }, { 1124739990, "CHAR_Bandit_Frostarrow_VBlood" }, { -1301144178, "CHAR_Bandit_Hunter" }, { 343676339, "CHAR_Bandit_Hunter_MicroPOI_Cocoon" }, { 2057508774, "CHAR_Bandit_Mugger" }, { 1069072707, "CHAR_Bandit_Prisoner_Villager_Female" }, { 286320185, "CHAR_Bandit_Prisoner_Villager_Male" }, { -1194643220, "CHAR_Bandit_Rascal" }, { 1220569089, "CHAR_Bandit_Scout" }, { -309264723, "CHAR_Bandit_Stalker" }, { 1106149033, "CHAR_Bandit_Stalker_VBlood" }, { -2025101517, "CHAR_Bandit_StoneBreaker_VBlood" }, { -1420322422, "CHAR_Bandit_StoneBreaker_VBlood_GateBoss_Minor" }, { 923140362, "CHAR_Bandit_Thief" }, { -301730941, "CHAR_Bandit_Thug" }, { -198252716, "CHAR_Bandit_Thug_MicroPOI_Cocoon" }, { 478580792, "CHAR_Bandit_Tourok_GateBoss_Minor" }, { -1659822956, "CHAR_Bandit_Tourok_VBlood" }, { -589412777, "CHAR_Bandit_Trapper" }, { -1554428547, "CHAR_Bandit_Wolf" }, { 1743532914, "CHAR_Bandit_Worker_Gatherer" }, { -2039670689, "CHAR_Bandit_Worker_Miner" }, { 1309418594, "CHAR_Bandit_Worker_Woodcutter" }, { 1112948824, "CHAR_BatVampire_VBlood" }, { 326501064, "CHAR_Blackfang_Alchemist" }, { -1669199769, "CHAR_Blackfang_CarverBoss_VBlood" }, { 1209580976, "CHAR_Blackfang_DartFlinger" }, { -1383529374, "CHAR_Blackfang_Livith_VBlood" }, { 1295855316, "CHAR_Blackfang_Lucie_VBlood" }, { -1733829912, "CHAR_Blackfang_Lurker" }, { 591725925, "CHAR_Blackfang_Morgana_VBlood" }, { -1562098554, "CHAR_Blackfang_Peon" }, { -699233841, "CHAR_Blackfang_Peon_Miner" }, { 1924724671, "CHAR_Blackfang_PeonCarryingBarrel" }, { 1451256919, "CHAR_Blackfang_PeonLogCarryer" }, { 1531777139, "CHAR_Blackfang_Sentinel" }, { 761646020, "CHAR_Blackfang_Striker" }, { 173259239, "CHAR_Blackfang_Valyr_VBlood" }, { 1439742793, "CHAR_Blackfang_ValyrCauldron" }, { 1864177126, "CHAR_Blackfang_Venomblade" }, { -436956599, "CHAR_Blackfang_Viper" }, { -1508046438, "CHAR_Blackfang_WoodCarver" }, { -625375348, "CHAR_Blackfang_WoodCarver_Worshipper" }, { 1900336326, "CHAR_Carriage_BanditAnimal" }, { 1866779672, "CHAR_Carriage_BanditCopper" }, { -364183632, "CHAR_Carriage_BanditPlank" }, { -1190354298, "CHAR_Carriage_BanditPrisoners" }, { 855721879, "CHAR_Carriage_BanditSulfur" }, { -1395711815, "CHAR_Carriage_BlackfangBastion" }, { -2075236675, "CHAR_Carriage_BlackfangSouth" }, { -84975023, "CHAR_Carriage_ChuchGrape" }, { -1048977650, "CHAR_Carriage_ChuchSilver" }, { 177376927, "CHAR_Carriage_ChurchLegion" }, { 400170781, "CHAR_Carriage_ChurchMutants" }, { 213173421, "CHAR_Carriage_MilitiaCotton" }, { 769065062, "CHAR_Carriage_MilitiaIron" }, { -75106506, "CHAR_Carriage_MilitiaQuartz" }, { -799718518, "CHAR_CarriageHorse_BanditAnimal" }, { -443327719, "CHAR_CarriageHorse_BanditCopper" }, { -1859852856, "CHAR_CarriageHorse_BanditPlank" }, { -1761137820, "CHAR_CarriageHorse_BanditPrisoners" }, { -1193126567, "CHAR_CarriageHorse_BanditSulfur" }, { 731857280, "CHAR_CarriageHorse_BlackfangBastion" }, { 96544496, "CHAR_CarriageHorse_BlackfangSouth" }, { 803219139, "CHAR_CarriageHorse_ChuchGrape" }, { -1588337666, "CHAR_CarriageHorse_ChuchSilver" }, { 452018442, "CHAR_CarriageHorse_ChurchLegion" }, { -1666526529, "CHAR_CarriageHorse_ChurchMutants" }, { -755774482, "CHAR_CarriageHorse_MilitiaCotton" }, { 1510247015, "CHAR_CarriageHorse_MilitiaIron" }, { 374565592, "CHAR_CarriageHorse_MilitiaQuartz" }, { 426583055, "CHAR_ChurchOfLight_Archer" }, { 114912615, "CHAR_ChurchOfLight_Cardinal_VBlood" }, { 1745498602, "CHAR_ChurchOfLight_CardinalAide" }, { -1464869978, "CHAR_ChurchOfLight_Cleric" }, { -1449314709, "CHAR_ChurchOfLight_EnchantedCross" }, { 2128996433, "CHAR_ChurchOfLight_Footman" }, { -930333806, "CHAR_ChurchOfLight_Knight_2H" }, { 794228023, "CHAR_ChurchOfLight_Knight_Shield" }, { 1185952775, "CHAR_ChurchOfLight_Lightweaver" }, { 924132254, "CHAR_ChurchOfLight_Miner_Standard" }, { -26105228, "CHAR_ChurchOfLight_Overseer_VBlood" }, { 1728773109, "CHAR_ChurchOfLight_Paladin" }, { -740796338, "CHAR_ChurchOfLight_Paladin_VBlood" }, { 1406393857, "CHAR_ChurchOfLight_Priest" }, { 1148936156, "CHAR_ChurchOfLight_Rifleman" }, { 891705701, "CHAR_ChurchOfLight_SlaveMaster_Enforcer" }, { -240536861, "CHAR_ChurchOfLight_SlaveMaster_Sentry" }, { -1875351031, "CHAR_ChurchOfLight_SlaveRuffian" }, { -1387838833, "CHAR_ChurchOfLight_SlaveRuffian_Cover" }, { 1917502536, "CHAR_ChurchOfLight_SmiteOrb" }, { 192051202, "CHAR_ChurchOfLight_Sommelier_VBlood" }, { -1224027101, "CHAR_ChurchOfLight_Villager_Female" }, { -2025921616, "CHAR_ChurchOfLight_Villager_Male" }, { 1107541186, "CHAR_CopperGolem" }, { -1697944553, "CHAR_Corrupted_Bear_Standard" }, { 1029047051, "CHAR_Corrupted_Crow" }, { 1780171587, "CHAR_Corrupted_Deer" }, { 616274140, "CHAR_Corrupted_Wolf" }, { -575831311, "CHAR_CreatureDeer_Mutated" }, { 1570140219, "CHAR_CreatureMoose_Mutated" }, { -2072914343, "CHAR_Critter_Rat" }, { -1587402408, "CHAR_Critter_Silkworm" }, { -372256748, "CHAR_Critter_VerminNest_Rat" }, { 2055824593, "CHAR_Cultist_Pyromancer" }, { 1807491570, "CHAR_Cultist_Slicer" }, { 1105583702, "CHAR_Cursed_Bear_Spirit" }, { -559819989, "CHAR_Cursed_Bear_Standard" }, { 575918722, "CHAR_Cursed_MonsterToad" }, { -744966291, "CHAR_Cursed_Mosquito" }, { -935560085, "CHAR_Cursed_MountainBeast_SpiritDouble" }, { -1936575244, "CHAR_Cursed_MountainBeast_VBlood" }, { -2046268156, "CHAR_Cursed_Nightlurker" }, { -203043163, "CHAR_Cursed_ToadKing_VBlood" }, { 1478790879, "CHAR_Cursed_ToadSpitter" }, { -56441915, "CHAR_Cursed_Witch" }, { -1399273168, "CHAR_Cursed_Witch_Exploding_Mosquito" }, { -54072010, "CHAR_Cursed_Witch_NetherDemon" }, { -910296704, "CHAR_Cursed_Witch_VBlood" }, { -218175217, "CHAR_Cursed_Wolf" }, { 407089231, "CHAR_Cursed_Wolf_Spirit" }, { 658578725, "CHAR_Cursed_WormTerror" }, { 1406266284, "CHAR_Dracula_BloodSoul" }, { 55100532, "CHAR_Dracula_BloodSoul_Heart" }, { -2092104425, "CHAR_Dracula_ShadowBatSwarm" }, { 32692466, "CHAR_Dracula_SpellStone_LargeBlood" }, { -1388651766, "CHAR_EmeryElemental" }, { 1787640747, "CHAR_EmeryGolem" }, { -578677530, "CHAR_Farmland_Wolf" }, { 721166952, "CHAR_Farmlands_Cow" }, { -1342764880, "CHAR_Farmlands_Farmer" }, { 729746981, "CHAR_Farmlands_HostileVillager_Female_FryingPan" }, { 1576267559, "CHAR_Farmlands_HostileVillager_Female_Pitchfork" }, { -164116132, "CHAR_Farmlands_HostileVillager_Male_Club" }, { -864975423, "CHAR_Farmlands_HostileVillager_Male_Shovel" }, { -81727312, "CHAR_Farmlands_HostileVillager_Male_Torch" }, { -1353870145, "CHAR_Farmlands_HostileVillager_Male_Unarmed" }, { -951976780, "CHAR_Farmlands_HostileVillager_Werewolf" }, { -1356006948, "CHAR_Farmlands_Pig" }, { 947731555, "CHAR_Farmlands_Ram" }, { 1012307512, "CHAR_Farmlands_Sheep" }, { 1635167941, "CHAR_Farmlands_SheepOld" }, { 1420480270, "CHAR_Farmlands_SmallPig" }, { 525027204, "CHAR_Farmlands_Villager_Female" }, { 1772642154, "CHAR_Farmlands_Villager_Female_Sister" }, { 1887807944, "CHAR_Farmlands_Villager_Male" }, { -893091615, "CHAR_Farmlands_Woodcutter_Standard" }, { 2097040330, "CHAR_Forest_AngryMoose" }, { -1391546313, "CHAR_Forest_Bear_Dire_Vblood" }, { 1043643344, "CHAR_Forest_Bear_Standard" }, { -2002658567, "CHAR_Forest_Crow" }, { 1897056612, "CHAR_Forest_Deer" }, { 1696014952, "CHAR_Forest_Deer_StayCloseToSpawn" }, { -831097925, "CHAR_Forest_Moose" }, { -1418430647, "CHAR_Forest_Wolf" }, { -1905691330, "CHAR_Forest_Wolf_VBlood" }, { 1318855899, "CHAR_Frostarrow_GateBoss_Minor" }, { -1084690188, "CHAR_GateBoss_Pixie" }, { -1065970933, "CHAR_Geomancer_Human_VBlood" }, { 1756241788, "CHAR_Gloomrot_AceIncinerator" }, { -1707267769, "CHAR_Gloomrot_Batoon" }, { 172235178, "CHAR_Gloomrot_Iva_VBlood" }, { 1233988687, "CHAR_Gloomrot_Monster_VBlood" }, { 106480588, "CHAR_Gloomrot_Purifier_VBlood" }, { -440174408, "CHAR_Gloomrot_Purifier_VBlood_GateBoss_Major" }, { -322293503, "CHAR_Gloomrot_Pyro" }, { 1732477970, "CHAR_Gloomrot_Railgunner" }, { 2054432370, "CHAR_Gloomrot_RailgunSergeant_VBlood" }, { 1401026468, "CHAR_Gloomrot_SentryOfficer" }, { -1082044089, "CHAR_Gloomrot_SentryTurret" }, { 709450349, "CHAR_Gloomrot_SpiderTank_Driller" }, { -884401089, "CHAR_Gloomrot_SpiderTank_Gattler" }, { 1655577903, "CHAR_Gloomrot_SpiderTank_LightningRod" }, { -2018710724, "CHAR_Gloomrot_SpiderTank_Zapper" }, { 674807351, "CHAR_Gloomrot_Tazer" }, { 820492683, "CHAR_Gloomrot_Technician" }, { -825299465, "CHAR_Gloomrot_Technician_Labworker" }, { 814083983, "CHAR_Gloomrot_TheProfessor_VBlood" }, { -293507834, "CHAR_Gloomrot_TractorBeamer" }, { 1216169364, "CHAR_Gloomrot_Villager_Female" }, { -732208863, "CHAR_Gloomrot_Villager_Male" }, { -1101874342, "CHAR_Gloomrot_Voltage_VBlood" }, { -427888732, "CHAR_Gloomrot_Voltage_VBlood_GateBoss_Major" }, { 192241915, "CHAR_GoldGolem" }, { -221278041, "CHAR_Graveyard_Crow" }, { -1846851895, "CHAR_Harpy_Dasher" }, { -1407234470, "CHAR_Harpy_FeatherDuster" }, { 685266977, "CHAR_Harpy_Matriarch_VBlood" }, { 1462269123, "CHAR_Harpy_Scratcher" }, { 1224283123, "CHAR_Harpy_Sorceress" }, { 1405099312, "CHAR_Harpy_Sorceress_NetherDemon" }, { 302393064, "CHAR_IceElemental" }, { 763796308, "CHAR_IronGolem" }, { -1794508086, "CHAR_IronGolem_NetherDemon" }, { -1076780215, "CHAR_Legion_Assassin" }, { 593505050, "CHAR_Legion_BatSwarm" }, { -1055380229, "CHAR_Legion_BatSwarm_Lesser" }, { 1912966420, "CHAR_Legion_BloodProphet" }, { -2080231735, "CHAR_Legion_BloodProphet_Lesser" }, { 981369753, "CHAR_Legion_Dreadhorn" }, { -1140588645, "CHAR_Legion_DreadHorn_Lesser" }, { -65981941, "CHAR_Legion_Gargoyle" }, { 280858720, "CHAR_Legion_Gargoyle_StatueSpawn" }, { -392776091, "CHAR_Legion_Gargoyle_Styx" }, { -669027288, "CHAR_Legion_Guardian_DraculaMinion" }, { 1144208724, "CHAR_Legion_Guardian_DraculaMinion_Lesser" }, { -1266036232, "CHAR_Legion_HighLord_GroundSword" }, { -494298686, "CHAR_Legion_NightMaiden" }, { 2111003460, "CHAR_Legion_NightMaiden_Lesser" }, { -1009917656, "CHAR_Legion_Nightmare" }, { -981051151, "CHAR_Legion_Nightmare_Lesser" }, { 1980594081, "CHAR_Legion_Shadowkin" }, { -1200074387, "CHAR_Legion_Shadowkin_Lesser" }, { -653348998, "CHAR_Legion_Vargulf" }, { 2049379982, "CHAR_Legion_Vargulf_Lesser" }, { -1252779334, "CHAR_Manticore_Airborne" }, { -767167590, "CHAR_Manticore_FarbaneSuprise" }, { -393555055, "CHAR_Manticore_VBlood" }, { 1527640414, "CHAR_Mantrap_Corrupted" }, { -1915060856, "CHAR_Mantrap_Corrupted_XL" }, { -878541676, "CHAR_Mantrap_Dull" }, { 2016963774, "CHAR_Mantrap_Nest" }, { 173817657, "CHAR_Mantrap_Standard" }, { -1670130821, "CHAR_Militia_BellRinger" }, { -680831417, "CHAR_Militia_BishopOfDunley_VBlood" }, { 847893333, "CHAR_Militia_Bomber" }, { 85290673, "CHAR_Militia_ConstrainingPole" }, { 956965183, "CHAR_Militia_Crossbow" }, { 1660801216, "CHAR_Militia_Devoted" }, { -1254618756, "CHAR_Militia_EyeOfGod" }, { 619948378, "CHAR_Militia_Fabian_VBlood" }, { 826666431, "CHAR_Militia_FabiansSteed" }, { 910988233, "CHAR_Militia_Glassblower_VBlood" }, { 1730498275, "CHAR_Militia_Guard" }, { -29797003, "CHAR_Militia_Guard_VBlood" }, { 1494126678, "CHAR_Militia_Guard_VBlood_GateBoss_Minor" }, { 2005508157, "CHAR_Militia_Heavy" }, { -235172198, "CHAR_Militia_Horseman" }, { -1914181232, "CHAR_Militia_Horseman_Mount" }, { -249647316, "CHAR_Militia_Hound" }, { -1373413273, "CHAR_Militia_Hound_VBlood" }, { -784265984, "CHAR_Militia_HoundMaster_VBlood" }, { 2090982759, "CHAR_Militia_InkCrawler" }, { 1688478381, "CHAR_Militia_Leader_VBlood" }, { 1990744594, "CHAR_Militia_Leader_VBlood_GateBoss_Major" }, { -63435588, "CHAR_Militia_Light" }, { 203103783, "CHAR_Militia_Longbowman" }, { 850622034, "CHAR_Militia_Longbowman_LightArrow_Vblood" }, { -1072754152, "CHAR_Militia_Miner_Standard" }, { -700632469, "CHAR_Militia_Nun" }, { -99012450, "CHAR_Militia_Nun_VBlood" }, { -1719333743, "CHAR_Militia_Rider" }, { 1945956671, "CHAR_Militia_Scribe_VBlood" }, { 37713289, "CHAR_Militia_Torchbearer" }, { -614820237, "CHAR_Militia_Undead_Infiltrator" }, { -1977168943, "CHAR_Monster_LightningPillar" }, { 1149585723, "CHAR_Mount_Horse" }, { 1938756250, "CHAR_Mutant_Bear_Standard" }, { 823276204, "CHAR_Mutant_FleshGolem" }, { -1025552087, "CHAR_Mutant_FleshGolem_PrisonVariant" }, { -375581934, "CHAR_Mutant_RatHorror" }, { 1092792896, "CHAR_Mutant_Spitter" }, { 572729167, "CHAR_Mutant_Wolf" }, { 1239832946, "CHAR_Noctem_Crow" }, { 1786690263, "CHAR_Ocean_Blowfish" }, { 470753758, "CHAR_Ocean_Piranha" }, { -1737346940, "CHAR_Paladin_DivineAngel" }, { -76116724, "CHAR_Paladin_FallenAngel" }, { 1434914085, "CHAR_Pixie" }, { -484556888, "CHAR_Poloma_VBlood" }, { -1381375644, "CHAR_Poloma_VBlood_GateBoss_Minor" }, { 218843465, "CHAR_RatHorror_Mutant_MutantBlood" }, { 20817667, "CHAR_RockElemental" }, { 577495705, "CHAR_RockElemental_NetherDemon" }, { -1750347680, "CHAR_Scarecrow" }, { -371347062, "CHAR_SeaSerpent" }, { -694393029, "CHAR_SeaSerpent_Hard" }, { -764515001, "CHAR_Spider_Baneling" }, { 342127250, "CHAR_Spider_Broodmother" }, { -581295882, "CHAR_Spider_Forest" }, { 574276383, "CHAR_Spider_Forestling" }, { 2136899683, "CHAR_Spider_Melee" }, { -548489519, "CHAR_Spider_Queen_VBlood" }, { -943858353, "CHAR_Spider_Queen_VBlood_GateBoss_Major" }, { 2103131615, "CHAR_Spider_Range" }, { 1078424589, "CHAR_Spider_Spiderling" }, { 1767714956, "CHAR_Spider_Spiderling_VerminNest" }, { -779411607, "CHAR_StoneGolem" }, { -1089337069, "CHAR_Treant" }, { 1496810447, "CHAR_Treant_Corrupted" }, { -2037006512, "CHAR_Treant_NetherDemon" }, { -753453016, "CHAR_Undead_ArenaChampion_VBlood" }, { -861407720, "CHAR_Undead_ArmoredSkeletonCrossbow_Dunley" }, { -195077008, "CHAR_Undead_ArmoredSkeletonCrossbow_Farbane" }, { -1365627158, "CHAR_Undead_Assassin" }, { 577478542, "CHAR_Undead_BishopOfDeath_VBlood" }, { -1822337177, "CHAR_Undead_BishopOfDeath_VBlood_GateBoss_Minor" }, { 939467639, "CHAR_Undead_BishopOfShadows_VBlood" }, { -1805216630, "CHAR_Undead_BishopOfShadows_VBlood_GateBoss_Major" }, { 1971653132, "CHAR_Undead_CursedSmith_FloatingWeapon_Axe" }, { -1099451233, "CHAR_Undead_CursedSmith_FloatingWeapon_Base" }, { -55245645, "CHAR_Undead_CursedSmith_FloatingWeapon_Mace" }, { 769910415, "CHAR_Undead_CursedSmith_FloatingWeapon_Slashers" }, { 233127264, "CHAR_Undead_CursedSmith_FloatingWeapon_Spear" }, { -2020619708, "CHAR_Undead_CursedSmith_FloatingWeapon_Sword" }, { 326378955, "CHAR_Undead_CursedSmith_VBlood" }, { -236166535, "CHAR_Undead_FlyingSkull" }, { 849891426, "CHAR_Undead_GhostAssassin" }, { -1146194149, "CHAR_Undead_GhostBanshee" }, { -458883491, "CHAR_Undead_GhostGuardian" }, { -85729652, "CHAR_Undead_GhostMilitia_Crossbow" }, { -1618703048, "CHAR_Undead_GhostMilitia_Light" }, { 2105565286, "CHAR_Undead_Ghoul_Armored_Farmlands" }, { -1967480038, "CHAR_Undead_Guardian" }, { -558928562, "CHAR_Undead_Infiltrator_AfterShadow" }, { 613251918, "CHAR_Undead_Infiltrator_VBlood" }, { -982850914, "CHAR_Undead_Infiltrator_VBlood_GateBoss_Major" }, { -1365931036, "CHAR_Undead_Leader_Vblood" }, { -989493184, "CHAR_Undead_Leader_Vblood_GateBoss_Minor" }, { -572568236, "CHAR_Undead_Necromancer" }, { -1653554504, "CHAR_Undead_Priest" }, { 153390636, "CHAR_Undead_Priest_VBlood" }, { -1722506709, "CHAR_Undead_RottingGhoul" }, { 678628353, "CHAR_Undead_ShadowSoldier" }, { -361904832, "CHAR_Undead_ShadowSoldier_GateBoss" }, { -1789347076, "CHAR_Undead_SkeletonApprentice" }, { 597386568, "CHAR_Undead_SkeletonCrossbow_Base" }, { 1250474035, "CHAR_Undead_SkeletonCrossbow_Farbane_OLD" }, { 1395549638, "CHAR_Undead_SkeletonCrossbow_Graveyard" }, { -1380216646, "CHAR_Undead_SkeletonGolem" }, { -1115032717, "CHAR_Undead_SkeletonGolem_NetherDemon" }, { -1287507270, "CHAR_Undead_SkeletonMage" }, { 952695804, "CHAR_Undead_SkeletonSoldier_Armored_Dunley" }, { -837329073, "CHAR_Undead_SkeletonSoldier_Armored_Farbane" }, { -603934060, "CHAR_Undead_SkeletonSoldier_Base" }, { -1642110920, "CHAR_Undead_SkeletonSoldier_Infiltrator" }, { -1584807109, "CHAR_Undead_SkeletonSoldier_Withered" }, { 1640311129, "CHAR_Undead_UndyingGhoul" }, { 128488545, "CHAR_Undead_ZealousCultist_Ghost" }, { -1208888966, "CHAR_Undead_ZealousCultist_VBlood" }, { -1189707552, "CHAR_Undead_ZealousCultist_VBlood_GateBoss_Major" }, { 1857865401, "CHAR_Unholy_DeathKnight" }, { -1928607398, "CHAR_Unholy_FallenAngel" }, { 834333879, "CHAR_Unholy_UnstableArachnid" }, { -1106602776, "CHAR_Unholy_UnstableArachnid_Small" }, { 495971434, "CHAR_Vampire_BloodKnight_VBlood" }, { -1884553416, "CHAR_Vampire_CrimsonIronMaiden" }, { -1671572471, "CHAR_Vampire_Cultist_BloodCrystal" }, { -1208066429, "CHAR_Vampire_Cultist_BloodCrystal_Female" }, { 407967118, "CHAR_Vampire_Cultist_Channeling" }, { 57255106, "CHAR_Vampire_Cultist_Channeling_Female" }, { 2018586909, "CHAR_Vampire_Cultist_Patrolling" }, { -1610391169, "CHAR_Vampire_Cultist_Patrolling_Female" }, { -1438710930, "CHAR_Vampire_Cultist_PrayingArmsOut" }, { -1074322242, "CHAR_Vampire_Cultist_PrayingArmsOut_Female" }, { -1832935107, "CHAR_Vampire_Cultist_PrayingGround" }, { -2086433846, "CHAR_Vampire_Cultist_PrayingGround_Female" }, { -19416663, "CHAR_Vampire_Cultist_Whittling" }, { -1925881340, "CHAR_Vampire_Cultist_Whittling_Female" }, { -327335305, "CHAR_Vampire_Dracula_VBlood" }, { 1809382006, "CHAR_Vampire_Dracula_VeilOfBatsIllusion" }, { -496360395, "CHAR_Vampire_HighLord_VBlood" }, { 795262842, "CHAR_Vampire_IceRanger_VBlood" }, { -1117581429, "CHAR_Vampire_Withered" }, { -2039908510, "CHAR_Vermin_DireRat_VBlood" }, { -1722278689, "CHAR_Vermin_GiantRat" }, { -19165577, "CHAR_Vermin_WickedRat_Rare" }, { 336560131, "CHAR_VHunter_CastleMan" }, { -1968372384, "CHAR_VHunter_Jade_VBlood" }, { 282791819, "CHAR_VHunter_Jade_VBlood_GateBoss_Major" }, { 2009018555, "CHAR_VHunter_Leader_GateBoss_Minor" }, { -1449631170, "CHAR_VHunter_Leader_VBlood" }, { 109969450, "CHAR_Villager_CursedWanderer_VBlood" }, { -1160778038, "CHAR_Villager_CursedWanderer_VBlood_GateBoss_Major" }, { -1942352521, "CHAR_Villager_Tailor_VBlood" }, { 468179469, "CHAR_Wendigo_GateBoss_Major" }, { 24378719, "CHAR_Wendigo_VBlood" }, { -1505705712, "CHAR_WerewolfChieftain_Human" }, { -1699898875, "CHAR_WerewolfChieftain_ShadowClone" }, { 2079933370, "CHAR_WerewolfChieftain_VBlood_GateBoss_Major" }, { 2041915372, "CHAR_Winter_Bear_Standard" }, { -779632831, "CHAR_Winter_Moose" }, { 134039094, "CHAR_Winter_Wolf" }, { -1347412392, "CHAR_Winter_Yeti_VBlood" }, { 666177656, "CHAR_Winter_Yeti_VBlood_GateBoss_Major" } }; public static bool IsAllowed(int guidHash) { return AllowedPrefabs.ContainsKey(guidHash); } public static string GetName(int guidHash) { if (AllowedPrefabs.TryGetValue(guidHash, out var value)) { return value; } return "Unknown_Prefab"; } public static bool TryGetHash(string input, out int guidHash) { if (int.TryParse(input, out guidHash)) { return AllowedPrefabs.ContainsKey(guidHash); } foreach (KeyValuePair allowedPrefab in AllowedPrefabs) { if (string.Equals(allowedPrefab.Value, input, StringComparison.OrdinalIgnoreCase) || string.Equals(allowedPrefab.Value.Substring(5), input, StringComparison.OrdinalIgnoreCase)) { guidHash = allowedPrefab.Key; return true; } } guidHash = 0; return false; } } } namespace NPCs.Commands { [CommandGroup("npc", null)] internal static class NpcCommands { [Command("addteam", "at", null, "Add a new team or add/update a prefab in an existing team.", null, true)] public static void AddTeam(ChatCommandContext ctx, string teamName, string prefab, int amount) { if (!WhitelistPrefabs.TryGetHash(prefab, out var guidHash)) { ctx.Reply("Prefab " + prefab + " is invalid or not allowed!"); return; } bool flag = false; if (!NpcService.Teams.TryGetValue(teamName, out var value)) { value = new TeamConfig { RandomAround = 5f }; NpcService.Teams[teamName] = value; flag = true; } TeamConfig teamConfig = value; if (teamConfig.Prefabs == null) { Dictionary dictionary2 = (teamConfig.Prefabs = new Dictionary()); } value.Prefabs[guidHash.ToString()] = amount; NpcService.Save(); string name = WhitelistPrefabs.GetName(guidHash); if (flag) { ctx.Reply($"Created team {teamName}. Added: {name} x{amount}"); } else { ctx.Reply($"Updated team {teamName}. Added/updated: {name} x{amount}"); } } [Command("removeteam", "rt", null, "Remove an entire team or a specific prefab from a team.", null, true)] public static void RemoveTeam(ChatCommandContext ctx, string teamName, string prefab = "") { if (NpcService.Teams.TryGetValue(teamName, out var value)) { if (string.IsNullOrEmpty(prefab)) { int num = NpcService.DespawnNpc(12f, teamName); NpcService.Teams.Remove(teamName); NpcService.Save(); ctx.Reply($"Removed team {teamName}. Despawned {num} {((num == 1) ? "NPC" : "NPCs")}."); return; } if (!WhitelistPrefabs.TryGetHash(prefab, out var guidHash)) { ctx.Reply("Prefab " + prefab + " is invalid or not allowed!"); return; } string text = guidHash.ToString(); string name = WhitelistPrefabs.GetName(guidHash); if (value.Prefabs != null && value.Prefabs.ContainsKey(text)) { int num2 = NpcService.DespawnNpc(12f, teamName, text); value.Prefabs.Remove(text); NpcService.Save(); ctx.Reply($"Removed: {name} from team {teamName}. Despawned {num2} {((num2 == 1) ? "NPC" : "NPCs")}."); } else { ctx.Reply($"{name} not found in team {teamName}!"); } } else { ctx.Reply("Team " + teamName + " not found in the configuration!"); } } [Command("addpoint", "ap", null, "Add a spawn point for a specific team.", null, true)] public static void AddSpawnPoint(ChatCommandContext ctx, string teamName) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) if (!NpcService.Teams.TryGetValue(teamName, out var value)) { ctx.Reply("Team " + teamName + " not found in the configuration!"); return; } float3 value2 = ctx.Event.SenderCharacterEntity.Read().Value; TeamConfig teamConfig = value; if (teamConfig.SpawnPoints == null) { List list2 = (teamConfig.SpawnPoints = new List()); } value.SpawnPoints.Add(new SimpleVec3(value2)); NpcService.Save(); ctx.Reply("Added spawn point for " + teamName + "."); } [Command("removepoint", "rp", null, "Remove all spawn points for a specific team.", null, true)] public static void RemoveSpawnPoint(ChatCommandContext ctx, string teamName) { if (!NpcService.Teams.TryGetValue(teamName, out var value)) { ctx.Reply("Team " + teamName + " not found in the configuration!"); return; } if (value.SpawnPoints == null || value.SpawnPoints.Count == 0) { ctx.Reply("Team " + teamName + " has no spawn points to remove!"); return; } int num = NpcService.DespawnNpc(12f, teamName); int count = value.SpawnPoints.Count; value.SpawnPoints.Clear(); NpcService.Save(); ctx.Reply($"Removed {count} spawn points for {teamName}. Despawned {num} {((num == 1) ? "NPC" : "NPCs")}."); } [Command("manualspawn", "ms", null, "Manually spawn all NPCs.", null, true)] public static void Spawn(ChatCommandContext ctx) { //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_009b: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.ModEnabled.Value) { ctx.Reply("Mod: disabled!"); return; } if (NpcService.Teams == null || NpcService.Teams.Count == 0) { ctx.Reply("No teams found! Use .npc addteam "); return; } if (NpcService.Teams.Values.All((TeamConfig t) => t.SpawnPoints == null || t.SpawnPoints.Count == 0)) { ctx.Reply("No spawn points found! Use .npc addpoint "); return; } Entity senderCharacterEntity = ctx.Event.SenderCharacterEntity; NpcService.SpawnNpc(senderCharacterEntity); Core.Log.LogInfo((object)"[NPCs] Manual spawn initiated by admin."); ctx.Reply("NPCs manually spawned successfully."); } [Command("manualdespawn", "md", null, "Manually despawn all NPCs.", null, true)] public static void Despawn(ChatCommandContext ctx) { NpcService.DespawnNpc(); Core.Log.LogInfo((object)"[NPCs] Manual despawn initiated by admin."); ctx.Reply("NPCs manually despawned successfully."); } [Command("config", "c", null, "Display the general mod configuration.", null, true)] public static void Config(ChatCommandContext ctx) { StringBuilder stringBuilder = new StringBuilder(); string value = (Plugin.ModEnabled.Value ? "enabled" : "disabled"); string value2 = (Plugin.BroadcastEnable.Value ? "enabled" : "disabled"); string value3 = Regex.Replace(Plugin.BroadcastMessage.Value, "<.*?>", string.Empty); TimeSpan timeSpan = NpcService.NextSpawnLocal - DateTime.Now; if (timeSpan.TotalSeconds < 0.0) { timeSpan = TimeSpan.Zero; } string value4 = NpcService.NextSpawnLocal.ToString("HH:mm:ss"); string value5 = $"{timeSpan.Minutes}m {timeSpan.Seconds}s"; string value6 = $"XX:{Plugin.HourlySpawnAtMinute.Value:D2}:{Plugin.HourlySpawnAtSecond.Value:D2}"; stringBuilder.AppendLine("NPCs Configuration"); StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2); handler.AppendLiteral("Mod: "); handler.AppendFormatted(value); stringBuilder3.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(11, 1, stringBuilder2); handler.AppendLiteral("Broadcast: "); handler.AppendFormatted(value2); stringBuilder4.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder5 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(9, 1, stringBuilder2); handler.AppendLiteral("Message: "); handler.AppendFormatted(value3); stringBuilder5.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder6 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(36, 3, stringBuilder2); handler.AppendLiteral("Spawn schedule: "); handler.AppendFormatted(value6); handler.AppendLiteral(", Next spawn: "); handler.AppendFormatted(value4); handler.AppendLiteral(" (in "); handler.AppendFormatted(value5); handler.AppendLiteral(")"); stringBuilder6.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder7 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(11, 1, stringBuilder2); handler.AppendLiteral("Lifetime: "); handler.AppendFormatted(Plugin.LifetimeSeconds.Value); handler.AppendLiteral("s"); stringBuilder7.AppendLine(ref handler); ctx.Reply(stringBuilder.ToString().TrimEnd()); } [Command("team", "t", null, "List all NPC teams and their detailed settings.", null, true)] public static void List(ChatCommandContext ctx, string teamName = "") { Dictionary teams = NpcService.Teams; if (teams == null || teams.Count == 0) { ctx.Reply("NPC teams\nNo teams configured. Use .npc addteam "); return; } StringBuilder stringBuilder = new StringBuilder(); if (!string.IsNullOrEmpty(teamName) && teams.TryGetValue(teamName, out var value)) { int value2 = value.SpawnPoints?.Count ?? 0; float randomAround = value.RandomAround; StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(27, 3, stringBuilder2); handler.AppendLiteral("["); handler.AppendFormatted(teamName); handler.AppendLiteral("] radius: "); handler.AppendFormatted(randomAround); handler.AppendLiteral(", spawn points: "); handler.AppendFormatted(value2); stringBuilder3.AppendLine(ref handler); if (value.Prefabs != null && value.Prefabs.Count > 0) { foreach (KeyValuePair prefab in value.Prefabs) { string key = prefab.Key; int value3 = prefab.Value; string value4 = key; if (int.TryParse(key, out var result)) { value4 = WhitelistPrefabs.GetName(result); } stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(2, 2, stringBuilder2); handler.AppendFormatted(value4); handler.AppendLiteral(" x"); handler.AppendFormatted(value3); stringBuilder4.AppendLine(ref handler); } } } else { stringBuilder.AppendLine("NPC teams"); foreach (KeyValuePair item in teams) { string key2 = item.Key; TeamConfig value5 = item.Value; int value6 = value5.SpawnPoints?.Count ?? 0; float randomAround2 = value5.RandomAround; StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder5 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(27, 3, stringBuilder2); handler.AppendLiteral("["); handler.AppendFormatted(key2); handler.AppendLiteral("] radius: "); handler.AppendFormatted(randomAround2); handler.AppendLiteral(", spawn points: "); handler.AppendFormatted(value6); stringBuilder5.AppendLine(ref handler); } } ctx.Reply(stringBuilder.ToString().TrimEnd()); } [Command("reload", "rl", null, "Reload npc_teams.json and NPCs.cfg", null, true)] public static void Reload(ChatCommandContext ctx) { NpcService.Reload(); ctx.Reply("Configs reloaded."); } } }