diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 3c6d1d0..ee28dad 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import xyz.soukup.ecoCraftCore.database.objects.*; import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand; import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand; +import xyz.soukup.ecoCraftCore.messages.JoinLeaveMessageSupress; import xyz.soukup.ecoCraftCore.mines.MineCommand; import xyz.soukup.ecoCraftCore.mines.MineWorldManager; import xyz.soukup.ecoCraftCore.money.MoneyCommand; @@ -85,6 +86,7 @@ public final class EcoCraftCore extends JavaPlugin { registerCommands(); registerEvents(); prepareSlimeWorldsSaver(); + prepareWorldInactivityUnloader(); }catch (IOException e) { MineWorldManager.init(); @@ -113,6 +115,7 @@ public final class EcoCraftCore extends JavaPlugin { AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); for (SlimeWorldInstance slimeWorldInstance : asp.getLoadedWorlds()){ + getLogger().info("Saved database world " + slimeWorldInstance.getName()); try { asp.saveWorld(slimeWorldInstance); } catch (IOException e) { @@ -125,7 +128,7 @@ public final class EcoCraftCore extends JavaPlugin { private void prepareWorldInactivityUnloader(){ Bukkit.getScheduler().runTaskTimer(plugin, () -> { - long timeoutMillis = 30 * 60 * 1000; + long timeoutMillis = 6 * 60 * 1000; long now = System.currentTimeMillis(); AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); @@ -148,6 +151,16 @@ public final class EcoCraftCore extends JavaPlugin { if ((now - emptySince) >= timeoutMillis) { Bukkit.unloadWorld(world, true); + getLogger().info("Unloading world " + world.getName() + " due to inactivity"); + try { + UpdateBuilder updateBuilder = DaoRegistry.getIslandDao().updateBuilder(); + updateBuilder.where().eq("uuid", world.getName()); + updateBuilder.updateColumnValue("active_on", ""); + updateBuilder.update(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } @@ -284,6 +297,7 @@ public final class EcoCraftCore extends JavaPlugin { pm.registerEvents(new PreparePlayer(), this); pm.registerEvents(new RegionEvents(), this); pm.registerEvents(new MineWorldManager(), this); + pm.registerEvents(new JoinLeaveMessageSupress(), this); EventManager events = PacketEvents.getAPI().getEventManager(); events.registerListener(new ChunkModifier(this), PacketListenerPriority.NORMAL); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/messages/JoinLeaveMessageSupress.java b/src/main/java/xyz/soukup/ecoCraftCore/messages/JoinLeaveMessageSupress.java new file mode 100644 index 0000000..4b3e318 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/messages/JoinLeaveMessageSupress.java @@ -0,0 +1,18 @@ +package xyz.soukup.ecoCraftCore.messages; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class JoinLeaveMessageSupress implements Listener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + event.joinMessage(null); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + event.quitMessage(null); + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java index 14c480d..63c365c 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java @@ -3,6 +3,7 @@ package xyz.soukup.ecoCraftCore.regions; import org.bukkit.Location; import org.bukkit.entity.Player; import xyz.soukup.ecoCraftCore.database.objects.Region; +import xyz.soukup.ecoCraftCore.database.objects.RegionMember; import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; public class RegionManager { @@ -45,4 +46,32 @@ public class RegionManager { return 0; } + + public static boolean isAllowedToInteract(Player player, Location location){ + if (player.isOp()){ + return true; + } + + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + String island = location.getWorld().getName(); + + Region region = Region.findRegion(x, y, z, island); + + if (region == null){ + return false; + } + + String name = player.getName(); + + for (RegionMember regionMember : region.getRegionMembers()){ + + if (regionMember.getMembertype().equals("player") && regionMember.getName().equals(name)){ + return true; + } + } + + return false; + } } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java new file mode 100644 index 0000000..1d86395 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java @@ -0,0 +1,99 @@ +package xyz.soukup.ecoCraftCore.sign; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.dialog.Dialog; +import io.papermc.paper.registry.data.dialog.ActionButton; +import io.papermc.paper.registry.data.dialog.DialogBase; +import io.papermc.paper.registry.data.dialog.action.DialogAction; +import io.papermc.paper.registry.data.dialog.input.DialogInput; +import io.papermc.paper.registry.data.dialog.type.DialogType; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickCallback; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.block.sign.SignSide; +import org.bukkit.entity.Player; +import xyz.soukup.ecoCraftCore.database.objects.Shop; +import xyz.soukup.ecoCraftCore.messages.Messages; +import xyz.soukup.ecoCraftCore.regions.RegionManager; + +import java.util.ArrayList; +import java.util.List; + +public class SignEditCommand { + public static LiteralArgumentBuilder getCommand(){ + return Commands.literal("edit-sign") + .requires(source -> source.getSender() instanceof Player) + .executes(SignEditCommand::openEditMenu); + } + + private static int openEditMenu(CommandContext context){ + Player player = (Player) context.getSource().getSender(); + Block block = player.getTargetBlock(null, 10); + BlockState blockState = block.getState(); + + if (!(blockState instanceof Sign sign)){ + Messages.send(player, "sign-edit.error.not-sign"); + return 1; + } + + Location location = sign.getLocation(); + + if (!RegionManager.isAllowedToInteract(player, location)){ + Messages.send(player, "region.error.not-allowed-to-interact"); + return 1; + } + + + + return 0; + } + + @SuppressWarnings("UnstableApiUsage") + public static Dialog buildEditDialog(Sign sign){ + + SignSide signSide = sign.getSide(Side.FRONT); + List lines = signSide.lines(); + MiniMessage miniMessage = MiniMessage.miniMessage(); + + List actionButtons = new ArrayList<>(); + + actionButtons.add(ActionButton.builder(Messages.get("gui.shop-edit.button.confirm")) + .action(DialogAction.customClick( + (view, audience) -> {audience.closeDialog();}, + ClickCallback.Options.builder().build() + )) + .build()); + + return Dialog.create(builder -> builder.empty() + .base(DialogBase.builder(Messages.get("gui.shop-edit.title")) + .inputs(List.of( + DialogInput.text("line1", Messages.get("gui.sign-edit.inputs.line1")) + .initial(miniMessage.serialize(lines.getFirst())) + .build(), + DialogInput.text("line2", Messages.get("gui.sign-edit.inputs.line2")) + .initial(miniMessage.serialize(lines.get(1))) + .build(), + DialogInput.text("line3", Messages.get("gui.sign-edit.inputs.line3")) + .initial(miniMessage.serialize(lines.get(2))) + .build(), + DialogInput.text("line4", Messages.get("gui.sign-edit.inputs.line4")) + .initial(miniMessage.serialize(lines.get(3))) + .build() + + + )) + .build()) + .type(DialogType.multiAction(actionButtons).build()) + + ); + } + +} diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 801f107..4c9b324 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -16,6 +16,10 @@ region: error: not-marked: "Musíš nejprve označit pozice" not-exist: "Region neexistuje" + not-allowed-to-interact: "Nemáš povolení dělat změny na tomto území" +sign-edit: + error: + not-sign: "Musíš se dívat na cedulku." shop: error: already-shop: "Tato cedule již je obchod" @@ -67,6 +71,18 @@ gui: error: invalid-input: "Vámi zadané hodnoty nejsou platné." all: "Seznam guis: <1>, <2>" + sign-edit: + title: "Editace Cedulky" + inputs: + line1: "1. řádek" + line2: "2. řádek" + line3: "3. řádek" + line4: "4. řádek" + buttons: + confirm: "Potvrdit" + cancel: "Zrušit" + copy: "Kopírovat" + paste: "Vložit" shop-edit: title: "Editace Obchodu" inputs: