2017-10-15 17 views
2

私は、そのブロックと対話するために、別のブロックの位置を格納する必要があるブロックを持っています。あなたが世界からログアウトしていない限り、すべてうまく動作します。他のブロックの座標をタイルエンティティのnbtデータに保存します。データの保存はうまくいきますが、世界にログインしてnbtデータを読み込むときに問題があります。私は今問題がクライアント側にのみ存在することを理解しました。ワールドをロードするとき、サーバーによって正しい座標がnbtからロードされますが、クライアントは各座標に対して0しかロードせず、これらの座標でブロックと対話しようとすると何らかの問題を引き起こします。 この問題を解決する方法はわかりません。なぜデータがサーバーに正しく読み込まれているのかクライアント側で正しく読み込まれないのか混乱しています。ここでクライアント側とサーバー側のNBTローディング

は、書き込み用のメソッドであり、TileEntityにNBTを読ん:

@Override 
public NBTTagCompound writeToNBT(NBTTagCompound compound) { 

    int[] cont = {0, 0, 0}; 

    if(this.controller != null) { 

     LogHelper.info("Writing " + this.controller); 
     cont[0] = this.controller.getX(); 
     cont[1] = this.controller.getY(); 
     cont[2] = this.controller.getZ(); 

    } 

    compound.setInteger("controllerX", cont[0]); 
    compound.setInteger("controllerY", cont[1]); 
    compound.setInteger("controllerZ", cont[2]); 

    super.writeToNBT(compound); 

    return compound; 

} 

@Override 
public void readFromNBT(NBTTagCompound compound){ 

    super.readFromNBT(compound); 

    int[] coords = {0, 0, 0}; 
    coords[0] = compound.getInteger("controllerX"); 
    coords[1] = compound.getInteger("controllerY"); 
    coords[2] = compound.getInteger("controllerZ"); 
    LogHelper.info("Loading " + Arrays.toString(coords)); 
    this.controller = new BlockPos(coords[0], coords[1], coords[2]); 
    LogHelper.info("Loading " + this.controller); 

} 

私はまた、NBTのためのint配列を使用してみましたが、それはまったく動作しません。正しいデータがnbtタグに格納されていても、空の配列を返します。 私を助けてくれることを願っています! :-)

答えて

2

デフォルトでは、Minecraftはクライアントとサーバーの間でNBTデータを同期しません。

NBTデータを同期させるには、onDataPacketgetUpdatePacketの機能を無効にする必要があります。

鉱山は、一般的に次のようになります。

@Nullable 
@Override 
public SPacketUpdateTileEntity getUpdatePacket() { 
    return new SPacketUpdateTileEntity(getPos(), getBlockMetadata(), writeToNBT(new NBTTagCompound())); 
} 

@Override 
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { 
    readFromNBT(pkt.getNbtCompound()); 
} 

はまた、あなたはそれが世界の負荷上で作成できるように正しくTileEntityを登録することを確認したのですか?それは新鮮なTileEntityを返すために与えられIBlockStatecreateTileEntityでTileEntityを持っている場合は、このために

あなたのブロックがreturn truehasTileEntityをオーバーライドする必要があります。

なく、少なくとも最後に、あなたは `getUpdatePacket()`とは異なる時間に呼ばれる `パブリックNBTTagCompound getUpdateTagは()`もありますGameRegistry

GameRegistry.registerTileEntity(YourTileEntity.class, "YourModid:ResourceString"); 
+0

であなたのTileEntityを登録する必要があります。 – Draco18s

+0

ありがとうございました!これは私の問題を解決しましたが、私はgetUpdatePacket()の代わりにgetUpdateTag()を使う必要がありました! – XPModder

関連する問題