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