- Příprava meníčka a funkce pro úpravu cedulek

master
jakub 4 weeks ago
parent 4f6bfdf26d
commit 375f5983af
  1. 16
      src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java
  2. 18
      src/main/java/xyz/soukup/ecoCraftCore/messages/JoinLeaveMessageSupress.java
  3. 29
      src/main/java/xyz/soukup/ecoCraftCore/regions/RegionManager.java
  4. 99
      src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java
  5. 16
      src/main/resources/messages.yml

@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull;
import xyz.soukup.ecoCraftCore.database.objects.*; import xyz.soukup.ecoCraftCore.database.objects.*;
import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand; import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand;
import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand; import xyz.soukup.ecoCraftCore.islands.IslandSelectorCommand;
import xyz.soukup.ecoCraftCore.messages.JoinLeaveMessageSupress;
import xyz.soukup.ecoCraftCore.mines.MineCommand; import xyz.soukup.ecoCraftCore.mines.MineCommand;
import xyz.soukup.ecoCraftCore.mines.MineWorldManager; import xyz.soukup.ecoCraftCore.mines.MineWorldManager;
import xyz.soukup.ecoCraftCore.money.MoneyCommand; import xyz.soukup.ecoCraftCore.money.MoneyCommand;
@ -85,6 +86,7 @@ public final class EcoCraftCore extends JavaPlugin {
registerCommands(); registerCommands();
registerEvents(); registerEvents();
prepareSlimeWorldsSaver(); prepareSlimeWorldsSaver();
prepareWorldInactivityUnloader();
}catch (IOException e) { }catch (IOException e) {
MineWorldManager.init(); MineWorldManager.init();
@ -113,6 +115,7 @@ public final class EcoCraftCore extends JavaPlugin {
AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance();
for (SlimeWorldInstance slimeWorldInstance : asp.getLoadedWorlds()){ for (SlimeWorldInstance slimeWorldInstance : asp.getLoadedWorlds()){
getLogger().info("Saved database world " + slimeWorldInstance.getName());
try { try {
asp.saveWorld(slimeWorldInstance); asp.saveWorld(slimeWorldInstance);
} catch (IOException e) { } catch (IOException e) {
@ -125,7 +128,7 @@ public final class EcoCraftCore extends JavaPlugin {
private void prepareWorldInactivityUnloader(){ private void prepareWorldInactivityUnloader(){
Bukkit.getScheduler().runTaskTimer(plugin, () -> { Bukkit.getScheduler().runTaskTimer(plugin, () -> {
long timeoutMillis = 30 * 60 * 1000; long timeoutMillis = 6 * 60 * 1000;
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance();
@ -148,6 +151,16 @@ public final class EcoCraftCore extends JavaPlugin {
if ((now - emptySince) >= timeoutMillis) { if ((now - emptySince) >= timeoutMillis) {
Bukkit.unloadWorld(world, true); Bukkit.unloadWorld(world, true);
getLogger().info("Unloading world " + world.getName() + " due to inactivity");
try {
UpdateBuilder<Island, Integer> 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 PreparePlayer(), this);
pm.registerEvents(new RegionEvents(), this); pm.registerEvents(new RegionEvents(), this);
pm.registerEvents(new MineWorldManager(), this); pm.registerEvents(new MineWorldManager(), this);
pm.registerEvents(new JoinLeaveMessageSupress(), this);
EventManager events = PacketEvents.getAPI().getEventManager(); EventManager events = PacketEvents.getAPI().getEventManager();
events.registerListener(new ChunkModifier(this), PacketListenerPriority.NORMAL); events.registerListener(new ChunkModifier(this), PacketListenerPriority.NORMAL);

@ -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);
}
}

@ -3,6 +3,7 @@ package xyz.soukup.ecoCraftCore.regions;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import xyz.soukup.ecoCraftCore.database.objects.Region; import xyz.soukup.ecoCraftCore.database.objects.Region;
import xyz.soukup.ecoCraftCore.database.objects.RegionMember;
import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent;
public class RegionManager { public class RegionManager {
@ -45,4 +46,32 @@ public class RegionManager {
return 0; 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;
}
} }

@ -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<CommandSourceStack> getCommand(){
return Commands.literal("edit-sign")
.requires(source -> source.getSender() instanceof Player)
.executes(SignEditCommand::openEditMenu);
}
private static int openEditMenu(CommandContext<CommandSourceStack> 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<Component> lines = signSide.lines();
MiniMessage miniMessage = MiniMessage.miniMessage();
List<ActionButton> 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())
);
}
}

@ -16,6 +16,10 @@ region:
error: error:
not-marked: "<red>Musíš nejprve označit pozice" not-marked: "<red>Musíš nejprve označit pozice"
not-exist: "<red>Region neexistuje" not-exist: "<red>Region neexistuje"
not-allowed-to-interact: "<red>Nemáš povolení dělat změny na tomto území"
sign-edit:
error:
not-sign: "<red>Musíš se dívat na cedulku."
shop: shop:
error: error:
already-shop: "<red>Tato cedule již je obchod" already-shop: "<red>Tato cedule již je obchod"
@ -67,6 +71,18 @@ gui:
error: error:
invalid-input: "<red>Vámi zadané hodnoty nejsou platné." invalid-input: "<red>Vámi zadané hodnoty nejsou platné."
all: "<green>Seznam guis: <yellow><1>, <2>" all: "<green>Seznam guis: <yellow><1>, <2>"
sign-edit:
title: "<green><bold>Editace Cedulky"
inputs:
line1: "<yellow>1. řádek"
line2: "<yellow>2. řádek"
line3: "<yellow>3. řádek"
line4: "<yellow>4. řádek"
buttons:
confirm: "<green>Potvrdit"
cancel: "<red>Zrušit"
copy: "<yellow>Kopírovat"
paste: "<yellow>Vložit"
shop-edit: shop-edit:
title: "<green><bold>Editace Obchodu" title: "<green><bold>Editace Obchodu"
inputs: inputs:

Loading…
Cancel
Save