【総合】トピック立てるまでもない質問【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
大工さん
 
記事: 40
登録日時: 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
レッドスト―ン掘り
 
記事: 683
登録日時: 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
ラピスラズリ収集家
 
記事: 983
登録日時: 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
お住まい: 木の上

1つ前へ

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

x