Jump to content

Recommended Posts

Posted

I'm currently trying to get a Item rendered on a block through TESR using code from 1.12. However now in 1.14 GL seems to be more strict/limited about what it's capable to do as the code now leads to MC spamming me with this in the console:

[14:46:59] [Client thread/INFO] [minecraft/GlDebugTextUtils]: OpenGL debug message, id=1283, source=API, type=ERROR, severity=HIGH, message=Error has been generated. GL error GL_STACK_OVERFLOW in (null): (ID: 173538523) Generic error

So I know this means that OpenGl uses all its assigned stack up, however as I'm not experienced with OpenGL (shame on me) I don't know what I have to change. Also as a side note this be possible with TESRFast as that could improve performance (Not much of an issue just trying to be server-friendly)

My code :

public class EmblemPedestalRenderer extends TileEntityRenderer<EmblemPedestalTileEntity> {
    public void render(EmblemPedestalTileEntity tileEntityIn, double x, double y, double z, float partialTicks, int destroyStage) {
        GlStateManager.pushLightingAttributes();
        GlStateManager.pushTextureAttributes();
        GlStateManager.pushMatrix();
        // Translate to the location of the tile entity
        GlStateManager.translated(x, y, z);
        GlStateManager.disableRescaleNormal();
        // Render our item
        renderItem(tileEntityIn);
        GlStateManager.popMatrix();
        GlStateManager.popAttributes();
    }

    @SuppressWarnings("deprecation")
    private void renderItem(EmblemPedestalTileEntity te) {
            ItemStack itemstack = EmblemPedestalBlock.getStack(te.getBlockState(),te.getEmblemType());
            if (!itemstack.isEmpty()) {
                GlStateManager.pushMatrix();
                GlStateManager.disableLighting();
                // Translate to the center of the block and .8 points higher
                GlStateManager.translated(.5, .8, .5);
                GlStateManager.scalef(.9f, .9f, .9f);
                if (te.getBlockState().get(EmblemPedestalBlock.FACING) == Direction.WEST) {
                    GlStateManager.rotatef(MathHelper.wrapDegrees(90), 0, 1, 0);
                }
                if (te.getBlockState().get(EmblemPedestalBlock.FACING) == Direction.NORTH) {
                    GlStateManager.rotatef(MathHelper.wrapDegrees(180), 0, 1, 0);
                }
                if (te.getBlockState().get(EmblemPedestalBlock.FACING) == Direction.EAST) {
                    GlStateManager.rotatef(MathHelper.wrapDegrees(270), 0, 1, 0);
                }
                GlStateManager.rotatef(MathHelper.wrapDegrees(90), 1, 0, 0);

                Minecraft.getInstance().getItemRenderer().renderItem(itemstack, ItemCameraTransforms.TransformType.NONE);
                GlStateManager.popMatrix();
            }
    }
}

Notes: The TileEntity doesn't actually save the stored item as the block only accepts one item it's handled as boolean blockstate, tell me if this is bad style

Additionally EmblemPedestalBlock.getStack(BlockState,EmblemPedestalBlock.Type (Is an enum)) returns ItemStack.EMPTY if no item is stored

EmblemPedestalTileEntity::getEmblemType() returns which item should be accepted represented as an enum (EmblemPedestalBlock.Type)

 

Thanks in advance!

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
19 minutes ago, _Cruelar_ said:

tell me if this is bad style

If it's only one item with a finite amount of rotation/positions then you really should just use a json model or a BakedModel. However, if you do want to stick with the TESR check out CampfireTileEntityRenderer it seems it is simpler to render Items with a TESR than what you have.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

I never used json to add an item to an block model but if you could tell me how I'd try it as I have the additional models for the blockstates anyway (currently all set to the same model). Also biggest difference I saw to the campfire was TransformType.Fixed which didn't change anything.

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
2 minutes ago, _Cruelar_ said:

Also biggest difference I saw to the campfire was TransformType.Fixed which didn't change anything.

It also doesn't pop or push attributes.

3 minutes ago, _Cruelar_ said:

but if you could tell me how I'd try it as I have the additional models for the blockstates anyway

Instead of adding the elements yourself you could probably use the multipart system to add the Items model in.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Now this has two problems:

  1. The Item is rendered in the center of the block, however I'd need it to be 0.3 higher
  2. The Item is rendered without transparency (I guess overwrite Block::isOpaqueCube or 1.14 equivalent, sorry still mostly thinking in 1.12 methods)

Would you know how to solve the first one?

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
8 minutes ago, _Cruelar_ said:

Worst case I'll make a new model file just to align this.

I don't think multipart models support offsetting the models no. You'll have to make a new model file.

 

15 minutes ago, _Cruelar_ said:

The Item is rendered without transparency (I guess overwrite Block::isOpaqueCube or 1.14 equivalent, sorry still mostly thinking in 1.12 methods)

The correct way to do this is to override Block::getRenderLayer and return BlockRenderLayer.CUTOUT_MIPPED

  • Thanks 1

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
Just now, Animefan8888 said:
19 minutes ago, _Cruelar_ said:

The Item is rendered without transparency (I guess overwrite Block::isOpaqueCube or 1.14 equivalent, sorry still mostly thinking in 1.12 methods)

The correct way to do this is to override Block::getRenderLayer and return BlockRenderLayer.CUTOUT_MIPPED

Yeah found that already, as I said I'm still mostly thinking in how it would working 1.12, I know bad practice and all. Thanks for your help!

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
4 minutes ago, _Cruelar_ said:

I know bad practice and all.

No it's not bad practice you have a pretty good jumping off point, and you understand that it won't all be the same and know where to look. You'll get used to 1.14 in no time.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Just as a note I might come back to this later when updating my mod linked in my signature with tileentities and containers as there is a similar block with finite amount of rotations (2) and rescales (2) but infinite amount of items, which means I'll probably need a fix for the TESR issue anyways

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
4 minutes ago, _Cruelar_ said:

but infinite amount of items, which means I'll probably need a fix for the TESR issue anyways

It's actually better for you to use a BakedModel instead since the rotations and scales are finite. However, I am unsure of the 1.14 way of doing that.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
1 minute ago, Animefan8888 said:

However, I am unsure of the 1.14 way of doing that.

That'S a bummer as the approach via json multipart doesn't seem to accept any translation whatsoever for the item model. So either one of us finds out how to do BakedModels or I'll use the TESR for now as it doesn't crash or hinder the game it's just flooding the console (Nice time finding errors with that)

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Posted
5 minutes ago, _Cruelar_ said:

That'S a bummer as the approach via json multipart doesn't seem to accept any translation whatsoever for the item model.

If you make a json model for the item you can use the display tag(check out item/generated for an example) to translate the model. I think.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

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.