メタデータの登録/確認/変更などについて

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

メタデータの登録/確認/変更などについて

投稿記事by ゲスト » 2018年8月03日(金) 23:46

追加するブロックにメタデータを仕込みたいのですが、方法が判らず詰まっています。
知りたい点が幾つかあるため、質問させていただきます。

Minecraftのバージョンは1.12.2、Forgeのバージョンは1.12.2-14.23.4.2705
使用ツールは Eclipse



「http://minecraftjp.info/modding/index.php/1.8%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E8%BF%BD%E5%8A%A0」
ここなどを参考にし、下記のようなソースを書いたのですが、うまくいきません。
具体的には、デバッグのための起動中にクラッシュします。
setDefaultState の部分で初期のメタ値を指定していると考えたのですが...

public class SampleBlock extends Block
{
 public static final PropertyInteger METADATA = PropertyInteger.create("meta", 0, 15);

 public SampleBlock ()
 {
this.setDefaultState(this.blockState.getBaseState().withProperty(METADATA, 0));
 }




「http://minecraftjp.info/modding/index.php/1.8%E3%81%AE%E3%83%90%E3%83%8B%E3%83%A9Json%E3%81%AE%E4%BB%95%E6%A7%98」
ここなどを参考にし、blockstates内のjsonファイルを下記のように書いたのですが、テクスチャが反映されません。
"normal":の記載であれば反映されたため、参照は問題ないかと考えています。
メタごとに指定する場合は、先に①を解決しないといけないかもしれませんが、そもそもの記述方法は正しいでしょうか?

{
 "variants":
 {
  "meta=0": { "model": "colorlesslightblock:colorlesslight10_meta0" },
  "meta=1": { "model": "colorlesslightblock:colorlesslight10_meta1" },
 }
}

javaファイルのほうには下記のように書いてあります。

ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleblock),0,new ModelResourceLocation(MOD_ID + ":" + "sampleblock"));
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleblock),1,new ModelResourceLocation(MOD_ID + ":" + "sampleblock"));



対象のメタデータの取得・変更をするにはどのような処理を行えばよいでしょうか?
例えばクリックした時にそのブロックのメタデータを取るために、stateから値を持ってくるのかとも考えましたが、そのデータが望むものか判別ができません。
メタデータ変更に至っては調べてもそれらしきものが見当たらず、困っています。

public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
{
 int i = (Integer)state.getValue(META);

 return true;
}



以上の3つです。
1つずつでもよいので、どなたかわかる方いらっしゃいませんでしょうか?
ゲスト
ID:12617b07
 

  • (PostNo.318667)

Re: メタデータの登録/確認/変更などについて

投稿記事by elise_blacklab » 2018年8月04日(土) 00:46

まず大前提として,現行バージョンではすでにBlockからmetaという概念は消え去っています
Block側でmetadataの役割を負っていたものは,EnumやIntegerを格納可能なPropertyに置き換わりました.
これによりBlockごとにPropertyの定義が個別なものになったので,今までのように数値で統一的にBlockの状態を判別することはできません(BlockDirectionのDIRECTION等共通して用いられるPropertyでなければ).
以上を踏まえ個別に回答すると:

>①
super(Material)を呼ばないとbaseStateが作られないのでnull参照になるかと
createBlockStateも忘れずにOverrideしましょう

>②
単純にjson記法のミスがあるのでモデルが読み込まれていない可能性(meta=1の方の最後のカンマ)
そもPropertyがBlockに設定されていなければ,モデル読み込まれないので結果は同じになります
問題の切り分けのために,ログは必ず確認して提示しましょう

>③
「そのデータが望むものか判別できません」が何のことを言っているのかわからないけど,stateからBlockの種類もわかるはずで,それを含めて判別すればいいのではないでしょうか
Propertyの変更はworld.setBlockState()からどうぞ.

ソースを読んで必要な部分だけ切り取るのはいいですけど,一度サンプルソースをまるっとコピーしてきて,そのうえで各部でデバッグを取ったほうが,より正確に各部で何をしているか把握できますよ
IDEのReference機能を使ってForgeのsrcをたどるのもいいかもしれません
特にsuper()の呼び忘れはやっていいところとやっちゃダメなところがあります故…
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2560
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.318668)

Re: メタデータの登録/確認/変更などについて

投稿記事by ゲスト » 2018年8月04日(土) 02:26

回答ありがとうございます。
こちらの記述不足もありました。申し訳ありません。
現状の再提示と再質問をさせていただきます。

①について
実際は下記のように記述しています。
「super(Material)を呼ばないと...」に関しては「super(Material.GRASS);」のことでよろしいでしょうか?
また、「metadataの役割を負っていたものは...」に関しては、最初の記載の通り
「public static final PropertyInteger METADATA = PropertyInteger.create("meta", 0, 15);」で用意し、「setDefaultState(this.blockState.getBaseState().withProperty(METADATA, 0));」で設定しようとしたのですが、クラッシュするということです。
ログは画像として添付します。

public class ColorlessLight_Block extends Block
{
 public static final PropertyInteger METADATA = PropertyInteger.create("meta", 0, 15);

 public SampleBlock ()
 {
  super(Material.GRASS);

  setUnlocalizedName("sampleblock ");
  setRegistryName("sampleblock ");
  setCreativeTab(CreativeTabs.MISC);
  setHardness(0.3F);
  setResistance(2000F);
  setLightOpacity(LightOpacity);
  setSoundType(SoundType.GLASS);

  setDefaultState(this.blockState.getBaseState().withProperty(METADATA, 0));
}


②③について
御教授ありがとうございます。①の解決後に試してみたいと思います。
解法から仕組みを逆算して理解したいとは考えていますが、一部を掲載したようなブログや掲示板ではなく、その類の全体ソースが入手できるということでしょうか?
動作の確認や把握については、詰まった関数や単語を逐一調べるという方法を取っていますが、検索手段が悪いのか現行環境の解法が見つからないのが現状です。
添付ファイル
ログ.png
ゲスト
ID:12617b07
 

  • (PostNo.318669)

Re: メタデータの登録/確認/変更などについて

投稿記事by elise_blacklab » 2018年8月04日(土) 02:48

ゲスト さんが書きました:実際は下記のように記述しています。

分かりもしないソースを独断で省略して何がしたいのか
ゲスト さんが書きました:ログは画像として添付します。

Stacktraceのないログを貼って何がしたいのか
そもそもフォーラムルール読んでる?ログ画像はNG.他のフォーラムでもたいていマナー違反だから,ログは必ず全文テキストで貼り付ける.長すぎる等の事情がある場合は,pastebin等のサービスを利用すること.
viewtopic.php?f=5&t=999
正確な情報共有ができないんであれば質問者も回答者も,後から参照する人も困ります.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2560
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.318756)

Re: メタデータの登録/確認/変更などについて

投稿記事by Ans » 2018年8月06日(月) 14:36

コードを見たイメージですが、最低限の理解は出来ていると思うので、希望している機能が無ければ無事起動・適用出来ていると仮定しておきます。

ひとまずPropertyは宣言しているので既にメタが使われないことは理解しているとみて良さそうですね。
ただし、実際に扱うためにもう幾つかコードが必要です。
http://minecraftjp.info/modding/index.php/1.8のブロック追加
このあたりを読んでみて色々試してください。

状態の切り替えについては、Property(質問者がメタと呼んだもの)でテクスチャを再描画するというより、その状態のブロックに置き換えする、という方法が正解かと思います。
一度その方向で検索してみると良いかもしれません。


自分の理想形の質問や返事でなければ、碌に答え・ヒントも出さずに質問を埋もれさせてくる人もいます。
とはいえ、画像添付によるログ説明は確かにNG。というよりこちらで追うことも面倒になるので、今後は気をつけてくださいね。
あと、現状として初心者〜素人に向けての情報や資料は全体的に不足しています。
一定以上に学んでいると初心者が知りたいことが理解しづらくもなります。
根本の解決にはなりませんが、日本語以外の所も対象にする事で答えが見つかることもあるので、試してみてください。
Ans
ID:078accd2
 

  • (PostNo.318761)

Re: メタデータの登録/確認/変更などについて

投稿記事by ゲスト » 2018年8月06日(月) 18:41

おかげ様で継続できそうです。
ブロックの変更処理についてはもう少し粘らせていただきます。
回答・アドバイスありがとうございました。
ゲスト
ID:12617b07
 


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

x