Jump to content

Recommended Posts

Posted

Hello, I am trying to render a model over the player similar to armour but cannot align the position of the models with the player. I have been using ModelBiped but would much rather be able to use the armour model. I cannot figure out how to render it in the same position as the player while also rotating it with the player.

What I ultimately want to achieve is to render armour on the player with my textures while keeping the player rendered underneath.

So I have 2 questions.

How can I align the model with the player?

How can I render the armour model rather than player model?

I am using PlayerRenderEvent.Post to render it, here's the code.

        @SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Post event){
	Minecraft mc = Minecraft.getMinecraft();
	ModelBiped main = event.renderer.getMainModel();
	ModelBiped drive = new ModelBiped();

	float base = 0.0625f;

	GL11.glPushMatrix();

	mc.renderEngine.bindTexture(new ResourceLocation("kk:textures/armour/Valor_A.png"));

	//Body and arms
	ModelBiped.copyModelAngles(main.bipedBody, drive.bipedBody);
	ModelBiped.copyModelAngles(main.bipedLeftArm, drive.bipedLeftArm);
	ModelBiped.copyModelAngles(main.bipedRightArm, drive.bipedRightArm);

	drive.bipedBody.render(base);
	drive.bipedLeftArm.render(base);
	drive.bipedRightArm.render(base);

	//Legs
	mc.renderEngine.bindTexture(new ResourceLocation("kk:textures/armour/Valor_B.png"));

	ModelBiped.copyModelAngles(main.bipedLeftLeg, drive.bipedLeftLeg);
	ModelBiped.copyModelAngles(main.bipedRightLeg, drive.bipedRightLeg);

	drive.bipedLeftLeg.render(base);
	drive.bipedRightLeg.render(base);

	GL11.glPopMatrix();
}

 

This produces:

I3e1Y3f.png

 

It looks fine it's just upside down and doesn't rotate with the player. Although the arms and legs move when walking.

I'm clearly doing something wrong or have missed out something.

 

Any help is appreciated, thanks.

Posted

Wait, so to get this straight you are making a set of armor? Or what exactly are you making?

I Love To Help People. Unless They Are The Kind Of People Who Just Doesn't Know Anything. Those People Need Some Serious Help. This Could Help But......

https://www.youtube.com/watch?v=6t0GlXWx_PY

 

ThingsMod Git: https://github.com/EscapeMC/Things-Mod-1.10.2

 

TeamMadness Mod Git: https://github.com/EscapeMC/TeamMadness-Mod-1.10.2

 

If I somehow help you, please click the "Thank You" button. If I am a total waste of time, please click the "Applaud" button.

Posted

Wait, so to get this straight you are making a set of armor? Or what exactly are you making?

 

I'm making a set of armour that isn't a set of items so you don't put anything in the armour slots in your inventory.

Posted

Well, I am not sure about the turning part, but the part about the upside-down-ness may be able to be fixed if in the texture itself, you may want to flip it 180°, and therefore solving that

I Love To Help People. Unless They Are The Kind Of People Who Just Doesn't Know Anything. Those People Need Some Serious Help. This Could Help But......

https://www.youtube.com/watch?v=6t0GlXWx_PY

 

ThingsMod Git: https://github.com/EscapeMC/Things-Mod-1.10.2

 

TeamMadness Mod Git: https://github.com/EscapeMC/TeamMadness-Mod-1.10.2

 

If I somehow help you, please click the "Thank You" button. If I am a total waste of time, please click the "Applaud" button.

Posted

Well, I am not sure about the turning part, but the part about the upside-down-ness may be able to be fixed if in the texture itself, you may want to flip it 180°, and therefore solving that

 

While that kinda would solve that, the legs are rendered above the body which suggests it is rendering the models upside down.

Posted

sounds like u need to do some kind of GL rotating, not rotating the texture

 

I tried doing that, the problem is getting it perfectly aligned with the player.

I have some really bad memories associated with aligning models with players...

I was rendering a .obj model as a sword and it was hard. I had to change a number than restart minecraft. Till I found the perfect match. It was a painstaking process that took a long time.

Then after I finished spending hours on trying to align it, I found out that in debugging mode, it will change it without you having to restart minecraft. So, just run it in debug mode and try looking for the perfect numbers.

 

 

 

I'm back from being gone for... I think its been about a year. I'm pretty sure nobody remembers me, but hello anybody who does!

Posted

sounds like u need to do some kind of GL rotating, not rotating the texture

 

I tried doing that, the problem is getting it perfectly aligned with the player.

I have some really bad memories associated with aligning models with players...

I was rendering a .obj model as a sword and I just to keep on trying with different numbers and then restart minecraft, till I found the perfect match. It was a painstaking process that took a long time.

Then after I finished spending hours on trying to align it, I found out that in debugging mode, it will change it without you having to restart minecraft. So, just run it in debug mode and try looking for the perfect numbers, till its aligned with the player.

 

But even if I do this it does not rotate with the player so it would be misaligned as soon as I move.

  • 3 years later...
Posted
On 1/31/2016 at 10:09 AM, Wehavecookies56 said:

Hello, I am trying to render a model over the player similar to armour but cannot align the position of the models with the player. I have been using ModelBiped but would much rather be able to use the armour model. I cannot figure out how to render it in the same position as the player while also rotating it with the player.

What I ultimately want to achieve is to render armour on the player with my textures while keeping the player rendered underneath.

So I have 2 questions.

How can I align the model with the player?

How can I render the armour model rather than player model?

I am using PlayerRenderEvent.Post to render it, here's the code.

 


        @SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Post event){
	Minecraft mc = Minecraft.getMinecraft();
	ModelBiped main = event.renderer.getMainModel();
	ModelBiped drive = new ModelBiped();

	float base = 0.0625f;

	GL11.glPushMatrix();

	mc.renderEngine.bindTexture(new ResourceLocation("kk:textures/armour/Valor_A.png"));

	//Body and arms
	ModelBiped.copyModelAngles(main.bipedBody, drive.bipedBody);
	ModelBiped.copyModelAngles(main.bipedLeftArm, drive.bipedLeftArm);
	ModelBiped.copyModelAngles(main.bipedRightArm, drive.bipedRightArm);

	drive.bipedBody.render(base);
	drive.bipedLeftArm.render(base);
	drive.bipedRightArm.render(base);

	//Legs
	mc.renderEngine.bindTexture(new ResourceLocation("kk:textures/armour/Valor_B.png"));

	ModelBiped.copyModelAngles(main.bipedLeftLeg, drive.bipedLeftLeg);
	ModelBiped.copyModelAngles(main.bipedRightLeg, drive.bipedRightLeg);

	drive.bipedLeftLeg.render(base);
	drive.bipedRightLeg.render(base);

	GL11.glPopMatrix();
}
 

 

 

This produces:

I3e1Y3f.png

 

It looks fine it's just upside down and doesn't rotate with the player. Although the arms and legs move when walking.

I'm clearly doing something wrong or have missed out something.

 

Any help is appreciated, thanks.

I just want to know 1 thing because I have been dying on trying to get a model to render on the player.

 

1. How are you rendering your model

Posted
2 hours ago, CyborgGamer21 said:

How are you rendering your model

He already showed you the code.

 

On 1/31/2016 at 11:09 PM, Wehavecookies56 said:

How can I align the model with the player?

1. Stop using GLXX. Use GlStateManager instead.

2. Get the player's horizontal rotation and apply the rotation to your model with GlStateManager#rotate. This shouldn't be that hard.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted

Sorry we don't support 1.8.9 or any version under 1.10 on this forum anymore due to their age. We simply don't know how to help you anymore. You can go to the Minecraft Forum where I think that they still still support older versions, or update to a modern version of Minecraft (the latest version or the one before it) to receive support on this forum.

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

  • Guest locked this topic
Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • 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() ); } }  
  • Topics

×
×
  • Create New...

Important Information

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