1.15.2 方块实体问题

Svanur


版本信息
你使用的系统:<windows 64>
你是用的JDK: <1.8.0_251>
你使用的IDE:
你使用的IDE版本:<IntelliJ IDEA 2020.1.2 (Community Edition)>
Forge版本: < 1.15.2-31.2.0>
Minecraft版本: <1.15.2>

出错图


错误情况简述
为方块绑定了方块实体,并希望在右键点击方块时能触发一些事件,但并未生效,经过测试发现onBlockActivated()方法没有被运行.

报错日志

没有找到报ERROR的地方

相关代码
<TestMachine.java>

package com.svanur.ripple_tech.block.machines;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;

import javax.annotation.Nullable;

public class TestMachine extends Block {
    public TestMachine(Properties properties) {
        super(Properties.create(Material.ROCK).hardnessAndResistance(5));
    }

    @Override
    public boolean hasTileEntity(BlockState state) {
        return true;
    }

    @Nullable
    @Override
    public TileEntity createTileEntity(BlockState state, IBlockReader world) {
        return new TestTileEntity();
    }

    /*
        玩家点击该方块时将会发送一条消息
     */
    @Override
    public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
        System.out.println("onBlockActivated11111111");

        if (!worldIn.isRemote && handIn == Hand.MAIN_HAND) {
            System.out.println("onBlockActivated222222");

            TestTileEntity testTileEntity = (TestTileEntity) worldIn.getTileEntity(pos);

            //获取到消息
            String say = testTileEntity.say();

            //发送消息
            TranslationTextComponent textComponents = new TranslationTextComponent("message.rippletech.test", say);
            player.sendStatusMessage(textComponents, false);
        }
        return ActionResultType.SUCCESS;
    }
}

<TestTileEntity.java>

package com.svanur.ripple_tech.block.machines;

import net.minecraft.tileentity.TileEntity;

public class TestTileEntity extends TileEntity {
    
    public TestTileEntity() {
        super(TileEntityTypeRegistry.testTileEntity.get());
    }

    public String say() {
        return "你好,我是测试方块";
    }
}

<TileEntityTypeRegistry.java>

package com.svanur.ripple_tech.block.machines;

import com.svanur.ripple_tech.block.BlockRegistry;
import net.minecraft.tileentity.TileEntityType;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

public class TileEntityTypeRegistry {

    public static final DeferredRegister<TileEntityType<?>> TILE_ENTITY_TYPE_DEFERRED_REGISTER
            = new DeferredRegister<>(ForgeRegistries.TILE_ENTITIES, "rippletech");

    public static RegistryObject<TileEntityType<TestTileEntity>> testTileEntity = TILE_ENTITY_TYPE_DEFERRED_REGISTER.register("test_tileentity", () -> {
        return TileEntityType.Builder.create(
                () -> {
                    return new TestTileEntity();
                }, BlockRegistry.testMachines.get()
        ).build(null);
    });
}

<RippleTech.java(此为mod的主类)>

package com.svanur.ripple_tech;

import com.svanur.ripple_tech.block.BlockRegistry;
import com.svanur.ripple_tech.block.machines.TileEntityTypeRegistry;
import com.svanur.ripple_tech.item.ItemRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;

@Mod("rippletech")
public class RippleTech {
    public RippleTech() {
        ItemRegistry.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
        BlockRegistry.BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
        TileEntityTypeRegistry.TILE_ENTITY_TYPE_DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
    }
}

查到的资料
根据教程https://neutrino.v2mcdev.com/tileentity/firsttileentity.html所写


FledgeXu


你指的没有被调用到是说"onBlockActivated11111111"没有输出?有点古怪。
看起来好像没有问题啊,你是不是测试错方块了:joy:


Svanur


(帖子被作者删除,如无标记将在 24 小时后自动删除)


Svanur


是的,那句话没有输出,我可以保证没有用错方块,我检查了很多遍也没有发现问题所在


FledgeXu


我测试了一下,同样的代码没有毛病啊……
你是不是用这个帖子里介绍的方法了,试试直接在gradle面板里运行runClient tasks,看看有没有解决问题。


顺便尽量不要用print语句作为调试,IntelliJ里下断点很方便的,直接下断点调试就行了。


Svanur


不行啊依旧没反应


Svanur


有没有可能是我的mdk的问题,我是使用的../t/topic/249这篇帖子里的离线包


FledgeXu


你既然可以运行MDK出错的可能性不大。
有个问题,你的方块是通过物品放置的吗?
请你补充一下,你物品注册的代码。


Svanur


是通过物品放置的,代码如下

    public static RegistryObject<Item> testMachine = ITEMS.register("test_machine",() -> {
        return new BlockItem(BlockRegistry.testMachines.get(), new Item.Properties().group(RippleTechItemGroup.itemGroup));
    });

FledgeXu


再补充一下你的方块注册的代码。


Svanur


物品注册

public class ItemRegistry {
    public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS,"rippletech");
    //测试方块
    public static RegistryObject<Item> testMachine = ITEMS.register("test_machine",() -> {
        return new BlockItem(BlockRegistry.testMachines.get(), new Item.Properties().group(RippleTechItemGroup.itemGroup));
    });
}

方块注册

public class BlockRegistry {
    public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS,"rippletech");

    public static RegistryObject<Block> testMachines = BLOCKS.register(
            "test_machines",()->{
                return new BaseBlock(Block.Properties.create(Material.ROCK)
                        .hardnessAndResistance(10)
                        .harvestTool(ToolType.PICKAXE)
                        .harvestLevel(0)
                );
            }
    );
}

Svanur


(帖子被作者删除,如无标记将在 24 小时后自动删除)


FledgeXu


你方块写错了……
你想要注册的是TestMachine,但是实际注册的是BaseBlock

return new BaseBlock(Block.Properties.create(Material.ROCK)

Svanur


啊对!我改一下试试


FledgeXu


  1. 作为你现在这个等级的用户,每天发言频率是有限制的,请珍惜你的发言机会
  2. 我已经关注了这个帖子,这个帖子所有的回复都会发邮件给我的。
  3. @不能够加快别人回答的速度,除非你需要告知某个没有关注这个帖子的人需要Check一下这里的内容,请尽量不要@别人。

Svanur


好的,我知道了


Svanur


现在已经可以了,但是我要怎么解决这样的乱码问题啊?写这句话的类的文件已经是utf-8的编码了


FledgeXu


不是很清楚,可能是你的语言文件的编码有问题。


Svanur


好的,谢谢您的帮助


FledgeXu


没事
记得,选择一个楼层作为答案,或者自己补充一个楼层作为答案。


Svanur


我还有一些问题,请问在哪里可以找到minecraft原版的代码呢?我想要制作一个科技向的mod,但是我现在还不知道那些机器应该如何实现,也不知道在哪里能找到相关的资料,请问可以帮忙指条路吗?


FledgeXu


在开发的过程中你得熟练使用开发工具,在这里我们的工具是IntelliJ IDEA。有两个快捷键对于理解代码有非常大的帮助。第一个快捷键是 Ctrl+N(Windows) ,这个快捷键可以让你搜索指定的类,这样你就可寻找原版类里在哪里,有什么内容了。另一个快捷键就是 Ctrl+H 当你把鼠标指针放在一个类上时,按下这个快捷键,会在右侧显示这个类的继承关系,也可查看某个接口的具体实现,大家可以自己上网搜索IDEA常用快捷键学习使用。

另外一个技巧是,当你看到某个方法,想要知道这个方法在哪里调用时,可以右键然后点击 Find Usages(查找使用) ,你就可以看见所有调用这个方法的代码了。

还有如果你想查看某个类的源代码,只需要按住 Ctrl 键,点击那个类就可以进入到那个类内部查看它的源代码。

https://neutrino.v2mcdev.com/item/meleeweapons.html#开发小课堂

老实说,如果你连到哪里找原版到代码都不知道都话,我真的想劝退你,你现在的水平是支持不住你的想法的。


Svanur


我知道我的水平不足,我想要的是一个好的学习方法


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。