diff --git a/build.gradle b/build.gradle index 75c89f1..79ea6c9 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,10 @@ allprojects { repositories { mavenLocal() + maven { + name "ftbMavenReleases" + url "https://maven.ftb.dev/releases" + } maven { url "https://maven.architectury.dev/" content { @@ -105,7 +109,7 @@ publishMods { def createOptions = (String projectName) -> { publishOptions { - file = project.provider { project(":$projectName").tasks.remapJar }.flatMap { it.archiveFile } + file = project.provider { project(":$projectName").tasks.remapJar }.flatMap { it.archiveFile } as Provider displayName = "[${projectName.toUpperCase()}][${minecraft_version}] ${readable_name} ${mod_version}" modLoaders.add(projectName.toLowerCase()) } diff --git a/common/src/main/java/dev/ftb/mods/ftbessentials/commands/groups/TeleportingCommands.java b/common/src/main/java/dev/ftb/mods/ftbessentials/commands/groups/TeleportingCommands.java index 3bb6002..44ed495 100644 --- a/common/src/main/java/dev/ftb/mods/ftbessentials/commands/groups/TeleportingCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftbessentials/commands/groups/TeleportingCommands.java @@ -1,11 +1,9 @@ package dev.ftb.mods.ftbessentials.commands.groups; import com.mojang.authlib.GameProfile; -import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import dev.architectury.event.EventResult; -import dev.architectury.platform.Platform; import dev.ftb.mods.ftbessentials.FTBEssentials; import dev.ftb.mods.ftbessentials.FTBEssentialsEvents; import dev.ftb.mods.ftbessentials.commands.CommandUtils; @@ -17,7 +15,6 @@ import dev.ftb.mods.ftbessentials.commands.impl.teleporting.TPACommand; import dev.ftb.mods.ftbessentials.commands.impl.teleporting.WarpCommand; import dev.ftb.mods.ftbessentials.config.FTBEConfig; -import dev.ftb.mods.ftbessentials.integration.TeamBasesIntegration; import dev.ftb.mods.ftbessentials.util.BlockUtil; import dev.ftb.mods.ftbessentials.util.DimensionFilter; import dev.ftb.mods.ftbessentials.util.FTBEPlayerData; @@ -33,6 +30,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.FluidTags; import net.minecraft.tags.TagKey; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; @@ -61,10 +59,6 @@ public class TeleportingCommands { new SimpleConfigurableCommand(FTBEConfig.BACK, Commands.literal("back") .executes(context -> back(context.getSource().getPlayerOrException()))), - // Playerspawn command - new SimpleConfigurableCommand(FTBEConfig.PLAYER_SPAWN, Commands.literal("playerspawn") - .executes(context -> playerSpawn(context.getSource().getPlayerOrException()))), - // Spawn command new SimpleConfigurableCommand(FTBEConfig.SPAWN, Commands.literal("spawn") .executes(context -> spawn(context.getSource().getPlayerOrException()))), @@ -113,31 +107,68 @@ private static int back(ServerPlayer player) { return 0; } - if (data.backTeleporter.teleport(player, serverPlayerEntity -> data.teleportHistory.getLast()).runCommand(player) != 0) { + TeleportPos lastPos = data.teleportHistory.getLast(); + BlockPos targetPos = lastPos.getPos(); + ServerLevel targetLevel = player.server.getLevel(lastPos.getDimension()); + if (targetLevel == null) { + if (data.backTeleporter.teleport(player, serverPlayerEntity -> lastPos).runCommand(player) != 0) { + data.markDirty(); + return 1; + } + return 0; + } + BlockPos safePos = findSafeBackPos(targetLevel, targetPos); + + if (safePos == null) { + player.displayClientMessage(Component.translatable("ftbessentials.teleport.no_safe_position").withStyle(ChatFormatting.RED), false); + return 0; + } + + if (data.backTeleporter.teleport(player, serverPlayerEntity -> new TeleportPos(targetLevel.dimension(), safePos)).runCommand(player) != 0) { data.markDirty(); return 1; } - return 0; }).orElse(0); } - public static int playerSpawn(ServerPlayer player) { - return FTBEPlayerData.getOrCreate(player).map(data -> { - ServerLevel level = player.server.getLevel(player.getRespawnDimension()); - if (level == null) { - return 0; + private static BlockPos findSafeBackPos(ServerLevel world, BlockPos originalPos) { + if (isSafePosition(world, originalPos)) { + return originalPos; + } + for (BlockPos pos : BlockPos.spiralAround(originalPos, 16, Direction.EAST, Direction.SOUTH)) { + if (isSafePosition(world, pos)) { + return pos.immutable(); } - BlockPos pos = Objects.requireNonNullElse(player.getRespawnPosition(), level.getSharedSpawnPos()); - return data.spawnTeleporter.teleport(player, p -> new TeleportPos(level, pos, player.getRespawnAngle(), 0F)).runCommand(player); - }).orElse(0); + } + return null; } - private static int spawn(ServerPlayer player) { - if (FTBEConfig.TEAM_BASES_SPAWN_OVERRIDE.get() && Platform.isModLoaded("ftbteambases")) { - TeamBasesIntegration.sendToLobby(player); - return Command.SINGLE_SUCCESS; + private static boolean isSafePosition(ServerLevel world, BlockPos pos) { + if (pos.getY() < world.getMinBuildHeight() || pos.getY() >= world.getMaxBuildHeight()) { + return false; + } + BlockPos headPos = pos.above(); + BlockPos groundPos = pos.below(); + BlockState groundState = world.getBlockState(groundPos); + if (!groundState.isCollisionShapeFullBlock(world, groundPos) && !groundState.isFaceSturdy(world, groundPos, Direction.UP)) { + + return false; + } + BlockState feetState = world.getBlockState(pos); + if (!feetState.isAir() && !feetState.getCollisionShape(world, pos).isEmpty()) { + return false; + } + BlockState headState = world.getBlockState(headPos); + if (!headState.isAir() && !headState.getCollisionShape(world, headPos).isEmpty()) { + return false; } + + // Check for dangerous fluids + return !(world.getFluidState(pos).is(FluidTags.LAVA) || world.getFluidState(headPos).is(FluidTags.LAVA)); + } + + private static int spawn(ServerPlayer player) { return FTBEPlayerData.getOrCreate(player).map(data -> { ServerLevel level = player.server.getLevel(Level.OVERWORLD); return level == null ? 0 : data.spawnTeleporter.teleport(player, p -> new TeleportPos(level, level.getSharedSpawnPos(), level.getSharedSpawnAngle(), 0F)).runCommand(player); @@ -171,10 +202,11 @@ private static TeleportPos findBlockPos(ServerLevel world, ServerPlayer player, int y = 256; int z = Mth.floor(Math.sin(angle) * dist); BlockPos currentPos = new BlockPos(x, y, z); - + // Check world border if (!world.getWorldBorder().isWithinBounds(currentPos)) { continue; } + // Biome blacklist check if (world.getBiome(currentPos).is(IGNORE_RTP_BIOMES)) { continue; } @@ -185,17 +217,20 @@ private static TeleportPos findBlockPos(ServerLevel world, ServerPlayer player, } world.getChunkAt(currentPos); + // Heightmap check BlockPos hmPos = world.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, currentPos); - if (hmPos.getY() > 0) { BlockPos goodPos = null; - if (hmPos.getY() < world.getLogicalHeight()) { + // Check if the position is in liquid + BlockPos belowPos = hmPos.below(); + if (hmPos.getY() < world.getLogicalHeight() && + !(world.getFluidState(belowPos).is(FluidTags.WATER) || world.getFluidState(belowPos).is(FluidTags.LAVA))) { goodPos = hmPos; } else { // broken heightmap (nether, other mod dimensions) for (BlockPos newPos : BlockPos.spiralAround(new BlockPos(hmPos.getX(), world.getSeaLevel(), hmPos.getZ()), 16, Direction.EAST, Direction.SOUTH)) { BlockState bs = world.getBlockState(newPos); - if (bs.blocksMotion() && !bs.is(IGNORE_RTP_BLOCKS) && world.isEmptyBlock(newPos.above(1)) + if (bs.isCollisionShapeFullBlock(world, newPos) && !bs.is(IGNORE_RTP_BLOCKS) && world.isEmptyBlock(newPos.above(1)) && world.isEmptyBlock(newPos.above(2)) && world.isEmptyBlock(newPos.above(3))) { goodPos = newPos.immutable(); break; @@ -240,7 +275,7 @@ private static int tpx(ServerPlayer player, ServerLevel to) { private static int jump(CommandSourceStack source) throws CommandSyntaxException { ServerPlayer player = source.getPlayerOrException(); - BlockHitResult res = BlockUtil.getFocusedBlock(player, player.getServer().getPlayerList().getViewDistance() * 16) + BlockHitResult res = BlockUtil.getFocusedBlock(player, Objects.requireNonNull(player.getServer()).getPlayerList().getViewDistance() * 16) .orElseThrow(KitCommand.NOT_LOOKING_AT_BLOCK::create); // want to land the player on top of the focused block, so scan up as far as needed BlockPos.MutableBlockPos mPos = res.getBlockPos().above().mutable(); diff --git a/common/src/main/java/dev/ftb/mods/ftbessentials/config/FTBEConfig.java b/common/src/main/java/dev/ftb/mods/ftbessentials/config/FTBEConfig.java index ca8eda8..5df54ea 100644 --- a/common/src/main/java/dev/ftb/mods/ftbessentials/config/FTBEConfig.java +++ b/common/src/main/java/dev/ftb/mods/ftbessentials/config/FTBEConfig.java @@ -65,7 +65,7 @@ public interface FTBEConfig { .comment("Allows players to create requests to teleport to other users on the server,", "as well as requesting other players to teleport to them"); // rtp - TimedCommandConfig RTP = new TimedCommandConfig(TELEPORTATION, "rtp", 600, 0) + TimedCommandConfig RTP = new TimedCommandConfig(TELEPORTATION, "rtp", 420, 0) .comment("Allows players to teleport to a random point in the Wilderness", "Note: This currently does not respect Claimed Chunks yet!"); IntValue RTP_MAX_TRIES = RTP.config.addInt("max_tries", 100).range(1, 1000).comment("Number of tries before /rtp gives up"); diff --git a/common/src/main/java/dev/ftb/mods/ftbessentials/util/TeleportPos.java b/common/src/main/java/dev/ftb/mods/ftbessentials/util/TeleportPos.java index 498ad23..d8c1b2b 100644 --- a/common/src/main/java/dev/ftb/mods/ftbessentials/util/TeleportPos.java +++ b/common/src/main/java/dev/ftb/mods/ftbessentials/util/TeleportPos.java @@ -113,6 +113,9 @@ public String posAsString() { // Normal shortString would be 1, 2, 3 so we remove the commas return pos.toShortString().replaceAll(",", ""); } + public ResourceKey getDimension() { + return dimension; + } @FunctionalInterface public interface TeleportResult { diff --git a/common/src/main/resources/assets/ftbessentials/lang/en_us.json b/common/src/main/resources/assets/ftbessentials/lang/en_us.json index e80a50d..79569c7 100644 --- a/common/src/main/resources/assets/ftbessentials/lang/en_us.json +++ b/common/src/main/resources/assets/ftbessentials/lang/en_us.json @@ -92,5 +92,6 @@ "ftbessentials.teleport.not_to_here": "Teleportation to this dimension is not allowed!", "ftbessentials.teleport.on_cooldown": "Can't teleport yet! Cooldown: %s", "ftbessentials.teleport.interrupted": "Teleportation interrupted!", - "ftbessentials.teleport.notify": "Teleporting in %ss" + "ftbessentials.teleport.notify": "Teleporting in %ss", + "ftbessentials.teleport.no_safe_position": "No safe position found!" } diff --git a/common/src/main/resources/assets/ftbessentials/lang/zh_cn.json b/common/src/main/resources/assets/ftbessentials/lang/zh_cn.json index 9618f7d..21afa41 100644 --- a/common/src/main/resources/assets/ftbessentials/lang/zh_cn.json +++ b/common/src/main/resources/assets/ftbessentials/lang/zh_cn.json @@ -1,96 +1,97 @@ { - "sidebar_button.ftbessentials.trash_can": "垃圾桶", - "ftbessentials.chat.status.start_record": "正在录制!", - "ftbessentials.chat.status.stop_record": "录制已停止!", - "ftbessentials.chat.status.start_stream": "正在串流!", - "ftbessentials.chat.status.stop_stream": "串流已停止!", - "ftbessentials.messages.kick_self": "你踢出了自己!", - "ftbessentials.feedback.limit_radius": "限制半径为 %s", - "ftbessentials.near.players_within": "%s 玩家于 %sm 之内", - "ftbessentials.teleport_prevented": "传送被阻止!", - "ftbessentials.tpa.expired": "传送请求已经过期!", - "ftbessentials.muted": "由于被管理员禁言,你不能使用聊天功能!", - "ftbessentials.mute_expiry": "离禁言结束还有: %s", - "ftbessentials.enderchest.unable": "无法开启末影箱!", - "ftbessentials.flight.disabled": "飞行已禁用", - "ftbessentials.flight.enabled": "飞行已启用", - "ftbessentials.god_mode.disabled": "上帝模式已禁用", - "ftbessentials.god_mode.enabled": "上帝模式已启用", - "ftbessentials.teleport.history_empty": "传送历史为空!", - "ftbessentials.teleport.max_less_than_min": "最大传送距离不可小于最小传送距离!", - "ftbessentials.rtp.not_here": "在这个维度里你不能使用/rtp!", - "ftbessentials.rtp.looking": "正在寻找随机地点...", - "ftbessentials.rtp.found": "%s 次尝试后找到了较好的地点 @ %s", - "ftbessentials.rtp.failed": "无法找到有效传送地点!", - "ftbessentials.jump.failed": "不可跳跃: %s", - "ftbessentials.kit.added_items": "已将来自 '%s' 的物品添加至目标存储", - "ftbessentials.kit.no_items": "没有物品可加入!", - "ftbessentials.kit.cant_store": "无法储存至存储: %s", - "ftbessentials.kit.created": "'%s' 已创造", - "ftbessentials.kit.deleted": "'%s' 已删除", - "ftbessentials.kit.autogrant_modified": "'%s' 自动生成已修改: %s", - "ftbessentials.kit.cooldown_modified": "'%s' 冷却已修改: %s", - "ftbessentials.kit.gave_to_players": "套件 '%s' 已被给予 %s", - "ftbessentials.kit.no_permission": "没有给予 '%s' 的权限", - "ftbessentials.kit.not_looking_at_block": "没有看一个方块", - "ftbessentials.kit.not_enough_space": "库存中没有足够空间存储套件", - "ftbessentials.kit_name": "套件名称: %s", - "ftbessentials.kit.count": "%s 个套件", - "ftbessentials.kit.cooldown": "冷却: %s", - "ftbessentials.kit.cooldown.none": "无冷却", - "ftbessentials.kit.one_time": "一次性使用", - "ftbessentials.kit.one_time_only": "套件 \"%s\" 是一个一次性套件 (已被给予\"%s\")", - "ftbessentials.kit.on_cooldown": "套件 \"%s\" 正在冷却 - 剩余 %s", - "ftbessentials.kit.autogranted": "玩家登录时自动生成", - "ftbessentials.kit.items": "物品:", - "ftbessentials.kit.no_such_kit": "没有此种套件: '%s'", - "ftbessentials.kit.already_exists": "套件 '%s' 已经存在", - "ftbessentials.kit.cooldown_reset": " %s 的冷却已对UUID %s 重置", - "ftbessentials.kit.cooldown_reset_all": " %s 的冷却已对所有玩家重置", - "ftbessentials.muted.muted": "玩家 %s 已被 %s 禁言 - 时限: %s", - "ftbessentials.muted.unmuted": "玩家 %s 已被 %s 解除禁言", - "ftbessentials.nick.too_long": "昵称过长!", - "ftbessentials.nick.reset": "已重置昵称!", - "ftbessentials.nick.changed": "昵称已变更为 '%s'", - "ftbessentials.duration.indefinite": "直到另行通知", - "ftbessentials.duration.expected_format": "无效的持续时间格式,应当为: [smhdw]", - "ftbessentials.speed_boost": "%s (%s) 速度提升 = %s%%", - "ftbessentials.speed_boost.none": "%s 不再有速度提升", - "ftbessentials.leaderboard": "服务器排行 [ %s ]", - "ftbessentials.leaderboard.no_data": "无数据!", - "ftbessentials.home.set": "已设置家!", - "ftbessentials.home.too_many": "不可添加更多的家!", - "ftbessentials.home.deleted": "已删除家!", - "ftbessentials.home.not_found": "没有找到家!", - "ftbessentials.home.show_home": "%s: %s 之外", - "ftbessentials.home.y_too_low": "Y轴高度过低,家必须设置在 Y=%s 之上", - "ftbessentials.none": "无", - "ftbessentials.home.for_player": "%s 的家", - "ftbessentials.click_to_teleport": "点击以传送", - "ftbessentials.unknown_player_id": "未知玩家ID: %s", - "ftbessentials.unknown_player": "未知玩家: %s", - "ftbessentials.tp_offline.player_is_online": "玩家在线,请使用常规的 /tp 指令", - "ftbessentials.tp_offline.moved": "离线玩家 %s 移动到 %s 在 %s 以内", - "ftbessentials.tp_offline.cant_update": "无法更新dat文件: %s", - "ftbessentials.tpa.already_sent": "请求已经发送过了!", - "ftbessentials.tpa.notify": "传送请求! [ %s ➡ %s ]", - "ftbessentials.tpa.click_one": "点击下列选项里的一个: ", - "ftbessentials.tpa.accept": "接受 ✔", - "ftbessentials.tpa.accept.tooltip": "点击以接受", - "ftbessentials.tpa.deny": "拒绝 ❌", - "ftbessentials.tpa.deny.tooltip": "点击以拒绝", - "ftbessentials.tpa.request_sent": "请求已发送!", - "ftbessentials.tpa.invalid_request": "无效请求!", - "ftbessentials.tpa.gone_offline": "玩家已经下线!", - "ftbessentials.tpa.denied": "请求被拒绝!", - "ftbessentials.warp.set": "路径点已设置!", - "ftbessentials.warp.deleted": "路径点已删除!", - "ftbessentials.warp.not_found": "没有找到路径点!", - "ftbessentials.dimension_not_found": "没有找到维度!", - "ftbessentials.unknown_dest": "未知的目的地!", - "ftbessentials.teleport.not_from_here": "你所在的维度不允许传送!", - "ftbessentials.teleport.not_to_here": "不允许传送前往这个维度!", - "ftbessentials.teleport.on_cooldown": "还不能传送,冷却时间: %s", - "ftbessentials.teleport.interrupted": "传送被打断!", - "ftbessentials.teleport.notify": "在 %s 秒后传送" - } + "sidebar_button.ftbessentials.trash_can": "垃圾箱", + "ftbessentials.chat.status.start_record": "开始录制!", + "ftbessentials.chat.status.stop_record": "停止录制!", + "ftbessentials.chat.status.start_stream": "开始直播!", + "ftbessentials.chat.status.stop_stream": "停止直播!", + "ftbessentials.messages.kick_self": "你把自己踢出了游戏!", + "ftbessentials.feedback.limit_radius": "半径限制为 %s", + "ftbessentials.near.players_within": "%s 名玩家在 %s 米内", + "ftbessentials.teleport_prevented": "传送被阻止!", + "ftbessentials.tpa.expired": "TPA 请求已过期!", + "ftbessentials.muted": "你不能使用聊天,你已被管理员禁言!", + "ftbessentials.mute_expiry": "禁言到期时间:%s", + "ftbessentials.enderchest.unable": "无法打开末影箱背包!", + "ftbessentials.flight.disabled": "飞行已关闭", + "ftbessentials.flight.enabled": "飞行已开启", + "ftbessentials.god_mode.disabled": "上帝模式已关闭", + "ftbessentials.god_mode.enabled": "上帝模式已开启", + "ftbessentials.teleport.history_empty": "传送历史为空!", + "ftbessentials.teleport.max_less_than_min": "最大传送距离不能小于最小值!", + "ftbessentials.rtp.not_here": "不能在此维度使用 /rtp!", + "ftbessentials.rtp.looking": "正在寻找随机位置...", + "ftbessentials.rtp.found": "在 %s 次尝试后找到合适位置 @ %s", + "ftbessentials.rtp.failed": "未能找到可传送的有效位置!", + "ftbessentials.jump.failed": "无法跳跃:%s", + "ftbessentials.kit.added_items": "已将礼包 '%s' 中的物品添加到背包", + "ftbessentials.kit.no_items": "礼包中没有可添加的物品!", + "ftbessentials.kit.cant_store": "无法存放礼包:%s", + "ftbessentials.kit.created": "礼包 '%s' 已创建", + "ftbessentials.kit.deleted": "礼包 '%s' 已删除", + "ftbessentials.kit.autogrant_modified": "礼包 '%s' 的自动发放已修改:%s", + "ftbessentials.kit.cooldown_modified": "礼包 '%s' 的冷却时间已修改:%s", + "ftbessentials.kit.gave_to_players": "礼包 '%s' 已发放给 %s 名玩家", + "ftbessentials.kit.no_permission": "没有权限发放礼包 '%s'", + "ftbessentials.kit.not_looking_at_block": "没有对准方块", + "ftbessentials.kit.not_enough_space": "背包空间不足,无法存放礼包", + "ftbessentials.kit_name": "礼包名称:%s", + "ftbessentials.kit.count": "%s 个礼包", + "ftbessentials.kit.cooldown": "冷却时间:%s", + "ftbessentials.kit.cooldown.none": "无冷却时间", + "ftbessentials.kit.one_time": "一次性使用", + "ftbessentials.kit.one_time_only": "礼包 \"%s\" 是一次性礼包(已发放给 \"%s\")", + "ftbessentials.kit.on_cooldown": "礼包 \"%s\" 正在冷却中 - 剩余 %s", + "ftbessentials.kit.autogranted": "玩家登录时自动发放", + "ftbessentials.kit.items": "物品:", + "ftbessentials.kit.no_such_kit": "没有此礼包:'%s'", + "ftbessentials.kit.already_exists": "礼包 '%s' 已存在", + "ftbessentials.kit.cooldown_reset": "礼包 %s 的冷却时间已为 UUID %s 重置", + "ftbessentials.kit.cooldown_reset_all": "礼包 %s 的冷却时间已为所有玩家重置", + "ftbessentials.muted.muted": "玩家 %s 已被 %s 禁言 - 时长:%s", + "ftbessentials.muted.unmuted": "玩家 %s 已被 %s 解除禁言", + "ftbessentials.nick.too_long": "昵称太长!", + "ftbessentials.nick.reset": "昵称已重置!", + "ftbessentials.nick.changed": "昵称已更改为 '%s'", + "ftbessentials.duration.indefinite": "直至另行通知", + "ftbessentials.duration.expected_format": "无效的时长格式。正确格式:<数字>[s秒m分钟h小时d天w周]", + "ftbessentials.speed_boost": "%s 的速度加成(%s)= %s%%", + "ftbessentials.speed_boost.none": "%s 没有速度加成", + "ftbessentials.leaderboard": "排行榜 [ %s ]", + "ftbessentials.leaderboard.no_data": "无数据!", + "ftbessentials.home.set": "家已设置!", + "ftbessentials.home.too_many": "不能设置更多的家!", + "ftbessentials.home.deleted": "家已删除!", + "ftbessentials.home.not_found": "未找到家!", + "ftbessentials.home.show_home": "%s:距离 %s", + "ftbessentials.home.y_too_low": "Y 坐标太低!家必须设置在 Y=%s 以上", + "ftbessentials.none": "无", + "ftbessentials.home.for_player": "%s 的家", + "ftbessentials.click_to_teleport": "点击传送", + "ftbessentials.unknown_player_id": "未知玩家 ID:%s", + "ftbessentials.unknown_player": "未知玩家:%s", + "ftbessentials.tp_offline.player_is_online": "玩家在线!请使用常规 /tp 命令", + "ftbessentials.tp_offline.moved": "离线玩家 %s 已移动至 %s (%s)", + "ftbessentials.tp_offline.cant_update": "无法更新 dat 文件:%s", + "ftbessentials.tpa.already_sent": "请求已发送!", + "ftbessentials.tpa.notify": "TPA 请求![ %s ➡ %s ]", + "ftbessentials.tpa.click_one": "请选择:", + "ftbessentials.tpa.accept": "接受 ✔", + "ftbessentials.tpa.accept.tooltip": "点击接受", + "ftbessentials.tpa.deny": "拒绝 ❌", + "ftbessentials.tpa.deny.tooltip": "点击拒绝", + "ftbessentials.tpa.request_sent": "请求已发送!", + "ftbessentials.tpa.invalid_request": "无效请求!", + "ftbessentials.tpa.gone_offline": "玩家已离线!", + "ftbessentials.tpa.denied": "请求已被拒绝!", + "ftbessentials.warp.set": "传送点已设置!", + "ftbessentials.warp.deleted": "传送点已删除!", + "ftbessentials.warp.not_found": "未找到传送点!", + "ftbessentials.dimension_not_found": "未找到维度!", + "ftbessentials.unknown_dest": "未知的目的地!", + "ftbessentials.teleport.not_from_here": "不允许从当前维度传送!", + "ftbessentials.teleport.not_to_here": "不允许传送到该维度!", + "ftbessentials.teleport.on_cooldown": "无法传送!冷却时间:%s", + "ftbessentials.teleport.interrupted": "传送被中断!", + "ftbessentials.teleport.notify": "将在 %s 秒后传送", + "ftbessentials.teleport.no_safe_position": "找不到安全的位置!" +} diff --git a/fabric/build.gradle b/fabric/build.gradle index 8dd2d8b..0983dfa 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -19,7 +19,6 @@ configurations { runtimeClasspath.extendsFrom common developmentFabric.extendsFrom common } - dependencies { modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"