From d1908b90aa68c9ba92c083bc869064c24f372cbd Mon Sep 17 00:00:00 2001 From: BlayTheNinth <1933180+BlayTheNinth@users.noreply.github.com> Date: Mon, 25 Dec 2023 08:55:33 +0100 Subject: [PATCH] refactor!: Implement new cost modifier xp costs --- .../waystones/datagen/ModItemTagProvider.java | 1 + .../net/blay09/mods/waystones/Waystones.java | 2 + .../blay09/mods/waystones/api/IWaystone.java | 2 +- .../waystones/api/TeleportDestination.java | 25 +------------ .../waystones/config/WaystonesConfigData.java | 3 +- .../blay09/mods/waystones/core/Waystone.java | 4 +- .../mods/waystones/core/WaystoneProxy.java | 2 +- .../core/WaystoneTeleportManager.java | 13 +++---- .../mods/waystones/cost/CostRegistry.java | 37 +++++++++++++++++-- .../mods/waystones/tag/ModItemTags.java | 1 + 10 files changed, 51 insertions(+), 39 deletions(-) diff --git a/fabric/src/main/java/net/blay09/mods/waystones/datagen/ModItemTagProvider.java b/fabric/src/main/java/net/blay09/mods/waystones/datagen/ModItemTagProvider.java index ad645a49..9bd9ccc5 100644 --- a/fabric/src/main/java/net/blay09/mods/waystones/datagen/ModItemTagProvider.java +++ b/fabric/src/main/java/net/blay09/mods/waystones/datagen/ModItemTagProvider.java @@ -19,6 +19,7 @@ public ModItemTagProvider(FabricDataOutput output, CompletableFuture costModifiers = List.of( "scaled_add_xp(distance, 0.01)", "conditional_multiply_xp(source_is_warp_plate, 0)", - "conditional_multiply_xp(target_is_global_waystone, 0)", + "conditional_multiply_xp(target_is_global, 0)", "conditional_add_xp(is_interdimensional, 27)", "min_xp(0)", "max_xp(27)"); diff --git a/shared/src/main/java/net/blay09/mods/waystones/core/Waystone.java b/shared/src/main/java/net/blay09/mods/waystones/core/Waystone.java index 2eed2687..5976f6ac 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/core/Waystone.java +++ b/shared/src/main/java/net/blay09/mods/waystones/core/Waystone.java @@ -135,9 +135,9 @@ public boolean isValidInLevel(ServerLevel level) { } @Override - public TeleportDestination resolveDestination(ServerLevel level) { + public TeleportDestination resolveDestination(Level level) { BlockState state = level.getBlockState(pos); - Direction direction = state.getValue(WaystoneBlock.FACING); + Direction direction = state.hasProperty(WaystoneBlock.FACING) ? state.getValue(WaystoneBlock.FACING) : Direction.NORTH; // Use a list to keep order intact - it might check one direction twice, but no one cares List directionCandidates = Lists.newArrayList(direction, Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.NORTH); for (Direction candidate : directionCandidates) { diff --git a/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneProxy.java b/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneProxy.java index 04bd3c53..dd03aff4 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneProxy.java +++ b/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneProxy.java @@ -29,7 +29,7 @@ public boolean isValidInLevel(ServerLevel level) { } @Override - public TeleportDestination resolveDestination(ServerLevel level) { + public TeleportDestination resolveDestination(Level level) { return getBackingWaystone().resolveDestination(level); } diff --git a/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneTeleportManager.java b/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneTeleportManager.java index 7f3c3327..873eaf7b 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneTeleportManager.java +++ b/shared/src/main/java/net/blay09/mods/waystones/core/WaystoneTeleportManager.java @@ -7,8 +7,6 @@ import net.blay09.mods.waystones.block.entity.WarpPlateBlockEntity; import net.blay09.mods.waystones.config.WaystonesConfig; import net.blay09.mods.waystones.network.message.TeleportEffectMessage; -import net.blay09.mods.waystones.xp.ExperienceLevelCost; -import net.blay09.mods.waystones.xp.ExperiencePointsCost; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; @@ -49,6 +47,7 @@ public static Cost predictExperienceLevelCost(Entity player, IWaystone waystone, context.getLeashedEntities().addAll(WaystoneTeleportManager.findLeashedAnimals(player)); context.setFromWaystone(fromWaystone); context.setWarpMode(warpMode); + context.setDestination(waystone.resolveDestination(player.level())); return WaystonesAPI.calculateCost(context); } @@ -60,8 +59,8 @@ public static List doTeleport(IWaystoneTeleportContext context) { BlockPos sourcePos = context.getEntity().blockPosition(); final var destination = context.getDestination(); - final var targetLevel = destination.getLevel(); - final var targetPos = BlockPos.containing(destination.getLocation()); + final var targetLevel = (ServerLevel) destination.level(); + final var targetPos = BlockPos.containing(destination.location()); BlockEntity targetTileEntity = targetLevel.getBlockEntity(targetPos); if (targetTileEntity instanceof WarpPlateBlockEntity warpPlate) { @@ -85,9 +84,9 @@ private static List teleportEntityAndAttached(Entity entity, IWaystoneTe final var teleportedEntities = new ArrayList(); final var destination = context.getDestination(); - final var targetLevel = destination.getLevel(); - final var targetLocation = destination.getLocation(); - final var targetDirection = destination.getDirection(); + final var targetLevel = (ServerLevel) destination.level(); + final var targetLocation = destination.location(); + final var targetDirection = destination.direction(); final var mount = entity.getVehicle(); Entity teleportedMount = null; diff --git a/shared/src/main/java/net/blay09/mods/waystones/cost/CostRegistry.java b/shared/src/main/java/net/blay09/mods/waystones/cost/CostRegistry.java index d8a8646b..5b8f7038 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/cost/CostRegistry.java +++ b/shared/src/main/java/net/blay09/mods/waystones/cost/CostRegistry.java @@ -3,8 +3,13 @@ import com.mojang.datafixers.util.Pair; import net.blay09.mods.waystones.api.IWaystoneTeleportContext; import net.blay09.mods.waystones.api.WaystoneTypes; +import net.blay09.mods.waystones.api.WaystoneVisibility; import net.blay09.mods.waystones.api.cost.*; +import net.blay09.mods.waystones.core.WarpMode; +import net.blay09.mods.waystones.tag.ModItemTags; import net.minecraft.resources.ResourceLocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; @@ -13,6 +18,8 @@ public class CostRegistry { + private static final Logger logger = LoggerFactory.getLogger(CostRegistry.class); + private static final Map> costTypes = new HashMap<>(); private static final Map> costModifiers = new HashMap<>(); private static final Map, CostParameterSerializer> costParameterSerializers = new HashMap<>(); @@ -122,7 +129,24 @@ public static void registerDefaults() { registerConditionResolver("is_interdimensional", IWaystoneTeleportContext::isDimensionalTeleport); registerConditionResolver("source_is_warp_plate", it -> it.getFromWaystone().map(waystone -> waystone.getWaystoneType().equals(WaystoneTypes.WARP_PLATE)).orElse(false)); - registerVariableResolver("distance", it -> (float) Math.sqrt(it.getEntity().distanceToSqr(it.getDestination().getLocation()))); + registerConditionResolver("source_is_portstone", + it -> it.getFromWaystone().map(waystone -> waystone.getWaystoneType().equals(WaystoneTypes.PORTSTONE)).orElse(false)); + registerConditionResolver("source_is_waystone", + it -> it.getFromWaystone().map(waystone -> waystone.getWaystoneType().equals(WaystoneTypes.WAYSTONE)).orElse(false)); + registerConditionResolver("source_is_sharestone", + it -> it.getFromWaystone().map(waystone -> WaystoneTypes.isSharestone(waystone.getWaystoneType())).orElse(false)); + registerConditionResolver("source_is_inventory_button", it -> it.getWarpMode() == WarpMode.INVENTORY_BUTTON); + registerConditionResolver("source_is_scroll", it -> it.getWarpItem().is(ModItemTags.SCROLLS)); + registerConditionResolver("source_is_bound_scroll", it -> it.getWarpItem().is(ModItemTags.BOUND_SCROLLS)); + registerConditionResolver("source_is_return_scroll", it -> it.getWarpItem().is(ModItemTags.RETURN_SCROLLS)); + registerConditionResolver("source_is_warp_scroll", it -> it.getWarpItem().is(ModItemTags.WARP_SCROLLS)); + registerConditionResolver("source_is_warp_stone", it -> it.getWarpItem().is(ModItemTags.WARP_STONES)); + registerConditionResolver("target_is_warp_plate", it -> it.getTargetWaystone().getWaystoneType().equals(WaystoneTypes.WARP_PLATE)); + registerConditionResolver("target_is_global", it -> it.getTargetWaystone().getVisibility() == WaystoneVisibility.GLOBAL); + registerConditionResolver("target_is_sharestone", it -> WaystoneTypes.isSharestone(it.getTargetWaystone().getWaystoneType())); + registerConditionResolver("target_is_waystone", it -> it.getTargetWaystone().getWaystoneType().equals(WaystoneTypes.WAYSTONE)); + registerConditionResolver("target_is_landing_stone", it -> it.getTargetWaystone().getWaystoneType().equals(WaystoneTypes.LANDING_STONE)); + registerVariableResolver("distance", it -> (float) Math.sqrt(it.getEntity().distanceToSqr(it.getDestination().location()))); } public static void register(CostType costType) { @@ -159,8 +183,13 @@ public static Optional, P>> deserial return Optional.empty(); } - final var parameters = deserializeParameterList(costModifier.getParameterType(), parameterString); - return Optional.of(Pair.of(costModifier, parameters)); + try { + final var parameters = deserializeParameter(costModifier.getParameterType(), parameterString); + return Optional.of(Pair.of(costModifier, parameters)); + } catch (Exception e) { + logger.error("Failed to process waystone cost", e); + return Optional.empty(); + } } private static ResourceLocation waystonesResourceLocation(String value) { @@ -190,7 +219,7 @@ public static T deserializeParameterList(Class type, String commaSeparate final var parameterValues = new Object[parameters.length]; for (int i = 0; i < parameters.length; i++) { - parameterValues[i] = deserializeParameter(parameterTypes[i], parameters[i]); + parameterValues[i] = deserializeParameter(parameterTypes[i], parameters[i].trim()); } try { diff --git a/shared/src/main/java/net/blay09/mods/waystones/tag/ModItemTags.java b/shared/src/main/java/net/blay09/mods/waystones/tag/ModItemTags.java index bc8d578b..3c0e167c 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/tag/ModItemTags.java +++ b/shared/src/main/java/net/blay09/mods/waystones/tag/ModItemTags.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.Item; public class ModItemTags { + public static final TagKey SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "scrolls")); public static final TagKey BOUND_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "bound_scrolls")); public static final TagKey RETURN_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "return_scrolls")); public static final TagKey WARP_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "warp_scrolls"));