Jump to content

Recommended Posts

Posted

As by title, i have a block that has a tile entity in it, but when placed it have no texture. Not the "missing texture" texture, is just transparent. I have registered the entity and the block, i think the json files are good, so i don't really know why this happens :/

Here is how it looks now

UuSOjkJ.png

And here is the code for my block

package mw.blocks;

import java.util.List;
import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityDaylightDetector;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends BlockContainer
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World worldIn, int meta)
    {
       return new TileEntityDynamicLamp(worldIn);
    }
}

The TileEntity code

package mw.entities.tileentity;

import mw.blocks.BlockDynamicLamp;
import net.minecraft.server.gui.IUpdatePlayerListBox;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class TileEntityDynamicLamp extends TileEntity implements IUpdatePlayerListBox
{
public TileEntityDynamicLamp(World world) {
	super();
}

/**
 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
 * ticks and creates a new spawn inside its implementation.
 */
@Override
public void update()
{
	if (this.worldObj != null && !this.worldObj.isRemote && this.worldObj.getTotalWorldTime() % 20L == 0L)
	{
		this.blockType = this.getBlockType();

		if (this.blockType != null && this.blockType instanceof BlockDynamicLamp)
		{
			((BlockDynamicLamp)this.blockType).updatePower(this.worldObj, this.pos);
		}
	}
}

}

And here is how i create and register the tile entity

public static TileEntityDynamicLamp dynamic_lamp;
....
dynamic_lamp = new TileEntityDynamicLamp(null);
....
GameRegistry.registerTileEntity(TileEntityDynamicLamp.class, "tileEntityDynamicLamp");

 

The JSON files are the files for a normal block, so i don't think you need to read that :/ I debugged the code and i figured it out that the entity is created, so appearently there's nothing wrong, but of course there is :/ Thanks in advance for all who will help me :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

I don't use metadata because it was the code from the 1.7.10 version (wich is the motivation of why i extend the BlockContainer class, in that version everything works fine) and in that (i talk about 1 year ago) i wasn't able to use metadata as well, i was very noob then, now i'm still a noob but not in total xD

The tile entity code has that two checks beacuse in past it was just a copy and paste of the TileEntityDaylightSensor, so i don't know they was useless :/

So now i've changed the TileEntity code to this

package mw.entities.tileentity;

import mw.blocks.BlockDynamicLamp;
import net.minecraft.server.gui.IUpdatePlayerListBox;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class TileEntityDynamicLamp extends TileEntity implements IUpdatePlayerListBox
{
public TileEntityDynamicLamp() {
	super();
}

/**
 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
 * ticks and creates a new spawn inside its implementation.
 */
@Override
public void update()
{
	if (this.worldObj != null && !this.worldObj.isRemote && this.worldObj.getTotalWorldTime() % 20L == 0L)
	{

		if (this.getBlockType() != null)
		{
			((BlockDynamicLamp)this.blockType).updatePower(this.worldObj, this.pos);
		}
	}
}

}

but now the code running in the update power function is not executed (i guess that is not creating a tile entity) :/

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

This is the updated block class (is not changed too much)

package mw.blocks;

import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends Block
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World worldIn, int meta)
    {
       return new TileEntityDynamicLamp();
    }
}

 

The tile entity is still registerd the way described above, with the initialization done in the preInit method and the registration done in the init method

dynamic_lamp = new TileEntityDynamicLamp();
....
GameRegistry.registerTileEntity(TileEntityDynamicLamp.class, "tileEntityDynamicLamp");

but according to what diesieben says i'm not supposed to call the entity initialization

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

Ok, so i've changed the createNewTileEntity method to createTileEntity, and added the hasTileEntity method, so now my block class looks like this

package mw.blocks;

import java.util.Random;

import mw.core.MWBlocks;
import mw.core.MWTabs;
import mw.core.utils.Utils;
import mw.entities.tileentity.TileEntityDynamicLamp;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockDynamicLamp extends Block
{
    private final boolean is_daylight;

    public BlockDynamicLamp(boolean par1, boolean par2, String name)
    {
        super(Material.redstoneLight);
        Utils.setBlockInfo(this, name, 0.5F, 0.5F);
	if(par1)
	{
		this.setLightLevel(1.0F);
		this.setCreativeTab((CreativeTabs)null);
	}
	else
		this.setCreativeTab(MWTabs.tabRedstone);
	this.setStepSound(soundTypeGlass);
	this.is_daylight = par2;
	GameRegistry.registerBlock(this, name);
    }
    
    public void updatePower(World worldIn, BlockPos pos)
    {
        if (!worldIn.provider.getHasNoSky())
        {
            if(worldIn.getWorldTime() >= 12500)
		{
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_idle.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_active.getDefaultState());
		}
            else
            {
			if(this.is_daylight == true)
				worldIn.setBlockState(pos, MWBlocks.daylight_lamp_active.getDefaultState());
			else
				worldIn.setBlockState(pos, MWBlocks.nightlight_lamp_idle.getDefaultState());
		}
        }
    }

    /**
     * Get the Item that this Block should drop when harvested.
     *  
     * @param fortune the level of the Fortune enchantment on the player's tool
     */
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @SideOnly(Side.CLIENT)
    public Item getItem(World worldIn, BlockPos pos)
    {
    	if(this.is_daylight)
    		return Item.getItemFromBlock(MWBlocks.daylight_lamp_idle);
    	else
    		return Item.getItemFromBlock(MWBlocks.nightlight_lamp_idle);
    }

    @Override
    public boolean hasTileEntity()
    {
    	return true;
    }
    
    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    @Override
    public TileEntity createTileEntity(World worldIn, IBlockState meta)
    {
    	return new TileEntityDynamicLamp();
    }
}

but it still does nothing, the code in the updatePower method is not executing

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

D'oh, i don't know why Eclipse doesn't warned me, maybe is tired xD Anyway that works, so thank for the help :D Just for curiosity, why extending BlockContainer makes an invisible block?

Don't blame me if i always ask for your help. I just want to learn to be better :)

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

    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
    • Remove rubidium - you are already using embeddium, which is a fork of rubidium
  • Topics

×
×
  • Create New...

Important Information

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