Hacky entity teleportation utilities

C=hanges to be committed:
	modified:   src/main/java/org/dimdev/dimdoors/item/RiftSignatureItem.java
	modified:   src/main/java/org/dimdev/dimdoors/item/StabilizedRiftSignatureItem.java
	new file:   src/main/java/org/dimdev/dimdoors/mixin/EntityMixin.java
	modified:   src/main/java/org/dimdev/dimdoors/pockets/PocketGenerator.java
	modified:   src/main/java/org/dimdev/dimdoors/pockets/PocketTemplate.java
	modified:   src/main/java/org/dimdev/dimdoors/pockets/PocketTemplateV2.java
	modified:   src/main/java/org/dimdev/dimdoors/rift/targets/RandomTarget.java
	new file:   src/main/java/org/dimdev/dimdoors/util/EntityExtensions.java
	modified:   src/main/java/org/dimdev/dimdoors/util/EntityUtils.java
	modified:   src/main/java/org/dimdev/dimdoors/util/TeleportUtil.java
	deleted:    src/main/java/org/dimdev/dimdoors/util/WorldUtil.java
	modified:   src/main/java/org/dimdev/dimdoors/world/pocket/PocketRegistry.java
	modified:   src/main/java/org/dimdev/dimdoors/world/pocket/PrivatePocketData.java
	modified:   src/main/resources/dimdoors.mixins.json
This commit is contained in:
SD 2020-10-02 21:18:52 +05:30
parent 661a6b7bf8
commit 869678dec9
No known key found for this signature in database
GPG key ID: E36B57EE08544BC5
14 changed files with 105 additions and 46 deletions

View file

@ -2,13 +2,13 @@ package org.dimdev.dimdoors.item;
import java.util.List;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
import org.dimdev.dimdoors.rift.targets.RiftReference;
import org.dimdev.dimdoors.sound.ModSoundEvents;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.RotatedLocation;
import org.dimdev.dimdoors.util.WorldUtil;
import org.jetbrains.annotations.NotNull;
import net.minecraft.client.item.TooltipContext;
@ -80,7 +80,7 @@ public class RiftSignatureItem extends Item {
clearSource(stack); // TODO: But is this fair? It's a rather hidden way of unbinding your signature!
return ActionResult.FAIL;
}
World sourceWorld = WorldUtil.getWorld(target.world);
World sourceWorld = DimensionalDoorsInitializer.getWorld(target.world);
sourceWorld.setBlockState(target.getBlockPos(), ModBlocks.DETACHED_RIFT.getDefaultState());
DetachedRiftBlockEntity rift1 = (DetachedRiftBlockEntity) target.getBlockEntity();
rift1.setDestination(RiftReference.tryMakeRelative(target, new Location((ServerWorld) world, pos)));

View file

@ -2,13 +2,13 @@ package org.dimdev.dimdoors.item;
import java.util.List;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
import org.dimdev.dimdoors.rift.targets.RiftReference;
import org.dimdev.dimdoors.sound.ModSoundEvents;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.RotatedLocation;
import org.dimdev.dimdoors.util.WorldUtil;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.player.PlayerEntity;
@ -75,7 +75,7 @@ public class StabilizedRiftSignatureItem extends Item { // TODO: common supercla
// Don't clear source, stabilized signatures always stay bound
return ActionResult.FAIL;
}
World targetWorld = WorldUtil.getWorld(target.world);
World targetWorld = DimensionalDoorsInitializer.getWorld(target.world);
targetWorld.setBlockState(target.getBlockPos(), ModBlocks.DETACHED_RIFT.getDefaultState());
DetachedRiftBlockEntity rift1 = (DetachedRiftBlockEntity) target.getBlockEntity();
rift1.register();

View file

@ -0,0 +1,54 @@
package org.dimdev.dimdoors.mixin;
import java.util.Objects;
import org.dimdev.dimdoors.util.EntityExtensions;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.entity.Entity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.TeleportTarget;
import net.minecraft.world.World;
@Mixin(Entity.class)
public class EntityMixin implements EntityExtensions {
@Shadow public World world;
@Unique
private boolean dimdoors_readyToTeleport = false;
private TeleportTarget dimdoors_teleportTarget = null;
@Inject(at = @At("HEAD"), cancellable = true, method = "getTeleportTarget")
public void interceptTeleportTarget(ServerWorld destination, CallbackInfoReturnable<TeleportTarget> cir) {
if (destination.getRegistryKey().getValue().getNamespace().equals("dimdoors")) {
if (this.dimdoors_isReadyToTeleport()) {
cir.setReturnValue(Objects.requireNonNull(this.dimdoors_teleportTarget));
}
}
}
@Inject(at = @At("TAIL"), method = "moveToWorld")
public void nullify(ServerWorld destination, CallbackInfoReturnable<TeleportTarget> cir) {
this.dimdoors_teleportTarget = null;
this.dimdoors_setReadyToTeleport(false);
}
@Override
public boolean dimdoors_isReadyToTeleport() {
return this.dimdoors_readyToTeleport;
}
@Override
public void dimdoors_setReadyToTeleport(boolean value) {
this.dimdoors_readyToTeleport = value;
}
@Override
public void dimdoors_setTeleportTarget(TeleportTarget target) {
this.dimdoors_teleportTarget = target;
}
}

View file

@ -4,10 +4,10 @@ import java.util.Random;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.ModConfig;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.WorldUtil;
import org.dimdev.dimdoors.world.ModDimensions;
import org.dimdev.dimdoors.world.pocket.Pocket;
import org.dimdev.dimdoors.world.pocket.PocketRegistry;
@ -41,13 +41,13 @@ public final class PocketGenerator {
public static Pocket generatePrivatePocket(VirtualLocation virtualLocation) {
PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getPersonalPocketTemplate();
return generatePocketFromTemplate(WorldUtil.getWorld(ModDimensions.PERSONAL), pocketTemplate, virtualLocation, true);
return generatePocketFromTemplate(DimensionalDoorsInitializer.getWorld(ModDimensions.PERSONAL), pocketTemplate, virtualLocation, true);
}
// TODO: size of public pockets should increase with depth
public static Pocket generatePublicPocket(VirtualLocation virtualLocation, VirtualTarget linkTo, LinkProperties linkProperties) {
PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getPublicPocketTemplate();
return generatePocketFromTemplate(WorldUtil.getWorld(ModDimensions.PUBLIC), pocketTemplate, virtualLocation, linkTo, linkProperties);
return generatePocketFromTemplate(DimensionalDoorsInitializer.getWorld(ModDimensions.PUBLIC), pocketTemplate, virtualLocation, linkTo, linkProperties);
}
/**
@ -58,11 +58,11 @@ public final class PocketGenerator {
*/
public static Pocket generateDungeonPocket(VirtualLocation virtualLocation, VirtualTarget linkTo, LinkProperties linkProperties) {
int depth = virtualLocation.getDepth();
float netherProbability = WorldUtil.getWorld(virtualLocation.getWorld()).getDimension().isUltrawarm() ? 1 : (float) depth / 200; // TODO: improve nether probability
float netherProbability = DimensionalDoorsInitializer.getWorld(virtualLocation.getWorld()).getDimension().isUltrawarm() ? 1 : (float) depth / 200; // TODO: improve nether probability
Random random = new Random();
String group = random.nextFloat() < netherProbability ? "nether" : "ruins";
PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getRandomTemplate(group, depth, ModConfig.INSTANCE.getPocketsConfig().maxPocketSize, false);
return generatePocketFromTemplate(WorldUtil.getWorld(ModDimensions.DUNGEON), pocketTemplate, virtualLocation, linkTo, linkProperties);
return generatePocketFromTemplate(DimensionalDoorsInitializer.getWorld(ModDimensions.DUNGEON), pocketTemplate, virtualLocation, linkTo, linkProperties);
}
}

View file

@ -1,22 +1,18 @@
package org.dimdev.dimdoors.pockets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimcore.schematic.Schematic;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.registry.RiftRegistry;
import org.dimdev.dimdoors.rift.targets.PocketEntranceMarker;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.WorldUtil;
import org.dimdev.dimdoors.util.math.MathUtil;
import org.dimdev.dimdoors.world.pocket.Pocket;
import org.dimdev.dimdoors.world.pocket.PocketRegistry;
@ -143,7 +139,7 @@ public class PocketTemplate {
public void place(Pocket pocket, boolean setup) {
pocket.setSize(this.size * 16, this.size * 16, this.size * 16);
int gridSize = PocketRegistry.instance(pocket.world).getGridSize();
ServerWorld world = WorldUtil.getWorld(pocket.world);
ServerWorld world = DimensionalDoorsInitializer.getWorld(pocket.world);
int xBase = pocket.box.minX;
int yBase = pocket.box.minY;
int zBase = pocket.box.minZ;
@ -168,7 +164,7 @@ public class PocketTemplate {
public void setup(Pocket pocket, VirtualTarget linkTo, LinkProperties linkProperties) {
int gridSize = PocketRegistry.instance(pocket.world).getGridSize();
ServerWorld world = WorldUtil.getWorld(pocket.world);
ServerWorld world = DimensionalDoorsInitializer.getWorld(pocket.world);
int xBase = pocket.box.minX;
int yBase = pocket.box.minY;
int zBase = pocket.box.minZ;

View file

@ -15,7 +15,6 @@ import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.WorldUtil;
import org.dimdev.dimdoors.world.pocket.Pocket;
import net.minecraft.block.entity.BlockEntity;

View file

@ -5,6 +5,7 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
@ -13,7 +14,6 @@ import org.dimdev.dimdoors.rift.registry.LinkProperties;
import org.dimdev.dimdoors.rift.registry.Rift;
import org.dimdev.dimdoors.rift.registry.RiftRegistry;
import org.dimdev.dimdoors.util.Location;
import org.dimdev.dimdoors.util.WorldUtil;
import org.dimdev.dimdoors.util.math.MathUtil;
import org.dimdev.dimdoors.world.pocket.Pocket;
import org.dimdev.dimdoors.world.pocket.VirtualLocation;
@ -25,7 +25,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.Heightmap;
import net.minecraft.world.World;
public class RandomTarget extends VirtualTarget { // TODO: Split into DungeonTarget subclass
public static final Codec<RandomTarget> CODEC = RecordCodecBuilder.create(instance -> {
@ -147,7 +146,7 @@ public class RandomTarget extends VirtualTarget { // TODO: Split into DungeonTar
if (virtualLocation.getDepth() <= 0) {
// This will lead to the overworld
ServerWorld world = WorldUtil.getWorld(virtualLocation.getWorld());
ServerWorld world = DimensionalDoorsInitializer.getWorld(virtualLocation.getWorld());
BlockPos pos = world.getTopPosition(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, new BlockPos(virtualLocation.getX(), 0, virtualLocation.getZ()));
if (pos.getY() == -1) {
// No blocks at that XZ (hole in bedrock)

View file

@ -0,0 +1,11 @@
package org.dimdev.dimdoors.util;
import net.minecraft.world.TeleportTarget;
public interface EntityExtensions {
boolean dimdoors_isReadyToTeleport();
void dimdoors_setReadyToTeleport(boolean value);
void dimdoors_setTeleportTarget(TeleportTarget target);
}

View file

@ -9,8 +9,19 @@ import net.minecraft.entity.projectile.FishingBobberEntity;
import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.TeleportTarget;
public final class EntityUtils {
public static void prepareTeleportation(Entity e, Vec3d pos, float yawOffset) {
if (e instanceof EntityExtensions) {
((EntityExtensions) e).dimdoors_setReadyToTeleport(true);
((EntityExtensions) e).dimdoors_setTeleportTarget(new TeleportTarget(pos, Vec3d.ZERO, e.getYaw(1.0F) + yawOffset, e.getPitch(1.0F)));
} else {
throw new AssertionError("Mixin not applied");
}
}
public static Entity getOwner(Entity entity) {
Entity topmostEntity = null;

View file

@ -1,7 +1,5 @@
package org.dimdev.dimdoors.util;
import java.util.Objects;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import net.minecraft.entity.Entity;
@ -13,24 +11,27 @@ import net.minecraft.world.World;
public final class TeleportUtil {
public static void teleport(Entity entity, World world, BlockPos pos, int yawOffset) {
if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld");
}
teleport(entity, world, Vec3d.ofBottomCenter(pos), yawOffset);
}
public static void teleport(Entity entity, World world, Vec3d pos, float yawOffset) {
if (world.isClient) {
throw new UnsupportedOperationException("Only supported on ServerWorld");
}
if (entity instanceof ServerPlayerEntity) {
((ServerPlayerEntity) entity).teleport((ServerWorld) world, pos.x, pos.y, pos.z, entity.getYaw(1.0F) + yawOffset, entity.getPitch(1.0F));
}
else if (entity.world.getRegistryKey().equals(world.getRegistryKey())) {
// TODO: make entity placers work
entity.setPos(pos.x, pos.y, pos.z);
entity.setYaw(entity.yaw + yawOffset);
} else {
if (world instanceof ServerWorld) {
Entity newEntity = Objects.requireNonNull(entity.moveToWorld((ServerWorld) world));
newEntity.setPos(pos.x, pos.y, pos.z);
newEntity.setYaw(entity.yaw + yawOffset);
newEntity.setOnFireFor(0);// Workaround for https://bugs.mojang.com/browse/MC-100097
}
EntityUtils.prepareTeleportation(entity, pos, yawOffset);
entity.moveToWorld((ServerWorld) world);
}
}

View file

@ -1,13 +0,0 @@
package org.dimdev.dimdoors.util;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.World;
public class WorldUtil {
public static ServerWorld getWorld(RegistryKey<World> key) {
return DimensionalDoorsInitializer.getWorld(key);
}
}

View file

@ -3,9 +3,9 @@ package org.dimdev.dimdoors.world.pocket;
import java.util.HashMap;
import java.util.Map;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.ModConfig;
import org.dimdev.dimdoors.util.NbtUtil;
import org.dimdev.dimdoors.util.WorldUtil;
import org.dimdev.dimdoors.util.math.GridUtil;
import org.dimdev.dimdoors.world.ModDimensions;
import com.mojang.serialization.Codec;
@ -62,7 +62,7 @@ public class PocketRegistry extends PersistentState {
}
public static PocketRegistry instance(RegistryKey<World> key) {
ServerWorld world = WorldUtil.getWorld(key);
ServerWorld world = DimensionalDoorsInitializer.getWorld(key);
if (!(ModDimensions.isDimDoorsPocketDimension(world))) {
throw new UnsupportedOperationException("PocketRegistry is only available for pocket dimensions!");

View file

@ -2,8 +2,8 @@ package org.dimdev.dimdoors.world.pocket;
import java.util.UUID;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.util.NbtUtil;
import org.dimdev.dimdoors.util.WorldUtil;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.mojang.serialization.Codec;
@ -50,7 +50,7 @@ public class PrivatePocketData extends PersistentState {
}
public static PrivatePocketData instance() {
return WorldUtil.getWorld(OVERWORLD).getPersistentStateManager().getOrCreate(PrivatePocketData::new, DATA_NAME);
return DimensionalDoorsInitializer.getWorld(OVERWORLD).getPersistentStateManager().getOrCreate(PrivatePocketData::new, DATA_NAME);
}
@Override

View file

@ -9,6 +9,7 @@
"DefaultBiomeFeaturesMixin",
"DimensionTypeAccessor",
"DirectionAccessor",
"EntityMixin",
"ListTagAccessor",
"PlayerEntityMixin"
],