Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement costModifiers option, remove legacy xp cost options #784

Merged
merged 9 commits into from
Dec 25, 2023
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
import com.mojang.datafixers.util.Either;
import net.blay09.mods.balm.api.Balm;
import net.blay09.mods.waystones.api.*;
import net.blay09.mods.waystones.api.cost.*;
import net.blay09.mods.waystones.block.ModBlocks;
import net.blay09.mods.waystones.block.WaystoneBlock;
import net.blay09.mods.waystones.config.WaystonesConfig;
import net.blay09.mods.waystones.config.WaystonesConfigData;
import net.blay09.mods.waystones.core.*;
import net.blay09.mods.waystones.cost.CostContextImpl;
import net.blay09.mods.waystones.cost.CostRegistry;
import net.blay09.mods.waystones.cost.NoCost;
import net.blay09.mods.waystones.item.ModItems;
import net.minecraft.core.BlockPos;
import net.minecraft.server.MinecraftServer;
Expand Down Expand Up @@ -41,7 +45,7 @@ public Either<IWaystoneTeleportContext, WaystoneTeleportError> createDefaultTele
context.setCooldown(PlayerWaystoneManager.getCooldownPeriod(warpMode, waystone));

// Use the context so far to determine the xp cost
context.setExperienceCost(WaystoneTeleportManager.getExperienceLevelCost(context));
context.setExperienceCost(calculateCost(context));
});
}

Expand Down Expand Up @@ -69,7 +73,7 @@ public Either<IWaystoneTeleportContext, WaystoneTeleportError> createCustomTelep
}

@Override
public Either<List<Entity>, WaystoneTeleportError> tryTeleportToWaystone(Entity entity, IWaystone waystone, WarpMode warpMode, IWaystone fromWaystone) {
public Either<List<Entity>, WaystoneTeleportError> tryTeleportToWaystone(Entity entity, IWaystone waystone, WarpMode warpMode, @Nullable IWaystone fromWaystone) {
return WaystoneTeleportManager.tryTeleportToWaystone(entity, waystone, warpMode, fromWaystone);
}

Expand Down Expand Up @@ -148,4 +152,44 @@ public void setBoundWaystone(ItemStack itemStack, @Nullable IWaystone waystone)
attunementItem.setWaystoneAttunedTo(itemStack, waystone);
}
}

@Override
public Cost calculateCost(IWaystoneTeleportContext context) {
if (!WaystonesConfig.getActive().costs.enableCosts) {
return NoCost.INSTANCE;
}

final var costContext = new CostContextImpl(context);
final var configuredModifiers = WaystonesConfig.getActive().costs.costModifiers;
for (final var modifier : configuredModifiers) {
CostRegistry.deserializeModifier(modifier).ifPresent(costContext::apply);
}

return costContext.resolve();
}

@Override
public void registerCostType(CostType<?> costType) {
CostRegistry.register(costType);
}

@Override
public void registerCostModifier(CostModifier<?, ?> costModifier) {
CostRegistry.register(costModifier);
}

@Override
public void registerCostVariableResolver(CostVariableResolver costVariableResolver) {
CostRegistry.register(costVariableResolver);
}

@Override
public void registerCostConditionPredicate(CostConditionResolver costConditionResolver) {
CostRegistry.register(costConditionResolver);
}

@Override
public void registerCostParameterSerializer(CostParameterSerializer<?> costParameterSerializer) {
CostRegistry.register(costParameterSerializer);
}
}
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

This file was deleted.

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,12 +1,14 @@
package net.blay09.mods.waystones.api;

import net.blay09.mods.waystones.api.cost.Cost;
import net.blay09.mods.waystones.core.WarpMode;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Optional;

public interface IWaystoneTeleportContext {
Entity getEntity();
Expand All @@ -23,7 +25,7 @@ public interface IWaystoneTeleportContext {

void addAdditionalEntity(Entity additionalEntity);

@Nullable IWaystone getFromWaystone();
Optional<IWaystone> getFromWaystone();

void setFromWaystone(@Nullable IWaystone fromWaystone);

Expand All @@ -33,9 +35,9 @@ public interface IWaystoneTeleportContext {

boolean isDimensionalTeleport();

ExperienceCost getExperienceCost();
Cost getExperienceCost();

void setExperienceCost(ExperienceCost experienceCost);
void setExperienceCost(Cost cost);

void setCooldown(int cooldown);

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

import com.mojang.datafixers.util.Either;
import net.blay09.mods.waystones.api.cost.*;
import net.blay09.mods.waystones.core.WarpMode;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
Expand Down Expand Up @@ -45,4 +46,16 @@ public interface InternalMethods {
Optional<IWaystone> getBoundWaystone(Player player, ItemStack itemStack);

void setBoundWaystone(ItemStack itemStack, @Nullable IWaystone waystone);

Cost calculateCost(IWaystoneTeleportContext context);

void registerCostType(CostType<?> costType);

void registerCostModifier(CostModifier<?, ?> costModifier);

void registerCostVariableResolver(CostVariableResolver costVariableResolver);

void registerCostConditionPredicate(CostConditionResolver costConditionResolver);

void registerCostParameterSerializer(CostParameterSerializer<?> costParameterSerializer);
}
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
@@ -1,6 +1,7 @@
package net.blay09.mods.waystones.api;

import net.blay09.mods.balm.api.event.BalmEvent;
import net.blay09.mods.waystones.api.cost.Cost;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
Expand All @@ -23,12 +24,12 @@ public IWaystoneTeleportContext getContext() {
return context;
}

public ExperienceCost getExperienceCost() {
public Cost getExperienceCost() {
return context.getExperienceCost();
}

public void setExperienceCost(ExperienceCost experienceCost) {
context.setExperienceCost(experienceCost);
public void setExperienceCost(Cost cost) {
context.setExperienceCost(cost);
}

public int getCooldown() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.blay09.mods.waystones.api;

import com.mojang.datafixers.util.Either;
import net.blay09.mods.waystones.api.cost.*;
import net.blay09.mods.waystones.core.WarpMode;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
Expand Down Expand Up @@ -81,4 +82,29 @@ public static ItemStack createAttunedShard(IWaystone warpPlate) {
public static ItemStack createBoundScroll(IWaystone waystone) {
return __internalMethods.createBoundScroll(waystone);
}

public static Cost calculateCost(IWaystoneTeleportContext context) {
return __internalMethods.calculateCost(context);
}

public static void registerCostType(CostType<?> costType) {
__internalMethods.registerCostType(costType);
}

public static void registerCostModifier(CostModifier<?, ?> costModifier) {
__internalMethods.registerCostModifier(costModifier);
}

public static void registerCostVariableResolver(CostVariableResolver costVariableResolver) {
__internalMethods.registerCostVariableResolver(costVariableResolver);
}

public static void registerCostConditionPredicate(CostConditionResolver costConditionResolver) {
__internalMethods.registerCostConditionPredicate(costConditionResolver);
}

public static void registerCostParameterSerializer(CostParameterSerializer<?> costParameterSerializer) {
__internalMethods.registerCostParameterSerializer(costParameterSerializer);
}

}
21 changes: 21 additions & 0 deletions shared/src/main/java/net/blay09/mods/waystones/api/cost/Cost.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package net.blay09.mods.waystones.api.cost;

import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;

import java.util.List;

public interface Cost {
boolean canAfford(Player player);

void consume(Player player);

void rollback(Player player);

int getNumericalCost(Player player);

void appendHoverText(Player player, List<Component> tooltip);

boolean isEmpty();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package net.blay09.mods.waystones.api.cost;

import net.blay09.mods.waystones.api.IWaystoneTeleportContext;
import net.minecraft.resources.ResourceLocation;

public interface CostConditionResolver {
ResourceLocation getId();
boolean matches(IWaystoneTeleportContext context);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package net.blay09.mods.waystones.api.cost;

import net.minecraft.resources.ResourceLocation;

public interface CostContext {
boolean matchesCondition(ResourceLocation id);

float getContextValue(ResourceLocation id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.blay09.mods.waystones.api.cost;

import net.minecraft.resources.ResourceLocation;

public interface CostModifier<TCost extends Cost, TParameter> extends CostModifierFunction<TCost, TParameter> {
ResourceLocation getId();

ResourceLocation getCostType();

Class<TParameter> getParameterType();
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.blay09.mods.waystones.api.cost;

public interface CostModifierFunction<TCost, TParameter> {
TCost apply(TCost costInstance, CostContext context, TParameter parameters);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package net.blay09.mods.waystones.api.cost;

public interface CostParameterSerializer<T> {
Class<T> getType();
T deserialize(String value);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package net.blay09.mods.waystones.api.cost;

import net.minecraft.resources.ResourceLocation;

public interface CostType<T extends Cost> {
ResourceLocation getId();
T createInstance();
}
Loading