初心者にも分かるMODの作り方を

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.10981)

初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年10月28日(金) 13:51

Minecraft Japan Wiki - Modding にもレシピの作り方はありますが、
1つしか紹介してないので他にも知りたいと思いまして・・・。

ちなみに私は武器の作り方が分からず困っております。

出来ればソースコードに解説を書いてトピックに上げて欲しいと思っています。
(海外のサイトをみてもさっぱりなので、日本語で解説が欲しいのです。)
最終的にはJP wikiにでも上げたいと思ってます。
syoMO
ID:30ecf54a
 

  • (PostNo.11136)

Re: 初心者にも分かるMODの作り方を

投稿記事by iwa_yukinoshita » 2011年10月29日(土) 23:04

武器といっても様々な種類があるので、どんな武器を作りたいのか
具体的な説明がないとなかなか難しいですが...

基本的に、剣などの近接系武器はItemSword、弓矢などの飛び道具は
ItemBowとEntityArrowをベースに少しずつ改造していくのが一番の近道ではないでしょうか。
画像
アバター
iwa_yukinoshita
ID:a0fe52b8
石炭掘り
 
記事: 163
登録日時: 2011年7月24日(日) 17:27

  • (PostNo.11140)

Re: 初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年10月29日(土) 23:33

武器といっても様々な種類があるので、どんな武器を作りたいのか
具体的な説明がないとなかなか難しいですが...

基本的に、剣などの近接系武器はItemSword、弓矢などの飛び道具は
ItemBowとEntityArrowをベースに少しずつ改造していくのが一番の近道ではないでしょうか。


>初心者にも分かるMODの作り方なので、ItemSword ・ItemBow・EntityArrowの中身について
 (攻撃力の設定方法や素材の変更の仕方等)を知り、そこから自作の武器を作り出すと言う感じですかね。

今回なら、木の原木から木の剣よりも耐久力・攻撃力がある木刀を作り出すって言うのはどうでしょう?
素材も手に入りやすいですし、説明するにはいいと思います。

弓なら鉄の弓にして、攻撃力上昇っていう感じでしたいですね。
飛び道具って弓・矢どっちを強化すればいいのか分からないので、そういう説明とかあると理解しやすいと思います。
syoMO
ID:30ecf54a
 

  • (PostNo.11170)

Re: 初心者にも分かるMODの作り方を

投稿記事by gloamingmoon » 2011年10月30日(日) 12:39

syoMO さんが書きました:出来ればソースコードに解説を書いてトピックに上げて欲しいと思っています。
(海外のサイトをみてもさっぱりなので、日本語で解説が欲しいのです。)
最終的にはJP wikiにでも上げたいと思ってます。

口幅ったいようですがいちおう。

他の方に解説を書いていただくのはいいとして、Wiki に上げるかどうかは書いていただいた方に了解をとってからにしてくださいね。
:red: :red:   三 :pdi: :ore: :ore: :ore:
掘るぜぇ~、超掘るぜぇ~!
アバター
gloamingmoon
ID:52b66e12
レッドストーン掘り
 
記事: 665
登録日時: 2011年6月21日(火) 09:53

  • (PostNo.11205)

Re: 初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年10月30日(日) 18:17

口幅ったいようですがいちおう。
他の方に解説を書いていただくのはいいとして、Wiki に上げるかどうかは書いていただいた方に了解をとってからにしてくださいね。

>確かに無断で載せるのはいけないですね。うっかりしてました。
syoMO
ID:30ecf54a
 

  • (PostNo.11208)

Re: 初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年10月30日(日) 18:34

iwa_yukinoshita さんが書きました:武器といっても様々な種類があるので、どんな武器を作りたいのか
具体的な説明がないとなかなか難しいですが...

基本的に、剣などの近接系武器はItemSword、弓矢などの飛び道具は
ItemBowとEntityArrowをベースに少しずつ改造していくのが一番の近道ではないでしょうか。


コード: 全て選択
package net.minecraft.src;

public class ItemSword extends Item
{
    public ItemSword(int i, EnumToolMaterial enumtoolmaterial)
    {
        super(i);
        maxStackSize = 1;
        setMaxDamage(enumtoolmaterial.getMaxUses());
        weaponDamage = 4 + enumtoolmaterial.getDamageVsEntity() * 2;
        //ここで攻撃力の設定をしている。
    }
    public float getStrVsBlock(ItemStack itemstack, Block block)
    {
        return block.blockID != Block.web.blockID ? 1.5F : 15F;
        //STR(攻撃力)vsBlockの設定?
    }
    public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
    {
        itemstack.damageItem(1, entityliving1);
        return true;
    //MOBの場合は1ポイントの耐久値の減少
    }
    public boolean onBlockDestroyed(ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
    {
        itemstack.damageItem(2, entityliving);
        return true;
    //MOB以外は2ポイントの耐久値の減少
    }
    public int getDamageVsEntity(Entity entity)
    {
        return weaponDamage;
    }
    public boolean isFull3D()
    {
        return true;
    }
    public boolean canHarvestBlock(Block block)
    {
        return block.blockID == Block.web.blockID;
        //ブロックが収穫(canHarvest)出来るかどうか?
    }
    private int weaponDamage;
}

このような感じだと思うんですが、違っていたらご指摘頂きたいのですが・・・。
というか、これも載せていいのでしょうか・・・?
syoMO
ID:30ecf54a
水から上がったとこ
 
記事: 8
登録日時: 2011年10月30日(日) 18:20

  • (PostNo.11243)

Re: 初心者にも分かるMODの作り方を

投稿記事by laco0416 » 2011年10月30日(日) 22:25

あくまでも予定ではありますが近日中に簡単なMOD製作チュートリアルのページを作成してまとめるつもりなので
もし待って頂けるのでしたら武器の追加も項目に足しましょうか?
MOD作ったりしてます。らこと呼んでください
http://forum.minecraftuser.jp/viewtopic.php?f=13&t=1047
アバター
laco0416
ID:f991a69e
石炭掘り
 
記事: 150
登録日時: 2011年9月17日(土) 19:58

  • (PostNo.11256)

Re: 初心者にも分かるMODの作り方を

投稿記事by iwa_yukinoshita » 2011年10月31日(月) 00:26

syoMO さんが書きました:
iwa_yukinoshita さんが書きました:武器といっても様々な種類があるので、どんな武器を作りたいのか
具体的な説明がないとなかなか難しいですが...

基本的に、剣などの近接系武器はItemSword、弓矢などの飛び道具は
ItemBowとEntityArrowをベースに少しずつ改造していくのが一番の近道ではないでしょうか。


コード: 全て選択
package net.minecraft.src;

public class ItemSword extends Item
{
    public ItemSword(int i, EnumToolMaterial enumtoolmaterial)
    {
        super(i);
        maxStackSize = 1;
        setMaxDamage(enumtoolmaterial.getMaxUses());
        weaponDamage = 4 + enumtoolmaterial.getDamageVsEntity() * 2;
        //ここで攻撃力の設定をしている。
    }
    public float getStrVsBlock(ItemStack itemstack, Block block)
    {
        return block.blockID != Block.web.blockID ? 1.5F : 15F;
        //STR(攻撃力)vsBlockの設定?
    }
    public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
    {
        itemstack.damageItem(1, entityliving1);
        return true;
    //MOBの場合は1ポイントの耐久値の減少
    }
    public boolean onBlockDestroyed(ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
    {
        itemstack.damageItem(2, entityliving);
        return true;
    //MOB以外は2ポイントの耐久値の減少
    }
    public int getDamageVsEntity(Entity entity)
    {
        return weaponDamage;
    }
    public boolean isFull3D()
    {
        return true;
    }
    public boolean canHarvestBlock(Block block)
    {
        return block.blockID == Block.web.blockID;
        //ブロックが収穫(canHarvest)出来るかどうか?
    }
    private int weaponDamage;
}

このような感じだと思うんですが、違っていたらご指摘頂きたいのですが・・・。
というか、これも載せていいのでしょうか・・・?


大まかな説明についてはあっていると思います。
そのほかの関数については以下のような意味を持ちます。
public ItemSword(int i, EnumToolMaterial enumtoolmaterial) //剣の初期化を行う。
  super(i); //各アイテム共通の初期化を行う。
  maxStackSize = 1; //インベントリで重ねられる数を設定する。剣は重ねられないので1。
  setMaxDamage(enumtoolmaterial.getMaxUses()); //剣の耐久度を設定する。材料によって変わる。
  weaponDamage = 4 + enumtoolmaterial.getDamageVsEntity() * 2; //剣の攻撃力を設定する。材料によって変わる。

public float getStrVsBlock(ItemStack itemstack, Block block) //ブロックの破壊速度を返す。
  return block.blockID != Block.web.blockID ? 1.5F : 15F; //もしクモの巣ブロックであれば素手の15倍、それ以外のブロックは1.5倍。

public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
          //この武器を使ってentityliving1(通常はプレイヤー)がentityliving(通常はMob)を攻撃したときに呼ばれる。
  itemstack.damageItem(1, entityliving1); //剣の耐久度を1減らす。
  return true; //攻撃が成功したことを返す。

public boolean onBlockDestroyed(ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
          //この武器を使ってブロックが破壊されたときに呼ばれる。
  itemstack.damageItem(2, entityliving); //剣の耐久度を2減らす。
  return true;ブロック破壊が成功したことを返す。

public int getDamageVsEntity(Entity entity) //剣の攻撃力を返す。
  return weaponDamage; //初期化のときに設定した攻撃力を返す。

public boolean isFull3D() //手に持ったときに厚みを持たせるかどうか。
  return true; //剣なので厚みを持たせる。

public EnumAction getItemUseAction(ItemStack itemstack) //剣を使ったときの動作を返す。
  return EnumAction.block; //ブロックと同じ(振る)動作を行う。

public int getMaxItemUseDuration(ItemStack itemstack) //剣を防御に使ったときの持続時間。
  return 0x11940; //10進数では72000。

public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
               //アイテムを持って右クリックしたときに呼ばれる。
  entityplayer.setItemInUse(itemstack, getMaxItemUseDuration(itemstack)); //剣を防御に使う。
  return itemstack; //使ったアイテムを返す。

public boolean canHarvestBlock(Block block) //素手で壊してもアイテムにならないブロックを剣で壊した際、アイテムが得られるかどうか。
  return block.blockID == Block.web.blockID; //クモの巣であればアイテムを得られる。

private int weaponDamage; //剣の攻撃力を表す変数。


...とここまで解説して、laco氏が返信されていたことに今更気付くという罠。
画像
アバター
iwa_yukinoshita
ID:a0fe52b8
石炭掘り
 
記事: 163
登録日時: 2011年7月24日(日) 17:27

  • (PostNo.11274)

Re: 初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年10月31日(月) 03:58

iwa_yukinoshita さん
>解説、凄い分かりやすかったです。ありがとうございます。
ちなみに材料の指定は「enumtoolmaterial」って言うので指定してるんですか?
中身にダイヤとか色々書いてありましたが、後の括弧の中が良く分からなくて・・・。

後、新しい剣を作るにはenumtoolmaterial + Item を弄らないといけなんですか?
それともmod_sword みたいなものを作って設定するんですか?

laco0416 さん
>是非、武器の項目も追加して頂きたいです!
チュートリアル作成は大変かも知れませんが、頑張ってください!
syoMO
ID:30ecf54a
水から上がったとこ
 
記事: 8
登録日時: 2011年10月30日(日) 18:20

  • (PostNo.11528)

Re: 初心者にも分かるMODの作り方を

投稿記事by amami » 2011年11月03日(木) 11:52

初めまして、amamiと言います、スレ違いでしたら申し訳ありません。

http://www26.atwiki.jp/minecraft/pages/86.html
上記のMinecraft Wikiに書かれている、データの準備の段階で、ModLoaderを導入したminecraft.jarを用意するという項目がありました。
Mod制作はModLoaderを導入したほうが良いと書かれていたので、今回はModLoaderを導入した方法で行おうと思いました。
ですのでminecraft.jarのMETA-INFを削除してから、ModLoaderを導入し、decompile.batをクリックし、ソースが展開されたまでは良かったのですが、
ModLoaderの導入が成功した時に展開される、BaseMod.java, ModLoader.java が見当たりませんでした。
バージョンは確認したので間違いはないと思いますが、もしここが違うという指摘がありましたらぜひよろしくお願いします。
amami
ID:d0e12104
 

  • (PostNo.11623)

Re: 初心者にも分かるMODの作り方を

投稿記事by laco0416 » 2011年11月04日(金) 14:20

遅くなりましたが自作剣追加MODのチュートリアルを投稿しましたのでここでもお知らせしておきます。質問等はあちらでお願いします。 頃合いを見てこの記事も削除されると良いと思います。
MOD作ったりしてます。らこと呼んでください
http://forum.minecraftuser.jp/viewtopic.php?f=13&t=1047
アバター
laco0416
ID:f991a69e
石炭掘り
 
記事: 150
登録日時: 2011年9月17日(土) 19:58

  • (PostNo.11689)

Re: 初心者にも分かるMODの作り方を

投稿記事by syoMO » 2011年11月05日(土) 10:44

amami さんが書きました:初めまして、amamiと言います、スレ違いでしたら申し訳ありません。

http://www26.atwiki.jp/minecraft/pages/86.html
上記のMinecraft Wikiに書かれている、データの準備の段階で、ModLoaderを導入したminecraft.jarを用意するという項目がありました。
Mod制作はModLoaderを導入したほうが良いと書かれていたので、今回はModLoaderを導入した方法で行おうと思いました。
ですのでminecraft.jarのMETA-INFを削除してから、ModLoaderを導入し、decompile.batをクリックし、ソースが展開されたまでは良かったのですが、
ModLoaderの導入が成功した時に展開される、BaseMod.java, ModLoader.java が見当たりませんでした。
バージョンは確認したので間違いはないと思いますが、もしここが違うという指摘がありましたらぜひよろしくお願いします。



質問トピックに似たような質問があったような気がするので、そちらの方で聞いてみたらどうでしょう。
もう一度最初からやってみるのが一番いいかと思いますが・・・。
syoMO
ID:30ecf54a
水から上がったとこ
 
記事: 8
登録日時: 2011年10月30日(日) 18:20

  • (PostNo.15494)

Re: 初心者にも分かるMODの作り方を

投稿記事by ノーブ » 2011年12月05日(月) 07:29

プログラミング初心者ですが自分向けに機能改善したMODを作りたいと思い立ってMOD製作にとりかかろうとしています
そこで現在使っている道具の耐久度が下がったりしたら通知するMODを作りたいのですが
ItemTool.javaをぼーっと眺めていてもそれらしきものが見当たりませんでした
各ソースコードの役割?というものはファイル名から推測して探す以外に方法はないのでしょうか?
メッセージを表示するのは日本人の方々が作ったソースコードを真似ながらなんとかできそうなのですが・・・
ノーブ
ID:3155e0d7
 

  • (PostNo.16733)

Re: 初心者にも分かるMODの作り方を

投稿記事by SpringMine » 2011年12月15日(木) 22:53

アイテムの耐久度が下がるのはMobを殴ったときとブロックが壊れたときで。
ItemToolsのhitEntityメソッドとonBlockDestroyedに同じ
itemstack.damageItemって処理がありますよね。
じゃこれがアイテムにダメージ入れる命令なんだなってあたりつけます。
このメソッド書き換えてアイテムが壊れそうになったらやりたい処理を挟めばよいかと。

onなんちゃらってメソッドは何か別のところで条件成立したときに実行されることが多いとか。
getなんちゃらは外から内部のテータ参照するときが多いとか。
そういうお約束的な名前がちゃんと付いてればそれを目印に探したりします。

Eclipse使うとこういうメソッドを追いかけるのが捗りますので、むしろ初心者こそ使うべきと思う。
SpringMine
ID:7bacda2c
石炭掘り
 
記事: 177
登録日時: 2011年12月07日(水) 22:14

  • (PostNo.17228)

Re: 初心者にも分かるMODの作り方を

投稿記事by ノーブ » 2011年12月19日(月) 18:28

返信ありがとうございます、おっしゃる通り ItemStack.java にアイテムにダメージを加算したり壊れたりするメソッドがありました。
おかげさまで無事メッセージ表示させることができたので満足です。

更に改造をしようと思って壊れたら同じアイテムをインベントリから持ってきて装備というのをしようと思いましたが、
メッセージを表示させるような簡単な弄り方ではどうにもなりそうにないですね。おとなしくこのまま使ってみます。
同じ初心者の方に参考になるかどうかは分かりませんが一応コードをはっておきます。

ItemStack.java
コード: 全て選択
public void damageItem(int i, EntityLiving entityliving)
 {
 // 中略
 itemDamage += i;
 int mod_i = getMaxDamage(); // getMaxDamageの使い方が分からず...
 if(itemDamage > getMaxDamage()) // 壊れた時の処理
  // 中略
  } else if (10 > mod_i - itemDamage) // 耐久値?が10以下になったら
  {
  // ここでメッセージ表示、俺の場合はよくわからず ModLoader を利用した形をとりました
  // 引数?はいらないと思うんですが色々試していた名残です
  mod_helloworld.textmessageshow(mod_i - itemDamage);
  }


mod_helloworld.java に関してはソースを書くのが億劫なので適当な流れを説明します。
このフォーラムにある色んなチュートリアルを参考に Version とか getVersion とか load とか書きます。

俺の場合はキーボードで ON/OFF を設定したかったので下記URLの記事を読んで大体の流れを把握しました。
viewtopic.php?f=21&t=281
要するにModloader の API? にある KeyboardEvent を使えばいいとのことみたいです。
そこでここのフォーラムにあるMOD公開所にあった SpawnChecker のソースを参考にしました。

コード: 全て選択
ModLoader.RegisterKey(this, new KeyBinding("ToggleKey", 55), false); // 55 は NumPad の " * " (アスタリスク)
// 中略
public void KeyboardEvent(KeyBinding keybinding)
{
Minecraft mc = ModLoader.getMinecraftInstance();
if(mc.currentScreen != null) return;
// ここに押された時の処理
}


後は ModLoader の API? にある addChatMessage を利用して簡単にメッセージを表示させることが可能でした。

コード: 全て選択
Minecraft mc = ModLoader.getMinecraftInstance();
mc.ingameGUI.addChatMessage("Kowaresou kamo?");


後は割合でメッセージを表示させたいところですがその辺は試行錯誤中です。と、まあこんな感じです。
もしかしたらほとんどが他の方が書いたコードの流用なのでここに書いちゃ著作権違反?にでもなりそうなのでアレなんですけど...
全体的に分かりにくい文章なのは俺の頭の出来が ;-(
ノーブ
ID:1ca07439
水から上がったとこ
 
記事: 1
登録日時: 2011年12月19日(月) 18:08


Return to 質問:開発・制作関連

x