Update Handcrafted v4.0.9

This commit is contained in:
Darto KLoning
2026-10-03 10:02:46 +07:00
parent 5ce6ef7b21
commit 98e9869daa
6 changed files with 50 additions and 24 deletions
@@ -19,11 +19,15 @@ public interface SittableBlock {
if (!Seat.SITTING_POSITIONS.get(level.dimension()).contains(pos)) {
Seat entity = Seat.of(level, pos, dir);
if (level.addFreshEntity(entity)) {
if (player.startRiding(entity)) {
Seat.SITTING_POSITIONS.put(level.dimension(), pos.immutable());
return true;
}
entity.removeSeat();
// Do not mount in the same server tick in which the invisible
// Seat is spawned. In 26.2 the passenger packet can otherwise
// reach the client before the entity-spawn packet, producing
// "Received passengers for unknown entity" and an immediate
// client/server mount desync. Queue the rider and let Seat.tick()
// mount it after the entity has entered normal tracking.
Seat.SITTING_POSITIONS.put(level.dimension(), pos.immutable());
entity.queueRider(player);
return true;
} else {
entity.removeSeat();
}
@@ -8,12 +8,8 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerEntity;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.util.Mth;
@@ -35,6 +31,8 @@ public class Seat extends Entity {
private AABB shape;
private boolean remove;
private boolean canRotate;
private Entity pendingRider;
private int mountDelayTicks;
public Seat(EntityType<? extends Entity> entityType, Level level) {
super(entityType, level);
@@ -66,16 +64,9 @@ public class Seat extends Entity {
return new AABB(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ);
}
@Override
public Packet<ClientGamePacketListener> getAddEntityPacket(ServerEntity serverEntity) {
return new ClientboundAddEntityPacket(this, serverEntity, canRotate ? 1 : 0);
}
@Override
public void recreateFromPacket(ClientboundAddEntityPacket packet) {
super.recreateFromPacket(packet);
this.canRotate = packet.getData() == 1;
}
// Use Minecraft's native entity spawn packet on 26.2.
// The old custom ClientboundAddEntityPacket path from 1.21.x can race the
// passenger packet, leaving the client with an unknown vehicle entity.
@Override
public boolean hurtServer(ServerLevel level, DamageSource source, float damage) {
@@ -122,11 +113,32 @@ public class Seat extends Entity {
return super.getDismountLocationForPassenger(passenger);
}
public void queueRider(Entity rider) {
this.pendingRider = rider;
// One complete entity tick is enough for ServerEntity tracking to send
// the add-entity packet before we generate a passengers packet.
this.mountDelayTicks = 1;
}
@Override
public void tick() {
super.tick();
if (!level().isClientSide() && (!(this.level().getBlockState(this.blockPosition()).getBlock() instanceof SittableBlock) || remove)) {
removeSeat();
if (!level().isClientSide()) {
if (!(this.level().getBlockState(this.blockPosition()).getBlock() instanceof SittableBlock) || remove) {
removeSeat();
return;
}
if (pendingRider != null) {
if (mountDelayTicks-- <= 0) {
Entity rider = pendingRider;
pendingRider = null;
if (!rider.isRemoved() && rider.level() == this.level() && rider.startRiding(this)) {
return;
}
removeSeat();
}
}
}
}