Files
duckovMod/public/SmartInjectors.decompiled.cs
2025-10-25 01:48:42 +08:00

1098 lines
36 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using Duckov;
using Duckov.Modding;
using Duckov.Utilities;
using ItemStatsSystem;
using ItemStatsSystem.Items;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SmartInjectors")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+ecf703333fe8409045024fdd86e1e1f9b7e6701d")]
[assembly: AssemblyProduct("SmartInjectors")]
[assembly: AssemblyTitle("SmartInjectors")]
[assembly: AssemblyVersion("1.0.0.0")]
[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 SmartInjectors
{
public class InjectionCaseUI
{
private const string LOG_PREFIX = "[SmartInjectors.UI]";
private bool isVisible;
private Item currentInjectionCase;
private Rect windowRect = new Rect((float)(Screen.width / 2 - 100), (float)(Screen.height - 350), 800f, 170f);
private GUIStyle windowStyle;
private GUIStyle buttonStyle;
private GUIStyle labelStyle;
private bool stylesInitialized;
private bool showQuickInjectPrompt;
private float promptShowTime;
private const float PROMPT_DURATION = 5f;
private bool showInjectionResult;
private string injectionResultText = "";
private float resultShowTime;
private const float RESULT_DURATION = 3f;
private bool showCooldownWarning;
private string cooldownWarningText = "";
private float cooldownWarningTime;
private const float COOLDOWN_WARNING_DURATION = 1.5f;
private float lastQuickInjectTime = -999f;
private const float QUICK_INJECT_COOLDOWN = 60f;
public bool IsVisible => isVisible;
public void Show(Item injectionCase)
{
if ((Object)(object)injectionCase == (Object)null)
{
Debug.LogWarning((object)"[SmartInjectors.UI] 尝试显示UI但注射器收纳包为null");
return;
}
if (injectionCase.TypeID != 882)
{
Debug.LogWarning((object)string.Format("{0} 物品TypeID不是注射器收纳包: {1}", "[SmartInjectors.UI]", injectionCase.TypeID));
return;
}
currentInjectionCase = injectionCase;
isVisible = true;
Debug.Log((object)"[SmartInjectors.UI] 显示注射器收纳包UI");
}
public void Hide()
{
isVisible = false;
currentInjectionCase = null;
Debug.Log((object)"[SmartInjectors.UI] 隐藏注射器收纳包UI");
}
public void Toggle(Item injectionCase)
{
if (isVisible && (Object)(object)currentInjectionCase == (Object)(object)injectionCase)
{
Hide();
}
else
{
Show(injectionCase);
}
}
public void DrawGUI()
{
//IL_0038: 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_0059: Expected O, but got Unknown
//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)
DrawQuickInjectPrompts();
if (isVisible && !((Object)(object)currentInjectionCase == (Object)null))
{
HandleKeyboardEventInGUI();
if (!stylesInitialized)
{
InitializeStyles();
}
windowRect = GUI.Window(12345, windowRect, new WindowFunction(DrawWindow), "注射器收纳包", windowStyle);
}
}
private void DrawQuickInjectPrompts()
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Expected O, but got Unknown
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_0240: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Expected O, but got Unknown
//IL_0267: Unknown result type (might be due to invalid IL or missing references)
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Expected O, but got Unknown
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
//IL_02aa: Expected O, but got Unknown
//IL_02c5: 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_0312: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle(GUI.skin.label);
val.alignment = (TextAnchor)4;
val.fontSize = 24;
val.fontStyle = (FontStyle)1;
val.normal.textColor = Color.white;
if ((Object)(object)GUI.skin != (Object)null && (Object)(object)GUI.skin.font != (Object)null)
{
val.font = GUI.skin.font;
}
GUIStyle val2 = new GUIStyle(val);
val2.normal.textColor = new Color(0f, 0f, 0f, 0.8f);
if (showQuickInjectPrompt)
{
float num = (float)Screen.width / 2f;
float num2 = (float)Screen.height / 2f;
string text = "即将全部注射...";
GUI.Label(new Rect(num - 198f, num2 - 48f, 400f, 100f), text, val2);
GUI.Label(new Rect(num - 200f, num2 - 50f, 400f, 100f), text, val);
}
if (showInjectionResult)
{
float num3 = (float)Screen.width / 2f;
float num4 = (float)Screen.height / 2f;
GUIStyle val3 = new GUIStyle(GUI.skin.label);
val3.alignment = (TextAnchor)4;
val3.fontSize = 20;
val3.fontStyle = (FontStyle)1;
val3.normal.textColor = Color.green;
if ((Object)(object)GUI.skin != (Object)null && (Object)(object)GUI.skin.font != (Object)null)
{
val3.font = GUI.skin.font;
}
GUIStyle val4 = new GUIStyle(val3);
val4.normal.textColor = new Color(0f, 0f, 0f, 0.8f);
GUI.Label(new Rect(num3 - 298f, num4 - 98f, 600f, 200f), injectionResultText, val4);
GUI.Label(new Rect(num3 - 300f, num4 - 100f, 600f, 200f), injectionResultText, val3);
}
if (showCooldownWarning)
{
float num5 = (float)Screen.width / 2f;
float num6 = (float)Screen.height / 2f;
GUIStyle val5 = new GUIStyle(GUI.skin.label);
val5.alignment = (TextAnchor)4;
val5.fontSize = 22;
val5.fontStyle = (FontStyle)1;
val5.normal.textColor = Color.red;
if ((Object)(object)GUI.skin != (Object)null && (Object)(object)GUI.skin.font != (Object)null)
{
val5.font = GUI.skin.font;
}
GUIStyle val6 = new GUIStyle(val5);
val6.normal.textColor = new Color(0f, 0f, 0f, 0.8f);
GUI.Label(new Rect(num5 - 248f, num6 - 48f, 500f, 100f), cooldownWarningText, val6);
GUI.Label(new Rect(num5 - 250f, num6 - 50f, 500f, 100f), cooldownWarningText, val5);
}
}
private void InitializeStyles()
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Expected O, but got Unknown
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Expected O, but got Unknown
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
windowStyle = new GUIStyle(GUI.skin.window);
windowStyle.fontSize = 16;
windowStyle.fontStyle = (FontStyle)1;
buttonStyle = new GUIStyle(GUI.skin.button);
buttonStyle.fontSize = 13;
buttonStyle.padding = new RectOffset(5, 5, 5, 5);
buttonStyle.fixedHeight = 30f;
labelStyle = new GUIStyle(GUI.skin.label);
labelStyle.fontSize = 12;
labelStyle.alignment = (TextAnchor)1;
labelStyle.wordWrap = true;
stylesInitialized = true;
}
private void DrawWindow(int windowID)
{
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
if ((Object)(object)currentInjectionCase.Slots == (Object)null || currentInjectionCase.Slots.Count == 0)
{
GUILayout.Label("注射器收纳包没有槽位!", labelStyle, Array.Empty<GUILayoutOption>());
GUILayout.EndVertical();
GUI.DragWindow();
return;
}
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
for (int i = 0; i < 6; i++)
{
GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) });
GUILayout.FlexibleSpace();
if (i < currentInjectionCase.Slots.Count)
{
Slot slotByIndex = currentInjectionCase.Slots.GetSlotByIndex(i);
Item val = ((slotByIndex != null) ? slotByIndex.Content : null);
if ((Object)(object)val != (Object)null)
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.FlexibleSpace();
if ((Object)(object)val.Icon != (Object)null)
{
Texture2D texture = val.Icon.texture;
if ((Object)(object)texture != (Object)null)
{
GUILayout.Box((Texture)(object)texture, (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.Width(64f),
GUILayout.Height(64f)
});
}
else
{
GUILayout.Box("", (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.Width(64f),
GUILayout.Height(64f)
});
}
}
else
{
GUILayout.Box("", (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.Width(64f),
GUILayout.Height(64f)
});
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
string text = $"{i + 1}. {val.DisplayName}";
if (val.StackCount > 1)
{
text += $" x{val.StackCount}";
}
if (val.UseDurability && val.MaxDurability > 0f)
{
int num = (int)(val.Durability / val.MaxDurability * 100f);
text += $" ({num}%)";
}
GUILayout.Label(text, labelStyle, Array.Empty<GUILayoutOption>());
GUILayout.Space(3f);
if (GUILayout.Button("使用", buttonStyle, Array.Empty<GUILayoutOption>()))
{
UseSyringe(val);
}
}
else
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.FlexibleSpace();
GUILayout.Box("", (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.Width(64f),
GUILayout.Height(64f)
});
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
GUILayout.Label($"{i + 1}. (空)", labelStyle, Array.Empty<GUILayoutOption>());
GUILayout.Space((buttonStyle.fixedHeight > 0f) ? (buttonStyle.fixedHeight + 3f) : 33f);
}
}
else
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.FlexibleSpace();
GUILayout.Box("", (GUILayoutOption[])(object)new GUILayoutOption[2]
{
GUILayout.Width(64f),
GUILayout.Height(64f)
});
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
GUILayout.Label($"{i + 1}. (空)", labelStyle, Array.Empty<GUILayoutOption>());
GUILayout.Space(33f);
}
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
if (i < 5)
{
GUILayout.Space(8f);
}
}
GUILayout.EndHorizontal();
GUILayout.EndVertical();
GUI.DragWindow();
}
private void UseSyringe(Item syringe)
{
if ((Object)(object)syringe == (Object)null)
{
Debug.LogWarning((object)"[SmartInjectors.UI] 尝试使用null针剂");
return;
}
CharacterMainControl main = CharacterMainControl.Main;
if ((Object)(object)main == (Object)null)
{
Debug.LogError((object)"[SmartInjectors.UI] 无法获取主角色引用");
return;
}
if ((Object)(object)syringe.UsageUtilities == (Object)null)
{
Debug.LogWarning((object)("[SmartInjectors.UI] 针剂没有UsageUtilities组件: " + syringe.DisplayName));
return;
}
if (!syringe.UsageUtilities.IsUsable(syringe, (object)main))
{
Debug.LogWarning((object)("[SmartInjectors.UI] 针剂当前不可使用: " + syringe.DisplayName));
return;
}
Debug.Log((object)string.Format("{0} 使用针剂: {1} (TypeID: {2})", "[SmartInjectors.UI]", syringe.DisplayName, syringe.TypeID));
main.UseItem(syringe);
Debug.Log((object)"[SmartInjectors.UI] 针剂使用完成UI保持打开状态");
}
public void HandleInput()
{
UpdatePromptAndResults();
if (!isVisible)
{
return;
}
if (Input.GetKeyDown((KeyCode)96))
{
HandleQuickInjectKey();
}
if (Input.GetMouseButtonDown(1))
{
Debug.Log((object)"[SmartInjectors.UI] 鼠标右键按下关闭UI");
Hide();
}
for (int i = 0; i < 6; i++)
{
if (Input.GetKeyDown((KeyCode)(49 + i)))
{
Debug.Log((object)string.Format("{0} [Update] 检测到数字键 {1},直接使用针剂", "[SmartInjectors.UI]", i + 1));
QuickUseSyringeAtSlot(i);
}
}
}
private void HandleKeyboardEventInGUI()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Invalid comparison between Unknown and I4
//IL_0021: 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)
if (!isVisible)
{
return;
}
Event current = Event.current;
if ((int)current.type != 4)
{
return;
}
for (int i = 0; i < 6; i++)
{
KeyCode val = (KeyCode)(49 + i);
if (current.keyCode == val)
{
Debug.Log((object)string.Format("{0} OnGUI捕获数字键 {1} (消费事件防止游戏快捷栏响应)", "[SmartInjectors.UI]", i + 1));
QuickUseSyringeAtSlot(i);
current.Use();
break;
}
}
}
private void QuickUseSyringeAtSlot(int slotIndex)
{
Debug.Log((object)string.Format("{0} QuickUseSyringeAtSlot 被调用,槽位索引: {1}", "[SmartInjectors.UI]", slotIndex));
if ((Object)(object)currentInjectionCase == (Object)null || (Object)(object)currentInjectionCase.Slots == (Object)null)
{
Debug.LogWarning((object)"[SmartInjectors.UI] 收纳包或槽位为null无法使用");
return;
}
if (slotIndex >= currentInjectionCase.Slots.Count)
{
Debug.LogWarning((object)string.Format("{0} 槽位索引超出范围: {1} >= {2}", "[SmartInjectors.UI]", slotIndex, currentInjectionCase.Slots.Count));
return;
}
Slot slotByIndex = currentInjectionCase.Slots.GetSlotByIndex(slotIndex);
if (slotByIndex == null || (Object)(object)slotByIndex.Content == (Object)null)
{
Debug.Log((object)string.Format("{0} 槽位 {1} 为空", "[SmartInjectors.UI]", slotIndex + 1));
return;
}
Debug.Log((object)string.Format("{0} 准备使用槽位 {1} 的针剂: {2}", "[SmartInjectors.UI]", slotIndex + 1, slotByIndex.Content.DisplayName));
UseSyringe(slotByIndex.Content);
}
private void UpdatePromptAndResults()
{
if (showQuickInjectPrompt && Time.time - promptShowTime > 5f)
{
showQuickInjectPrompt = false;
Debug.Log((object)"[SmartInjectors.UI] 一键注射提示超时消失");
}
if (showInjectionResult && Time.time - resultShowTime > 3f)
{
showInjectionResult = false;
}
if (showCooldownWarning && Time.time - cooldownWarningTime > 1.5f)
{
showCooldownWarning = false;
}
}
private void HandleQuickInjectKey()
{
float num = Time.time - lastQuickInjectTime;
float num2 = 60f - num;
if (num2 > 0f)
{
ShowCooldownWarning(num2);
}
else if (!showQuickInjectPrompt)
{
showQuickInjectPrompt = true;
promptShowTime = Time.time;
Debug.Log((object)"[SmartInjectors.UI] 显示一键注射提示");
}
else
{
showQuickInjectPrompt = false;
ExecuteQuickInject();
}
}
private void ShowCooldownWarning(float remainingSeconds)
{
showCooldownWarning = true;
cooldownWarningTime = Time.time;
cooldownWarningText = $"一键注射冷却中!还有 {Mathf.CeilToInt(remainingSeconds)} 秒";
Debug.Log((object)("[SmartInjectors.UI] " + cooldownWarningText));
}
private void ExecuteQuickInject()
{
CharacterMainControl main = CharacterMainControl.Main;
if ((Object)(object)main == (Object)null)
{
Debug.LogError((object)"[SmartInjectors.UI] 无法获取主角色引用");
return;
}
if ((Object)(object)currentInjectionCase == (Object)null || (Object)(object)currentInjectionCase.Slots == (Object)null)
{
Debug.LogError((object)"[SmartInjectors.UI] 收纳包无效");
return;
}
Debug.Log((object)"[SmartInjectors.UI] ========== 开始执行一键注射 ==========");
HashSet<int> hashSet = new HashSet<int>();
List<string> list = new List<string>();
for (int i = 0; i < 6 && i < currentInjectionCase.Slots.Count; i++)
{
Slot slotByIndex = currentInjectionCase.Slots.GetSlotByIndex(i);
if (slotByIndex == null || (Object)(object)slotByIndex.Content == (Object)null)
{
Debug.Log((object)string.Format("{0} 槽位 {1} 为空", "[SmartInjectors.UI]", i + 1));
continue;
}
Item content = slotByIndex.Content;
Debug.Log((object)string.Format("{0} 检查槽位 {1}: {2} (TypeID: {3})", "[SmartInjectors.UI]", i + 1, content.DisplayName, content.TypeID));
if ((Object)(object)content.UsageUtilities == (Object)null)
{
Debug.Log((object)string.Format("{0} 跳过 {1} (TypeID: {2}) - 没有UsageUtilities", "[SmartInjectors.UI]", content.DisplayName, content.TypeID));
continue;
}
if (hashSet.Contains(content.TypeID))
{
Debug.Log((object)string.Format("{0} 跳过 {1} (TypeID: {2}) - TypeID重复", "[SmartInjectors.UI]", content.DisplayName, content.TypeID));
continue;
}
Debug.Log((object)string.Format("{0} 尝试注射: {1} (TypeID: {2})", "[SmartInjectors.UI]", content.DisplayName, content.TypeID));
if (TryInjectSyringe(main, content))
{
hashSet.Add(content.TypeID);
list.Add(content.DisplayName);
}
}
if (list.Count > 0)
{
ShowInjectionResult(list);
lastQuickInjectTime = Time.time;
Debug.Log((object)string.Format("{0} 一键注射完成,共注射 {1} 种针剂", "[SmartInjectors.UI]", list.Count));
}
else
{
Debug.Log((object)"[SmartInjectors.UI] 没有可用的针剂");
}
}
private bool TryInjectSyringe(CharacterMainControl character, Item syringe)
{
try
{
if (!syringe.UsageUtilities.IsUsable(syringe, (object)character))
{
Debug.LogWarning((object)("[SmartInjectors.UI] " + syringe.DisplayName + " 当前不可用"));
return false;
}
syringe.UsageUtilities.Use(syringe, (object)character);
if (syringe.Stackable && syringe.StackCount > 1)
{
int stackCount = syringe.StackCount;
syringe.StackCount = stackCount - 1;
}
else
{
for (int i = 0; i < currentInjectionCase.Slots.Count; i++)
{
Slot slotByIndex = currentInjectionCase.Slots.GetSlotByIndex(i);
if (slotByIndex != null && (Object)(object)slotByIndex.Content == (Object)(object)syringe)
{
slotByIndex.Unplug();
break;
}
}
}
Debug.Log((object)("[SmartInjectors.UI] 成功注射: " + syringe.DisplayName));
return true;
}
catch (Exception ex)
{
Debug.LogError((object)("[SmartInjectors.UI] 注射 " + syringe.DisplayName + " 时出错: " + ex.Message));
return false;
}
}
private void ShowInjectionResult(List<string> injectedNames)
{
showInjectionResult = true;
resultShowTime = Time.time;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("已注射:");
foreach (string injectedName in injectedNames)
{
stringBuilder.AppendLine("• " + injectedName);
}
injectionResultText = stringBuilder.ToString();
}
}
public static class ItemTypeIDs
{
public const int INJECTION_CASE = 882;
public const int SYRINGE_YELLOW = 137;
public const int SYRINGE_BLACK = 395;
public const int SYRINGE_WEIGHT = 398;
public const int SYRINGE_ELECTRIC_RESIST = 408;
public const int SYRINGE_HOT_BLOOD = 438;
public const int SYRINGE_HARDENING = 797;
public const int SYRINGE_ENDURANCE = 798;
public const int SYRINGE_MELEE = 800;
public const int SYRINGE_WEAK_STORM_PROTECTION = 856;
public const int SYRINGE_TEST_STORM_PROTECTION = 857;
public const int SYRINGE_STRONG_WINGS = 872;
public const int SYRINGE_RECOVERY = 875;
public const int SYRINGE_FIRE_RESIST = 1070;
public const int SYRINGE_POISON_RESIST = 1071;
public const int SYRINGE_SPACE_RESIST = 1072;
public const int SYRINGE_HEMOSTATIC = 1247;
public static bool IsSyringe(int typeID)
{
if (typeID != 137 && typeID != 395 && typeID != 398 && typeID != 408 && typeID != 438 && typeID != 797 && typeID != 798 && typeID != 800 && typeID != 856 && typeID != 857 && typeID != 872 && typeID != 875 && typeID != 1070 && typeID != 1071 && typeID != 1072)
{
return typeID == 1247;
}
return true;
}
}
public class ModBehaviour : ModBehaviour
{
private const string LOG_PREFIX = "[SmartInjectors]";
private bool hasAnalyzed;
private InjectionCaseUI injectionCaseUI;
private void Awake()
{
Debug.Log((object)"[SmartInjectors] ==========================================");
Debug.Log((object)"[SmartInjectors] Smart Injectors Mod 正在加载...");
Debug.Log((object)"[SmartInjectors] Version: 1.0.0");
Debug.Log((object)"[SmartInjectors] ==========================================");
}
private void Start()
{
Debug.Log((object)"[SmartInjectors] Mod 启动成功!");
Debug.Log((object)"[SmartInjectors] 按 F9 键运行物品分析工具");
Debug.Log((object)"[SmartInjectors] 按 F10 键重新运行分析");
InitializeMod();
}
private void InitializeMod()
{
Debug.Log((object)"[SmartInjectors] 开始初始化 Smart Injectors 功能...");
injectionCaseUI = new InjectionCaseUI();
Debug.Log((object)"[SmartInjectors] 注射器收纳包UI已创建");
Debug.Log((object)"[SmartInjectors] 快捷栏监听已启用");
Debug.Log((object)"[SmartInjectors] 提示: 按数字键1-6使用快捷栏中的注射器收纳包");
Debug.Log((object)"[SmartInjectors] 初始化完成!");
}
private void Update()
{
if (injectionCaseUI != null)
{
injectionCaseUI.HandleInput();
if (!injectionCaseUI.IsVisible)
{
CheckShortcutKeys();
}
}
if (Input.GetKeyDown((KeyCode)290) && !hasAnalyzed)
{
AnalyzeAllItems();
hasAnalyzed = true;
}
if (Input.GetKeyDown((KeyCode)291))
{
hasAnalyzed = false;
AnalyzeAllItems();
}
}
private void CheckShortcutKeys()
{
if (injectionCaseUI != null && injectionCaseUI.IsVisible)
{
return;
}
for (int i = 0; i < 6; i++)
{
if (Input.GetKeyDown((KeyCode)(49 + i)))
{
OnShortcutKeyPressed(i);
}
}
}
private void OnShortcutKeyPressed(int slotIndex)
{
try
{
Item val = ItemShortcut.Get(slotIndex);
if ((Object)(object)val == (Object)null)
{
Debug.Log((object)string.Format("{0} 快捷栏 {1} 为空", "[SmartInjectors]", slotIndex + 1));
return;
}
Debug.Log((object)string.Format("{0} 检测到快捷栏 {1} 使用: {2} (TypeID: {3})", "[SmartInjectors]", slotIndex + 1, val.DisplayName, val.TypeID));
if (val.TypeID == 882)
{
Debug.Log((object)"[SmartInjectors] 检测到注射器收纳包显示UI");
injectionCaseUI.Show(val);
}
}
catch (Exception ex)
{
Debug.LogError((object)("[SmartInjectors] 处理快捷键时出错: " + ex.Message));
Debug.LogError((object)("[SmartInjectors] 堆栈: " + ex.StackTrace));
}
}
private void AnalyzeAllItems()
{
Debug.Log((object)"[SmartInjectors] ==========================================");
Debug.Log((object)"[SmartInjectors] 开始分析游戏物品...");
Debug.Log((object)"[SmartInjectors] ==========================================");
try
{
ItemAssetsCollection instance = ItemAssetsCollection.Instance;
if ((Object)(object)instance == (Object)null)
{
Debug.LogError((object)"[SmartInjectors] 无法获取 ItemAssetsCollection!");
return;
}
List<Entry> entries = instance.entries;
Debug.Log((object)string.Format("{0} 找到 {1} 个物品", "[SmartInjectors]", entries.Count));
Debug.Log((object)"[SmartInjectors] ");
List<string> list = new List<string>();
List<string> list2 = new List<string>();
List<string> list3 = new List<string>();
foreach (Entry item4 in entries)
{
if (item4 != null && !((Object)(object)item4.prefab == (Object)null))
{
Item prefab = item4.prefab;
int typeID = item4.typeID;
string displayName = prefab.DisplayName;
TagCollection tags = prefab.Tags;
bool flag = (Object)(object)prefab.Slots != (Object)null && prefab.Slots.Count > 0;
int num = (flag ? prefab.Slots.Count : 0);
bool num2 = tags.Contains("Medical") || displayName.ToLower().Contains("medical") || displayName.ToLower().Contains("syringe") || displayName.ToLower().Contains("injection") || displayName.Contains("药") || displayName.Contains("针");
if (displayName.ToLower().Contains("injection") || displayName.ToLower().Contains("syringe") || displayName.Contains("注射") || displayName.Contains("针剂"))
{
string item = $"TypeID: {typeID}, 名称: {displayName}, 槽位: {num}";
list3.Add(item);
}
if (num2)
{
string item2 = $"TypeID: {typeID}, 名称: {displayName}";
list.Add(item2);
}
if (flag && num == 6)
{
string item3 = $"TypeID: {typeID}, 名称: {displayName}, 槽位: {num}, 重量: {prefab.UnitSelfWeight}kg";
list2.Add(item3);
}
}
}
Debug.Log((object)"[SmartInjectors] ");
Debug.Log((object)"[SmartInjectors] === 注射器/针剂相关物品 ===");
if (list3.Count > 0)
{
foreach (string item5 in list3)
{
Debug.Log((object)("[SmartInjectors] " + item5));
}
}
else
{
Debug.Log((object)"[SmartInjectors] 未找到(可能使用本地化名称)");
}
Debug.Log((object)"[SmartInjectors] ");
Debug.Log((object)"[SmartInjectors] === 6槽位容器物品 (可能是Injection Case) ===");
if (list2.Count > 0)
{
foreach (string item6 in list2)
{
Debug.Log((object)("[SmartInjectors] " + item6));
}
}
else
{
Debug.Log((object)"[SmartInjectors] 未找到");
}
Debug.Log((object)"[SmartInjectors] ");
Debug.Log((object)string.Format("{0} === 医疗相关物品 (共{1}个) ===", "[SmartInjectors]", list.Count));
foreach (string item7 in list)
{
Debug.Log((object)("[SmartInjectors] " + item7));
}
Debug.Log((object)"[SmartInjectors] ");
Debug.Log((object)"[SmartInjectors] ==========================================");
Debug.Log((object)"[SmartInjectors] 分析完成!");
Debug.Log((object)"[SmartInjectors] 日志文件位置: %AppData%\\..\\LocalLow\\TeamSoda\\Escape From Duckov\\Player.log");
Debug.Log((object)"[SmartInjectors] ==========================================");
}
catch (Exception ex)
{
Debug.LogError((object)("[SmartInjectors] 分析出错: " + ex.Message));
Debug.LogError((object)("[SmartInjectors] 堆栈: " + ex.StackTrace));
}
}
private void OnGUI()
{
if (injectionCaseUI != null)
{
injectionCaseUI.DrawGUI();
}
}
private void OnDisable()
{
Debug.Log((object)"[SmartInjectors] Mod 被禁用");
if (injectionCaseUI != null && injectionCaseUI.IsVisible)
{
injectionCaseUI.Hide();
}
}
private void OnDestroy()
{
Debug.Log((object)"[SmartInjectors] Mod 被卸载,清理资源...");
if (injectionCaseUI != null && injectionCaseUI.IsVisible)
{
injectionCaseUI.Hide();
}
injectionCaseUI = null;
}
}
}
namespace SmartInjectors.Tools
{
public class GameItemAnalyzer : ModBehaviour
{
private bool hasAnalyzed;
private void Start()
{
Debug.Log((object)"[SmartInjectors.Analyzer] 物品分析工具已加载");
Debug.Log((object)"[SmartInjectors.Analyzer] 按 F9 键分析游戏物品");
}
private void Update()
{
if (Input.GetKeyDown((KeyCode)290) && !hasAnalyzed)
{
AnalyzeAllItems();
hasAnalyzed = true;
}
if (Input.GetKeyDown((KeyCode)291))
{
hasAnalyzed = false;
AnalyzeAllItems();
}
}
private void AnalyzeAllItems()
{
Debug.Log((object)"[SmartInjectors.Analyzer] ==========================================");
Debug.Log((object)"[SmartInjectors.Analyzer] 开始分析游戏物品...");
Debug.Log((object)"[SmartInjectors.Analyzer] ==========================================");
try
{
ItemAssetsCollection instance = ItemAssetsCollection.Instance;
if ((Object)(object)instance == (Object)null)
{
Debug.LogError((object)"[SmartInjectors.Analyzer] 无法获取 ItemAssetsCollection!");
return;
}
List<Entry> entries = instance.entries;
Debug.Log((object)$"[SmartInjectors.Analyzer] 找到 {entries.Count} 个物品");
Debug.Log((object)"[SmartInjectors.Analyzer] ");
List<string> list = new List<string>();
List<string> list2 = new List<string>();
List<string> list3 = new List<string>();
foreach (Entry item4 in entries)
{
if (item4 != null && !((Object)(object)item4.prefab == (Object)null))
{
Item prefab = item4.prefab;
int typeID = item4.typeID;
string displayName = prefab.DisplayName;
TagCollection tags = prefab.Tags;
bool flag = (Object)(object)prefab.Slots != (Object)null && prefab.Slots.Count > 0;
int num = (flag ? prefab.Slots.Count : 0);
bool num2 = tags.Contains("Medical") || displayName.ToLower().Contains("medical") || displayName.ToLower().Contains("syringe") || displayName.ToLower().Contains("injection") || displayName.ToLower().Contains("药") || displayName.ToLower().Contains("针");
if (displayName.ToLower().Contains("injection") || displayName.ToLower().Contains("syringe") || displayName.Contains("注射") || displayName.Contains("针剂"))
{
string item = $"TypeID: {typeID}, 名称: {displayName}, 槽位: {num}";
list3.Add(item);
}
if (num2)
{
string item2 = $"TypeID: {typeID}, 名称: {displayName}";
list.Add(item2);
}
if (flag && num == 6)
{
string item3 = $"TypeID: {typeID}, 名称: {displayName}, 槽位: {num}, 重量: {prefab.UnitSelfWeight}kg";
list2.Add(item3);
}
}
}
Debug.Log((object)"[SmartInjectors.Analyzer] ");
Debug.Log((object)"[SmartInjectors.Analyzer] === 注射器/针剂相关物品 ===");
if (list3.Count > 0)
{
foreach (string item5 in list3)
{
Debug.Log((object)("[SmartInjectors.Analyzer] " + item5));
}
}
else
{
Debug.Log((object)"[SmartInjectors.Analyzer] 未找到(可能使用本地化名称)");
}
Debug.Log((object)"[SmartInjectors.Analyzer] ");
Debug.Log((object)"[SmartInjectors.Analyzer] === 6槽位容器物品 (可能是Injection Case) ===");
if (list2.Count > 0)
{
foreach (string item6 in list2)
{
Debug.Log((object)("[SmartInjectors.Analyzer] " + item6));
}
}
else
{
Debug.Log((object)"[SmartInjectors.Analyzer] 未找到");
}
Debug.Log((object)"[SmartInjectors.Analyzer] ");
Debug.Log((object)$"[SmartInjectors.Analyzer] === 医疗相关物品 (共{list.Count}个) ===");
foreach (string item7 in list.Take(20))
{
Debug.Log((object)("[SmartInjectors.Analyzer] " + item7));
}
if (list.Count > 20)
{
Debug.Log((object)$"[SmartInjectors.Analyzer] ... 还有 {list.Count - 20} 个");
}
Debug.Log((object)"[SmartInjectors.Analyzer] ");
Debug.Log((object)"[SmartInjectors.Analyzer] ==========================================");
Debug.Log((object)"[SmartInjectors.Analyzer] 分析完成!");
Debug.Log((object)"[SmartInjectors.Analyzer] 日志文件位置: %AppData%\\..\\LocalLow\\TeamSoda\\Escape From Duckov\\Player.log");
Debug.Log((object)"[SmartInjectors.Analyzer] ==========================================");
}
catch (Exception ex)
{
Debug.LogError((object)("[SmartInjectors.Analyzer] 分析出错: " + ex.Message));
Debug.LogError((object)("[SmartInjectors.Analyzer] 堆栈: " + ex.StackTrace));
}
}
}
}
namespace SmartInjectors.Examples
{
public class APIExamples : ModBehaviour
{
private void Start()
{
Debug.Log((object)"[SmartInjectors.Examples] API 使用示例已加载");
RegisterItemUsageListeners();
ExampleAccessItemCollection();
}
private void OnDestroy()
{
UnregisterItemUsageListeners();
}
private void RegisterItemUsageListeners()
{
UsageUtilities.OnItemUsedStaticEvent += OnAnyItemUsed;
CharacterMainControl.OnMainCharacterStartUseItem += OnMainCharacterStartUseItem;
Debug.Log((object)"[SmartInjectors.Examples] 物品使用监听器已注册");
}
private void UnregisterItemUsageListeners()
{
UsageUtilities.OnItemUsedStaticEvent -= OnAnyItemUsed;
CharacterMainControl.OnMainCharacterStartUseItem -= OnMainCharacterStartUseItem;
}
private void OnAnyItemUsed(Item item)
{
Debug.Log((object)"[SmartInjectors.Examples] 物品被使用:");
Debug.Log((object)(" - 名称: " + item.DisplayName));
Debug.Log((object)$" - TypeID: {item.TypeID}");
Debug.Log((object)$" - 堆叠数: {item.StackCount}");
}
private void OnMainCharacterStartUseItem(Item item)
{
Debug.Log((object)("[SmartInjectors.Examples] 主角开始使用: " + item.DisplayName));
}
private void ExampleAccessItemCollection()
{
ItemAssetsCollection instance = ItemAssetsCollection.Instance;
if ((Object)(object)instance == (Object)null)
{
Debug.LogError((object)"[SmartInjectors.Examples] 无法获取 ItemAssetsCollection");
}
else
{
Debug.Log((object)$"[SmartInjectors.Examples] 游戏中共有 {instance.entries.Count} 个物品");
}
}
private void ExampleAddCustomItem()
{
}
private void ExampleRemoveCustomItem(Item customItemPrefab)
{
}
private void ExampleAddBuffToCharacter()
{
}
private void ExampleAccessItemSlots(Item containerItem)
{
if ((Object)(object)containerItem.Slots == (Object)null || containerItem.Slots.Count == 0)
{
Debug.Log((object)"[SmartInjectors] 该物品没有槽位");
return;
}
Debug.Log((object)$"[SmartInjectors] 槽位数量: {containerItem.Slots.Count}");
for (int i = 0; i < containerItem.Slots.Count; i++)
{
Slot val = containerItem.Slots[i];
Debug.Log((object)$"[SmartInjectors] 槽位 {i}:");
Debug.Log((object)(" - Key: " + val.Key));
Debug.Log((object)(" - 内容: " + (((Object)(object)val.Content != (Object)null) ? val.Content.DisplayName : "空")));
}
}
}
}