diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 692b58f..54567ea 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -10,6 +10,7 @@ import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; import eu.mhsl.craftattack.spawn.appliances.debug.Debug; import eu.mhsl.craftattack.spawn.appliances.displayName.DisplayName; +import eu.mhsl.craftattack.spawn.appliances.doubeDoor.DoubleDoor; import eu.mhsl.craftattack.spawn.appliances.event.Event; import eu.mhsl.craftattack.spawn.appliances.fleischerchest.Fleischerchest; import eu.mhsl.craftattack.spawn.appliances.help.Help; @@ -75,7 +76,8 @@ public final class Main extends JavaPlugin { new AutoShulker(), new AntiSignEdit(), new HotbarRefill(), - new ChatMention() + new ChatMention(), + new DoubleDoor() ); Main.logger.info("Loading appliances..."); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/DoubleDoor.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/DoubleDoor.java new file mode 100644 index 0000000..c70f61a --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/DoubleDoor.java @@ -0,0 +1,44 @@ +package eu.mhsl.craftattack.spawn.appliances.doubeDoor; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Door; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class DoubleDoor extends Appliance { + public void openNextDoor(Block block) { + BlockData clickedData = block.getBlockData(); + if (!(clickedData instanceof Door clickedDoor)) return; + + BlockFace neighborFace = getNeighborFace(clickedDoor.getFacing(), clickedDoor.getHinge()); + Block neighbourBlock = block.getRelative(neighborFace); + BlockData neighbourData = neighbourBlock.getBlockData(); + + if(!(neighbourData instanceof Door neighbourDoor)) return; + if(!(neighbourDoor.getFacing() == clickedDoor.getFacing())) return; + if(neighbourDoor.getHinge() == clickedDoor.getHinge()) return; + + neighbourDoor.setOpen(!clickedDoor.isOpen()); + neighbourBlock.setBlockData(neighbourDoor); + } + + private @NotNull BlockFace getNeighborFace(BlockFace face, Door.Hinge hinge) { + return switch(face) { + case EAST -> (hinge == Door.Hinge.RIGHT) ? BlockFace.NORTH : BlockFace.SOUTH; + case WEST -> (hinge == Door.Hinge.RIGHT) ? BlockFace.SOUTH : BlockFace.NORTH; + case SOUTH -> (hinge == Door.Hinge.RIGHT) ? BlockFace.EAST : BlockFace.WEST; + case NORTH -> (hinge == Door.Hinge.RIGHT) ? BlockFace.WEST : BlockFace.EAST; + default -> throw new IllegalStateException(String.format("BlockFace '%s' of clicked door is not valid!", face)); + }; + } + + @Override + protected @NotNull List eventHandlers() { + return List.of(new OnDoorInteractListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/OnDoorInteractListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/OnDoorInteractListener.java new file mode 100644 index 0000000..546f458 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/doubeDoor/OnDoorInteractListener.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.appliances.doubeDoor; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.appliances.settings.Settings; +import org.bukkit.block.Block; +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 OnDoorInteractListener extends ApplianceListener { + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if(!event.hasBlock()) return; + if(!Objects.equals(event.getHand(), EquipmentSlot.HAND)) return; + if(!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return; + Block clickedBlock = event.getClickedBlock(); + if(clickedBlock == null) return; + if(!Settings.instance().getSetting(event.getPlayer(), Settings.Key.DoubleDoors, Boolean.class)) return; + getAppliance().openNextDoor(clickedBlock); + } +} 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 3dfceed..6d5be39 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 @@ -31,6 +31,7 @@ public class Settings extends Appliance { SignEdit, HotbarReplacer, ChatMentions, + DoubleDoors, } public static Settings instance() { @@ -57,7 +58,8 @@ public class Settings extends Appliance { new ChatMentionSetting(), new ShowJoinAndLeaveMessagesSetting(), new TechnicalTablistSetting(), - new SettingsShortcutSetting() + new SettingsShortcutSetting(), + new DoubleDoorSetting() ); settings.forEach(setting -> setting.initializeFromPlayer(player)); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/DoubleDoorSetting.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/DoubleDoorSetting.java new file mode 100644 index 0000000..2678373 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/settings/settings/DoubleDoorSetting.java @@ -0,0 +1,38 @@ +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.BoolSetting; +import org.bukkit.Material; + +public class DoubleDoorSetting extends BoolSetting implements CategorizedSetting { + public DoubleDoorSetting() { + super(Settings.Key.DoubleDoors); + } + + @Override + protected String title() { + return "Automatische Doppeltüren"; + } + + @Override + protected String description() { + return "Öffnet und schließt die zweite Hälfte einer Doppeltür automatisch"; + } + + @Override + protected Material icon() { + return Material.OAK_DOOR; + } + + @Override + protected Boolean defaultValue() { + return false; + } + + @Override + public SettingCategory category() { + return SettingCategory.Gameplay; + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java index abfd06a..e0be88d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java @@ -43,7 +43,10 @@ public class Whitelist extends Appliance { public void integrityCheck(Player player) throws DisconnectInfo.Throwable { try { Main.instance().getLogger().info(String.format("Running integrityCheck for %s", player.getName())); - UserData user = this.fetchUserData(player.getUniqueId()); + boolean overrideCheck = localConfig().getBoolean("overrideIntegrityCheck", false); + UserData user = overrideCheck + ? new UserData(player.getUniqueId(), player.getName(), "", "", 0L, 0L) + : this.fetchUserData(player.getUniqueId()); if(timestampRelevant(user.banned_until)) { Instant bannedDate = new Date(user.banned_until * 1000L) @@ -100,8 +103,7 @@ public class Whitelist extends Appliance { URIBuilder uriBuilder = new URIBuilder(apiEndpoint); uriBuilder.addParameter("uuid", uuid.toString()); - try { - HttpClient client = HttpClient.newHttpClient(); + try(HttpClient client = HttpClient.newHttpClient()) { HttpRequest httpRequest = HttpRequest.newBuilder() .uri(uriBuilder.build()) .header("Content-Type", "application/json")