Jump to content

Recommended Posts

Posted

Hello,

 

after a long time I've decided to try modding with Forge again because of the problems with bukkit etc.

 

My goal is to use an exported 3d model from Techne in Forge. So I've exported a simple 3d model (the cat with the fish on Techne Online, only for example) and created a mod which loads a custom model with the TESR. So it should be a tile entity for the first.

 

I've copied some code parts (sry for this :D) from some posts here and it seems to be working, I can place the "block" and I can hover over it.

width=800 height=450http://cloud.jonni.it/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=943&a=true&file=%252Fpicpublic2015-02-02_16.14.30.png&t=1e1f30392630e1337809615fddcf219f&scalingup=0[/img]

 

But the texture doesn't work, you can see it in the picture.

 

Here is my TileEntityExampleRenderer:

package com.example.examplemod;

import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

import org.lwjgl.opengl.GL11;

import cpw.mods.fml.relauncher.SideOnly;
import cpw.mods.fml.relauncher.Side;

@SideOnly(Side.CLIENT)
public class TileEntityExampleRenderer extends TileEntitySpecialRenderer
{
        //The model of your block
        private final ModelExample model;
        private final ResourceLocation textureLocation;
       
        public TileEntityExampleRenderer()
        {
                this.model = new ModelExample();
                this.textureLocation = new ResourceLocation("examplemod", "textures/entity/texture.png");
        }
       
        private void adjustRotatePivotViaMeta(World world, int x, int y, int z)
        {
                int meta = world.getBlockMetadata(x, y, z);
                GL11.glPushMatrix();
                GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F);
                GL11.glPopMatrix();
        }
       
        @Override
        public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale)
        {
        //The PushMatrix tells the renderer to "start" doing something.
                GL11.glPushMatrix();
        //This is setting the initial location.
                GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
              
                this.bindTexture(this.textureLocation);
         //This rotation part is very important! Without it, your model will render upside-down! And for some reason you DO need PushMatrix again!                      
                GL11.glPushMatrix();
                GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                
                    int rotation = 0;
                    switch (te.getBlockMetadata() % 4) {
                        case 0:
                            rotation = 270;
                            break;
                        case 1:
                            rotation = 0;
                            break;
                        case 2:
                            rotation = 90;
                            break;
                        case 3:
                            rotation = 180;
                            break;
                    }
                  GL11.glRotatef(rotation, 0.0F, 1.0F, 0.0F);
                    
                    
        //A reference to your Model file. Again, very important.
                this.model.render(null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
        //Tell it to stop rendering for both the PushMatrix's
                GL11.glPopMatrix();
                GL11.glPopMatrix();
        }

        //Set the lighting stuff, so it changes it's brightness properly.      
        private void adjustLightFixture(World world, int i, int j, int k, Block block)
        {
                Tessellator tess = Tessellator.instance;
                float brightness = block.getLightOpacity(world, i, j, k);
                int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
                int modulousModifier = skyLight % 65536;
                int divModifier = skyLight / 65536;
                tess.setColorOpaque_F(brightness, brightness, brightness);
                OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,  (float) modulousModifier,  divModifier);
        }
        
}

 

And here is a picture from my class tree:

width=747 height=613http://cloud.jonni.it/index.php/apps/files_sharing/ajax/publicpreview.php?x=1920&y=943&a=true&file=%252FpicpublicUnbenannt%2520%283%29.PNG&t=a29658dc0b4d7304ea2fc5ab75977c9c&scalingup=0[/img]

 

I've tried a lot but I don't understand why it doesn't work.

Can you help me? Thanks in advance.

 

Regards,

Jonniboy

Where is the love? Can't see it...

Posted

Thank you for your answer. I know, the texture for the block in my inventory isn't set. But that is not the problem I mean because I know how to set the inventory icon.

The real problem is that I don't see something when I place it. Only the borders of the TileEntity appear, but the texture seems to be not loaded.

 

Sorry for this description, I haven't described it clearly enough.

Regards,

Jonniboy

Where is the love? Can't see it...

Posted

Oh. I know what the problem is. You have a GL_rotate after a GL_translate.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Do you mean you can see the outline of a block (cube) but not the actual model shape?  Or can you see the outline of the model shape but it's transparent?

 

If the first one - go to near x=0, z = 0 and  try placing your block way up in the sky.  It might be rendering in the wrong x,y,z location, and that will give you a chance to see where it is actually rendering.

 

That sheep is very distracting, by the way.

 

-TGG

Posted

Just to clarify stuff:

 

       

//The PushMatrix tells the renderer to "start" doing something.

No it doesn't. It "adds" a new Matrix layer (child) to the one you're currently rendering in (parent), meaning every transformation from the parent layer gets applied in your new child layer, but anything transformed inside your layer does not get applied to further rendering within the parent layer.

 

       

//[...]And for some reason you DO need PushMatrix again!

 

No you don't! You only do a PushMatrix again if you want another child layer inside your child layer. You can safely remove it.

 

       

//Tell it to stop rendering for both the PushMatrix's

It does not "stop rendering", it just closes your child layers, bringing you back to the parent layer.

If you've removed the 2nd PushMatrix, you need to remove one of the PopMatrix as well

 

 

By the way: Matrices only encapsulate transformations (rotation, translation, scaling), whereas other stuff like colorization, enabling blend mode etc. WILL apply to the parent layers as well!

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

First of all, thank you for the answers and the corrections.

 

By the way,

That sheep is very distracting' date=' by the way.[/quote']

yes, the sheep is very distracting. I've noticed the sheep at the time I've shot the screenshot, but I thought that you will ignore it because I've wrote what the model is about:

(the cat with the fish on Techne Online' date=' only for example)[/quote']

 

And at the second I can say that I'm not the author of these wrong comments, but there are where there are because I've copied this part. A tutorial on the wiki here (http://www.minecraftforge.net/wiki/Rendering_a_Techne_Model_as_a_Block) has the wrong comments too. A lot of other forum threads takes the part with the wrong comments too, but that's not so important.

 

Back to topic:

So it's clear that I mean that I mean the problem which is mentioned in the topic title. Sorry for the misunderstandings.

I can see the outline of a block which is a cube, but the problem is that the texture I've set is not loaded or cannot be displayed and a transparent one is there. So you can ignore the sheep. The model which should be displayed is this one: http://techne.zeux.me/1474b77d

 

Do you know a solution of the problem?

The recommended solution of Draco18s is not working or I don't know what he means exactly.

 

Thanks in advance.

Regards,

Jonniboy

Where is the love? Can't see it...

Posted

Sry for the bump, but do anyone have an answer for me?

I think for some high-skilled Forge modders and Java pro's my problem shouldn't be a problem.  ;)

 

Regards,

Jonniboy

Where is the love? Can't see it...

Posted

Hi.

 

Have you checked to see whether your     

  public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale)

is ever being called?  eg using breakpoint or System.out.println("renderTileEntityAt");

 

If not, the registration of your TileEntity and/or TileEntitySpecialRenderer is probably not right.

 

-TGG

Posted

TheGreyGhost is right. :) Show more code. Show the class where you registered your TESR, and maybe even your Tile Entity class, just for good measure.

 

I'm guessing you registered it in your ClientProxy, right? If so is that method inside that class called? I once had a problem with an entity becoming a tall white blob because I didn't invoke such a method, lol.

Posted

Okay, so I can see what you're doing wrong, but I'm not confident in my ability to explain it - bear with me.

 

I hate to post code, but I hope that in making it not 'copy-pastable', you will still need to learn and understand it. Where you have your first method and resource location, try using this:

 

private static final ResourceLocation textureLocation = new ResourceLocation([mainclass.modid + ":" + "textures/entity/yourtexture.png");

 

and then where you've said this.bindtexture... down the bottom, get ride of the object (this.). I think the problem you're having is that you might have been using an outdated thread? Anyway. See if this works. If it doesn't then restart following this:

 

(Part 1 - Model itself) and

(Part 2 - Coding it in)

 

P.S. Make sure the resource location variable is the same as your bind texture variable and that your texture file is inside the textures/entity path - entity being a folder.

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.