diff --git a/pom.xml b/pom.xml index ab470a8..757f316 100644 --- a/pom.xml +++ b/pom.xml @@ -79,9 +79,22 @@ + src/main/resources true + + **/*.yml + + + + + + src/main/resources + false + + **/*.slime + diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index 4cf19e7..8839e05 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -20,8 +20,9 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import xyz.soukup.ecoCraftCore.database.objects.*; -import xyz.soukup.ecoCraftCore.islands.IslandCommand; +import xyz.soukup.ecoCraftCore.islands.IslandAdminCommand; import xyz.soukup.ecoCraftCore.money.MoneyCommand; +import xyz.soukup.ecoCraftCore.player.OnKill; import xyz.soukup.ecoCraftCore.player.PreparePlayer; import xyz.soukup.ecoCraftCore.player.TeleportRequestsHandler; import xyz.soukup.ecoCraftCore.positionMarker.RulerCommand; @@ -64,6 +65,7 @@ public final class EcoCraftCore extends JavaPlugin { PacketEvents.getAPI().init(); try { + saveIslandTemplates(); saveDefaultConfig(); Messages.init(); prepareDatabase(); @@ -87,6 +89,7 @@ public final class EcoCraftCore extends JavaPlugin { @Override public void onDisable() { + plugin.saveConfig(); VirtualChest.saveCache(); saveSlimeWorlds(); adiosDatabase(); @@ -166,9 +169,23 @@ public final class EcoCraftCore extends JavaPlugin { } } + private void saveIslandTemplates(){ + plugin.saveResource("island_templates/flat_grass.slime", false); + plugin.saveResource("island_templates/flat_sand.slime", false); + plugin.saveResource("island_templates/flat_hell.slime", false); + + + } + private void prepareDatabase() throws SQLException { - String databaseUrl = "jdbc:mysql://localhost:3306/ecc"; - connectionSource = new JdbcConnectionSource(databaseUrl, "ecc", "ecc"); + String databaseHost = config.getString("database.host"); + String databasePort = config.getString("database.port"); + String databaseName = config.getString("database.database"); + String databaseUsername = config.getString("database.user"); + String databasePassword = config.getString("database.password"); + + String databaseUrl = "jdbc:mysql://" + databaseHost + ":" + databasePort + "/" + databaseName; + connectionSource = new JdbcConnectionSource(databaseUrl, databaseUsername, databasePassword); Logger.getLogger("com.j256.ormlite.table.TableUtils").setLevel(Level.OFF); TableUtils.createTableIfNotExists(connectionSource, ActiveServer.class); @@ -213,13 +230,14 @@ public final class EcoCraftCore extends JavaPlugin { lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(ShopCommand.createCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(RulerCommand.createCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.createCommand().build())); - lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(IslandCommand.createCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(IslandAdminCommand.createCommand().build())); } private void registerEvents(){ PluginManager pm = this.getServer().getPluginManager(); pm.registerEvents(new TeleportRequestsHandler(), this); + pm.registerEvents(new OnKill(), this); pm.registerEvents(new RulerMarking(), this); pm.registerEvents(new VirtualChestLogic(), this); pm.registerEvents(new ShopLogic(), this); diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/ChunkModifier.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/ChunkModifier.java index 0a333a1..2ae90a1 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/islands/ChunkModifier.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/ChunkModifier.java @@ -52,6 +52,7 @@ public class ChunkModifier implements PacketListener { PersistentDataContainer pdc = world.getPersistentDataContainer(); String type = pdc.get(keyType, PersistentDataType.STRING); + if (type == null) return; String block; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java similarity index 85% rename from src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java rename to src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java index 8589957..ee6ada0 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandAdminCommand.java @@ -3,14 +3,12 @@ package xyz.soukup.ecoCraftCore.islands; import com.infernalsuite.asp.api.AdvancedSlimePaperAPI; import com.infernalsuite.asp.api.world.SlimeWorld; import com.j256.ormlite.stmt.QueryBuilder; -import com.mojang.brigadier.Message; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; 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 net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; @@ -24,9 +22,10 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; +import static xyz.soukup.ecoCraftCore.EcoCraftCore.config; import static xyz.soukup.ecoCraftCore.EcoCraftCore.plugin; -public class IslandCommand { +public class IslandAdminCommand { private final AdvancedSlimePaperAPI asp = AdvancedSlimePaperAPI.instance(); @@ -35,7 +34,7 @@ public class IslandCommand { LiteralArgumentBuilder tp = Commands.literal("tp") .then(Commands.argument("uuid", StringArgumentType.word()) - .executes(IslandCommand::teleport) + .executes(IslandAdminCommand::teleport) .suggests(((context, builder) -> { try { QueryBuilder queryBuilder = DaoRegistry.getIslandDao().queryBuilder(); @@ -66,7 +65,7 @@ public class IslandCommand { })) .then(Commands.argument("display_name", StringArgumentType.string()) .then(Commands.argument("description", StringArgumentType.greedyString()) - .executes(IslandCommand::createWorld)))); + .executes(IslandAdminCommand::createWorld)))); LiteralArgumentBuilder load = Commands.literal("load") .then(Commands.argument("uuid", StringArgumentType.word()) @@ -83,7 +82,7 @@ public class IslandCommand { throw new RuntimeException(e); } })) - .executes(IslandCommand::loadWorld)); + .executes(IslandAdminCommand::loadWorld)); LiteralArgumentBuilder loadTemplate = Commands.literal("loadTemplate") .then(Commands.argument("name", StringArgumentType.word()) @@ -100,7 +99,7 @@ public class IslandCommand { } return builder.buildFuture(); })) - .executes(IslandCommand::loadTemplate)); + .executes(IslandAdminCommand::loadTemplate)); LiteralArgumentBuilder template = Commands.literal("template") .then(Commands.argument("uuid", StringArgumentType.word()) @@ -118,31 +117,31 @@ public class IslandCommand { } }) .then(Commands.argument("templateName", StringArgumentType.word()) - .executes(IslandCommand::createTemplate))); + .executes(IslandAdminCommand::createTemplate))); LiteralArgumentBuilder metadata = Commands.literal("metadata") .then(Commands.argument("key", StringArgumentType.word()) .then(Commands.argument("value", IntegerArgumentType.integer()) - .executes(IslandCommand::setMetadata))); + .executes(IslandAdminCommand::setMetadata))); LiteralArgumentBuilder metadataString = Commands.literal("metadataString") .then(Commands.argument("key", StringArgumentType.word()) .then(Commands.argument("value", StringArgumentType.string()) - .executes(IslandCommand::setMetadataString))); + .executes(IslandAdminCommand::setMetadataString))); LiteralArgumentBuilder expand = Commands.literal("expand") .then(Commands.argument("lenght", IntegerArgumentType.integer()) - .executes(IslandCommand::expandIsland)); + .executes(IslandAdminCommand::expandIsland)); LiteralArgumentBuilder listMetadata = Commands.literal("listMetadata") - .executes(IslandCommand::readAllMetadata); + .executes(IslandAdminCommand::readAllMetadata); LiteralArgumentBuilder spawn = Commands.literal("spawn") - .executes(IslandCommand::setSpawn); + .executes(IslandAdminCommand::setSpawn); LiteralArgumentBuilder enviroment = Commands.literal("environment") .then(Commands.argument("environment", StringArgumentType.word()) - .executes(IslandCommand::setEnvironment) + .executes(IslandAdminCommand::setEnvironment) .suggests(((context, builder) -> { builder.suggest("normal"); builder.suggest("nether"); @@ -150,7 +149,11 @@ public class IslandCommand { return builder.buildFuture(); }))); - return Commands.literal("island") + LiteralArgumentBuilder setDefaultIsland = Commands.literal("setDefaultIsland") + .executes(IslandAdminCommand::setDefualtIsland); + + return Commands.literal("island-admin") + .requires(commandSourceStack -> commandSourceStack.getSender().isOp()) .then(tp) .then(create) .then(load) @@ -161,8 +164,20 @@ public class IslandCommand { .then(loadTemplate) .then(spawn) .then(enviroment) - .then(expand); + .then(expand) + .then(setDefaultIsland); + + + } + + private static int setDefualtIsland(CommandContext context){ + if (!(context.getSource().getSender() instanceof Player player)) return 0; + String uuid = player.getWorld().getName(); + config.set("islands.spawn", uuid); + plugin.saveConfig(); + player.sendMessage("done."); + return 0; } @@ -191,7 +206,8 @@ public class IslandCommand { private static int teleport(CommandContext context) { IslandManager islandManager = new IslandManager(); try { - islandManager.teleport((Player) context.getSource().getSender(), context.getArgument("uuid", String.class)); + Integer status = islandManager.teleport((Player) context.getSource().getSender(), context.getArgument("uuid", String.class)); + context.getSource().getSender().sendMessage(String.valueOf(status)); } catch (Exception e) { throw new RuntimeException(e); } @@ -203,19 +219,23 @@ public class IslandCommand { String type = context.getArgument("type", String.class); String displayName = context.getArgument("display_name", String.class); String description = context.getArgument("description", String.class); - islandManager.createIsland(type, displayName, description, "n", "n"); + String uuid = islandManager.createIsland(type, displayName, description, "n", "n"); + context.getSource().getSender().sendMessage("Created island: " + uuid); + return 0; } private static int loadWorld(CommandContext context) { IslandManager islandManager = new IslandManager(); islandManager.loadIsland(context.getArgument("uuid", String.class)); + context.getSource().getSender().sendMessage("done."); return 0; } private static int loadTemplate(CommandContext context) { IslandManager islandManager = new IslandManager(); islandManager.loadIslandTemplate(context.getArgument("name", String.class)); + context.getSource().getSender().sendMessage("done."); return 0; } @@ -235,9 +255,8 @@ public class IslandCommand { String keyName = StringArgumentType.getString(context, "key"); Integer value = IntegerArgumentType.getInteger(context, "value"); - - player.getWorld().getPersistentDataContainer().set(new NamespacedKey(plugin, keyName), PersistentDataType.INTEGER, value); + context.getSource().getSender().sendMessage(keyName + " set to " + value); return 1; } @@ -248,7 +267,8 @@ public class IslandCommand { String value = StringArgumentType.getString(context, "value"); player.getWorld().getPersistentDataContainer().set(new NamespacedKey(plugin, keyName), PersistentDataType.STRING, value); - + context.getSource().getSender().sendMessage(keyName + " set to " + value); + return 1; } diff --git a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java index 9cbaec9..12ee841 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/islands/IslandManager.java @@ -16,7 +16,6 @@ import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.stmt.UpdateBuilder; import org.bukkit.*; import org.bukkit.entity.Player; -import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import xyz.soukup.ecoCraftCore.database.objects.Island; import xyz.soukup.ecoCraftCore.database.DaoRegistry; @@ -75,8 +74,6 @@ public class IslandManager { props.setValue(SlimeProperties.SPAWN_Z, 0); slimeWorld = asp.createEmptyWorld(uuid, false, props, databaseLoader); - - asp.saveWorld(slimeWorld); } @@ -90,25 +87,32 @@ public class IslandManager { - public void teleport(Player player, String uuid) throws Exception { - teleport(player, uuid, null, null, null, null, null); + public int teleport(Player player, String uuid) throws Exception { + return teleport(player, uuid, null, null, null, null, null); + } - public void teleport(Player player, String uuid, Integer x, Integer y, Integer z, Float yaw, Float pitch) throws Exception { + public int teleport(Player player, String uuid, Integer x, Integer y, Integer z, Float yaw, Float pitch) throws Exception { + + if(uuid == null) return 4; + if (Bukkit.getWorld(uuid) != null){ teleportLocally(player, uuid, x, y, z, yaw, pitch); + return 2; } String whereIsActive = whereIsActive(uuid); - if (whereIsActive != null){ + if (whereIsActive != null && !whereIsActive.isEmpty()){ + plugin.getLogger().info("dd: "+ whereIsActive); sendPlayerAway(player, whereIsActive, uuid, x, y, z, yaw, pitch); + return 3; } QueryBuilder queryBuilder = dao.queryBuilder().setCountOf(true); queryBuilder.where().eq("uuid", uuid); if (dao.countOf(queryBuilder.prepare()) < 1){ - return; + return 1; } if (player.getVirtualHost() != null){ @@ -120,6 +124,7 @@ public class IslandManager { } teleportLocally(player, uuid, x, y, z, yaw, pitch); + return 0; } @@ -271,7 +276,7 @@ public class IslandManager { switch (islandType){ case "flat_grass" -> flatExpander(world, yaw, lenght, Material.GRASS_BLOCK, Material.STONE, Material.WATER); case "flat_sand" -> flatExpander(world, yaw, lenght, Material.SAND, Material.STONE, Material.WATER); - case "flat_hell" -> flatExpander(world, yaw, lenght, Material.SOUL_SOIL, Material.NETHERRACK, Material.LAVA); + case "flat_hell" -> flatExpander(world, yaw, lenght, Material.SOUL_SAND, Material.NETHERRACK, Material.LAVA); } @@ -384,8 +389,9 @@ public class IslandManager { if ((x >= xMin && x <= xMax) && (z >= zMin && z <= zMax)) { continue; } - world.setType(x, y, z, surrounding); - world.setType(x, y+1, z, surrounding); + world.getBlockAt(x,y,z).setType(surrounding, false); + world.getBlockAt(x,y+1,z).setType(surrounding, false); + } } ; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/player/OnKill.java b/src/main/java/xyz/soukup/ecoCraftCore/player/OnKill.java new file mode 100644 index 0000000..51bfd46 --- /dev/null +++ b/src/main/java/xyz/soukup/ecoCraftCore/player/OnKill.java @@ -0,0 +1,27 @@ +package xyz.soukup.ecoCraftCore.player; + +import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import xyz.soukup.ecoCraftCore.islands.IslandManager; + +import static xyz.soukup.ecoCraftCore.EcoCraftCore.config; + +public class OnKill implements Listener { + @EventHandler + public void spawnTeleportOnKill(PlayerPostRespawnEvent event){ + Player player = event.getPlayer(); + + String uuid = config.getString("islands.spawn"); + + IslandManager islandManager = new IslandManager(); + try { + islandManager.teleport(player, uuid); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/xyz/soukup/ecoCraftCore/player/TeleportRequestsHandler.java b/src/main/java/xyz/soukup/ecoCraftCore/player/TeleportRequestsHandler.java index 99ac37b..56a7c25 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/player/TeleportRequestsHandler.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/player/TeleportRequestsHandler.java @@ -1,9 +1,11 @@ package xyz.soukup.ecoCraftCore.player; +import com.google.common.eventbus.DeadEvent; import com.j256.ormlite.stmt.QueryBuilder; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.database.objects.TeleportRequest; @@ -11,6 +13,8 @@ import xyz.soukup.ecoCraftCore.islands.IslandManager; import java.sql.SQLException; +import static xyz.soukup.ecoCraftCore.EcoCraftCore.config; + public class TeleportRequestsHandler implements Listener { @EventHandler @@ -23,11 +27,14 @@ public class TeleportRequestsHandler implements Listener { TeleportRequest teleportRequest = queryBuilder.queryForFirst(); + IslandManager islandManager = new IslandManager(); + + if (teleportRequest == null){ + islandManager.teleport(player, config.getString("islands.spawn")); return; } - IslandManager islandManager = new IslandManager(); islandManager.teleportLocally(player, teleportRequest.getWorld(), teleportRequest.getX(), teleportRequest.getY(), teleportRequest.getY(), teleportRequest.getYaw(), teleportRequest.getPitch()); @@ -35,6 +42,9 @@ public class TeleportRequestsHandler implements Listener { } catch (SQLException e) { throw new RuntimeException(e); + } catch (Exception e) { + throw new RuntimeException(e); } } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index af80369..3d9ced4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -9,4 +9,6 @@ database: password: "ecc" database: "ecc" cache: - save-interval: 6000 \ No newline at end of file + save-interval: 6000 +islands: + spawn: null \ No newline at end of file diff --git a/src/main/resources/island_templates/flat_grass.slime b/src/main/resources/island_templates/flat_grass.slime new file mode 100644 index 0000000..7345ce4 Binary files /dev/null and b/src/main/resources/island_templates/flat_grass.slime differ diff --git a/src/main/resources/island_templates/flat_hell.slime b/src/main/resources/island_templates/flat_hell.slime new file mode 100644 index 0000000..b047926 Binary files /dev/null and b/src/main/resources/island_templates/flat_hell.slime differ diff --git a/src/main/resources/island_templates/flat_sand.slime b/src/main/resources/island_templates/flat_sand.slime new file mode 100644 index 0000000..7874e7e Binary files /dev/null and b/src/main/resources/island_templates/flat_sand.slime differ