proper teleportation velocity

This commit is contained in:
CreepyCre 2021-02-16 11:19:39 +01:00
parent 078e54908a
commit 1d7b7644d1
7 changed files with 25 additions and 31 deletions

View file

@ -122,7 +122,7 @@ public class DetachedRiftBlockEntity extends RiftBlockEntity {
@Override @Override
public boolean receiveEntity(Entity entity, Vec3d relativePos, EulerAngle relativeAngle, Vec3d velocity) { public boolean receiveEntity(Entity entity, Vec3d relativePos, EulerAngle relativeAngle, Vec3d velocity) {
if (this.world instanceof ServerWorld) if (this.world instanceof ServerWorld)
TeleportUtil.teleport(entity, this.world, this.pos, relativeAngle); TeleportUtil.teleport(entity, this.world, this.pos, relativeAngle, velocity);
return true; return true;
} }

View file

@ -56,8 +56,6 @@ public class EntranceRiftBlockEntity extends RiftBlockEntity {
if (block instanceof CoordinateTransformerBlock) { if (block instanceof CoordinateTransformerBlock) {
CoordinateTransformerBlock transformer = (CoordinateTransformerBlock) block; CoordinateTransformerBlock transformer = (CoordinateTransformerBlock) block;
System.out.println("{yaw: " + relativeAngle.getYaw() + "; pitch: " + relativeAngle.getPitch() + "; roll: " + relativeAngle.getRoll() + "}");
if (transformer.isExitFlipped()) { if (transformer.isExitFlipped()) {
TransformationMatrix3d flipper = TransformationMatrix3d.builder().rotateY(Math.PI).build(); TransformationMatrix3d flipper = TransformationMatrix3d.builder().rotateY(Math.PI).build();
@ -66,8 +64,6 @@ public class EntranceRiftBlockEntity extends RiftBlockEntity {
relativeVelocity = flipper.transform(relativeVelocity); relativeVelocity = flipper.transform(relativeVelocity);
} }
System.out.println("{yaw: " + relativeAngle.getYaw() + "; pitch: " + relativeAngle.getPitch() + "; roll: " + relativeAngle.getRoll() + "}");
relativePos = relativePos.add(new Vec3d(0, 0, 1).multiply(0.6)); // TODO: skip this for Immersive Portals relativePos = relativePos.add(new Vec3d(0, 0, 1).multiply(0.6)); // TODO: skip this for Immersive Portals
TransformationMatrix3d.TransformationMatrix3dBuilder transformationBuilder = transformer.transformationBuilder(state, this.getPos()); TransformationMatrix3d.TransformationMatrix3dBuilder transformationBuilder = transformer.transformationBuilder(state, this.getPos());
@ -77,8 +73,7 @@ public class EntranceRiftBlockEntity extends RiftBlockEntity {
relativeVelocity = transformer.rotateOut(rotatorBuilder, relativeVelocity); relativeVelocity = transformer.rotateOut(rotatorBuilder, relativeVelocity);
} }
TeleportUtil.teleport(entity, this.world, targetPos, relativeAngle); entity = TeleportUtil.teleport(entity, this.world, targetPos, relativeAngle, relativeVelocity);
entity.setVelocity(relativeVelocity);
if (entity instanceof ServerPlayerEntity) { if (entity instanceof ServerPlayerEntity) {
ServerPlayerEntity player = (ServerPlayerEntity) entity; ServerPlayerEntity player = (ServerPlayerEntity) entity;
player.networkHandler.sendPacket(new EntityVelocityUpdateS2CPacket(player)); player.networkHandler.sendPacket(new EntityVelocityUpdateS2CPacket(player));

View file

@ -34,7 +34,7 @@ public class DimTeleportCommand {
} }
private static int teleport(Entity entity, ServerWorld dimension, Vec3d pos) { private static int teleport(Entity entity, ServerWorld dimension, Vec3d pos) {
TeleportUtil.teleport(entity, dimension, pos, MathUtil.entityEulerAngle(entity)); TeleportUtil.teleport(entity, dimension, pos, MathUtil.entityEulerAngle(entity), entity.getVelocity());
return Command.SINGLE_SUCCESS; return Command.SINGLE_SUCCESS;
} }
} }

View file

@ -48,7 +48,7 @@ public class EscapeTarget extends VirtualTarget implements EntityTarget { // TOD
Location destLoc = DimensionalRegistry.getRiftRegistry().getOverworldRift(uuid); Location destLoc = DimensionalRegistry.getRiftRegistry().getOverworldRift(uuid);
if (destLoc != null && destLoc.getBlockEntity() instanceof RiftBlockEntity || this.canEscapeLimbo) { if (destLoc != null && destLoc.getBlockEntity() instanceof RiftBlockEntity || this.canEscapeLimbo) {
Location location = VirtualLocation.fromLocation(new Location((ServerWorld) entity.world, entity.getBlockPos())).projectToWorld(false); Location location = VirtualLocation.fromLocation(new Location((ServerWorld) entity.world, entity.getBlockPos())).projectToWorld(false);
TeleportUtil.teleport(entity, location.getWorld(), location.getBlockPos(), relativeAngle); TeleportUtil.teleport(entity, location.getWorld(), location.getBlockPos(), relativeAngle, relativeVelocity);
} else { } else {
if (destLoc == null) { if (destLoc == null) {
chat(entity, new TranslatableText("rifts.destinations.escape.did_not_use_rift")); chat(entity, new TranslatableText("rifts.destinations.escape.did_not_use_rift"));
@ -56,7 +56,7 @@ public class EscapeTarget extends VirtualTarget implements EntityTarget { // TOD
chat(entity, new TranslatableText("rifts.destinations.escape.rift_has_closed")); chat(entity, new TranslatableText("rifts.destinations.escape.rift_has_closed"));
} }
if (ModDimensions.LIMBO_DIMENSION != null) { if (ModDimensions.LIMBO_DIMENSION != null) {
TeleportUtil.teleport(entity, ModDimensions.LIMBO_DIMENSION, new BlockPos(this.location.getX(), this.location.getY(), this.location.getZ()), relativeAngle); TeleportUtil.teleport(entity, ModDimensions.LIMBO_DIMENSION, new BlockPos(this.location.getX(), this.location.getY(), this.location.getZ()), relativeAngle, relativeVelocity);
} }
} }
return true; return true;

View file

@ -17,7 +17,7 @@ public class LimboTarget extends VirtualTarget implements EntityTarget {
@Override @Override
public boolean receiveEntity(Entity entity, Vec3d relativePos, EulerAngle relativeAngle, Vec3d relativeVelocity) { public boolean receiveEntity(Entity entity, Vec3d relativePos, EulerAngle relativeAngle, Vec3d relativeVelocity) {
TeleportUtil.teleport(entity, ModDimensions.LIMBO_DIMENSION, entity.getPos(), relativeAngle); TeleportUtil.teleport(entity, ModDimensions.LIMBO_DIMENSION, entity.getPos(), relativeAngle, relativeVelocity);
return true; return true;
} }

View file

@ -93,7 +93,7 @@ public abstract class VirtualTarget implements Target {
VirtualTargetType<PrivatePocketExitTarget> PRIVATE_POCKET_EXIT = register("dimdoors:private_pocket_exit", a -> new PrivatePocketExitTarget(), a -> new CompoundTag(), PrivatePocketExitTarget.COLOR); VirtualTargetType<PrivatePocketExitTarget> PRIVATE_POCKET_EXIT = register("dimdoors:private_pocket_exit", a -> new PrivatePocketExitTarget(), a -> new CompoundTag(), PrivatePocketExitTarget.COLOR);
VirtualTargetType<RelativeReference> RELATIVE = register("dimdoors:relative", RelativeReference::fromTag, RelativeReference::toTag, VirtualTarget.COLOR); VirtualTargetType<RelativeReference> RELATIVE = register("dimdoors:relative", RelativeReference::fromTag, RelativeReference::toTag, VirtualTarget.COLOR);
VirtualTargetType<IdMarker> ID_MARKER = register("dimdoors:id_marker", IdMarker::fromTag, IdMarker::toTag, VirtualTarget.COLOR); VirtualTargetType<IdMarker> ID_MARKER = register("dimdoors:id_marker", IdMarker::fromTag, IdMarker::toTag, VirtualTarget.COLOR);
VirtualTargetType<UnstableTarget> UNSTABLE = register("dimdoors:unstable", tag -> new UnstableTarget(), t -> new CompoundTag(), VirtualTarget.COLOR); //VirtualTargetType<UnstableTarget> UNSTABLE = register("dimdoors:unstable", tag -> new UnstableTarget(), t -> new CompoundTag(), VirtualTarget.COLOR);
VirtualTargetType<NoneTarget> NONE = register("dimdoors:none", tag -> NoneTarget.INSTANCE, i -> new CompoundTag(), COLOR); VirtualTargetType<NoneTarget> NONE = register("dimdoors:none", tag -> NoneTarget.INSTANCE, i -> new CompoundTag(), COLOR);
T fromTag(CompoundTag tag); T fromTag(CompoundTag tag);

View file

@ -18,49 +18,48 @@ import org.dimdev.dimdoors.util.math.MathUtil;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public final class TeleportUtil { public final class TeleportUtil {
public static void teleport(Entity entity, World world, BlockPos pos, float yaw) { public static <E extends Entity> E teleport(E entity, World world, BlockPos pos, float yaw) {
if (world.isClient) { if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld"); throw new UnsupportedOperationException("Only supported on ServerWorld");
} }
teleport(entity, world, Vec3d.ofBottomCenter(pos), yaw); return teleport(entity, world, Vec3d.ofBottomCenter(pos), yaw);
} }
public static void teleport(Entity entity, World world, Vec3d pos, float yaw) { public static <E extends Entity> E teleport(E entity, World world, Vec3d pos, float yaw) {
if (world.isClient) { if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld"); throw new UnsupportedOperationException("Only supported on ServerWorld");
} }
FabricDimensions.teleport(entity, (ServerWorld) world, new TeleportTarget(pos, entity.getVelocity(), yaw, entity.getPitch(1.0F))); return FabricDimensions.teleport(entity, (ServerWorld) world, new TeleportTarget(pos, entity.getVelocity(), yaw, entity.getPitch(1.0F)));
} }
public static void teleport(Entity entity, World world, Vec3d pos, EulerAngle angle) { public static <E extends Entity> E teleport(E entity, World world, Vec3d pos, EulerAngle angle, Vec3d velocity) {
if (world.isClient) { if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld"); throw new UnsupportedOperationException("Only supported on ServerWorld");
} }
FabricDimensions.teleport(entity, (ServerWorld) world, new TeleportTarget(pos, entity.getVelocity(), angle.getYaw(), angle.getPitch())); return FabricDimensions.teleport(entity, (ServerWorld) world, new TeleportTarget(pos, velocity, angle.getYaw(), angle.getPitch()));
} }
public static void teleport(Entity entity, World world, BlockPos pos, EulerAngle angle) { public static <E extends Entity> E teleport(E entity, World world, BlockPos pos, EulerAngle angle, Vec3d velocity) {
if (world.isClient) { if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld"); throw new UnsupportedOperationException("Only supported on ServerWorld");
} }
teleport(entity, world, Vec3d.ofBottomCenter(pos), angle); return teleport(entity, world, Vec3d.ofBottomCenter(pos), angle, velocity);
} }
public static void teleport(ServerPlayerEntity player, Location location) { public static ServerPlayerEntity teleport(ServerPlayerEntity player, Location location) {
teleport(player, DimensionalDoorsInitializer.getWorld(location.world), location.pos, 0); return teleport(player, DimensionalDoorsInitializer.getWorld(location.world), location.pos, 0);
} }
public static void teleport(ServerPlayerEntity player, RotatedLocation location) { public static ServerPlayerEntity teleport(ServerPlayerEntity player, RotatedLocation location) {
teleport(player, DimensionalDoorsInitializer.getWorld(location.world), location.pos, (int) location.yaw); return teleport(player, DimensionalDoorsInitializer.getWorld(location.world), location.pos, (int) location.yaw);
} }
public static <E extends Entity> E teleportRandom(E entity, World world, double y) {
public static void teleportRandom(Entity entity, World world, double y) {
double scale = ThreadLocalRandom.current().nextGaussian() * ThreadLocalRandom.current().nextInt(90); double scale = ThreadLocalRandom.current().nextGaussian() * ThreadLocalRandom.current().nextInt(90);
teleport( return teleport(
entity, entity,
world, world,
entity.getPos() entity.getPos()
@ -71,9 +70,9 @@ public final class TeleportUtil {
); );
} }
public static void teleportUntargeted(Entity entity, World world) { public static <E extends Entity> E teleportUntargeted(E entity, World world) {
double actualScale = entity.world.getDimension().getCoordinateScale() / world.getDimension().getCoordinateScale(); double actualScale = entity.world.getDimension().getCoordinateScale() / world.getDimension().getCoordinateScale();
teleport( return teleport(
entity, entity,
world, world,
entity.getPos().multiply(actualScale, 1, actualScale), entity.getPos().multiply(actualScale, 1, actualScale),
@ -81,9 +80,9 @@ public final class TeleportUtil {
); );
} }
public static void teleportUntargeted(Entity entity, World world, double y) { public static <E extends Entity> E teleportUntargeted(E entity, World world, double y) {
double actualScale = entity.world.getDimension().getCoordinateScale() / world.getDimension().getCoordinateScale(); double actualScale = entity.world.getDimension().getCoordinateScale() / world.getDimension().getCoordinateScale();
teleport( return teleport(
entity, entity,
world, world,
entity.getPos() entity.getPos()