当前位置: 首页 > 知识库问答 >
问题:

放置定制木块时,游戏崩溃

商瀚
2023-03-14

这个问题与minecraft 1.9版有关

我是新来的改装现场,我的测试木块有问题。我已经为我的测试木块扩展了BlockLog类。然而,每次我试图在游戏中放置积木,我的游戏就会崩溃。这是我的原木课:

package bravoman.testmod.blocks;

import net.minecraft.block.BlockLog;

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

最近,我一直在youtube上学习简单的教程,这就是我学习创建新区块的方式。我更进一步,没有扩展Block,而是继续扩展BlockLog

我尝试过BlockLog类,试图覆盖某些方法或添加枚举类型,但没有效果。我相信有大量代码缺失,但由于没有修改minecraft的进一步经验,我被困在这里。我也在minecraft论坛上问过这个问题。下面是事故日志。任何帮助都将不胜感激。

---- 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)

共有1个答案

高和通
2023-03-14

这是因为您使用了BlockLog,它有一些关于其方向的状态信息,但需要子类来实现它。他们没有完全实现它,因为日志通常代表几种不同的类型,而且没有逻辑基础。然而,它并没有将状态方法抽象化,因此不清楚是否需要这样做。

BlockLog扩展了blockRotatedPostal,它定义了自己的状态信息。然而,由于原木有一个附加状态(它不面向任何方向,四面都是树皮),因此不使用支柱的状态信息,而是使用一个单独的状态值。但是BlockLog不注册这个,并且希望子类注册(因为它们无论如何都会注册其他信息,这会强制覆盖这些信息)。因为注册没有发生,所以使用了错误的轴信息,当游戏需要pilar轴信息时,日志会尝试设置日志轴信息。

要解决这个问题,请查看现有的BlockLogBlockOldLog(它有橡树、桦树、云杉和丛林)和BlockNewLog(它有相思树和黑橡树)。

对于您的情况(我假设您不想有任何变体),以下可能会起作用(不过我还没有测试过):

package bravoman.testmod.blocks;

import net.minecraft.block.BlockLog;

html" target="_blank">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属性。

如果您确实想要有多个变体,请查看BlockOldLogBlockNewLog作为示例。请注意,对于BlockNewLog,像damageDroedcreateStackedBlock这样的方法会从变体中减去4,因为它是基于plank ID,其中acadia和暗橡树与橡树、桦树、丛林和云杉在同一个块上的ID 4和5。对于您自己的日志,您通常不需要这样做。

 类似资料:
  • 开源的游戏联运平台基于,用于开发大型Web应用的高性能的YiiFramework框架 编写,兼容Sina云计算的SAE,集成了 支付宝支付系统,订单,另外还有文章管理,游戏管理,游戏API自助添加功能。 如果出现404请参考yii的定向重写规则 代码在git@oschina:http://git.oschina.net/yiitop/muhuoniao_game 演示地址:http://www.muhuoniao.com

  • When building your games, you'll place lots of different objects in your game world. 当你建立了游戏,你就要放置许多不同的对象到你的游戏世界中。 Focusing 聚焦 It can be useful to focus the Scene View Camera on an object before manip

  • 一个全随机的刷装备刷词条小游戏。 游戏设计 通过副本获得装备与金币 装备分为四个等级:破旧、普通、神器、史诗 主角默认每秒回血 2% 默认暴击伤害 150% 完成副本时可能掉落独特级别(5 个词条)的装备(通关后 2.5%掉落率,无尽挑战不会掉落) 通关后开启无尽挑战

  • 我正在尝试在LWJGL中创建一个Pong游戏。我已经设法绘制了“球拍”和球,我还可以使用W和S键使球拍上下移动。 现在我正在尝试使用着色器为蝙蝠着色,但是当我尝试 - glEnableVertexAttribArray(1) - 启用包含颜色的第二个顶点数组(在循环中)时,我遇到了错误。第二个顶点数组被启用,但是当游戏尝试绘制我的蝙蝠 - glDrawElements(GL11.GL_TRIANG

  • 电话:索尼Xperia LT25i。 我安装了游戏。启动了它。看到黑屏和无响应应用程序。 和logcat继续在控制台中发送垃圾邮件: 有没有人知道发生了什么以及如何解决这个问题? 我尝试了不同的应用程序。我甚至用空场景创建了空项目——结果相同。

  • 我需要创建一个方法来检查tictactoe游戏是否在玩、DRAW、XWIN或owin。然而,我很难编写代码来检查X或O是否获胜,因为游戏板的大小和获胜所需的大小(sizeWin)会根据用户的输入而改变。我被迫使用一维阵列的游戏板。我根本不知道从这里到哪里去。我最近的想法是使用嵌套的for循环来检查是否按行、列或对角线获得胜利,但我不确定如何实现它。如果有人对如何处理这个问题有任何提示,或者有任何其