mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-31 12:31:28 +01:00
Started work on item hovering.
This commit is contained in:
parent
01052528d0
commit
78f4bc0a13
@ -3,6 +3,7 @@ package net.minestom.server.chat;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import net.minestom.server.entity.Entity;
|
import net.minestom.server.entity.Entity;
|
||||||
import net.minestom.server.entity.EntityType;
|
import net.minestom.server.entity.EntityType;
|
||||||
|
import net.minestom.server.item.ItemFlag;
|
||||||
import net.minestom.server.item.ItemStack;
|
import net.minestom.server.item.ItemStack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,6 +27,22 @@ public class ChatHoverEvent {
|
|||||||
this.isJson = true;
|
this.isJson = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getAction() {
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected JsonObject getValueObject() {
|
||||||
|
return valueObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isJson() {
|
||||||
|
return isJson;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a {@link ColoredText} when hovered
|
* Show a {@link ColoredText} when hovered
|
||||||
*
|
*
|
||||||
@ -53,7 +70,101 @@ public class ChatHoverEvent {
|
|||||||
* @return the chat hover event
|
* @return the chat hover event
|
||||||
*/
|
*/
|
||||||
public static ChatHoverEvent showItem(ItemStack itemStack) {
|
public static ChatHoverEvent showItem(ItemStack itemStack) {
|
||||||
return new ChatHoverEvent("show_item", "{id:35,Damage:5,Count:2,tag:{display:{Name:Testing}}}");
|
JsonObject itemJson = new JsonObject();
|
||||||
|
// Basic Item structure
|
||||||
|
itemJson.addProperty("id", itemStack.getMaterial().getName());
|
||||||
|
itemJson.addProperty("Count", itemStack.getAmount());
|
||||||
|
|
||||||
|
JsonObject tagJson = new JsonObject();
|
||||||
|
|
||||||
|
// General tags
|
||||||
|
tagJson.addProperty("Damage", itemStack.getDamage());
|
||||||
|
tagJson.addProperty("Unbreakable", itemStack.isUnbreakable());
|
||||||
|
// TODO: CanDestroy
|
||||||
|
tagJson.addProperty("CustomModelData", itemStack.getCustomModelData());
|
||||||
|
|
||||||
|
// TODO: BlockTags
|
||||||
|
|
||||||
|
// Enchantments
|
||||||
|
// TODO: Enchantments
|
||||||
|
// TODO: StoredEnchantments
|
||||||
|
// TODO: RepairCost
|
||||||
|
|
||||||
|
// TODO: Attribute modifiers
|
||||||
|
|
||||||
|
// Potion Effects
|
||||||
|
// TODO: CustomPotionEffects
|
||||||
|
// TODO: Potion
|
||||||
|
// TODO: CustomPotionColor
|
||||||
|
|
||||||
|
// Crossbows
|
||||||
|
// TODO: ChargedProjectiles
|
||||||
|
// TODO: Charged
|
||||||
|
|
||||||
|
// Display
|
||||||
|
JsonObject displayJson = new JsonObject();
|
||||||
|
// TODO: Color (Leather armour)
|
||||||
|
// This is done as this contains a json text component describing the item's name.
|
||||||
|
// We replace it in the last step, as adding it now would replace it with lenient JSON which MC doesn't want.
|
||||||
|
displayJson.addProperty("Name", "%item_name%");
|
||||||
|
// TODO: Lore
|
||||||
|
|
||||||
|
// HideFlags
|
||||||
|
if (!itemStack.getItemFlags().isEmpty()) {
|
||||||
|
int bitField = itemStack.getItemFlags().stream().mapToInt(ItemFlag::getBitFieldPart).sum();
|
||||||
|
tagJson.addProperty("HideFlags", bitField);
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrittenBooks
|
||||||
|
// TODO: Resolved
|
||||||
|
// TODO: Generation
|
||||||
|
// TODO: Author
|
||||||
|
// TODO: Title
|
||||||
|
// TODO: Pages
|
||||||
|
|
||||||
|
// Book and Quills
|
||||||
|
// TODO: Pages
|
||||||
|
|
||||||
|
// Player Heads
|
||||||
|
// TODO: Alot check https://minecraft.gamepedia.com/Player.dat_format#Item_structure#Player_Heads
|
||||||
|
|
||||||
|
// Fireworks
|
||||||
|
// TODO: Alot check https://minecraft.gamepedia.com/Player.dat_format#Item_structure#Fireworks
|
||||||
|
|
||||||
|
// Armorstands and Spawn Eggs
|
||||||
|
// TODO: EntityTag
|
||||||
|
|
||||||
|
// Buckets of Fish
|
||||||
|
// TODO: BucketVariantTag
|
||||||
|
// TODO: ENtityTag
|
||||||
|
|
||||||
|
// Maps
|
||||||
|
// TODO: Alot check https://minecraft.gamepedia.com/Player.dat_format#Item_structure#Maps
|
||||||
|
|
||||||
|
// Suspcious Stew
|
||||||
|
// TODO: Effects
|
||||||
|
|
||||||
|
// Debug Sticks
|
||||||
|
// TODO: DebugProperty
|
||||||
|
|
||||||
|
// Compasses
|
||||||
|
// TODO: LodestoneTracked
|
||||||
|
// TODO: LodestoneDimension
|
||||||
|
// TODO: LodestonePos
|
||||||
|
|
||||||
|
|
||||||
|
tagJson.add("display", displayJson);
|
||||||
|
itemJson.add("tag", tagJson);
|
||||||
|
|
||||||
|
|
||||||
|
final String item = itemJson.toString()
|
||||||
|
.replaceAll("\"(\\w+)\":", "$1:")
|
||||||
|
// TODO: Since embedded JSON is wrapped using (')s we should be able to use Regex to ignore any keys wrapped by (')s.
|
||||||
|
.replaceAll("\"%item_name%\"", '\'' + itemStack.getDisplayName().getJsonObject().toString() + '\'');
|
||||||
|
|
||||||
|
System.out.println(item);
|
||||||
|
// Use regex to remove the qoutes around the keys (MC wants this).
|
||||||
|
return new ChatHoverEvent("show_item", item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,20 +184,4 @@ public class ChatHoverEvent {
|
|||||||
object.addProperty("type", type);
|
object.addProperty("type", type);
|
||||||
return new ChatHoverEvent("show_entity", object);
|
return new ChatHoverEvent("show_entity", object);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getAction() {
|
|
||||||
return action;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected JsonObject getValueObject() {
|
|
||||||
return valueObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isJson() {
|
|
||||||
return isJson;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,19 @@
|
|||||||
package net.minestom.server.item;
|
package net.minestom.server.item;
|
||||||
|
|
||||||
public enum ItemFlag {
|
public enum ItemFlag {
|
||||||
HIDE_ENCHANTS,
|
HIDE_ENCHANTS(1),
|
||||||
HIDE_ATTRIBUTES,
|
HIDE_ATTRIBUTES(2),
|
||||||
HIDE_UNBREAKABLE,
|
HIDE_UNBREAKABLE(4),
|
||||||
HIDE_DESTROYS,
|
HIDE_DESTROYS(8),
|
||||||
HIDE_PLACED_ON,
|
HIDE_PLACED_ON(16),
|
||||||
HIDE_POTION_EFFECTS,
|
HIDE_POTION_EFFECTS(32);
|
||||||
|
|
||||||
|
private final int bitFieldPart;
|
||||||
|
ItemFlag(int bit) {
|
||||||
|
this.bitFieldPart = bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBitFieldPart() {
|
||||||
|
return bitFieldPart;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,28 @@
|
|||||||
package net.minestom.server.listener;
|
package net.minestom.server.listener;
|
||||||
|
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.chat.*;
|
import net.minestom.server.attribute.Attribute;
|
||||||
|
import net.minestom.server.attribute.AttributeOperation;
|
||||||
|
import net.minestom.server.chat.ChatClickEvent;
|
||||||
|
import net.minestom.server.chat.ChatColor;
|
||||||
|
import net.minestom.server.chat.ChatHoverEvent;
|
||||||
|
import net.minestom.server.chat.ColoredText;
|
||||||
|
import net.minestom.server.chat.RichMessage;
|
||||||
import net.minestom.server.command.CommandManager;
|
import net.minestom.server.command.CommandManager;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.event.player.PlayerChatEvent;
|
import net.minestom.server.event.player.PlayerChatEvent;
|
||||||
import net.minestom.server.event.player.PlayerCommandEvent;
|
import net.minestom.server.event.player.PlayerCommandEvent;
|
||||||
|
import net.minestom.server.item.ItemStack;
|
||||||
|
import net.minestom.server.item.Material;
|
||||||
|
import net.minestom.server.item.attribute.AttributeSlot;
|
||||||
|
import net.minestom.server.item.attribute.ItemAttribute;
|
||||||
import net.minestom.server.network.ConnectionManager;
|
import net.minestom.server.network.ConnectionManager;
|
||||||
import net.minestom.server.network.PacketWriterUtils;
|
import net.minestom.server.network.PacketWriterUtils;
|
||||||
import net.minestom.server.network.packet.client.play.ClientChatMessagePacket;
|
import net.minestom.server.network.packet.client.play.ClientChatMessagePacket;
|
||||||
import net.minestom.server.network.packet.server.play.ChatMessagePacket;
|
import net.minestom.server.network.packet.server.play.ChatMessagePacket;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class ChatMessageListener {
|
public class ChatMessageListener {
|
||||||
@ -75,8 +86,15 @@ public class ChatMessageListener {
|
|||||||
|
|
||||||
final ColoredText usernameText = ColoredText.of(String.format("<%s>", username));
|
final ColoredText usernameText = ColoredText.of(String.format("<%s>", username));
|
||||||
|
|
||||||
|
ItemStack itemStack = new ItemStack(Material.DIAMOND_SWORD, (byte) 1);
|
||||||
|
itemStack.addAttribute(
|
||||||
|
new ItemAttribute(UUID.randomUUID(), Attribute.ATTACK_DAMAGE.getKey(),
|
||||||
|
Attribute.ATTACK_DAMAGE, AttributeOperation.ADDITION, 16.0, AttributeSlot.MAINHAND)
|
||||||
|
);
|
||||||
|
itemStack.setDisplayName(ColoredText.of(ChatColor.BRIGHT_GREEN + "Weird" + ChatColor.YELLOW + "Fence"));
|
||||||
|
|
||||||
final RichMessage richMessage = RichMessage.of(usernameText)
|
final RichMessage richMessage = RichMessage.of(usernameText)
|
||||||
.setHoverEvent(ChatHoverEvent.showText(ColoredText.of(ChatColor.GRAY + "Its " + username)))
|
.setHoverEvent(ChatHoverEvent.showItem(itemStack))
|
||||||
.setClickEvent(ChatClickEvent.suggestCommand("/msg " + username + " "))
|
.setClickEvent(ChatClickEvent.suggestCommand("/msg " + username + " "))
|
||||||
.append(ColoredText.of(" " + chatEvent.getMessage()));
|
.append(ColoredText.of(" " + chatEvent.getMessage()));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user