diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 56122d9..c96dd15 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -3,6 +3,7 @@ package eu.mhsl.craftattack.spawn; import eu.mhsl.craftattack.spawn.api.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; +import eu.mhsl.craftattack.spawn.appliances.autoShulker.AutoShulker; import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; import eu.mhsl.craftattack.spawn.appliances.debug.Debug; @@ -64,7 +65,8 @@ public final class Main extends JavaPlugin { new Fleischerchest(), new CustomAdvancements(), new Settings(), - new PortableCrafting() + new PortableCrafting(), + new AutoShulker() ); Bukkit.getLogger().info("Loading appliances..."); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/AutoShulker.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/AutoShulker.java new file mode 100644 index 0000000..0c22f7f --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/AutoShulker.java @@ -0,0 +1,45 @@ +package eu.mhsl.craftattack.spawn.appliances.autoShulker; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.block.ShulkerBox; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; + +public class AutoShulker extends Appliance { + public boolean tryAutoShulker(Player p, Item item) { + ItemStack itemStack = item.getItemStack(); + ItemStack offhandStack = p.getInventory().getItemInOffHand(); + if(itemStack.getType().equals(Material.SHULKER_BOX)) return false; + if(!offhandStack.getType().equals(Material.SHULKER_BOX)) return false; + BlockStateMeta blockStateMeta = (BlockStateMeta) offhandStack.getItemMeta(); + ShulkerBox shulkerBox = (ShulkerBox) blockStateMeta.getBlockState(); + + HashMap leftOver = shulkerBox.getInventory().addItem(itemStack); + if(leftOver.size() > 1) throw new IllegalStateException("Multiple ItemStacks cannot be processed by AutoShulker!"); + if(itemStack.equals(leftOver.get(0))) { + p.sendActionBar(Component.text("Die Shulkerbox ist voll!")); + return false; + } + if(leftOver.isEmpty()) { + item.remove(); + } + + blockStateMeta.setBlockState(shulkerBox); + offhandStack.setItemMeta(blockStateMeta); + return true; + } + + @Override + protected @NotNull List eventHandlers() { + return List.of(new ItemPickupListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/ItemPickupListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/ItemPickupListener.java new file mode 100644 index 0000000..db74c7c --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/autoShulker/ItemPickupListener.java @@ -0,0 +1,21 @@ +package eu.mhsl.craftattack.spawn.appliances.autoShulker; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.appliances.settings.Settings; +import eu.mhsl.craftattack.spawn.appliances.settings.datatypes.SelectSetting; +import eu.mhsl.craftattack.spawn.appliances.settings.settings.AutoShulkerSetting; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityPickupItemEvent; + +public class ItemPickupListener extends ApplianceListener { + @EventHandler + public void onPickup(EntityPickupItemEvent event) { + if(event.getEntity() instanceof Player p) { + SelectSetting.Options.Option setting = Settings.instance().getSetting(p, Settings.Key.AutoShulker, SelectSetting.Options.Option.class); + if(setting.is(AutoShulkerSetting.disabled)) return; + if(setting.is(AutoShulkerSetting.notFromPlayers) && event.getItem().getThrower() != null) return; + event.setCancelled(getAppliance().tryAutoShulker(p, event.getItem())); + } + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java index eb28ab6..9e3a3e7 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/Settings.java @@ -4,9 +4,9 @@ import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; import eu.mhsl.craftattack.spawn.appliances.settings.datatypes.Setting; -import eu.mhsl.craftattack.spawn.appliances.settings.settings.EnablePortableCraftingSetting; -import eu.mhsl.craftattack.spawn.appliances.settings.settings.ShowJoinAndLeaveMessagesSetting; -import eu.mhsl.craftattack.spawn.appliances.settings.settings.TechnicalTablistSetting; +import eu.mhsl.craftattack.spawn.appliances.settings.listeners.OpenSettingsShortcutListener; +import eu.mhsl.craftattack.spawn.appliances.settings.listeners.SettingsInventoryListener; +import eu.mhsl.craftattack.spawn.appliances.settings.settings.*; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -24,6 +24,8 @@ public class Settings extends Appliance { TechnicalTab, ShowJoinAndLeaveMessages, EnablePortableCrafting, + EnableSettingsShortcut, + AutoShulker, } public static Settings instance() { @@ -45,7 +47,9 @@ public class Settings extends Appliance { List> settings = List.of( new TechnicalTablistSetting(), new ShowJoinAndLeaveMessagesSetting(), - new EnablePortableCraftingSetting() + new EnablePortableCraftingSetting(), + new EnableSettingsShortcutSetting(), + new AutoShulkerSetting() ); settings.forEach(setting -> setting.initializeFromPlayer(player)); @@ -92,7 +96,10 @@ public class Settings extends Appliance { @Override @NotNull protected List eventHandlers() { - return List.of(new SettingsInventoryListener()); + return List.of( + new SettingsInventoryListener(), + new OpenSettingsShortcutListener() + ); } @Override diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/BoolSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/BoolSetting.java index 792c79c..75189ac 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/BoolSetting.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/BoolSetting.java @@ -3,6 +3,7 @@ package eu.mhsl.craftattack.spawn.appliances.settings.datatypes; import eu.mhsl.craftattack.spawn.appliances.settings.Settings; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -12,16 +13,10 @@ import java.util.List; import java.util.Objects; public abstract class BoolSetting extends Setting { - private boolean state; - public BoolSetting(Settings.Key key) { super(key); } - protected abstract String title(); - - protected abstract String description(); - @Override public void fromStorage(PersistentDataContainer container) { this.state = container.has(getNamespacedKey()) @@ -52,7 +47,7 @@ public abstract class BoolSetting extends Setting { } @Override - protected void change() { + protected void change(ClickType clickType) { this.state = !this.state; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/SelectSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/SelectSetting.java new file mode 100644 index 0000000..45ed4db --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/datatypes/SelectSetting.java @@ -0,0 +1,102 @@ +package eu.mhsl.craftattack.spawn.appliances.settings.datatypes; + +import eu.mhsl.craftattack.spawn.appliances.settings.Settings; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.IntStream; + +public abstract class SelectSetting extends Setting { + private final Options options; + + public SelectSetting(Settings.Key key, Options options) { + super(key); + this.options = options; + } + + public record Options(List