diff --git a/pom.xml b/pom.xml
index 07b87b1..5072984 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
betterbox.mine.game
BetterElo
- 4.4.52-SNAPSHOT
+ 4.6.4-SNAPSHOT
jar
BetterElo
diff --git a/src/main/java/betterbox/mine/game/betterelo/BetterElo.java b/src/main/java/betterbox/mine/game/betterelo/BetterElo.java
index 57ee304..e42d0e6 100644
--- a/src/main/java/betterbox/mine/game/betterelo/BetterElo.java
+++ b/src/main/java/betterbox/mine/game/betterelo/BetterElo.java
@@ -21,6 +21,8 @@
import java.io.Console;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
import java.text.DecimalFormat;
import java.time.Duration;
import java.util.*;
@@ -73,6 +75,11 @@ public void onLoad() {
@Override
public void onEnable() {
+ createPluginFolders();
+ createExampleDropTablesFiles();
+ createExampleDropsFiles();
+ createExampleMobsFiles();
+ createExampleConfigFiles();
// Inicjalizacja PluginLoggera
Set defaultLogLevels = EnumSet.of(PluginLogger.LogLevel.INFO,PluginLogger.LogLevel.DEBUG, PluginLogger.LogLevel.WARNING, PluginLogger.LogLevel.ERROR);
folderPath = getDataFolder().getAbsolutePath();
@@ -143,7 +150,7 @@ public void onEnable() {
pluginLogger.log(PluginLogger.LogLevel.INFO,"Scheduling monthly ranking rewards...");
scheduleRewards("monthly", 0, true);
- File dataFolder = this.getDataFolder();
+ File dataFolder = new File(getDataFolder(),"data");
File databaseFile = new File(dataFolder, "database.txt");
//WebRankingServer server = new WebRankingServer(databaseFile.getAbsolutePath(), 39378,pluginLogger);
@@ -156,6 +163,7 @@ public void onEnable() {
// Uzyskaj dostęp do loggera pluginu
java.util.logging.Logger logger = this.getLogger();
+
// Użyj loggera do rejestrowania wiadomości
logger.info("[BetterElo] Running");
logger.info("[BetterElo] Author " + this.getDescription().getAuthors());
@@ -178,6 +186,120 @@ public void onEnable() {
checkMobsExistence();
}
+ public void createPluginFolders() {
+ // Lista folderów do utworzenia
+ String[] folders = {"customDrops", "customDropTables", "customMobs", "logs","data"};
+
+ // Tworzenie folderów, jeśli nie istnieją
+ for (String folderName : folders) {
+ File folder = new File(getDataFolder(), folderName);
+ if (!folder.exists()) {
+ folder.mkdirs(); // Metoda mkdirs() tworzy folder oraz wszystkie wymagane nadrzędne foldery
+ getLogger().severe("Catalogs "+folders.toString()+" created!");
+ }
+ }
+ }
+ private void createExampleDropsFiles() {
+ // Tworzenie docelowego folderu, jeśli nie istnieje
+ File customFolder = new File(getDataFolder(), "customDrops");
+ if (!customFolder.exists()) {
+ customFolder.mkdirs();
+ }
+
+ // Lokalizacja docelowego pliku konfiguracyjnego
+ String[] fileNames = {"ExampleDropTable_item0.yml", "ExampleDropTable_item1.yml", "ExampleDropTable_item2.yml", "ExampleDropTable_item3.yml", "ExampleDropTable_item4.yml", "ExampleDropTable_item5.yml"}; // Dodaj więcej nazw plików jak potrzebujesz
+
+ for (String fileName : fileNames) {
+ File file = new File(customFolder, fileName);
+ if (!file.exists()) {
+ try (InputStream in = getResource("customDrops/" + fileName)) {
+ if (in == null) {
+ getLogger().severe("Resource 'customDrops/" + fileName + "' not found.");
+ continue;
+ }
+ Files.copy(in, file.toPath());
+ } catch (IOException e) {
+ getLogger().severe("Could not save " + fileName + " to " + file + ": " + e.getMessage());
+ }
+ }
+ }
+ }
+ private void createExampleDropTablesFiles() {
+ // Tworzenie docelowego folderu, jeśli nie istnieje
+ File customFolder = new File(getDataFolder(), "customDropTables");
+ if (!customFolder.exists()) {
+ customFolder.mkdirs();
+ }
+
+ // Lokalizacja docelowego pliku konfiguracyjnego
+ String[] fileNames = {"ExampleDropTable.yml"};
+
+ for (String fileName : fileNames) {
+ File file = new File(customFolder, fileName);
+ if (!file.exists()) {
+ try (InputStream in = getResource("customDropTables/" + fileName)) {
+ if (in == null) {
+ getLogger().severe("Resource 'customDropTables/" + fileName + "' not found.");
+ continue;
+ }
+ Files.copy(in, file.toPath());
+ } catch (IOException e) {
+ getLogger().severe("Could not save " + fileName + " to " + file + ": " + e.getMessage());
+ }
+ }
+ }
+ }
+ private void createExampleConfigFiles() {
+ // Tworzenie docelowego folderu, jeśli nie istnieje
+ File customFolder = getDataFolder();
+ if (!customFolder.exists()) {
+ customFolder.mkdirs();
+ }
+
+ // Lokalizacja docelowego pliku konfiguracyjnego
+ String[] fileNames = {"config.yml"};
+
+ for (String fileName : fileNames) {
+ File file = new File(customFolder, fileName);
+ if (!file.exists()) {
+ try (InputStream in = getResource(fileName)) {
+ if (in == null) {
+ getLogger().severe(fileName + "' not found.");
+ continue;
+ }
+ Files.copy(in, file.toPath());
+ } catch (IOException e) {
+ getLogger().severe("Could not save " + fileName + " to " + file + ": " + e.getMessage());
+ }
+ }
+ }
+ }
+ private void createExampleMobsFiles() {
+ // Tworzenie docelowego folderu, jeśli nie istnieje
+ File customFolder = new File(getDataFolder(), "customMobs");
+ if (!customFolder.exists()) {
+ customFolder.mkdirs();
+ }
+
+ // Lokalizacja docelowego pliku konfiguracyjnego
+ String[] fileNames = {"Marksman.yml","Panda.yml"};
+
+ for (String fileName : fileNames) {
+ File file = new File(customFolder, fileName);
+ if (!file.exists()) {
+ try (InputStream in = getResource("customMobs/" + fileName)) {
+ if (in == null) {
+ getLogger().severe("Resource 'customMobs/" + fileName + "' not found.");
+ continue;
+ }
+ Files.copy(in, file.toPath());
+ } catch (IOException e) {
+ getLogger().severe("Could not save " + fileName + " to " + file + ": " + e.getMessage());
+ }
+ }
+ }
+ }
+
@Override
public void onDisable() {
diff --git a/src/main/java/betterbox/mine/game/betterelo/BetterEloCommand.java b/src/main/java/betterbox/mine/game/betterelo/BetterEloCommand.java
index 09cc18c..977475e 100644
--- a/src/main/java/betterbox/mine/game/betterelo/BetterEloCommand.java
+++ b/src/main/java/betterbox/mine/game/betterelo/BetterEloCommand.java
@@ -189,7 +189,6 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
if (rewardItems != null && !rewardItems.isEmpty()) {
for (ItemStack item : rewardItems) {
player.getInventory().addItem(item);
- sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "[BetterElo]" + ChatColor.AQUA + " Rewards claimed!");
pluginLogger.log(PluginLogger.LogLevel.INFO, "BetterEloCommand: claim: player: " + player.getName() + " reward: " + item);
}
rewardsConfig.set(playerName, null); // Usuń przyznane nagrody z pliku
@@ -199,9 +198,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
} catch (IOException e) {
pluginLogger.log(PluginLogger.LogLevel.ERROR, "BetterEloCommand: claim: Error while saving rewards configuration: " + e);
}
+ sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "[BetterElo]" + ChatColor.AQUA + " Rewards claimed!");
+ }else {
+ sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "[BetterElo]" + ChatColor.DARK_RED + " No rewards assigned.");
}
- sender.sendMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "[BetterElo]" + ChatColor.DARK_RED + " No rewards assigned.");
- pluginLogger.log(PluginLogger.LogLevel.INFO, "BetterEloCommand: claim: player: " + player.getName() + " No rewards assigned.");
+
break;
case "timeleft":
handleTimeLeft(sender);
@@ -698,13 +699,14 @@ private void handleHelpCommand(CommandSender sender){
sender.sendMessage(ChatColor.AQUA + "/be holo " + ChatColor.GREEN + "- creates holo at your position.");
sender.sendMessage(ChatColor.AQUA + "/be holo delete " + ChatColor.GREEN + "- delete given holo");
sender.sendMessage(ChatColor.AQUA + "/be antyweb " + ChatColor.GREEN + "- creates antyweb effect with given radius");
- sender.sendMessage(ChatColor.AQUA + "/be addelytra " + ChatColor.GREEN + "- adds Elytra Effect to the chestplate (works only with infinite Infinite Firework)");
sender.sendMessage(ChatColor.AQUA + "/be firework " + ChatColor.GREEN + "- creates an Infinite Firework with given power");
sender.sendMessage(ChatColor.AQUA + "/be flamethrower " + ChatColor.GREEN + "- adds Flamethrower effect");
sender.sendMessage(ChatColor.AQUA + "/be zephyr " + ChatColor.GREEN + "- adds Zephyr effect");
sender.sendMessage(ChatColor.AQUA + "/be addspawner " + ChatColor.GREEN + "- creates custom mob spawner");
sender.sendMessage(ChatColor.AQUA + "/be droptable - opens a GUI to create new drop table");
sender.sendMessage(ChatColor.AQUA + "/be spawnmob - spawn given custom mob");
+ sender.sendMessage(ChatColor.AQUA + "/be enchantitem - gives you 1x Enchant Item");
+ sender.sendMessage(ChatColor.AQUA + "/be forcespawn - forces a respawn of a given spawner");
}
}
private void handleTimeLeft(CommandSender sender){
diff --git a/src/main/java/betterbox/mine/game/betterelo/CustomMobs.java b/src/main/java/betterbox/mine/game/betterelo/CustomMobs.java
index f255f1b..af0420f 100644
--- a/src/main/java/betterbox/mine/game/betterelo/CustomMobs.java
+++ b/src/main/java/betterbox/mine/game/betterelo/CustomMobs.java
@@ -60,7 +60,7 @@ static class CustomMob {
if (weapon != null) {
this.weapon = weapon;
} else {
- plugin.getLogger().warning(mobName + " does not have weapon set. Setting AIR");
+ //plugin.getLogger().warning(mobName + " does not have weapon set. Setting AIR");
this.weapon = new ItemStack(Material.AIR);
}
@@ -157,7 +157,7 @@ private void setupMob() {
if (weapon != null) {
entity.getEquipment().setItemInMainHand(weapon);
} else {
- plugin.getLogger().warning(mobName + " does not have weapon set. Setting AIR");
+ //plugin.getLogger().warning(mobName + " does not have weapon set. Setting AIR");
entity.getEquipment().setItemInMainHand(new ItemStack(Material.AIR));
}
entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(hp);
diff --git a/src/main/java/betterbox/mine/game/betterelo/CustomMobsFileManager.java b/src/main/java/betterbox/mine/game/betterelo/CustomMobsFileManager.java
index 4bfed10..0a48424 100644
--- a/src/main/java/betterbox/mine/game/betterelo/CustomMobsFileManager.java
+++ b/src/main/java/betterbox/mine/game/betterelo/CustomMobsFileManager.java
@@ -15,6 +15,9 @@
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
import java.util.*;
import org.bukkit.Location;
@@ -120,25 +123,23 @@ private void CreateCustomMobsFolder(String folderPath) {
pluginLogger.log(PluginLogger.LogLevel.ERROR, "CustomMobsFileManager.CreateCustomMobsFolder exception: " + e.getMessage());
}
}
-
+ private void CreateExampleSpawnersFile(File spawnersFile){
+ try (InputStream in = plugin.getResource("customMobs/spawners.yml")) {
+ if (in == null) {
+ plugin.getLogger().severe("Resource 'customDropTables/spawners.yml not found.");
+ return;
+ }
+ Files.copy(in, spawnersFile.toPath());
+ } catch (IOException e) {
+ plugin.getLogger().severe("Could not save spawners.yml to " + spawnersFile + ": " + e.getMessage());
+ }
+ }
private void CreateSpawnersFile(String folderPath) {
try {
String spawnersFileName = "spawners.yml";
spawnersFile = new File(folderPath + File.separator + "customMobs", spawnersFileName);
if (!spawnersFile.exists()) {
- pluginLogger.log(PluginLogger.LogLevel.SPAWNERS, "CustomMobsFileManager.CreateSpawnersFile creating new file.");
- spawnersFile.createNewFile();
-
- // Tworzymy domyślną strukturę pliku
- FileConfiguration config = YamlConfiguration.loadConfiguration(spawnersFile);
- config.createSection("spawners");
- config.set("spawners.exampleSpawner.location", "x y z");
- config.set("spawners.exampleSpawner.mobName", "exampleMobName");
- config.set("spawners.exampleSpawner.cooldown", "exampleCooldown");
- config.set("spawners.exampleSpawner.mobsPerSpawn", "mobsPerSpawn");
- config.set("spawners.exampleSpawner.mobsPerSpawn", "maxMobs");
- // Zapisujemy zmiany do pliku
- config.save(spawnersFile);
+ CreateExampleSpawnersFile(spawnersFile);
} else {
pluginLogger.log(PluginLogger.LogLevel.DEBUG, "CustomMobsFileManager.CreateSpawnersFile file already exists.");
}
diff --git a/src/main/java/betterbox/mine/game/betterelo/DataManager.java b/src/main/java/betterbox/mine/game/betterelo/DataManager.java
index 4f6bf7d..af749ab 100644
--- a/src/main/java/betterbox/mine/game/betterelo/DataManager.java
+++ b/src/main/java/betterbox/mine/game/betterelo/DataManager.java
@@ -8,6 +8,7 @@
public class DataManager {
private final JavaPlugin plugin;
private final File dataFolder;
+ private final File pluginDataFolder;
private final File databaseFile;
private final File dailyDatabaseFile;
private final File weeklyDatabaseFile;
@@ -23,7 +24,8 @@ public class DataManager {
public DataManager(JavaPlugin plugin, PluginLogger pluginLogger) {
this.plugin = plugin;
this.pluginLogger = pluginLogger; // Inicjalizujemy PluginLogger
- this.dataFolder = plugin.getDataFolder();
+ this.pluginDataFolder = plugin.getDataFolder();
+ this.dataFolder = new File(pluginDataFolder,"data");
this.databaseFile = new File(dataFolder, "database.txt");
this.dailyDatabaseFile = new File(dataFolder, "daily_database.txt");
this.weeklyDatabaseFile = new File(dataFolder, "weekly_database.txt");
diff --git a/src/main/java/betterbox/mine/game/betterelo/Event.java b/src/main/java/betterbox/mine/game/betterelo/Event.java
index 73a6654..cc9e9f7 100644
--- a/src/main/java/betterbox/mine/game/betterelo/Event.java
+++ b/src/main/java/betterbox/mine/game/betterelo/Event.java
@@ -1452,6 +1452,25 @@ public void onInventoryClick(InventoryClickEvent event) {
fileRewardManager.saveCustomDrops(fileName, itemsToSave);
}
+ }
+ if (currentItem.getType() == Material.GREEN_WOOL && event.getSlot() == 35) {
+ pluginLogger.log(PluginLogger.LogLevel.DEBUG, "Event.onInventoryClick Add Items - save called.");
+ event.setCancelled(true);
+ Inventory inventory = event.getInventory();
+ List itemsToSave = new ArrayList<>();
+ for (int i = 0; i < inventory.getSize(); i++) {
+ if (i != 35) { // Pomijamy slot przycisku "Save"
+ ItemStack item = inventory.getItem(i);
+ if (item != null && item.getType() != Material.AIR) {
+ itemsToSave.add(item);
+ }
+ }
+ }
+
+ String fileName=guiManager.periodType+"_"+guiManager.rewardType;
+ pluginLogger.log(PluginLogger.LogLevel.DEBUG, "Event.onInventoryClick calling fileRewardManager.saveRewards("+fileName+",itemsToSave)");
+ fileRewardManager.saveRewards(fileName,itemsToSave);
+
}
break;
case "AvgDmg bonus change":
diff --git a/src/main/java/betterbox/mine/game/betterelo/FileRewardManager.java b/src/main/java/betterbox/mine/game/betterelo/FileRewardManager.java
index a8c983b..8ac064b 100644
--- a/src/main/java/betterbox/mine/game/betterelo/FileRewardManager.java
+++ b/src/main/java/betterbox/mine/game/betterelo/FileRewardManager.java
@@ -28,11 +28,13 @@ public class FileRewardManager {
private final PluginLogger pluginLogger; // Dodajemy referencję do PluginLogger
private String rewardType;
+ private File dataFolder;
public FileRewardManager(JavaPlugin plugin, PluginLogger pluginLogger) {
this.plugin = plugin;
this.pluginLogger = pluginLogger; // Inicjalizujemy PluginLogger
pluginLogger.log(PluginLogger.LogLevel.DEBUG,"FileRewardManager: Inicjalizacja");
+ dataFolder = new File(plugin.getDataFolder(),"data");
}
public void setRewardType(String rewardType,String subType) {
@@ -47,7 +49,8 @@ public String getRewardType() {
}
public List loadRewards() {
- File rewardsFile = new File(plugin.getDataFolder(), rewardType + ".yml");
+
+ File rewardsFile = new File(dataFolder, rewardType + ".yml");
if (!rewardsFile.exists()) {
return new ArrayList<>(); // return empty list if the file does not exist
}
@@ -62,7 +65,7 @@ public List loadRewards() {
return rewards;
}
public List loadReRollCost() {
- File rewardsFile = new File(plugin.getDataFolder(), "reroll.yml");
+ File rewardsFile = new File(dataFolder, "reroll.yml");
if (!rewardsFile.exists()) {
return new ArrayList<>(); // return empty list if the file does not exist
}
@@ -77,7 +80,7 @@ public List loadReRollCost() {
return rewards;
}
public List loadRewards(Player player) {
- File rewardsFile = new File(plugin.getDataFolder(), rewardType + ".yml");
+ File rewardsFile = new File(dataFolder, rewardType + ".yml");
if (!rewardsFile.exists()) {
return new ArrayList<>(); // return empty list if the file does not exist
}
@@ -86,7 +89,7 @@ public List loadRewards(Player player) {
}
public List getReward(String rewardType) {
// Załaduj konfigurację z pliku dla danego typu nagrody
- File rewardFile = new File(plugin.getDataFolder(), rewardType + ".yml");
+ File rewardFile = new File(dataFolder, rewardType + ".yml");
pluginLogger.log(PluginLogger.LogLevel.DEBUG,"FileRewardManager: getReward: rewardType:" + rewardType);
FileConfiguration rewardConfig = YamlConfiguration.loadConfiguration(rewardFile);
// Pobierz dane o nagrodzie z pliku konfiguracyjnego
@@ -119,7 +122,7 @@ public List getReward(String rewardType) {
}
public void saveRewards(String fileName, List rewards) {
pluginLogger.log(PluginLogger.LogLevel.DEBUG, "FileRewardManager.saveRewards called. fileName: "+fileName);
- File rewardsFile = new File(plugin.getDataFolder(), fileName + ".yml");
+ File rewardsFile = new File(dataFolder, fileName + ".yml");
if (!rewardsFile.getParentFile().exists()) {
rewardsFile.getParentFile().mkdirs(); // Tworzy katalog, jeśli nie istnieje
}
diff --git a/src/main/java/betterbox/mine/game/betterelo/PlayerKillDatabase.java b/src/main/java/betterbox/mine/game/betterelo/PlayerKillDatabase.java
index 4ebd3ea..d6359a8 100644
--- a/src/main/java/betterbox/mine/game/betterelo/PlayerKillDatabase.java
+++ b/src/main/java/betterbox/mine/game/betterelo/PlayerKillDatabase.java
@@ -24,7 +24,7 @@ public PlayerKillDatabase(PluginLogger pluginLogger) {
private void createDatabaseIfNeeded() {
pluginLogger.log(PluginLogger.LogLevel.DEBUG,"PlayerKillDatabase: createDatabaseIfNeeded called");
- File databaseFile = new File("plugins/BetterElo/player_kill_database.db");
+ File databaseFile = new File("plugins/BetterElo/data/player_kill_database.db");
if (!databaseFile.exists()) {
createNewDatabase();
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..dd66947
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,44 @@
+# DO NOT CHANGE THIS PART!!!
+# #########################################
+dailyLastScheduledTime: 1720757055869
+weeklyLastScheduledTime: 1720745355824
+monthlyLastScheduledTime: 1718815517777
+# #########################################
+log_level:
+- INFO
+- WARNING
+- ERROR
+# - SPAWNERS
+# - KILL_EVENT
+# - CUSTOM_MOBS
+# - DEBUG
+# - RANKING_REWARDS
+
+blocks_rewards:
+ DIAMOND_ORE: 1.3
+ DIAMOND_BLOCK: 1.3
+ EMERALD_ORE: 1.2
+ EMERALD_BLOCK: 1.2
+ GOLD_ORE: 1.1
+ GOLD_BLOCK: 1.1
+ IRON_ORE: 1
+ IRON_BLOCK: 1
+ BEACON: 100
+ YELLOW_GLAZED_TERRACOTTA: 10
+ NETHERITE_BLOCK: 1.6
+ CRYING_OBSIDIAN: 1.5
+ OBSIDIAN: 1.4
+ YELLOW_WOOL: 20
+ COBBLESTONE: 0.1
+ PURPLE_WOOL: 0.5
+block_base: 0.1
+antyweb_elo_cost: 0.1
+Infinite_firework_cooldown: 450
+Flamethrower_cooldown: 1500
+Zephyr_cooldown: 1500
+event_items_with_username:
+- DIAMOND_PICKAXE
+- DIAMOND_AXE
+- GOLDEN_AXE
+- IRON_AXE
+- STONE_AXE
diff --git a/src/main/resources/customDropTables/ExampleDropTable.yml b/src/main/resources/customDropTables/ExampleDropTable.yml
new file mode 100644
index 0000000..e6989cc
--- /dev/null
+++ b/src/main/resources/customDropTables/ExampleDropTable.yml
@@ -0,0 +1,130 @@
+Item0:
+ itemPath: customDrops/ExampleDropTable_item0.yml
+ dropChance: 50.0
+ # itemName and description is purely for user information, not needed for the plugin itself
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=true, color=null, clickEvent=null, hoverEvent=null, insertion=null, font=null},
+ children=[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set, bold=not_set,
+ strikethrough=not_set, underlined=not_set, italic=not_set, color=null, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="BetterCoin",
+ style=StyleImpl{obfuscated=false, bold=false, strikethrough=false, underlined=false,
+ italic=false, color=NamedTextColor{name="gold", value="#ffaa00"}, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[]}]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="white",
+ value="#ffffff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="honeycomb"}, count=1, nbt={display:{Lore:['{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"Valuable
+ currency you can use to buy items."}],"text":""}'],Name:'{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"BetterCoin"}],"text":""}'}}}},
+ insertion=null, font=null}, children=[]}
+ avgDmgBonus: false
+ description: '[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=null,
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Valuable
+ currency you can use to buy items.", style=StyleImpl{obfuscated=false, bold=false,
+ strikethrough=false, underlined=false, italic=false, color=NamedTextColor{name="yellow",
+ value="#ffff55"}, clickEvent=null, hoverEvent=null, insertion=null, font=null},
+ children=[]}]}]'
+Item1:
+ itemPath: customDrops/ExampleDropTable_item1.yml
+ dropChance: 100.0
+ # itemName and description is purely for user information, not needed for the plugin itself
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=true, color=null, clickEvent=null, hoverEvent=null, insertion=null, font=null},
+ children=[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set, bold=not_set,
+ strikethrough=not_set, underlined=not_set, italic=not_set, color=null, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Coin",
+ style=StyleImpl{obfuscated=false, bold=false, strikethrough=false, underlined=false,
+ italic=false, color=NamedTextColor{name="gold", value="#ffaa00"}, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[]}]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="white",
+ value="#ffffff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="sunflower"}, count=1, nbt={display:{Lore:['{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"Currency
+ you can use to buy items."}],"text":""}'],Name:'{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Coin"}],"text":""}'}}}},
+ insertion=null, font=null}, children=[]}
+ avgDmgBonus: false
+ description: '[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=null,
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Currency
+ you can use to buy items.", style=StyleImpl{obfuscated=false, bold=false, strikethrough=false,
+ underlined=false, italic=false, color=NamedTextColor{name="yellow", value="#ffff55"},
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[]}]}]'
+Item2:
+ itemPath: customDrops/ExampleDropTable_item2.yml
+ dropChance: 100.0
+ # itemName and description is purely for user information, not needed for the plugin itself
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=true, color=null, clickEvent=null, hoverEvent=null, insertion=null, font=null},
+ children=[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set, bold=not_set,
+ strikethrough=not_set, underlined=not_set, italic=not_set, color=null, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Shears
+ LvL12", style=StyleImpl{obfuscated=false, bold=true, strikethrough=false, underlined=false,
+ italic=false, color=NamedTextColor{name="gold", value="#ffaa00"}, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[]}]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="aqua",
+ value="#55ffff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="shears"}, count=1, nbt={Damage:0,Enchantments:[{id:"minecraft:efficiency",lvl:11s}],HideFlags:1,Unbreakable:1b,display:{Lore:['{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Antyweb
+ 2"}],"text":""}'],Name:'{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Shears
+ LvL12"}],"text":""}'}}}}, insertion=null, font=null}, children=[]}
+ avgDmgBonus: false
+ description: '[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=null,
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Antyweb
+ 2", style=StyleImpl{obfuscated=false, bold=true, strikethrough=false, underlined=false,
+ italic=false, color=NamedTextColor{name="gold", value="#ffaa00"}, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[]}]}]'
+Item3:
+ itemPath: customDrops/ExampleDropTable_item3.yml
+ avgDmgBonus: true
+ dropChance: 100.0
+ # itemName and description is purely for user information, not needed for the plugin itself
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=true, color=null, clickEvent=null, hoverEvent=null, insertion=null, font=null},
+ children=[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set, bold=not_set,
+ strikethrough=not_set, underlined=not_set, italic=not_set, color=null, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Example
+ Item", style=StyleImpl{obfuscated=false, bold=true, strikethrough=false, underlined=false,
+ italic=false, color=NamedTextColor{name="dark_purple", value="#aa00aa"}, clickEvent=null,
+ hoverEvent=null, insertion=null, font=null}, children=[]}]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="white",
+ value="#ffffff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="netherite_sword"}, count=1, nbt={Damage:0,display:{Lore:['{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Mob
+ Damage 20-100"}],"text":""}'],Name:'{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"dark_purple","text":"Example
+ Item"}],"text":""}'}}}}, insertion=null, font=null}, children=[]}
+ description: '[TextComponentImpl{content="", style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=null,
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[TextComponentImpl{content="Mob
+ Damage 20-100", style=StyleImpl{obfuscated=false, bold=true, strikethrough=false,
+ underlined=false, italic=false, color=NamedTextColor{name="gold", value="#ffaa00"},
+ clickEvent=null, hoverEvent=null, insertion=null, font=null}, children=[]}]}]'
+Item4:
+ itemPath: customDrops/ExampleDropTable_item4.yml
+ dropChance: 100.0
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=not_set, color=null, clickEvent=null, hoverEvent=null, insertion=null,
+ font=null}, children=[TranslatableComponentImpl{key="block.minecraft.beacon",
+ args=[], style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set,
+ underlined=not_set, italic=not_set, color=null, clickEvent=null, hoverEvent=null,
+ insertion=null, font=null}, children=[]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="aqua",
+ value="#55ffff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="beacon"}, count=6, nbt=null}}, insertion=null, font=null}, children=[]}
+ avgDmgBonus: false
+Item5:
+ itemPath: customDrops/ExampleDropTable_item5.yml
+ dropChance: 100.0
+ itemName: TranslatableComponentImpl{key="chat.square_brackets", args=[TextComponentImpl{content="",
+ style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set, underlined=not_set,
+ italic=not_set, color=null, clickEvent=null, hoverEvent=null, insertion=null,
+ font=null}, children=[TranslatableComponentImpl{key="item.minecraft.enchanted_golden_apple",
+ args=[], style=StyleImpl{obfuscated=not_set, bold=not_set, strikethrough=not_set,
+ underlined=not_set, italic=not_set, color=null, clickEvent=null, hoverEvent=null,
+ insertion=null, font=null}, children=[]}]}], style=StyleImpl{obfuscated=not_set,
+ bold=not_set, strikethrough=not_set, underlined=not_set, italic=not_set, color=NamedTextColor{name="light_purple",
+ value="#ff55ff"}, clickEvent=null, hoverEvent=HoverEvent{action=show_item, value=ShowItem{item=KeyImpl{namespace="minecraft",
+ value="enchanted_golden_apple"}, count=11, nbt=null}}, insertion=null, font=null},
+ children=[]}
+ avgDmgBonus: false
diff --git a/src/main/resources/customDrops/ExampleDropTable_item0.yml b/src/main/resources/customDrops/ExampleDropTable_item0.yml
new file mode 100644
index 0000000..b95779c
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item0.yml
@@ -0,0 +1,11 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: HONEYCOMB
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"BetterCoin"}],"text":""}'
+ lore:
+ - '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"Valuable
+ currency you can use to buy items."}],"text":""}'
diff --git a/src/main/resources/customDrops/ExampleDropTable_item1.yml b/src/main/resources/customDrops/ExampleDropTable_item1.yml
new file mode 100644
index 0000000..4328d92
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item1.yml
@@ -0,0 +1,11 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: SUNFLOWER
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Coin"}],"text":""}'
+ lore:
+ - '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"Currency
+ you can use to buy items."}],"text":""}'
diff --git a/src/main/resources/customDrops/ExampleDropTable_item2.yml b/src/main/resources/customDrops/ExampleDropTable_item2.yml
new file mode 100644
index 0000000..fbda68f
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item2.yml
@@ -0,0 +1,17 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: SHEARS
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: '{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Shears
+ LvL12"}],"text":""}'
+ lore:
+ - '{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Antyweb
+ 2"}],"text":""}'
+ enchants:
+ DIG_SPEED: 11
+ ItemFlags:
+ - HIDE_ENCHANTS
+ Unbreakable: true
diff --git a/src/main/resources/customDrops/ExampleDropTable_item3.yml b/src/main/resources/customDrops/ExampleDropTable_item3.yml
new file mode 100644
index 0000000..155cfe7
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item3.yml
@@ -0,0 +1,12 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: NETHERITE_SWORD
+ meta:
+ ==: ItemMeta
+ meta-type: UNSPECIFIC
+ display-name: '{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"dark_purple","text":"Example
+ Item"}],"text":""}'
+ lore:
+ - '{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"Mob
+ Damage 20-100"}],"text":""}'
diff --git a/src/main/resources/customDrops/ExampleDropTable_item4.yml b/src/main/resources/customDrops/ExampleDropTable_item4.yml
new file mode 100644
index 0000000..0010bfb
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item4.yml
@@ -0,0 +1,5 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: BEACON
+ amount: 6
diff --git a/src/main/resources/customDrops/ExampleDropTable_item5.yml b/src/main/resources/customDrops/ExampleDropTable_item5.yml
new file mode 100644
index 0000000..87eac1d
--- /dev/null
+++ b/src/main/resources/customDrops/ExampleDropTable_item5.yml
@@ -0,0 +1,5 @@
+item:
+ ==: org.bukkit.inventory.ItemStack
+ v: 2975
+ type: ENCHANTED_GOLDEN_APPLE
+ amount: 11
diff --git a/src/main/resources/customMobs/Marksman.yml b/src/main/resources/customMobs/Marksman.yml
new file mode 100644
index 0000000..cc44c75
--- /dev/null
+++ b/src/main/resources/customMobs/Marksman.yml
@@ -0,0 +1,39 @@
+type: SKELETON # ENTITY TYPE
+mobName: Marksman # Mob Name used in the plugin
+armor: 5.0 # x points of dmg reduction
+hp: 300
+speed: 0.4 # movement speed
+attackDamage: 10
+dropTable: ExampleDropTable # tbh I don't remember which one is used in the plugin - unnecessary fields will be removed in the future releases
+defense: 30 # x% damage reduction
+customMetadata:
+ CustomMob: true # leave this always as true!!
+ MobName: EXAMPLE BOSS - Panda # displayname COLORS/FORMATTING NOT SUPPORTED YET
+ DropTable: ExampleDropTable # tbh I don't remember which one is used in the plugin - unnecessary fields will be removed in the future releases
+equipment:
+ helmet:
+ type: LEATHER_HELMET
+ unbreakable: true
+ attributes:
+ armor: 0
+ chestplate:
+ type: LEATHER_CHESTPLATE
+ unbreakable: true
+ attributes:
+ armor: 0
+ leggings:
+ type: LEATHER_LEGGINGS
+ unbreakable: true
+ attributes:
+ armor: 0
+ boots:
+ type: LEATHER_BOOTS
+ unbreakable: true
+ attributes:
+ armor: 0
+ weapon:
+ type: BOW
+ enchants:
+ power: 5
+ attributes:
+ damage: 10
\ No newline at end of file
diff --git a/src/main/resources/customMobs/Panda.yml b/src/main/resources/customMobs/Panda.yml
new file mode 100644
index 0000000..e3c4b1e
--- /dev/null
+++ b/src/main/resources/customMobs/Panda.yml
@@ -0,0 +1,12 @@
+type: PANDA # ENTITY TYPE
+mobName: Panda # Mob Name used in the plugin
+armor: 0.0 # x points of dmg reduction
+hp: 500
+speed: 0.4 # movement speed
+attackDamage: 10
+dropTable: ExampleDropTable # tbh I don't remember which one is used in the plugin - unnecessary fields will be removed in the future releases
+defense: 95 # x% damage reduction
+customMetadata:
+ CustomMob: true # leave this always as true!!
+ MobName: EXAMPLE BOSS - Panda # displayname COLORS/FORMATTING NOT SUPPORTED YET
+ DropTable: ExampleDropTable # tbh I don't remember which one is used in the plugin - unnecessary fields will be removed in the future releases
diff --git a/src/main/resources/spawners.yml b/src/main/resources/spawners.yml
new file mode 100644
index 0000000..e511969
--- /dev/null
+++ b/src/main/resources/spawners.yml
@@ -0,0 +1,8 @@
+spawners:
+ # t1_1:
+ # location: world,x,y,z
+ # mobName: NameOfTheMob
+ # cooldown: 60
+ # mobsPerSpawn: 1
+ # maxMobs: 3
+ # maxDistance: 20