ページ 11

クラスの書き換えについて

投稿記事Posted: 2018年5月06日(日) 06:15
by 1.7.10modder
1.7.10,forge10.13.4.1558でmoddingをしています。
クラスの書き換えを使って、自作の羊肉を羊からドロップさせたいのですが、
チュートリアルを読んでも、いまいちよくわかりません。

どなたか、一からわかりやすく教えてください。
お願いします。

Re: クラスの書き換えについて

投稿記事Posted: 2018年5月06日(日) 23:50
by alice
1.7.10でドロップを追加するのであれば、LivingDropsEventの実装を行えばクラスの書き換えをしなくても実現出来ると思います。
コード: 全て選択
public class SheepEvent
{
  // モブが倒されてアイテムをドロップする直前に呼ばれるイベント
  @SubscribeEvent
  public void onLivingDrop(LivingDropsEvent eventDrop)
  {
    // 倒れたのは羊かどうか?
    if(eventDrop.entityLiving instanceof EntitySheep)
    {
      // ドロップアイテムを拾ったとき、プレーヤーのインベントリに加わるItemStackを作成する
      ItemStack item = new ItemStack(自作の羊肉のItemインスタンス, メタデータ, 個数);
      // 上記のItemStackからドロップアイテムを生成する
      // 座標は倒れたモブの位置にする
      EntityItem entityItem = new EntityItem(eventDrop.entityLiving.worldObj, eventDrop.entityLiving.posX, eventDrop.entityLiving.posY, eventDrop.entityLiving.posZ, item);
      // ドロップ一覧に追加
      eventDrop.drops.add(entityItem);
    }
  }
}

このようなクラスを作成後、FMLInitializationEventでMinecraftForge.EVENT_BUS.register(new SheepEvent());とすれば目的の動作は実現するはずです。

最後に、クラスの書き換えは他に方法が無い最終手段としておいたほうがよろしいかと。

Re: クラスの書き換えについて

投稿記事Posted: 2018年5月12日(土) 05:04
by 1.7.10modder
ありがとうございます。
では、既存のレシピを削除するのも、クラスの書き換えを使わずにできますか?
お願いします。

Re: クラスの書き換えについて

投稿記事Posted: 2018年5月12日(土) 17:40
by defeatedcrow
1.7.10modder さんが書きました:ありがとうございます。
では、既存のレシピを削除するのも、クラスの書き換えを使わずにできますか?
お願いします。


基本的に、書き換えは難易度が高いので上級者向きです
(既存チュートリアルの読解に不自由している状態では論外です)

レシピ削除は、バニラのCraftingManagerにある全クラフトレシピの一覧リストを
CraftingManager.getInstance().getRecipeList()
で取得できるので、このリストから目的のレシピ(IRecipeインターフェイスの形で入っています)を取得し、リストから削除してやれば削除できます
(Listの取り扱いについてはModding以前の予備知識の範疇なので除外)

1.7の場合、最新版と違ってバニラのレシピかForgeのOreRecipe(鉱石辞書レシピ)かどうかでinputの型が違うので、材料を調べたい場合は難易度が若干上がります
削除はせず、鉱石辞書レシピに変換して自動追加する機能であれば過去に作ったことがあるのでソースを置いときます
https://github.com/defeatedcrow/FluidityFoodstuffs_1.7.10/blob/master/java/defeatedcrow/addonforamt/fluidity/recipe/CustomizeVanillaRecipe.java

Re: クラスの書き換えについて

投稿記事Posted: 2018年5月13日(日) 20:03
by 1.7.10modder
本当にありがとうございます。
やってみます。

Re: クラスの書き換えについて

投稿記事Posted: 2018年7月14日(土) 13:17
by 1.7.10modder
またすみません
羊肉のドロップについてなのですが、
・ドロップ数をランダムにする
・ドロップ増加に対応させる
・燃えながら倒すと焼いた羊肉を落とす
なんてことはできないでしょうか?

Re: クラスの書き換えについて

投稿記事Posted: 2018年7月15日(日) 17:30
by 1.7.10modder
もう一つ
リンゴのように葉っぱからランダムに出すことはできますか?
いろいろな果物を作って、それぞれドロップする確率を変えたいのですが

Re: クラスの書き換えについて

投稿記事Posted: 2018年8月08日(水) 16:33
by 草あんこ
エンティティが燃えていた場合は以下のコードをItemStack stack = ...の次の行に入れたらいいと思います。
コード: 全て選択
//燃えていたらアイテムを変える
if(eventDrop.entityLiving.isBurning()) {
   item = new ItemStack(肉, 個数, メタデータ);
}

ドロップ増加は以下のコードを上のコードの下にいれてください
コード: 全て選択
//倒したエンティティがプレイヤーだったら
if(eventDrop.source.getEntity() instanceof EntityPlayer) {
   EntityPlayer player = (EntityPlayer)eventDrop.source.getEntity();
   Random rand = new Random();
   //持っているアイテムのドロップ増加のレベル取得。エンチャントがない、もしくはアイテムを持っていなければ0
   int level = EnchantmentHelper.getEnchantmentLevel(Enchantment.looting.effectId, player.inventory.getCurrentItem());
   //個数を増やす
   item.stackSize+=rand.nextFloat()*level;
}

ドロップ数をランダムにするにはRandomクラスを使えばOKです。
ドロップ増加の個数を増やすところは好きに変えてください。そのままだとドロップ増加Ⅲでも増えないことがあります。

Re: クラスの書き換えについて

投稿記事Posted: 2018年8月09日(木) 06:48
by 1.7.10modder
ありがとうございます。