[1.11.2-]自作mod、銃のフルオート時の挙動について【解決済】

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

[1.11.2-]自作mod、銃のフルオート時の挙動について【解決済】

投稿記事by ぃやまと » 2017年11月17日(金) 14:34

どうしても分からなかったのでこちらで質問します。
現在1.11.2と1.12.2で自作modを公開してます。
https://minecraft.curseforge.com/projects/iyamatos-mob-mod

新規にフルオート銃を追加しようとしましたが、銃が荒ぶり思った挙動になりません。
クリエイティブモードでは思った挙動になるのですが…。
※つまり弓を引く動作し、銃がアイテムを使用する際の振る動作がない

shouldCauseReequipAnimationメソッドも試しましたが効果なし(´・ω・`)
GeneralGun、その他銃器追加modなどのソースを確認しましたが、最低限のJAVA知識しか持ち合わせていないため
どういう処理になってるのかいまいち不明です。
※しっかり構えてフルオートできているのがほとんどが1.7.10

海外チュートリアルも情報が少ないようで、セミオートの銃のみしか情報がありませんでした。
MCreatorのコードも確認しましたが、荒ぶることに変わりありません。

現時点のコードになります。まだリロード処理は追加していません。
よろしくお願いいたします。

コード: 全て選択
public class ItemIYFlameThrowerLv1 extends ItemBow
{
   private int damage;
   private boolean fireFlag;
   private static final int mgSize = 80;

   public ItemIYFlameThrowerLv1()
    {
        setRegistryName("rniyflamethrowerlv1");
        setUnlocalizedName("iyflamethrowerlv1");
      maxStackSize = 1;
      this.setMaxDamage(80);
      this.fireFlag = false;
    }

   public boolean getFireFlag(){
      return this.fireFlag;
   }

    public void onCreated(ItemStack stack, World worldIn, EntityPlayer playerIn)
    {
       NBTTagCompound fireState = new NBTTagCompound();
      if (fireState != null) {
         stack.setTagCompound(fireState);
         fireState.setBoolean("Reload", this.fireFlag);
         fireState.setInteger("Magazine", mgSize);
         int mg = fireState.getInteger("Magazine");
      }
    }

    @SideOnly(Side.CLIENT)
   public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList<ItemStack> subItems) {
      ItemStack itemStack = new ItemStack(this, 1, 0);

      NBTTagCompound fireState = new NBTTagCompound();
      if (fireState != null) {
         itemStack.setTagCompound(fireState);
         fireState.setBoolean("Reload", this.fireFlag);
         fireState.setInteger("Magazine", mgSize);
         int mg = fireState.getInteger("Magazine");
      }

      subItems.add(itemStack);
   }

   @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
        ItemStack itemstack = playerIn.getHeldItem(handIn);
        NBTTagCompound fireState = itemstack.getTagCompound();

           if(fireState == null)
          {
             fireState = new NBTTagCompound();
             itemstack.setTagCompound(fireState);
             fireState.setBoolean("Reload", this.fireFlag);
             fireState.setInteger("Magazine", mgSize);
             System.out.println("onItemRightClick");
          }

           if(fireState != null)
          {
             boolean flag = fireState.getBoolean("Reload");
             int mg = fireState.getInteger("Magazine");
             System.out.println("fireState != null ////////");
          }

            fireState.setBoolean("Reload", true);
            playerIn.setActiveHand(handIn);
            return new ActionResult(EnumActionResult.SUCCESS, itemstack);
    }

   @Override
    public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft)
    {
    }

   @Override
    public void onUsingTick(ItemStack stack, EntityLivingBase player, int count)
   {
   }

    @Override
    public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
    {
      EntityPlayer ep = (EntityPlayer) entityIn;
      NBTTagCompound fireState = stack.getTagCompound();

      boolean flag = false;
      if (fireState != null) {
         flag = fireState.getBoolean("Reload");
      }
       if (entityIn != null && entityIn instanceof EntityPlayer) {

         if(flag)
         {
               if(ep.isHandActive() && stack == ep.getActiveItemStack())
               {
                  fire(stack, entityIn.world, ep);
                  //fireState.setBoolean("Reload", false);
               }
         }
       }
       super.onUpdate(stack, worldIn, entityIn, itemSlot, isSelected);
    }

    @Override
    public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) {
        return false;
    }

    public void fire(ItemStack stack, World worldIn, EntityPlayer player)
    {
       boolean creative = player.capabilities.isCreativeMode;
       NBTTagCompound fireState = stack.getTagCompound();

       System.out.println("まがじん : " + fireState.getInteger("Magazine"));
        if(fireState.getInteger("Magazine") == 0)
        {
           player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvents.click, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));
           //stack.setItemDamage(80);
           fireState.setBoolean("Reload", false);
            return;
        }

        player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvents.flame_thrower, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));

        if (!player.world.isRemote)
      {
           if (!creative)
           {
              int mg = 0;
              mg = fireState.getInteger("Magazine");
              --mg;
              fireState.setInteger("Magazine", mg); // この処理を挟むと荒ぶる
           }

           //stack.damageItem(1, player); ダメージを与えると荒ぶる
         EntityIYFlameThrowerLv1 entityiyflamethrowerlv1 = new EntityIYFlameThrowerLv1(player.world, player);
         entityiyflamethrowerlv1.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, 0.0F, 0.0F);
         //entityiyflamethrowerlv1.setFire(20);
         player.world.spawnEntity(entityiyflamethrowerlv1);
      }
    }

    @Override
    public int getMaxItemUseDuration(ItemStack stack)
    {
        return 72000;
    }

   @Override
   public EnumAction getItemUseAction(ItemStack stack) {
      return EnumAction.BOW;
   }

   ////////////////////

   @Override
    public boolean showDurabilityBar(ItemStack stack)
    {
      NBTTagCompound fireState = stack.getTagCompound();
      if (fireState != null && fireState.hasKey("Magazine"))
      {
         if(fireState.getInteger("Magazine") < mgSize)
         {
            return true;
         }
      }
        return false;
    }
   @Override
    public double getDurabilityForDisplay(ItemStack stack)
    {
      NBTTagCompound fireState = stack.getTagCompound();
      int charge = 0;
      int max = 80;
      if (fireState != null && fireState.hasKey("Magazine")) {
         charge = fireState.getInteger("Magazine");
      }

      int i = max - charge;
      return (double) i / (double) max;
    }


DeadSpaceModになりつつある… :ply:
最後に編集したユーザー ぃやまと [ 2017年11月27日(月) 15:05 ], 累計 1 回
アバター
ぃやまと
ID:7f2830a7
大工さん
 
記事: 44
登録日時: 2016年1月06日(水) 23:22

  • (PostNo.310797)

Re: [1.11.2-]自作mod、銃のフルオート時の挙動について

投稿記事by ぃやまと » 2017年11月27日(月) 15:04

General Gunsのメソッドを参考にして、銃が荒ぶることがなくなりましたので解決済みとさせていただきます。
アバター
ぃやまと
ID:7f2830a7
大工さん
 
記事: 44
登録日時: 2016年1月06日(水) 23:22

  • (PostNo.310799)

Re: [1.11.2-]自作mod、銃のフルオート時の挙動について【解決済】

投稿記事by elise_blacklab » 2017年11月27日(月) 16:45

開発情報に関しては参照される可能性が高いため、差分をとるなどしたり、対処法の概要を記載するなどの配慮が望まれます。
フォーラムルールも一読してください。
viewtopic.php?f=5&t=999
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:42611373
掘り廃人
 
記事: 2449
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.310801)

Re: [1.11.2-]自作mod、銃のフルオート時の挙動について【解決済】

投稿記事by ぃやまと » 2017年11月27日(月) 17:49

問題が解決しましたので、最終的な完成コードを掲載します。
他の方も参考にしてください。
銃のリロード処理やセカンダリ発射機能も持たせてあります。

コード: 全て選択
public class ItemIYFlameThrowerLv1 extends ItemBow
{
   private int reloadTick;
   private boolean secondaryWait;

   public ItemIYFlameThrowerLv1()
    {
        setRegistryName("rniyflamethrowerlv1");
        setUnlocalizedName("iyflamethrowerlv1");
      maxStackSize = 1;
      this.setMaxDamage(80);
    }

    public void onCreated(ItemStack stack, World worldIn, EntityPlayer playerIn)
    {
       NBTTagCompound fireState = new NBTTagCompound();
      if (fireState != null) {
         stack.setTagCompound(fireState);
         fireState.setBoolean("Reload", false);
      }
    }

    @SideOnly(Side.CLIENT)
   public void getSubItems(Item itemIn, CreativeTabs tab, NonNullList<ItemStack> subItems) {
      ItemStack itemStack = new ItemStack(this, 1, 0);

      NBTTagCompound fireState = new NBTTagCompound();
      if (fireState != null) {
         itemStack.setTagCompound(fireState);
         fireState.setBoolean("Reload", false);
      }
      subItems.add(itemStack);
   }

   @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
    {
        ItemStack itemstack = playerIn.getHeldItem(handIn);
        NBTTagCompound fireState = itemstack.getTagCompound();

        if(fireState == null)
       {
          fireState = new NBTTagCompound();
          itemstack.setTagCompound(fireState);
          fireState.setBoolean("Reload", false);
       }

        fireState.setBoolean("Reload", true);
        playerIn.setActiveHand(handIn);
        return new ActionResult(EnumActionResult.SUCCESS, itemstack);
    }

   @Override
    public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft)
    {
       if(getDamage(stack) >= 56 && entityLiving.isSneaking())
        {
          entityLiving.world.playSound((EntityPlayer)null, entityLiving.posX, entityLiving.posY, entityLiving.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.click, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));
            return;
        }
      if(entityLiving.isSneaking() && stack.getItemDamage() <= 55)
      {
         secondaryFire(stack, entityLiving.world, (EntityPlayer) entityLiving);
      }
    }

    @Override
    public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
    {
      EntityPlayer ep = (EntityPlayer) entityIn;
      NBTTagCompound fireState = stack.getTagCompound();

      boolean flag = false;
      if (fireState != null) {
         flag = fireState.getBoolean("Reload");
      }
       if (entityIn != null && entityIn instanceof EntityPlayer) {

         if(flag)
         {
               if(ep.isHandActive() && stack == ep.getActiveItemStack())
               {
                  if(!ep.isSneaking())
                  {
                     fire(stack, entityIn.world, ep);
                  }
                  updateCheckinghSlot(entityIn, stack); //この処理で射撃時に銃が荒ぶらなくなる
               }
               updateCheckinghSlot(entityIn, stack); //この処理で射撃時に銃が荒ぶらなくなる
         }
         updateCheckinghSlot(entityIn, stack); //この処理で射撃時に銃が荒ぶらなくなる
       }

       ItemStack magazine = findAmmo(ep);

       if (entityIn != null && entityIn instanceof EntityPlayer)
       {
          if(!worldIn.isRemote)
          {
             if (stack.getItemDamage() >= getMaxDamage() && isSelected)
             {
                reloadTick +=1;
                //ammo check
                if (magazine != null)
                {
                   //reload
                   if(reloadTick == 180)
                   {
                      ep.world.playSound((EntityPlayer) null, ep.posX, ep.posY, ep.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.gun_reload, SoundCategory.NEUTRAL, 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1 * 0.5F);

                      boolean flag2 = ep.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0;

                      if(!flag2)
                      {
                         magazine.shrink(1);
                      }
                      if (magazine.isEmpty()) {
                         ep.inventory.deleteStack(magazine);
                      }

                      setDamage(stack, 0);
                      reloadTick = 0;
                   }
                   return;
                }
             }
          }
      }
       super.onUpdate(stack, worldIn, entityIn, itemSlot, isSelected);
    }

/////参考にしたコード

   public static void updateCheckinghSlot(Entity pEntity, ItemStack pItemstack) {
      if (pEntity instanceof EntityPlayerMP) {
         EntityPlayerMP lep = (EntityPlayerMP)pEntity;
         Container lctr = lep.openContainer;
         for (int li = 0; li < lctr.inventorySlots.size(); li++) {
            ItemStack lis = ((Slot)lctr.getSlot(li)).getStack();
            if (lis == pItemstack) {
               lctr.inventoryItemStacks.set(li, pItemstack.copy());
               break;
            }
         }
      }
   }

//////

    public void fire(ItemStack stack, World worldIn, EntityPlayer player)
    {
       boolean creative = player.capabilities.isCreativeMode;
       stack = player.getHeldItemMainhand();
       NBTTagCompound fireState = stack.getTagCompound();

       if(getDamage(stack) >= 80)
        {
           player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.click, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));
           stack.setItemDamage(80);
           fireState.setBoolean("Reload", false);
            return;
        }

        player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.flame_thrower, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));
         if (!creative)
           {
              stack.damageItem(1, player);
           }
           player.rotationPitch -= 0.5;
         if (!player.world.isRemote)
         {
         EntityIYFlameThrowerLv1 entityiyflamethrowerlv1 = new EntityIYFlameThrowerLv1(player.world, player);

          int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);

           if (j > 0)
           {
              entityiyflamethrowerlv1.setDamage(entityiyflamethrowerlv1.getDamage() + (double)j * 0.5D + 0.5D);
           }

           int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);

           if (k > 0)
           {
              entityiyflamethrowerlv1.setKnockbackStrength(k);
           }

           if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0)
           {
              entityiyflamethrowerlv1.setFire(100);
           }
         entityiyflamethrowerlv1.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, 0.0F, 1.0F);
         player.world.spawnEntity(entityiyflamethrowerlv1);
      }
    }

   public void secondaryFire(ItemStack stack, World world, EntityPlayer player)
   {
       boolean creative = player.capabilities.isCreativeMode;
       stack = player.getHeldItemMainhand();
       NBTTagCompound fireState = stack.getTagCompound();

       if(getDamage(stack) >= 80)
        {
           player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.click, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 0.5F + 1.5F));
           stack.setItemDamage(80);
           fireState.setBoolean("Reload", false);
            return;
        }

        player.world.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, net.lubriciouskin.iymts_mob_mod.SoundEvent.flame_thrower_secondary, SoundCategory.NEUTRAL, 1.0F, 2.5F / (itemRand.nextFloat() * 3.0F));
         if (!creative)
           {
              stack.damageItem(25, player);
           }
           player.rotationPitch -= 1.0;
         if (!player.world.isRemote)
         {
         EntityIYFlameThrowerSecondaryLv1 entityiyflamethrowersecondarylv1 = new EntityIYFlameThrowerSecondaryLv1(player.world, player);

          int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack);

           if (j > 0)
           {
              entityiyflamethrowersecondarylv1.setDamage(entityiyflamethrowersecondarylv1.getDamage() + (double)j * 0.5D + 0.5D);
           }

           int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack);

           if (k > 0)
           {
              entityiyflamethrowersecondarylv1.setKnockbackStrength(k);
           }

           if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0)
           {
              entityiyflamethrowersecondarylv1.setFire(100);
           }
         entityiyflamethrowersecondarylv1.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, 0.0F, 1.0F);
         player.world.spawnEntity(entityiyflamethrowersecondarylv1);
         }
   }

   private ItemStack findAmmo(EntityPlayer player) {
      if (this.getAmmo(player.getHeldItem(EnumHand.OFF_HAND))) {
         return player.getHeldItem(EnumHand.OFF_HAND);
      } else if (this.getAmmo(player.getHeldItem(EnumHand.MAIN_HAND))) {
         return player.getHeldItem(EnumHand.MAIN_HAND);
      } else {
         for (int i = 0; i < player.inventory.getSizeInventory(); ++i) {
            ItemStack itemstack = player.inventory.getStackInSlot(i);

            if (this.getAmmo(itemstack)) {
               return itemstack;
            }
         }
         return null;
      }
   }

   protected boolean getAmmo(ItemStack stack) {

      if(stack != null)
      {
         if(stack.getItem() instanceof ItemIYFlameFuel)
         {
            return true;
         }
      }
      return false;
   }

    @Override
    public int getMaxItemUseDuration(ItemStack stack)
    {
        return 72000;
    }

   @Override
   public EnumAction getItemUseAction(ItemStack stack) {
      return EnumAction.BOW;
   }
}
アバター
ぃやまと
ID:7f2830a7
大工さん
 
記事: 44
登録日時: 2016年1月06日(水) 23:22


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

x