Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of NeckTamingMod v1.0.0
plugins/NeckTamingMod.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("NeckTamingMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("NeckTamingMod")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("934d3332-9f81-4421-88b8-3fc11f6c15dc")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace NeckTamingMod; [BepInPlugin("com.yourname.necktaming", "Neck Taming Mod", "1.0.0")] public class NeckTamingMod : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__38_0; public static ConsoleEvent <>9__38_1; public static ConsoleEvent <>9__38_4; public static ConsoleEvent <>9__38_5; internal void <RegisterConsoleCommandsDirectly>b__38_0(ConsoleEventArgs args) { //IL_0033: 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_004c: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_007f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer == (Object)null) { args.Context.AddString("Ошибка: игрок не найден!"); return; } try { Vector3 val = ((Component)Player.m_localPlayer).transform.position + ((Component)Player.m_localPlayer).transform.forward * 3f + Vector3.up; GameObject prefab = ZNetScene.instance.GetPrefab("Neck"); if ((Object)(object)prefab != (Object)null) { GameObject neck = Object.Instantiate<GameObject>(prefab, val, Quaternion.identity); MakeBabyNeck(neck); args.Context.AddString("Никсёнок создан!"); } else { args.Context.AddString("Ошибка: префаб никса не найден!"); } } catch (Exception ex) { Debug.LogError((object)$"Ошибка создания никсёнка: {ex}"); args.Context.AddString("Ошибка: " + ex.Message); } } internal void <RegisterConsoleCommandsDirectly>b__38_1(ConsoleEventArgs args) { List<MonsterAI> list = FindAllNecks(); int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; foreach (MonsterAI item in list) { if ((Object)(object)item == (Object)null) { continue; } num++; bool flag = IsNeckTamed(item); bool flag2 = IsBabyNeck(((Component)item).gameObject); if (flag) { num2++; if (flag2) { num3++; num5++; } else if (NeckBreedingSystem.CanBreed(item)) { num6++; } } else { num4++; } } args.Context.AddString($"Всего: {num}, Приручено: {num2}, Диких: {num4}"); args.Context.AddString($"Никсёнков: {num3} (растут: {num5})"); args.Context.AddString($"Взрослых готовых к размножению: {num6}"); int num7 = 1; foreach (MonsterAI item2 in list) { if ((Object)(object)item2 != (Object)null && IsBabyNeck(((Component)item2).gameObject)) { ZNetView component = ((Component)item2).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { float @float = component.GetZDO().GetFloat("neck_ageInDays", 0f); float float2 = component.GetZDO().GetFloat("neck_currentSize", 0.4f); float float3 = component.GetZDO().GetFloat("neck_growthProgress", 0f); long @long = component.GetZDO().GetLong("neck_bornTime", 0L); double num8 = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); double num9 = ((@long > 0) ? ((num8 - (double)@long) / 1800.0) : 0.0); double num10 = Math.Max(0.0, (double)GrowthDays.Value - num9); float num11 = float3 * 100f; args.Context.AddString($"Никсёнок {num7}: {num9:F2}/{GrowthDays.Value} дн. ({num11:F1}%) Размер: {float2:F2}"); num7++; } } } if (num3 == 0) { args.Context.AddString("Нет растущих никсёнков"); } } internal void <RegisterConsoleCommandsDirectly>b__38_4(ConsoleEventArgs args) { NeckBreedingSystem.UpdateBreeding(); args.Context.AddString("Система размножения никсов обновлена!"); } internal void <RegisterConsoleCommandsDirectly>b__38_5(ConsoleEventArgs args) { args.Context.AddString($"Система инициализирована: {_isInitialized}"); args.Context.AddString($"ZNet доступен: {(Object)(object)ZNet.instance != (Object)null}"); args.Context.AddString($"Серверный режим: {(Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()}"); List<MonsterAI> list = FindAllNecks(); args.Context.AddString($"Всего никсов в мире: {list.Count}"); int num = 0; foreach (MonsterAI item in list) { if ((Object)(object)item != (Object)null && IsBabyNeck(((Component)item).gameObject)) { num++; ZNetView component = ((Component)item).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { double num2 = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); long @long = component.GetZDO().GetLong("neck_bornTime", 0L); float num3 = ((@long > 0) ? ((float)((num2 - (double)@long) / 1800.0)) : 0f); float @float = component.GetZDO().GetFloat("neck_currentSize", 0.4f); float float2 = component.GetZDO().GetFloat("neck_growthProgress", 0f); args.Context.AddString($"Никсёнок: возраст {num3:F2} дн., размер {@float:F2}, прогресс {float2:P0}"); } } } args.Context.AddString($"Активных никсёнков: {num}"); } } [CompilerGenerated] private sealed class <BreedingUpdateRoutine>d__27 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public NeckTamingMod <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <BreedingUpdateRoutine>d__27(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; if (_isInitialized && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { NeckBreedingSystem.UpdateBreeding(); } break; } <>2__current = (object)new WaitForSeconds(60f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <DelayedInitialization>d__25 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public NeckTamingMod <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedInitialization>d__25(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; case 1: <>1__state = -1; if (!_isInitialized) { InitializeSystem(); } Debug.Log((object)"NeckTamingMod: Отложенная инициализация завершена"); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <GrowthUpdateRoutine>d__26 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public NeckTamingMod <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GrowthUpdateRoutine>d__26(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; if (_isInitialized && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { <>4__this.UpdateAllNeckGrowth(); } break; } <>2__current = (object)new WaitForSeconds(30f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private readonly Harmony _harmony = new Harmony("com.yourname.necktaming"); public static ConfigEntry<float> TameTime; public static ConfigEntry<float> FedDuration; public static ConfigEntry<string> ConsumableItems; public static ConfigEntry<float> GrowthDays; public static ConfigEntry<float> BreedChance; public static ConfigEntry<float> BreedCooldownDays; private static bool _isInitialized; private Coroutine _growthCoroutine; private Coroutine _breedingCoroutine; public const string ZDO_BABY = "neck_isBaby"; public const string ZDO_BORN_TIME = "neck_bornTime"; public const string ZDO_AGE_DAYS = "neck_ageInDays"; public const string ZDO_CURRENT_SIZE = "neck_currentSize"; public const string ZDO_GROWTH_COMPLETE = "neck_growthComplete"; public const string ZDO_GROWTH_PROGRESS = "neck_growthProgress"; public const string ZDO_NO_DROP = "neck_noDrop"; public const string ZDO_LAST_BREED_TIME = "neck_lastBreedTime"; public static NeckTamingMod Instance { get; private set; } private void Awake() { Instance = this; TameTime = ((BaseUnityPlugin)this).Config.Bind<float>("General", "TameTime", 1800f, "Время приручения никса в секундах (30 минут)"); FedDuration = ((BaseUnityPlugin)this).Config.Bind<float>("General", "FedDuration", 400f, "Время сытости никса в секундах"); ConsumableItems = ((BaseUnityPlugin)this).Config.Bind<string>("General", "ConsumableItems", "MeadTasty", "Предметы для приручения (через точку с запятой)"); GrowthDays = ((BaseUnityPlugin)this).Config.Bind<float>("Growth", "GrowthDays", 3f, "Количество игровых суток для роста никсёнка"); BreedChance = ((BaseUnityPlugin)this).Config.Bind<float>("Breeding", "BreedChance", 0.3f, "Шанс размножения при встрече (0-1)"); BreedCooldownDays = ((BaseUnityPlugin)this).Config.Bind<float>("Breeding", "BreedCooldownDays", 2f, "Количество дней между возможностями размножения"); RegisterConsoleCommandsDirectly(); try { _harmony.PatchAll(typeof(ZNetScenePatches)); _harmony.PatchAll(typeof(CharacterHoverPatches)); _harmony.PatchAll(typeof(TameablePatches)); _harmony.PatchAll(typeof(CharacterStatePatches)); _harmony.PatchAll(typeof(PlayerPatches)); _harmony.PatchAll(typeof(ZNetPatches)); _harmony.PatchAll(typeof(CharacterDeathPatches)); _harmony.PatchAll(typeof(MonsterAIPatches)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Neck Taming Mod v1.0.0 loaded successfully!"); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"Harmony patching completed with errors: {arg}"); } } private void Start() { _growthCoroutine = ((MonoBehaviour)this).StartCoroutine(GrowthUpdateRoutine()); _breedingCoroutine = ((MonoBehaviour)this).StartCoroutine(BreedingUpdateRoutine()); ((MonoBehaviour)this).StartCoroutine(DelayedInitialization()); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } if (_growthCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_growthCoroutine); } if (_breedingCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_breedingCoroutine); } } [IteratorStateMachine(typeof(<DelayedInitialization>d__25))] private IEnumerator DelayedInitialization() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedInitialization>d__25(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<GrowthUpdateRoutine>d__26))] private IEnumerator GrowthUpdateRoutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GrowthUpdateRoutine>d__26(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<BreedingUpdateRoutine>d__27))] private IEnumerator BreedingUpdateRoutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <BreedingUpdateRoutine>d__27(0) { <>4__this = this }; } public void UpdateAllNeckGrowth() { if ((Object)(object)ZNet.instance == (Object)null || !ZNet.instance.IsServer()) { return; } try { double timeSeconds = ZNet.instance.GetTimeSeconds(); List<MonsterAI> list = FindAllNecks(); int num = 0; foreach (MonsterAI item in list) { if ((Object)(object)item == (Object)null) { continue; } try { if (UpdateSingleNeckGrowth(((Component)item).gameObject, timeSeconds)) { num++; } } catch (Exception ex) { Debug.LogError((object)("Ошибка роста никса " + ((Object)((Component)item).gameObject).name + ": " + ex.Message)); } } if (num > 0) { Debug.Log((object)$"NeckTamingMod: Обновлен рост {num} никсов"); } } catch (Exception ex2) { Debug.LogError((object)("Ошибка в системе роста: " + ex2.Message)); } } private bool UpdateSingleNeckGrowth(GameObject neck, double currentTime) { ZNetView component = neck.GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return false; } bool @bool = component.GetZDO().GetBool("neck_isBaby", false); bool bool2 = component.GetZDO().GetBool("neck_growthComplete", false); if (!@bool || bool2) { return false; } long num = component.GetZDO().GetLong("neck_bornTime", 0L); if (num == 0) { num = (long)currentTime; component.GetZDO().Set("neck_bornTime", num); Debug.Log((object)$"NeckTamingMod: Установлено время рождения никсёнка: {currentTime}"); } double num2 = currentTime - (double)num; double num3 = num2 / 1800.0; component.GetZDO().Set("neck_ageInDays", (float)num3); float num4 = Mathf.Clamp01((float)num3 / GrowthDays.Value); float num5 = CalculateGrowthCurve(num4); float num6 = Mathf.Lerp(0.4f, 1f, num5); float @float = component.GetZDO().GetFloat("neck_currentSize", 0.4f); if (Mathf.Abs(num6 - @float) > 0.001f) { component.GetZDO().Set("neck_currentSize", num6); UpdateNeckSizeImmediate(neck, num6); float num7 = (num6 - 0.4f) / 0.6f; component.GetZDO().Set("neck_growthProgress", num7); Debug.Log((object)$"NeckTamingMod: Никсёнок растет: возраст {num3:F2}/{GrowthDays.Value} дней, размер {num6:F2}, прогресс {num7:P0}"); if (num4 >= 0.999f) { CompleteNeckGrowth(neck, component); return true; } return true; } return false; } public void RestoreNeckState(GameObject neck) { //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)neck == (Object)null) { return; } ZNetView component = neck.GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return; } bool @bool = component.GetZDO().GetBool("neck_isBaby", false); bool bool2 = component.GetZDO().GetBool("neck_growthComplete", false); bool bool3 = component.GetZDO().GetBool("neck_noDrop", false); if (@bool && !bool2) { float @float = component.GetZDO().GetFloat("neck_currentSize", 0.4f); UpdateNeckSizeImmediate(neck, @float); if (bool3) { DisableBabyNeckDrops(neck); } Debug.Log((object)$"NeckTamingMod: Состояние никсёнка восстановлено. Размер: {@float:F2}, isBaby: {@bool}, growthComplete: {bool2}"); } else if (bool2) { neck.transform.localScale = Vector3.one; RestoreAdultNeckDrops(neck); Debug.Log((object)$"NeckTamingMod: Взрослый никс восстановлен. isBaby: {@bool}, growthComplete: {bool2}"); } else { neck.transform.localScale = Vector3.one; Debug.Log((object)$"NeckTamingMod: Дикий никс восстановлен. isBaby: {@bool}, growthComplete: {bool2}"); } } public void UpdateNeckSizeImmediate(GameObject neck, float newSize) { //IL_0016: 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) if ((Object)(object)neck == (Object)null) { return; } try { neck.transform.localScale = Vector3.one * newSize; Character component = neck.GetComponent<Character>(); if ((Object)(object)component != (Object)null) { component.SetMaxHealth(component.GetMaxHealth()); } } catch (Exception ex) { Debug.LogError((object)("Ошибка обновления размера никсёнка: " + ex.Message)); } } private void CompleteNeckGrowth(GameObject neck, ZNetView znetView) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) try { neck.transform.localScale = Vector3.one; znetView.GetZDO().Set("neck_isBaby", false); znetView.GetZDO().Set("neck_currentSize", 1f); znetView.GetZDO().Set("neck_growthComplete", true); znetView.GetZDO().Set("neck_growthProgress", 1f); znetView.GetZDO().Set("neck_noDrop", false); RestoreAdultNeckDrops(neck); Debug.Log((object)"NeckTamingMod: Никсёнок полностью вырос во взрослого никса!"); Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { ((Character)localPlayer).Message((MessageType)2, "Никсёнок вырос во взрослого никса!", 0, (Sprite)null); } } catch (Exception ex) { Debug.LogError((object)("Ошибка завершения роста: " + ex.Message)); } } public void RestoreAdultNeckDrops(GameObject neck) { try { CharacterDrop component = neck.GetComponent<CharacterDrop>(); if (!((Object)(object)component != (Object)null)) { return; } GameObject prefab = ZNetScene.instance.GetPrefab("Neck"); if ((Object)(object)prefab != (Object)null) { CharacterDrop component2 = prefab.GetComponent<CharacterDrop>(); if ((Object)(object)component2 != (Object)null && component2.m_drops != null) { component.m_drops = new List<Drop>(component2.m_drops); Debug.Log((object)"NeckTamingMod: Дроп восстановлен для взрослого никса"); } } } catch (Exception ex) { Debug.LogError((object)("Ошибка восстановления дропа для взрослого никса: " + ex.Message)); } } public void DisableBabyNeckDrops(GameObject neck) { try { CharacterDrop component = neck.GetComponent<CharacterDrop>(); if ((Object)(object)component != (Object)null) { component.m_drops = new List<Drop>(); Debug.Log((object)"NeckTamingMod: Дроп отключен для никсёнка"); } } catch (Exception ex) { Debug.LogError((object)("Ошибка отключения дропа для никсёнка: " + ex.Message)); } } private float CalculateGrowthCurve(float progress) { return progress * progress * (3f - 2f * progress); } public static void InitializeSystem() { if (!_isInitialized) { _isInitialized = true; if ((Object)(object)Instance != (Object)null) { Instance.RestoreAllBabyNecks(); } Debug.Log((object)"NeckTamingMod: Система роста инициализирована"); } } public void RestoreAllBabyNecks() { try { List<MonsterAI> list = FindAllNecks(); int num = 0; foreach (MonsterAI item in list) { if ((Object)(object)item != (Object)null && (Object)(object)((Component)item).gameObject != (Object)null) { RestoreNeckState(((Component)item).gameObject); num++; } } Debug.Log((object)$"NeckTamingMod: Восстановлено состояние {num} никсов"); } catch (Exception ex) { Debug.LogError((object)("Ошибка восстановления никсов: " + ex.Message)); } } private void RegisterConsoleCommandsDirectly() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_006c: 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_0096: Expected O, but got Unknown //IL_0091: 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_00bb: Expected O, but got Unknown //IL_00b6: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_0126: 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_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Expected O, but got Unknown try { object obj = <>c.<>9__38_0; if (obj == null) { ConsoleEvent val = delegate(ConsoleEventArgs args) { //IL_0033: 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_004c: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_007f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer == (Object)null) { args.Context.AddString("Ошибка: игрок не найден!"); return; } try { Vector3 val5 = ((Component)Player.m_localPlayer).transform.position + ((Component)Player.m_localPlayer).transform.forward * 3f + Vector3.up; GameObject prefab = ZNetScene.instance.GetPrefab("Neck"); if ((Object)(object)prefab != (Object)null) { GameObject neck = Object.Instantiate<GameObject>(prefab, val5, Quaternion.identity); MakeBabyNeck(neck); args.Context.AddString("Никсёнок создан!"); } else { args.Context.AddString("Ошибка: префаб никса не найден!"); } } catch (Exception ex2) { Debug.LogError((object)$"Ошибка создания никсёнка: {ex2}"); args.Context.AddString("Ошибка: " + ex2.Message); } }; <>c.<>9__38_0 = val; obj = (object)val; } new ConsoleCommand("spawnbabyneck", "Создает никсёнка", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj2 = <>c.<>9__38_1; if (obj2 == null) { ConsoleEvent val2 = delegate(ConsoleEventArgs args) { List<MonsterAI> list3 = FindAllNecks(); int num5 = 0; int num6 = 0; int num7 = 0; int num8 = 0; int num9 = 0; int num10 = 0; foreach (MonsterAI item in list3) { if (!((Object)(object)item == (Object)null)) { num5++; bool flag = IsNeckTamed(item); bool flag2 = IsBabyNeck(((Component)item).gameObject); if (flag) { num6++; if (flag2) { num7++; num9++; } else if (NeckBreedingSystem.CanBreed(item)) { num10++; } } else { num8++; } } } args.Context.AddString($"Всего: {num5}, Приручено: {num6}, Диких: {num8}"); args.Context.AddString($"Никсёнков: {num7} (растут: {num9})"); args.Context.AddString($"Взрослых готовых к размножению: {num10}"); int num11 = 1; foreach (MonsterAI item2 in list3) { if ((Object)(object)item2 != (Object)null && IsBabyNeck(((Component)item2).gameObject)) { ZNetView component3 = ((Component)item2).GetComponent<ZNetView>(); if ((Object)(object)component3 != (Object)null && component3.IsValid()) { float float3 = component3.GetZDO().GetFloat("neck_ageInDays", 0f); float float4 = component3.GetZDO().GetFloat("neck_currentSize", 0.4f); float float5 = component3.GetZDO().GetFloat("neck_growthProgress", 0f); long long2 = component3.GetZDO().GetLong("neck_bornTime", 0L); double num12 = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); double num13 = ((long2 > 0) ? ((num12 - (double)long2) / 1800.0) : 0.0); double num14 = Math.Max(0.0, (double)GrowthDays.Value - num13); float num15 = float5 * 100f; args.Context.AddString($"Никсёнок {num11}: {num13:F2}/{GrowthDays.Value} дн. ({num15:F1}%) Размер: {float4:F2}"); num11++; } } } if (num7 == 0) { args.Context.AddString("Нет растущих никсёнков"); } }; <>c.<>9__38_1 = val2; obj2 = (object)val2; } new ConsoleCommand("neckinfo", "Информация о никсах", (ConsoleEvent)obj2, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); new ConsoleCommand("forcegrownecks", "Мгновенно вырастить всех никсёнков", (ConsoleEvent)delegate(ConsoleEventArgs args) { int num4 = 0; List<MonsterAI> list2 = FindAllNecks(); foreach (MonsterAI item3 in list2) { if (!((Object)(object)item3 == (Object)null)) { try { if (IsBabyNeck(((Component)item3).gameObject)) { ZNetView component2 = ((Component)item3).GetComponent<ZNetView>(); if ((Object)(object)component2 != (Object)null && component2.IsValid()) { CompleteNeckGrowth(((Component)item3).gameObject, component2); num4++; } } } catch (Exception ex) { Debug.LogError((object)("Error growing baby neck: " + ex.Message)); } } } args.Context.AddString($"Мгновенно выращено {num4} никсёнков!"); }, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); new ConsoleCommand("neckgrowthupdate", "Принудительно обновить систему роста", (ConsoleEvent)delegate(ConsoleEventArgs args) { UpdateAllNeckGrowth(); args.Context.AddString("Система роста никсов обновлена!"); }, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj3 = <>c.<>9__38_4; if (obj3 == null) { ConsoleEvent val3 = delegate(ConsoleEventArgs args) { NeckBreedingSystem.UpdateBreeding(); args.Context.AddString("Система размножения никсов обновлена!"); }; <>c.<>9__38_4 = val3; obj3 = (object)val3; } new ConsoleCommand("neckbreedingupdate", "Принудительно обновить систему размножения", (ConsoleEvent)obj3, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj4 = <>c.<>9__38_5; if (obj4 == null) { ConsoleEvent val4 = delegate(ConsoleEventArgs args) { args.Context.AddString($"Система инициализирована: {_isInitialized}"); args.Context.AddString($"ZNet доступен: {(Object)(object)ZNet.instance != (Object)null}"); args.Context.AddString($"Серверный режим: {(Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()}"); List<MonsterAI> list = FindAllNecks(); args.Context.AddString($"Всего никсов в мире: {list.Count}"); int num = 0; foreach (MonsterAI item4 in list) { if ((Object)(object)item4 != (Object)null && IsBabyNeck(((Component)item4).gameObject)) { num++; ZNetView component = ((Component)item4).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { double num2 = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); long @long = component.GetZDO().GetLong("neck_bornTime", 0L); float num3 = ((@long > 0) ? ((float)((num2 - (double)@long) / 1800.0)) : 0f); float @float = component.GetZDO().GetFloat("neck_currentSize", 0.4f); float float2 = component.GetZDO().GetFloat("neck_growthProgress", 0f); args.Context.AddString($"Никсёнок: возраст {num3:F2} дн., размер {@float:F2}, прогресс {float2:P0}"); } } } args.Context.AddString($"Активных никсёнков: {num}"); }; <>c.<>9__38_5 = val4; obj4 = (object)val4; } new ConsoleCommand("neckdiagnostic", "Диагностика системы роста", (ConsoleEvent)obj4, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); ((BaseUnityPlugin)this).Logger.LogInfo((object)"NeckTamingMod: Консольные команды успешно зарегистрированы!"); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"Ошибка регистрации команд: {arg}"); } } public static bool IsNeckTamed(MonsterAI neck) { if ((Object)(object)neck == (Object)null) { return false; } try { if (GetPrivateField<bool>(neck, "m_tamed")) { return true; } ZNetView component = ((Component)neck).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { return component.GetZDO().GetBool("tamed", false); } } catch (Exception ex) { Debug.LogError((object)("Ошибка проверки приручения: " + ex.Message)); } return false; } public static bool IsBabyNeck(GameObject neck) { if ((Object)(object)neck == (Object)null) { return false; } ZNetView component = neck.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { bool @bool = component.GetZDO().GetBool("neck_isBaby", false); bool bool2 = component.GetZDO().GetBool("neck_growthComplete", false); return @bool && !bool2; } return false; } public static T GetPrivateField<T>(object obj, string fieldName) { if (obj == null) { return default(T); } FieldInfo field = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); return (field != null) ? ((T)field.GetValue(obj)) : default(T); } public static void SetPrivateField(object obj, string fieldName, object value) { if (obj != null) { FieldInfo field = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && value != null && field.FieldType == value.GetType()) { field.SetValue(obj, value); } } } public static List<MonsterAI> FindAllNecks() { List<MonsterAI> list = new List<MonsterAI>(); MonsterAI[] array = Object.FindObjectsByType<MonsterAI>((FindObjectsSortMode)0); MonsterAI[] array2 = array; foreach (MonsterAI val in array2) { if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).gameObject != (Object)null) { string text = ((Object)((Component)val).gameObject).name.ToLower(); if (text.Contains("neck") && !text.Contains("bear")) { list.Add(val); } } } return list; } public static void MakeBabyNeck(GameObject neck) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)neck == (Object)null) { return; } try { double num = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); neck.transform.localScale = Vector3.one * 0.4f; Character component = neck.GetComponent<Character>(); if ((Object)(object)component != (Object)null) { component.SetTamed(true); component.SetLevel(1); Instance.DisableBabyNeckDrops(neck); } MonsterAI component2 = neck.GetComponent<MonsterAI>(); if ((Object)(object)component2 != (Object)null) { SetPrivateField(component2, "m_tamed", true); SetPrivateField(component2, "m_tamable", true); SetPrivateField(component2, "m_commandable", true); SetPrivateField(component2, "m_tameTimer", TameTime.Value); } Tameable component3 = neck.GetComponent<Tameable>(); if ((Object)(object)component3 != (Object)null) { SetPrivateField(component3, "m_tamed", true); SetPrivateField(component3, "m_timeSinceFeeding", 0f); } ZNetView component4 = neck.GetComponent<ZNetView>(); if ((Object)(object)component4 != (Object)null && component4.IsValid()) { component4.GetZDO().Set("tamed", true); component4.GetZDO().Set("neck_isBaby", true); component4.GetZDO().Set("neck_bornTime", (long)num); component4.GetZDO().Set("neck_ageInDays", 0f); component4.GetZDO().Set("neck_currentSize", 0.4f); component4.GetZDO().Set("neck_growthComplete", false); component4.GetZDO().Set("neck_growthProgress", 0f); component4.GetZDO().Set("neck_noDrop", true); } Debug.Log((object)$"NeckTamingMod: Прирученный никсёнок создан! Время рождения: {num}"); } catch (Exception ex) { Debug.LogError((object)("Ошибка создания никсёнка: " + ex.Message)); } } } [HarmonyPatch(typeof(Player))] public static class PlayerPatches { [HarmonyPatch("OnSpawned")] [HarmonyPostfix] private static void OnPlayerSpawned(Player __instance) { if ((Object)(object)__instance == (Object)(object)Player.m_localPlayer) { NeckTamingMod.InitializeSystem(); Debug.Log((object)"NeckTamingMod: Игрок заспавнен, система роста активирована"); if ((Object)(object)NeckTamingMod.Instance != (Object)null) { NeckTamingMod.Instance.RestoreAllBabyNecks(); } } } } [HarmonyPatch(typeof(ZNet))] public static class ZNetPatches { [HarmonyPatch("OnWorldLoad")] [HarmonyPostfix] private static void OnWorldLoad(ZNet __instance) { if (__instance.IsServer()) { NeckTamingMod.InitializeSystem(); Debug.Log((object)"NeckTamingMod: Мир загружен, запущено восстановление никсёнков"); } } } [HarmonyPatch(typeof(Tameable))] public static class TameablePatches { [HarmonyPatch("GetHoverText")] [HarmonyPostfix] private static void OnHoverText(Tameable __instance, ref string __result) { if ((Object)(object)NeckTamingMod.Instance != (Object)null && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { NeckTamingMod.Instance.UpdateAllNeckGrowth(); } if (!((Object)(object)__instance != (Object)null)) { return; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return; } bool privateField = NeckTamingMod.GetPrivateField<bool>(__instance, "m_tamed"); if (!privateField) { MonsterAI component = ((Component)__instance).GetComponent<MonsterAI>(); if ((Object)(object)component != (Object)null) { if (NeckTamingMod.GetPrivateField<bool>(component, "m_afraid")) { __result += "\n<color=orange>Боится</color>"; } else { __result += "\n<color=yellow>Дикий</color>"; } } } if (privateField && NeckTamingMod.IsBabyNeck(((Component)__instance).gameObject)) { ZNetView component2 = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component2 != (Object)null && component2.IsValid()) { float @float = component2.GetZDO().GetFloat("neck_currentSize", 0.4f); float float2 = component2.GetZDO().GetFloat("neck_ageInDays", 0f); long @long = component2.GetZDO().GetLong("neck_bornTime", 0L); float float3 = component2.GetZDO().GetFloat("neck_growthProgress", 0f); double num = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetTimeSeconds() : 0.0); double num2 = ((@long > 0) ? ((num - (double)@long) / 1800.0) : 0.0); double num3 = Math.Max(0.0, (double)NeckTamingMod.GrowthDays.Value - num2); float num4 = float3 * 100f; __result += $"\n(Растет: {num4:F1}%, {num3:F1} дн. осталось)"; __result += $"\n(Размер: {@float:F2}, возраст: {num2:F2} дн.)"; } } else if (privateField && !NeckTamingMod.IsBabyNeck(((Component)__instance).gameObject)) { MonsterAI component3 = ((Component)__instance).GetComponent<MonsterAI>(); if ((Object)(object)component3 != (Object)null && NeckBreedingSystem.CanBreed(component3)) { __result += "\n(Готов к размножению)"; } } } [HarmonyPatch("Interact")] [HarmonyPrefix] private static bool HandlePetCommand(Tameable __instance, Humanoid user, bool hold, bool alt) { if (hold || alt) { return true; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return true; } try { if (NeckTamingMod.GetPrivateField<bool>(__instance, "m_tamed")) { MonsterAI component = ((Component)__instance).GetComponent<MonsterAI>(); if ((Object)(object)component != (Object)null) { bool privateField = NeckTamingMod.GetPrivateField<bool>(component, "m_follow"); NeckTamingMod.SetPrivateField(component, "m_follow", !privateField); if (!privateField) { ((Character)user).Message((MessageType)2, "$hud_animal_follow", 0, (Sprite)null); } else { ((Character)user).Message((MessageType)2, "$hud_animal_stay", 0, (Sprite)null); } return false; } } } catch (Exception ex) { Debug.LogError((object)("Ошибка обработки команды приласкать: " + ex.Message)); } return true; } } [HarmonyPatch(typeof(ZNetScene))] public static class ZNetScenePatches { private static bool _prefabsInitialized; [HarmonyPatch("Awake")] [HarmonyPostfix] private static void SetupNeckPrefab(ZNetScene __instance) { if (_prefabsInitialized) { return; } try { GameObject prefab = __instance.GetPrefab("Neck"); if ((Object)(object)prefab == (Object)null) { Debug.LogError((object)"NeckTamingMod: Префаб никса не найден!"); return; } SetupNeckTameable(prefab); _prefabsInitialized = true; Debug.Log((object)"NeckTamingMod: Настройка префаба никса завершена!"); } catch (Exception arg) { Debug.LogError((object)$"Ошибка настройка префаба никса: {arg}"); } } private static void SetupNeckTameable(GameObject neckPrefab) { Tameable val = neckPrefab.GetComponent<Tameable>(); if ((Object)(object)val == (Object)null) { val = neckPrefab.AddComponent<Tameable>(); Debug.Log((object)"NeckTamingMod: Добавлен компонент Tameable к никсy"); } val.m_tamingTime = NeckTamingMod.TameTime.Value; val.m_fedDuration = NeckTamingMod.FedDuration.Value; val.m_commandable = true; MonsterAI component = neckPrefab.GetComponent<MonsterAI>(); if ((Object)(object)component != (Object)null) { NeckTamingMod.SetPrivateField(component, "m_tamable", true); NeckTamingMod.SetPrivateField(component, "m_tamingTime", NeckTamingMod.TameTime.Value); SetupConsumableItems(component); Debug.Log((object)"NeckTamingMod: Настроен MonsterAI для никса"); } else { Debug.LogError((object)"NeckTamingMod: У префаба никса нет компонента MonsterAI!"); } } private static void SetupConsumableItems(MonsterAI neckAI) { if (neckAI.m_consumeItems == null) { neckAI.m_consumeItems = new List<ItemDrop>(); } else { neckAI.m_consumeItems.Clear(); } string[] array = NeckTamingMod.ConsumableItems.Value.Split(new char[1] { ';' }); string[] array2 = array; foreach (string text in array2) { string text2 = text.Trim(); if (!string.IsNullOrEmpty(text2)) { AddConsumableItem(neckAI, text2); } } if (neckAI.m_consumeItems == null || neckAI.m_consumeItems.Count == 0) { AddConsumableItem(neckAI, "MeadTasty"); Debug.Log((object)"NeckTamingMod: Добавлен предмет по умолчанию: MeadTasty"); } } private static void AddConsumableItem(MonsterAI neckAI, string itemName) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemName); if ((Object)(object)itemPrefab != (Object)null) { ItemDrop component = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { neckAI.m_consumeItems.Add(component); Debug.Log((object)("NeckTamingMod: Добавлен предмет для приручения: " + itemName)); } else { Debug.LogError((object)("NeckTamingMod: У предмета " + itemName + " нет компонента ItemDrop")); } } else { Debug.LogError((object)("NeckTamingMod: Не удалось найти предмет: " + itemName)); } } } [HarmonyPatch(typeof(Character))] public static class CharacterHoverPatches { [HarmonyPatch("GetHoverName")] [HarmonyPostfix] private static void ModifyNeckHoverName(Character __instance, ref string __result) { if ((Object)(object)__instance == (Object)null) { return; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return; } try { MonsterAI component = ((Component)__instance).GetComponent<MonsterAI>(); if (!((Object)(object)component == (Object)null)) { bool flag = NeckTamingMod.IsNeckTamed(component); if (NeckTamingMod.IsBabyNeck(((Component)__instance).gameObject)) { __result = "Никсёнок"; } else if (flag) { __result = "Прирученный никс"; } else { __result = "Никс"; } } } catch (Exception ex) { Debug.LogError((object)("Ошибка изменения имени никса: " + ex.Message)); } } } [HarmonyPatch(typeof(Character))] public static class CharacterStatePatches { [HarmonyPatch("Start")] [HarmonyPostfix] private static void RestoreNeckState(Character __instance) { if ((Object)(object)__instance == (Object)null || (Object)(object)((Component)__instance).gameObject == (Object)null) { return; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return; } try { NeckTamingMod.Instance.RestoreNeckState(((Component)__instance).gameObject); } catch (Exception ex) { Debug.LogError((object)("Ошибка восстановления состояния никса: " + ex.Message)); } } } [HarmonyPatch(typeof(Character))] public static class CharacterDeathPatches { [HarmonyPatch("OnDeath")] [HarmonyPrefix] private static void OnDeathPrefix(Character __instance) { if ((Object)(object)__instance == (Object)null) { return; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return; } try { if (NeckTamingMod.IsBabyNeck(((Component)__instance).gameObject)) { NeckTamingMod.Instance.DisableBabyNeckDrops(((Component)__instance).gameObject); Debug.Log((object)"NeckTamingMod: Дроп отключен для убитого никсёнка"); } else { NeckTamingMod.Instance.RestoreAdultNeckDrops(((Component)__instance).gameObject); } } catch (Exception ex) { Debug.LogError((object)("Ошибка обработки смерти никса: " + ex.Message)); } } } [HarmonyPatch(typeof(MonsterAI))] public static class MonsterAIPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void OnMonsterAIStart(MonsterAI __instance) { if ((Object)(object)__instance == (Object)null || (Object)(object)((Component)__instance).gameObject == (Object)null) { return; } string text = ((Object)((Component)__instance).gameObject).name.ToLower(); if (!text.Contains("neck")) { return; } try { NeckTamingMod.Instance?.RestoreNeckState(((Component)__instance).gameObject); } catch (Exception ex) { Debug.LogError((object)("Ошибка восстановления состояния никса в MonsterAI: " + ex.Message)); } } } public static class NeckBreedingSystem { public static Dictionary<GameObject, long> _lastBreedTimes = new Dictionary<GameObject, long>(); private const float MIN_BREED_DISTANCE = 3f; private const float MAX_BREED_DISTANCE = 10f; private const float REQUIRED_FULLNESS = 0.7f; public static void UpdateBreeding() { try { List<MonsterAI> list = NeckTamingMod.FindAllNecks(); List<MonsterAI> list2 = new List<MonsterAI>(); foreach (MonsterAI item in list) { if (!((Object)(object)item == (Object)null) && NeckTamingMod.IsNeckTamed(item) && !NeckTamingMod.IsBabyNeck(((Component)item).gameObject) && CanBreed(item)) { list2.Add(item); } } if (list2.Count < 2) { return; } for (int i = 0; i < list2.Count; i++) { for (int j = i + 1; j < list2.Count; j++) { if (CheckBreedingPair(list2[i], list2[j])) { return; } } } } catch (Exception ex) { Debug.LogError((object)("Ошибка в системе размножения: " + ex.Message)); } } private static bool CheckBreedingPair(MonsterAI neck1, MonsterAI neck2) { //IL_0045: 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) if ((Object)(object)neck1 == (Object)null || (Object)(object)neck2 == (Object)null) { return false; } if (!CanNeckBreedNow(neck1) || !CanNeckBreedNow(neck2)) { return false; } float num = Vector3.Distance(((Component)neck1).transform.position, ((Component)neck2).transform.position); if (num < 3f || num > 10f) { return false; } if (Random.Range(0f, 1f) > NeckTamingMod.BreedChance.Value) { return false; } Debug.Log((object)"NeckTamingMod: Успешная проверка размножения - создаем никсёнка"); SpawnBabyNeck(neck1, neck2); SetBreedCooldown(neck1); SetBreedCooldown(neck2); return true; } public static bool CanNeckBreedNow(MonsterAI neck) { if ((Object)(object)neck == (Object)null) { return false; } if (_lastBreedTimes.ContainsKey(((Component)neck).gameObject)) { long num = _lastBreedTimes[((Component)neck).gameObject]; long num2 = (long)ZNet.instance.GetTimeSeconds(); long num3 = (long)(NeckTamingMod.BreedCooldownDays.Value * 1800f); long num4 = num2 - num; if (num4 < num3) { return false; } } return true; } private static void SetBreedCooldown(MonsterAI neck) { if ((Object)(object)neck != (Object)null) { long num = (long)ZNet.instance.GetTimeSeconds(); _lastBreedTimes[((Component)neck).gameObject] = num; ZNetView component = ((Component)neck).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.GetZDO().Set("neck_lastBreedTime", num); } } } public static bool CanBreed(MonsterAI neck) { if ((Object)(object)neck == (Object)null) { return false; } Tameable component = ((Component)neck).GetComponent<Tameable>(); if ((Object)(object)component != (Object)null) { float privateField = NeckTamingMod.GetPrivateField<float>(component, "m_timeSinceFeeding"); if (privateField > component.m_fedDuration * 0.7f) { return false; } } if (NeckTamingMod.IsBabyNeck(((Component)neck).gameObject)) { return false; } return true; } private static void SpawnBabyNeck(MonsterAI parent1, MonsterAI parent2) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_006f: 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) try { Vector3 val = (((Component)parent1).transform.position + ((Component)parent2).transform.position) / 2f; val += Vector3.up * 0.5f + Random.insideUnitSphere * 1f; GameObject prefab = ZNetScene.instance.GetPrefab("Neck"); if ((Object)(object)prefab != (Object)null) { GameObject neck = Object.Instantiate<GameObject>(prefab, val, Quaternion.identity); NeckTamingMod.MakeBabyNeck(neck); Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer != (Object)null) { ((Character)localPlayer).Message((MessageType)2, "Никсы произвели потомство!", 0, (Sprite)null); } Debug.Log((object)"NeckTamingMod: Новый прирученный никсёнок появился через размножение!"); } else { Debug.LogError((object)"NeckTamingMod: Не удалось найти префаб никса для размножения"); } } catch (Exception ex) { Debug.LogError((object)("Ошибка создания никсёнка: " + ex.Message)); } } }