From 077c40f29d71afd6b991fa1f6b3bb96c6deab094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com> Date: Sat, 31 Aug 2024 00:43:53 +0200 Subject: [PATCH] added knocking doors --- .../java/eu/mhsl/craftattack/spawn/Main.java | 4 +- .../spawn/appliances/knockDoor/KnockDoor.java | 61 +++++++++++++++++++ .../knockDoor/KnockDoorListener.java | 25 ++++++++ .../spawn/appliances/settings/Settings.java | 4 +- .../settings/settings/KnockDoorSetting.java | 50 +++++++++++++++ 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 54567ea..3cee928 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -16,6 +16,7 @@ import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest; import eu.mhsl.craftattack.spawn.appliances.help.Help; import eu.mhsl.craftattack.spawn.appliances.hotbarRefill.HotbarRefill; import eu.mhsl.craftattack.spawn.appliances.kick.Kick; +import eu.mhsl.craftattack.spawn.appliances.knockDoor.KnockDoor; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; import eu.mhsl.craftattack.spawn.appliances.panicBan.PanicBan; import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit; @@ -77,7 +78,8 @@ public final class Main extends JavaPlugin { new AntiSignEdit(), new HotbarRefill(), new ChatMention(), - new DoubleDoor() + new DoubleDoor(), + new KnockDoor() ); Main.logger.info("Loading appliances..."); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java new file mode 100644 index 0000000..1b5219b --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoor.java @@ -0,0 +1,61 @@ +package eu.mhsl.craftattack.spawn.appliances.knockDoor; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.Appliance; +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.KnockDoorSetting; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class KnockDoor extends Appliance { + public void knockAtDoor(Player knockingPlayer, Block knockedBlock) { + SelectSetting.Options.Option setting = Settings.instance().getSetting(knockingPlayer, Settings.Key.KnockDoors, SelectSetting.Options.Option.class); + if(setting.is(KnockDoorSetting.disabled)) return; + + if(setting.is(KnockDoorSetting.knockSingleTime)) { + playSound(knockedBlock); + } + + if(setting.is(KnockDoorSetting.knockThreeTimes)) { + String metadataKey = new NamespacedKey(Main.instance(), KnockDoor.class.getName()).getNamespace(); + if(knockingPlayer.hasMetadata(metadataKey)) return; + knockingPlayer.setMetadata(metadataKey, new FixedMetadataValue(Main.instance(), 0)); + + new BukkitRunnable() { + @Override + public void run() { + int timesKnocked = knockingPlayer.getMetadata(metadataKey).getFirst().asInt(); + if(timesKnocked >= 3) { + knockingPlayer.removeMetadata(metadataKey, Main.instance()); + cancel(); + return; + } + playSound(knockedBlock); + knockingPlayer.setMetadata(metadataKey, new FixedMetadataValue(Main.instance(), timesKnocked + 1)); + } + }.runTaskTimer(Main.instance(), 0, 8); + } + } + + private void playSound(Block knockedBlock) { + Location knockLocation = knockedBlock.getLocation(); + Sound sound = knockedBlock.getType() == Material.IRON_DOOR + ? Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR + : Sound.ITEM_SHIELD_BLOCK; + + knockLocation.getWorld().playSound(knockLocation, sound, SoundCategory.PLAYERS, 1f, 1f); + } + + @Override + protected @NotNull List<Listener> eventHandlers() { + return List.of(new KnockDoorListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java new file mode 100644 index 0000000..701be50 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/knockDoor/KnockDoorListener.java @@ -0,0 +1,25 @@ +package eu.mhsl.craftattack.spawn.appliances.knockDoor; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import org.bukkit.GameMode; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.Door; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; + +import java.util.Objects; + +public class KnockDoorListener extends ApplianceListener<KnockDoor> { + @EventHandler + public void onKnock(PlayerInteractEvent event) { + if(!event.getAction().equals(Action.LEFT_CLICK_BLOCK)) return; + if(!Objects.equals(event.getHand(), EquipmentSlot.HAND)) return; + if(event.getPlayer().getGameMode() != GameMode.SURVIVAL) return; + Block block = event.getClickedBlock(); + if(block == null) return; + if(!(block.getBlockData() instanceof Door)) return; + getAppliance().knockAtDoor(event.getPlayer(), block); + } +} 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 6d5be39..d674ea1 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 @@ -32,6 +32,7 @@ public class Settings extends Appliance { HotbarReplacer, ChatMentions, DoubleDoors, + KnockDoors, } public static Settings instance() { @@ -59,7 +60,8 @@ public class Settings extends Appliance { new ShowJoinAndLeaveMessagesSetting(), new TechnicalTablistSetting(), new SettingsShortcutSetting(), - new DoubleDoorSetting() + new DoubleDoorSetting(), + new KnockDoorSetting() ); settings.forEach(setting -> setting.initializeFromPlayer(player)); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java new file mode 100644 index 0000000..c87b123 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/KnockDoorSetting.java @@ -0,0 +1,50 @@ +package eu.mhsl.craftattack.spawn.appliances.settings.settings; + +import eu.mhsl.craftattack.spawn.appliances.settings.CategorizedSetting; +import eu.mhsl.craftattack.spawn.appliances.settings.SettingCategory; +import eu.mhsl.craftattack.spawn.appliances.settings.Settings; +import eu.mhsl.craftattack.spawn.appliances.settings.datatypes.SelectSetting; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; + +import java.util.List; +import java.util.Locale; + +public class KnockDoorSetting extends SelectSetting implements CategorizedSetting { + private static final String namespace = KnockDoorSetting.class.getSimpleName().toLowerCase(Locale.ROOT); + public static Options.Option disabled = new Options.Option("Deaktiviert", new NamespacedKey(namespace, "disabled")); + public static Options.Option knockSingleTime = new Options.Option("Einmal an der Tür anklopfen", new NamespacedKey(namespace, "single")); + public static Options.Option knockThreeTimes = new Options.Option("Dreimal an der Tür anklopfen", new NamespacedKey(namespace, "three")); + + public KnockDoorSetting() { + super( + Settings.Key.KnockDoors, + new Options(List.of(disabled, knockSingleTime, knockThreeTimes)) + ); + } + + @Override + public SettingCategory category() { + return SettingCategory.Gameplay; + } + + @Override + protected String title() { + return "Klopfen an Türen"; + } + + @Override + protected String description() { + return "Klopft durch das schlagen an eine Tür an."; + } + + @Override + protected Material icon() { + return Material.BELL; + } + + @Override + protected Options.Option defaultValue() { + return disabled; + } +}