这个模组可以帮助你快速装备武器和盾牌,以及武器和火把。
这个模组可以帮助快速装备武器和盾牌,以及武器和火把。
using BepInEx;
using HarmonyLib;
using UnityEngine;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
using BepInEx.Configuration;
namespace EquipOffHand
{
[BepInPlugin("innocreator.equipoffhand", "EquipOffHand", "1.0")]
[BepInProcess("valheim.exe")]
public class EquipOffHand : BaseUnityPlugin
{
public static ConfigEntry<bool> showDebugMessages;
public static ConfigEntry<bool> equipWeapon;
public static ConfigEntry<bool> unequipShield;
public static ConfigEntry<bool> unequipTorch;
private readonly Harmony harmony = new Harmony("innocreator.equipoffhand");
void Awake()
{
showDebugMessages = Config.Bind<bool>("General", "showDebugMessages", false, "显示脚本调试信息。");
equipWeapon = Config.Bind<bool>("选项", "equipWeapon", true, "当你拿出火把时,自动装备你最强的武器。");
unequipShield = Config.Bind<bool>("Options", "unequipShield", true, "收起武器时,自动卸下你的护盾。");
unequipTorch = Config.Bind<bool>("Options", "unequipTorch", true, "收起武器时,自动卸下火把。");
harmony.PatchAll();
}
[HarmonyPatch(typeof(Humanoid), nameof(Humanoid.EquipItem))]
public static class EquipOffHand_EquipItem
{
private static bool Postfix(bool __result, Humanoid __instance, ItemDrop.ItemData item)
{
List<Player> playersList = Player.GetAllPlayers();
Player playerOneList = playersList[0];
Player playerOneReference = Player.GetPlayer(playerOneList.GetPlayerID());
if (!__result || !playerOneReference.IsPlayer() || !playerOneReference)
返回假;
if (playerOneReference.RightItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.OneHandedWeapon)
{
if (showDebugMessages.Value)
Debug.Log("innoCretaor 装备武器");
如果(玩家一引用.右手物品?.共享物品类型 == 物品掉落.物品数据.物品类型.火把 ||
playerOneReference.LeftItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Torch ||
playerOneReference.LeftItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield)
{
if (showDebugMessages.Value)
Debug.Log("innoCretaor 已装备火把或盾牌");
返回假;
}
List<ItemDrop.ItemData> inventoryItems = playerOneReference.GetInventory().GetAllItems();
ItemDrop.ItemData bestShield = inventoryItems.Where(inventoryItem =>
inventoryItem.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield &&
!inventoryItem.m_equipped).OrderByDescending(inventoryItem =>
inventoryItem.m_shared.m_blockPower).FirstOrDefault();
if (bestShield != null)
playerOneReference.EquipItem(bestShield, false);
}
if (equipWeapon.Value && playerOneReference.RightItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Torch)
{
如果(showDebugMessages.Value)
Debug.Log("innoCretaor 装备火把");
if (playerOneReference.LeftItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield)
{
if (showDebugMessages.Value)
Debug.Log("innoCretaor 装备盾牌 已装备");
返回false;
}
List<ItemDrop.ItemData> inventoryItems = playerOneReference.GetInventory().GetAllItems();
ItemDrop.ItemData bestOneHandWeapon = inventoryItems.Where(inventoryItem =>
inventoryItem.m_shared.m_itemType == ItemDrop.ItemData.ItemType.OneHandedWeapon &&
!inventoryItem.m_equipped).OrderByDescending(inventoryItem =>
inventoryItem.m_shared.m_attack).FirstOrDefault();
if (bestOneHandWeapon != null)
playerOneReference.EquipItem(bestOneHandWeapon, false);
}
return __result;
}
}
[HarmonyPatch(typeof(Humanoid), nameof(Humanoid.UnequipItem))]
public static class EquipOffHand_UnequipItem
{
private static void Postfix(Humanoid __instance, ItemDrop.ItemData item)
{
List<Player> playersList = Player.GetAllPlayers();
Player playerOneList = playersList[0];
Player playerOneReference = Player.GetPlayer(playerOneList.GetPlayerID());
if (!playerOneReference || !playerOneReference.IsPlayer() || item?.m_shared.m_itemType != ItemDrop.ItemData.ItemType.OneHandedWeapon)
return;
if (showDebugMessages.Value)
Debug.Log("innoCretaor 卸下武器");
List<ItemDrop.ItemData> inventoryItems = playerOneReference.GetInventory().GetAllItems();
if (unequipShield.Value && playerOneReference.LeftItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield)
{
if (showDebugMessages.Value)
Debug.Log("innoCretaor 卸下盾牌");
inventoryItems.Where(itemEquipped =>
itemEquipped.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Shield &&
itemEquipped.m_equipped).FirstOrDefault();
playerOneReference.UnequipItem(equippedShield, false);
返回;
}
if (unequipTorch.Value && playerOneReference.LeftItem?.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Torch)
{
if (showDebugMessages.Value)
Debug.Log("innoCretaor 卸下火把");
inventoryItems.Where(itemEquipped =>
itemEquipped.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Torch &&
itemEquipped.m_equipped).FirstOrDefault();
playerOneReference.UnequipItem(equippedTorch, false);
return;
}
}
}
}
}