プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

TerrariaのtModLoader過去からの変更対応

はじめに

tModLoaderがv0.10.1時点で製作したModについて。現時点(2021/05/19)のv0.11.8.4に対応するための変更点についてまとめる。

テクスチャ

次のように配置していたテクスチャを

My Games\Terraria\ModLoader\Mod Sources\TeraInfo\waku.png

次のように読込んでいた。

namespace Hoge
{
    class TeraInfo : Mod
    {
        private Texture2D waku;
        public override void Load()
        {
            waku = GetTexture("waku");
              :
        }
    }
}

tModLoaderのWikiでは次のように説明がある。
Basic Autoload · tModLoader/tModLoader Wiki · GitHub

だが、これはどうもアイテムなんかと紐付ける方法なので、うまくいかない。
こういったときはサンプルを確認するのが手っ取り早い。
クラスとファイルが違うものを探していたら次のコードが参考に。
tModLoader/ExampleResourceBar.cs at master · tModLoader/tModLoader · GitHub

次のようにすればよい事がわかった。

waku = ModContent.GetTexture("TeraInfo/waku");

プレイヤーデータ

ビルドした際にエラーが出るのでわかる。
これはそのまま変更についてのガイドがあるので従う。
Update Migration Guide · tModLoader/tModLoader Wiki · GitHub

簡単に言えば、引数にmodのインスタンスを渡していたのを何も渡す必要がなくなっただけ。

player.GetModPlayer<TeraInfoPlayer>(mod);
↓
player.GetModPlayer<TeraInfoPlayer>();

Modの変更をtModLoader標準の設定で行えるようにする

以前は「Mod Settings Configurator」を使用していたが、現在はtModLoaderに設定変更できるUIが実装されている。
以下はNPCInfoの例。

using System.ComponentModel;
using Terraria.ModLoader.Config;

namespace NPCInfo
{
	[Label("Config")]
	public class NPCInfoConfig : ModConfig
	{
		public override ConfigScope Mode => ConfigScope.ClientSide;

		[Label("Cheat mode")]
		[DefaultValue(false)]
		public bool isCheatMode;

		[Label("NPC Info ui position lock")]
		[DefaultValue(false)]
		public bool isUiLock;

		[Label("Display time of npc")]
		[DefaultValue(30)]
		public int timeOut;

		[Label("Display drop info")]
		[DefaultValue(true)]
		public bool isDisplayDropInfo = true;

		[Label("Display spawn npc value")]
		[DefaultValue(true)]
		public bool isDisplaySpawnValue = true;

		[Label("Display drop item value")]
		[DefaultValue(true)]
		public bool isDisplayDropItemValue = true;

		[Label("Animation")]
		[DefaultValue(true)]
		public bool isAnimation = false;

		[Label("Animation speed")]
		[DefaultValue(10)]
		public int animationSpeed = 10;


		public override void OnChanged() {
			Config.isCheatMode = isCheatMode;
			Config.isLock = isUiLock;
			Config.timeOut = timeOut;
			Config.isDisplayDropInfo = isDisplayDropInfo;
			Config.isDisplaySpawnValue = isDisplaySpawnValue;
			Config.isDisplayDropItemValue = isDisplayDropItemValue;
			Config.isAnimation = isAnimation;
			Config.animationSpeed = animationSpeed;
		}
	}
}

とりあえず、以前に使用していた設定を使うためにOnChangedで設定しなおしているが、その内直したい。
ModConfigを継承したクラスで、publicなフィールドを作成すれば、型に合わせて適切なUIで表示される。
使用する際は次のようにする。というか基本的にconfigに限らず。ModContent.GetInstance<T>();インスタンス取得するという事かな。

ModContent.GetInstance<NPCInfoConfig>().isCheatMode