Terraria Mod開発の話

暇なときのメモ書き

剣をカスタマイズしよう

今回は、勝手に追加されている剣のアイコンのアイテムをカスタマイズします。
前回作った自分のModフォルダのItemsに入っている.csファイルを開きましょう。
今回は、Mod名をBlogMod、アイテム名をBlogSwordという名前にしてあります。
プログラミングの入門的なのをざっくり眺めて行くと楽かもしれません、めんどくさい(しあまり関係のない)説明は飛ばします。

public class BlogSword : ModItem
{
	public override void SetStaticDefaults()
	{
		DisplayName.SetDefault("Ultimate Blog Sword"); //名前を自由に変えられる
		Tooltip.SetDefault("Super cool weapon."); //ツールチップも
	}
	public override void SetDefaults()
	{
		item.damage = 270; //ダメージ
		item.crit = 33;
		item.melee = true; //近接かどうか
		item.width = 40; //幅
		item.height = 40; //高さ
		item.useTime = 20; //振り速度
		item.useAnimation = 20; //振りアニメーションの時間 思惑がないならuseTimeと同じにすること
		item.useStyle = 1; //剣を振るタイプ、1~5まであるので試そう
		item.knockBack = 6; //ノックバック
		item.value = 10000; //買値
		item.rare = 2; //レアリティ、文字色と溶岩焼けに影響
		item.UseSound = SoundID.Item1; //振る音
		item.autoReuse = true; //自動振り
		item.channel = false; //弾をコントロールできる魔法杖とかで使う、使用している状態でキープ(アニメーションが終わっても使用中になる)
		item.noMelee = false; //trueにするとアイテムの振りで当たり判定がなくなる
		item.shoot = ProjectileID.TerraBeam; //撃ちたいプロジェクタイルをIDで入れる
		item.shootSpeed = 12f; //バニラAIを使う時は基本的に最大速度が16fになる、それ以上でも設定可
	}
}

最初にpublic override SetStaticDefault()ですが、これはアイテムがModLoaderに読み込まれた時に使われます。用途は名前の変更とか。ダブルクオーテーション"で囲まれている部分を適当な名前に変えれば変わります。Tooltip.SetDefaultも同様に中身を変えられます。gelのIt looks tasty!とかあんな感じで、アイテムの使い方とか注意点を書くなら書くで。
んで、SetDefaults()ですがこれが本日のメインディッシュです。アイテムが生成された時に読み込まれます。色々変えて試してみましょう。item.damageを適当に10万なり100万なりにすればムンロをワンパンできる剣が誕生します。とてもつよい。バランスなんて知らん
わかりにくいのがitem.useTimeとitem.useAnimationで、useTimeは剣で言う振り速度、銃の連射間隔で1/60単位です。useAnimationは終わるまで武器を使い続けます。具体的には、Clockwork AssaltRifleとかは一回のクリックで3回撃ちますよね。あんな感じです。AnimationをuseTimeが二回収まって余りが出るようにすればできます。

Item.useSoundは使った時の音で、nullもしくは設定しない(行ごと消す)ことで消えます。
item.widthとitem.heightはそれぞれアイテムの幅、高さで、これらはテクスチャの読み込み、当たり判定(攻撃時とワールドに落ちている時)とかに影響します。
さいつよの剣は出来ました、が振った時にエフェクトがありません!のでBlogSword内に下のを追加します。

public override void MeleeEffects(Player player, Rectangle hitbox)
        {
            if (Main.rand.Next(3) == 0) // 1 / 3の確率
            {
                Dust.NewDust(new Vector2(hitbox.X, hitbox.Y), hitbox.Width, hitbox.Height, DustID.Fire); //ダストを生成します
            }
        }

テラリアのエフェクトは大体ダストで管理されているので、これらを生成します。
さらに詳細にカスタマイズするには、
それから、肝心なもの…弾を出しましょう。
ひとまず、TerraBladeと同じ弾を出します。
item.shootに出したい弾のIDを代入します。それから、item.shootSpeedにも同様に適当な数値を入れておきましょう。
いちいちソースコードを見た人がプロジェクタイルのIDから内容を追うのは非効率的なので、Terraria.IDを使います。Terraria.ID.ProjectileID.をitem.shootに代入します。それだけであとは勝手にやってくれます。これで魔法剣の完成です。
SetDefault()内に

item.shoot = ProjectileID.TerraBeam;
item.shootSpeed = 12f;

さて、コードを書き換えてもそれだけじゃ反映されません。ビルドしましょう。
タイトルからMod Sourses、一覧から自分のModを探して、Build + Reloadします。これで反映されました。
新キャラ新ワールドを作るなりで試しましょう。
f:id:kodamamiyabi:20180202214144j:plain
f:id:kodamamiyabi:20180202214154j:plain

基本的に数値を書き換える→足りない所をExampleModとかから引っ張ってくるとかで解決します。
ってことで最後にサイトとかの紹介。
forums.terraria.org
Mod開発に関する公式のガイドラインです。絶対に読んでください。

Home · blushiemagic/tModLoader Wiki · GitHub
tModLoaderのWikiです。これに大体書いてあるんで正直このブログはいらなかったり。
最後に、テラリアのソースコードを読みましょう。方法は説明しませんが色々あるんで、ソースコードを手に入れたら作りたいものにバニラで近いアイテムを探して、それの処理を見てみると参考になります。
コピペでもできるんであとは名前をわかりやすく変えたりとか色々やって、後から見る自分が困らないようにしましょう。