[Feature] New Advancements
This commit is contained in:
parent
ed620a1c57
commit
74faf97a93
10 changed files with 149 additions and 12 deletions
|
@ -2,6 +2,7 @@ package org.betterx.betterend;
|
||||||
|
|
||||||
import org.betterx.bclib.api.v2.generator.BiomeDecider;
|
import org.betterx.bclib.api.v2.generator.BiomeDecider;
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
|
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.api.BetterEndPlugin;
|
||||||
import org.betterx.betterend.commands.CommandRegistry;
|
import org.betterx.betterend.commands.CommandRegistry;
|
||||||
import org.betterx.betterend.config.Configs;
|
import org.betterx.betterend.config.Configs;
|
||||||
|
@ -56,6 +57,8 @@ public class BetterEnd implements ModInitializer {
|
||||||
GeneratorOptions.init();
|
GeneratorOptions.init();
|
||||||
LootTableUtil.init();
|
LootTableUtil.init();
|
||||||
CommandRegistry.register();
|
CommandRegistry.register();
|
||||||
|
BECriteria.register();
|
||||||
|
EndAdvancements.register();
|
||||||
FabricLoader.getInstance()
|
FabricLoader.getInstance()
|
||||||
.getEntrypoints("betterend", BetterEndPlugin.class)
|
.getEntrypoints("betterend", BetterEndPlugin.class)
|
||||||
.forEach(BetterEndPlugin::register);
|
.forEach(BetterEndPlugin::register);
|
||||||
|
|
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package org.betterx.betterend.blocks;
|
||||||
import org.betterx.bclib.client.render.BCLRenderLayer;
|
import org.betterx.bclib.client.render.BCLRenderLayer;
|
||||||
import org.betterx.bclib.interfaces.CustomColorProvider;
|
import org.betterx.bclib.interfaces.CustomColorProvider;
|
||||||
import org.betterx.bclib.interfaces.RenderLayerProvider;
|
import org.betterx.bclib.interfaces.RenderLayerProvider;
|
||||||
|
import org.betterx.betterend.advancements.BECriteria;
|
||||||
import org.betterx.betterend.interfaces.TeleportingEntity;
|
import org.betterx.betterend.interfaces.TeleportingEntity;
|
||||||
import org.betterx.betterend.registry.EndParticles;
|
import org.betterx.betterend.registry.EndParticles;
|
||||||
import org.betterx.betterend.registry.EndPortals;
|
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);
|
ServerLevel destination = isInEnd ? targetWorld : server.getLevel(Level.END);
|
||||||
BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity);
|
BlockPos exitPos = findExitPos(currentWorld, destination, pos, entity);
|
||||||
if (exitPos == null) return;
|
if (exitPos == null) return;
|
||||||
if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) {
|
if (entity instanceof ServerPlayer sp && sp.isCreative()) {
|
||||||
((ServerPlayer) entity).teleportTo(
|
((ServerPlayer) entity).teleportTo(
|
||||||
destination,
|
destination,
|
||||||
exitPos.getX() + 0.5,
|
exitPos.getX() + 0.5,
|
||||||
|
@ -122,7 +123,11 @@ public class EndPortalBlock extends NetherPortalBlock implements RenderLayerProv
|
||||||
entity.getYRot(),
|
entity.getYRot(),
|
||||||
entity.getXRot()
|
entity.getXRot()
|
||||||
);
|
);
|
||||||
|
BECriteria.PORTAL_TRAVEL.trigger(sp);
|
||||||
} else {
|
} else {
|
||||||
|
if (entity instanceof ServerPlayer sp) {
|
||||||
|
BECriteria.PORTAL_TRAVEL.trigger(sp);
|
||||||
|
}
|
||||||
((TeleportingEntity) entity).be_setExitPos(exitPos);
|
((TeleportingEntity) entity).be_setExitPos(exitPos);
|
||||||
Optional<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination));
|
Optional<Entity> teleported = Optional.ofNullable(entity.changeDimension(destination));
|
||||||
teleported.ifPresent(Entity::setPortalCooldown);
|
teleported.ifPresent(Entity::setPortalCooldown);
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class EternalPedestal extends PedestalBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkRitual(Level world, BlockPos pos) {
|
public void checkRitual(Level world, Player player, BlockPos pos) {
|
||||||
BlockEntity blockEntity = world.getBlockEntity(pos);
|
BlockEntity blockEntity = world.getBlockEntity(pos);
|
||||||
if (blockEntity instanceof EternalPedestalEntity) {
|
if (blockEntity instanceof EternalPedestalEntity) {
|
||||||
EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity;
|
EternalPedestalEntity pedestal = (EternalPedestalEntity) blockEntity;
|
||||||
|
@ -64,10 +64,10 @@ public class EternalPedestal extends PedestalBlock {
|
||||||
if (EndPortals.isAvailableItem(id)) {
|
if (EndPortals.isAvailableItem(id)) {
|
||||||
world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true));
|
world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true));
|
||||||
if (pedestal.hasRitual()) {
|
if (pedestal.hasRitual()) {
|
||||||
pedestal.getRitual().checkStructure();
|
pedestal.getRitual().checkStructure(player);
|
||||||
} else {
|
} else {
|
||||||
EternalRitual ritual = new EternalRitual(world, pos);
|
EternalRitual ritual = new EternalRitual(world, pos);
|
||||||
ritual.checkStructure();
|
ritual.checkStructure(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import org.betterx.betterend.blocks.entities.InfusionPedestalEntity;
|
||||||
import org.betterx.betterend.rituals.InfusionRitual;
|
import org.betterx.betterend.rituals.InfusionRitual;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
@ -30,7 +31,7 @@ public class InfusionPedestal extends PedestalBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void checkRitual(Level world, BlockPos pos) {
|
public void checkRitual(Level world, Player player, BlockPos pos) {
|
||||||
BlockEntity blockEntity = world.getBlockEntity(pos);
|
BlockEntity blockEntity = world.getBlockEntity(pos);
|
||||||
if (blockEntity instanceof InfusionPedestalEntity) {
|
if (blockEntity instanceof InfusionPedestalEntity) {
|
||||||
InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity;
|
InfusionPedestalEntity pedestal = (InfusionPedestalEntity) blockEntity;
|
||||||
|
|
|
@ -118,14 +118,14 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock {
|
||||||
if (itemStack.isEmpty()) return InteractionResult.CONSUME;
|
if (itemStack.isEmpty()) return InteractionResult.CONSUME;
|
||||||
pedestal.setItem(0, itemStack);
|
pedestal.setItem(0, itemStack);
|
||||||
level.blockEntityChanged(pos);
|
level.blockEntityChanged(pos);
|
||||||
checkRitual(level, pos);
|
checkRitual(level, player, pos);
|
||||||
return InteractionResult.sidedSuccess(level.isClientSide());
|
return InteractionResult.sidedSuccess(level.isClientSide());
|
||||||
} else {
|
} else {
|
||||||
ItemStack itemStack = pedestal.getItem(0);
|
ItemStack itemStack = pedestal.getItem(0);
|
||||||
if (player.addItem(itemStack)) {
|
if (player.addItem(itemStack)) {
|
||||||
pedestal.removeItemNoUpdate(0);
|
pedestal.removeItemNoUpdate(0);
|
||||||
level.blockEntityChanged(pos);
|
level.blockEntityChanged(pos);
|
||||||
checkRitual(level, pos);
|
checkRitual(level, player, pos);
|
||||||
return InteractionResult.sidedSuccess(level.isClientSide());
|
return InteractionResult.sidedSuccess(level.isClientSide());
|
||||||
}
|
}
|
||||||
return InteractionResult.FAIL;
|
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();
|
MutableBlockPos posMutable = new MutableBlockPos();
|
||||||
for (Point point : InfusionRitual.getMap()) {
|
for (Point point : InfusionRitual.getMap()) {
|
||||||
posMutable.set(pos).move(point.x, 0, point.y);
|
posMutable.set(pos).move(point.x, 0, point.y);
|
||||||
BlockState state = world.getBlockState(posMutable);
|
BlockState state = world.getBlockState(posMutable);
|
||||||
if (state.getBlock() instanceof InfusionPedestal) {
|
if (state.getBlock() instanceof InfusionPedestal) {
|
||||||
((InfusionPedestal) state.getBlock()).checkRitual(world, posMutable);
|
((InfusionPedestal) state.getBlock()).checkRitual(world, player, posMutable);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package org.betterx.betterend.rituals;
|
||||||
|
|
||||||
import org.betterx.bclib.blocks.BlockProperties;
|
import org.betterx.bclib.blocks.BlockProperties;
|
||||||
import org.betterx.betterend.BetterEnd;
|
import org.betterx.betterend.BetterEnd;
|
||||||
|
import org.betterx.betterend.advancements.BECriteria;
|
||||||
import org.betterx.betterend.blocks.EndPortalBlock;
|
import org.betterx.betterend.blocks.EndPortalBlock;
|
||||||
import org.betterx.betterend.blocks.RunedFlavolite;
|
import org.betterx.betterend.blocks.RunedFlavolite;
|
||||||
import org.betterx.betterend.blocks.entities.EternalPedestalEntity;
|
import org.betterx.betterend.blocks.entities.EternalPedestalEntity;
|
||||||
|
@ -21,9 +22,11 @@ import net.minecraft.nbt.NbtUtils;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.sounds.SoundEvents;
|
import net.minecraft.sounds.SoundEvents;
|
||||||
import net.minecraft.sounds.SoundSource;
|
import net.minecraft.sounds.SoundSource;
|
||||||
import net.minecraft.world.entity.ai.village.poi.PoiManager;
|
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.item.Item;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
@ -130,7 +133,7 @@ public class EternalRitual {
|
||||||
return world == null || world.isClientSide() || center == null || axis == null;
|
return world == null || world.isClientSide() || center == null || axis == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkStructure() {
|
public void checkStructure(Player player) {
|
||||||
if (isInvalid()) return;
|
if (isInvalid()) return;
|
||||||
Direction moveX, moveY;
|
Direction moveX, moveY;
|
||||||
if (Direction.Axis.X == axis) {
|
if (Direction.Axis.X == axis) {
|
||||||
|
@ -160,6 +163,9 @@ public class EternalRitual {
|
||||||
}
|
}
|
||||||
if (valid && item != null) {
|
if (valid && item != null) {
|
||||||
activatePortal(item);
|
activatePortal(item);
|
||||||
|
if (player instanceof ServerPlayer sp) {
|
||||||
|
BECriteria.PORTAL_ON.trigger(sp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -642,5 +642,13 @@
|
||||||
"betterend.infusion.south": "Südlicher Sockel",
|
"betterend.infusion.south": "Südlicher Sockel",
|
||||||
"betterend.infusion.south_east": "Südöstlicher Sockel",
|
"betterend.infusion.south_east": "Südöstlicher Sockel",
|
||||||
"betterend.infusion.east": "Ö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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -840,5 +840,15 @@
|
||||||
"betterend.infusion.south": "Southern Pedestal",
|
"betterend.infusion.south": "Southern Pedestal",
|
||||||
"betterend.infusion.south_east": "South-East Pedestal",
|
"betterend.infusion.south_east": "South-East Pedestal",
|
||||||
"betterend.infusion.east": "Eastern 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"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue