From bd45f10ed9529e110fc34d78553d30465ddb0ca3 Mon Sep 17 00:00:00 2001 From: PinkGoosik Date: Thu, 12 Jan 2023 16:59:51 +0500 Subject: [PATCH] fabric permissions api support --- README.md | 31 +++---------- build.gradle | 2 +- src/main/java/skylands/SkylandsMod.java | 3 ++ .../java/skylands/command/AcceptCommand.java | 3 +- .../java/skylands/command/BanCommands.java | 3 +- .../java/skylands/command/CreateCommand.java | 5 ++- .../java/skylands/command/DeleteCommand.java | 7 +-- .../java/skylands/command/HelpCommand.java | 3 +- .../java/skylands/command/HomeCommand.java | 5 ++- .../java/skylands/command/HubCommands.java | 7 +-- .../java/skylands/command/KickCommand.java | 3 +- .../java/skylands/command/MemberCommands.java | 5 ++- .../skylands/command/SettingCommands.java | 7 +-- .../skylands/command/SkylandsCommands.java | 3 +- .../java/skylands/command/VisitCommand.java | 3 +- .../java/skylands/config/SkylandsConfig.java | 9 ++-- .../config/SkylandsConfigCommands.java | 45 ++++++++++++++----- .../skylands/event/PlayerConnectEvent.java | 15 ++++--- .../java/skylands/event/UseBlockEvent.java | 2 +- src/main/java/skylands/logic/Hub.java | 7 ++- src/main/java/skylands/logic/Island.java | 4 +- src/main/java/skylands/logic/Skylands.java | 4 +- .../java/skylands/util/UpdateChecker.java | 3 +- .../java/skylands/util/WorldProtection.java | 6 +++ 24 files changed, 110 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index e638f85..5a457ac 100644 --- a/README.md +++ b/README.md @@ -3,34 +3,17 @@ -Skylands is a Minecraft mod/plugin for fabric loader. Simple skyblock islands generator and manager allowing your -server's players create and visit islands. The mod can be used server-side only, however it's compatible with singleplayer +Skylands is a Minecraft mod/plugin for fabric loader. Simple skyblock islands generator and manager allowing your server's +players to create and visit islands. The mod can be used server-side only, however, it's compatible with singleplayer and modpacks. This mod is not complete and still in active development. [![Discord Server](https://raw.githubusercontent.com/intergrav/devins-badges/v2/assets/cozy/social/discord-plural_64h.png)](https://discord.gg/DcemWeskeZ) -[![Modrinth Page](https://raw.githubusercontent.com/intergrav/devins-badges/v2/assets/cozy/available/modrinth_64h.png)](https://modrinth.com/mod/skylands) +[![Documentation](https://raw.githubusercontent.com/intergrav/devins-badges/v2/assets/cozy/documentation/ghpages_64h.png)](https://github.com/tyap-lyap/skylands/wiki) -### User Commands +### Commands -- **/sl hub** Teleport to the Hub. -- **/sl create** Creates an Island. -- **/sl home** Teleport to your Island. +- **/sl create** Creates a new Island. +- **/sl home** Teleports to your Island. - **/sl visit ** Visit someone's Island. -- **/sl home ** Teleport to an Island you are member of. -- **/sl members invite ** Invite player to your Island. -- **/sl members remove ** Remove player from your Island. -- **/sl accept ** Accept Island join invite request. -- **/sl kick ** Kick player from your Island. -- **/sl ban ** Ban player from visiting your Island. -- **/sl unban ** Unban player to allow visiting your Island. -- **/sl delete** Deletes your Island. -- **/sl settings set-spawn-pos** Changes home position. -- **/sl settings set-visits-pos** Changes visits position. -- **/sl settings toggle-visits** Enables/disables ability to visit your Island. -- **/sl help** Sends this list. -### Admin Commands - -- **/force-sl set-hub-pos** Changes position of the hub. -- **/force-sl delete-island ** Deletes player's Island. -- **/force-sl toggle-hub-protection** Enables/disables hub protection. +See [wiki/commands](https://github.com/tyap-lyap/skylands/wiki/commands) for the complete list of available commands. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 009ccf7..47d3f8e 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ dependencies { // modImplementation include("eu.pb4:sidebar-api:0.1.1+1.19") modImplementation include("eu.pb4:placeholder-api:2.0.0-beta.7+1.19") modImplementation include("fr.catcore:server-translations-api:1.4.17+1.19.2") -// modImplementation include("me.lucko:fabric-permissions-api:0.2-SNAPSHOT") + modImplementation include("me.lucko:fabric-permissions-api:0.2-SNAPSHOT") modLocalRuntime "maven.modrinth:ferrite-core:5.0.0-fabric" modLocalRuntime "maven.modrinth:lazydfu:0.1.3" diff --git a/src/main/java/skylands/SkylandsMod.java b/src/main/java/skylands/SkylandsMod.java index 9f8f0ef..e146a51 100644 --- a/src/main/java/skylands/SkylandsMod.java +++ b/src/main/java/skylands/SkylandsMod.java @@ -5,7 +5,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import skylands.command.SkylandsCommands; +import skylands.config.SkylandsConfig; import skylands.event.SkylandsEvents; +import skylands.logic.Skylands; public class SkylandsMod implements ModInitializer { public static final String MOD_ID = "skylands"; @@ -13,6 +15,7 @@ public class SkylandsMod implements ModInitializer { @Override public void onInitialize() { + Skylands.config = SkylandsConfig.read(); SkylandsEvents.init(); SkylandsCommands.init(); } diff --git a/src/main/java/skylands/command/AcceptCommand.java b/src/main/java/skylands/command/AcceptCommand.java index e5053fa..220e549 100644 --- a/src/main/java/skylands/command/AcceptCommand.java +++ b/src/main/java/skylands/command/AcceptCommand.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import skylands.data.Components; @@ -16,7 +17,7 @@ public class AcceptCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("accept").then(argument("player", word()).executes(context -> { + dispatcher.register(literal("sl").then(literal("accept").requires(Permissions.require("skylands.accept", true)).then(argument("player", word()).executes(context -> { String inviter = StringArgumentType.getString(context, "player"); var player = context.getSource().getPlayer(); diff --git a/src/main/java/skylands/command/BanCommands.java b/src/main/java/skylands/command/BanCommands.java index a51611d..bcb235c 100644 --- a/src/main/java/skylands/command/BanCommands.java +++ b/src/main/java/skylands/command/BanCommands.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.server.command.ServerCommandSource; @@ -21,7 +22,7 @@ public class BanCommands { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("ban").then(argument("player", player()).executes(context -> { + dispatcher.register(literal("sl").then(literal("ban").requires(Permissions.require("skylands.ban", true)).then(argument("player", player()).executes(context -> { var player = context.getSource().getPlayer(); var bannedPlayer = EntityArgumentType.getPlayer(context, "player"); if(player != null && bannedPlayer != null) { diff --git a/src/main/java/skylands/command/CreateCommand.java b/src/main/java/skylands/command/CreateCommand.java index 577d6e1..0d00147 100644 --- a/src/main/java/skylands/command/CreateCommand.java +++ b/src/main/java/skylands/command/CreateCommand.java @@ -1,6 +1,7 @@ package skylands.command; import com.mojang.brigadier.CommandDispatcher; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import skylands.logic.Island; @@ -13,7 +14,7 @@ public class CreateCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("create").executes(context -> { + dispatcher.register(literal("sl").then(literal("create").requires(Permissions.require("skylands.create", true)).executes(context -> { var source = context.getSource(); var player = source.getPlayer(); if(player != null) { @@ -32,7 +33,7 @@ static void run(ServerPlayerEntity player) { else { Island island = islands.create(player); island.onFirstLoad(); - if(Skylands.instance.config.teleportAfterIslandCreation) { + if(Skylands.config.teleportAfterIslandCreation) { island.visitAsMember(player); } player.sendMessage(Texts.prefixed("message.skylands.island_create.success")); diff --git a/src/main/java/skylands/command/DeleteCommand.java b/src/main/java/skylands/command/DeleteCommand.java index 8665deb..cb8f745 100644 --- a/src/main/java/skylands/command/DeleteCommand.java +++ b/src/main/java/skylands/command/DeleteCommand.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import skylands.logic.IslandStuck; @@ -18,7 +19,7 @@ public class DeleteCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("delete").executes(context -> { + dispatcher.register(literal("sl").then(literal("delete").requires(Permissions.require("skylands.delete", true)).executes(context -> { var player = context.getSource().getPlayer(); if(player != null) DeleteCommand.warn(player); return 1; @@ -38,9 +39,9 @@ static void run(ServerPlayerEntity player, String confirmWord) { islands.get(player).ifPresentOrElse(island -> { var created = island.created; var now = Instant.now(); - var hours = ChronoUnit.HOURS.between(created, now); + var seconds = ChronoUnit.SECONDS.between(created, now); - if(hours >= 24) { + if(seconds >= Skylands.config.islandDeletionCooldown) { islands.delete(player); player.sendMessage(Texts.prefixed("message.skylands.island_delete.success")); } diff --git a/src/main/java/skylands/command/HelpCommand.java b/src/main/java/skylands/command/HelpCommand.java index be0b0c0..992dd46 100644 --- a/src/main/java/skylands/command/HelpCommand.java +++ b/src/main/java/skylands/command/HelpCommand.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import eu.pb4.placeholders.api.TextParserUtils; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Language; @@ -11,7 +12,7 @@ public class HelpCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("help").executes(context -> { + dispatcher.register(literal("sl").then(literal("help").requires(Permissions.require("skylands.help", true)).executes(context -> { ServerPlayerEntity player = context.getSource().getPlayer(); if(player != null) { HelpCommand.run(player); diff --git a/src/main/java/skylands/command/HomeCommand.java b/src/main/java/skylands/command/HomeCommand.java index 4f855ba..4e9c18f 100644 --- a/src/main/java/skylands/command/HomeCommand.java +++ b/src/main/java/skylands/command/HomeCommand.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import skylands.SkylandsMod; @@ -16,14 +17,14 @@ public class HomeCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("home").executes(context -> { + dispatcher.register(literal("sl").then(literal("home").requires(Permissions.require("skylands.home", true)).executes(context -> { var player = context.getSource().getPlayer(); if(player != null) { HomeCommand.run(player); } return 1; }))); - dispatcher.register(literal("sl").then(literal("home").then(argument("player", word()).suggests((context, builder) -> { + dispatcher.register(literal("sl").then(literal("home").requires(Permissions.require("skylands.home", true)).then(argument("player", word()).suggests((context, builder) -> { var player = context.getSource().getPlayer(); if(player != null) { diff --git a/src/main/java/skylands/command/HubCommands.java b/src/main/java/skylands/command/HubCommands.java index a68136c..0dea60c 100644 --- a/src/main/java/skylands/command/HubCommands.java +++ b/src/main/java/skylands/command/HubCommands.java @@ -1,6 +1,7 @@ package skylands.command; import com.mojang.brigadier.CommandDispatcher; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.server.MinecraftServer; @@ -19,7 +20,7 @@ public class HubCommands { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("hub").executes(context -> { + dispatcher.register(literal("sl").then(literal("hub").requires(Permissions.require("skylands.hub", true)).executes(context -> { var source = context.getSource(); var player = source.getPlayer(); MinecraftServer server = source.getServer(); @@ -29,12 +30,12 @@ static void init(CommandDispatcher dispatcher) { return 1; }))); - dispatcher.register(literal("force-sl").requires(source -> source.hasPermissionLevel(4)).then(literal("set-hub-pos").then(argument("position", blockPos()).executes(context -> { + dispatcher.register(literal("force-sl").then(literal("set-hub-pos").requires(Permissions.require("skylands.force.hub.position", 4)).then(argument("position", blockPos()).executes(context -> { var pos = BlockPosArgumentType.getBlockPos(context, "position"); var source = context.getSource(); HubCommands.setPos(pos, source); return 1; - }))).then(literal("toggle-hub-protection").executes(context -> { + }))).then(literal("toggle-hub-protection").requires(Permissions.require("skylands.force.hub.protection", 4)).executes(context -> { HubCommands.toggleProtection(context.getSource()); return 1; }))); diff --git a/src/main/java/skylands/command/KickCommand.java b/src/main/java/skylands/command/KickCommand.java index 2772e43..1939eb1 100644 --- a/src/main/java/skylands/command/KickCommand.java +++ b/src/main/java/skylands/command/KickCommand.java @@ -1,6 +1,7 @@ package skylands.command; import com.mojang.brigadier.CommandDispatcher; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.server.command.ServerCommandSource; @@ -18,7 +19,7 @@ public class KickCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("kick").then(argument("player", player()).executes(context -> { + dispatcher.register(literal("sl").then(literal("kick").requires(Permissions.require("skylands.kick", true)).then(argument("player", player()).executes(context -> { var player = context.getSource().getPlayer(); var kickedPlayer = EntityArgumentType.getPlayer(context, "player"); if(player != null && kickedPlayer != null) { diff --git a/src/main/java/skylands/command/MemberCommands.java b/src/main/java/skylands/command/MemberCommands.java index bffcc8a..89b1ea1 100644 --- a/src/main/java/skylands/command/MemberCommands.java +++ b/src/main/java/skylands/command/MemberCommands.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -16,7 +17,7 @@ public class MemberCommands { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("members").then(literal("invite").then(argument("player", player()).executes(context -> { + dispatcher.register(literal("sl").then(literal("members").then(literal("invite").requires(Permissions.require("skylands.members.invite", true)).then(argument("player", player()).executes(context -> { var player = context.getSource().getPlayer(); var newcomer = EntityArgumentType.getPlayer(context, "player"); if(player != null && newcomer != null) { @@ -24,7 +25,7 @@ static void init(CommandDispatcher dispatcher) { } return 1; }))))); - dispatcher.register(literal("sl").then(literal("members").then(literal("remove").then(argument("player", word()).suggests((context, builder) -> { + dispatcher.register(literal("sl").then(literal("members").then(literal("remove").requires(Permissions.require("skylands.members.remove", true)).then(argument("player", word()).suggests((context, builder) -> { var player = context.getSource().getPlayer(); var island = Skylands.instance.islands.get(player); diff --git a/src/main/java/skylands/command/SettingCommands.java b/src/main/java/skylands/command/SettingCommands.java index 8dc7f0d..5e1ddf7 100644 --- a/src/main/java/skylands/command/SettingCommands.java +++ b/src/main/java/skylands/command/SettingCommands.java @@ -1,6 +1,7 @@ package skylands.command; import com.mojang.brigadier.CommandDispatcher; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -16,20 +17,20 @@ public class SettingCommands { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("settings").then(literal("toggle-visits").executes(context -> { + dispatcher.register(literal("sl").then(literal("settings").then(literal("toggle-visits").requires(Permissions.require("skylands.settings.lock", true)).executes(context -> { var player = context.getSource().getPlayer(); if(player != null) { SettingCommands.toggleVisits(player); } return 1; - })).then(literal("set-spawn-pos").then(argument("position", blockPos()).executes(context -> { + })).then(literal("set-spawn-pos").requires(Permissions.require("skylands.settings.spawn.position", true)).then(argument("position", blockPos()).executes(context -> { var player = context.getSource().getPlayer(); var pos = BlockPosArgumentType.getBlockPos(context, "position"); if(player != null) { SettingCommands.setSpawnPos(player, pos); } return 1; - }))).then(literal("set-visits-pos").then(argument("position", blockPos()).executes(context -> { + }))).then(literal("set-visits-pos").requires(Permissions.require("skylands.settings.visits.position", true)).then(argument("position", blockPos()).executes(context -> { var player = context.getSource().getPlayer(); var pos = BlockPosArgumentType.getBlockPos(context, "position"); if(player != null) { diff --git a/src/main/java/skylands/command/SkylandsCommands.java b/src/main/java/skylands/command/SkylandsCommands.java index 180d5f5..b1f378e 100644 --- a/src/main/java/skylands/command/SkylandsCommands.java +++ b/src/main/java/skylands/command/SkylandsCommands.java @@ -2,6 +2,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.minecraft.server.command.ServerCommandSource; import skylands.config.SkylandsConfigCommands; @@ -34,7 +35,7 @@ private static void register(CommandDispatcher dispatcher) DeleteCommand.init(dispatcher); SettingCommands.init(dispatcher); - dispatcher.register(literal("force-sl").requires(source -> source.hasPermissionLevel(4)).then(literal("delete-island").then(argument("player", word()).executes(context -> { + dispatcher.register(literal("force-sl").then(literal("delete-island").requires(Permissions.require("skylands.force.delete", 4)).then(argument("player", word()).executes(context -> { var playerName = StringArgumentType.getString(context, "player"); var island = Skylands.instance.islands.get(playerName); diff --git a/src/main/java/skylands/command/VisitCommand.java b/src/main/java/skylands/command/VisitCommand.java index 442e1c0..253352d 100644 --- a/src/main/java/skylands/command/VisitCommand.java +++ b/src/main/java/skylands/command/VisitCommand.java @@ -1,6 +1,7 @@ package skylands.command; import com.mojang.brigadier.CommandDispatcher; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.command.argument.EntityArgumentType; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -15,7 +16,7 @@ public class VisitCommand { static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("sl").then(literal("visit").then(argument("player", player()).executes(context -> { + dispatcher.register(literal("sl").then(literal("visit").requires(Permissions.require("skylands.visit", true)).then(argument("player", player()).executes(context -> { var visitor = context.getSource().getPlayer(); var owner = EntityArgumentType.getPlayer(context, "player"); if(visitor != null && owner != null) { diff --git a/src/main/java/skylands/config/SkylandsConfig.java b/src/main/java/skylands/config/SkylandsConfig.java index 7e7655d..81f6670 100644 --- a/src/main/java/skylands/config/SkylandsConfig.java +++ b/src/main/java/skylands/config/SkylandsConfig.java @@ -17,8 +17,11 @@ public class SkylandsConfig { @SuppressWarnings("unused") public String readDocs = "https://github.com/tyap-lyap/skylands/wiki"; public String configFormat = "json"; - public Vec3d defaultSpawnPos = new Vec3d(0.5D, 75D, 0.5D); - public Vec3d defaultVisitsPos = new Vec3d(0.5D, 75D, 0.5D); + public Vec3d defaultSpawnPos = new Vec3d(0.5D, 75.0D, 0.5D); + public Vec3d defaultVisitsPos = new Vec3d(0.5D, 75.0D, 0.5D); + public Vec3d defaultHubPos = new Vec3d(0.5D, 80.0D, 0.5D); + public boolean hubProtectedByDefault = false; + public int islandDeletionCooldown = (24 * 60) * 60; public boolean updateCheckerEnabled = true; public boolean teleportAfterIslandCreation = false; @@ -71,8 +74,6 @@ public void writeToNbt(NbtCompound nbt) { } public static SkylandsConfig read() { -// String filePath = path.isBlank() ? this.file : this.path + "/" + this.file; - String filePath = FabricLoader.getInstance().getConfigDir().resolve("skylands.json").toString(); try { BufferedReader reader = new BufferedReader(new FileReader(filePath)); diff --git a/src/main/java/skylands/config/SkylandsConfigCommands.java b/src/main/java/skylands/config/SkylandsConfigCommands.java index d0f080d..0390737 100644 --- a/src/main/java/skylands/config/SkylandsConfigCommands.java +++ b/src/main/java/skylands/config/SkylandsConfigCommands.java @@ -1,6 +1,8 @@ package skylands.config; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -8,6 +10,7 @@ import net.minecraft.util.math.Vec3d; import skylands.logic.Skylands; +import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; import static com.mojang.brigadier.arguments.StringArgumentType.word; import static net.minecraft.command.argument.EntityArgumentType.player; import static net.minecraft.server.command.CommandManager.argument; @@ -17,51 +20,73 @@ public class SkylandsConfigCommands { public static void init(CommandDispatcher dispatcher) { - dispatcher.register(literal("force-sl").requires(source -> source.hasPermissionLevel(4)).then(literal("config").then(literal("default-spawn-pos").then(argument("position", blockPos()).executes(context -> { + dispatcher.register(literal("force-sl").then(literal("config").requires(Permissions.require("skylands.force.config", 4)).then(literal("default-spawn-pos").then(argument("position", blockPos()).executes(context -> { var pos = BlockPosArgumentType.getBlockPos(context, "position"); - Skylands.instance.config.defaultSpawnPos = new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - Skylands.instance.config.save(); + Skylands.config.defaultSpawnPos = new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + Skylands.config.save(); String posText = pos.getX() + " " + pos.getY() + " " + pos.getZ(); context.getSource().sendFeedback(Text.of("config.defaultSpawnPos has changed to: " + posText), true); return 1; }))).then(literal("default-visits-pos").then(argument("position", blockPos()).executes(context -> { var pos = BlockPosArgumentType.getBlockPos(context, "position"); - Skylands.instance.config.defaultVisitsPos = new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - Skylands.instance.config.save(); + Skylands.config.defaultVisitsPos = new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + Skylands.config.save(); String posText = pos.getX() + " " + pos.getY() + " " + pos.getZ(); context.getSource().sendFeedback(Text.of("config.defaultVisitsPos has changed to: " + posText), true); return 1; + }))).then(literal("default-hub-pos").then(argument("position", blockPos()).executes(context -> { + var pos = BlockPosArgumentType.getBlockPos(context, "position"); + Skylands.config.defaultHubPos = new Vec3d(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + Skylands.config.save(); + String posText = pos.getX() + " " + pos.getY() + " " + pos.getZ(); + context.getSource().sendFeedback(Text.of("config.defaultHubPos has changed to: " + posText), true); + return 1; + + }))).then(literal("island-deletion-cooldown").then(argument("cooldown", integer()).executes(context -> { + var cooldown = IntegerArgumentType.getInteger(context, "cooldown"); + Skylands.config.islandDeletionCooldown = cooldown; + Skylands.config.save(); + context.getSource().sendFeedback(Text.of("config.islandDeletionCooldown has changed to: " + cooldown), true); + return 1; + }))).then(literal("teleport-after-island-creation").executes(context -> { - var config = Skylands.instance.config; + var config = Skylands.config; config.teleportAfterIslandCreation = !config.teleportAfterIslandCreation; config.save(); context.getSource().sendFeedback(Text.of("config.teleportAfterIslandCreation has changed to: " + config.teleportAfterIslandCreation), true); return 1; + })).then(literal("hub-protected-by-default").executes(context -> { + var config = Skylands.config; + config.hubProtectedByDefault = !config.hubProtectedByDefault; + config.save(); + context.getSource().sendFeedback(Text.of("config.hubProtectedByDefault has changed to: " + config.hubProtectedByDefault), true); + return 1; + })).then(literal("create-island-on-player-join").executes(context -> { - var config = Skylands.instance.config; + var config = Skylands.config; config.createIslandOnPlayerJoin = !config.createIslandOnPlayerJoin; config.save(); context.getSource().sendFeedback(Text.of("config.createIslandOnPlayerJoin has changed to: " + config.createIslandOnPlayerJoin), true); return 1; })).then(literal("toggle-update-checker").executes(context -> { - var config = Skylands.instance.config; + var config = Skylands.config; config.updateCheckerEnabled = !config.updateCheckerEnabled; config.save(); context.getSource().sendFeedback(Text.of("config.updateCheckerEnabled has changed to: " + config.updateCheckerEnabled), true); return 1; })).then(literal("toggle-right-click-harvest").executes(context -> { - var config = Skylands.instance.config; + var config = Skylands.config; config.rightClickHarvestEnabled = !config.rightClickHarvestEnabled; config.save(); context.getSource().sendFeedback(Text.of("config.rightClickHarvestEnabled has changed to: " + config.rightClickHarvestEnabled), true); return 1; })).then(literal("reload").executes(context -> { - Skylands.instance.config = SkylandsConfig.read(); + Skylands.config = SkylandsConfig.read(); context.getSource().sendFeedback(Text.of("Config successfully reloaded!"), true); return 1; })))); diff --git a/src/main/java/skylands/event/PlayerConnectEvent.java b/src/main/java/skylands/event/PlayerConnectEvent.java index e6bd99e..82a6b97 100644 --- a/src/main/java/skylands/event/PlayerConnectEvent.java +++ b/src/main/java/skylands/event/PlayerConnectEvent.java @@ -20,12 +20,13 @@ public static void onJoin(MinecraftServer server, ServerPlayerEntity player) { Skylands skylands = Skylands.instance; if(player.getStatHandler().getStat(Stats.CUSTOM.getOrCreateStat(Stats.LEAVE_GAME)) == 0) { - if(skylands.config.createIslandOnPlayerJoin) { - Island island = skylands.islands.create(player); - island.onFirstLoad(); - island.visitAsMember(player); - player.sendMessage(Texts.prefixed("message.skylands.island_create.success")); - } + // TODO: this is extremely broken and unsafe, needs different implementation +// if(skylands.config.createIslandOnPlayerJoin) { +// Island island = skylands.islands.create(player); +// island.onFirstLoad(); +// island.visitAsMember(player); +// player.sendMessage(Texts.prefixed("message.skylands.island_create.success")); +// } } skylands.islands.get(player).ifPresent(island -> { @@ -52,7 +53,7 @@ public static void onJoin(MinecraftServer server, ServerPlayerEntity player) { } }); - if(skylands.config.updateCheckerEnabled) { + if(Skylands.config.updateCheckerEnabled) { UpdateChecker.onPlayerJoin(player); } } diff --git a/src/main/java/skylands/event/UseBlockEvent.java b/src/main/java/skylands/event/UseBlockEvent.java index 484c929..c62d7c0 100644 --- a/src/main/java/skylands/event/UseBlockEvent.java +++ b/src/main/java/skylands/event/UseBlockEvent.java @@ -24,7 +24,7 @@ public static ActionResult onBlockUse(PlayerEntity player, World world, Hand han ItemStack toolStack = player.getStackInHand(hand); if(state.getBlock() instanceof CropBlock crop && crop.isMature(state)) { - if(!Skylands.instance.config.rightClickHarvestEnabled) return ActionResult.PASS; + if(!Skylands.config.rightClickHarvestEnabled) return ActionResult.PASS; if(WorldProtection.canModify(world, player)) { Item replant = state.getBlock().getPickStack(world, pos, state).getItem(); diff --git a/src/main/java/skylands/logic/Hub.java b/src/main/java/skylands/logic/Hub.java index 4e8695d..c17b4d6 100644 --- a/src/main/java/skylands/logic/Hub.java +++ b/src/main/java/skylands/logic/Hub.java @@ -4,8 +4,11 @@ import net.minecraft.util.math.Vec3d; public class Hub { - public Vec3d pos = new Vec3d(0, 80, 0); - public boolean hasProtection = false; + public Vec3d pos = Skylands.config.defaultHubPos; + public boolean hasProtection = Skylands.config.hubProtectedByDefault; + + public Hub() { + } public void readFromNbt(NbtCompound nbt) { NbtCompound hubNbt = nbt.getCompound("hub"); diff --git a/src/main/java/skylands/logic/Island.java b/src/main/java/skylands/logic/Island.java index 639d6eb..62d9597 100644 --- a/src/main/java/skylands/logic/Island.java +++ b/src/main/java/skylands/logic/Island.java @@ -47,8 +47,8 @@ public class Island { public ArrayList bans = new ArrayList<>(); public boolean locked = false; - public Vec3d spawnPos = skylands.config.defaultSpawnPos; - public Vec3d visitsPos = skylands.config.defaultVisitsPos; + public Vec3d spawnPos = Skylands.config.defaultSpawnPos; + public Vec3d visitsPos = Skylands.config.defaultVisitsPos; public boolean hasNether = false; public Instant created = Instant.now(); diff --git a/src/main/java/skylands/logic/Skylands.java b/src/main/java/skylands/logic/Skylands.java index e5f731e..185273e 100644 --- a/src/main/java/skylands/logic/Skylands.java +++ b/src/main/java/skylands/logic/Skylands.java @@ -14,7 +14,8 @@ public class Skylands { public IslandStuck islands; public Hub hub; public Invites invites; - public SkylandsConfig config; + + public static SkylandsConfig config; public Skylands(MinecraftServer server) { this.server = server; @@ -22,7 +23,6 @@ public Skylands(MinecraftServer server) { this.islands = new IslandStuck(); this.hub = new Hub(); this.invites = new Invites(); - this.config = SkylandsConfig.read(); } public void readFromNbt(NbtCompound nbt) { diff --git a/src/main/java/skylands/util/UpdateChecker.java b/src/main/java/skylands/util/UpdateChecker.java index 5415ecc..0210991 100644 --- a/src/main/java/skylands/util/UpdateChecker.java +++ b/src/main/java/skylands/util/UpdateChecker.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.SharedConstants; import net.minecraft.server.network.ServerPlayerEntity; @@ -28,7 +29,7 @@ public class UpdateChecker { private static String cachedLatest = "0"; public static void onPlayerJoin(ServerPlayerEntity player) { - if(player.hasPermissionLevel(4)) { + if(Permissions.check(player, "skylands.update.checker.notify", 4)) { check(player); } } diff --git a/src/main/java/skylands/util/WorldProtection.java b/src/main/java/skylands/util/WorldProtection.java index b27ad52..61022e9 100644 --- a/src/main/java/skylands/util/WorldProtection.java +++ b/src/main/java/skylands/util/WorldProtection.java @@ -1,5 +1,6 @@ package skylands.util; +import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.World; import skylands.logic.Skylands; @@ -8,6 +9,11 @@ public class WorldProtection { public static boolean canModify(World world, PlayerEntity player) { var island = Worlds.getIsland(world); + + if(Permissions.check(player, "skylands.world.protection.bypass", false)) { + return true; + } + if(island.isPresent() && !island.get().isMember(player)) { return false; }