fix the lore bug

remove reliance on cluster for one method

update run files

add workflows

fix output task

update plugin download for runserver

migrate old items in data.yml on startup

fix/improve how items are stored/displayed

bump version
This commit is contained in:
Ryder Belserion 2024-06-14 23:16:39 -04:00
parent 4b20f61b21
commit 22250d5328
No known key found for this signature in database
11 changed files with 196 additions and 76 deletions

54
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,54 @@
name: Publish Release
on:
push:
branches:
- main
workflow_dispatch:
inputs:
logLevel:
description: 'Log Level'
required: false
default: 'warning'
jobs:
publish:
runs-on: ubuntu-latest
if: "contains(github.event.commits[0].message, '[build]')"
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v3
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 17
check-latest: true
- name: Gradle Properties Import.
id: properties
shell: bash
run: cat gradle.properties >> $GITHUB_ENV
- name: Make gradlew executable
run: chmod +x ./gradlew
- name: Assemble
run:
./gradlew assemble --stacktrace
- name: Publish
env:
HANGAR_KEY: ${{ secrets.HANGAR_KEY }}
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
COMMIT_MESSAGE: ${{ join(github.event.commits.*.message, '<br>* ') }}
run: ./gradlew modrinth publishAllPublicationsToHangar --stacktrace
- name: Maven Publish
env:
gradle_username: ${{ secrets.GRADLE_USERNAME }}
gradle_password: ${{ secrets.GRADLE_PASSWORD }}
run: ./gradlew publish --stacktrace

View File

@ -1,40 +1,3 @@
import org.gradle.kotlin.dsl.support.uppercaseFirstChar
plugins {
`root-plugin`
}
tasks {
assemble {
val jarsDir = File("$rootDir/jars")
doFirst {
delete(jarsDir)
jarsDir.mkdirs()
}
subprojects.filter { it.name == "paper" || it.name == "fabric" }.forEach { project ->
dependsOn(":${project.name}:build")
doLast {
runCatching {
val file = File("$jarsDir/${project.name.uppercaseFirstChar().lowercase()}")
file.mkdirs()
copy {
from(project.layout.buildDirectory.file("libs/${rootProject.name}-${project.version}.jar"))
into(file)
}
}.onSuccess {
// Delete to save space on jenkins.
delete(project.layout.buildDirectory.get())
delete(rootProject.layout.buildDirectory.get())
}.onFailure {
println("Failed to copy file out of build folder into jars directory: Likely does not exist.")
}
}
}
}
}

View File

@ -10,7 +10,7 @@ issues = https://github.com/Crazy-Crew/CrazyAuctions/issues
group = com.badbones69.crazyauctions
description = Auction off items in style.
version = 1.4
version = 1.4.1
apiVersion = 1.20
mcVersion = 1.20.4

View File

@ -28,6 +28,13 @@ dependencies {
tasks {
assemble {
dependsOn(reobfJar)
doLast {
copy {
from(reobfJar.get())
into(rootProject.projectDir.resolve("jars"))
}
}
}
runServer {
@ -40,7 +47,7 @@ tasks {
url("https://ci.lucko.me/job/TinyVault/lastSuccessfulBuild/artifact/build/libs/Vault.jar")
url("https://download.luckperms.net/1532/bukkit/loader/LuckPerms-Bukkit-5.4.119.jar")
url("https://download.luckperms.net/1544/bukkit/loader/LuckPerms-Bukkit-5.4.131.jar")
}
minecraftVersion("1.20.4")

Binary file not shown.

View File

@ -122,6 +122,7 @@ unsupported-settings:
allow-headless-pistons: false
allow-permanent-block-break-exploits: false
allow-piston-duplication: false
allow-tripwire-disarming-exploits: false
allow-unsafe-end-portal-teleportation: false
compression-format: ZLIB
perform-username-validation: true

View File

@ -236,6 +236,7 @@ environment:
min: 20
enabled: true
generate-flat-bedrock: false
locate-structures-outside-world-border: false
max-block-ticks: 65536
max-fluid-ticks: 65536
nether-ceiling-void-damage-height: disabled

View File

@ -13,8 +13,12 @@ import com.badbones69.crazyauctions.currency.VaultSupport;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.TabCompleter;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.util.Base64;
import java.util.Timer;
import java.util.TimerTask;
@ -50,6 +54,33 @@ public class CrazyAuctions extends JavaPlugin {
this.crazyManager = new CrazyManager();
this.fileManager.setup();
FileConfiguration configuration = FileManager.Files.DATA.getFile();
if (configuration.contains("OutOfTime/Cancelled")) {
for (String key : configuration.getConfigurationSection("OutOfTime/Cancelled").getKeys(false)) {
final ItemStack itemStack = configuration.getItemStack("OutOfTime/Cancelled." + key + ".Item");
if (itemStack != null) {
configuration.set("OutOfTime/Cancelled." + key + ".Item", Base64.getEncoder().encodeToString(itemStack.serializeAsBytes()));
FileManager.Files.DATA.saveFile();
}
}
}
if (configuration.contains("Items")) {
for (String key : configuration.getConfigurationSection("Items").getKeys(false)) {
final ItemStack itemStack = configuration.getItemStack("Items." + key + ".Item");
if (itemStack != null) {
configuration.set("Items." + key + ".Item", Base64.getEncoder().encodeToString(itemStack.serializeAsBytes()));
FileManager.Files.DATA.saveFile();
}
}
}
this.crazyManager.load();
getServer().getPluginManager().registerEvents(new GuiListener(), this);

View File

@ -5,7 +5,6 @@ import com.badbones69.crazyauctions.Methods;
import com.badbones69.crazyauctions.api.support.PluginSupport;
import com.badbones69.crazyauctions.api.support.SkullCreator;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.ryderbelserion.cluster.utils.DyeUtils;
import io.th0rgal.oraxen.api.OraxenItems;
import me.clip.placeholderapi.PlaceholderAPI;
import net.minecraft.nbt.TagParser;
@ -36,6 +35,8 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -48,7 +49,7 @@ import java.util.stream.Collectors;
public class ItemBuilder {
@NotNull
private final CrazyAuctions plugin = CrazyAuctions.get();
private static final CrazyAuctions plugin = CrazyAuctions.get();
// Items
private Material material = Material.STONE;
@ -583,10 +584,10 @@ public class ItemBuilder {
} else {
this.potionType = getPotionType(PotionEffectType.getByName(metaData)).getEffectType();
this.potionColor = DyeUtils.getColor(metaData);
this.armorColor = DyeUtils.getColor(metaData);
this.mapColor = DyeUtils.getColor(metaData);
this.fireworkColor = DyeUtils.getColor(metaData);
this.potionColor = getColor(metaData);
this.armorColor = getColor(metaData);
this.mapColor = getColor(metaData);
this.fireworkColor = getColor(metaData);
}
} else if (type.contains("#")) {
String[] section = type.split("#");
@ -1183,7 +1184,7 @@ public class ItemBuilder {
try {
for (PatternType pattern : PatternType.values()) {
if (option.equalsIgnoreCase(pattern.name()) || value.equalsIgnoreCase(pattern.getIdentifier())) {
DyeColor color = DyeUtils.getDyeColor(value);
DyeColor color = getDyeColor(value);
if (color != null) itemBuilder.addPattern(new Pattern(color, pattern));
break;
}
@ -1385,7 +1386,7 @@ public class ItemBuilder {
for (PatternType pattern : PatternType.values()) {
if (split[0].equalsIgnoreCase(pattern.name()) || split[0].equalsIgnoreCase(pattern.getIdentifier())) {
DyeColor color = DyeUtils.getDyeColor(split[1]);
DyeColor color = getDyeColor(split[1]);
if (color != null) addPattern(new Pattern(color, pattern));
@ -1394,4 +1395,67 @@ public class ItemBuilder {
}
} catch (Exception ignored) {}
}
public static @Nullable DyeColor getDyeColor(@NotNull final String value) {
if (value.isEmpty()) return null;
Color color = getColor(value);
if (color == null) {
plugin.getLogger().severe(value + " is not a valid color.");
return null;
}
return DyeColor.getByColor(color);
}
private static final Map<String, Color> colors = createMap();
private static Map<String, Color> createMap() {
Map<String, Color> map = new HashMap<>();
map.put("AQUA", Color.AQUA);
map.put("BLACK", Color.BLACK);
map.put("BLUE", Color.BLUE);
map.put("FUCHSIA", Color.FUCHSIA);
map.put("GRAY", Color.GRAY);
map.put("GREEN", Color.GREEN);
map.put("LIME", Color.LIME);
map.put("MAROON", Color.MAROON);
map.put("NAVY", Color.NAVY);
map.put("OLIVE", Color.OLIVE);
map.put("ORANGE", Color.ORANGE);
map.put("PURPLE", Color.PURPLE);
map.put("RED", Color.RED);
map.put("SILVER", Color.SILVER);
map.put("TEAL", Color.TEAL);
map.put("WHITE", Color.WHITE);
map.put("YELLOW", Color.YELLOW);
return map;
}
public static Color getColor(String color) {
if (color != null && !color.isBlank()) {
Color mappedColor = (Color)colors.get(color.toUpperCase());
if (mappedColor != null) {
return mappedColor;
} else {
try {
String[] rgb = color.split(",");
if (rgb.length != 3) {
return null;
} else {
int red = Integer.parseInt(rgb[0]);
int green = Integer.parseInt(rgb[1]);
int blue = Integer.parseInt(rgb[2]);
return Color.fromRGB(red, green, blue);
}
} catch (ArrayIndexOutOfBoundsException | NumberFormatException var6) {
return null;
}
}
} else {
return null;
}
}
}

View File

@ -22,6 +22,7 @@ import org.bukkit.permissions.PermissionAttachmentInfo;
import org.jetbrains.annotations.NotNull;
import org.yaml.snakeyaml.error.YAMLException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.Random;
import java.util.logging.Level;
@ -131,7 +132,7 @@ public class AuctionCommand implements CommandExecutor {
ItemStack stack = item.clone();
stack.setAmount(amount);
data.set("Items." + num + ".Item", stack);
data.set("Items." + num + ".Item", Base64.getEncoder().encodeToString(stack.serializeAsBytes()));
}
Files.DATA.saveFile();
@ -406,7 +407,7 @@ public class AuctionCommand implements CommandExecutor {
ItemStack stack = item.clone();
stack.setAmount(amount);
data.set("Items." + num + ".Item", stack);
data.set("Items." + num + ".Item", Base64.getEncoder().encodeToString(stack.serializeAsBytes()));
Files.DATA.saveFile();

View File

@ -27,6 +27,7 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@ -65,7 +66,10 @@ public class GuiListener implements Listener {
if (data.contains("Items")) {
for (String i : data.getConfigurationSection("Items").getKeys(false)) {
List<String> lore = new ArrayList<>();
if (data.getItemStack("Items." + i + ".Item") != null && (cat.getItems().contains(data.getItemStack("Items." + i + ".Item").getType()) || cat == Category.NONE)) {
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item"))));
if (itemBuilder != null && data.contains("Items." + i + ".Item") && (cat.getItems().contains(itemBuilder.getItemStack().getType()) || cat == Category.NONE)) {
if (data.getBoolean("Items." + i + ".Biddable")) {
if (sell == ShopType.BID) {
String seller = data.getString("Items." + i + ".Seller");
@ -74,8 +78,6 @@ public class GuiListener implements Listener {
lore.add(l.replace("%TopBid%", Methods.getPrice(i, false)).replace("%topbid%", Methods.getPrice(i, false)).replace("%Seller%", seller).replace("%seller%", seller).replace("%TopBidder%", topbidder).replace("%topbidder%", topbidder).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))));
}
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item"));
itemBuilder.setLore(lore);
items.add(itemBuilder.build());
@ -88,11 +90,7 @@ public class GuiListener implements Listener {
lore.add(l.replace("%Price%", String.format(Locale.ENGLISH, "%,d", Long.parseLong(Methods.getPrice(i, false)))).replace("%price%", String.format(Locale.ENGLISH, "%,d", Long.parseLong(Methods.getPrice(i, false)))).replace("%Seller%", data.getString("Items." + i + ".Seller")).replace("%seller%", data.getString("Items." + i + ".Seller")).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))));
}
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item"));
if (itemBuilder.getUpdatedLore().isEmpty()) {
lore.forEach(itemBuilder::addLore);
}
itemBuilder.setLore(lore);
items.add(itemBuilder.build());
@ -256,9 +254,9 @@ public class GuiListener implements Listener {
lore.add(l.replace("%Price%", Methods.getPrice(i, false)).replace("%price%", Methods.getPrice(i, false)).replace("%Time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + i + ".Time-Till-Expire"))));
}
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item"));
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item"))));
lore.forEach(itemBuilder::addLore);
itemBuilder.setLore(lore);
items.add(itemBuilder.build());
@ -293,9 +291,9 @@ public class GuiListener implements Listener {
lore.add(l.replace("%Price%", Methods.getPrice(i, true)).replace("%price%", Methods.getPrice(i, true)).replace("%Time%", Methods.convertToTime(data.getLong("OutOfTime/Cancelled." + i + ".Full-Time"))).replace("%time%", Methods.convertToTime(data.getLong("OutOfTime/Cancelled." + i + ".Full-Time"))));
}
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("OutOfTime/Cancelled." + i + ".Item"));
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item"))));
lore.forEach(itemBuilder::addLore);
itemBuilder.setLore(lore);
items.add(itemBuilder.build());
@ -393,7 +391,7 @@ public class GuiListener implements Listener {
}
}
ItemStack item = data.getItemStack("Items." + ID + ".Item");
ItemStack item = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item")));
List<String> lore = new ArrayList<>();
for (String l : config.getStringList("Settings.GUISettings.SellingItemLore")) {
lore.add(l.replace("%Price%", Methods.getPrice(ID, false)).replace("%price%", Methods.getPrice(ID, false)).replace("%Seller%", data.getString("Items." + ID + ".Seller")).replace("%seller%", data.getString("Items." + ID + ".Seller")).replace("%Time%", Methods.convertToTime(data.getLong("Items." + l + ".Time-Till-Expire"))).replace("%time%", Methods.convertToTime(data.getLong("Items." + l + ".Time-Till-Expire"))));
@ -401,7 +399,7 @@ public class GuiListener implements Listener {
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(item);
lore.forEach(itemBuilder::addLore);
itemBuilder.setLore(lore);
inv.setItem(4, itemBuilder.build());
@ -470,9 +468,9 @@ public class GuiListener implements Listener {
}
}
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(data.getItemStack("Items." + i + ".Item"));
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))));
lore.forEach(itemBuilder::addLore);
itemBuilder.setLore(lore);
items.add(itemBuilder.build());
@ -545,7 +543,7 @@ public class GuiListener implements Listener {
FileConfiguration data = Files.DATA.getFile();
String seller = data.getString("Items." + ID + ".Seller");
String topbidder = data.getString("Items." + ID + ".TopBidder");
ItemStack item = data.getItemStack("Items." + ID + ".Item");
ItemStack item = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item")));
List<String> lore = new ArrayList<>();
for (String l : config.getStringList("Settings.GUISettings.Bidding")) {
@ -554,7 +552,7 @@ public class GuiListener implements Listener {
ItemBuilder itemBuilder = ItemBuilder.convertItemStack(item);
lore.forEach(itemBuilder::addLore);
itemBuilder.setLore(lore);
return itemBuilder.build();
}
@ -661,7 +659,7 @@ public class GuiListener implements Listener {
return;
}
Bukkit.getPluginManager().callEvent(new AuctionNewBidEvent(player, data.getItemStack("Items." + ID + ".Item"), bid));
Bukkit.getPluginManager().callEvent(new AuctionNewBidEvent(player, ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))), bid));
data.set("Items." + ID + ".Price", bid);
data.set("Items." + ID + ".TopBidder", player.getName());
HashMap<String, String> placeholders = new HashMap<>();
@ -810,12 +808,12 @@ public class GuiListener implements Listener {
sellerPlayer.sendMessage(Messages.ADMIN_FORCE_CANCELLED_TO_PLAYER.getMessage());
}
AuctionCancelledEvent event = new AuctionCancelledEvent((sellerPlayer != null ? sellerPlayer : Bukkit.getOfflinePlayer(seller)), data.getItemStack("Items." + i + ".Item"), Reaons.ADMIN_FORCE_CANCEL);
AuctionCancelledEvent event = new AuctionCancelledEvent((sellerPlayer != null ? sellerPlayer : Bukkit.getOfflinePlayer(seller)), ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item"))), Reaons.ADMIN_FORCE_CANCEL);
Bukkit.getPluginManager().callEvent(event);
data.set("OutOfTime/Cancelled." + num + ".Seller", data.getString("Items." + i + ".Seller"));
data.set("OutOfTime/Cancelled." + num + ".Full-Time", data.getLong("Items." + i + ".Full-Time"));
data.set("OutOfTime/Cancelled." + num + ".StoreID", data.getInt("Items." + i + ".StoreID"));
data.set("OutOfTime/Cancelled." + num + ".Item", data.getItemStack("Items." + i + ".Item"));
data.set("OutOfTime/Cancelled." + num + ".Item", data.getString("Items." + ID + ".Item"));
data.set("Items." + i, null);
Files.DATA.saveFile();
player.sendMessage(Messages.ADMIN_FORCE_CANCELLED.getMessage());
@ -944,7 +942,8 @@ public class GuiListener implements Listener {
return;
}
ItemStack i = data.getItemStack("Items." + ID + ".Item");
ItemStack i = ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + ID + ".Item")));
plugin.getServer().getPluginManager().callEvent(new AuctionBuyEvent(player, i, cost));
plugin.getSupport().removeMoney(player, cost);
plugin.getSupport().addMoney(Methods.getOfflinePlayer(seller), cost);
@ -1006,14 +1005,14 @@ public class GuiListener implements Listener {
int ID = data.getInt("Items." + i + ".StoreID");
if (id == ID) {
player.sendMessage(Messages.CANCELLED_ITEM.getMessage());
AuctionCancelledEvent event = new AuctionCancelledEvent(player, data.getItemStack("Items." + i + ".Item"), Reaons.PLAYER_FORCE_CANCEL);
AuctionCancelledEvent event = new AuctionCancelledEvent(player, ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("Items." + i + ".Item"))), Reaons.PLAYER_FORCE_CANCEL);
Bukkit.getPluginManager().callEvent(event);
int num = 1;
for (; data.contains("OutOfTime/Cancelled." + num); num++) ;
data.set("OutOfTime/Cancelled." + num + ".Seller", data.getString("Items." + i + ".Seller"));
data.set("OutOfTime/Cancelled." + num + ".Full-Time", data.getLong("Items." + i + ".Full-Time"));
data.set("OutOfTime/Cancelled." + num + ".StoreID", data.getInt("Items." + i + ".StoreID"));
data.set("OutOfTime/Cancelled." + num + ".Item", data.getItemStack("Items." + i + ".Item"));
data.set("OutOfTime/Cancelled." + num + ".Item", data.getString("Items." + i + ".Item"));
data.set("Items." + i, null);
Files.DATA.saveFile();
playClick(player);
@ -1070,7 +1069,7 @@ public class GuiListener implements Listener {
player.sendMessage(Messages.INVENTORY_FULL.getMessage());
break;
} else {
player.getInventory().addItem(data.getItemStack("OutOfTime/Cancelled." + i + ".Item"));
player.getInventory().addItem(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item"))));
data.set("OutOfTime/Cancelled." + i, null);
}
}
@ -1103,8 +1102,7 @@ public class GuiListener implements Listener {
if (id == ID) {
if (!Methods.isInvFull(player)) {
player.sendMessage(Messages.GOT_ITEM_BACK.getMessage());
ItemStack IT = data.getItemStack("OutOfTime/Cancelled." + i + ".Item");
player.getInventory().addItem(IT);
player.getInventory().addItem(ItemStack.deserializeBytes(Base64.getDecoder().decode(data.getString("OutOfTime/Cancelled." + i + ".Item"))));
data.set("OutOfTime/Cancelled." + i, null);
Files.DATA.saveFile();
playClick(player);