using System;
using HarmonyLib;
using ItemStatsSystem;
using ItemStatsSystem.Items;
using System.Reflection;
using System.Collections.Generic;
using Duckov.Utilities;
namespace test
{
///
/// 注射器收纳包槽位修改补丁
/// 将注射器收纳包(ID 882)的槽位数量从6个修改为12个
///
[HarmonyPatch(typeof(Item))]
[HarmonyPatch("Initialize")]
public class InjectionBagSlotPatch
{
private const int InjectionBagTypeID = 882;
private const int TargetSlotCount = 12;
private const int AdditionalSlots = 6;
// 记录已经修改过的物品,避免重复修改
private static readonly HashSet modifiedItems = new HashSet();
// 缓存反射方法,避免重复获取
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);
///
/// Initialize方法的后缀补丁
/// 在物品初始化后检查是否是注射器收纳包
/// 槽位默认6个,变为12个
///
/// Item实例
[HarmonyPostfix]
static void Postfix(Item __instance)
{
// 快速检查:是否是注射器收纳包
if (__instance?.TypeID != InjectionBagTypeID || __instance.Slots == null)
return;
// 检查是否已经修改过这个物品实例
int instanceId = __instance.GetInstanceID();
if (!modifiedItems.Add(instanceId)) // 使用Add的返回值检查是否已存在
return;
// 获取槽位集合
SlotCollection slots = __instance.Slots;
// 获取原始槽位数量
int originalSlotCount = slots.Count;
// 如果已经是目标槽位数量,则不需要修改
if (originalSlotCount == TargetSlotCount)
return;
// 获取第一个槽位的标签,用于复制
List firstSlotTags = null;
if (originalSlotCount > 0 && slots.list.Count > 0)
{
var firstSlot = slots.list[0];
if (firstSlot != null)
{
firstSlotTags = RequireTagsField?.GetValue(firstSlot) as List;
}
}
// 预分配槽位列表容量,减少内存重新分配
if (slots.list.Capacity < originalSlotCount + AdditionalSlots)
{
slots.list.Capacity = originalSlotCount + AdditionalSlots;
}
// 添加6个新的槽位
for (int i = 0; i < AdditionalSlots; i++)
{
// 设置Slot的Key属性
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(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);
}
// 重建字典缓存
BuildDictionaryMethod?.Invoke(slots, null);
}
}
}