Jump to content

How to create an entity with properties and textures of a block


Recommended Posts

Posted

Hello everyone!

I recently started learning Minecraft modding and I'm currently trying to figure out how to work with entities . My goal is to move the block the player is looking at three blocks up . Now I've figured how to move the block but I wanted to add some animations to it and I decided to summon an entity and move it upwards and delete it and then summon my block again. But the problem is I can't any way to summon an entity . All the videos on YT are about making custom entities or block entities . And my second question is how can I move it afterwards . Can I apply some kind of force ?

Posted

There are many ways to summon an entity.

Since you want to give it an initial velocity, have a look at GhastShootFireballGoal.

For rendering a block during entity rendering, look at the FallingBlockRenderer, used for things like falling sand or dropping anvils.

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Posted (edited)
  On 11/12/2022 at 4:58 PM, warjort said:

There are many ways to summon an entity.

Since you want to give it an initial velocity, have a look at GhastShootFireballGoal.

For rendering a block during entity rendering, look at the FallingBlockRenderer, used for things like falling sand or dropping anvils.

Expand  

Well , how can I replace my fireball's texture with a grass block . I couldn't figure it out.

 

Edited by alimrv
Posted
  On 11/12/2022 at 4:58 PM, warjort said:

For rendering a block during entity rendering, look at the FallingBlockRenderer, used for things like falling sand or dropping anvils.

Expand  

 

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Posted
  On 11/16/2022 at 8:29 AM, warjort said:

 

Expand  
package net.alimrv.ridemod.block.custom;

import net.minecraft.client.renderer.entity.FallingBlockRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.item.FallingBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;

public class EntityGrass extends FallingBlockEntity {

    Vec3 vec = Vec3.ZERO;
    BlockPos pos;
    ServerLevel level;
    BlockState state;
    int i;

    public EntityGrass(EntityType<? extends FallingBlockEntity> entityType, ServerLevel level , BlockPos pos , BlockState state, int i) {
        super(entityType, level);

        this.pos = pos;
        this.level = level;
        this.state = state;
        this.i = i;
    }

    @Override
    public void tick()
    {
            setNoGravity(true);

            if(this.time >= 6)
            {
                placeBlock(this.pos,this.level,this.state,this.i);
                this.kill();
            }

            this.setDeltaMovement(this.vec.add(0 , 0.5, 0));

                this.move(MoverType.SELF , this.getDeltaMovement());

                ++this.time;

    }

    //places block after moving the entity
    void placeBlock(BlockPos pos, @NotNull ServerLevel level , BlockState state , int i)
    {
            level.setBlock(pos,state , i);
    }
}

I figured it was better to make a FallingBlockEntity than a fireball. But still I can't figure out how to change the blockState . I looked at FallingBlockRenderer but I don't know how to use it.

Posted (edited)

You can't do it like that. If you want to subclass the FallingBlockEntity you need to create your own EntityType.

I am not even sure the FallingBlockEntity is even designed to be subclassed?

There is a "smart constructor" where you can create a FallingBlockEntity from a BlockState see FallingBlockEntity.fall()

and ScaffoldingBlock.tick() for example usage.

 

But I thought you just wanted to render a block when drawing your entity? FallingBlockRenderer is just an example of this.

The basics of what it is doing is this pseudo code:

// Get the BlockState from the FallingBlockEntity
BlockState blockstate = fallingBlockEntity.getBlockState();

-- snip --

// Get the model for that block state and render each render type
var model = this.dispatcher.getBlockModel(blockstate);
for (var renderType : model.getRenderTypes(....))
     this.dispatcher.getModelRenderer().tesselateBlock(...);

You would probably just hard code the blockstate with something like Blocks.GRASS_BLOCK.defaultState() ?

Edited by warjort

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • just rewatched the tutorial and my code is exactly the same as kaupenjoe's.  the item is added into the game but like i said to start it doesnt have a texture or a proper name for whatever reason.
    • yes the name is en_us.json and it is in resources -> assests -> testmod -> lang folders.  i have checked my code and am pretty confident that the code itself is correct.  i even tried loading the project in eclipse and it has the same problems, I think i will just rewatch the whole tutorial and will give an update on the situation.
    • same error, I also tried removing Valkyrian skies as well because I noticed it coming up a lot in the debug log errors
    • Hey man,    i have only been modding Minecraft for a few days but maybe I can help you. First of all make sure to follow every step of Kaupenjoe's tutorial, I found it to been very helpful and complete. The game uses the raw translation key for the item (in your case "item.testmod.alexandrite") if it can't find the correct lang file. Make sure it's name is "en_us.json" and it is saved under "ressources" -> "assets" -> "testmod".
    • whenever I try to get this item to render into the game it appears with the not texture purple and black squares and calls itself by the lang translation file path instead of the name i gave it.   { "item.testmod.alexandrite": "Alexandrite" } this is the lang json file package net.Hurst.testmod.item; import net.Hurst.testmod.TestMod; import net.minecraft.world.item.Item; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ModItems { public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TestMod.MOD_ID); public static final RegistryObject<Item> ALEXANDRITE = ITEMS.register("alexandrite", () -> new Item(new Item.Properties())); public static void register(IEventBus eventBus){ ITEMS.register(eventBus); } } this is my ModItems.java file package net.Hurst.testmod; import com.mojang.logging.LogUtils; import net.Hurst.testmod.item.ModItems; import net.minecraft.world.item.CreativeModeTabs; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; // The value here should match an entry in the META-INF/mods.toml file @Mod(TestMod.MOD_ID) public class TestMod { public static final String MOD_ID = "testmod"; private static final Logger LOGGER = LogUtils.getLogger(); public TestMod() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::commonSetup); ModItems.register(modEventBus); MinecraftForge.EVENT_BUS.register(this); modEventBus.addListener(this::addCreative); ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC); } private void commonSetup(final FMLCommonSetupEvent event) { } // Add the example block item to the building blocks tab private void addCreative(BuildCreativeModeTabContentsEvent event) { if(event.getTabKey() == CreativeModeTabs.INGREDIENTS){ event.accept(ModItems.ALEXANDRITE); } } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { } // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent @Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public static class ClientModEvents { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { } } } this is my TestMod.java file { "parent": "minecraft:item/generated", "textures": { "layer0": "testmod:item/generated" } } this is my model file for the item. I am using intellij 2025.1.2 with fdk 1.21 and java 21 I would appreciate the help.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.