游戏狂人
 
- 贡献度
- 109
- 金元
- 5991
- 积分
- 1045
- 精华
- 1
- 注册时间
- 2010-3-23

|
能否有不改钱的方案呢,我问了下AI,给了一套在物品买卖界面“增加珍宝价值排序”的能力:
using HarmonyLib;
using Il2Cpp;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using UnityEngine;
using UnityEngine.UI;
[assembly: MelonInfo(typeof(TreasureSortMod.Core), "TreasureSortMod", "1.0.0", "YourName")]
[assembly: MelonGame()]
namespace TreasureSortMod
{
public class Core : MelonMod
{
public override void OnInitializeMelon()
{
LoggerInstance.Msg("TreasureSortMod loaded.");
}
}
// 自定义排序状态(用静态字段跨 Hook 共享)
public static class SortState
{
// Dropdown 中我们注入的选项索引(原始有6个选项 0-5,我们加在末尾)
public const int CustomSortDropdownIndex = 6;
public const string CustomSortLabel = "珍宝性价比";
// 当前是否处于自定义排序模式(每个 ItemListController 实例独立)
// key = controller 的 IntPtr
public static readonly System.Collections.Generic.Dictionary<IntPtr, bool> IsCustomSort
= new System.Collections.Generic.Dictionary<IntPtr, bool>();
}
// ─── 1. Hook ChangeSortType:检测 Dropdown 选到我们注入的选项 ───────────
[HarmonyPatch(typeof(ItemListController), nameof(ItemListController.ChangeSortType))]
public static class Patch_ChangeSortType
{
static bool Prefix(ItemListController __instance)
{
var dd = __instance.sortTypeDropDown;
if (dd == null) return true;
if (dd.value == SortState.CustomSortDropdownIndex)
{
// 标记此控制器使用自定义排序,阻止原生逻辑(它会因枚举越界而报错或回退)
SortState.IsCustomSort[__instance.Pointer] = true;
// 不调用原始方法,手动触发刷新
__instance.RefreshItemList(false);
return false; // skip original
}
else
{
SortState.IsCustomSort[__instance.Pointer] = false;
return true; // 正常走原生逻辑
}
}
}
// ─── 2. Hook FreshList:在原生执行后,若是自定义排序则重新排列子节点 ───
[HarmonyPatch(typeof(ItemListController), nameof(ItemListController.FreshList))]
public static class Patch_FreshList
{
static void Postfix(ItemListController __instance)
{
if (!SortState.IsCustomSort.TryGetValue(__instance.Pointer, out bool isCustom) || !isCustom)
return;
var grid = __instance.itemGrid;
if (grid == null) return;
// 收集所有 ItemIconController 子节点
var icons = new System.Collections.Generic.List<ItemIconController>();
for (int i = 0; i < grid.transform.childCount; i++)
{
var child = grid.transform.GetChild(i);
if (!child.gameObject.activeSelf) continue;
var icon = child.GetComponent<ItemIconController>();
if (icon != null) icons.Add(icon);
}
// 计算"性价比" = GetTreasureRealValue / max(value, 1)
// 只对珍宝类排序;非珍宝类放在末尾
icons.Sort((a, b) =>
{
float ratioA = GetTreasureRatio(a);
float ratioB = GetTreasureRatio(b);
// 降序(性价比高的在前)
return ratioB.CompareTo(ratioA);
});
// 重新设置子节点的 sibling index
for (int i = 0; i < icons.Count; i++)
{
icons[i].transform.SetSiblingIndex(i);
}
}
// 性价比 = 真实价值 / 标价(value)
// value 是物品基础标价,GetTreasureRealValue 是实际价值(受鉴定影响)
static float GetTreasureRatio(ItemIconController icon)
{
var item = icon.itemData;
if (item == null) return -1f;
// 非珍宝类排后面
if (item.type != ItemType.TreasureType) return -1f;
int realVal = item.GetTreasureRealValue(); // 实际价值
int baseVal = item.value; // 标价/当前售价
if (baseVal <= 0) return realVal > 0 ? float.MaxValue : 0f;
return (float)realVal / baseVal;
}
}
// ─── 3. Hook ResetSortType:清除自定义排序标记 ──────────────────────────
[HarmonyPatch(typeof(ItemListController), nameof(ItemListController.ResetSortType))]
public static class Patch_ResetSortType
{
static void Prefix(ItemListController __instance)
{
SortState.IsCustomSort[__instance.Pointer] = false;
}
}
// ─── 4. 向 Dropdown 注入新选项(在 FreshList 第一次调用时注入一次)────────
[HarmonyPatch(typeof(ItemListController), nameof(ItemListController.FreshList))]
public static class Patch_InjectDropdownOption
{
static readonly System.Collections.Generic.HashSet<IntPtr> _injected
= new System.Collections.Generic.HashSet<IntPtr>();
static void Prefix(ItemListController __instance)
{
if (_injected.Contains(__instance.Pointer)) return;
var dd = __instance.sortTypeDropDown;
if (dd == null) return;
// 检查是否已经注入(防止重复)
var options = dd.options;
if (options.Count > SortState.CustomSortDropdownIndex)
{
_injected.Add(__instance.Pointer);
return;
}
// 添加新选项
var newOption = new Dropdown.OptionData(SortState.CustomSortLabel);
options.Add(newOption);
dd.options = options;
_injected.Add(__instance.Pointer);
MelonLogger.Msg($"[TreasureSortMod] Injected sort option into Dropdown on {__instance.Pointer}");
}
}
}
求看看靠不靠谱 |
|