12格针包
This commit is contained in:
@@ -2,8 +2,9 @@ using System;
|
||||
using HarmonyLib;
|
||||
using ItemStatsSystem;
|
||||
using ItemStatsSystem.Items;
|
||||
using UnityEngine;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using Duckov.Utilities;
|
||||
|
||||
namespace test
|
||||
{
|
||||
@@ -16,6 +17,18 @@ namespace test
|
||||
public class InjectionBagSlotPatch
|
||||
{
|
||||
private const int InjectionBagTypeID = 882;
|
||||
private const int TargetSlotCount = 12;
|
||||
private const int AdditionalSlots = 6;
|
||||
|
||||
// 记录已经修改过的物品,避免重复修改
|
||||
private static readonly HashSet<int> modifiedItems = new HashSet<int>();
|
||||
|
||||
// 缓存反射方法,避免重复获取
|
||||
private static readonly ConstructorInfo SlotConstructor = typeof(Slot).GetConstructor(new Type[] { typeof(string) });
|
||||
private static readonly FieldInfo RequireTagsField = typeof(Slot).GetField("requireTags", BindingFlags.Public | BindingFlags.Instance);
|
||||
private static readonly MethodInfo SlotInitializeMethod = typeof(Slot).GetMethod("Initialize", BindingFlags.Public | BindingFlags.Instance);
|
||||
private static readonly MethodInfo BuildDictionaryMethod = typeof(SlotCollection).GetMethod("BuildDictionary", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
|
||||
/// <summary>
|
||||
/// Initialize方法的后缀补丁
|
||||
/// 在物品初始化后检查是否是注射器收纳包
|
||||
@@ -25,41 +38,76 @@ namespace test
|
||||
[HarmonyPostfix]
|
||||
static void Postfix(Item __instance)
|
||||
{
|
||||
Debug.Log($"[注射器收纳包修改] 被调用");
|
||||
|
||||
// 检查是否是注射器收纳包
|
||||
if (__instance == null || __instance.TypeID != InjectionBagTypeID || __instance.Slots == null)
|
||||
// 快速检查:是否是注射器收纳包
|
||||
if (__instance?.TypeID != InjectionBagTypeID || __instance.Slots == null)
|
||||
return;
|
||||
|
||||
// 检查是否已经修改过这个物品实例
|
||||
int instanceId = __instance.GetInstanceID();
|
||||
if (!modifiedItems.Add(instanceId)) // 使用Add的返回值检查是否已存在
|
||||
return;
|
||||
|
||||
// 获取槽位集合
|
||||
SlotCollection slots = __instance.Slots;
|
||||
|
||||
if (slots.Count == 12)
|
||||
return;
|
||||
|
||||
// 获取原始槽位数量
|
||||
int originalSlotCount = slots.Count;
|
||||
|
||||
// 如果已经是目标槽位数量,则不需要修改
|
||||
if (originalSlotCount == TargetSlotCount)
|
||||
return;
|
||||
|
||||
// 获取第一个槽位的标签,用于复制
|
||||
List<Tag> firstSlotTags = null;
|
||||
if (originalSlotCount > 0 && slots.list.Count > 0)
|
||||
{
|
||||
var firstSlot = slots.list[0];
|
||||
if (firstSlot != null)
|
||||
{
|
||||
firstSlotTags = RequireTagsField?.GetValue(firstSlot) as List<Tag>;
|
||||
}
|
||||
}
|
||||
|
||||
// 预分配槽位列表容量,减少内存重新分配
|
||||
if (slots.list.Capacity < originalSlotCount + AdditionalSlots)
|
||||
{
|
||||
slots.list.Capacity = originalSlotCount + AdditionalSlots;
|
||||
}
|
||||
|
||||
// 添加6个新的槽位
|
||||
for (int i = 0; i < 6; i++)
|
||||
for (int i = 0; i < AdditionalSlots; i++)
|
||||
{
|
||||
// 创建新的Slot对象
|
||||
Slot newSlot = (Slot)typeof(Slot).GetConstructor(new Type[0])?.Invoke(null);
|
||||
|
||||
// 设置Slot的Key属性
|
||||
typeof(Slot).GetField("Key", BindingFlags.Public | BindingFlags.Instance)?.SetValue(newSlot, $"Slot_{originalSlotCount + i}");
|
||||
string slotKey = $"InjectionSlot_{originalSlotCount + i + 1}";
|
||||
|
||||
// 使用缓存的构造函数创建新的Slot对象
|
||||
Slot newSlot = SlotConstructor?.Invoke(new object[] { slotKey }) as Slot;
|
||||
|
||||
// 复制第一个槽位的requireTags
|
||||
if (newSlot != null && firstSlotTags != null && firstSlotTags.Count > 0)
|
||||
{
|
||||
// 创建新的Tag列表并复制第一个槽位的Tag
|
||||
var newTags = new List<Tag>(firstSlotTags.Count);
|
||||
for (int j = 0; j < firstSlotTags.Count; j++)
|
||||
{
|
||||
var tag = firstSlotTags[j];
|
||||
if (tag != null)
|
||||
{
|
||||
newTags.Add(tag);
|
||||
}
|
||||
}
|
||||
RequireTagsField?.SetValue(newSlot, newTags);
|
||||
}
|
||||
|
||||
// 初始化Slot
|
||||
SlotInitializeMethod?.Invoke(newSlot, new object[] { slots });
|
||||
|
||||
// 添加到槽位列表
|
||||
slots.list.Add(newSlot);
|
||||
|
||||
// 初始化Slot
|
||||
typeof(Slot).GetMethod("Initialize", BindingFlags.Public | BindingFlags.Instance)?.Invoke(newSlot, new object[] { slots });
|
||||
}
|
||||
|
||||
// 重建字典缓存
|
||||
typeof(SlotCollection).GetMethod("BuildDictionary", BindingFlags.NonPublic | BindingFlags.Instance)?.Invoke(slots, null);
|
||||
|
||||
Debug.Log($"[注射器收纳包修改] 已将物品ID {__instance.TypeID} 的槽位数量从{originalSlotCount}修改为{slots.Count}");
|
||||
BuildDictionaryMethod?.Invoke(slots, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user