Skip to content

Commit

Permalink
Add config option to restrict /tpa to a specific dimension
Browse files Browse the repository at this point in the history
Closes #60.
  • Loading branch information
Gegy committed Oct 31, 2023
1 parent 6340782 commit 66d7b8b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
25 changes: 20 additions & 5 deletions src/main/java/com/lovetropics/extras/ExtrasConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,24 @@ public class ExtrasConfig {
private static final Builder COMMON_BUILDER = new Builder();
private static final Builder CLIENT_BUILDER = new Builder();

public static final CategoryCommands COMMANDS = new CategoryCommands();
public static final CategoryTranslation TRANSLATION = new CategoryTranslation();
public static final CategoryTechStack TECH_STACK = new CategoryTechStack();

public static final class CategoryCommands {
public final ConfigValue<String> tpaDimension;

private CategoryCommands() {
COMMON_BUILDER.comment("Commands").push("commands");

tpaDimension = COMMON_BUILDER
.comment("If not blank, the /tpa command will only be allowed in this dimension")
.define("tpaDimension", "tropicraft:tropics");

COMMON_BUILDER.pop();
}
}

public static final class CategoryTranslation {
public final ConfigValue<Boolean> translateOutgoing;
public final ConfigValue<Boolean> translateIncoming;
Expand Down Expand Up @@ -68,10 +83,10 @@ private CategoryTechStack() {
public static final ForgeConfigSpec CLIENT_CONFIG = CLIENT_BUILDER.build();

@SubscribeEvent
public static void configLoad(final ModConfigEvent.Loading event) {
}
public static void configLoad(final ModConfigEvent.Loading event) {
}

@SubscribeEvent
public static void configReload(final ModConfigEvent.Reloading event) {
}
@SubscribeEvent
public static void configReload(final ModConfigEvent.Reloading event) {
}
}
30 changes: 26 additions & 4 deletions src/main/java/com/lovetropics/extras/command/TpCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.lovetropics.extras.ExtrasConfig;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
Expand All @@ -12,16 +13,21 @@
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.core.GlobalPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.Level;

import java.time.Duration;
import java.util.Map;
import java.util.UUID;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static net.minecraft.commands.Commands.argument;
Expand All @@ -36,6 +42,7 @@ public class TpCommand {
private static final SimpleCommandExceptionType TOO_MUCH = new SimpleCommandExceptionType(Component.translatable("commands.tpa.too_much"));
private static final SimpleCommandExceptionType ALREADY_PENDING = new SimpleCommandExceptionType(Component.translatable("commands.tpa.pending_request_exists"));
private static final SimpleCommandExceptionType NO_SELF_TELEPORT = new SimpleCommandExceptionType(Component.translatable("commands.tpa.no_self_teleport"));
private static final SimpleCommandExceptionType NOT_ALLOWED_HERE = new SimpleCommandExceptionType(Component.translatable("commands.tpa.not_allowed_here"));

private static final int REQUEST_CACHE_SIZE = 50;
private static final Duration REQUEST_TIMEOUT_DURATION = Duration.ofMinutes(1);
Expand Down Expand Up @@ -91,9 +98,9 @@ private static int tpBack(final CommandContext<CommandSourceStack> ctx) throws C

final ServerPlayer executingPlayer = ctx.getSource().getPlayerOrException();
final GlobalPos newBackPos = GlobalPos.of(executingPlayer.level().dimension(), executingPlayer.blockPosition());
doTeleport(executingPlayer, globalPos);
backCache.put(executingPlayer.getUUID(), newBackPos); //This allows going back and forth using /back

doTeleport(executingPlayer, globalPos);
return Command.SINGLE_SUCCESS;
}

Expand Down Expand Up @@ -154,16 +161,30 @@ private static void teleportAndSendMessage(ServerPlayer player, ServerPlayer tar
final GlobalPos globalPos = GlobalPos.of(player.level().dimension(), player.blockPosition());
backCache.put(player.getUUID(), globalPos);

player.sendSystemMessage(Component.translatable("commands.tpa.tp_accepted", target.getName().getString()));

doTeleport(player, GlobalPos.of(target.level().dimension(), target.blockPosition()));
player.sendSystemMessage(Component.translatable("commands.tpa.tp_accepted", target.getName().getString()));
}

private static void doTeleport(ServerPlayer player, GlobalPos globalPos) {
private static void doTeleport(ServerPlayer player, GlobalPos globalPos) throws CommandSyntaxException {
final Predicate<ResourceKey<Level>> dimensionPredicate = dimensionPredicate();
if (!dimensionPredicate.test(player.serverLevel().dimension()) || !dimensionPredicate.test(globalPos.dimension())) {
throw NOT_ALLOWED_HERE.create();
}

final ServerLevel level = player.getServer().getLevel(globalPos.dimension());
player.teleportTo(level, globalPos.pos().getX(), globalPos.pos().getY(), globalPos.pos().getZ(), player.getYRot(), player.getXRot());
}

private static Predicate<ResourceKey<Level>> dimensionPredicate() {
final String string = ExtrasConfig.COMMANDS.tpaDimension.get();
final ResourceLocation id = ResourceLocation.tryParse(string);
if (string.isBlank() || id == null) {
return level -> true;
}
final ResourceKey<Level> key = ResourceKey.create(Registries.DIMENSION, id);
return dimension -> dimension == key;
}

private static void spamCheck(UUID requester) throws CommandSyntaxException {
if (requestCache.getIfPresent(requester) != null) {
throw ALREADY_PENDING.create();
Expand Down Expand Up @@ -192,5 +213,6 @@ public static void addTranslations(final RegistrateLangProvider provider) {
provider.add("commands.tpa.help.back", "/back - Teleport back to where you were before teleporting");
provider.add("commands.tpa.pending_request_exists", "A request is still pending");
provider.add("commands.tpa.no_self_teleport", "You can't teleport to yourself");
provider.add("commands.tpa.not_allowed_here", "Teleporting is not allowed here");
}
}

0 comments on commit 66d7b8b

Please sign in to comment.