[Feature] New Advancements

This commit is contained in:
Frank 2022-07-31 23:51:01 +02:00
parent ed620a1c57
commit 74faf97a93
10 changed files with 149 additions and 12 deletions

View file

@ -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);

View file

@ -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
);
}
}

View file

@ -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<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination));
teleported.ifPresent(Entity::setPortalCooldown);

View file

@ -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);
}
}
}

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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);
}
}
}