From ea42ca1e9a81e555a79d7082d94a68d52cb7e6d3 Mon Sep 17 00:00:00 2001 From: thedrewen Date: Mon, 23 Feb 2026 18:22:42 +0100 Subject: [PATCH] feat: Add core functionality for chests and farming mechanics - Implemented ChestsManager to handle player interactions with custom chests. - Created CustomMaterial class to define custom materials with properties. - Developed EventManager for handling chat events (currently empty). - Introduced Farm class to manage block breaking and item drops with custom logic. - Added utility methods in Utils class for random element selection and block manipulation. - Created Model class for managing 3D model commands. - Defined plugin.yml for command registration and permissions. --- .vscode/settings.json | 3 + pom.xml | 34 ++++++ src/main/java/be/thedrewen/Main.java | 52 ++++++++ .../java/be/thedrewen/commands/Models.java | 111 ++++++++++++++++++ .../java/be/thedrewen/src/ChestsManager.java | 43 +++++++ .../java/be/thedrewen/src/CustomMaterial.java | 22 ++++ .../java/be/thedrewen/src/EventManager.java | 12 ++ src/main/java/be/thedrewen/src/Farm.java | 93 +++++++++++++++ src/main/java/be/thedrewen/src/Utils.java | 67 +++++++++++ .../java/be/thedrewen/src/custom/Model.java | 13 ++ src/main/resources/plugin.yml | 18 +++ target/classes/be/thedrewen/Main.class | Bin 0 -> 2641 bytes .../be/thedrewen/commands/Models.class | Bin 0 -> 4368 bytes .../be/thedrewen/src/ChestsManager.class | Bin 0 -> 1588 bytes .../be/thedrewen/src/CustomMaterial.class | Bin 0 -> 1011 bytes .../be/thedrewen/src/EventManager.class | Bin 0 -> 953 bytes target/classes/be/thedrewen/src/Farm.class | Bin 0 -> 4565 bytes target/classes/be/thedrewen/src/Utils.class | Bin 0 -> 3598 bytes .../be/thedrewen/src/custom/Model.class | Bin 0 -> 1073 bytes target/classes/plugin.yml | 18 +++ 20 files changed, 486 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 pom.xml create mode 100644 src/main/java/be/thedrewen/Main.java create mode 100644 src/main/java/be/thedrewen/commands/Models.java create mode 100644 src/main/java/be/thedrewen/src/ChestsManager.java create mode 100644 src/main/java/be/thedrewen/src/CustomMaterial.java create mode 100644 src/main/java/be/thedrewen/src/EventManager.java create mode 100644 src/main/java/be/thedrewen/src/Farm.java create mode 100644 src/main/java/be/thedrewen/src/Utils.java create mode 100644 src/main/java/be/thedrewen/src/custom/Model.java create mode 100644 src/main/resources/plugin.yml create mode 100644 target/classes/be/thedrewen/Main.class create mode 100644 target/classes/be/thedrewen/commands/Models.class create mode 100644 target/classes/be/thedrewen/src/ChestsManager.class create mode 100644 target/classes/be/thedrewen/src/CustomMaterial.class create mode 100644 target/classes/be/thedrewen/src/EventManager.class create mode 100644 target/classes/be/thedrewen/src/Farm.class create mode 100644 target/classes/be/thedrewen/src/Utils.class create mode 100644 target/classes/be/thedrewen/src/custom/Model.class create mode 100644 target/classes/plugin.yml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e0f15db --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0d7d01c --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + be.thedrewen + endariel + 1.0-SNAPSHOT + + + 17 + 17 + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + + org.spigotmc + spigot-api + 1.21.7-R0.1-SNAPSHOT + provided + + + + \ No newline at end of file diff --git a/src/main/java/be/thedrewen/Main.java b/src/main/java/be/thedrewen/Main.java new file mode 100644 index 0000000..59414b2 --- /dev/null +++ b/src/main/java/be/thedrewen/Main.java @@ -0,0 +1,52 @@ +package be.thedrewen; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.java.JavaPlugin; + +import be.thedrewen.commands.Models; +import be.thedrewen.src.ChestsManager; +import be.thedrewen.src.EventManager; +import be.thedrewen.src.Farm; + + +public class Main extends JavaPlugin{ + + public static String prefix = "§b[§aEndariel§b]§a "; + + // Custom + public Farm farm; + public Models models; + public ChestsManager chestsManager; + + // set + public World world; + + @Override + public void onEnable() { + this.getServer().getConsoleSender().sendMessage(prefix+"Plugin chargé !"); + + // Events + this.getServer().getPluginManager().registerEvents(new EventManager(), this); + + // Custom + farm = new Farm(this); + this.getServer().getPluginManager().registerEvents(farm, this); + models = new Models(this); + this.getServer().getPluginManager().registerEvents(models, this); + this.getCommand("models").setExecutor(models); + chestsManager = new ChestsManager(this); + this.getServer().getPluginManager().registerEvents(chestsManager, this); + + // set + world = Bukkit.getWorld("world"); + } + + + @Override + public void onDisable() { + this.getServer().getConsoleSender().sendMessage(prefix+"Plugin déchargé !"); + } +} + +// e.getEntity().getWorld().spawnParticle(Particle.CLOUD, p, 1, 0, 0, 0,0); \ No newline at end of file diff --git a/src/main/java/be/thedrewen/commands/Models.java b/src/main/java/be/thedrewen/commands/Models.java new file mode 100644 index 0000000..8a45f7e --- /dev/null +++ b/src/main/java/be/thedrewen/commands/Models.java @@ -0,0 +1,111 @@ +package be.thedrewen.commands; + +import java.util.ArrayList; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.CommandBlock; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import be.thedrewen.Main; +import be.thedrewen.src.Utils; +import be.thedrewen.src.custom.Model; + +public class Models implements CommandExecutor, Listener { + + private ArrayList models = new ArrayList<>(); + private Main main; + + public Models(Main main) { + this.main = main; + models.add(new Model( + "Model#Crate", + "minecraft:player_head[minecraft:custom_name={\"text\":\"Oak Crate\",\"color\":\"gold\",\"underlined\":true,\"bold\":true,\"italic\":false},profile={id:[I;-1007994559,-1679604778,-1794762551,1728396796],properties:[{name:\"textures\",value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmUxZWMzYWFmZjJkYzhkODU5MTU3NGZlNjZhZGFjZjYyNzFhMGFkYWQ5ZmY4MGI0NjU0ZTIxN2YzOGQ5ZTM3ZiJ9fX0=\"}]}] 1", + "/summon block_display ~-0.5 ~-0.5 ~-0.5 {Passengers:[{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;435182028,652006285,1982265827,465576613],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE0NTU2NSwKICAicHJvZmlsZUlkIiA6ICIwNTAzNzZmZjAxY2I0OGVjOTUwM2NhMjhjMWU2MzlkMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJKb25haDU1OTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGI2MmVlZGM5MTBhOWM4NmUxNWU5MGUyYjkxZmIwZjI0ZmRjOTc1ZGM2YmUxNjI2ZmJmMDViMjk2OTQ5NTg0NiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.25f,0f,1f,0f,0.5f,0f,0f,1f,0.25f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;-1719494636,904447878,603764321,821904884],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE1MTI1MSwKICAicHJvZmlsZUlkIiA6ICIxNTUyNmU1OGZhOWE0NjBmODhhNmZhNjk1M2RlNjgzNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJQaWVkcml0YTE3IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzk2Zjg1Yzc4ODIzMWMxNjgwMDdjNTYxNjMyN2ZhOTdlZGM4MDBmNDY2MmQ0NDJmMDdlZjg5NTc3NTQ4NTI2MDEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.75f,0f,1f,0f,0.5f,0f,0f,1f,0.25f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;-137103451,337023705,1861962498,1317402097],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE1NjczNSwKICAicHJvZmlsZUlkIiA6ICJiYzRlZGZiNWYzNmM0OGE3YWM5ZjFhMzlkYzIzZjRmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICI4YWNhNjgwYjIyNDYxMzQwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFiNTQ5NTQzZWE2YWJlNTk2MmFlNDg4MDFlZDY4MzNiNWVkYmZhMDY1YWZlNGNmZDcxNTVkNmYwM2FjNDM2NzgiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.75f,0f,1f,0f,0.5f,0f,0f,1f,0.75f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;198318252,-1542825996,-2119735926,1667912998],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE2MjQ2MywKICAicHJvZmlsZUlkIiA6ICI3YTVkYmRlNDk0NWU0YTE4Yjg2OWY1MGY1NTJjNjlkYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdWtraXRBUEkiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTgwNGEyY2U2YzM2NmFlNDk1M2M1OWJkNDUyZjJlZmQyZWM1NTJmNTM1YmEyZTdmNzlhMzZhMzExYmFiNDE5YyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.25f,0f,1f,0f,0.5f,0f,0f,1f,0.75f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;-769559302,-931765044,-100238730,881291772],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE0NTU2NSwKICAicHJvZmlsZUlkIiA6ICIwNTAzNzZmZjAxY2I0OGVjOTUwM2NhMjhjMWU2MzlkMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJKb25haDU1OTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGI2MmVlZGM5MTBhOWM4NmUxNWU5MGUyYjkxZmIwZjI0ZmRjOTc1ZGM2YmUxNjI2ZmJmMDViMjk2OTQ5NTg0NiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.75f,0f,1f,0f,1f,0f,0f,1f,0.75f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;-1925527033,1411148063,1286768516,145878837],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE1MTI1MSwKICAicHJvZmlsZUlkIiA6ICIxNTUyNmU1OGZhOWE0NjBmODhhNmZhNjk1M2RlNjgzNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJQaWVkcml0YTE3IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzk2Zjg1Yzc4ODIzMWMxNjgwMDdjNTYxNjMyN2ZhOTdlZGM4MDBmNDY2MmQ0NDJmMDdlZjg5NTc3NTQ4NTI2MDEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.25f,0f,1f,0f,1f,0f,0f,1f,0.75f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;1839877433,1997432432,-456468224,-1488396023],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE1NjczNSwKICAicHJvZmlsZUlkIiA6ICJiYzRlZGZiNWYzNmM0OGE3YWM5ZjFhMzlkYzIzZjRmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICI4YWNhNjgwYjIyNDYxMzQwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFiNTQ5NTQzZWE2YWJlNTk2MmFlNDg4MDFlZDY4MzNiNWVkYmZhMDY1YWZlNGNmZDcxNTVkNmYwM2FjNDM2NzgiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.25f,0f,1f,0f,1f,0f,0f,1f,0.25f,0f,0f,0f,1f]},{id:\"minecraft:item_display\",item:{id:\"minecraft:player_head\",Count:1,components:{\"minecraft:profile\":{id:[I;36216811,1333781149,-1178409489,446297731],properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTc0NTA3MDE2MjQ2MywKICAicHJvZmlsZUlkIiA6ICI3YTVkYmRlNDk0NWU0YTE4Yjg2OWY1MGY1NTJjNjlkYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdWtraXRBUEkiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTgwNGEyY2U2YzM2NmFlNDk1M2M1OWJkNDUyZjJlZmQyZWM1NTJmNTM1YmEyZTdmNzlhMzZhMzExYmFiNDE5YyIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\"}]}}},item_display:\"none\",transformation:[1f,0f,0f,0.75f,0f,1f,0f,1f,0f,0f,1f,0.25f,0f,0f,0f,1f]}]}")); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + + if (sender instanceof Player) { + Player player = (Player) sender; + + Inventory inv = Bukkit.createInventory(null, 9, "§aModels"); + + models.forEach(m -> { + ItemStack item = Bukkit.getItemFactory().createItemStack(m.cmd); + Utils.setItemName(item, m.name); + inv.addItem(item); + }); + player.openInventory(inv); + } + + return true; + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent e) { + + Player player = e.getPlayer(); + Block block = e.getBlock(); + Location location = e.getBlock().getLocation(); + World world = e.getBlock().getWorld(); + + Optional model = models.stream().filter(m -> m.name.equals(e.getItemInHand().getItemMeta().getDisplayName())).findFirst(); + if(model.isPresent()) { + Model modelI = model.get(); + + Block blockTop = location.clone().add(0, 1, 0).getBlock(); + BlockState originalState = blockTop.getState(); + BlockData originalData = blockTop.getBlockData(); + block.setType(Material.COMMAND_BLOCK); + CommandBlock commandBlock = (CommandBlock) block.getState(); + commandBlock.setCommand(modelI.cmds); + commandBlock.update(); + + blockTop.setType(Material.REDSTONE_BLOCK); + blockTop.setBlockData(originalData); + originalState.update(true, false); + + new BukkitRunnable() { + public void run() { + location.getBlock().setType(Material.BARRIER); + }; + }.runTaskLater(main, 5L); + } + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent e) { + Player player = e.getPlayer(); + Block block = e.getBlock(); + Location location = e.getBlock().getLocation(); + World world = e.getBlock().getWorld(); + if(block.getType() == Material.BARRIER) { + ArmorStand armorStand = (ArmorStand) world.spawnEntity(location, EntityType.ARMOR_STAND); + armorStand.setGravity(false); + armorStand.addScoreboardTag("delete_models"); + Bukkit.dispatchCommand(player, "execute at @e[tag=delete_models] run kill @e[distance=..0.5,type=!player]"); + armorStand.remove(); + } + } +} diff --git a/src/main/java/be/thedrewen/src/ChestsManager.java b/src/main/java/be/thedrewen/src/ChestsManager.java new file mode 100644 index 0000000..3a78da2 --- /dev/null +++ b/src/main/java/be/thedrewen/src/ChestsManager.java @@ -0,0 +1,43 @@ +package be.thedrewen.src; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Chest; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; + +import be.thedrewen.Main; + +public class ChestsManager implements Listener { + + private Main main; + + public ChestsManager(Main main) { + this.main = main; + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent e) { + + if(e.getClickedBlock() != null) { + Block block = e.getClickedBlock(); + Player player = e.getPlayer(); + if(block.getType() == Material.CHEST) { + Chest chest = (Chest) block.getState(); + if(chest.getCustomName() != null && chest.getCustomName().equalsIgnoreCase("chest_home")) { + e.setCancelled(true); + + Inventory inv = Bukkit.createInventory(chest, 54); + + + + player.openInventory(inv); + } + } + } + } +} diff --git a/src/main/java/be/thedrewen/src/CustomMaterial.java b/src/main/java/be/thedrewen/src/CustomMaterial.java new file mode 100644 index 0000000..3a6a456 --- /dev/null +++ b/src/main/java/be/thedrewen/src/CustomMaterial.java @@ -0,0 +1,22 @@ + +package be.thedrewen.src; + +import org.bukkit.Material; + +public class CustomMaterial { + + public Material type; + public String name; + private boolean replacable = true; + + public CustomMaterial(Material type, String name, boolean replacable) { + this.type = type; + this.name = name; + this.replacable = replacable; + } + + public boolean isReplacable() { + return replacable; + } + +} diff --git a/src/main/java/be/thedrewen/src/EventManager.java b/src/main/java/be/thedrewen/src/EventManager.java new file mode 100644 index 0000000..6841f7b --- /dev/null +++ b/src/main/java/be/thedrewen/src/EventManager.java @@ -0,0 +1,12 @@ +package be.thedrewen.src; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class EventManager implements Listener{ + + @EventHandler + public void onChatSend(AsyncPlayerChatEvent e) { + } +} diff --git a/src/main/java/be/thedrewen/src/Farm.java b/src/main/java/be/thedrewen/src/Farm.java new file mode 100644 index 0000000..741536a --- /dev/null +++ b/src/main/java/be/thedrewen/src/Farm.java @@ -0,0 +1,93 @@ +package be.thedrewen.src; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.Random; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.entity.Display.Billboard; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import be.thedrewen.Main; + +public class Farm implements Listener { + + private Main main; + private ArrayList farmableBlock = new ArrayList<>(); + + public Farm(Main main) { + this.main = main; + + farmableBlock.add(new CustomMaterial(Material.SPRUCE_LOG, "§6Spruce Log", false)); + + // Minerais + farmableBlock.add(new CustomMaterial(Material.COAL_ORE, "§8Coal ore", true)); + farmableBlock.add(new CustomMaterial(Material.IRON_ORE, "§fIron ore", true)); + farmableBlock.add(new CustomMaterial(Material.COPPER_ORE, "§6Copper ore", true)); + farmableBlock.add(new CustomMaterial(Material.GOLD_ORE, "§eGold ore", true)); + farmableBlock.add(new CustomMaterial(Material.REDSTONE_ORE, "§cRedstone", true)); + farmableBlock.add(new CustomMaterial(Material.LAPIS_ORE, "§1Lapis", true)); + farmableBlock.add(new CustomMaterial(Material.DIAMOND_ORE, "§bDiamond", true)); + farmableBlock.add(new CustomMaterial(Material.EMERALD_ORE, "§2Emerald", true)); + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent e) { + + Player player = e.getPlayer(); + Block block = e.getBlock(); + Location location = block.getLocation(); + Collection drops = block.getDrops(player.getInventory().getItemInMainHand()); + + if (player.getGameMode() == GameMode.SURVIVAL + && farmableBlock.stream().anyMatch(item -> item.type.equals(block.getType()))) { + e.setCancelled(true); + Optional customMaterial = farmableBlock.stream() + .filter(item -> item.type.equals(block.getType())).findFirst(); + if (customMaterial.isPresent()) { + CustomMaterial item = customMaterial.get(); + if (item.isReplacable()) { + block.setType(Material.BEDROCK); + } else { + block.setType(Material.AIR); + } + new BukkitRunnable() { + @Override + public void run() { + block.setType(item.type); + }; + }.runTaskLater(main, (Utils.getRandolInteger(5, 20) * 20)); + + if (drops.size() > 0) { + TextDisplay t = location.getWorld().spawn(new Location(location.getWorld(), + location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5), + TextDisplay.class); + t.setBillboard(Billboard.CENTER); + t.setSeeThrough(true); + ItemStack drop = drops.stream().findFirst().get(); + t.setText("§a+" + drop.getAmount() + " " + item.name); + new BukkitRunnable() { + @Override + public void run() { + t.remove(); + } + }.runTaskLater(main, 30L); + player.getInventory().addItem(drop); + player.playSound(location, Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1.0f, 1.0f); + } + } + } + } +} diff --git a/src/main/java/be/thedrewen/src/Utils.java b/src/main/java/be/thedrewen/src/Utils.java new file mode 100644 index 0000000..a78ac5c --- /dev/null +++ b/src/main/java/be/thedrewen/src/Utils.java @@ -0,0 +1,67 @@ +package be.thedrewen.src; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.components.CustomModelDataComponent; + +public class Utils { + + private static final Random random = new Random(); + + public static T getRandomElement(ArrayList list) { + + return list.get(random.nextInt(list.size())); + } + + public static Integer getRandolInteger(Integer min, Integer max) { + return random.nextInt(max - min + 1) + min; + } + + public static List getBlocksBetween(Location loc1, Location loc2) { + List blocks = new ArrayList<>(); + + int x1 = loc1.getBlockX(); + int y1 = loc1.getBlockY(); + int z1 = loc1.getBlockZ(); + + int x2 = loc2.getBlockX(); + int y2 = loc2.getBlockY(); + int z2 = loc2.getBlockZ(); + + for (int x = Math.min(x1, x2); x <= Math.max(x1, x2); x++) { + for (int y = Math.min(y1, y2); y <= Math.max(y1, y2); y++) { + for (int z = Math.min(z1, z2); z <= Math.max(z1, z2); z++) { + blocks.add(loc1.getWorld().getBlockAt(x, y, z)); + } + } + } + + return blocks; + } + + + public static void addCustomModelDataString(ItemStack item, String name) { + ItemMeta meta = item.getItemMeta(); + CustomModelDataComponent componentSword = meta.getCustomModelDataComponent(); + componentSword.setStrings(Arrays.asList(name)); + meta.setCustomModelDataComponent(componentSword); + item.setItemMeta(meta); + } + public static void setItemName(ItemStack item, String name) { + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + } + public static void setItemLore(ItemStack item, List lores) { + ItemMeta meta = item.getItemMeta(); + meta.setLore(lores); + item.setItemMeta(meta); + } +} diff --git a/src/main/java/be/thedrewen/src/custom/Model.java b/src/main/java/be/thedrewen/src/custom/Model.java new file mode 100644 index 0000000..a864766 --- /dev/null +++ b/src/main/java/be/thedrewen/src/custom/Model.java @@ -0,0 +1,13 @@ +package be.thedrewen.src.custom; + +public class Model { + public String name; + public String cmd; + public String cmds; + + public Model(String name, String cmd, String cmds) { + this.name = name; + this.cmd = cmd; + this.cmds = cmds; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..79b6298 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,18 @@ +name: Endariel +main: be.thedrewen.Main +version: 1.0.0 +api-version: '1.21' +commands: + test: + description: "Tester les fonctions." + usage: /test + permission: be.thedrewen.op + + models: + description: "Ui pour faire spawn des Models 3Ds." + usage: /models + permission: be.thedrewen.op + +permissions: + be.thedrewen.op: + default: op \ No newline at end of file diff --git a/target/classes/be/thedrewen/Main.class b/target/classes/be/thedrewen/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..629e99998c8aef766211c580e46746ff4a8b28ee GIT binary patch literal 2641 zcmeHJ+invv5FMv&E=wV$r4%R^mum{r=7lG20t$$rgd$o%JUY8hV%W8V?d|1*_y#19 z;GK^`jJ-|MK#(dx0wf-Gz4pwU8INa<_w$$c9|7PdTq!|;z~MHp+a8ZK-{i91VnUW+ zlEBO>w!!KNlim7i`xTEYfns0tj@TkF+Z+nltQN9+oxo&=>6E}ia|F-msQv&2s8CE* z%o9W4^r%Xt(v->A)LUMTng^pEH`cV6WL>Ta&`|@2xw2OSO{O-LPGT3D(%pJHd;MD2 z`U|(_Jl_yf*jof9YRk_t(iL=6f;j@!;Xdwbt#ldY$>i;4Qgfq{4IWdBtuGR0g_5+d zRXgFSxkiJ^dXH1P-RIN+gf2^Ao+TPFDV3#dP6r?%ZCEM{6*3kY6PawIsKYgv5qjuo zmE!zOhO(H3QNoO&9g%P|)=Qr5U-aT5$2^63p2B{Tb%hN5ULN6wp7?q0zbCk6I_hmx z)uC7?`L&gG{RUeZBS{X{X|5UNv{1DYrcp(=NAb zT%*~zXh$-z&k%kR`%jv!zRAOHiPg93u1nt-yKe6Kj?Np$xPx<&R2YNg zlb2*3>fdnS0nEa}G*sajf%)3^TJa3_S&>VEZ^)f7x!rVR>Zea1hZ@%HH z-I8>tkaOgaIR4$fAy85Bo-nSS%5a{*+kc`+u(;P$rX&6UuT0#7I~0GBVe2*I@N#-M zxW-DbJo0ms(*}X*R!%1Cc&i&&0{mIPpQI_M;8Vme0wpN>u>ye~55Tk^55gfFCs3mb zGx$D?v#Wj%5PX2ym$OIS!O>5+T7cvDE~1XZJAv~uy z=9ve65)w%8&M)CtAkOUA@uiz|QQ8Nj%39Ct&Y3gk@}0~4_0MmA0KnJqWeH|HSZlGs zbXla>PfP@%OcE+09qh=6#kvHu9xNZxV;aO%bb{U15erQT<~&%HsuQ%*UXPoA9W!Bq zCf9}uraYKSvfUmmG&hu@Cw8UoL3xjN1U0E*9;}a6?l&hy&?*eVR2!K%A?gos>uf@~ z@ZicM=?;Fx#ku=jaPz=}Yt@|f+97U#hys=14G)$^%4{hm)jVABO1~Tk#k7o%SwzqR zeI8T8r67GJTQN)YSEN$j?=oUe`ixixzO{z$tU*F5gfyhZ$dHLo8isI9xQMtygT*Jf z)Mko_5Km|;nc(}6DXvAt4`Zq|Y4e!r=~Gg}WB=fw@#unQWOAdweCIEJGjrSYX_-#n zrb19u`URh;LxflwGc`DSc#M;QCw-}mvuvjGDQa@WIAhCh-@1&(#dn-xSjWH1nW8G} zo)Fn47$45}E-IXBLn(BIcvC5#CoeIQ&}@5gx<=BEdB_dXX`d;?q|ipCp^=I>&{b|2mvV##r*i*L+@y5lm>@h+SncYba#ig*2A3r+NzPe`=7oBx7Io2G)wbj;| zE8$urnKPRst(13jRz00<%Q#|c9sOm7Cat*)VXc@Q(4#_o)fH z4_%*79gKSnGZCWLnP~c?!T_$oGF)AR%W%zutJUVHR6D+PTgsQ3nD8E_NsFm{>uwKL ztc&79sDrhmSq@yMPzRs=)uZ z!eDmYlc@^XH+bK|`>AW_eOqa;cOUPF zn8X(zGi`R5EmL@l{sJq}#3gsC5Z%5Dx4?tf@VNvt_$$FY&dYdDpMeTK3$TduS^Rbx zUdR6>e7lGAGdNa$hvn~9R(^#y|IFy$!v8s>0es%Z|HW)xfmL`X`*t1HaNoNFsv9^C zxn07!<90KLo1e?=7QBbt-XCzgJ;rS$+Xp$^8oAs)g6ea*)pEEU<#3yYJ1ETztivZb V0(^$gJlf31=TrC`->g0F{R`B=ltKUi literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/ChestsManager.class b/target/classes/be/thedrewen/src/ChestsManager.class new file mode 100644 index 0000000000000000000000000000000000000000..7dae1fdd9e191556ff90eec1f96c5201c0c3eb9a GIT binary patch literal 1588 zcmeHHO>Yx15FMwXX_r7tOAFp+Vxpjl>L01`Q;k`JcC9JDh$?p82SWbi=R-3&PL&Og3i0H z&|-kL22}=&M`9#GCG;SC(>ub*GpMFQY6i=liSRCMZZepCDz)^_8LT#^_%{wIeA~oW zgR2Y{F0gm3HFgfJvC7N$+M+XRgfWjyI+RLyX*3^N(^HtbCp?%xNRa#S5P1&J%E`4# zay$}R8_#>l&p=wd?YVSZ>R4Lhug2u+qeUIj4Sj1;T7S&Q7xPx6gmb(v6}s}4M4}Zo zO2*vuIn}DXcA`urcx1Gb&ZG9hd^;T~8A;DwHbhHVXyH6Wje;b)EKvT zH*=ojNf|~Ar5>4MXOC1vlbttUN*Qc9R zpGe1mPpbJ+vyk)`jee`d7;Rg7Qcd0}kD4802Vt+sB*Z-Xa9ErPCy(yru7cLuyG(nT z;-PesSZw8bE;@inG%lkRfxAM-3hm|`++pnXUpCNx4HZwwA2q}v*f*Jt@D)7=B#w!u zZ{?CAZMF493*)^D>ah_I>$y=d0_zJ;? zrTS;M{=GPJgT`4plSeMmSTF1Vmf>cxw*spackA@jZJIBmtxZ8|OhKE0yA)r6dvKp- LfOYz+bl=P`(Hib0 literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/CustomMaterial.class b/target/classes/be/thedrewen/src/CustomMaterial.class new file mode 100644 index 0000000000000000000000000000000000000000..d9fe4977f48e82844d85709668b05977adfbb075 GIT binary patch literal 1011 zcma)5O>fgc5S>jzK1^szO8JIvIVD1}FP!+gR3KGKK%!|SdRyC*WE*?e?5+d-Wk?{w zogal5+f;4T2zv2&cV^za-S_s_?{7Z<;1xV+L5;yqh=H49Z16Lxz?vx7%dOMtSU5CN zBrRw#*gO$S5hOy*g7@JGMvg(loo2{jd!)@Q2=m24y5Owm1*MfpDcv8PcOEz+)r@kU z!7LGx2otJc#|)Y;rIPM7gQtVFaF;=jhetGHPsiAT9)sTblsCp`(}tUj9Udx!Rwql0 zd8E@!Cc;UrcxE(BPVIBtr^LS1IeA{q9ovT_R}npk#yYV85&}&tTTD! zwBZ${!LXQ~s~D$JVeIoU3B~bC)kbWjTIvOILA>Xy2v?+V6`me!z*ZNo!z~hja9No` znBIs8zRS}P&7@MfKhlv%js!W1?*8v)!_B2-usiyX1<5j9X+K;rO?@ytZo@ zG1=`v=O)6pqy>YmRd@S^?k(Ue7O$>>hK{ARWZ4NB#KJBxsMEu#Q@jRE`eV?7HpLor zz$+u8d+E~t4O%^;$_7R6J8XRHZ+?aT&$4ElzD=qr`ft;>sHZBp19!{4dvN~(LYXTO X9;`v=uR*B6Bf_b{V`2=%fS&jtgtHb{ literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/EventManager.class b/target/classes/be/thedrewen/src/EventManager.class new file mode 100644 index 0000000000000000000000000000000000000000..ee1e0e55e009f6d386c6c772b05a70e79f6bb9e5 GIT binary patch literal 953 zcmaJ=QEw7K5S|5E;6!QBs#P1eZ}f#r6Q4v)nx>{Cphl3y$7OGTZI4~t-9!0hCYtEG zKgu|F2Z6+<54StJ`|bD5elz#y?~h*q@EVTFP+)L0!q87KviKEs=&TGc7N~tsXfZ)s zh7yClE3pt^Ec7INKe|Hc8SK7NTKP8&ip`TDgVMQ)unbiO^$qsIT4O74hq3UJw&+Z} zz=%sTo2yuOWi+2#Gm3HMUh<$im?HPfIr5aCm5Q};F)oGH#`6*KHA#ziJXek@9Vtus z#7jCFqeU%AVQkHe)?X4ji+D@M!Z|)xF}hr3s?Z86r%P_eoSvS`ZofL`mPR|}Jed(x zJF|JLr1IP)bF}mb?YvE-HlrbeaU6P%M(zZ=+khmpGrE5Q+=U@!N`c zi!unH0(Wb$1NRslG`ky1``#)&X{VOgyTtG=nT^m61i8qd(KS-ULt$0AUTv2AR5=FE zySJ9P%^)!Pd@6h&b;RJb*)?_&j*{zZLm}swN zI8;uN{#jbItjwAGe{|W!OQE9}ZMy=G864lRkE>016cCz%GqtTD_oMMsx5JDxVv{cc}f&Fm)PJ4A8en yV=YI)J~Xnu`|yC64pyj#G_TnT6z6P@ZeR;;U@O8Q-6_BmcuF(CGx|!TSNsRO$O=gS literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/Farm.class b/target/classes/be/thedrewen/src/Farm.class new file mode 100644 index 0000000000000000000000000000000000000000..75240375d126bea530cd0f23de649056e1df9bb6 GIT binary patch literal 4565 zcmeHL-ESL35T8p!oH%JyQrc3!xAG`ClvpX}t@n3)c_6Gob2Va(8A%MFrtlAF78egES z8XZ-iaGjN4F@W38`8ltqTqf1y)^m((0E-zHGJrev5v~ReZU=C)O`N=y;(n^4ZUC$G zJ+1jgT^LKVE2kon+~yhs2!}H}qoSMv2f48-YjBHN@N|2Zn3r~h6m~a&dzDdouX^*0 zEIUv!mS8=A^`Y5^S}VN_ZwISCJ(C)ZO3yK7k;-}^X-YDjJ^xLUw_fQaY~|gqu;ISHP1Je9WlToCS$%#rXS5Wh$CY|_9(YH* zS)IK!PlOEpp8Y@@_oII=)QhaAv@Q12+xF@}PFVOgEK@h<8lK~x+f1I$uI1Y8C^U2g zYObTs1ygNC;aZ$i7pcV|jFdDKW+-iWW!f5dox43| zMR-&;oe{Z=u`MLVA!|?oGkjUFQDg{tuDZxL#ZYHd!t7SK;JmDQG)Ytj*GS}kO< z#ac?G$mM1cm&UE!IW7~%(0t**f_82M_PsXu#M~3}=(s*lOsxf%bF0f%8QPADS%UU^ zt$LPc@i}TOV#>i+pwMM;qwDrX zEv-q53F=D!zQy_v<8F9HP{>SkL!Ymxh<)#x9)BS#brpFyx5Yfd*lF&L3qQexD)L?w zp)pjrJXV`r6N;KvUMXtBYu5Yk-J)~ZDcW1hC<@Dm~+b?CHHfxM(}V1aN;8+7EgWg8yqu z`XJfY$f>dTiZ)y))dJ*J(HUKBxt^msq&jq?-iQa}Ln|^o6Go8EJqP9eX(5#luL|;v zM}&@3)Z5GOQE;O=L+>yQ(bt@q(FmDmhIwWf6pH^%W(c5ss&XCS6Y6-W@po;C@6RYv z)a0;LIT|!ICHR!cUX>z>_eO!zo79a{l&(HSV;ktwh$+Drlqp93ei$T*M_-p<^V-R8 z;A05j2L1K1K;O4u$v>4~nMPOqbD73T8LZLuCXGBM>IJ%&e}`K?Z`}SBHvaTxB zG(f+5banJZ1^3}yKlT9LBfj_P*-?E!_p8!AoFMJ-1Zj)#koXsXk@fELh<;1-{t4Ok KS^xQSsQd!}q6jVk literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/Utils.class b/target/classes/be/thedrewen/src/Utils.class new file mode 100644 index 0000000000000000000000000000000000000000..32b183e5a566380a1f68c43c1cb6b81a6b5a48d4 GIT binary patch literal 3598 zcmc&%?Qh#e7=NyGwd0kwD|8zhup2KU*}#UvfHi3)Ha4lq9f)R?_;|6e>9zJu=-SLo~h)B$23yuNF>Y%CFw}3LBi8)oqDbQKBwk*#A%_xFC6eI z2WZ5kRE7>XJyGJ*Eki{{g^YzpACqI;+T)tb2rcYsmE!#89QR`CM+wU^x+fBz{ntv4 zVf&%T%>T4e`mOZPALNIJ!uX>k9}4N0k$i{Y{7}v->mnT~ZK^0s``>8Ij%PS=8YF9Q zdWQV@v{yxL)V`ID5)lbQvwXxg)>39h=aEsGR>f*}in`=7=6gaGwZI)5vpm5ZPo;gj zonzK3Das_}zl;^vguK>FPpDCpmF;3FbXtKUZ#{)B4$*%?vsUx zZKk%F*>A{z*LtNJJ4OpRZ1Ag|g)+qE<70)l$fAuN4?I{}1P7K0thU1`aaQ1NL99z5 z9-}9DI^ep`kShtSgeqdmF4Llzj~D07zQ_n%3!9l8343|SP1Qw@ka4+0UccE6C&lh| zYWAz6jG)$z7)oYxjdt($`s**sY}R!2`u*-^w}W37t`kreq(8BLM#XIUzZPRMK6?bZ z^}LQ(yR|S*mg?c3thw+mf!{2m7z56T;bltM=i@=5qQmR~H_tei1lHOi-cvz!PX$FQ z6&G>0aj_E?jgD;)o*UGwD;yLq1f?U`A1=I4$ZdA>g6&XeAD;2yrg3#$%%g^%-!9vrw&;PUiZ8558L z#dR=Ut~?>IxGk~_FV8+c!ZWx9__oLY31PNB?WK5n>cI1DqKOStEKF|Hz)Wx__WOMXVAmnOIVRLtk{?EHRf#nUqq`%;Q#;t literal 0 HcmV?d00001 diff --git a/target/classes/be/thedrewen/src/custom/Model.class b/target/classes/be/thedrewen/src/custom/Model.class new file mode 100644 index 0000000000000000000000000000000000000000..585ca56efec5c343570cc0ba48a16785a123b810 GIT binary patch literal 1073 zcmcgrO>fjN5FKyBrW*oV7Room+}cZWXfJ$T5J;7F;n1ZLN3S#6b#d%qI}80~NFc$T zABC7Ci>itW^-yt{$#}-&d6V~k{`&eI0G`AB7bDj>J;rTA0K9?d%9;U=SHmB7@QRB()!$GKWtYtjV&V3bLL-|Cur>ykPKn>+jn0 zoNOOZua`7S3|ANoPu_dwoOSCkWWAkt#-X=*i3OLotdtf(S;H%5XBtcYgeQaP0(m&D zkT(so220jq;Zhi51D_%P(6)`j}F4bZ8{KFn6}3_+w4Ef@e|-@A+J5 z^vR&x!5J-iuw1kQTx8K+S!pFz;J&WV5q9H)t7Wi`ci^_R8yvMMaIOp%8K2O<<@mX~ zM!1w&+7HMDZD4V_!$r>dpVxAp=MqTaS_%UgG1xqVnhouSV_Mpqx}2e#3Sv^jcPoWH z5KcAm>M#lmMNEG<{-=^i7|Fh^oy6C~6$)B?Wepu;xO+-u-TVyFiSnK_H6`A9cmyOZ z67CxLOVFn;2Jy@HPCcMrgeX42h-yoZ|-wABO R%{G6lwYT9O`G|6Negk>4LF@nk literal 0 HcmV?d00001 diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..79b6298 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,18 @@ +name: Endariel +main: be.thedrewen.Main +version: 1.0.0 +api-version: '1.21' +commands: + test: + description: "Tester les fonctions." + usage: /test + permission: be.thedrewen.op + + models: + description: "Ui pour faire spawn des Models 3Ds." + usage: /models + permission: be.thedrewen.op + +permissions: + be.thedrewen.op: + default: op \ No newline at end of file