Skip to content

Commit

Permalink
refactor!: Implement new cost modifier xp costs
Browse files Browse the repository at this point in the history
  • Loading branch information
BlayTheNinth committed Dec 25, 2023
1 parent f32b95f commit d1908b9
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public ModItemTagProvider(FabricDataOutput output, CompletableFuture<HolderLooku

@Override
protected void addTags(HolderLookup.Provider lookup) {
getOrCreateTagBuilder(ModItemTags.SCROLLS).add(ModItems.warpScroll, ModItems.returnScroll, ModItems.boundScroll);
getOrCreateTagBuilder(ModItemTags.WARP_SCROLLS).add(ModItems.warpScroll);
getOrCreateTagBuilder(ModItemTags.RETURN_SCROLLS).add(ModItems.returnScroll);
getOrCreateTagBuilder(ModItemTags.BOUND_SCROLLS).add(ModItems.boundScroll);
Expand Down
2 changes: 2 additions & 0 deletions shared/src/main/java/net/blay09/mods/waystones/Waystones.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.blay09.mods.waystones.block.entity.ModBlockEntities;
import net.blay09.mods.waystones.command.ModCommands;
import net.blay09.mods.waystones.config.WaystonesConfig;
import net.blay09.mods.waystones.cost.CostRegistry;
import net.blay09.mods.waystones.handler.ModEventHandlers;
import net.blay09.mods.waystones.item.ModItems;
import net.blay09.mods.waystones.menu.ModMenus;
Expand All @@ -24,6 +25,7 @@ public class Waystones {

public static void initialize() {
WaystonesAPI.__internalMethods = new InternalMethodsImpl();
CostRegistry.registerDefaults();

WaystonesConfig.initialize();
ModStats.initialize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ default boolean isValidInLevel(ServerLevel level) {
return false;
}

default TeleportDestination resolveDestination(ServerLevel level) {
default TeleportDestination resolveDestination(Level level) {
return new TeleportDestination(level, getPos().getCenter(), Direction.NORTH);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,8 @@
package net.blay09.mods.waystones.api;

import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;

public class TeleportDestination {
private final ServerLevel level;
private final Vec3 location;
private final Direction direction;

public TeleportDestination(ServerLevel level, Vec3 location, Direction direction) {
this.level = level;
this.location = location;
this.direction = direction;
}

public ServerLevel getLevel() {
return level;
}

public Vec3 getLocation() {
return location;
}

public Direction getDirection() {
return direction;
}
public record TeleportDestination(Level level, Vec3 location, Direction direction) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@ public static class Costs {
public boolean enableCosts = true;

@Synced
@ExpectedType(String.class)
@Comment("")
public List<String> 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)");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Direction> directionCandidates = Lists.newArrayList(direction, Direction.EAST, Direction.WEST, Direction.SOUTH, Direction.NORTH);
for (Direction candidate : directionCandidates) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public boolean isValidInLevel(ServerLevel level) {
}

@Override
public TeleportDestination resolveDestination(ServerLevel level) {
public TeleportDestination resolveDestination(Level level) {
return getBackingWaystone().resolveDestination(level);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand All @@ -60,8 +59,8 @@ public static List<Entity> 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) {
Expand All @@ -85,9 +84,9 @@ private static List<Entity> teleportEntityAndAttached(Entity entity, IWaystoneTe
final var teleportedEntities = new ArrayList<Entity>();

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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -13,6 +18,8 @@

public class CostRegistry {

private static final Logger logger = LoggerFactory.getLogger(CostRegistry.class);

private static final Map<ResourceLocation, CostType<?>> costTypes = new HashMap<>();
private static final Map<ResourceLocation, CostModifier<?, ?>> costModifiers = new HashMap<>();
private static final Map<Class<?>, CostParameterSerializer<?>> costParameterSerializers = new HashMap<>();
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -159,8 +183,13 @@ public static <T extends Cost, P> Optional<Pair<CostModifier<T, P>, 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) {
Expand Down Expand Up @@ -190,7 +219,7 @@ public static <T> T deserializeParameterList(Class<T> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.world.item.Item;

public class ModItemTags {
public static final TagKey<Item> SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "scrolls"));
public static final TagKey<Item> BOUND_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "bound_scrolls"));
public static final TagKey<Item> RETURN_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "return_scrolls"));
public static final TagKey<Item> WARP_SCROLLS = TagKey.create(Registries.ITEM, new ResourceLocation(Waystones.MOD_ID, "warp_scrolls"));
Expand Down

0 comments on commit d1908b9

Please sign in to comment.