Jump to content

Recommended Posts

Posted

I'm trying to move forward from 1.8 (Forge build 1450) to 1.8.9 (recommended Forge build 1722). Updating my mods was straightforward (fix a few srg names with new deob names). My trouble started when I used a 1722 client to open a test world created by build 1450.

 

While vanilla block types all appeared to be where I remembered them, my mods' block types had all been scrambled. Walls had been replaced by sensors, the sensors had been replaced by solid blocks from another mod, a custom pressure plate had turned into a wall, and at least one block type had simply vanished.

 

Comparing the logs between my last load of 1450 versus loading 1722, the block IDs all appear to be unchanged, at least at the moment of registration (and my mods don't use IDs anyway except to print those registration messages). Except for an unknown biome being treated as ocean, there are no errors to show, and no hints at substitutions.

 

I tried running in Eclipse's debugger (with one mod and its test world), and the behavior was different: The mods' blocks retained their identities, but each was displaced to a new blockpos, each block type moving a different distance and direction. Ironically, the one tile entity instantiated at its correct coords, which meant that its corresponding block no longer functioned.

 

I'm unsure at what level the problem arises. Is it Minecraft 1.8.9? Forge build 1722? Or, is there some secret sauce that mods use to stabilize their blocks? Should I cap my 1.8 worlds at some other Forge build for 1.8 or 1.8.8? Is there some way to log more information?

 

If the "recommended" build (1722) is not a good one to use, then which build would be safest to try?

 

EDIT:

 

I used old build 1450 to open the "scrambled" world saved by build 1722, and my blocks were unscrambled! Some metadata has changed (like where a wall had been interpreted as a moon-phase sensor, when it became a wall again, its texture matched what the phase of the moon had been instead of what the original wall had been).  All that was missing was tile entities that had deleted themselves during the scramble because the blocks at their positions had invalidated them.

 

As interesting as all that is, I am still wondering whether I should freeze my world at 1450, try to upgrade to the last 1.8, upgrade to the last 1.8.8, or try a different build for 1.8.9. If anyone has any experience with upgrading saved worlds, you could save me a lot of work by sharing what you've learned.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

Well, I've tried a few ways to ask about how to safely transition a modded world to 1.8.9 from an earlier version of 1.8. The fact that nobody has chimed in with any experience doing so is in itself information: Apparently I am trying to do something that nobody else in their right mind would try. It is finally dawning on me that a mod may be ported from version to version, but new worlds should be created at each level. I guess modded worlds with added block types just don't travel well.

 

Still, I am curious. If anybody has ever attempted to open a modded world in 1.8.9 that was created in 1.8, please tell us how it went. If you had block types being scrambled in translation, did you find any clues to how and where the scrambling took place?

 

For me, 1.8.9 was just a stepping stone toward 1.9, so I will probably not bother creating a new server world to run my updated mods. I am instead stepping back to 1.8 to find the best Forge build to use as a "final" version on which to run my client and 1.8 server.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

The same thing has happened to me. Opened an old world with updated mods that create new blocks and the blocks are all scrambled. I suspect that the updated mod with blocks is using different block IDs or something. Occasionally Minecraft adds blocks to the game and that may have something to do with the block IDs changing. I have a mod that has a metal ladder and that was consistently replaced with an iron trapdoor. Another mod block was replaced with slime blocks.

The fact that you can open the old world with the correct version of forge and everything reverts makes me think the block ID is the issue. I don't really know though.

Posted

I saw the slime blocks when I used 1.8 to open a 1.7.10 world. That was indeed a case of vanilla mc claiming IDs that Forge had used for blocks registered by my mods.

 

The latest scrambling is something different. Having learned my lesson (some lesson) the last time around, I put an output statement in my registration helper method so every block and item in every mod reports its ID. As I reported in my OP, all of my registration IDs were the same in 1.8.9 (build 1722) as in 1.8 (build 1450). However, identities got rotated all around.

 

And they're swapped predictably, which means something systematic is happening, but circular: Walls became sensors or the blower, sensors became either walls or nethergem blocks, and the invention became the iron gate from my walls mod. It's not like each block is shifting down in one direction. It's a crazy remapping that I don't understand and don't want. Why didn't the registration IDs stick? How do I make it stop?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

  • 1 month later...
Posted

I got the same problem. Most (but not all) of my blocks are scrambled. I updated from forge-1.8-11.14.0.1281-1.8-src to forge-1.8.9-11.15.1.1722-mdk (Mod development) and Forge 11.14.3.1450 to Forge 11.15.1.1722 (Forge version used while playing)

It seems it scrambles only because I've got more than one mod running. If I create a new world in 1.8 with only one of my mods the blocks seem perfectly ok in 1.8.9. This gives me a feeling of scrambled mod-IDs?

 

Is this the same problem as this one? http://www.minecraftforge.net/forum/index.php/topic,36733.0.html

Because it was asked on the other thred here are my mods and worlds, both 1.8 and 1.8.9:

1.8 and 1.8.9 Mods and World (I also use Optifine but that shouldn't be a problem, should it?)

Posted

If the mod IDs are being scrambled, then it's happening sometime after registration (or it's happening to a different set of IDs than what I've been looking at).

 

My reg calls all log their resulting IDs so I can check for that very phenomenon, and my 1.8.9 IDs matched my 1.8 IDs.

 

I've decided that (for now) modded worlds with custom blocks are version-locked. I'll just create a new one from time to time.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

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.