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:
parent
661a6b7bf8
commit
869678dec9
14 changed files with 105 additions and 46 deletions
|
@ -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)));
|
||||
|
|
|
@ -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();
|
||||
|
|
54
src/main/java/org/dimdev/dimdoors/mixin/EntityMixin.java
Normal file
54
src/main/java/org/dimdev/dimdoors/mixin/EntityMixin.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
11
src/main/java/org/dimdev/dimdoors/util/EntityExtensions.java
Normal file
11
src/main/java/org/dimdev/dimdoors/util/EntityExtensions.java
Normal 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);
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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!");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
"DefaultBiomeFeaturesMixin",
|
||||
"DimensionTypeAccessor",
|
||||
"DirectionAccessor",
|
||||
"EntityMixin",
|
||||
"ListTagAccessor",
|
||||
"PlayerEntityMixin"
|
||||
],
|
||||
|
|
Loading…
Add table
Reference in a new issue