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

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

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

投稿記事by ゲスト » 2017年9月18日(月) 01:18

バージョンは1.7.10です一応ガイドラインは拝見させていただいたつもりだったのですが、見落としていましたすいません。
ゲスト
ID:e207f73b
 

  • (PostNo.307961)

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

投稿記事by HPL » 2017年9月18日(月) 01:38

先ほど質問させていただいたものです申し訳ありませんでした。
ツールはeclipseとforge-1.7.10-10.13.4.1558-1.7.10-srcと Java SE Development Kit 8u144を使っています。
https://www.youtube.com/watch?v=YeBlLZS_ayQこの動画を参考に進めていっていました。
バージョンは1.7.10です、まだ情報が足りなかったらもうしわけありません。
HPL
ID:e207f73b
水から上がったとこ
 
記事: 1
登録日時: 2017年9月18日(月) 01:07

  • (PostNo.308048)

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

投稿記事by ShuperDark » 2017年9月19日(火) 18:26

小さいことなのでここで質問させていただきます。
このブロックを右クリックしたら音(経験値の音)がなるはずなのに、音が鳴らないのは何故でしょうか?
開発環境は1.7.10です。

BlockStationHomeSounder.java

コード: 全て選択
package com.shuperdark.simplemod.blocks;

import java.util.Random;

import com.shuperdark.simplemod.SimpleMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class BlockStationHomeSounder extends Block {
   
   @SideOnly(Side.CLIENT)
   private IIcon audio;

   @SideOnly(Side.CLIENT)
   private IIcon normal;
   
   public BlockStationHomeSounder(Material material) {
      super(material);
      setCreativeTab(SimpleMod.tabSimple);
      setBlockName("StationHomeSounder");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeWood);
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1 ? this.normal : (side == 0 ? this.normal : (side != meta ? this.normal : this.audio));
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.audio = p_149651_1_.registerIcon("simplemod:station_home_sounder_0");
           this.normal = p_149651_1_.registerIcon("simplemod:station_home_sounder_1");
    }
   
   @Override
   public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_)
    {
        int l = MathHelper.floor_double((double)(p_149689_5_.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 2, 3);
        }

        if (l == 1)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 5, 3);
        }

        if (l == 2)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 3, 3);
        }

        if (l == 3)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 4, 3);
        }
    }
   
   @Override
   public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
    {
      if(!world.isRemote) {
          world.playSoundEffect((double)x, (double)y, (double)z, "random.orb", 1.0F, 1.0F);
      }
    }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
       
}

アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308051)

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

投稿記事by defeatedcrow » 2017年9月19日(火) 19:03

ShuperDark さんが書きました:小さいことなのでここで質問させていただきます。
このブロックを右クリックしたら音(経験値の音)がなるはずなのに、音が鳴らないのは何故でしょうか?
開発環境は1.7.10です。

BlockStationHomeSounder.java

コード: 全て選択
package com.shuperdark.simplemod.blocks;

import java.util.Random;

import com.shuperdark.simplemod.SimpleMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class BlockStationHomeSounder extends Block {
   
   @SideOnly(Side.CLIENT)
   private IIcon audio;

   @SideOnly(Side.CLIENT)
   private IIcon normal;
   
   public BlockStationHomeSounder(Material material) {
      super(material);
      setCreativeTab(SimpleMod.tabSimple);
      setBlockName("StationHomeSounder");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeWood);
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1 ? this.normal : (side == 0 ? this.normal : (side != meta ? this.normal : this.audio));
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.audio = p_149651_1_.registerIcon("simplemod:station_home_sounder_0");
           this.normal = p_149651_1_.registerIcon("simplemod:station_home_sounder_1");
    }
   
   @Override
   public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_)
    {
        int l = MathHelper.floor_double((double)(p_149689_5_.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 2, 3);
        }

        if (l == 1)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 5, 3);
        }

        if (l == 2)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 3, 3);
        }

        if (l == 3)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 4, 3);
        }
    }
   
   @Override
   public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
    {
      if(!world.isRemote) {
          world.playSoundEffect((double)x, (double)y, (double)z, "random.orb", 1.0F, 1.0F);
      }
    }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
       
}



onBlockClickedは左クリックのメソッド
右はonBlockActivated
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 933
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.308055)

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

投稿記事by ShuperDark » 2017年9月19日(火) 20:07

defeatedcrow さんが書きました:
ShuperDark さんが書きました:小さいことなのでここで質問させていただきます。
このブロックを右クリックしたら音(経験値の音)がなるはずなのに、音が鳴らないのは何故でしょうか?
開発環境は1.7.10です。

BlockStationHomeSounder.java

コード: 全て選択
package com.shuperdark.simplemod.blocks;

import java.util.Random;

import com.shuperdark.simplemod.SimpleMod;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class BlockStationHomeSounder extends Block {
   
   @SideOnly(Side.CLIENT)
   private IIcon audio;

   @SideOnly(Side.CLIENT)
   private IIcon normal;
   
   public BlockStationHomeSounder(Material material) {
      super(material);
      setCreativeTab(SimpleMod.tabSimple);
      setBlockName("StationHomeSounder");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeWood);
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1 ? this.normal : (side == 0 ? this.normal : (side != meta ? this.normal : this.audio));
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.audio = p_149651_1_.registerIcon("simplemod:station_home_sounder_0");
           this.normal = p_149651_1_.registerIcon("simplemod:station_home_sounder_1");
    }
   
   @Override
   public void onBlockPlacedBy(World p_149689_1_, int p_149689_2_, int p_149689_3_, int p_149689_4_, EntityLivingBase p_149689_5_, ItemStack p_149689_6_)
    {
        int l = MathHelper.floor_double((double)(p_149689_5_.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 2, 3);
        }

        if (l == 1)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 5, 3);
        }

        if (l == 2)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 3, 3);
        }

        if (l == 3)
        {
            p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, 4, 3);
        }
    }
   
   @Override
   public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
    {
      if(!world.isRemote) {
          world.playSoundEffect((double)x, (double)y, (double)z, "random.orb", 1.0F, 1.0F);
      }
    }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.stationHomeSounder);
    }
       
}



onBlockClickedは左クリックのメソッド
右はonBlockActivated


ありがとうございますm(_ _)m
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308090)

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

投稿記事by ShuperDark » 2017年9月20日(水) 17:42

そのブロックの半径30ブロック以内にいると、プレイヤー以外のエンティティにダメージを与えるみたいなもの作ってるんですけど、わざわざupdateTickにこだわる必要ってないのでしょうか(というか引数がWorld, int, int, int, RandomだからどうやってEntityまたはEntityLivingBaseを拾えばいいのか)
もし仮に「この関数使えばいいのでは」っていうものがあれば教えていただけると幸いですm(_ _)m
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308091)

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

投稿記事by elise_blacklab » 2017年9月20日(水) 18:42

ShuperDark さんが書きました:そのブロックの半径30ブロック以内にいると、プレイヤー以外のエンティティにダメージを与えるみたいなもの作ってるんですけど、わざわざupdateTickにこだわる必要ってないのでしょうか(というか引数がWorld, int, int, int, RandomだからどうやってEntityまたはEntityLivingBaseを拾えばいいのか)
もし仮に「この関数使えばいいのでは」っていうものがあれば教えていただけると幸いですm(_ _)m

World.getEntitiesWithinAABB等々ありますのでうまく使えばよいかと
ただし,毎tickでEntityの走査をするとさすがに重いので,自重が必要です

あと面倒でも環境情報は毎回正確に書くようにしてくださいね.
質問によってはバージョンで挙動が変わるなんてザラにありますし
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2436
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.308093)

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

投稿記事by ユメミノウツツ » 2017年9月20日(水) 19:03

1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。
コード: 全て選択
package femod.item;

import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import femod.classbase.FeClassBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;

/** 武器の仕様を設定するクラス
 *  命中率、必殺率の乱数抽選と処理 */
public class FeWeapon extends ItemSword{
   
   /** 命中の実数 */
   int hitpar1 = 100;
   /** 必殺の実数 */
   int killpar1 = 1;
   /** 命中の乱数 */
   Random hitrand1 = new Random();
   Random hitrand2 = new Random();
   /** 必殺の乱数 */
   Random killrand = new Random();
   /** 単体の攻撃力 */
   float power1 = 1F;
   /** クールタイム */
   static int coolTime = 0;
   
   //クラスの性能
   public FeWeapon(ToolMaterial toolMaterial,int hitpar,int killpar) {
      super(toolMaterial);
      maxStackSize = 1;
      hitpar1 = hitpar;
      killpar1 = killpar;
      power1 = toolMaterial.getDamageVsEntity() + 4;
   }

   @Override
   //命中率
      //攻撃判定と同時に抽選、randhit <= hitならfalseで攻撃、>ならtrueでミス
      //GBA版FEの乱数は2回抽選した平均値を使う
   //必殺率
      //攻撃判定と同時に抽選、以後未定。
   public boolean onLeftClickEntity(ItemStack itemStack, EntityPlayer player, Entity entity){
      
      //1~100で乱数抽選、命中率乱数
      int hit1 = hitrand1.nextInt(100) + 1;
      int hit2 = hitrand2.nextInt(100) + 1;
      float hit3  = (hit1 + hit2) / 2;
      //1~100で乱数抽選、必殺乱数
      int kill = killrand.nextInt(100) + 1;
      
      //必殺率が0なら1にする
      if (!player.getEntityWorld().isRemote) {
         if(killpar1 == 0){
            ++killpar1;
         }
      }
      
      //命中処理
      //乱数が命中率以下なら成功
      if(!player.getEntityWorld().isRemote){
            // クールタイムが0なら効果が発動でき、クールタイムがセットされる
            if (coolTime <= 0) {
               if(hit3 <= hitpar1){
                    //攻撃成功、通常処理
                       //デバッグメッセージ(隠す)
                       /* player.addChatMessage(new ChatComponentText("False")); */
                  //乱数が必殺率以下なら必殺発動
                  if(kill <= killpar1 + FeClassBase.killplus){
                     player.addChatMessage(new ChatComponentText("必殺!"));
                     entity.attackEntityFrom(DamageSource.causePlayerDamage(player), (power1 + FeClassBase.powerplus) * 3);
                     coolTime = 0;
                  }else{
                     entity.attackEntityFrom(DamageSource.causePlayerDamage(player), power1 + FeClassBase.powerplus);
                     coolTime = 0;
                  }
                  //耐久を1消費
                  itemStack.damageItem(1, player);
                  return true;
                 }else{
                    //MISS!と表示させる
                    player.addChatMessage(new ChatComponentText("MISS! (クールタイム1.5秒付与)"));
                    //攻撃失敗、ダメージは入らない
                    //クールタイムを設ける(1.5秒)
                    coolTime = 30;
                    return true;
                   }
            }else{
               //クールタイム中
               return true;
            }
      }else{
            return true;
      }
      
   }
   
   @Override
   //クールタイムの設定 30tick
   public void onUpdate(ItemStack stack, World world, Entity entity, int invSlot, boolean isHeldItem){

      if(entity instanceof EntityPlayer){
           EntityPlayer entityPlayer = (EntityPlayer)entity;
           if (!world.isRemote) {
              if(coolTime == 1){
                 world.playSoundAtEntity(entityPlayer, "random.orb", 0.6F, 1.6F);
              }
           }
      }
      // クライアントとサーバーの両方でやる必要はないのでサーバーのみで行う
      if (!world.isRemote) {
         //クールタイムを減らす
         if(coolTime > 0){
            coolTime--;
         }
      }
   }
}
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:878a78c8
石掘り
 
記事: 112
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.308097)

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

投稿記事by ShuperDark » 2017年9月20日(水) 20:45

elise_blacklab さんが書きました:
ShuperDark さんが書きました:そのブロックの半径30ブロック以内にいると、プレイヤー以外のエンティティにダメージを与えるみたいなもの作ってるんですけど、わざわざupdateTickにこだわる必要ってないのでしょうか(というか引数がWorld, int, int, int, RandomだからどうやってEntityまたはEntityLivingBaseを拾えばいいのか)
もし仮に「この関数使えばいいのでは」っていうものがあれば教えていただけると幸いですm(_ _)m

World.getEntitiesWithinAABB等々ありますのでうまく使えばよいかと
ただし,毎tickでEntityの走査をするとさすがに重いので,自重が必要です

あと面倒でも環境情報は毎回正確に書くようにしてくださいね.
質問によってはバージョンで挙動が変わるなんてザラにありますし


申し訳ございません・・・

環境は1.7.10です。

あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・(仕様を敵Mob、完全に殺すように変更させていただきました)

コード: 全て選択
@Override
    public void updateTick(World world, int x, int y, int z, Random random) {
      if(!world.isRemote) {
       List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x-30, y-30, z-30, x+30, y+30, z+30));
      
       for(EntityLivingBase entity : list) {
          if(entity instanceof EntityMob) {
             entity.onDeath(DamageSource.magic);
          }
       }
      }

//他のこのブロックに関するソースコードは、ただのブロックのテクスチャの設定などだけなので除外させていただきました。
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308366)

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事by モチモチクラフタ » 2017年9月27日(水) 18:31

Minecraftのニワトリのプログラムについて質問です。
現在ニワトリに関わるMODを製作中なのですが
卵を時間経過で生むコードが見つかりません。
どこにあるかどなたか知りませんか?

もしくはコピペさせていただければ幸いです。
よろしくお願いします。
miyabi@運営チーム[運営宛のメッセージ(PM)を作成] 投稿先違いのため、記事を移動しました。
【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】
 ↓
【総合】トピック立てるまでもない質問【Mod制作】
モチモチクラフタ
ID:ab44063b
 

  • (PostNo.308367)

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事by モチモチクラフタ » 2017年9月27日(水) 18:58

ちなみにバージョンは1.11.2です
モチモチクラフタ
ID:ab44063b
 

  • (PostNo.308394)

Re: 【総合】トピック立てるまでもない質問【テクスチャ/MOD/その他ツール】

投稿記事by elise_blacklab » 2017年9月28日(木) 00:12

モチモチクラフタ さんが書きました:Minecraftのニワトリのプログラムについて質問です。
現在ニワトリに関わるMODを製作中なのですが
卵を時間経過で生むコードが見つかりません。
どこにあるかどなたか知りませんか?

Forge MDKを構築済みの前提で書きますが,net.minecraft.entity.passive.EntityChicken#onLivingUpdate()内にあります(105行目あたり)
同様の実装をしたいなら該当部分のソースを見るか,フックするならEntityJoinWorldEventでどうぞ.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2436
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.308395)

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

投稿記事by elise_blacklab » 2017年9月28日(木) 00:23

ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2436
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.308415)

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

投稿記事by ShuperDark » 2017年9月28日(木) 16:04

elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308420)

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

投稿記事by defeatedcrow » 2017年9月28日(木) 17:46

ShuperDark さんが書きました:
elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・


そもそもの前提として、メソッドが呼ばれるかどうかの確認はきちんとしていますか?
UpdateTickは、ただ内容を書けば毎Tick呼ばれるようなメソッドではありません
(そのような仕様では負荷によってゲームが成り立ちませんので、このゲームはUpdate対象のBlockはいろいろな方法で制限されます)

ブロックの場合、コンストラクタでsetTickRandomlyをtrueにしてRandomTick更新の対象にすることと、一定周期で動かすならscheduleBlockUpdateで指定Tick後に更新を呼ぶとかそういう設定をします


Loggerを用意するとか、動いたときに確実にわかるようなギミックを挟む(チャットメッセージを吐かせるとか)で確認手段は作るべきと思いますよ
・メソッドが呼ばれるかどうかを確認する
・そのメソッドがどういう手順で呼び出されているのかを本体ソースから確認する
・目的のギミックを(部分的に)含むバニラのブロックを参考にする  など

基本setDead()で何も死なないということはないので、別の場所に凡ミスがあると思われる
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 933
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.308426)

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

投稿記事by ShuperDark » 2017年9月28日(木) 19:00

defeatedcrow さんが書きました:
ShuperDark さんが書きました:
elise_blacklab さんが書きました:
ShuperDark さんが書きました:あれ・・・これでブロックのxyzの30ブロック以内にいると敵Mobが死んでくれるはずなのですが・・・

Entityが死亡して消滅するまでの流れは体力が0にならないと起こらないようになっているので,onDeath()を呼ぶだけでは"死んで"くれません
体力分のダメージを与える処理を書けばいいのですが,Eventによるフックの影響を受けるため確実に消滅させるにはsetDead()を直接呼ぶことになります


setDead()に変えてみましたが、敵Mobはビクともしませんでした。
それにPCの重さもないですね・・・


そもそもの前提として、メソッドが呼ばれるかどうかの確認はきちんとしていますか?
UpdateTickは、ただ内容を書けば毎Tick呼ばれるようなメソッドではありません
(そのような仕様では負荷によってゲームが成り立ちませんので、このゲームはUpdate対象のBlockはいろいろな方法で制限されます)

ブロックの場合、コンストラクタでsetTickRandomlyをtrueにしてRandomTick更新の対象にすることと、一定周期で動かすならscheduleBlockUpdateで指定Tick後に更新を呼ぶとかそういう設定をします


Loggerを用意するとか、動いたときに確実にわかるようなギミックを挟む(チャットメッセージを吐かせるとか)で確認手段は作るべきと思いますよ
・メソッドが呼ばれるかどうかを確認する
・そのメソッドがどういう手順で呼び出されているのかを本体ソースから確認する
・目的のギミックを(部分的に)含むバニラのブロックを参考にする  など

基本setDead()で何も死なないということはないので、別の場所に凡ミスがあると思われる



コード: 全て選択
@Override
    public void updateTick(World world, int x, int y, int z, Random random) {
      if(!world.isRemote) {
       List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x-30, y-30, z-30, x+30, y+30, z+30));
      
       for(EntityLivingBase entity : list) {
          if(entity instanceof EntityPlayer) {
             if(random.nextInt(5) == 0) {
             ((EntityPlayer) entity).addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "I am working"));
          }
          }
       }
      }
   }


乱数で5回に一回の割合でプレイヤーが範囲内に入るとプレイヤーにメッセージが出力するようにしてみました。
どうもメソッドは呼ばれてなさそうですね・・・。
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308428)

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

投稿記事by ShuperDark » 2017年9月28日(木) 19:12

キター!!!!!
動きました!!!!
defeatedcrowさん、elise_blacklabさんありがとうございました!!
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 32
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.308434)

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

投稿記事by ユメミノウツツ » 2017年9月28日(木) 21:10

ユメミノウツツ さんが書きました:1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。

どうやらほぼぴったり半分になっているので1秒40Tickになっているのかもしれません。1秒20Tickと思っているのですが、これは正しい動作なのでしょうか?
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:878a78c8
石掘り
 
記事: 112
登録日時: 2014年3月29日(土) 20:13

  • (PostNo.308461)

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

投稿記事by defeatedcrow » 2017年9月29日(金) 18:15

ユメミノウツツ さんが書きました:
ユメミノウツツ さんが書きました:1.7.10で質問させていただきます。
武器の仕様として攻撃を確率でミスした際にクールタイムを1.5秒設けるというシステムを作ろうと思ったのですが、なぜかtickに対して秒数が合いません。これを実装した当初から合っていなかったのか先ほど弄ったときにずれたのかはわかりません・・・。1秒20tickだったはずなので30tickとしているのですが、どうでしょうか。ちなみに試しに200tickにしてみたところ、5.7秒ほどでクールタイム終了を示す経験値の音が鳴りました。

追記:ver情報を忘れていました。Forge1558です。

どうやらほぼぴったり半分になっているので1秒40Tickになっているのかもしれません。1秒20Tickと思っているのですが、これは正しい動作なのでしょうか?


ゲーム内の時間が、特にコンマ秒の単位でぴったりにすることは厳しいと思います
マウスやキー操作が絡むもの、描画が絡むものは特にズレます
どれくらいズレるかはPC環境にもMod導入環境にもよって変わりますし、その瞬間のCPU使用率とか色んな要素に影響されるのでなんとも

描画とプレイヤー操作の部分がクライアント依存、他がサーバー側処理なので、
・プレイヤーのキー操作→サーバへのパケット
・サーバーからの情報→クライアントへの反映
このような処理でどうあがいてもラグが出ます

加えてどれかのVerから(多分1.7から1.8辺り)、負荷がかかった瞬間にForge側で100~1000Tick単位で処理をスキップされ、更新処理が飛ばされてしまうようなので、あまり負荷のかかる常時監視処理を増やしているとスキップに巻き込まれているかもしれません

クライアント用にちょうど良く調整してマルチプレイでガッタガタになるということも多々あるので、
正直、そのような時間のブレを許容できない仕組みを作ること自体が厳しいと思います

どうしてもクールタイムに再現性をもたせたいのであれば、
Tickカウントではなく、Worldの持つTotalTimeなどを使って、クールタイム発動時点からどれくらい経過したかを確認するほうがやりやすいかもしれません
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 933
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.308476)

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

投稿記事by ユメミノウツツ » 2017年9月29日(金) 21:56

defeatedcrow さんが書きました:ゲーム内の時間が、特にコンマ秒の単位でぴったりにすることは厳しいと思います
マウスやキー操作が絡むもの、描画が絡むものは特にズレます
どれくらいズレるかはPC環境にもMod導入環境にもよって変わりますし、その瞬間のCPU使用率とか色んな要素に影響されるのでなんとも

描画とプレイヤー操作の部分がクライアント依存、他がサーバー側処理なので、
・プレイヤーのキー操作→サーバへのパケット
・サーバーからの情報→クライアントへの反映
このような処理でどうあがいてもラグが出ます

加えてどれかのVerから(多分1.7から1.8辺り)、負荷がかかった瞬間にForge側で100~1000Tick単位で処理をスキップされ、更新処理が飛ばされてしまうようなので、あまり負荷のかかる常時監視処理を増やしているとスキップに巻き込まれているかもしれません

クライアント用にちょうど良く調整してマルチプレイでガッタガタになるということも多々あるので、
正直、そのような時間のブレを許容できない仕組みを作ること自体が厳しいと思います

どうしてもクールタイムに再現性をもたせたいのであれば、
Tickカウントではなく、Worldの持つTotalTimeなどを使って、クールタイム発動時点からどれくらい経過したかを確認するほうがやりやすいかもしれません

返信ありがとうございます。ググったところ多分(viewtopic.php?f=39&t=8370&start=1800)このページを参考にしているような気がするのですが(あまり覚えてません)、まあ色々処理を追加しているからそれが負荷をかけているのかもしれません。
コンマ単位の秒数調整ではなくて、数秒レベルでずれるので流石におかしいのではないかと思ったのですが、結局どこかがバグっているとかいうわけではなさそうなので、TotalTimeなどを調べてみようかと思います。ありがとうございました。
Javaすら学んでなければ教えてくれる人もいない中Modding始めてみた。ファイアーエムブレムを再現するMODを作りたいけどもリリースできる気がしませんなこれは・・・。
アバター
ユメミノウツツ
ID:878a78c8
石掘り
 
記事: 112
登録日時: 2014年3月29日(土) 20:13

1つ前へ次へ

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

x