Skip to content

Commit 8a1cd60

Browse files
me4502dordsor21
authored andcommitted
Fix block-aligned entity positional issues on 1.21.5 after copy/paste (#2770)
1 parent 4141988 commit 8a1cd60

1 file changed

Lines changed: 30 additions & 9 deletions

File tree

worldedit-core/src/main/java/com/sk89q/worldedit/function/entity/ExtentEntityCopy.java

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@
2020
package com.sk89q.worldedit.function.entity;
2121

2222
import com.fastasyncworldedit.core.util.TaskManager;
23+
import com.sk89q.worldedit.WorldEdit;
2324
import com.sk89q.worldedit.WorldEditException;
2425
import com.sk89q.worldedit.entity.BaseEntity;
2526
import com.sk89q.worldedit.entity.Entity;
27+
import com.sk89q.worldedit.extension.platform.Capability;
2628
import com.sk89q.worldedit.extent.Extent;
2729
import com.sk89q.worldedit.function.EntityFunction;
30+
import com.sk89q.worldedit.internal.Constants;
2831
import com.sk89q.worldedit.internal.helper.MCDirections;
2932
import com.sk89q.worldedit.math.BlockVector3;
3033
import com.sk89q.worldedit.math.Vector3;
@@ -38,6 +41,7 @@
3841
import org.enginehub.linbus.tree.LinFloatTag;
3942
import org.enginehub.linbus.tree.LinIntArrayTag;
4043
import org.enginehub.linbus.tree.LinListTag;
44+
import org.enginehub.linbus.tree.LinIntArrayTag;
4145
import org.enginehub.linbus.tree.LinNumberTag;
4246
import org.enginehub.linbus.tree.LinTag;
4347
import org.enginehub.linbus.tree.LinTagType;
@@ -240,18 +244,35 @@ private BaseEntity transformNbtData(BaseEntity state) {
240244
LinTag<?> rotation = tag.value().get("Rotation");
241245
//FAWE end
242246

243-
if (hasTilePosition) {
244-
Vector3 tilePosition = Vector3.at(
245-
((LinNumberTag<?>) tag.value().get("TileX")).value().intValue(),
246-
((LinNumberTag<?>) tag.value().get("TileY")).value().intValue(), ((LinNumberTag<?>) tag.value().get(
247-
"TileZ")).value().intValue()
247+
Vector3 tilePosition = null;
248+
249+
if (tag.value().get("block_pos") instanceof LinIntArrayTag blockPos) {
250+
tilePosition = Vector3.at(
251+
blockPos.value()[0], blockPos.value()[1], blockPos.value()[2]
252+
);
253+
}
254+
255+
if (tag.value().get("TileX") instanceof LinNumberTag<?> tagX
256+
&& tag.value().get("TileY") instanceof LinNumberTag<?> tagY
257+
&& tag.value().get("TileZ") instanceof LinNumberTag<?> tagZ) {
258+
tilePosition = Vector3.at(
259+
tagX.value().intValue(), tagY.value().intValue(), tagZ.value().intValue()
248260
);
261+
}
262+
263+
if (tilePosition != null) {
249264
BlockVector3 newTilePosition = transform.apply(tilePosition.subtract(from)).add(to).toBlockPoint();
250265

251-
LinCompoundTag.Builder builder = tag.toBuilder()
252-
.putInt("TileX", newTilePosition.x())
253-
.putInt("TileY", newTilePosition.y())
254-
.putInt("TileZ", newTilePosition.z());
266+
LinCompoundTag.Builder builder = tag.toBuilder();
267+
268+
if (WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion() < Constants.DATA_VERSION_MC_1_21_5) {
269+
// TODO remove when we drop support for 1.21.4
270+
builder.putInt("TileX", newTilePosition.x())
271+
.putInt("TileY", newTilePosition.y())
272+
.putInt("TileZ", newTilePosition.z());
273+
} else {
274+
builder.putIntArray("block_pos", new int[]{newTilePosition.x(), newTilePosition.y(), newTilePosition.z()});
275+
}
255276

256277
if (tryGetFacingData(tag) instanceof FacingTagData(String facingKey, LinNumberTag<?> tagFacing)) {
257278
boolean isPainting = state.getType() == EntityTypes.PAINTING; // Paintings have different facing values

0 commit comments

Comments
 (0)