diff --git a/src/main/config/org/dimdev/dimdoors/client/util/ScreenGenerator.java b/src/main/config/org/dimdev/dimdoors/client/util/ScreenGenerator.java index fecf40c0..a276e215 100644 --- a/src/main/config/org/dimdev/dimdoors/client/util/ScreenGenerator.java +++ b/src/main/config/org/dimdev/dimdoors/client/util/ScreenGenerator.java @@ -24,6 +24,10 @@ import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +@Environment(EnvType.CLIENT) public class ScreenGenerator { public static Screen create(Screen parent, Object config, Runnable saveAction) { Class configClass = config.getClass(); @@ -34,6 +38,7 @@ public class ScreenGenerator { ConfigEntryBuilder entryBuilder = configBuilder.entryBuilder(); configBuilder.setTitle(new TranslatableText(configClass.getAnnotation(Title.class).value())); configBuilder.setSavingRunnable(saveAction); + configBuilder.setParentScreen(parent); GetStrategy strategy = configClass.getAnnotation(GetStrategy.class); for (Field field : configClass.getDeclaredFields()) { if (!field.isAnnotationPresent(Category.class) diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index a53549d0..2031a39e 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -6,6 +6,7 @@ import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; import org.dimdev.dimdoors.command.ModCommands; import org.dimdev.dimdoors.entity.ModEntityTypes; +import org.dimdev.dimdoors.entity.stat.ModStats; import org.dimdev.dimdoors.fluid.ModFluids; import org.dimdev.dimdoors.item.ModItems; import org.dimdev.dimdoors.pockets.SchematicHandler; @@ -65,6 +66,7 @@ public class DimensionalDoorsInitializer implements ModInitializer { ModBiomes.init(); ModDimensions.init(); ModEntityTypes.init(); + ModStats.init(); ModBlockEntityTypes.init(); ModCommands.init(); ModFluids.init(); diff --git a/src/main/java/org/dimdev/dimdoors/client/DefaultTransformation.java b/src/main/java/org/dimdev/dimdoors/client/DefaultTransformation.java index 66d257b6..0230255d 100644 --- a/src/main/java/org/dimdev/dimdoors/client/DefaultTransformation.java +++ b/src/main/java/org/dimdev/dimdoors/client/DefaultTransformation.java @@ -13,7 +13,6 @@ public enum DefaultTransformation implements Transformer { DIMENSIONAL_PORTAL { @Override public void transform(MatrixStack matrices) { - // TODO matrices.translate(0, 0, 0.5F); } }, @@ -44,12 +43,6 @@ public enum DefaultTransformation implements Transformer { matrices.multiply(Vector3f.NEGATIVE_Y.getDegreesQuaternion(90.0F)); matrices.translate(0, 0, -0.19F); } - }, - TRAPDOOR { - @Override - public void transform(MatrixStack matrices) { - matrices.multiply(Vector3f.NEGATIVE_Z.getDegreesQuaternion(90.0F)); - } }; private static final DefaultTransformation[] VALUES = values(); diff --git a/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java b/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java index f0b63dd1..c83fca8f 100644 --- a/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java +++ b/src/main/java/org/dimdev/dimdoors/client/DetachedRiftBlockEntityRenderer.java @@ -34,9 +34,7 @@ public class DetachedRiftBlockEntityRenderer extends BlockEntityRenderer HINGE_PROPERTY = EnumProperty.of("hinge", DoorHinge.class); - public static final DirectionProperty FACING_PROPERTY = DirectionProperty.of("facing", Arrays.asList(DirectionAccessor.getHorizontal())); public static final VectorNi COLORLESS = new VectorNi(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255); private static final Identifier KEY_PATH = new Identifier("dimdoors:textures/other/keyhole.png"); private static final Identifier KEYHOLE_LIGHT = new Identifier("dimdoors:textures/other/keyhole_light.png"); @@ -36,37 +27,69 @@ public class MyRenderLayer extends RenderLayer { super(string, vertexFormat, i, j, bl, bl2, runnable, runnable2); } - public static RenderLayer CRACK = RenderLayer.of("crack", VertexFormats.POSITION_COLOR, GL11.GL_TRIANGLES, 256, MultiPhaseParameters.builder() - .cull(DISABLE_CULLING) - .lightmap(RenderPhase.DISABLE_LIGHTMAP) - .texture(NO_TEXTURE) - .transparency(new Transparency("crack_transparency", () -> { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); - }, () -> { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - })) - .build(false)); + public static RenderLayer CRACK = RenderLayer.of("crack", + VertexFormats.POSITION_COLOR, + GL11.GL_TRIANGLES, + 256, + MultiPhaseParameters.builder() + .cull(DISABLE_CULLING) + .lightmap(RenderPhase.DISABLE_LIGHTMAP) + .texture(NO_TEXTURE) + .transparency(new Transparency("crack_transparency", + () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + }, + () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + }) + ) + .build(false) + ); - public static RenderLayer TESSERACT = RenderLayer.of("tesseract", VertexFormats.POSITION_COLOR_TEXTURE, GL11.GL_QUADS, 256, MultiPhaseParameters.builder() - .cull(DISABLE_CULLING) - .lightmap(RenderPhase.DISABLE_LIGHTMAP) - .texture(new Texture(DetachedRiftBlockEntityRenderer.TESSERACT_PATH, false, false)) - .alpha(Alpha.HALF_ALPHA) - .build(false)); + public static RenderLayer TESSERACT = RenderLayer.of("tesseract", + VertexFormats.POSITION_COLOR_TEXTURE, + GL11.GL_QUADS, + 256, + MultiPhaseParameters.builder() + .cull(DISABLE_CULLING) + .lightmap(RenderPhase.DISABLE_LIGHTMAP) + .texture(new Texture(DetachedRiftBlockEntityRenderer.TESSERACT_PATH, + false, + false) + ) + .alpha(Alpha.HALF_ALPHA) + .build(false) + ); public static RenderLayer getPortal(int layer) { RenderPhase.Transparency transparency; RenderPhase.Texture texture; if (layer <= 1) { transparency = TRANSLUCENT_TRANSPARENCY; - texture = new RenderPhase.Texture(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, false, false); + texture = new RenderPhase.Texture(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, + false, + false + ); } else { transparency = ADDITIVE_TRANSPARENCY; texture = new RenderPhase.Texture(WARP_PATH, false, false); } - return of("dimensional_portal", VertexFormats.POSITION_COLOR, 7, 256, false, true, RenderLayer.MultiPhaseParameters.builder().transparency(transparency).texture(texture).texturing(new RenderPhase.PortalTexturing(layer)).fog(BLACK_FOG).build(false)); + return of( + "dimensional_portal", + VertexFormats.POSITION_COLOR, + GL11.GL_QUADS, + 256, + false, + true, + RenderLayer.MultiPhaseParameters.builder() + .transparency(transparency) + .texture(texture) + .texturing(new RenderPhase.PortalTexturing(layer)) + .fog(BLACK_FOG) + .build(false) + ); } } diff --git a/src/main/java/org/dimdev/dimdoors/entity/stat/ModStats.java b/src/main/java/org/dimdev/dimdoors/entity/stat/ModStats.java new file mode 100644 index 00000000..13b5f9fd --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/entity/stat/ModStats.java @@ -0,0 +1,14 @@ +package org.dimdev.dimdoors.entity.stat; + +import org.dimdev.dimdoors.mixin.StatsAccessor; + +import net.minecraft.stat.StatFormatter; +import net.minecraft.util.Identifier; + +public class ModStats { + public static final Identifier DEATHS_IN_POCKETS = StatsAccessor.invokeRegister("dimdoors:deaths_in_pocket", StatFormatter.DEFAULT); + + public static void init() { + // just loads the class + } +} diff --git a/src/main/java/org/dimdev/dimdoors/mixin/PlayerEntityMixin.java b/src/main/java/org/dimdev/dimdoors/mixin/PlayerEntityMixin.java index f1c3778e..6bae43da 100644 --- a/src/main/java/org/dimdev/dimdoors/mixin/PlayerEntityMixin.java +++ b/src/main/java/org/dimdev/dimdoors/mixin/PlayerEntityMixin.java @@ -1,19 +1,30 @@ package org.dimdev.dimdoors.mixin; +import org.dimdev.dimdoors.entity.stat.ModStats; +import org.dimdev.dimdoors.util.TeleportUtil; import org.dimdev.dimdoors.world.ModBiomes; +import org.dimdev.dimdoors.world.ModDimensions; 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.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Identifier; import net.minecraft.world.World; @Mixin(value = PlayerEntity.class, priority = 900) public abstract class PlayerEntityMixin extends LivingEntity { - private PlayerEntityMixin(EntityType entityType, World world) { + @Shadow + public abstract void incrementStat(Identifier stat); + + public PlayerEntityMixin(EntityType entityType, World world) { super(entityType, world); } @@ -23,4 +34,20 @@ public abstract class PlayerEntityMixin extends LivingEntity { cir.setReturnValue(false); } } + + @Inject(method = "onDeath", at = @At("HEAD"), cancellable = true) + public void checkDeath(DamageSource source, CallbackInfo ci) { + this.doOnDeathStuff(source, ci); + } + + @Unique + protected void doOnDeathStuff(DamageSource source, CallbackInfo ci) { + if (ModDimensions.isPocketDimension(this.world)) { + this.removed = false; + this.dead = false; + this.setHealth(this.getMaxHealth()); + this.incrementStat(ModStats.DEATHS_IN_POCKETS); + ci.cancel(); + } + } } diff --git a/src/main/java/org/dimdev/dimdoors/mixin/ServerPlayerEntityMixin.java b/src/main/java/org/dimdev/dimdoors/mixin/ServerPlayerEntityMixin.java new file mode 100644 index 00000000..2cce2aee --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/mixin/ServerPlayerEntityMixin.java @@ -0,0 +1,27 @@ +package org.dimdev.dimdoors.mixin; + +import org.dimdev.dimdoors.util.TeleportUtil; +import org.dimdev.dimdoors.world.ModDimensions; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.World; + +@Mixin(value = ServerPlayerEntity.class, priority = 900) +public abstract class ServerPlayerEntityMixin extends PlayerEntityMixin { + public ServerPlayerEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Inject(method = "onDeath", at = @At("HEAD"), cancellable = true) + public void checkDeath(DamageSource source, CallbackInfo ci) { + this.doOnDeathStuff(source, ci); + TeleportUtil.teleportRandom(this, ModDimensions.LIMBO_DIMENSION, 384); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/mixin/StatsAccessor.java b/src/main/java/org/dimdev/dimdoors/mixin/StatsAccessor.java new file mode 100644 index 00000000..2a695dd2 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/mixin/StatsAccessor.java @@ -0,0 +1,16 @@ +package org.dimdev.dimdoors.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.stat.StatFormatter; +import net.minecraft.stat.Stats; +import net.minecraft.util.Identifier; + +@Mixin(Stats.class) +public interface StatsAccessor { + @Invoker + static Identifier invokeRegister(String string, StatFormatter statFormatter) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java b/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java index 3287f7be..87c8aae6 100644 --- a/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java +++ b/src/main/java/org/dimdev/dimdoors/rift/targets/VirtualTarget.java @@ -16,7 +16,7 @@ import net.minecraft.util.registry.SimpleRegistry; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; /** - * A target that is not an actual object in the game such as a block or a tile + * A target that is not an actual object in the game such as a block or a block * entity. Only virtual targets can be saved to NBT. */ public abstract class VirtualTarget implements Target { diff --git a/src/main/java/org/dimdev/dimdoors/util/TeleportUtil.java b/src/main/java/org/dimdev/dimdoors/util/TeleportUtil.java index 5cb09d63..f4f7d6da 100644 --- a/src/main/java/org/dimdev/dimdoors/util/TeleportUtil.java +++ b/src/main/java/org/dimdev/dimdoors/util/TeleportUtil.java @@ -1,11 +1,14 @@ package org.dimdev.dimdoors.util; +import java.util.concurrent.ThreadLocalRandom; + import org.dimdev.dimdoors.DimensionalDoorsInitializer; import net.minecraft.entity.Entity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.TeleportTarget; import net.minecraft.world.World; @@ -37,6 +40,19 @@ public final class TeleportUtil { teleport(player, DimensionalDoorsInitializer.getWorld(location.world), location.pos, (int) location.yaw); } + public static void teleportRandom(Entity entity, World world, double y) { + double scale = ThreadLocalRandom.current().nextGaussian() * ThreadLocalRandom.current().nextInt(90); + teleport( + entity, + world, + entity.getPos() + .subtract(0, entity.getY(), 0) + .add(0, y, 0) + .multiply(scale, 1, scale), + entity.yaw + ); + } + public static void teleportUntargeted(Entity entity, World world) { double actualScale = entity.world.getDimension().getCoordinateScale() / world.getDimension().getCoordinateScale(); teleport( diff --git a/src/main/resources/dimdoors.mixins.json b/src/main/resources/dimdoors.mixins.json index d5e69be7..231dfd23 100644 --- a/src/main/resources/dimdoors.mixins.json +++ b/src/main/resources/dimdoors.mixins.json @@ -13,7 +13,9 @@ "ListTagAccessor", "PlayerEntityMixin", "RedstoneWireBlockAccessor", - "RegistryKeyMixin" + "RegistryKeyMixin", + "ServerPlayerEntityMixin", + "StatsAccessor" ], "client": [ "client.GlStateManagerAccessor",