【解決済み 1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

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

【解決済み 1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

投稿記事by ShuperDark » 2017年9月10日(日) 14:44

プレイヤーの向きによって、ブロックのテクスチャの向きを変えたいんですけども、ブロックの上のテクスチャが変わりません・・・
テクスチャは、メタが0のときはXIconを返して、metaが1の場合はYIcon、それ以外の場合はXIconを返すようにしています。
setBlockの第五、第六引数は片方はメタだと思うんですけど、もう片方がなんなのかわかりません_:(´ཀ`」 ∠):
ネットで調べてるうちに、setBlockMetadataWithNotifyを使ったほうがいいのかなとか思ったんですけど、第四、第五引数が何を表しているのやら・・・

グダグダで大変申し訳ないのですが、何卒ご教授をお願いします。

HotelFloorBlock.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.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
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 HotelFloorBlock extends Block {
   
@SideOnly(Side.CLIENT)
private IIcon XIcon;

@SideOnly(Side.CLIENT)
private IIcon YIcon;
   
   public HotelFloorBlock(Material material) {
      super(material);
      setCreativeTab(CreativeTabs.tabDecorations);
      setBlockName("HotelFloorBlock");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeCloth);
   }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1|| meta == 0 ? XIcon : (side == 1|| meta == 1 ? YIcon : XIcon);
    }
   
   @Override
   public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
       int l = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
      if(l == 0) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 1) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
      if(l == 2) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 3) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.XIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_x");
           this.YIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_y");
    }

}
最後に編集したユーザー ShuperDark [ 2017年9月10日(日) 18:13 ], 累計 1 回
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 30
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.307606)

Re: 【1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

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

ShuperDark さんが書きました:プレイヤーの向きによって、ブロックのテクスチャの向きを変えたいんですけども、ブロックの上のテクスチャが変わりません・・・
テクスチャは、メタが0のときはXIconを返して、metaが1の場合はYIcon、それ以外の場合はXIconを返すようにしています。
setBlockの第五、第六引数は片方はメタだと思うんですけど、もう片方がなんなのかわかりません_:(´ཀ`」 ∠):
ネットで調べてるうちに、setBlockMetadataWithNotifyを使ったほうがいいのかなとか思ったんですけど、第四、第五引数が何を表しているのやら・・・

グダグダで大変申し訳ないのですが、何卒ご教授をお願いします。

HotelFloorBlock.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.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
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 HotelFloorBlock extends Block {
   
@SideOnly(Side.CLIENT)
private IIcon XIcon;

@SideOnly(Side.CLIENT)
private IIcon YIcon;
   
   public HotelFloorBlock(Material material) {
      super(material);
      setCreativeTab(CreativeTabs.tabDecorations);
      setBlockName("HotelFloorBlock");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeCloth);
   }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1|| meta == 0 ? XIcon : (side == 1|| meta == 1 ? YIcon : XIcon);
    }
   
   @Override
   public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
       int l = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
      if(l == 0) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 1) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
      if(l == 2) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 3) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.XIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_x");
           this.YIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_y");
    }

}



>プレイヤーの向きによって、ブロックのテクスチャの向きを変えたいんですけども
これって、具体的には何でしょう?
onBlockPlaceByは”設置した瞬間の”プレイヤーの向きは取れますが
あなたがやりたいのは”設置時の”向きで変えたいのか、”常時プレイヤーの向きに応じて動的に変化し続ける”がやりたいのか
どちらかによって実装が変わりますので


前者なら、ほぼ完成しているように見えますね…
怪しいところは2点だけ

1.
ブロック設置時のメソッドを、
world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
から
world.setBlockMetadataWithNotify(x, y, z, 0, 3);
に変えてみてください

これの最後の引数は、そのメソッドのjavadocにもありますけど、”ブロックの変更をワールドに教えるかどうか?”です
負荷軽減のためにブロックの更新をサーバ→クライアントに教えずに更新するとか、描画の更新を伝えるかどうかなどを、ここの数値で定義します
0bXXXの2進数で判定されます
1は、ワールドのブロック更新を呼ぶかどうか
2は、クライアントに更新を伝えるかどうか
4は、再描画処理を防ぐかどうか

2なら十分に思いますが、うまく動かないようなので3に変えてみると、1と2の処理が呼ばれるのでブロック更新が伝わるようになるんじゃないかなー
(AMTは全部3でやっていた記憶)

2.
return side == 1|| meta == 0 ? XIcon : (side == 1|| meta == 1 ? YIcon : XIcon);
これ、条件分岐はあってますか?
これだとside1は全部XIconになるので、(side == 1|| meta == 1 ? YIcon : XIcon);の部分のside == 1が無駄になってるようにみえるんですよね
||と&&を間違えてるとか、そんなことはないですかね?
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 917
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.307621)

Re: 【1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

投稿記事by ShuperDark » 2017年9月10日(日) 16:35

defeatedcrow さんが書きました:
ShuperDark さんが書きました:プレイヤーの向きによって、ブロックのテクスチャの向きを変えたいんですけども、ブロックの上のテクスチャが変わりません・・・
テクスチャは、メタが0のときはXIconを返して、metaが1の場合はYIcon、それ以外の場合はXIconを返すようにしています。
setBlockの第五、第六引数は片方はメタだと思うんですけど、もう片方がなんなのかわかりません_:(´ཀ`」 ∠):
ネットで調べてるうちに、setBlockMetadataWithNotifyを使ったほうがいいのかなとか思ったんですけど、第四、第五引数が何を表しているのやら・・・

グダグダで大変申し訳ないのですが、何卒ご教授をお願いします。

HotelFloorBlock.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.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
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 HotelFloorBlock extends Block {
   
@SideOnly(Side.CLIENT)
private IIcon XIcon;

@SideOnly(Side.CLIENT)
private IIcon YIcon;
   
   public HotelFloorBlock(Material material) {
      super(material);
      setCreativeTab(CreativeTabs.tabDecorations);
      setBlockName("HotelFloorBlock");
      setHardness(1.5F);
      setResistance(0.5F);
      setStepSound(soundTypeCloth);
   }
   
   @Override
   public Item getItemDropped(int meta, Random random, int fortune)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public Item getItem(World world, int x, int y, int z)
    {
        return Item.getItemFromBlock(SimpleMod.hotelFloor);
    }
   
   @Override
   @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int meta)
    {
      return side == 1|| meta == 0 ? XIcon : (side == 1|| meta == 1 ? YIcon : XIcon);
    }
   
   @Override
   public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
       int l = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
      if(l == 0) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 1) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
      if(l == 2) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
      }
      if(l == 3) {
         world.setBlock(x, y, z, SimpleMod.hotelFloor, 1, 2);
      }
   }
   
   @Override
   @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister p_149651_1_)
    {
           this.XIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_x");
           this.YIcon = p_149651_1_.registerIcon("simplemod:hotel_floor_y");
    }

}



>プレイヤーの向きによって、ブロックのテクスチャの向きを変えたいんですけども
これって、具体的には何でしょう?
onBlockPlaceByは”設置した瞬間の”プレイヤーの向きは取れますが
あなたがやりたいのは”設置時の”向きで変えたいのか、”常時プレイヤーの向きに応じて動的に変化し続ける”がやりたいのか
どちらかによって実装が変わりますので


前者なら、ほぼ完成しているように見えますね…
怪しいところは2点だけ

1.
ブロック設置時のメソッドを、
world.setBlock(x, y, z, SimpleMod.hotelFloor, 0, 2);
から
world.setBlockMetadataWithNotify(x, y, z, 0, 3);
に変えてみてください

これの最後の引数は、そのメソッドのjavadocにもありますけど、”ブロックの変更をワールドに教えるかどうか?”です
負荷軽減のためにブロックの更新をサーバ→クライアントに教えずに更新するとか、描画の更新を伝えるかどうかなどを、ここの数値で定義します
0bXXXの2進数で判定されます
1は、ワールドのブロック更新を呼ぶかどうか
2は、クライアントに更新を伝えるかどうか
4は、再描画処理を防ぐかどうか

2なら十分に思いますが、うまく動かないようなので3に変えてみると、1と2の処理が呼ばれるのでブロック更新が伝わるようになるんじゃないかなー
(AMTは全部3でやっていた記憶)

2.
return side == 1|| meta == 0 ? XIcon : (side == 1|| meta == 1 ? YIcon : XIcon);
これ、条件分岐はあってますか?
これだとside1は全部XIconになるので、(side == 1|| meta == 1 ? YIcon : XIcon);の部分のside == 1が無駄になってるようにみえるんですよね
||と&&を間違えてるとか、そんなことはないですかね?


論理和と論理積を間違えました・・・
ええと、setBlockMetadataWithNotifyは、そのブロックのクラスを勝手に読み込んでくれるんですか?
第四引数はメタと解釈してもよろしいですか?
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 30
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.307622)

Re: 【1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

投稿記事by ShuperDark » 2017年9月10日(日) 16:53

とりあえず完成致しました!
ありがとうございました!
アバター
ShuperDark
ID:85d166a0
木を殴ってる
 
記事: 30
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.307632)

Re: 【1.7.10】プレイヤーの向きによって、ブロックのテクスチャが変わるようにしたい

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

ShuperDark さんが書きました:とりあえず完成致しました!
ありがとうございました!


一応補足
setBlockMetadataWithNotifyは、その座標にあるブロックのクラスは変えずに、メタデータを変更するメソッドです

設置されているブロックは、ブロックのID、メタの値、それぞれがWorldクラスに(と、セーブデータに)保管されているので、そのデータを変更して更新する→それがクライアントに伝わるとゲーム内に出てくるブロックも変わります
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 917
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東


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

x