Skip to content
Merged

Hats #102

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,12 @@ bukkit {
description = 'Opens the point redemption shop for a player'
usage = '/openpointsredemption (player)'
}
hat {
description = 'Allows you to wear the item in your main hand as a hat'
usage = '/hat'
permissionMessage = 'You do not have permission.'
permission = 'parallelutils.hat.*'
}
}

permissions {
Expand Down Expand Up @@ -502,5 +508,8 @@ bukkit {
'parallelutils.recalculatepoints' {
description = 'Gives access to the /recalculatepoints dev command'
}
'parallelutils.hat.*' {
description = 'Allows you to wear any item as a hat'
}
}
}
5 changes: 4 additions & 1 deletion api/src/main/java/parallelmc/parallelutils/Constants.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package parallelmc.parallelutils;

import java.util.ArrayList;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;

public class Constants {

public static final Version VERSION = new Version(4, 4, 0);
public static final String PLUGIN_NAME = "ParallelUtils";
public static final Component PLUGIN_PREFIX = MiniMessage.miniMessage()
.deserialize("<dark_aqua>[<white><bold>P</bold><dark_aqua>] <reset>");
public static final String DEFAULT_WORLD = "world2";

public static final String[] OVERWORLD_TYPE_WORLDS = {"world", "world2", "world_skyteaser"};
Expand Down
66 changes: 66 additions & 0 deletions api/src/main/java/parallelmc/parallelutils/util/MessageTools.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package parallelmc.parallelutils.util;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import parallelmc.parallelutils.Constants;

/**
* A set of utilities to make sending messages easier
*/
public class MessageTools {

/**
* Sends a message to a player with the Parallel prefix prepended to it
* (This version of the method sends an "INFO" style message)
* @param player The player to send the message to
* @param message The message without the prefix
*/
public static void sendMessage(Player player, String message) {
TextComponent finalMessage = (TextComponent) Constants.PLUGIN_PREFIX
.append(Component.text(message, NamedTextColor.AQUA));
player.sendMessage(finalMessage);
}

/**
* Sends a message to a player with the Parallel prefix prepended to it
* @param player The player to send the message to
* @param message The message without the prefix
* @param messageType The type of message; this determines the message color
*/
public static void sendMessage(Player player, String message, MessageType messageType) {
TextComponent finalMessage = switch (messageType) {
case INFO -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.AQUA));
case SUCCESS -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.GREEN));
case ERROR -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.RED));
};
player.sendMessage(finalMessage);
}

/**
* Sends a message to console with the Parallel prefix prepended to it
* (This version of the method sends an "INFO" style message)
* @param message The message without the prefix
*/
public static void sendConsoleMessage(String message) {
TextComponent finalMessage = (TextComponent) Constants.PLUGIN_PREFIX
.append(Component.text(message, NamedTextColor.AQUA));
Bukkit.getConsoleSender().sendMessage(finalMessage);
}

/**
* Sends a message to console with the Parallel prefix prepended to it
* @param message The message without the prefix
* @param messageType The type of message; this determines the message color
*/
public static void sendConsoleMessage(String message, MessageType messageType) {
TextComponent finalMessage = switch (messageType) {
case INFO -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.AQUA));
case SUCCESS -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.GREEN));
case ERROR -> (TextComponent) Constants.PLUGIN_PREFIX.append(Component.text(message, NamedTextColor.RED));
};
Bukkit.getConsoleSender().sendMessage(finalMessage);
}
}
10 changes: 10 additions & 0 deletions api/src/main/java/parallelmc/parallelutils/util/MessageType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package parallelmc.parallelutils.util;

/**
* An enum to allow sending a different color of Parallel message depending on the message type
*/
public enum MessageType {
INFO,
SUCCESS,
ERROR
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import parallelmc.parallelutils.ParallelClassLoader;
import parallelmc.parallelutils.ParallelModule;
import parallelmc.parallelutils.ParallelUtils;
import parallelmc.parallelutils.modules.bitsandbobs.commands.Hat;
import parallelmc.parallelutils.modules.bitsandbobs.minimodules.*;
import parallelmc.parallelutils.modules.bitsandbobs.minimodules.togglepvp.OnPvp;
import parallelmc.parallelutils.modules.bitsandbobs.minimodules.togglepvp.TogglePvpCommand;
Expand Down Expand Up @@ -54,13 +55,15 @@ public void onEnable() {
FileConfiguration config = puPlugin.getConfig();

puPlugin.getCommand("togglepvp").setExecutor(new TogglePvpCommand());
puPlugin.getCommand("hat").setExecutor(new Hat());

manager.registerEvents(new DoorKnocker(), plugin);
manager.registerEvents(new SpecialItems(), plugin);
manager.registerEvents(new OnPvp(), plugin);
manager.registerEvents(new ShardLotto(), plugin);
manager.registerEvents(new ChickenFeatherDrops(), plugin);
manager.registerEvents(new EntityTweaks(), plugin);
manager.registerEvents(new HatSlotStuff(), plugin);
manager.registerEvents(new SilenceMobs(), plugin);

if (config.getBoolean("speedy-minecarts", false)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package parallelmc.parallelutils.modules.bitsandbobs.commands;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.jetbrains.annotations.NotNull;
import parallelmc.parallelutils.util.MessageTools;
import parallelmc.parallelutils.util.MessageType;

public class Hat implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (commandSender instanceof Player player) {
PlayerInventory inventory = player.getInventory();
ItemStack heldItem = inventory.getItemInMainHand();
if (heldItem.getType() == Material.AIR) {
MessageTools.sendMessage(player, "You aren't holding anything in your hand!", MessageType.ERROR);
return true;
}
// If the player has permission to wear all hats, or they're holding paper/leather horse armor with
// custom model data, swap their hand and hat slots
if (player.hasPermission("parallelutils.hat.*") ||
((heldItem.getType() == Material.PAPER || heldItem.getType() == Material.LEATHER_HORSE_ARMOR)
&& heldItem.getItemMeta().hasCustomModelData())) {

ItemStack helmetItem = inventory.getHelmet();
inventory.setItemInMainHand(helmetItem);
inventory.setHelmet(heldItem);
MessageTools.sendMessage(player, "Item set as hat!", MessageType.SUCCESS);
} else {
MessageTools.sendMessage(player, "You don't have permission to set this item as your hat!", MessageType.ERROR);
}
return true;
} else {
MessageTools.sendConsoleMessage("You must be a player to run this command!", MessageType.ERROR);
}
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package parallelmc.parallelutils.modules.bitsandbobs.minimodules;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import parallelmc.parallelutils.util.BukkitTools;
import parallelmc.parallelutils.util.MessageTools;
import parallelmc.parallelutils.util.MessageType;

public class HatSlotStuff implements Listener {

Plugin plugin;

public HatSlotStuff() {
plugin = BukkitTools.getPlugin();
}

@EventHandler
public void onHelmetSlotClick(InventoryClickEvent event) {
// Make sure the player is clicking on the helmet slot with an actual item that isn't already supposed to go
// in the head slot
if (event.getClickedInventory() != null &&
event.getClickedInventory().getType() == InventoryType.PLAYER &&
event.getRawSlot() == 5 &&
event.getWhoClicked().getItemOnCursor().getType() != Material.AIR &&
event.getWhoClicked().getItemOnCursor().getType().getEquipmentSlot() != EquipmentSlot.HEAD) {

// Get the cursor and helmet items
Player player = (Player) event.getWhoClicked();
ItemStack cursorItem = player.getItemOnCursor();
if (player.hasPermission("parallelutils.hat.*") ||
((cursorItem.getType() == Material.PAPER || cursorItem.getType() == Material.LEATHER_HORSE_ARMOR)
&& cursorItem.getItemMeta().hasCustomModelData())) {

ItemStack helmetItem = player.getInventory().getHelmet();
player.getInventory().setHelmet(null);
player.setItemOnCursor(null);

// Swap the cursor and helmet items
// Delay hat placement by one tick (ty Mojang)
Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
@Override
public void run() {
player.getInventory().setHelmet(cursorItem);
player.setItemOnCursor(helmetItem);
MessageTools.sendMessage(player, "Item set as hat!", MessageType.SUCCESS);
}
},1L);
}
}
}


}
Loading