Skip to content

Commit fb18f69

Browse files
committed
Fix world border scale in 1.21.7->1.21.9
1 parent 56e1d32 commit fb18f69

File tree

7 files changed

+110
-0
lines changed

7 files changed

+110
-0
lines changed

api/src/main/java/com/viaversion/viaversion/api/data/entity/EntityTracker.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,20 @@ public interface EntityTracker {
185185
*/
186186
void setCurrentWorld(String currentWorld);
187187

188+
/**
189+
* Returns the id of the current dimension, or -1 if unset (i.e. before 1.20.5).
190+
*
191+
* @return id of the current dimension, or -1 if unset
192+
*/
193+
int currentDimensionId();
194+
195+
/**
196+
* Sets the id of the current dimension.
197+
*
198+
* @param currentDimensionId id of the current dimension
199+
*/
200+
void setCurrentDimensionId(int currentDimensionId);
201+
188202
int biomesSent();
189203

190204
void setBiomesSent(int biomesSent);

common/src/main/java/com/viaversion/viaversion/data/entity/EntityTrackerBase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class EntityTrackerBase implements EntityTracker, ClientEntityIdChangeLis
4141
private int currentWorldSectionHeight = -1;
4242
private int currentMinY;
4343
private String currentWorld;
44+
private int currentDimensionId = -1;
4445
private int biomesSent = -1;
4546
private Map<String, DimensionData> dimensions = Collections.emptyMap();
4647
private boolean instaBuild;
@@ -182,6 +183,16 @@ public void setCurrentWorld(final String currentWorld) {
182183
this.currentWorld = currentWorld;
183184
}
184185

186+
@Override
187+
public int currentDimensionId() {
188+
return currentDimensionId;
189+
}
190+
191+
@Override
192+
public void setCurrentDimensionId(final int currentDimensionId) {
193+
this.currentDimensionId = currentDimensionId;
194+
}
195+
185196
@Override
186197
public int biomesSent() {
187198
return biomesSent;

common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/Protocol1_21_7To1_21_9.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.rewriter.ComponentRewriter1_21_9;
5050
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.rewriter.EntityPacketRewriter1_21_9;
5151
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.rewriter.ParticleRewriter1_21_9;
52+
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.storage.DimensionScaleStorage;
5253
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.LastExplosionPowerStorage;
5354
import com.viaversion.viaversion.rewriter.AttributeRewriter;
5455
import com.viaversion.viaversion.rewriter.ParticleRewriter;
@@ -197,6 +198,7 @@ protected void onMappingDataLoaded() {
197198
public void init(final UserConnection connection) {
198199
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_9.PLAYER));
199200
addItemHasher(connection, new ItemHasherBase(this, connection));
201+
connection.put(new DimensionScaleStorage());
200202
}
201203

202204
@Override

common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/BlockItemPacketRewriter1_21_9.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.viaversion.viaversion.protocols.v1_21_7to1_21_9.rewriter;
1919

2020
import com.viaversion.viaversion.api.connection.UserConnection;
21+
import com.viaversion.viaversion.api.data.entity.EntityTracker;
2122
import com.viaversion.viaversion.api.minecraft.ResolvableProfile;
2223
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
2324
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
@@ -26,13 +27,16 @@
2627
import com.viaversion.viaversion.api.minecraft.item.data.Bee;
2728
import com.viaversion.viaversion.api.minecraft.item.data.BlockEntityData;
2829
import com.viaversion.viaversion.api.minecraft.item.data.EntityData;
30+
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
31+
import com.viaversion.viaversion.api.type.Types;
2932
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
3033
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
3134
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
3235
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6;
3336
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
3437
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.Protocol1_21_7To1_21_9;
3538
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9;
39+
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.storage.DimensionScaleStorage;
3640
import com.viaversion.viaversion.rewriter.BlockRewriter;
3741
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
3842
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
@@ -68,6 +72,9 @@ public void registerPackets() {
6872
recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_6.UPDATE_RECIPES);
6973
recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_6.RECIPE_BOOK_ADD);
7074
recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_6.PLACE_GHOST_RECIPE);
75+
76+
protocol.registerClientbound(ClientboundPackets1_21_6.INITIALIZE_BORDER, this::updateBorderCenter);
77+
protocol.registerClientbound(ClientboundPackets1_21_6.SET_BORDER_CENTER, this::updateBorderCenter);
7178
}
7279

7380
@Override
@@ -116,4 +123,19 @@ public static void downgradeData(final Item item, final StructuredDataContainer
116123
});
117124
container.replace(StructuredDataKey.PROFILE1_21_9, StructuredDataKey.PROFILE1_20_5, ResolvableProfile::profile);
118125
}
126+
127+
private void updateBorderCenter(final PacketWrapper wrapper) {
128+
double centerX = wrapper.read(Types.DOUBLE);
129+
double centerZ = wrapper.read(Types.DOUBLE);
130+
131+
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
132+
if (tracker.currentDimensionId() != -1) {
133+
final double scale = wrapper.user().get(DimensionScaleStorage.class).getScale(tracker.currentDimensionId());
134+
centerX /= scale;
135+
centerZ /= scale;
136+
}
137+
138+
wrapper.write(Types.DOUBLE, centerX);
139+
wrapper.write(Types.DOUBLE, centerZ);
140+
}
119141
}

common/src/main/java/com/viaversion/viaversion/protocols/v1_21_7to1_21_9/rewriter/EntityPacketRewriter1_21_9.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
package com.viaversion.viaversion.protocols.v1_21_7to1_21_9.rewriter;
1919

2020
import com.viaversion.nbt.tag.CompoundTag;
21+
import com.viaversion.viaversion.api.connection.UserConnection;
2122
import com.viaversion.viaversion.api.minecraft.BlockPosition;
2223
import com.viaversion.viaversion.api.minecraft.GlobalBlockPosition;
24+
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
2325
import com.viaversion.viaversion.api.minecraft.Vector3d;
2426
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
2527
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_9;
@@ -31,6 +33,7 @@
3133
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
3234
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6;
3335
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.Protocol1_21_7To1_21_9;
36+
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.storage.DimensionScaleStorage;
3437
import com.viaversion.viaversion.rewriter.EntityRewriter;
3538
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
3639
import com.viaversion.viaversion.rewriter.entitydata.EntityDataHandler;
@@ -103,6 +106,28 @@ protected void handleParticleData(final CompoundTag particleData) {
103106
}
104107
super.handleParticleData(particleData);
105108
}
109+
110+
@Override
111+
public void trackDimensionAndBiomes(final UserConnection connection, final String registryKey, final RegistryEntry[] entries) {
112+
super.trackDimensionAndBiomes(connection, registryKey, entries);
113+
if (!registryKey.equals("dimension_type")) {
114+
return;
115+
}
116+
117+
final DimensionScaleStorage dimensionScaleStorage = connection.get(DimensionScaleStorage.class);
118+
for (int i = 0; i < entries.length; i++) {
119+
final RegistryEntry entry = entries[i];
120+
final CompoundTag dimension = (CompoundTag) entry.tag();
121+
if (dimension == null) {
122+
continue;
123+
}
124+
125+
final double coordinateScale = dimension.getDouble("coordinate_scale", 1);
126+
if (coordinateScale != 1 && coordinateScale != 0) {
127+
dimensionScaleStorage.setScale(i, coordinateScale);
128+
}
129+
}
130+
}
106131
};
107132
registryDataRewriter.addHandler("dimension_type", (key, dimension) -> {
108133
if (Key.equals(key, "minecraft:the_end")) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
3+
* Copyright (C) 2016-2025 ViaVersion and contributors
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.viaversion.viaversion.protocols.v1_21_7to1_21_9.storage;
19+
20+
import com.viaversion.viaversion.api.connection.StorableObject;
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
public final class DimensionScaleStorage implements StorableObject {
25+
26+
private final Map<Integer, Double> dimensionScales = new HashMap<>(4);
27+
28+
public double getScale(final int dimensionId) {
29+
return dimensionScales.getOrDefault(dimensionId, 1D);
30+
}
31+
32+
public void setScale(final int dimensionId, final double scale) {
33+
dimensionScales.put(dimensionId, scale);
34+
}
35+
}

common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,7 @@ public void trackWorldDataByKey1_20_5(final UserConnection connection, final int
536536
dimensionData = tracker.dimensionData("overworld");
537537
Preconditions.checkNotNull(dimensionData, "Overworld data missing");
538538
}
539+
tracker.setCurrentDimensionId(dimensionId);
539540
tracker.setCurrentWorldSectionHeight(dimensionData.height() >> 4);
540541
tracker.setCurrentMinY(dimensionData.minY());
541542
trackWorld(connection, world);

0 commit comments

Comments
 (0)