【MinecraftConnection】ライブラリメモ #3

自作ライブラリのメモその3です。PlayerData クラスにて、プレイヤーのアイテム情報を取得する機能を追加。

  • GetHandItems (string PlayerName) : プレイヤーの手持ちアイテムを取得
  • GetInventoryItems (string PlayerName) : プレイヤーのインベントリアイテムを取得
  • GetLeftHandItem (string PlayerName) : プレイヤーの左手に持っているアイテムを取得
  • GetEquipmentItems (string PlayerName) : プレイヤーの装備アイテムを取得

GetLeftHandItem の返り値は Item
それ以外は List<Item>

使用例

class Program
{
    private static IPAddress IP = IPAddress.Parse("127.0.0.1");
    private static ushort Port = 25575;
    private static string Password = "minecraft";
    private static RCON rcon = new RCON(IP, Port, Password);

    static void Main(string[] args)
    {
        PlayerData data = new PlayerData(rcon);

        string PlayerName = "<PlayerName>";

        var InventoryItems = data.GetInventoryItems(PlayerName);
        var HandItems = data.GetHandItems(PlayerName);
        var EquipmentItems = data.GetEquipmentItems(PlayerName);
        var LeftHandItem = data.GetLeftHandItem(PlayerName);

        Console.WriteLine("=== インベントリスロットアイテム ===");
        foreach (var item in InventoryItems)
        {
            Console.WriteLine($"{item.GetItemSlot()} 番目のアイテムは {item.GetItemID()} で {item.GetItemCount()} 個所持しています。");
        }

        Console.WriteLine("=== 手持ちスロットアイテム ===");
        foreach (var item in HandItems)
        {
            Console.WriteLine($"{item.GetItemSlot()} 番目のアイテムは {item.GetItemID()} で {item.GetItemCount()} 個所持しています。");
        }

        Console.WriteLine("=== 装備アイテム ===");
        foreach (var item in EquipmentItems)
        {
            Console.WriteLine($"{item.GetItemSlot()} 番目のアイテムは {item.GetItemID()} で {item.GetItemCount()} 個所持しています。");
        }

        Console.WriteLine("=== 左手のアイテム ===");
        Console.WriteLine($"{LeftHandItem.GetItemSlot()} 番目のアイテムは {LeftHandItem.GetItemID()} で {LeftHandItem.GetItemCount()} 個所持しています。");
    }
}

f:id:takunology:20210107061025p:plain

問題点

GetLeftHandItem メソッドを使用したとき、プレイヤーの左手にアイテムを持っていない場合、Item オブジェクトが null になってしまう。

これが ぬるり(NullReferenceException) ってやつですな。

今は例外対策として空気ブロック ("minecraft:air") を持っていることにしているが、「アイテム情報の取得」としては微妙なところ。