From 74faf97a93eadbf785e38dba9a99b67ee7dec634 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 31 Jul 2022 23:51:01 +0200 Subject: [PATCH] [Feature] New Advancements --- .../java/org/betterx/betterend/BetterEnd.java | 3 + .../betterend/advancements/BECriteria.java | 31 ++++++++ .../betterend/blocks/EndPortalBlock.java | 7 +- .../betterend/blocks/EternalPedestal.java | 6 +- .../betterend/blocks/InfusionPedestal.java | 3 +- .../betterend/blocks/basis/PedestalBlock.java | 8 +- .../betterend/registry/EndAdvancements.java | 73 +++++++++++++++++++ .../betterend/rituals/EternalRitual.java | 8 +- .../assets/betterend/lang/de_de.json | 10 ++- .../assets/betterend/lang/en_us.json | 12 ++- 10 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/betterx/betterend/advancements/BECriteria.java create mode 100644 src/main/java/org/betterx/betterend/registry/EndAdvancements.java diff --git a/src/main/java/org/betterx/betterend/BetterEnd.java b/src/main/java/org/betterx/betterend/BetterEnd.java index 098bdec7..d3419dd2 100644 --- a/src/main/java/org/betterx/betterend/BetterEnd.java +++ b/src/main/java/org/betterx/betterend/BetterEnd.java @@ -2,6 +2,7 @@ package org.betterx.betterend; import org.betterx.bclib.api.v2.generator.BiomeDecider; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; +import org.betterx.betterend.advancements.BECriteria; import org.betterx.betterend.api.BetterEndPlugin; import org.betterx.betterend.commands.CommandRegistry; import org.betterx.betterend.config.Configs; @@ -56,6 +57,8 @@ public class BetterEnd implements ModInitializer { GeneratorOptions.init(); LootTableUtil.init(); CommandRegistry.register(); + BECriteria.register(); + EndAdvancements.register(); FabricLoader.getInstance() .getEntrypoints("betterend", BetterEndPlugin.class) .forEach(BetterEndPlugin::register); diff --git a/src/main/java/org/betterx/betterend/advancements/BECriteria.java b/src/main/java/org/betterx/betterend/advancements/BECriteria.java new file mode 100644 index 00000000..1bb5ee0e --- /dev/null +++ b/src/main/java/org/betterx/betterend/advancements/BECriteria.java @@ -0,0 +1,31 @@ +package org.betterx.betterend.advancements; + +import org.betterx.betterend.BetterEnd; + +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.PlayerTrigger; + +import net.fabricmc.fabric.api.object.builder.v1.advancement.CriterionRegistry; + +public class BECriteria { + public static PlayerTrigger PORTAL_ON; + public static PlayerTrigger PORTAL_TRAVEL; + + public static PlayerTrigger.TriggerInstance PORTAL_ON_TRIGGER; + public static PlayerTrigger.TriggerInstance PORTAL_TRAVEL_TRIGGER; + + + public static void register() { + PORTAL_ON = CriterionRegistry.register(new PlayerTrigger(BetterEnd.makeID("portal_on"))); + PORTAL_TRAVEL = CriterionRegistry.register(new PlayerTrigger(BetterEnd.makeID("portal_travel"))); + + PORTAL_ON_TRIGGER = new PlayerTrigger.TriggerInstance( + PORTAL_ON.getId(), + EntityPredicate.Composite.ANY + ); + PORTAL_TRAVEL_TRIGGER = new PlayerTrigger.TriggerInstance( + PORTAL_TRAVEL.getId(), + EntityPredicate.Composite.ANY + ); + } +} diff --git a/src/main/java/org/betterx/betterend/blocks/EndPortalBlock.java b/src/main/java/org/betterx/betterend/blocks/EndPortalBlock.java index 0d722232..51628f3a 100644 --- a/src/main/java/org/betterx/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/org/betterx/betterend/blocks/EndPortalBlock.java @@ -3,6 +3,7 @@ package org.betterx.betterend.blocks; import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.interfaces.CustomColorProvider; import org.betterx.bclib.interfaces.RenderLayerProvider; +import org.betterx.betterend.advancements.BECriteria; import org.betterx.betterend.interfaces.TeleportingEntity; import org.betterx.betterend.registry.EndParticles; import org.betterx.betterend.registry.EndPortals; @@ -113,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements RenderLayerProv ServerLevel destination = isInEnd ? targetWorld : server.getLevel(Level.END); BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity); if (exitPos == null) return; - if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { + if (entity instanceof ServerPlayer sp && sp.isCreative()) { ((ServerPlayer) entity).teleportTo( destination, exitPos.getX() + 0.5, @@ -122,7 +123,11 @@ public class EndPortalBlock extends NetherPortalBlock implements RenderLayerProv entity.getYRot(), entity.getXRot() ); + BECriteria.PORTAL_TRAVEL.trigger(sp); } else { + if (entity instanceof ServerPlayer sp) { + BECriteria.PORTAL_TRAVEL.trigger(sp); + } ((TeleportingEntity) entity).be_setExitPos(exitPos); Optional teleported = Optional.ofNullable(entity.changeDimension(destination)); teleported.ifPresent(Entity::setPortalCooldown); diff --git a/src/main/java/org/betterx/betterend/blocks/EternalPedestal.java b/src/main/java/org/betterx/betterend/blocks/EternalPedestal.java index 285fbbd1..38db647e 100644 --- a/src/main/java/org/betterx/betterend/blocks/EternalPedestal.java +++ b/src/main/java/org/betterx/betterend/blocks/EternalPedestal.java @@ -38,7 +38,7 @@ public class EternalPedestal extends PedestalBlock { } @Override - public void checkRitual(Level world, BlockPos pos) { + public void checkRitual(Level world, Player player, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof EternalPedestalEntity) { EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity; @@ -64,10 +64,10 @@ public class EternalPedestal extends PedestalBlock { if (EndPortals.isAvailableItem(id)) { world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true)); if (pedestal.hasRitual()) { - pedestal.getRitual().checkStructure(); + pedestal.getRitual().checkStructure(player); } else { EternalRitual ritual = new EternalRitual(world, pos); - ritual.checkStructure(); + ritual.checkStructure(player); } } } diff --git a/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java b/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java index a9242067..49e500b4 100644 --- a/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/org/betterx/betterend/blocks/InfusionPedestal.java @@ -5,6 +5,7 @@ import org.betterx.betterend.blocks.entities.InfusionPedestalEntity; import org.betterx.betterend.rituals.InfusionRitual; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -30,7 +31,7 @@ public class InfusionPedestal extends PedestalBlock { } @Override - public void checkRitual(Level world, BlockPos pos) { + public void checkRitual(Level world, Player player, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof InfusionPedestalEntity) { InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity; diff --git a/src/main/java/org/betterx/betterend/blocks/basis/PedestalBlock.java b/src/main/java/org/betterx/betterend/blocks/basis/PedestalBlock.java index 5d357336..69239cf0 100644 --- a/src/main/java/org/betterx/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/org/betterx/betterend/blocks/basis/PedestalBlock.java @@ -118,14 +118,14 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (itemStack.isEmpty()) return InteractionResult.CONSUME; pedestal.setItem(0, itemStack); level.blockEntityChanged(pos); - checkRitual(level, pos); + checkRitual(level, player, pos); return InteractionResult.sidedSuccess(level.isClientSide()); } else { ItemStack itemStack = pedestal.getItem(0); if (player.addItem(itemStack)) { pedestal.removeItemNoUpdate(0); level.blockEntityChanged(pos); - checkRitual(level, pos); + checkRitual(level, player, pos); return InteractionResult.sidedSuccess(level.isClientSide()); } return InteractionResult.FAIL; @@ -153,13 +153,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } } - public void checkRitual(Level world, BlockPos pos) { + public void checkRitual(Level world, Player player, BlockPos pos) { MutableBlockPos posMutable = new MutableBlockPos(); for (Point point : InfusionRitual.getMap()) { posMutable.set(pos).move(point.x, 0, point.y); BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { - ((InfusionPedestal) state.getBlock()).checkRitual(world, posMutable); + ((InfusionPedestal) state.getBlock()).checkRitual(world, player, posMutable); break; } } diff --git a/src/main/java/org/betterx/betterend/registry/EndAdvancements.java b/src/main/java/org/betterx/betterend/registry/EndAdvancements.java new file mode 100644 index 00000000..b433d1bf --- /dev/null +++ b/src/main/java/org/betterx/betterend/registry/EndAdvancements.java @@ -0,0 +1,73 @@ +package org.betterx.betterend.registry; + +import org.betterx.bclib.api.v2.advancement.AdvancementManager; +import org.betterx.betterend.BetterEnd; +import org.betterx.betterend.advancements.BECriteria; + +import net.minecraft.advancements.FrameType; +import net.minecraft.advancements.RequirementsStrategy; +import net.minecraft.advancements.critereon.ChangeDimensionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; + +public class EndAdvancements { + public static void register() { + ResourceLocation root = AdvancementManager.Builder + .create(BetterEnd.makeID("root")) + .startDisplay(EndBlocks.CAVE_MOSS) + .frame(FrameType.TASK) + .hideToast() + .hideFromChat() + .background(new ResourceLocation("textures/gui/advancements/backgrounds/end.png")) + .endDisplay() + .addCriterion( + "entered_end", + ChangeDimensionTrigger + .TriggerInstance + .changedDimensionTo(Level.END) + ) + .requirements(RequirementsStrategy.OR) + .buildAndRegister(); + + ResourceLocation portal = AdvancementManager.Builder + .create(BetterEnd.makeID("portal")) + .parent(root) + .startDisplay(EndBlocks.ETERNAL_PEDESTAL) + .frame(FrameType.GOAL) + .endDisplay() + .addAtStructureCriterion("eternal_portal", EndStructures.ETERNAL_PORTAL) + .requirements(RequirementsStrategy.OR) + .buildAndRegister(); + + ResourceLocation portalOn = AdvancementManager.Builder + .create(BetterEnd.makeID("portal_on")) + .parent(portal) + .startDisplay(EndItems.ETERNAL_CRYSTAL) + .endDisplay() + .addCriterion("turn_on", BECriteria.PORTAL_ON_TRIGGER) + .requirements(RequirementsStrategy.OR) + .buildAndRegister(); + + ResourceLocation portalTravel = AdvancementManager.Builder + .create(BetterEnd.makeID("portal_travel")) + .parent(portalOn) + .startDisplay(Items.GRASS_BLOCK) + .frame(FrameType.CHALLENGE) + .endDisplay() + .addCriterion("travel", BECriteria.PORTAL_TRAVEL_TRIGGER) + .requirements(RequirementsStrategy.OR) + .buildAndRegister(); + + ResourceLocation allTheBiomes = AdvancementManager.Builder + .create(BetterEnd.makeID("all_the_biomes")) + .parent(root) + .startDisplay(EndItems.AETERNIUM_BOOTS) + .frame(FrameType.CHALLENGE) + .endDisplay() + .addVisitBiomesCriterion(EndBiomes.ALL_BE_BIOMES.stream().map(b -> b.getBiomeKey()).toList()) + .requirements(RequirementsStrategy.AND) + .rewardXP(1500) + .buildAndRegister(); + } +} diff --git a/src/main/java/org/betterx/betterend/rituals/EternalRitual.java b/src/main/java/org/betterx/betterend/rituals/EternalRitual.java index a5fa4473..c7c831da 100644 --- a/src/main/java/org/betterx/betterend/rituals/EternalRitual.java +++ b/src/main/java/org/betterx/betterend/rituals/EternalRitual.java @@ -2,6 +2,7 @@ package org.betterx.betterend.rituals; import org.betterx.bclib.blocks.BlockProperties; import org.betterx.betterend.BetterEnd; +import org.betterx.betterend.advancements.BECriteria; import org.betterx.betterend.blocks.EndPortalBlock; import org.betterx.betterend.blocks.RunedFlavolite; import org.betterx.betterend.blocks.entities.EternalPedestalEntity; @@ -21,9 +22,11 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.ai.village.poi.PoiManager; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -130,7 +133,7 @@ public class EternalRitual { return world == null || world.isClientSide() || center == null || axis == null; } - public void checkStructure() { + public void checkStructure(Player player) { if (isInvalid()) return; Direction moveX, moveY; if (Direction.Axis.X == axis) { @@ -160,6 +163,9 @@ public class EternalRitual { } if (valid && item != null) { activatePortal(item); + if (player instanceof ServerPlayer sp) { + BECriteria.PORTAL_ON.trigger(sp); + } } } diff --git a/src/main/resources/assets/betterend/lang/de_de.json b/src/main/resources/assets/betterend/lang/de_de.json index 0c9b4379..0ace9239 100644 --- a/src/main/resources/assets/betterend/lang/de_de.json +++ b/src/main/resources/assets/betterend/lang/de_de.json @@ -642,5 +642,13 @@ "betterend.infusion.south": "Südlicher Sockel", "betterend.infusion.south_east": "Südöstlicher Sockel", "betterend.infusion.east": "Östlicher Sockel", - "betterend.infusion.north_east": "Nordöstlicher Sockel" + "betterend.infusion.north_east": "Nordöstlicher Sockel", + "advancements.betterend.root.title": "BetterEnd", + "advancements.betterend.root.description": "Pfad der Eweigkeit", + "advancements.betterend.portal.title": "Die Ewigkeit und zurück", + "advancements.betterend.portal.description": "Entdecke ein verlorenes seit Ewigkeiten verlorenes Portal", + "advancements.betterend.portal_on.title": "Wege der Ewigkeit", + "advancements.betterend.portal_on.description": "Entfache ein ewiges Portal", + "advancements.betterend.all_the_biomes.title": "Ein Neues Ende", + "advancements.betterend.all_the_biomes.description": "Besuche alle BetterEnd Biome" } diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 8a1e1c81..13d24f12 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -840,5 +840,15 @@ "betterend.infusion.south": "Southern Pedestal", "betterend.infusion.south_east": "South-East Pedestal", "betterend.infusion.east": "Eastern Pedestal", - "betterend.infusion.north_east": "North-East Pedestal" + "betterend.infusion.north_east": "North-East Pedestal", + "advancements.betterend.root.title": "BetterEnd", + "advancements.betterend.root.description": "Discover the BetterEnd", + "advancements.betterend.portal.title": "On Eternal Paths", + "advancements.betterend.portal.description": "Discover a portal lost for eternity", + "advancements.betterend.portal_on.title": "Eternal Light", + "advancements.betterend.portal_on.description": "Light an eternal Portal", + "advancements.betterend.portal_travel.title": "Eternal Ways", + "advancements.betterend.portal_travel.description": "Reise auf uralten Pfaden und benutze ein ewiges Portal", + "advancements.betterend.all_the_biomes.title": "A New Ending", + "advancements.betterend.all_the_biomes.description": "Visit all BetterEnd Biomes" }