diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index 3308e43d..97e33beb 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -1,5 +1,11 @@ package org.dimdev.dimdoors; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; +import org.apache.logging.log4j.core.jmx.Server; import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; import org.dimdev.dimdoors.command.ModCommands; @@ -31,8 +37,20 @@ public class DimensionalDoorsInitializer implements ModInitializer { public static final Identifier MONOLITH_PARTICLE_PACKET = new Identifier("dimdoors", "monolith_particle_packet"); + private static MinecraftServer server; + + public static MinecraftServer getServer() { + return server; + } + + public static ServerWorld getWorld(RegistryKey key) { + return getServer().getWorld(key); + } + @Override public void onInitialize() { + ServerLifecycleEvents.SERVER_STARTED.register(DimensionalDoorsInitializer::setServer); + ModBlocks.init(); ModItems.init(); ModDimensions.init(); @@ -43,18 +61,10 @@ public class DimensionalDoorsInitializer implements ModInitializer { ModSoundEvents.init(); ModFeatures.init(); - VirtualTarget.registry.put("available_link", RandomTarget.class); - VirtualTarget.registry.put("escape", EscapeTarget.class); - VirtualTarget.registry.put("global", GlobalReference.class); - VirtualTarget.registry.put("limbo", LimboTarget.class); - VirtualTarget.registry.put("local", LocalReference.class); - VirtualTarget.registry.put("public_pocket", PublicPocketTarget.class); - VirtualTarget.registry.put("pocket_entrance", PocketEntranceMarker.class); - VirtualTarget.registry.put("pocket_exit", PocketExitMarker.class); - VirtualTarget.registry.put("private", PrivatePocketTarget.class); - VirtualTarget.registry.put("private_pocket_exit", PrivatePocketExitTarget.class); - VirtualTarget.registry.put("relative", RelativeReference.class); - Targets.registerDefaultTargets(); } + + private static void setServer(MinecraftServer server) { + DimensionalDoorsInitializer.server = server; + } } diff --git a/src/main/java/org/dimdev/dimdoors/block/DetachedRiftBlock.java b/src/main/java/org/dimdev/dimdoors/block/DetachedRiftBlock.java index 23b96756..c8930a38 100644 --- a/src/main/java/org/dimdev/dimdoors/block/DetachedRiftBlock.java +++ b/src/main/java/org/dimdev/dimdoors/block/DetachedRiftBlock.java @@ -2,14 +2,11 @@ package org.dimdev.dimdoors.block; import java.util.Random; +import net.minecraft.block.*; import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity; import org.dimdev.dimdoors.client.RiftParticle; import org.dimdev.dimdoors.world.ModDimensions; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.MaterialColor; -import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.world.ClientWorld; @@ -85,4 +82,9 @@ public class DetachedRiftBlock extends Block implements RiftProvider, ConditionalBlockEntityProvider { public DimensionalDoorBlock(Settings settings) { diff --git a/src/main/java/org/dimdev/dimdoors/block/entity/EntranceRiftBlockEntity.java b/src/main/java/org/dimdev/dimdoors/block/entity/EntranceRiftBlockEntity.java index 5b05b5d7..aa3e32bb 100644 --- a/src/main/java/org/dimdev/dimdoors/block/entity/EntranceRiftBlockEntity.java +++ b/src/main/java/org/dimdev/dimdoors/block/entity/EntranceRiftBlockEntity.java @@ -39,7 +39,7 @@ public class EntranceRiftBlockEntity extends RiftBlockEntity { public boolean teleport(Entity entity) { boolean status = super.teleport(entity); - if (riftStateChanged && !alwaysDelete) { + if (riftStateChanged && !data.isAlwaysDelete()) { markDirty(); } diff --git a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java index 0c0b0f9d..04589117 100644 --- a/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java +++ b/src/main/java/org/dimdev/dimdoors/block/entity/RiftBlockEntity.java @@ -1,6 +1,7 @@ package org.dimdev.dimdoors.block.entity; import java.util.Arrays; +import java.util.Objects; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,6 +19,8 @@ import org.dimdev.dimdoors.rift.targets.Targets; import org.dimdev.dimdoors.rift.targets.VirtualTarget; import org.dimdev.dimdoors.util.EntityUtils; import org.dimdev.dimdoors.util.Location; +import org.dimdev.dimdoors.util.NbtUtil; +import org.dimdev.dimdoors.util.RGBA; import org.dimdev.dimdoors.world.pocket.VirtualLocation; import net.minecraft.block.BlockState; @@ -32,21 +35,13 @@ import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; public abstract class RiftBlockEntity extends BlockEntity implements BlockEntityClientSerializable, Target, EntityTarget, AutoSerializable { private static final Logger LOGGER = LogManager.getLogger(); - /*@Saved*/ protected VirtualTarget destination; // How the rift acts as a source - @Saved - protected LinkProperties properties; - @Saved - protected boolean alwaysDelete; - @Saved - protected boolean forcedColor; - @Saved - protected float[] color = null; + + protected RiftData data = new RiftData(); protected boolean riftStateChanged; // not saved public RiftBlockEntity(BlockEntityType type) { super(type); - alwaysDelete = false; } // NBT @@ -56,38 +51,36 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity if (this.world != null && !this.world.isClient()) { this.sync(); } - AnnotatedNbt.load(this, nbt); - this.destination = nbt.contains("destination") ? VirtualTarget.readVirtualTargetNBT(nbt.getCompound("destination")) : null; + + this.data = NbtUtil.deserialize(nbt.get("data"), RiftData.CODEC); } - @Override - public void fromClientTag(CompoundTag tag) { - fromTag(this.world.getBlockState(this.pos), tag); - } - @Override public CompoundTag toTag(CompoundTag tag) { if (this.world != null && !this.world.isClient()) { this.sync(); } + return super.toTag(tag); } + @Override + public void fromClientTag(CompoundTag tag) { + tag.put("data", NbtUtil.serialize(data, RiftData.CODEC)); + } + @Override public CompoundTag toClientTag(CompoundTag tag) { - save(tag); - if (destination != null) { - tag.put("destination", destination.toTag(new CompoundTag())); - } + tag.put("data", NbtUtil.serialize(data, RiftData.CODEC)); return tag; } public void setDestination(VirtualTarget destination) { - if (this.destination != null && isRegistered()) { - this.destination.unregister(); + if (this.getDestination() != null && isRegistered()) { + this.getDestination().unregister(); } - this.destination = destination; + this.data.setDestination(destination); if (destination != null) { if (world != null && pos != null) { destination.setLocation(new Location((ServerWorld) world, pos)); @@ -99,14 +92,13 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity updateColor(); } - public void setColor(float[] color) { - forcedColor = color != null; - this.color = color; + public void setColor(RGBA color) { + data.setColor(color); markDirty(); } public void setProperties(LinkProperties properties) { - this.properties = properties; + data.setProperties(properties); updateProperties(); markDirty(); } @@ -117,7 +109,7 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity } public boolean isRegistered() { - return !PocketTemplate.isReplacingPlaceholders() && RiftRegistry.instance(world).isRiftAt(new Location((ServerWorld) world, pos)); + return !PocketTemplate.isReplacingPlaceholders() && RiftRegistry.instance().isRiftAt(new Location((ServerWorld) world, pos)); } public void register() { @@ -126,34 +118,34 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity } Location loc = new Location((ServerWorld) world, pos); - RiftRegistry.instance(world).addRift(loc); - if (destination != null) destination.register(); + RiftRegistry.instance().addRift(loc); + if (data.getDestination() != null) data.getDestination().register(); updateProperties(); updateColor(); } public void updateProperties() { if (isRegistered()) - RiftRegistry.instance(world).setProperties(new Location((ServerWorld) world, pos), properties); + RiftRegistry.instance().setProperties(new Location((ServerWorld) world, pos), data.getProperties()); markDirty(); } public void unregister() { if (isRegistered()) { - RiftRegistry.instance(world).removeRift(new Location((ServerWorld) world, pos)); + RiftRegistry.instance().removeRift(new Location((ServerWorld) world, pos)); } } public void updateType() { if (!isRegistered()) return; - Rift rift = RiftRegistry.instance(world).getRift(new Location((ServerWorld) world, pos)); + Rift rift = RiftRegistry.instance().getRift(new Location((ServerWorld) world, pos)); rift.isDetached = isDetached(); rift.markDirty(); } public void handleTargetGone(Location location) { - if (destination.shouldInvalidate(location)) { - destination = null; + if (data.getDestination().shouldInvalidate(location)) { + data.setDestination(null); markDirty(); } @@ -165,11 +157,11 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity } public Target getTarget() { - if (destination == null) { + if (data.getDestination() == null) { return new MessageTarget("rifts.unlinked"); } else { - destination.setLocation(new Location((ServerWorld) world, pos)); - return destination; + data.getDestination().setLocation(new Location((ServerWorld) world, pos)); + return data.getDestination(); } } @@ -194,16 +186,16 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity } public void updateColor() { - if (forcedColor) return; + if (data.isForcedColor()) return; if (!isRegistered()) { - color = new float[]{0, 0, 0, 1}; - } else if (destination == null) { - color = new float[]{0.7f, 0.7f, 0.7f, 1}; + data.setColor(new RGBA(0, 0, 0, 1)); + } else if (data.getDestination() == null) { + data.setColor(new RGBA(0.7f, 0.7f, 0.7f, 1)); } else { - destination.setLocation(new Location((ServerWorld) world, pos)); - float[] newColor = destination.getColor(); - if (color == null && newColor != null || !Arrays.equals(color, newColor)) { - color = newColor; + data.getDestination().setLocation(new Location((ServerWorld) world, pos)); + RGBA newColor = data.getDestination().getColor(); + if (data.getColor() == null && newColor != null || !Objects.equals(data.getColor(), newColor)) { + data.setColor(newColor); markDirty(); } } @@ -212,29 +204,30 @@ public abstract class RiftBlockEntity extends BlockEntity implements BlockEntity protected abstract boolean isDetached(); public void copyFrom(DetachedRiftBlockEntity rift) { - destination = rift.destination; - properties = rift.properties; - alwaysDelete = rift.alwaysDelete; - forcedColor = rift.forcedColor; + + data.setDestination(rift.data.getDestination()); + data.setProperties(rift.data.getProperties()); + data.setAlwaysDelete(rift.data.isAlwaysDelete()); + data.setForcedColor(rift.data.isForcedColor()); } public VirtualTarget getDestination() { - return destination; + return data.getDestination(); } public LinkProperties getProperties() { - return properties; + return data.getProperties(); } public boolean isAlwaysDelete() { - return alwaysDelete; + return data.isAlwaysDelete(); } public boolean isForcedColor() { - return forcedColor; + return data.isForcedColor(); } - public float[] getColor() { - return color; + public RGBA getColor() { + return data.getColor(); } } diff --git a/src/main/java/org/dimdev/dimdoors/block/entity/RiftData.java b/src/main/java/org/dimdev/dimdoors/block/entity/RiftData.java new file mode 100644 index 00000000..a5bc69e4 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/block/entity/RiftData.java @@ -0,0 +1,77 @@ +package org.dimdev.dimdoors.block.entity; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.dimdev.annotatednbt.Saved; +import org.dimdev.dimdoors.rift.registry.LinkProperties; +import org.dimdev.dimdoors.rift.targets.VirtualTarget; +import org.dimdev.dimdoors.util.RGBA; + +public class RiftData { + public static Codec CODEC = RecordCodecBuilder.create(instance -> { + return instance.group( + VirtualTarget.CODEC.optionalFieldOf("destination", null).forGetter(RiftData::getDestination), + LinkProperties.CODEC.optionalFieldOf("properties", null).forGetter(RiftData::getProperties), + Codec.BOOL.fieldOf("alwaysDelete").forGetter(RiftData::isAlwaysDelete), + Codec.BOOL.fieldOf("forcedColor").forGetter(RiftData::isForcedColor), + RGBA.CODEC.optionalFieldOf("color", null).forGetter(RiftData::getColor) + ).apply(instance, RiftData::new); + }); + + private VirtualTarget destination; // How the rift acts as a source + private LinkProperties properties; + private boolean alwaysDelete; + private boolean forcedColor; + private RGBA color = null; + + public RiftData() {} + + private RiftData(VirtualTarget destination, LinkProperties properties, boolean alwaysDelete, boolean forcedColor, RGBA color) { + this.destination = destination; + this.properties = properties; + this.alwaysDelete = alwaysDelete; + this.forcedColor = forcedColor; + this.color = color; + } + + public VirtualTarget getDestination() { + return destination; + } + + public void setDestination(VirtualTarget destination) { + this.destination = destination; + } + + public LinkProperties getProperties() { + return properties; + } + + public void setProperties(LinkProperties properties) { + this.properties = properties; + } + + public boolean isAlwaysDelete() { + return alwaysDelete; + } + + public void setAlwaysDelete(boolean alwaysDelete) { + this.alwaysDelete = alwaysDelete; + } + + public boolean isForcedColor() { + return forcedColor; + } + + public void setForcedColor(boolean forcedColor) { + this.forcedColor = forcedColor; + } + + public RGBA getColor() { + return color; + } + + public void setColor(RGBA color) { + forcedColor = color != null; + this.color = color; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java b/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java index 1f6499bc..897db306 100644 --- a/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java +++ b/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java @@ -15,10 +15,12 @@ import net.minecraft.util.Identifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import org.dimdev.dimdoors.util.RGBA; @Environment(EnvType.CLIENT) public class DetachedRiftBlockEntityRenderer extends BlockEntityRenderer { public static final Identifier TESSERACT_PATH = new Identifier("dimdoors:textures/other/tesseract.png"); + private RGBA COLOR = new RGBA(1, 0.5f, 1, 1); private static final Tesseract TESSERACT = new Tesseract(); private static final RiftCurves.PolygonInfo CURVE = RiftCurves.CURVES.get(0); @@ -51,8 +53,8 @@ public class DetachedRiftBlockEntityRenderer extends BlockEntityRenderer