From 1f2ac4a6515f0d60cb1729fc0fe60cb0cc815f0c Mon Sep 17 00:00:00 2001 From: NichtStudioCode <51272202+NichtStudioCode@users.noreply.github.com> Date: Tue, 26 Jan 2021 20:13:47 +0100 Subject: [PATCH] Added BackgroundItem --- .../impl/customtexture/BackgroundItem.java | 24 ++++++ .../resourcepack/ForceResourcePack.java | 77 +++++++++++++++++++ .../de/studiocode/invgui/window/Window.java | 5 +- .../invgui/window/impl/BaseWindow.java | 28 +++---- 4 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 src/main/java/de/studiocode/invgui/item/impl/customtexture/BackgroundItem.java create mode 100644 src/main/java/de/studiocode/invgui/resourcepack/ForceResourcePack.java diff --git a/src/main/java/de/studiocode/invgui/item/impl/customtexture/BackgroundItem.java b/src/main/java/de/studiocode/invgui/item/impl/customtexture/BackgroundItem.java new file mode 100644 index 0000000..06ad8de --- /dev/null +++ b/src/main/java/de/studiocode/invgui/item/impl/customtexture/BackgroundItem.java @@ -0,0 +1,24 @@ +package de.studiocode.invgui.item.impl.customtexture; + +import de.studiocode.invgui.item.impl.SimpleItem; +import de.studiocode.invgui.item.itembuilder.ItemBuilder; +import de.studiocode.invgui.resourcepack.ForceResourcePack; +import org.bukkit.Material; + +public class BackgroundItem extends SimpleItem { + + private static final BackgroundItem INSTANCE = new BackgroundItem(); + + static { + ForceResourcePack.getInstance(); // initializes ForceResourcePack which automatically activates forced resource packs (if not disabled) + } + + private BackgroundItem() { + super(new ItemBuilder(Material.POPPY).setDisplayName("§f").setCustomModelData(10000000)); + } + + public static BackgroundItem getInstance() { + return INSTANCE; + } + +} diff --git a/src/main/java/de/studiocode/invgui/resourcepack/ForceResourcePack.java b/src/main/java/de/studiocode/invgui/resourcepack/ForceResourcePack.java new file mode 100644 index 0000000..9cab080 --- /dev/null +++ b/src/main/java/de/studiocode/invgui/resourcepack/ForceResourcePack.java @@ -0,0 +1,77 @@ +package de.studiocode.invgui.resourcepack; + +import de.studiocode.invgui.InvGui; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerResourcePackStatusEvent; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashMap; + +import static org.bukkit.event.player.PlayerResourcePackStatusEvent.Status.DECLINED; + +public class ForceResourcePack implements Listener { + + private static final ForceResourcePack INSTANCE = new ForceResourcePack(); + + private final HashMap tasks = new HashMap<>(); + + private String resourcePackUrl = "https://github.com/NichtStudioCode/InvGuiRP/releases/download/v0.1/InvGuiRP.zip"; + private boolean activated = true; + + private ForceResourcePack() { + Bukkit.getPluginManager().registerEvents(this, InvGui.getInstance().getPlugin()); + Bukkit.getOnlinePlayers().forEach(this::sendResourcePack); + } + + public static ForceResourcePack getInstance() { + return INSTANCE; + } + + @EventHandler + public void handleJoin(PlayerJoinEvent event) { + if (activated) sendResourcePack(event.getPlayer()); + } + + @EventHandler + public void handleResourcePackStatus(PlayerResourcePackStatusEvent event) { + if (activated) { + Player player = event.getPlayer(); + if (tasks.containsKey(player)) { + if (event.getStatus() == DECLINED) kickPlayer(player); + else tasks.get(player).cancel(); + tasks.remove(player); + } + } + } + + private void sendResourcePack(Player player) { + player.setResourcePack(resourcePackUrl); + tasks.put(player, Bukkit.getScheduler().runTaskLater(InvGui.getInstance().getPlugin(), + () -> kickPlayer(player), 20 * 5)); + } + + private void kickPlayer(Player player) { + player.kickPlayer("§cPlease accept the custom resource pack"); + } + + public String getResourcePackUrl() { + return resourcePackUrl; + } + + public void setResourcePackUrl(String resourcePackUrl) { + this.resourcePackUrl = resourcePackUrl; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + +} diff --git a/src/main/java/de/studiocode/invgui/window/Window.java b/src/main/java/de/studiocode/invgui/window/Window.java index bacc320..6adf5fb 100644 --- a/src/main/java/de/studiocode/invgui/window/Window.java +++ b/src/main/java/de/studiocode/invgui/window/Window.java @@ -2,6 +2,7 @@ package de.studiocode.invgui.window; import de.studiocode.invgui.animation.Animation; import de.studiocode.invgui.gui.GUI; +import de.studiocode.invgui.gui.SlotElement.ItemStackHolder; import de.studiocode.invgui.item.Item; import de.studiocode.invgui.item.itembuilder.ItemBuilder; import de.studiocode.invgui.virtualinventory.VirtualInventory; @@ -16,6 +17,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.UUID; +import java.util.function.Predicate; /** * A window is the way to show a player a GUI. @@ -126,8 +128,9 @@ public interface Window { * Plays an animation. * * @param animation The animation to play. + * @param filter The filter that selects which Items should be animated. */ - void playAnimation(Animation animation); + void playAnimation(Animation animation, Predicate filter); /** * Gets if the player is able to close the {@link Inventory}. diff --git a/src/main/java/de/studiocode/invgui/window/impl/BaseWindow.java b/src/main/java/de/studiocode/invgui/window/impl/BaseWindow.java index 3c63f42..ad1ad49 100644 --- a/src/main/java/de/studiocode/invgui/window/impl/BaseWindow.java +++ b/src/main/java/de/studiocode/invgui/window/impl/BaseWindow.java @@ -20,8 +20,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.IntStream; +import java.util.function.Predicate; public abstract class BaseWindow implements Window { @@ -187,24 +186,25 @@ public abstract class BaseWindow implements Window { } @Override - public void playAnimation(Animation animation) { + public void playAnimation(Animation animation, Predicate filter) { if (getViewer() != null) { this.animation = animation; + List slots = new ArrayList<>(); + for (int i = 0; i < size; i++) { + ItemStackHolder holder = itemsDisplayed[i]; + if (holder != null && filter.test(holder)) { + slots.add(i); + inventory.setItem(i, null); + } + } + animation.setBounds(getGui().getWidth(), getGui().getHeight()); animation.setPlayer(getViewer()); animation.addShowHandler((frame, index) -> redrawItem(index, itemsDisplayed[index], false)); animation.addFinishHandler(() -> this.animation = null); - animation.setSlots(IntStream.range(0, size) - .filter(i -> { - ItemStackHolder element = itemsDisplayed[i]; - return !(element == null || (element instanceof VISlotElement - && !((VISlotElement) element).getVirtualInventory().hasItem(((VISlotElement) element).getIndex()))); - }) - .boxed() - .collect(Collectors.toCollection(ArrayList::new))); + animation.setSlots(slots); - clearItemStacks(); animation.start(); } } @@ -221,10 +221,6 @@ public abstract class BaseWindow implements Window { } } - private void clearItemStacks() { - for (int i = 0; i < inventory.getSize(); i++) inventory.setItem(i, null); - } - @Override public Player getViewer() { return Bukkit.getPlayer(viewerUUID);