Skip to content

Commit

Permalink
Initial item service
Browse files Browse the repository at this point in the history
- Created ItemService class
- Updated YamipaPlugin class
- Updated ImageCommand#giveImageItems()
  • Loading branch information
josemmo committed Dec 5, 2021
1 parent 55547c9 commit 21d6d17
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 14 deletions.
8 changes: 8 additions & 0 deletions src/main/java/io/josemmo/bukkit/plugin/YamipaPlugin.java
Expand Up @@ -3,6 +3,7 @@
import io.josemmo.bukkit.plugin.commands.ImageCommandBridge;
import io.josemmo.bukkit.plugin.renderer.FakeImage;
import io.josemmo.bukkit.plugin.renderer.ImageRenderer;
import io.josemmo.bukkit.plugin.renderer.ItemService;
import io.josemmo.bukkit.plugin.storage.ImageStorage;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
Expand All @@ -23,6 +24,7 @@ public class YamipaPlugin extends JavaPlugin {
private boolean verbose;
private ImageStorage storage;
private ImageRenderer renderer;
private ItemService itemService;
private ScheduledExecutorService scheduler;

/**
Expand Down Expand Up @@ -110,6 +112,10 @@ public void onEnable() {
renderer = new ImageRenderer(basePath.resolve(dataPath).toString());
renderer.start();

// Create image item service
itemService = new ItemService();
itemService.start();

// Create thread pool
scheduler = Executors.newScheduledThreadPool(6);

Expand All @@ -133,8 +139,10 @@ public void onDisable() {
// Stop plugin components
storage.stop();
renderer.stop();
itemService.stop();
storage = null;
renderer = null;
itemService = null;

// Stop internal scheduler
scheduler.shutdownNow();
Expand Down
16 changes: 2 additions & 14 deletions src/main/java/io/josemmo/bukkit/plugin/commands/ImageCommand.java
Expand Up @@ -3,16 +3,14 @@
import io.josemmo.bukkit.plugin.YamipaPlugin;
import io.josemmo.bukkit.plugin.renderer.FakeImage;
import io.josemmo.bukkit.plugin.renderer.ImageRenderer;
import io.josemmo.bukkit.plugin.renderer.ItemService;
import io.josemmo.bukkit.plugin.storage.ImageFile;
import io.josemmo.bukkit.plugin.utils.SelectBlockTask;
import io.josemmo.bukkit.plugin.utils.ActionBar;
import org.bukkit.*;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.PluginDescriptionFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -305,8 +303,6 @@ public static void giveImageItems(
int width,
int height
) {
YamipaPlugin plugin = YamipaPlugin.getInstance();

// Get image size in blocks
Dimension sizeInPixels = image.getSize();
if (sizeInPixels == null) {
Expand All @@ -318,15 +314,7 @@ public static void giveImageItems(
}

// Create item stack
ItemStack itemStack = new ItemStack(Material.PAPER, amount);
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());
PersistentDataContainer itemData = itemMeta.getPersistentDataContainer();
itemMeta.setDisplayName(image.getName() + ChatColor.AQUA + " (" + width + "x" + height + ")");
itemMeta.setLore(Collections.singletonList("Yamipa image"));
itemData.set(new NamespacedKey(plugin, "filename"), PersistentDataType.STRING, image.getName());
itemData.set(new NamespacedKey(plugin, "width"), PersistentDataType.INTEGER, width);
itemData.set(new NamespacedKey(plugin, "height"), PersistentDataType.INTEGER, height);
itemStack.setItemMeta(itemMeta);
ItemStack itemStack = ItemService.getImageItem(image, amount, width, height);

// Add item stack to player's inventory
player.getInventory().addItem(itemStack);
Expand Down
84 changes: 84 additions & 0 deletions src/main/java/io/josemmo/bukkit/plugin/renderer/ItemService.java
@@ -0,0 +1,84 @@
package io.josemmo.bukkit.plugin.renderer;

import io.josemmo.bukkit.plugin.YamipaPlugin;
import io.josemmo.bukkit.plugin.storage.ImageFile;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Objects;

public class ItemService implements Listener {
private static final YamipaPlugin plugin = YamipaPlugin.getInstance();
private static final NamespacedKey NSK_FILENAME = new NamespacedKey(plugin, "filename");
private static final NamespacedKey NSK_WIDTH = new NamespacedKey(plugin, "width");
private static final NamespacedKey NSK_HEIGHT = new NamespacedKey(plugin, "height");

/**
* Get image item
* @param image Image file
* @param amount Stack amount
* @param width Image width in blocks
* @param height Image height in blocks
* @return Image item
*/
public static @NotNull ItemStack getImageItem(@NotNull ImageFile image, int amount, int width, int height) {
ItemStack itemStack = new ItemStack(Material.GLOW_ITEM_FRAME, amount);
ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta());

// Set metadata
PersistentDataContainer itemData = itemMeta.getPersistentDataContainer();
itemMeta.setDisplayName(image.getName() + ChatColor.AQUA + " (" + width + "x" + height + ")");
itemMeta.setLore(Collections.singletonList("Yamipa image"));
itemData.set(NSK_FILENAME, PersistentDataType.STRING, image.getName());
itemData.set(NSK_WIDTH, PersistentDataType.INTEGER, width);
itemData.set(NSK_HEIGHT, PersistentDataType.INTEGER, height);
itemStack.setItemMeta(itemMeta);

return itemStack;
}

/**
* Start service
*/
public void start() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}

/**
* Stop service
*/
public void stop() {
HandlerList.unregisterAll(this);
}

@EventHandler(priority = EventPriority.LOWEST)
public void onCraftItem(@NotNull PrepareItemCraftEvent event) {
CraftingInventory inventory = event.getInventory();
for (@Nullable ItemStack item : inventory.getMatrix()) {
if (item == null) continue;

// Get metadata from item
ItemMeta itemMeta = item.getItemMeta();
if (itemMeta == null) continue;

// Prevent crafting recipes with image items
if (itemMeta.getPersistentDataContainer().has(NSK_FILENAME, PersistentDataType.STRING)) {
inventory.setResult(new ItemStack(Material.AIR));
break;
}
}
}
}

0 comments on commit 21d6d17

Please sign in to comment.