Skip to content

Commit ec80d70

Browse files
committed
improve item display
1 parent 768ac84 commit ec80d70

File tree

7 files changed

+132
-66
lines changed

7 files changed

+132
-66
lines changed

src/main/java/cat/nyaa/nyaautils/CommandHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public String getHelpPrefix() {
5454
@SubCommand(value = "show", permission = "nu.show")
5555
public void commandShow(CommandSender sender, Arguments args) {
5656
ItemStack item = getItemInHand(sender);
57-
new Message("").append(item, I18n._("user.showitem.message", sender.getName())).broadcast();
57+
new Message("").append(I18n._("user.showitem.message", sender.getName()), item).broadcast();
5858
}
5959

6060
/* launch the player into the air and open their elytra */
@@ -139,7 +139,7 @@ public void commandProject(CommandSender sender, Arguments args) {
139139
try {
140140
uid = UUID.fromString(pName);
141141
ent = Bukkit.getEntity(uid);
142-
} catch(Exception e){
142+
} catch (Exception e) {
143143
if (pName == null) {
144144
if (sender instanceof Player) {
145145
pName = sender.getName();
@@ -165,7 +165,7 @@ public void commandProject(CommandSender sender, Arguments args) {
165165

166166
@Override
167167
public void run() {
168-
if (!(entity instanceof Player) || ((Player)entity).isOnline()) {
168+
if (!(entity instanceof Player) || ((Player) entity).isOnline()) {
169169
if (current < d) {
170170
current++;
171171
entity.setVelocity(v);

src/main/java/cat/nyaa/nyaautils/commandwarpper/Teleport.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
import cat.nyaa.nyaautils.I18n;
44
import cat.nyaa.nyaautils.NyaaUtils;
55
import cat.nyaa.nyaautils.api.events.HamsterEcoHelperTransactionApiEvent;
6-
7-
import java.text.DecimalFormat;
8-
6+
import net.ess3.api.IEssentials;
7+
import net.ess3.api.IUser;
98
import net.ess3.api.InvalidWorldException;
109
import org.bukkit.Bukkit;
1110
import org.bukkit.Location;
@@ -16,10 +15,9 @@
1615
import org.bukkit.event.EventPriority;
1716
import org.bukkit.event.Listener;
1817
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
19-
import net.ess3.api.IEssentials;
20-
import net.ess3.api.IUser;
2118
import org.bukkit.permissions.PermissionAttachment;
2219

20+
import java.text.DecimalFormat;
2321
import java.util.List;
2422

2523
public class Teleport implements Listener {

src/main/java/cat/nyaa/utils/CommandReceiver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ public BadCommandException() {
5353

5454
/**
5555
* show formatted error message to player
56+
*
5657
* @param msg_internal msg template key. e.g. `internal.warn.***'
57-
* @param args arguments
58+
* @param args arguments
5859
*/
5960
public BadCommandException(String msg_internal, Object... args) {
6061
super(msg_internal);

src/main/java/cat/nyaa/utils/Internationalization.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import cat.nyaa.nyaautils.NyaaUtils;
44
import org.bukkit.ChatColor;
5-
import org.bukkit.World;
65
import org.bukkit.configuration.ConfigurationSection;
76
import org.bukkit.configuration.file.YamlConfiguration;
87
import org.bukkit.plugin.java.JavaPlugin;
@@ -24,6 +23,7 @@ public abstract class Internationalization {
2423
private final static Map<String, String> internalMap = new HashMap<>();
2524

2625
protected abstract JavaPlugin getPlugin();
26+
2727
protected abstract String getLanguage();
2828

2929
public void load() {
@@ -32,7 +32,7 @@ public void load() {
3232
if (language == null) language = DEFAULT_LANGUAGE;
3333
// internal map
3434
if (plugin instanceof NyaaUtils) {
35-
loadInternalMap((NyaaUtils)plugin, language);
35+
loadInternalMap((NyaaUtils) plugin, language);
3636
}
3737
// language map
3838
loadLanguageMap(plugin, language);
@@ -77,10 +77,12 @@ private void loadLanguageMap(JavaPlugin plugin, String language) {
7777
}
7878
// load same language from jar
7979
InputStream stream = plugin.getResource("lang/" + language + ".yml");
80-
if (stream != null) loadLanguageSection(map, YamlConfiguration.loadConfiguration(new InputStreamReader(stream)), "", true);
80+
if (stream != null)
81+
loadLanguageSection(map, YamlConfiguration.loadConfiguration(new InputStreamReader(stream)), "", true);
8182
// load default language from jar
8283
stream = plugin.getResource("lang/" + DEFAULT_LANGUAGE + ".yml");
83-
if (stream != null) loadLanguageSection(map, YamlConfiguration.loadConfiguration(new InputStreamReader(stream)), "", true);
84+
if (stream != null)
85+
loadLanguageSection(map, YamlConfiguration.loadConfiguration(new InputStreamReader(stream)), "", true);
8486
}
8587

8688
private void saveLanguageMap(JavaPlugin plugin, String language) {
@@ -105,8 +107,8 @@ private void saveLanguageMap(JavaPlugin plugin, String language) {
105107
* add all language items from section into language map recursively
106108
* existing items won't be overwritten
107109
*
108-
* @param section source section
109-
* @param prefix used in recursion to determine the proper prefix
110+
* @param section source section
111+
* @param prefix used in recursion to determine the proper prefix
110112
* @param ignoreInternal ignore keys prefixed with `internal'
111113
*/
112114
private void loadLanguageSection(Map<String, String> map, ConfigurationSection section, String prefix, boolean ignoreInternal) {

src/main/java/cat/nyaa/utils/Message.java

Lines changed: 110 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.bukkit.inventory.meta.ItemMeta;
1616

1717
import java.util.ArrayList;
18+
import java.util.HashMap;
19+
import java.util.Map;
1820

1921
public final class Message {
2022
public final BaseComponent inner;
@@ -33,63 +35,75 @@ public Message appendFormat(Internationalization i18n, String template, Object..
3335
}
3436

3537
public Message append(ItemStack item) {
36-
return append(item, "{itemName} *{amount}");
38+
return append("{itemName} *{amount}", item);
3739
}
3840

41+
/**
42+
* supported syntax
43+
* {itemName}: when cursor hovered on, item will be displayed, item at index=0
44+
* {itemName:idx}: the number indicates the index of the item in items list
45+
* {amount}: a number, item at index=0
46+
* {amount:idx}: a number, item at index=idx (e.g {amount:0})
47+
*
48+
* @param template the template string
49+
* @param items item list
50+
* @return the Message
51+
*/
52+
public Message append(String template, ItemStack... items) {
53+
if (items == null || items.length == 0) return this;
54+
Map<String, BaseComponent> varMap = new HashMap<>();
55+
for (int i = 0; i < items.length; i++) {
56+
ItemStack clone = items[i].clone();
57+
boolean hasCustomName = clone.hasItemMeta() && clone.getItemMeta().hasDisplayName();
58+
BaseComponent cmp = hasCustomName ? new TextComponent(clone.getItemMeta().getDisplayName()) : I16rItemName.getUnlocalizedName(clone);
59+
cmp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new BaseComponent[]{new TextComponent(getItemJsonStripped(clone))}));
60+
varMap.put(String.format("{amount:%d}", i), new TextComponent(Integer.toString(clone.getAmount())));
61+
varMap.put(String.format("{itemName:%d}", i), cmp);
62+
if (i == 0) {
63+
varMap.put("{amount}", new TextComponent(Integer.toString(clone.getAmount())));
64+
varMap.put("{itemName}", cmp);
65+
}
66+
}
67+
68+
String remTemplate = template;
69+
while (remTemplate.length() > 0) {
70+
int idx = remTemplate.length();
71+
String var = null;
72+
for (String v : varMap.keySet()) {
73+
int t = remTemplate.indexOf(v);
74+
if (t >= 0 && t < idx) {
75+
idx = t;
76+
var = v;
77+
}
78+
}
79+
80+
if (idx == -1) break; // no more variables left
81+
if (idx == 0) {
82+
remTemplate = remTemplate.substring(var.length());
83+
append(varMap.get(var));
84+
}
85+
if (idx > 0) {
86+
append(remTemplate.substring(0, idx));
87+
remTemplate = remTemplate.substring(idx);
88+
}
89+
}
90+
if (remTemplate.length() > 0) append(remTemplate);
91+
return this;
92+
}
93+
94+
/**
95+
* @deprecated old buggy method, will be removed in the future
96+
*/
3997
public Message append(ItemStack item, String display) {
4098
item = item.clone();
4199
boolean rawName = !(item.hasItemMeta() && item.getItemMeta().hasDisplayName());
42100
BaseComponent nameComponent = rawName ? I16rItemName.getUnlocalizedName(item) : new TextComponent(item.getItemMeta().getDisplayName());
43101
BaseComponent result;
44-
String itemJson = "";
45-
if (item.hasItemMeta() && item.getItemMeta() instanceof BookMeta) {
46-
itemJson = ReflectionUtil.convertItemStackToJson(removeBookContent(item));
47-
} else if (item.hasItemMeta() && item.getItemMeta() instanceof BlockStateMeta) {
48-
BlockStateMeta blockStateMeta = (BlockStateMeta) item.getItemMeta();
49-
try {
50-
if (blockStateMeta.hasBlockState() && blockStateMeta.getBlockState() instanceof InventoryHolder) {
51-
InventoryHolder inventoryHolder = (InventoryHolder) blockStateMeta.getBlockState();
52-
ArrayList<ItemStack> items = new ArrayList<>();
53-
for (int i = 0; i < inventoryHolder.getInventory().getSize(); i++) {
54-
ItemStack itemStack = inventoryHolder.getInventory().getItem(i);
55-
if (itemStack != null && itemStack.getType() != Material.AIR) {
56-
if (items.size() < 5) {
57-
if (itemStack.hasItemMeta()) {
58-
if (itemStack.getItemMeta().hasLore()) {
59-
ItemMeta meta = itemStack.getItemMeta();
60-
meta.setLore(new ArrayList<String>());
61-
itemStack.setItemMeta(meta);
62-
}
63-
if (itemStack.getItemMeta() instanceof BookMeta) {
64-
itemStack = removeBookContent(itemStack);
65-
}
66-
}
67-
items.add(itemStack);
68-
} else {
69-
items.add(new ItemStack(Material.STONE));
70-
}
71-
}
72-
}
73-
inventoryHolder.getInventory().clear();
74-
for (int i = 0; i < items.size(); i++) {
75-
inventoryHolder.getInventory().setItem(i, items.get(i));
76-
}
77-
blockStateMeta.setBlockState((BlockState) inventoryHolder);
78-
item.setItemMeta(blockStateMeta);
79-
itemJson = ReflectionUtil.convertItemStackToJson(item);
80-
} else {
81-
itemJson = ReflectionUtil.convertItemStackToJson(item);
82-
}
83-
} catch (IllegalStateException e) {
84-
itemJson = ReflectionUtil.convertItemStackToJson(item);
85-
}
86-
} else {
87-
itemJson = ReflectionUtil.convertItemStackToJson(item);
88-
}
102+
String itemJson = getItemJsonStripped(item);
103+
89104
HoverEvent ev = new HoverEvent(HoverEvent.Action.SHOW_ITEM, new BaseComponent[]{new TextComponent(itemJson)});
90105
nameComponent.setHoverEvent(ev);
91106

92-
93107
if ("{itemName}".equals(display)) {
94108
result = nameComponent;
95109
} else {
@@ -134,6 +148,55 @@ public Message broadcast(String permission) {
134148
return this;
135149
}
136150

151+
private String getItemJsonStripped(ItemStack item) {
152+
ItemStack cloned = item.clone();
153+
if (cloned.hasItemMeta() && cloned.getItemMeta() instanceof BookMeta) {
154+
return ReflectionUtil.convertItemStackToJson(removeBookContent(cloned));
155+
}
156+
if (cloned.hasItemMeta() && cloned.getItemMeta() instanceof BlockStateMeta) {
157+
BlockStateMeta blockStateMeta = (BlockStateMeta) cloned.getItemMeta();
158+
if (blockStateMeta.hasBlockState() && blockStateMeta.getBlockState() instanceof InventoryHolder) {
159+
InventoryHolder inventoryHolder = (InventoryHolder) blockStateMeta.getBlockState();
160+
ArrayList<ItemStack> items = new ArrayList<>();
161+
for (int i = 0; i < inventoryHolder.getInventory().getSize(); i++) {
162+
ItemStack itemStack = inventoryHolder.getInventory().getItem(i);
163+
if (itemStack != null && itemStack.getType() != Material.AIR) {
164+
if (items.size() < 5) {
165+
if (itemStack.hasItemMeta()) {
166+
if (itemStack.getItemMeta().hasLore()) {
167+
ItemMeta meta = itemStack.getItemMeta();
168+
meta.setLore(new ArrayList<String>());
169+
itemStack.setItemMeta(meta);
170+
}
171+
if (itemStack.getItemMeta() instanceof BookMeta) {
172+
itemStack = removeBookContent(itemStack);
173+
}
174+
}
175+
items.add(itemStack);
176+
} else {
177+
items.add(new ItemStack(Material.STONE));
178+
}
179+
}
180+
}
181+
inventoryHolder.getInventory().clear();
182+
for (int i = 0; i < items.size(); i++) {
183+
inventoryHolder.getInventory().setItem(i, items.get(i));
184+
}
185+
blockStateMeta.setBlockState((BlockState) inventoryHolder);
186+
cloned.setItemMeta(blockStateMeta);
187+
return ReflectionUtil.convertItemStackToJson(cloned);
188+
}
189+
}
190+
return ReflectionUtil.convertItemStackToJson(cloned);
191+
}
192+
193+
/**
194+
* Get a clone of the item where all book pages are removed
195+
* if not a book, then the same item is returned
196+
*
197+
* @param item the book
198+
* @return book without contents.
199+
*/
137200
public ItemStack removeBookContent(ItemStack item) {
138201
if (item.hasItemMeta() && item.getItemMeta() instanceof BookMeta) {
139202
ItemStack itemStack = item.clone();

src/main/java/cat/nyaa/utils/database/BaseDatabase.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ Map<String, Object> getColumnObjectMap(T obj, String... columns) throws Reflecti
139139
return objects;
140140
}
141141

142-
/** Pick CURRENT result from the result set */
142+
/**
143+
* Pick CURRENT result from the result set
144+
*/
143145
T getObjectFromResultSet(ResultSet rs) throws ReflectiveOperationException, SQLException {
144146
T obj = tableClass.newInstance();
145147
for (String colName : columnNames) {

src/main/java/cat/nyaa/utils/database/ColumnType.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ public static Object toSystemType(Object obj, Class desiredType) {
2929
} else {
3030
throw new IllegalArgumentException("object cannot be parsed as boolean");
3131
}
32-
} else if (desiredType == long.class || desiredType == Long.class){
33-
return ((Number)obj).longValue();
32+
} else if (desiredType == long.class || desiredType == Long.class) {
33+
return ((Number) obj).longValue();
3434
} else if (desiredType == double.class || desiredType == Double.class) {
35-
return ((Number)obj).doubleValue();
35+
return ((Number) obj).doubleValue();
3636
} else if (desiredType == String.class) {
3737
return (String) obj;
3838
} else {

0 commit comments

Comments
 (0)