【総合】トピック立てるまでもない質問【Mod制作】

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

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ShuperDark » 2018年1月07日(日) 18:51

こんにちは。
現在アイテムのGUIを作成中でして、GuiTextFieldの変数が3つありますが、クリックしても入力することが出来ません。
setFocusedをtrueにすると全てのGuiTextFieldが連動してしまい、文字を入力すると同じ文字が打たれてしまいます。
どうか対策できませんか?
お手間を取らせて申し訳ありませんが、マイクラのタブの大きさを変えるとGuiButtonの位置がずれてしまいます(最大のときは正常な位置です)
これはどうすることもできないのでしょうか

GuiTravelRod
コード: 全て選択
import org.lwjgl.opengl.GL11;

import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;

public class GuiTravelRod extends GuiContainer {
   
   private static final ResourceLocation texture = new ResourceLocation("easytravel:textures/gui/container/generic_travel.png");
   
   private GuiTextField Guix;
   private GuiTextField Guiy;
   private GuiTextField Guiz;
   
   public GuiTravelRod(InventoryPlayer player) {
      super(new ContainerTravelRod(player));
      this.ySize = 222;
   }
   
   @Override
   public void initGui() {
      super.initGui();
      
      this.buttonList.add(new GuiButton(1, 210, 130, 100, 20, "Travel"));

       Guix = new GuiTextField(this.fontRendererObj, 70, 20, 50, 10);
         Guix.setMaxStringLength(8);
         Guix.setText("x");
         Guix.setFocused(false);
          
         Guiy = new GuiTextField(this.fontRendererObj, 70, 40, 50, 10);
         Guiy.setMaxStringLength(8);
         Guiy.setText("y");
         Guiy.setFocused(false);
          
         Guiz = new GuiTextField(this.fontRendererObj, 70, 60, 50, 10);
         Guiz.setMaxStringLength(8);
         Guiz.setText("z");
         Guiz.setFocused(false);
   }
   
   @Override
    protected void drawGuiContainerForegroundLayer(int x, int p_146979_2_)
    {
        this.fontRendererObj.drawString("TravelRod", 8, 6, 4210752);
        this.fontRendererObj.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752);
        this.fontRendererObj.drawString("x:", 56, 20, 4210752);
        this.fontRendererObj.drawString("y:", 56, 40, 4210752);
        this.fontRendererObj.drawString("z:", 56, 60, 4210752);

        Guix.drawTextBox();
       
        Guiy.drawTextBox();
       
        Guiz.drawTextBox();
    }
   
   @Override
   protected void keyTyped(char par1, int par2) {
      super.keyTyped(par1, par2);
      this.Guix.textboxKeyTyped(par1, par2);
      this.Guiy.textboxKeyTyped(par1, par2);
      this.Guiz.textboxKeyTyped(par1, par2);
   }
   
   @Override
   protected void mouseClicked(int x, int y, int btn) {
      super.mouseClicked(x, y, btn);
      this.Guix.mouseClicked(x, y, btn);
      this.Guiy.mouseClicked(x, y, btn);
      this.Guiz.mouseClicked(x, y, btn);
   }
   
   @Override
   public void updateScreen() {
      super.updateScreen();
      Guix.updateCursorCounter();
      Guiy.updateCursorCounter();
      Guiz.updateCursorCounter();
   }
   
    @Override
       protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_)
       {
           GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
           this.mc.getTextureManager().bindTexture(texture);
           int k = (this.width - this.xSize) / 2;
           int l = (this.height - this.ySize) / 2;
           this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
       }

}



開発環境は1.7.10です。
アバター
ShuperDark
ID:85d166a0
人生、宇宙、すべての答え
 
記事: 42
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.312969)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by 紅い妖精 » 2018年1月22日(月) 17:57

minecraft1.8.9にて、銃modを自作してみたいと思い defeatedcrowさんの制作記録を参考にコードを書いてみている者です。
セミオート射撃をさせようと思いonItemRightClickで銃弾entityを呼び出しているのですが、これだとクリックしている間射撃してしまうので、
ネットで調べてみると onPlayerStoppedUsingというものでできる という結論に至りコードを書いてみました。

しかし、いざ動かしてみるとonPlayerStoppedUsingが呼び出されていないようで、原因がわからず現在お手上げ状態です。
どなたかご教授いただけないでしょうか
コード: 全て選択
package com.redwings.wingsguns.Item;

import java.util.Random;

import com.redwings.wingsguns.wingsguns;
import com.redwings.wingsguns.Entity.ACP45;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class M1911 extends Item
{
   Random r = new Random();
   protected int reloadcounter = 0;
   protected int reloadspeed = 4;
   protected int shotcounter = 0;
   protected int shotdelay = 0;
   protected int recoil = 2;
   protected int yawrecoil = 1;

   protected boolean fire = false;

   public M1911()
   {
      String name = "M1911";
      this.setCreativeTab( CreativeTabs.tabCombat );
      this.setUnlocalizedName( name );
      maxStackSize = 1;

      return;
   }

   @Override
   public void setDamage(ItemStack stack, int damage) {
      return;
   }

   @Override
   // このメソッドは、プレイヤーがブロックをターゲットしていないときに呼ばれる方のRightClickメソッド。
   public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
   {
      if(par3EntityPlayer.isSneaking()) //シフト右クリックで強制リロード
      {
         if (par3EntityPlayer.inventory.hasItem(wingsguns.itemACP45))
         {
            if(reloadcounter == reloadspeed)
            {
               reloadcounter = 0;
                  NBTTagCompound nbt = par1ItemStack.getTagCompound();
               if (nbt != null)
               {
                  nbt.setInteger("magazine", 7);
                  par1ItemStack.setTagCompound(nbt);
               } else {
                  NBTTagCompound nbt2 = new NBTTagCompound();
                  nbt2.setInteger("magazine", 7);
                  par1ItemStack.setTagCompound(nbt2);
               }
               par3EntityPlayer.inventory.consumeInventoryItem(wingsguns.itemACP45);
               par2World.playSoundAtEntity(par3EntityPlayer, "random.door_close", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1.3F);
            } else {
               ++reloadcounter;
            }
         }
      } else if ((shotcounter == shotdelay) && !fire)
         {
         // クリエイティブモードか
         boolean creative = par3EntityPlayer.capabilities.isCreativeMode;
         // マガジンが空でないかどうか
         boolean hasCharge = false;
         if (reloadcounter == reloadspeed)
         {
            if (par1ItemStack.getItem() == this)
            {
               // 弾薬減少処理。
               int c2 = this.discharge(par1ItemStack, 1, false);
               if (c2 > 0)
               {
                  hasCharge = true;
                  this.discharge(par1ItemStack, 1, true);
               }
            }
         }
         if (creative || hasCharge)
         {
            int yawFlag = r.nextInt(3);
            // Entityのスポーン処理はisRemote判定を利用してサーバー側のみで行うこと!
            if (!par2World.isRemote)
            {
               float dam = 2.0F; // ダメージ量
               int cooltime = 0; // 一旦凍結。常に0を入れる
               float speed = 3.0F; // 弾速
               float f = speed;
               ACP45 bullet = new ACP45(par2World, par3EntityPlayer, f, 0.0F, dam, 4.0F, cooltime);
               par2World.spawnEntityInWorld(bullet);
            }
               par3EntityPlayer.rotationPitch += (itemRand.nextFloat() * -3F) * this.recoil;
            if (yawFlag == 1)
            {
               par3EntityPlayer.rotationYaw += (itemRand.nextFloat() * -1F) * this.yawrecoil;
            } else if (yawFlag == 2)
            {
               par3EntityPlayer.rotationYaw -= (itemRand.nextFloat() * -1F) * this.yawrecoil;
            }
            System.out.println("fire is true");

            par3EntityPlayer.setItemInUse(par1ItemStack, getMaxItemUseDuration(par1ItemStack));
            fire = true;
         } else {
            // この処理に飛んでいるということは弾切れなので、弾薬を補充する処理をする
            if (par3EntityPlayer.inventory.hasItem(wingsguns.itemACP45))
            { // ...変更箇所(1)
               if(reloadcounter == reloadspeed)
               {
                  reloadcounter = 0;
                     NBTTagCompound nbt = par1ItemStack.getTagCompound();
                  if (nbt != null)
                  {
                     nbt.setInteger("magazine", 7);
                     par1ItemStack.setTagCompound(nbt);
                  } else {
                     NBTTagCompound nbt2 = new NBTTagCompound();
                     nbt2.setInteger("magazine", 7);
                     par1ItemStack.setTagCompound(nbt2);
                  }
                  par3EntityPlayer.inventory.consumeInventoryItem(wingsguns.itemACP45); // ...変更箇所(2)
                  par2World.playSoundAtEntity(par3EntityPlayer, "random.door_close", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1.3F);
                  } else {
                  ++reloadcounter;
               }
            } else if (reloadcounter != reloadspeed)
            {
               ++reloadcounter;
            }
         }
      } else
      {
         ++shotcounter; //次弾発射までのカウントを進める
      }
      return par1ItemStack;
   }

   @Override
   public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4)
   {
      System.out.println("fire is false");
      fire = false;
      return;
   }

   // onEatenのほうの右クリック処理ではそのままItemStackを返す(つまりなにもしない)
   public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
   {
      return par1ItemStack;
   }

   // onItemRightClickで呼んでいる弾の消費処理
   // 今は使っていないが、弾薬を2以上減らす場合にも応用できるようにしている
   public int discharge(ItemStack item, int amount, boolean flag)
   {
      if (item == null)
      return 0;

      // NBTに入れている弾の数が足りているかの判定と、第三引数がtrueなら減少させている
      NBTTagCompound nbt = item.getTagCompound();
      int charge = 0;
      int reduce = 0;
      if (nbt != null && nbt.hasKey("magazine"))
      {
         charge = nbt.getInteger("magazine");
      }
      reduce = Math.min(amount, charge);

      if (flag)
      {
         if (nbt != null)
         {
            nbt.setInteger("magazine", (charge - reduce));
            item.setTagCompound(nbt);
         } else {
            NBTTagCompound nbt2 = new NBTTagCompound();
            nbt2.setInteger("magazine", (charge - reduce));
            item.setTagCompound(nbt2);
         }
      }
      return reduce;
   }

   // 耐久値ゲージを表示するかどうかのフラグ
   @Override
   public boolean showDurabilityBar(ItemStack stack)
   {
      return true;
   }

   // このメソッドで耐久値の代わりに弾の残量をゲージ表示できるようにしている。
   // 0.0Dを返したときがMAXで、1.0Dを返すとゲージがなくなったように見える。よって、MAX - 残量 を計算して返している。
   @Override
   public double getDurabilityForDisplay(ItemStack stack)
   {
      NBTTagCompound nbt = stack.getTagCompound();
      int charge = 0;
      int max = 7;
      if (nbt != null && nbt.hasKey("magazine"))
      {
         charge = nbt.getInteger("magazine");
         charge = MathHelper.clamp_int(charge, 0, max);
      }
         int i = max - charge;
      return (double) i / (double) max;
   }

   public boolean isFull3D()
   {
      return true;
   }
}
紅い妖精
ID:ac8dd680
水から上がったとこ
 
記事: 2
登録日時: 2018年1月22日(月) 17:19

  • (PostNo.313034)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by 紅い妖精 » 2018年1月24日(水) 18:22

先日このトピックで質問した者ですが(上のやつ)、onPlayerStoppedUsing処理を使わずに
onUpdate処理で右クリックしていないときを検知する という方法にすることで 自己解決しましたので報告させていただきます

コード: 全て選択
@Override
   public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3EntityPlayer, int itemSlot, boolean isSelected)
   {
      if((!Mouse.isButtonDown(1)) && (fire))
      {
         fire = false;
      }

   }
紅い妖精
ID:ac8dd680
水から上がったとこ
 
記事: 2
登録日時: 2018年1月22日(月) 17:19

  • (PostNo.314007)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Clow » 2018年2月23日(金) 03:33

はじめまして、Moddingを始めてみたいと考える者です。
一部のMODにある、「開発者版」って、作っておいたほうがいいんでしょうか?

僕の中での開発者版のイメージは
コメント文が多めで、自分以外のModderにコードのどこで何をしているのかがわかりやすくなっているもの
って感じなんですけど...

そもそもの認識が間違っているor開発者版の必要不要について、皆様のご回答のほどをよろしくお願いいたします。
Clow
ID:bd220ed6
水から上がったとこ
 
記事: 2
登録日時: 2018年2月23日(金) 03:08
お住まい: 木の上

  • (PostNo.314012)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by kegare » 2018年2月23日(金) 16:49

Clow さんが書きました:はじめまして、Moddingを始めてみたいと考える者です。
一部のMODにある、「開発者版」って、作っておいたほうがいいんでしょうか?

僕の中での開発者版のイメージは
コメント文が多めで、自分以外のModderにコードのどこで何をしているのかがわかりやすくなっているもの
って感じなんですけど...

そもそもの認識が間違っているor開発者版の必要不要について、皆様のご回答のほどをよろしくお願いいたします。

開発版(For Development)のことでしょうか。少し認識が間違っています。
そもそも、Minecraftのソースコードは簡単に盗み見されないように難読化(すごく分かりづらい文字の羅列化)されています。
ですが、それでは全く仕組みがわからないので易読化(元のソースコードに近い状態に戻す)することで、私達Mod製作者がModを作ることができるようになります。
Modのコーディングを終えた後ビルドして出来上がったものはまた元の状態に適合するように、難読化されて出力されます。
これが、ユーザーが導入する実際のModファイルになります。
しかし、難読化されたModを開発環境で使おうとすると、ソースコードが一致しないため、勿論動作しません。
そのため、易読化されたままのいわば生状態で開発環境でも動作するバージョンが開発版です。
で、結局必要か不要かで言えば、ほとんどの場合不要です。
必要になるとすれば、他ModがあなたのModと連携できるような仕組みにした場合になるかと思います。
長文になり申し訳ありません。
アバター
kegare
ID:830946fb
レッドスト―ン掘り
 
記事: 692
登録日時: 2012年10月27日(土) 06:06

  • (PostNo.314020)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年2月23日(金) 21:08

Clow さんが書きました:はじめまして、Moddingを始めてみたいと考える者です。
一部のMODにある、「開発者版」って、作っておいたほうがいいんでしょうか?

僕の中での開発者版のイメージは
コメント文が多めで、自分以外のModderにコードのどこで何をしているのかがわかりやすくなっているもの
って感じなんですけど...

そもそもの認識が間違っているor開発者版の必要不要について、皆様のご回答のほどをよろしくお願いいたします。


実環境用にビルドしたModは難読化がされているので開発環境に入れるライブラリとして働きません。
なので
・他のModder向けの連携用
・自作Mod間で連携を作るためにビルドする
などなどの理由で、難読化しないようにビルドしたdev版パッケージを作ります。

で、コレですが正直今はもう不要です
古いバージョンでは上記の問題がありましたが、

・現在(私が認識できているのは1.10くらいには既に)、実環境用の難読化後のModパッケージでも開発環境に入れればビルドは出来るようになった
 (※但しソースコードを見るならJDプラグインなんかの逆コンパイル手段か、別途ソースコードをパッケージにしてビルドパスで関連付けるとかが必要)
・1.7くらいの旧バージョンでも、開発環境にCodeChickenCore&NEIを導入することで難読化状態でも使用できる
 (NEIはレシピ確認やチート機能などが揃った強力な開発支援Modですが、こういう機能もついています)

なので、わざわざ用意しなくても連携機能の作成には問題ないです
どうしても作るとしたら、複数Modを開発中で相互に連携させるのにコメントで覚書がほしいとか、チームで開発していてコメント付きにしたい場合にdevパッケージの形が要るとか、そういう状況くらいじゃないでしょうか
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1016
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.314028)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Clow » 2018年2月24日(土) 00:39

返信遅れまして申し訳ありませんです!

そもそもの間違えからのご解説ありがとうございました!
開発版は他の人や自作他MODに連携して欲しいときに作ると良いのですね!

御二方、ご解説ありがとうございました!
それと、いつも楽しいMODをありがとうございます!
Clow
ID:bd220ed6
水から上がったとこ
 
記事: 2
登録日時: 2018年2月23日(金) 03:08
お住まい: 木の上

  • (PostNo.314482)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2018年3月09日(金) 15:18

こんにちは。
今、1.7.10で既存の書き換えをしようとしています。

http://minecraftjp.info/modding/index.p ... A%E7%A4%8E
http://minecraftjp.info/modding/index.p ... 9%E7%94%A8
https://www.tntmodders.com/tutorial/asm-1710/

以上のページを参考にしてみたのですが、メソッド全体の書き換えの方法がよくわかりませんでした。
自分で書き換えたいメソッドを全部書き直し、既存のものと丸ごと入れ替えたいのですが…
どなたかご教授ください。
modの公開をしています。
(ProactiveMod他バージョン対応版など)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 95
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.314500)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年3月09日(金) 20:50

gatya1129 さんが書きました:こんにちは。
今、1.7.10で既存の書き換えをしようとしています。

http://minecraftjp.info/modding/index.p ... A%E7%A4%8E
http://minecraftjp.info/modding/index.p ... 9%E7%94%A8
https://www.tntmodders.com/tutorial/asm-1710/

以上のページを参考にしてみたのですが、メソッド全体の書き換えの方法がよくわかりませんでした。
自分で書き換えたいメソッドを全部書き直し、既存のものと丸ごと入れ替えたいのですが…
どなたかご教授ください。


原則的に、書き換えはそのメソッドを使っている他のModに大迷惑なので、そのような方法はそもそも推奨されません。
というか、大抵の場合、やりたいことをやるために、メソッドをまるごと書き換える必要がないです
とても難易度の高い無意味なムダ行為をしようとしているので、やめましょう。

こういう場合はForgeのEvent処理を使えばいいです。
EventはForgeが用意している物を使うだけでなく、自作することも出来ます。
書き換えより簡単な方法ででき、メソッドの処理自体はそのまま残るのでMod同士の干渉も起こりづらくなります。

まず、ForgeがあらかじめEventを用意していないか探してください。あればそれを使えばいいです。
無ければ自分でEventを作って、そのイベントを発動させる”フック”のみを対象メソッドに差し込めばいいです。(この部分はasmによるコアモッド案件になりますが、メソッドの完全書き換えなどという狂気の所業よりずっと扱いやすくなります。)

- Eventとは

メソッド内に”イベントフック”を仕掛けると、その位置でメソッドの処理に介入できます。
多くはForge側で用意し、バニラのいろいろな処理に介入できるようにフックが仕掛けられています。

- こんな流れ
・バニラの処理の直前にフックが仕掛けられ、その処理が起きる前に、Eventの処理が呼ばれます。
・Eventメソッドの中で、Mod独自の処理を済ませます。
・@Cancelableのついたイベントは、Event処理が終わった後にキャンセルを選択すると、本来起るはずだったバニラの処理がなくなります。


これを使えば、ある特定の条件のときだけ、バニラの処理をなくして、自分のModの処理を代わりに起こすことが出来ます。
(ただしHaCのように自作する場合は、キャンセルで処理を中断させる部分も自作する必要があるので、キャンセル判定は使わずにイベントの結果を見てreturnさせていますが…)

- 実装例
これは1.12版HaCの例ですが、Forge独自のEventシステムは1.7当時から安定していて変わっていませんし、asmに関しても大きく変化がないはずなので流用可能だと思います
というわけで、HaCの実装例をどうぞ

A: 自作Event DCBlockFreezeEvent.java
 これは、水が氷ブロックに変化する判定への介入用につくった独自イベントです。このクラスは介入ポイントでしかないので、実際の処理はCで作ります。
 氷ブロックの溶解判定メソッドはForgeによる介入がないので、Bのコアモッド処理でイベントフックを挿入します。
B: コアモッド部分 DCMethodTransformer#hookOnBlockFreeze
 対象のバニラメソッドを一切書き換えせず、メソッドの先頭にAで作ったイベントフックを1行だけ追加しています。先頭に挿入すれば、バニラの処理の前に呼ばれるので。
 これにより、バニラの処理には手を加えず、最小限の介入でバニラ処理をつぶせます。
C: イベントの実装 BlockUpdateDC#canFreezePos
 Aで作ったイベントを実装し、中身の処理を作ります。HaCの気温システムで氷点下であれば、バニラの氷発生条件に関係なく、水が氷になります。

Cのイベントの実装は、このメソッドを作っただけではForgeに認識されないので、
メソッドに@SubscribeEventアノテーションを付ける
メソッドのあるクラス(ここではBlockUpdateDC.class)のインスタンスを、Forgeに登録する
登録している部分は ここ です。
コード: 全て選択
MinecraftForge.EVENT_BUS.register(登録したいクラスのインスタンス);
というように書きます。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1016
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.314536)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2018年3月10日(土) 15:01

defeatedcrow さんが書きました:

どうもありがとうございました。そんなに難しいものだったんですね…
Eventがあったのでそれで実装しようと思います。
modの公開をしています。
(ProactiveMod他バージョン対応版など)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 95
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.314740)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ゲスト » 2018年3月16日(金) 02:36

ごく初歩的な質問ですみません。
moddingの勉強としてただmod一覧に表示されるだけのmodを作ろうとしているのですが、以下のように書いてrunをしてもmod一覧に表示すらされず困っております。
どなたか解決策を示してくだされば幸いです。

package com.test.testMod;




import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;


@Mod(modid = testMod.MOD_ID, name= testMod.MOD_NAME , version= testMod.MOD_VERSION )
public class testMod
{

public static final String MOD_ID = "testMod";
public static final String MOD_NAME = "test Mod";
public static final String MOD_VERSION = "1.0";

@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event)
{
//*5 Called when Pre-Initialize
}

@Mod.EventHandler
public void init(FMLInitializationEvent event)
{
//*5 Called when Initialize
}
}

標準的に付いているsamplemodは普通に読み込まれているので本体の問題ではないと思います。よろしくお願いします
ゲスト
ID:ad6511b9
 

  • (PostNo.314750)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by elise_blacklab » 2018年3月16日(金) 17:19

ゲスト さんが書きました:moddingの勉強としてただmod一覧に表示されるだけのmodを作ろうとしているのですが、以下のように書いてrunをしてもmod一覧に表示すらされず困っております。

ソースはちゃんとビルドパスに読み込まれていますかね.
modding wikiの記載通りに設定されていればsrc/main/java以下にソースを置けばコンパイルされるはずですが.

何より,ご自分が行った手順や環境の各種バージョン等の詳細は必ず記載してください.
viewtopic.php?f=5&t=999
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2485
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.314763)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by spicyfish » 2018年3月16日(金) 23:56

elise_blacklab さんが書きました:何より,ご自分が行った手順や環境の各種バージョン等の詳細は必ず記載してください.
viewtopic.php?f=5&t=999


すみませんでした。以降気を付けます
開発環境はforge-1.12.2-14.23.2.2611、使用ソフトはIntelliJ IDEA Community Edition 2017.1.1 x64で、
http://logiclab.blog.jp/archives/57723545.html に記載された方法をそのまま順当に実行して導入しました
対象のmodは先ほどのコードに記載された階層と同じ場所に入れてあるのですが、一緒に入れてあるsamplemodは読み込まれているのに対して作ったtestModの方はrunを押してもmod一覧に表示されないのです
そこには一つしかjavaファイルを入れてはいけない決まりなどはあるのでしょうか。
また、そこに書いたソースをminecraftが読み込んでくれていない場合、どのような操作を行えば読み込んでくれるようになるでしょうか。
重ね重ねどうかご教示よろしくお願いします。
spicyfish
ID:ad6511b9
水から上がったとこ
 
記事: 2
登録日時: 2018年3月16日(金) 23:34

  • (PostNo.314803)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2018年3月17日(土) 21:15

1.10.2での質問です。
あるアイテムを使った時に周りのブロックをまとめてドロップさせるmodを作りました。
それにシルクタッチモードを追加しようと、以下のようなコードを書いたのですが、一部ブロック(原木、木の葉など)が写真のような状態になってしまいます。
コード: 全て選択
Entity entity = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(),
    new ItemStack(Item.getItemFromBlock(block), 1, block.getMetaFromState(state)));
world.spawnEntityInWorld(entity);

※blockは壊したいブロック、stateはblockのIBlockState、worldはワールド、posはblockの座標です。

どのようにすればこれを回避できるのでしょうか?どなたかご教授願います。
ちなみに、原木、木の葉などでも、ちゃんとした状態でドロップするものもあります。
添付ファイル
2018-03-17_20.59.13.png
modの公開をしています。
(ProactiveMod他バージョン対応版など)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 95
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.314807)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年3月17日(土) 22:47

gatya1129 さんが書きました:1.10.2での質問です。
あるアイテムを使った時に周りのブロックをまとめてドロップさせるmodを作りました。
それにシルクタッチモードを追加しようと、以下のようなコードを書いたのですが、一部ブロック(原木、木の葉など)が写真のような状態になってしまいます。
コード: 全て選択
Entity entity = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(),
    new ItemStack(Item.getItemFromBlock(block), 1, block.getMetaFromState(state)));
world.spawnEntityInWorld(entity);

※blockは壊したいブロック、stateはblockのIBlockState、worldはワールド、posはblockの座標です。

どのようにすればこれを回避できるのでしょうか?どなたかご教授願います。
ちなみに、原木、木の葉などでも、ちゃんとした状態でドロップするものもあります。


モデルがjson化した1.8以降、本来ドロップしないメタデータ(State)のアイテムモデルは設定されていないのでそうなります。
葉ブロックは木の種類の他に、自然消滅予告・プレイヤーによる設置などのフラグも持っているので、block.getMetaFromState(state)で設置状態でのStateを取ってしまうとそのようになります。
同じ現象は(向き情報などの)設置中限定のStateを持つ、階段やハーフなどでも起こります。

対象ブロックがアイテムモデル未設定のStateを持つかは、コードから判断して汎用化するのは困難なので、バニラのシルクタッチの処理を参考にシルクタッチ可否をチェックしたほうが良いと思います。
(Block#canSilkHarvestでチェックできますので)
否を返すブロックに対しては、dropBlockAsItemでデフォルトドロップを返すほうが無難かと。
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1016
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.314808)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by elise_blacklab » 2018年3月17日(土) 22:57

gatya1129 さんが書きました:それにシルクタッチモードを追加しようと、以下のようなコードを書いたのですが、一部ブロック(原木、木の葉など)が写真のような状態になってしまいます。

上で回答がついたので補足.
シルクタッチでの採掘に対し,バニラブロックではBlockIceやBlockEnderChestのharvestBlock(World, EntityPlayer, BlockPos, IBlockState, TileEntity, ItemStack)にある通り,Block#createStackedBlock(IBlockState)を用いるようです.
このメソッドの戻り値がシルクタッチでの採掘結果ということにされていますが,Nullableであること(=必ずしも戻り値が設定されているとは限らない)には注意が必要です.事前にcanSilkHarvest()やItem#hasSubTypes()等のチェックが必要となることもあります.

1.7.x向けMekanism等ではMetaを取得する方法が記述されていますが,あくまで本来の処理が利用できない場合のフォールバックとして用意されているものであり,通常は使うべきではありません.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2485
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.314872)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by gatya1129 » 2018年3月19日(月) 23:06

defeatedcrow さんが書きました:

elise_blacklab さんが書きました:

ありがとうございます、色々と弄ろうと思います!
modの公開をしています。
(ProactiveMod他バージョン対応版など)
また、簡単なmodの制作依頼も受け付けています。
よかったらどうぞ
Modding歴=Java歴<プログラム歴ッ!
gatya1129
ID:fa4b0917
石掘り
 
記事: 95
登録日時: 2015年2月21日(土) 21:01
お住まい: どこだと思う?ねえ、どこだと思う?

  • (PostNo.314918)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by spicyfish » 2018年3月21日(水) 17:31

ごく初歩的な質問ですみません。
moddingの勉強としてただmod一覧に表示されるだけのmodを作ろうとしているのですが、以下のように書いてrunをしてもmod一覧に表示すらされず困っております。


この件についてなのですが、こちらのトピックを参考にしてみたところ、build.gradleのgroupとarchivesBaseNameの所を改変するのを忘れていただけでした。
ご指摘ありがとうございました!
spicyfish
ID:ad6511b9
水から上がったとこ
 
記事: 2
登録日時: 2018年3月16日(金) 23:34

  • (PostNo.315976)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Kashiwagi_K » 2018年4月22日(日) 13:11

 追加したmobにインベントリを追加して、それをGUIに表示するところまではエラーが起こることもなく平和だったのですが、GUIテクスチャがなぜか縦横に伸ばされてしまって綺麗に表示されません。

↓表示したいインベントリの背景。下の二つの四角形は後で使うもので、今は表示していない
maidinventory.png
maidinventory.png (9.79 KiB) 表示数: 50 回


↓現実。横に伸ばされてしまって、画像の方はインベントリのスロット7個分程度しか表示されていない。
縦にも微妙に伸びているようで、スロットの高さが若干ずれている。
real.png


 GUIの右に表示されているJust Enough Itemsが原因なのかもしれない、とも考えて一度該当Modを抜いてからも試してみましたが違いました。

↓GUIを表示するためのクラス。xSizeやySizeは一つ目の画像の表示したい部分の大きさに合わせている。
コード: 全て選択
package kashiwagik.gracefulmaid.client.gui;

import kashiwagik.gracefulmaid.Reference;
import kashiwagik.gracefulmaid.container.ContainerMaidInventory;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.inventory.IInventory;
import net.minecraft.util.ResourceLocation;

public class GuiMaidInventory extends GuiContainer {

   public GuiMaidInventory(IInventory playerInv, IInventory maidInv) {
      super(new ContainerMaidInventory(playerInv, maidInv));

      this.xSize = 190;
      this.ySize = 240;
   }

   @Override
   protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
      GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
      this.mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID, "textures/gui/container/maidinventory.png"));
      this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
   }

}

↓Container用のクラス。こちらではそれぞれのスロットの座標は合わせている……はず。
コード: 全て選択
package kashiwagik.gracefulmaid.container;

import kashiwagik.gracefulmaid.inventory.InventoryMaid;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;

public class ContainerMaidInventory extends Container {

   private IInventory maidInv;

   public ContainerMaidInventory(IInventory playerInv, IInventory maidInv) {

      this.maidInv = maidInv;

      //add slot of player's hot bar
      int xPos = 12;
      int yPos = 208;
      for(int x = 0; x < 9; x++) {
         this.addSlotToContainer(new Slot(playerInv, x, xPos + x * 18, yPos));
      }

      //add slot of player's main inventory
      yPos = 150;
      for(int y = 0; y < 3; y++) {
         for(int x = 0; x < 9; x++) {
            this.addSlotToContainer(new Slot(playerInv, 9 + y * 9 + x, xPos + x * 18, yPos + y * 18));
         }
      }



      //add slot of maid's main inventory
      yPos = 92;
      for(int y = 0; y < 3; y++) {
         for(int x = 0; x < 9; x++) {
            this.addSlotToContainer(new Slot(maidInv, y * 9 + x, xPos + x * 18, yPos + y * 18));
         }
      }

      //add slot of maid's armor inventory
      yPos = 11;
      for(int y = 0; y < 4; y++) {
         this.addSlotToContainer(new Slot(maidInv, InventoryMaid.maxInventoryLevel * 27 + y, xPos, yPos + y * 18));
      }

      //add slot of maid's hands inventory
      xPos = 84;
      yPos = 47;
      for(int y = 0; y < 2; y++) {
         this.addSlotToContainer(new Slot(maidInv, InventoryMaid.maxInventoryLevel * 27 + 4 + y, xPos, yPos + y * 18));
      }

   }

   @Override
   public boolean canInteractWith(EntityPlayer playerIn) {
      //this can be interacted when player isn't spectator mode.
      return maidInv.isUseableByPlayer(playerIn);
   }

}

 追記すべき事項がありましたら追記させていただきます。
 どなたか助言をよろしくお願いいたします。
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 6
登録日時: 2018年4月13日(金) 00:21

1つ前へ

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

x