mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2025-12-29 11:59:11 +00:00
1.2.9
This commit is contained in:
@@ -65,6 +65,7 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
else {
|
||||
inventory = Bukkit.createInventory(null, 9, "{CustomFishing_Bag_" + player.getName() + "}");
|
||||
}
|
||||
connection.close();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -87,8 +88,11 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
|
||||
private void createTableIfNotExist(String table) {
|
||||
String sql = String.format(SqlConstants.SQL_CREATE_BAG_TABLE, table);
|
||||
try (Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
try {
|
||||
Connection connection = sqlConnection.getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(sql);
|
||||
statement.executeUpdate();
|
||||
connection.close();
|
||||
} catch (SQLException ex) {
|
||||
AdventureUtil.consoleMessage("[CustomFishing] Failed to create table");
|
||||
}
|
||||
@@ -96,11 +100,13 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
|
||||
private void insertBagData(UUID uuid, int size, String contents) {
|
||||
String sql = String.format(SqlConstants.SQL_INSERT_BAG, sqlConnection.getTablePrefix() + "_fishingbag");
|
||||
try (Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
try {
|
||||
Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql);
|
||||
statement.setString(1, uuid.toString());
|
||||
statement.setInt(2, size);
|
||||
statement.setString(3, contents);
|
||||
statement.executeUpdate();
|
||||
connection.close();
|
||||
} catch (SQLException ex) {
|
||||
AdventureUtil.consoleMessage("[CustomFishing] Failed to insert data for " + uuid);
|
||||
}
|
||||
@@ -108,11 +114,13 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
|
||||
private void updateBagData(UUID uuid, int size, String contents) {
|
||||
String sql = String.format(SqlConstants.SQL_UPDATE_BAG_BY_UUID, sqlConnection.getTablePrefix() + "_fishingbag");
|
||||
try (Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
try {
|
||||
Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql);
|
||||
statement.setInt(1, size);
|
||||
statement.setString(2, contents);
|
||||
statement.setString(3, uuid.toString());
|
||||
statement.executeUpdate();
|
||||
connection.close();
|
||||
} catch (SQLException ex) {
|
||||
AdventureUtil.consoleMessage("[CustomFishing] Failed to update data for " + uuid);
|
||||
}
|
||||
@@ -121,10 +129,12 @@ public class MySQLStorageImpl implements DataStorageInterface {
|
||||
public boolean exists(UUID uuid) {
|
||||
String sql = String.format(SqlConstants.SQL_SELECT_BAG_BY_UUID, sqlConnection.getTablePrefix() + "_fishingbag");
|
||||
boolean exist;
|
||||
try (Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
try {
|
||||
Connection connection = sqlConnection.getConnection(); PreparedStatement statement = connection.prepareStatement(sql);
|
||||
statement.setString(1, uuid.toString());
|
||||
ResultSet rs = statement.executeQuery();
|
||||
exist = rs.next();
|
||||
connection.close();
|
||||
} catch (SQLException ex) {
|
||||
AdventureUtil.consoleMessage("[CustomFishing] Failed to select data for " + uuid);
|
||||
return false;
|
||||
|
||||
@@ -34,6 +34,6 @@ public class MMOItemsItemImpl implements ItemInterface {
|
||||
material = material.substring(9);
|
||||
String[] split = StringUtils.split(material, ":");
|
||||
MMOItem mmoItem = MMOItems.plugin.getMMOItem(Type.get(split[0]), split[1]);
|
||||
return mmoItem == null ? null : mmoItem.newBuilder().getItemStack();
|
||||
return mmoItem == null ? null : mmoItem.newBuilder().build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,4 +26,4 @@ public class CustomCropsSeasonImpl implements SeasonInterface {
|
||||
public String getSeason(World world) {
|
||||
return SeasonUtils.getSeason(world).name();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,13 @@ public class RealisticSeasonsImpl implements SeasonInterface {
|
||||
|
||||
@Override
|
||||
public String getSeason(World world) {
|
||||
return SeasonsAPI.getInstance().getSeason(world).toString();
|
||||
return switch (SeasonsAPI.getInstance().getSeason(world)) {
|
||||
case WINTER -> "winter";
|
||||
case SPRING -> "spring";
|
||||
case SUMMER -> "summer";
|
||||
case FALL -> "autumn";
|
||||
case DISABLED -> "disabled";
|
||||
case RESTORE -> "restore";
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ public class BagDataManager extends Function {
|
||||
WrappedChatComponent.fromJson(
|
||||
GsonComponentSerializer.gson().serialize(
|
||||
MiniMessage.miniMessage().deserialize(
|
||||
ItemStackUtil.replaceLegacy(text)
|
||||
AdventureUtil.replaceLegacy(text)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -638,18 +638,18 @@ public class FishingManager extends Function {
|
||||
if (text.contains("{loot}")){
|
||||
text = text.replace("{loot}","|");
|
||||
if (text.startsWith("|")){
|
||||
component = getDisplayName(itemStack).append(MiniMessage.miniMessage().deserialize(text.substring(1)));
|
||||
component = getDisplayName(itemStack).append(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.substring(1))));
|
||||
}
|
||||
else if (text.endsWith("|")){
|
||||
component = MiniMessage.miniMessage().deserialize(text.substring(0,text.length() - 1)).append(getDisplayName(itemStack));
|
||||
component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.substring(0,text.length() - 1))).append(getDisplayName(itemStack));
|
||||
}
|
||||
else {
|
||||
String[] titleSplit = StringUtils.split(text, "|");
|
||||
component = MiniMessage.miniMessage().deserialize(titleSplit[0]).append(getDisplayName(itemStack)).append(MiniMessage.miniMessage().deserialize(titleSplit[1]));
|
||||
component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(titleSplit[0])).append(getDisplayName(itemStack)).append(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(titleSplit[1])));
|
||||
}
|
||||
}
|
||||
else {
|
||||
component = MiniMessage.miniMessage().deserialize(text);
|
||||
component = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text));
|
||||
}
|
||||
return component;
|
||||
}
|
||||
|
||||
@@ -97,9 +97,7 @@ public class SellManager extends Function {
|
||||
loadConfig();
|
||||
CustomFishing.protocolManager.addPacketListener(windowPacketListener);
|
||||
Bukkit.getPluginManager().registerEvents(inventoryListener, CustomFishing.plugin);
|
||||
if (sellLimitation) {
|
||||
readLimitationCache();
|
||||
}
|
||||
readLimitationCache();
|
||||
}
|
||||
|
||||
private void readLimitationCache() {
|
||||
@@ -199,7 +197,7 @@ public class SellManager extends Function {
|
||||
titleIn = config.getInt("actions.title.in");
|
||||
titleStay = config.getInt("actions.title.stay");
|
||||
titleOut = config.getInt("actions.title.out");
|
||||
} else actionbarNotification = null;
|
||||
} else titleNotification = null;
|
||||
if (config.getBoolean("actions.commands.enable")) {
|
||||
commands = config.getStringList("actions.commands.value").toArray(new String[0]);
|
||||
} else commands = null;
|
||||
@@ -261,7 +259,7 @@ public class SellManager extends Function {
|
||||
}
|
||||
|
||||
double earnings = Optional.ofNullable(todayEarning.get(player.getName())).orElse(0d);
|
||||
if (earnings + totalPrice > upperLimit) {
|
||||
if (sellLimitation && earnings + totalPrice > upperLimit) {
|
||||
inventory.close();
|
||||
AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.reachSellLimit);
|
||||
if (denyKey != null) AdventureUtil.playerSound(player, soundSource, denyKey, 1, 1);
|
||||
@@ -369,21 +367,21 @@ public class SellManager extends Function {
|
||||
private void doActions(Player player, float earnings, double remains) {
|
||||
if (titleNotification != null) AdventureUtil.playerTitle(
|
||||
player,
|
||||
titleNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", String.format("%.2f", remains)),
|
||||
subtitleNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", String.format("%.2f", remains)),
|
||||
titleNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", sellLimitation ? String.format("%.2f", remains) : "unlimited"),
|
||||
subtitleNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", sellLimitation ? String.format("%.2f", remains) : "unlimited"),
|
||||
titleIn * 50,
|
||||
titleStay * 50,
|
||||
titleOut * 50
|
||||
);
|
||||
if (msgNotification != null) {
|
||||
AdventureUtil.playerMessage(player, msgNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", String.format("%.2f", remains)));
|
||||
AdventureUtil.playerMessage(player, msgNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", sellLimitation ? String.format("%.2f", remains) : "unlimited"));
|
||||
}
|
||||
if (actionbarNotification != null) {
|
||||
AdventureUtil.playerActionbar(player, actionbarNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", String.format("%.2f", remains)));
|
||||
AdventureUtil.playerActionbar(player, actionbarNotification.replace("{money}", String.format("%.2f", earnings)).replace("{remains}", sellLimitation ? String.format("%.2f", remains) : "unlimited"));
|
||||
}
|
||||
if (commands != null) {
|
||||
for (String cmd : commands) {
|
||||
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("{player}", player.getName()).replace("{money}", String.format("%.2f", earnings)).replace("{remains}", String.format("%.2f", remains)));
|
||||
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("{player}", player.getName()).replace("{money}", String.format("%.2f", earnings)).replace("{remains}", sellLimitation ? String.format("%.2f", remains) : "unlimited"));
|
||||
}
|
||||
}
|
||||
if (ConfigManager.logEarning) {
|
||||
@@ -408,7 +406,7 @@ public class SellManager extends Function {
|
||||
WrappedChatComponent.fromJson(
|
||||
GsonComponentSerializer.gson().serialize(
|
||||
MiniMessage.miniMessage().deserialize(
|
||||
ItemStackUtil.replaceLegacy(text)
|
||||
AdventureUtil.replaceLegacy(text)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -76,8 +76,12 @@ public class TextCache {
|
||||
.replace("{minute}", String.format("%02d", Competition.currentCompetition.getRemainingTime() / 60))
|
||||
.replace("{second}",String.format("%02d", Competition.currentCompetition.getRemainingTime() % 60))
|
||||
.replace("{score}", String.format("%.1f", Competition.currentCompetition.getScore(owner)))
|
||||
.replace("{1st_player}", Competition.currentCompetition.getFirstPlayer())
|
||||
.replace("{1st_score}", String.format("%.1f", Competition.currentCompetition.getFirstScore()))
|
||||
.replace("{1st_player}", Competition.currentCompetition.getFirstPlayer());
|
||||
.replace("{2nd_player}", Competition.currentCompetition.getSecondPlayer())
|
||||
.replace("{2nd_score}", String.format("%.1f", Competition.currentCompetition.getSecondScore()))
|
||||
.replace("{3rd_player}", Competition.currentCompetition.getThirdPlayer())
|
||||
.replace("{3rd_score}", String.format("%.1f", Competition.currentCompetition.getThirdScore()));
|
||||
|
||||
if (!latestValue.equals(string)) {
|
||||
latestValue = string;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package net.momirealms.customfishing.object.requirements;
|
||||
|
||||
import net.momirealms.customfishing.CustomFishing;
|
||||
import net.momirealms.customfishing.helper.Log;
|
||||
import net.momirealms.customfishing.integration.SeasonInterface;
|
||||
import net.momirealms.customfishing.object.fishing.FishingCondition;
|
||||
|
||||
|
||||
@@ -40,14 +40,14 @@ public class AdventureUtil {
|
||||
public static void consoleMessage(String s) {
|
||||
Audience au = CustomFishing.adventure.sender(Bukkit.getConsoleSender());
|
||||
MiniMessage mm = MiniMessage.miniMessage();
|
||||
Component parsed = mm.deserialize(ItemStackUtil.replaceLegacy(s));
|
||||
Component parsed = mm.deserialize(replaceLegacy(s));
|
||||
au.sendMessage(parsed);
|
||||
}
|
||||
|
||||
public static void playerMessage(Player player, String s) {
|
||||
Audience au = CustomFishing.adventure.player(player);
|
||||
MiniMessage mm = MiniMessage.miniMessage();
|
||||
Component parsed = mm.deserialize(ItemStackUtil.replaceLegacy(s));
|
||||
Component parsed = mm.deserialize(replaceLegacy(s));
|
||||
au.sendMessage(parsed);
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class AdventureUtil {
|
||||
Audience au = CustomFishing.adventure.player(player);
|
||||
MiniMessage mm = MiniMessage.miniMessage();
|
||||
Title.Times times = Title.Times.times(Duration.ofMillis(in), Duration.ofMillis(duration), Duration.ofMillis(out));
|
||||
Title title = Title.title(mm.deserialize(ItemStackUtil.replaceLegacy(s1)), mm.deserialize(ItemStackUtil.replaceLegacy(s2)), times);
|
||||
Title title = Title.title(mm.deserialize(replaceLegacy(s1)), mm.deserialize(replaceLegacy(s2)), times);
|
||||
au.showTitle(title);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public class AdventureUtil {
|
||||
public static void playerActionbar(Player player, String s) {
|
||||
Audience au = CustomFishing.adventure.player(player);
|
||||
MiniMessage mm = MiniMessage.miniMessage();
|
||||
au.sendActionBar(mm.deserialize(ItemStackUtil.replaceLegacy(s)));
|
||||
au.sendActionBar(mm.deserialize(replaceLegacy(s)));
|
||||
}
|
||||
|
||||
public static void playerSound(Player player, Sound.Source source, Key key, float volume, float pitch) {
|
||||
@@ -77,4 +77,113 @@ public class AdventureUtil {
|
||||
Audience au = CustomFishing.adventure.player(player);
|
||||
au.playSound(sound);
|
||||
}
|
||||
|
||||
public static String replaceLegacy(String s) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
char[] chars = s.replaceAll("&","§").toCharArray();
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
if (chars[i] == '§') {
|
||||
if (i + 1 < chars.length) {
|
||||
switch (chars[i+1]){
|
||||
case '0' -> {
|
||||
i++;
|
||||
stringBuilder.append("<black>");
|
||||
}
|
||||
case '1' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_blue>");
|
||||
}
|
||||
case '2' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_green>");
|
||||
}
|
||||
case '3' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_aqua>");
|
||||
}
|
||||
case '4' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_red>");
|
||||
}
|
||||
case '5' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_purple>");
|
||||
}
|
||||
case '6' -> {
|
||||
i++;
|
||||
stringBuilder.append("<gold>");
|
||||
}
|
||||
case '7' -> {
|
||||
i++;
|
||||
stringBuilder.append("<gray>");
|
||||
}
|
||||
case '8' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_gray>");
|
||||
}
|
||||
case '9' -> {
|
||||
i++;
|
||||
stringBuilder.append("<blue>");
|
||||
}
|
||||
case 'a' -> {
|
||||
i++;
|
||||
stringBuilder.append("<green>");
|
||||
}
|
||||
case 'b' -> {
|
||||
i++;
|
||||
stringBuilder.append("<aqua>");
|
||||
}
|
||||
case 'c' -> {
|
||||
i++;
|
||||
stringBuilder.append("<red>");
|
||||
}
|
||||
case 'd' -> {
|
||||
i++;
|
||||
stringBuilder.append("<light_purple>");
|
||||
}
|
||||
case 'e' -> {
|
||||
i++;
|
||||
stringBuilder.append("<yellow>");
|
||||
}
|
||||
case 'f' -> {
|
||||
i++;
|
||||
stringBuilder.append("<white>");
|
||||
}
|
||||
case 'r' -> {
|
||||
i++;
|
||||
stringBuilder.append("<reset><!italic>");
|
||||
}
|
||||
case 'l' -> {
|
||||
i++;
|
||||
stringBuilder.append("<bold>");
|
||||
}
|
||||
case 'm' -> {
|
||||
i++;
|
||||
stringBuilder.append("<strikethrough>");
|
||||
}
|
||||
case 'o' -> {
|
||||
i++;
|
||||
stringBuilder.append("<italic>");
|
||||
}
|
||||
case 'n' -> {
|
||||
i++;
|
||||
stringBuilder.append("<underlined>");
|
||||
}
|
||||
case 'x' -> {
|
||||
stringBuilder.append("<#").append(chars[i+3]).append(chars[i+5]).append(chars[i+7]).append(chars[i+9]).append(chars[i+11]).append(chars[i+13]).append(">");
|
||||
i += 13;
|
||||
}
|
||||
case 'k' -> {
|
||||
i++;
|
||||
stringBuilder.append("<obfuscated>");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
stringBuilder.append(chars[i]);
|
||||
}
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class ItemStackUtil {
|
||||
NBTCompound display = nbtItem.addCompound("display");
|
||||
String name = item.getName();
|
||||
if (name.contains("&") || name.contains("§")){
|
||||
name = replaceLegacy(name);
|
||||
name = AdventureUtil.replaceLegacy(name);
|
||||
}
|
||||
display.setString("Name", GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize("<!i>" + name)));
|
||||
}
|
||||
@@ -77,7 +77,7 @@ public class ItemStackUtil {
|
||||
List<String> lore = display.getStringList("Lore");
|
||||
item.getLore().forEach(line -> {
|
||||
if (line.contains("&") || line.contains("§")){
|
||||
line = replaceLegacy(line);
|
||||
line = AdventureUtil.replaceLegacy(line);
|
||||
}
|
||||
lore.add(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize("<!i>" + line)));
|
||||
});
|
||||
@@ -289,113 +289,4 @@ public class ItemStackUtil {
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
public static String replaceLegacy(String s) {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
char[] chars = s.replaceAll("&","§").toCharArray();
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
if (chars[i] == '§') {
|
||||
if (i + 1 < chars.length) {
|
||||
switch (chars[i+1]){
|
||||
case '0' -> {
|
||||
i++;
|
||||
stringBuilder.append("<black>");
|
||||
}
|
||||
case '1' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_blue>");
|
||||
}
|
||||
case '2' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_green>");
|
||||
}
|
||||
case '3' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_aqua>");
|
||||
}
|
||||
case '4' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_red>");
|
||||
}
|
||||
case '5' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_purple>");
|
||||
}
|
||||
case '6' -> {
|
||||
i++;
|
||||
stringBuilder.append("<gold>");
|
||||
}
|
||||
case '7' -> {
|
||||
i++;
|
||||
stringBuilder.append("<gray>");
|
||||
}
|
||||
case '8' -> {
|
||||
i++;
|
||||
stringBuilder.append("<dark_gray>");
|
||||
}
|
||||
case '9' -> {
|
||||
i++;
|
||||
stringBuilder.append("<blue>");
|
||||
}
|
||||
case 'a' -> {
|
||||
i++;
|
||||
stringBuilder.append("<green>");
|
||||
}
|
||||
case 'b' -> {
|
||||
i++;
|
||||
stringBuilder.append("<aqua>");
|
||||
}
|
||||
case 'c' -> {
|
||||
i++;
|
||||
stringBuilder.append("<red>");
|
||||
}
|
||||
case 'd' -> {
|
||||
i++;
|
||||
stringBuilder.append("<light_purple>");
|
||||
}
|
||||
case 'e' -> {
|
||||
i++;
|
||||
stringBuilder.append("<yellow>");
|
||||
}
|
||||
case 'f' -> {
|
||||
i++;
|
||||
stringBuilder.append("<white>");
|
||||
}
|
||||
case 'r' -> {
|
||||
i++;
|
||||
stringBuilder.append("<reset><!italic>");
|
||||
}
|
||||
case 'l' -> {
|
||||
i++;
|
||||
stringBuilder.append("<bold>");
|
||||
}
|
||||
case 'm' -> {
|
||||
i++;
|
||||
stringBuilder.append("<strikethrough>");
|
||||
}
|
||||
case 'o' -> {
|
||||
i++;
|
||||
stringBuilder.append("<italic>");
|
||||
}
|
||||
case 'n' -> {
|
||||
i++;
|
||||
stringBuilder.append("<underlined>");
|
||||
}
|
||||
case 'x' -> {
|
||||
stringBuilder.append("<#").append(chars[i+3]).append(chars[i+5]).append(chars[i+7]).append(chars[i+9]).append(chars[i+11]).append(chars[i+13]).append(">");
|
||||
i += 13;
|
||||
}
|
||||
case 'k' -> {
|
||||
i++;
|
||||
stringBuilder.append("<obfuscated>");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
stringBuilder.append(chars[i]);
|
||||
}
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,8 @@ rainbow_fish:
|
||||
- '<gray>This is a <font:uniform>rainbow fish!'
|
||||
- '<gray>It is {size}cm long!'
|
||||
custom-model-data: 1
|
||||
|
||||
# breakable
|
||||
unbreakable: false
|
||||
# Optional
|
||||
size: 10~200
|
||||
|
||||
|
||||
Reference in New Issue
Block a user