1098 lines
36 KiB
C#
1098 lines
36 KiB
C#
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 : "空")));
|
||
}
|
||
}
|
||
}
|
||
}
|