2016-04-25 1 views
1

をクラッシュします。テスト用の木ブロックのBlockLogクラスを拡張しました。しかし、ゲームにブロックを配置しようとするたびに、ゲームがクラッシュします。ここに私の木のログクラスです:後半のよう、ゲームはこの質問には、バージョン1.9</p> <p>私は改造シーンに新しいですし、私のテスト木材ログブロックとのトラブルを抱えていますがMinecraftのために関係

package bravoman.testmod.blocks; 

import net.minecraft.block.BlockLog; 

public class MangoLog extends BlockLog{ 
    public MangoLog() { 
     super(); 
    } 
} 

、私はユーチューブ上の簡単なチュートリアルを追っていると、これは私が新しいブロックを作成することを学んだ方法でした。私はそれをさらに進め、Blockの代わりにBlockLogを伸ばしました。

私はBlockLogクラスを使って、特定のメソッドをオーバーライドしたり、列挙型を追加しようとしましたが、役に立たなかったことがあります。巨大なコードが欠落していると私は信じていますが、ミニクラフトを改造した経験がなければ、私はここで取り残されています。私はこの質問にminecraft forums .Crashログを投稿しました。どんな助けもありがとう。

---- Minecraft Crash Report ---- 
// Why is it breaking :(

Time: 4/25/16 1:22 PM 
Description: Unexpected error 

java.lang.IllegalArgumentException: Cannot set property PropertyEnum{name=axis, clazz=class net.minecraft.block.BlockLog$EnumAxis, values=[x, y, z, none]} as it does not exist in BlockStateContainer{block=mm:mango_log, properties=[axis]} 
    at net.minecraft.block.state.BlockStateContainer$StateImplementation.withProperty(BlockStateContainer.java:204) 
    at net.minecraft.block.BlockLog.onBlockPlaced(BlockLog.java:51) 
    at net.minecraft.item.ItemBlock.onItemUse(ItemBlock.java:57) 
    at net.minecraft.item.ItemStack.onItemUse(ItemStack.java:156) 
    at net.minecraft.client.multiplayer.PlayerControllerMP.processRightClickBlock(PlayerControllerMP.java:484) 
    at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1597) 
    at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:2268) 
    at net.minecraft.client.Minecraft.runTickKeyboard(Minecraft.java:2052) 
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1840) 
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1114) 
    at net.minecraft.client.Minecraft.run(Minecraft.java:401) 
    at net.minecraft.client.main.Main.main(Main.java:118) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) 
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) 
    at GradleStart.main(GradleStart.java:26) 

答えて

2

これは、その方向のためのいくつかの状態情報を持っていますが、それを実装するサブクラスを必要とBlockLogの使用によるものです。ログは通常、いくつかの異なるタイプを表しており、そのための論理的な基盤がないため、完全に実装されていません。しかし、状態メソッドを抽象的にするわけではないので、これが必要であることが明確ではありません。

BlockLogBlockRotatedPillarは、独自の状態情報を定義します。ただし、ログには追加の状態(方向が向いていない、すべての面で樹皮がある)があるため、ピラーの状態情報は使用されず、別の状態値が代わりに使用されます。しかしBlockLogはこれを登録しておらず、サブクラスは(他の情報をとにかく登録するので、情報を上書きすることになるので)サブクラスがそうすることを期待しています。その登録は行われないので、間違った軸情報が使用され、ゲームがpilar軸情報を期待するとき、ログはログ軸情報を設定しようとします。 (アカシアとダークオークを行います)BlockOldLog(オーク、樺、スプルース、とジャングルをしている)とBlockNewLog:それを修正する

BlockLogの既存の実装を見てください。あなたのケースでは

(私はあなたが任意のバリアントを持ってしたくないと仮定した場合)、次はおそらく(ただし、私はそれをテストしていない)に動作します:

package bravoman.testmod.blocks; 

import net.minecraft.block.BlockLog; 

public class MangoLog extends BlockLog{ 
    public MangoLog() 
    { 
     super(); 
     this.setDefaultState(this.blockState.getBaseState().withProperty(LOG_AXIS, BlockLog.EnumAxis.Y)); 
    } 

    /** 
    * Convert the given metadata into a BlockState for this Block 
    */ 
    public IBlockState getStateFromMeta(int meta) 
    { 
     IBlockState state = this.getDefaultState(); 

     switch (meta & 0b1100) 
     { 
      case 0b0000: 
       state = state.withProperty(LOG_AXIS, BlockLog.EnumAxis.Y); 
       break; 

      case 0b0100: 
       state = state.withProperty(LOG_AXIS, BlockLog.EnumAxis.X); 
       break; 

      case 0b1000: 
       state = state.withProperty(LOG_AXIS, BlockLog.EnumAxis.Z); 
       break; 

      case 0b1100: 
       state = state.withProperty(LOG_AXIS, BlockLog.EnumAxis.NONE); 
       break; 
     } 

     return state; 
    } 

    /** 
    * Convert the BlockState into the correct metadata value 
    */ 
    public int getMetaFromState(IBlockState state) 
    { 
     switch ((BlockLog.EnumAxis)state.getValue(LOG_AXIS)) 
     { 
      case X: return 0b0100; 
      case Y: return 0b0000; 
      case Z: return 0b1000; 
      case NONE: return 0b1100; 
     } 
    } 

    protected BlockStateContainer createBlockState() 
    { 
     return new BlockStateContainer(this, new IProperty[] {LOG_AXIS}); 
    } 
} 

重要な部分があることですLOG_AXISプロパティを処理する必要があります。


あなたが例えばBlockOldLogまたはBlockNewLogを見て、複数のバリエーションを持つようにしたいならば。 BlockNewLogで、damageDroppedcreateStackedBlockのようなメソッドは、それがオーク、バーチ、ジャングル、およびスプルースと同じブロック上のID 4と5である厚板のIDに基づいているため、バリアントから4を引きます。あなた自身のログでは、一般的にこれを行う必要はありません。

+0

あなたは16進数を説明できますか?彼らは何をしますか? –

+0

@BobGonrこの場合、バイナリです。これらの特定の番号を使用する必要はありません(代わりに0,1,2,3)。これらの数値は、通常のログで使用され、0,1,2,3がバリアントに使用されました。最初の2ビットはバリアントで、最後の2つは方向でした。逆コンパイルされたコードでは、それを '4'、' 8'、 '12'と見なしますが、バイナリバージョンを使用すると(私の意見では)上の2ビットしか扱っていないことが分かります。 – Pokechu22

関連する問題