Skip to content

Commit c2feee6

Browse files
committed
Replace TeleportCommand Overwrite with Redirect. Fix #4262
I don't think a WrapOperation is suited here because we alter so much the logic. Overall our teleport and movement events are a mess in this version. This has been cleaned up in api-14, but I'm too lazy to backport.
1 parent 0a3617f commit c2feee6

File tree

1 file changed

+12
-35
lines changed

1 file changed

+12
-35
lines changed

src/mixins/java/org/spongepowered/common/mixin/core/server/commands/TeleportCommandMixin.java

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,15 @@
2424
*/
2525
package org.spongepowered.common.mixin.core.server.commands;
2626

27-
import net.minecraft.commands.CommandSourceStack;
2827
import net.minecraft.core.BlockPos;
2928
import net.minecraft.server.commands.TeleportCommand;
3029
import net.minecraft.server.level.ServerLevel;
3130
import net.minecraft.server.level.ServerPlayer;
3231
import net.minecraft.server.level.TicketType;
3332
import net.minecraft.util.Mth;
3433
import net.minecraft.world.entity.Entity;
35-
import net.minecraft.world.entity.LivingEntity;
36-
import net.minecraft.world.entity.PathfinderMob;
3734
import net.minecraft.world.entity.RelativeMovement;
3835
import net.minecraft.world.level.ChunkPos;
39-
import org.checkerframework.checker.nullness.qual.Nullable;
4036
import org.spongepowered.api.Sponge;
4137
import org.spongepowered.api.event.CauseStackManager;
4238
import org.spongepowered.api.event.EventContextKeys;
@@ -47,7 +43,8 @@
4743
import org.spongepowered.api.event.entity.RotateEntityEvent;
4844
import org.spongepowered.api.world.server.ServerWorld;
4945
import org.spongepowered.asm.mixin.Mixin;
50-
import org.spongepowered.asm.mixin.Overwrite;
46+
import org.spongepowered.asm.mixin.injection.At;
47+
import org.spongepowered.asm.mixin.injection.Redirect;
5148
import org.spongepowered.common.SpongeCommon;
5249
import org.spongepowered.common.event.ShouldFire;
5350
import org.spongepowered.common.event.tracking.PhaseTracker;
@@ -60,26 +57,17 @@
6057
@Mixin(TeleportCommand.class)
6158
public abstract class TeleportCommandMixin {
6259

63-
/**
64-
* @author Zidane
65-
* @reason Have the teleport command respect our events
66-
*/
67-
@Overwrite
68-
private static void performTeleport(CommandSourceStack source, Entity entityIn, ServerLevel worldIn, double x, double y, double z,
69-
Set<RelativeMovement> relativeList, float yaw, float pitch, TeleportCommand.@Nullable LookAt facing) {
70-
60+
@Redirect(method = "performTeleport", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDLjava/util/Set;FF)Z"))
61+
private static boolean impl$createCauseFrameForPerformTeleport(
62+
final Entity entityIn, final ServerLevel worldIn, final double x, final double y,
63+
final double z, final Set<RelativeMovement> relativeList, final float yaw, final float pitch
64+
) {
7165
double actualX = x;
7266
double actualY = y;
7367
double actualZ = z;
7468
double actualYaw = yaw;
7569
double actualPitch = pitch;
7670

77-
if (!(entityIn instanceof ServerPlayer)) {
78-
actualYaw = Mth.wrapDegrees(yaw);
79-
actualPitch = Mth.wrapDegrees(pitch);
80-
actualPitch = Mth.clamp(actualPitch, -90.0F, 90.0F);
81-
}
82-
8371
if (worldIn == entityIn.level()) {
8472
try (final CauseStackManager.StackFrame frame = PhaseTracker.getInstance().pushCauseFrame()) {
8573
frame.addContext(EventContextKeys.MOVEMENT_TYPE, MovementTypes.COMMAND);
@@ -92,7 +80,7 @@ private static void performTeleport(CommandSourceStack source, Entity entityIn,
9280
new Vector3d(x, y, z), new Vector3d(x, y, z));
9381

9482
if (SpongeCommon.post(posEvent)) {
95-
return;
83+
return false;
9684
}
9785

9886
actualX = posEvent.destinationPosition().x();
@@ -145,7 +133,7 @@ private static void performTeleport(CommandSourceStack source, Entity entityIn,
145133
final ChangeEntityWorldEvent.Pre preEvent = PlatformHooks.INSTANCE.getEventHooks().callChangeEntityWorldEventPre(entityIn,
146134
worldIn);
147135
if (SpongeCommon.post(preEvent)) {
148-
return;
136+
return false;
149137
}
150138

151139
final ChangeEntityWorldEvent.Reposition posEvent =
@@ -156,13 +144,13 @@ private static void performTeleport(CommandSourceStack source, Entity entityIn,
156144
new Vector3d(x, y, z), preEvent.destinationWorld());
157145

158146
if (SpongeCommon.post(posEvent)) {
159-
return;
147+
return false;
160148
}
161149

162150
entityIn.unRide();
163151
final Entity result = entityIn.getType().create(worldIn);
164152
if (result == null) {
165-
return;
153+
return false;
166154
}
167155

168156
if (ShouldFire.ROTATE_ENTITY_EVENT) {
@@ -198,17 +186,6 @@ private static void performTeleport(CommandSourceStack source, Entity entityIn,
198186
}
199187
}
200188

201-
if (facing != null) {
202-
facing.perform(source, entityIn);
203-
}
204-
205-
if (!(entityIn instanceof LivingEntity) || !((LivingEntity)entityIn).isFallFlying()) {
206-
entityIn.setDeltaMovement(entityIn.getDeltaMovement().multiply(1.0D, 0.0D, 1.0D));
207-
entityIn.setOnGround(true);
208-
}
209-
210-
if (entityIn instanceof PathfinderMob) {
211-
((PathfinderMob)entityIn).getNavigation().stop();
212-
}
189+
return true;
213190
}
214191
}

0 commit comments

Comments
 (0)