From a3cc5200056ce23d2b4c0c542f44b447231e2917 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 14:59:29 -0700 Subject: [PATCH 01/30] Correct key for drop level in default file --- pom.xml | 2 +- .../config/treasure/TreasureConfig.java | 1 - src/main/resources/treasures.yml | 60 +++++++++---------- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index 488916a86..b7a395d84 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.183 + 2.1.184-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java index 6e02731c9..a4f13e402 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -141,7 +141,6 @@ public class TreasureConfig extends ConfigLoader { reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance); } - /* * Itemstack */ diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index f791b7416..22203b508 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -7,7 +7,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 75 + Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] GUNPOWDER: @@ -15,7 +15,7 @@ Excavation: XP: 30 Drop_Chance: 10.0 Drop_Level: - Standard: 10 + Standard_Mode: 10 Retro_Mode: 1000 Drops_From: [Gravel] BONE: @@ -23,7 +23,7 @@ Excavation: XP: 30 Drop_Chance: 10.0 Drop_Level: - Standard: 20 + Standard_Mode: 20 Retro_Mode: 200 Drops_From: [Gravel] APPLE: @@ -31,7 +31,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] SLIME_BALL: @@ -39,7 +39,7 @@ Excavation: XP: 100 Drop_Chance: 5.0 Drop_Level: - Standard: 15 + Standard_Mode: 15 Retro_Mode: 150 Drops_From: [Clay] BUCKET: @@ -47,7 +47,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] NETHERRACK: @@ -55,7 +55,7 @@ Excavation: XP: 30 Drop_Chance: 0.5 Drop_Level: - Standard: 85 + Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Gravel] RED_MUSHROOM: @@ -63,7 +63,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] BROWN_MUSHROOM: @@ -71,7 +71,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] EGG: @@ -79,7 +79,7 @@ Excavation: XP: 100 Drop_Chance: 1.0 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block] SOUL_SAND: @@ -87,7 +87,7 @@ Excavation: XP: 80 Drop_Chance: 0.5 Drop_Level: - Standard: 65 + Standard_Mode: 65 Retro_Mode: 650 Drops_From: [Sand, Red_Sand] CLOCK: @@ -95,7 +95,7 @@ Excavation: XP: 100 Drop_Chance: 0.1 Drop_Level: - Standard: 50 + Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] COBWEB: @@ -103,7 +103,7 @@ Excavation: XP: 150 Drop_Chance: 5.0 Drop_Level: - Standard: 75 + Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Clay] STRING: @@ -111,7 +111,7 @@ Excavation: XP: 200 Drop_Chance: 5.0 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Clay] GLOWSTONE_DUST: @@ -119,7 +119,7 @@ Excavation: XP: 80 Drop_Chance: 5.0 Drop_Level: - Standard: 5 + Standard_Mode: 5 Retro_Mode: 50 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Mycelium] MUSIC_DISC_13: @@ -127,7 +127,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] MUSIC_DISC_CAT: @@ -135,7 +135,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] DIAMOND: @@ -143,7 +143,7 @@ Excavation: XP: 1000 Drop_Chance: 0.13 Drop_Level: - Standard: 35 + Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] COCOA_BEANS: @@ -151,7 +151,7 @@ Excavation: XP: 100 Drop_Chance: 1.33 Drop_Level: - Standard: 35 + Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] QUARTZ: @@ -159,7 +159,7 @@ Excavation: XP: 100 Drop_Chance: 0.5 Drop_Level: - Standard: 85 + Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Mycelium, Soul_Sand, Soul_Soil] NAME_TAG: @@ -167,7 +167,7 @@ Excavation: XP: 3000 Drop_Chance: 0.05 Drop_Level: - Standard: 25 + Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] # @@ -180,7 +180,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] PUMPKIN_SEEDS: @@ -188,7 +188,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] COCOA_BEANS: @@ -196,7 +196,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] CARROT: @@ -204,7 +204,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] POTATO: @@ -212,7 +212,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] APPLE: @@ -220,7 +220,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] EMERALD: @@ -228,7 +228,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] DIAMOND: @@ -236,7 +236,7 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] GOLD_NUGGET: @@ -244,6 +244,6 @@ Hylian_Luck: XP: 0 Drop_Chance: 100.0 Drop_Level: - Standard: 0 + Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] \ No newline at end of file From f01efd92f50648fc472c8ceabe4f61c18c2b0b4e Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:06:59 -0700 Subject: [PATCH 02/30] Correct bad default config files --- Changelog.txt | 6 ++++++ .../gmail/nossr50/config/treasure/TreasureConfig.java | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/Changelog.txt b/Changelog.txt index 4e2babd43..d6d819885 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.184 + Fixed a bug where the default treasures.yml file had incorrect keys (see notes) + + NOTES: + mcMMO will fix bad config files automatically, you don't need to do anything + Version 2.1.183 Players now gain Acrobatics XP from falling even if they don't have the Roll permission node (checks for Acrobatics skill permission) treasures.yml now has separate settings for Drop_Level for Standard/Retro mode (see notes / this change is automatic) diff --git a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java index a4f13e402..1dd4a7217 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -25,6 +25,7 @@ public class TreasureConfig extends ConfigLoader { public static final String FILENAME = "treasures.yml"; public static final String LEVEL_REQUIREMENT_RETRO_MODE = ".Level_Requirement.Retro_Mode"; public static final String LEVEL_REQUIREMENT_STANDARD_MODE = ".Level_Requirement.Standard_Mode"; + public static final String LEVEL_REQUIREMENT_INVALID = ".Level_Requirement.Standard"; public static final String LEGACY_DROP_LEVEL = ".Drop_Level"; private static TreasureConfig instance; @@ -112,6 +113,16 @@ public class TreasureConfig extends ConfigLoader { int legacyDropLevel = config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); int dropLevel = -1; + int badDefaults = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, -1); + + //Hacky fix for bad keys in treasures.yml defaults + if(badDefaults != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, null); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, badDefaults); + updatedFile = true; + } + + if(legacyDropLevel >= 0) { //Config needs to be updated to be more specific mcMMO.p.getLogger().info("(" + treasureName + ") Updating Drop_Level in treasures.yml for treasure to match new expected format"); From a2ba406fe5f6d217ec7b87fc155de14506397e14 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:14:00 -0700 Subject: [PATCH 03/30] Removed April Fools event --- Changelog.txt | 1 + .../gmail/nossr50/commands/McmmoCommand.java | 2 +- .../nossr50/commands/skills/AprilCommand.java | 398 ++++----- .../java/com/gmail/nossr50/config/Config.java | 2 - .../nossr50/listeners/PlayerListener.java | 26 +- src/main/java/com/gmail/nossr50/mcMMO.java | 12 - .../nossr50/runnables/CheckDateTask.java | 46 +- .../nossr50/runnables/skills/AprilTask.java | 112 +-- .../gmail/nossr50/util/HolidayManager.java | 772 +++++++++--------- src/main/resources/config.yml | 1 - 10 files changed, 679 insertions(+), 693 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d6d819885..269b0af14 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.184 + Removed April Fools event Fixed a bug where the default treasures.yml file had incorrect keys (see notes) NOTES: diff --git a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java index 23b4c8658..9c09763ca 100644 --- a/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/McmmoCommand.java @@ -35,7 +35,7 @@ public class McmmoCommand implements CommandExecutor { sender.sendMessage(LocaleLoader.getString("MOTD.Version", mcMMO.p.getDescription().getVersion())); } - mcMMO.getHolidayManager().anniversaryCheck(sender); +// mcMMO.getHolidayManager().anniversaryCheck(sender); return true; case 1: diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java index 819205ca1..5364918ff 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java @@ -1,199 +1,199 @@ -package com.gmail.nossr50.commands.skills; - -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.util.HolidayManager.FakeSkillType; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.commands.CommandUtils; -import com.gmail.nossr50.util.text.StringUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -public class AprilCommand implements TabExecutor { - private String skillName; - - protected DecimalFormat percent = new DecimalFormat("##0.00%"); - protected DecimalFormat decimal = new DecimalFormat("##0.00"); - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - if (CommandUtils.noConsoleUsage(sender)) { - return true; - } - - skillName = StringUtils.getCapitalized(label); - - if (args.length == 0) { - Player player = (Player) sender; - FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); - - float skillValue = Misc.getRandom().nextInt(99); - - player.sendMessage(LocaleLoader.getString("Skills.Header", skillName)); - player.sendMessage(LocaleLoader.getString("Commands.XPGain", getXPGainString(fakeSkillType))); - player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, Misc.getRandom().nextInt(1000), 1000 + Misc.getRandom().nextInt(1000))); - - - List effectMessages = effectsDisplay(fakeSkillType); - - if (!effectMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); - - for (String message : effectMessages) { - player.sendMessage(message); - } - } - - List statsMessages = statsDisplay(fakeSkillType); - - if (!statsMessages.isEmpty()) { - player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); - - for (String message : statsMessages) { - player.sendMessage(message); - } - } - - player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName)); - return true; - } - return true; - } - - private String getXPGainString(FakeSkillType fakeSkillType) { - switch (fakeSkillType) { - case MACHO: - return "Get beaten up"; - case JUMPING: - return "Kris Kross will make ya Jump Jump"; - case THROWING: - return "Chuck your items on the floor"; - case WRECKING: - return "I'M GONNA WRECK IT!"; - case CRAFTING: - return "Craft apple pies"; - case WALKING: - return "Walk around the park"; - case SWIMMING: - return "Like a fish on a bicycle"; - case FALLING: - return "Faceplant the floor, headbutt the ground"; - case CLIMBING: - return "Climb the highest mountain"; - case FLYING: - return "I believe I can fly"; - case DIVING: - return "Scuba club 4000"; - case PIGGY: - return "OINK! OINK!"; - default: - return "Sit and wait?"; - } - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - if (args.length == 1) { - return ImmutableList.of("?"); - } - return ImmutableList.of(); - } - - private List effectsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList<>(); - - switch (fakeSkillType) { - case MACHO: - messages.add(LocaleLoader.getString("Effects.Template", "Punching bag", "Absorb damage, like a bag of sand")); - break; - case JUMPING: - messages.add(LocaleLoader.getString("Effects.Template", "Jump", "PRESS SPACE TO JUMP")); - messages.add(LocaleLoader.getString("Effects.Template", "Jump Twice", "PRESS SPACE TWICE TO JUMP TWICE")); - break; - case THROWING: - messages.add(LocaleLoader.getString("Effects.Template", "Drop Item", "Randomly drop items, at random")); - break; - case WRECKING: - messages.add(LocaleLoader.getString("Effects.Template", "Ralphinator", "Smash windows with your fists")); - break; - case CRAFTING: - messages.add(LocaleLoader.getString("Effects.Template", "Crafting", "Chance of successful craft")); - break; - case WALKING: - messages.add(LocaleLoader.getString("Effects.Template", "Walk", "Traveling gracefully by foot")); - break; - case SWIMMING: - messages.add(LocaleLoader.getString("Effects.Template", "Swim", "Just keep swimming, swimming, swimming")); - break; - case FALLING: - messages.add(LocaleLoader.getString("Effects.Template", "Skydiving", "Go jump of a cliff. No, seriously.")); - break; - case CLIMBING: - messages.add(LocaleLoader.getString("Effects.Template", "Rock Climber", "Use string to climb mountains faster")); - break; - case FLYING: - messages.add(LocaleLoader.getString("Effects.Template", "Fly", "Throw yourself at the ground and miss")); - break; - case DIVING: - messages.add(LocaleLoader.getString("Effects.Template", "Hold Breath", "Press shift to hold your breath longer")); - break; - case PIGGY: - messages.add(LocaleLoader.getString("Effects.Template", "Carrot Turbo", "Supercharge your pigs with carrots")); - break; - } - - return messages; - } - - private List statsDisplay(FakeSkillType fakeSkillType) { - List messages = new ArrayList<>(); - - switch (fakeSkillType) { - case MACHO: - messages.add(LocaleLoader.formatString("&cDamage Taken: &e{0}%", decimal.format(Misc.getRandom().nextInt(77)))); - break; - case JUMPING: - messages.add(LocaleLoader.formatString("&cDouble Jump Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case THROWING: - messages.add(LocaleLoader.formatString("&cDrop Item Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(87)))); - break; - case WRECKING: - messages.add(LocaleLoader.formatString("&cWrecking Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(14)))); - break; - case CRAFTING: - messages.add(LocaleLoader.formatString("&cCrafting Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case WALKING: - messages.add(LocaleLoader.formatString("&cWalk Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case SWIMMING: - messages.add(LocaleLoader.formatString("&cSwim Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case FALLING: - messages.add(LocaleLoader.formatString("&cSkydiving Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(37)))); - break; - case CLIMBING: - messages.add(LocaleLoader.formatString("&cRock Climber Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case FLYING: - messages.add(LocaleLoader.formatString("&cFly Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case DIVING: - messages.add(LocaleLoader.formatString("&cHold Breath Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); - break; - case PIGGY: - messages.add(LocaleLoader.formatString("&cCarrot Turbo Boost: &e{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10)); - break; - } - - return messages; - } -} +//package com.gmail.nossr50.commands.skills; +// +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.util.HolidayManager.FakeSkillType; +//import com.gmail.nossr50.util.Misc; +//import com.gmail.nossr50.util.commands.CommandUtils; +//import com.gmail.nossr50.util.text.StringUtils; +//import com.google.common.collect.ImmutableList; +//import org.bukkit.command.Command; +//import org.bukkit.command.CommandSender; +//import org.bukkit.command.TabExecutor; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +// +//import java.text.DecimalFormat; +//import java.util.ArrayList; +//import java.util.List; +// +//public class AprilCommand implements TabExecutor { +// private String skillName; +// +// protected DecimalFormat percent = new DecimalFormat("##0.00%"); +// protected DecimalFormat decimal = new DecimalFormat("##0.00"); +// +// @Override +// public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { +// if (CommandUtils.noConsoleUsage(sender)) { +// return true; +// } +// +// skillName = StringUtils.getCapitalized(label); +// +// if (args.length == 0) { +// Player player = (Player) sender; +// FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName); +// +// float skillValue = Misc.getRandom().nextInt(99); +// +// player.sendMessage(LocaleLoader.getString("Skills.Header", skillName)); +// player.sendMessage(LocaleLoader.getString("Commands.XPGain", getXPGainString(fakeSkillType))); +// player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, Misc.getRandom().nextInt(1000), 1000 + Misc.getRandom().nextInt(1000))); +// +// +// List effectMessages = effectsDisplay(fakeSkillType); +// +// if (!effectMessages.isEmpty()) { +// player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects"))); +// +// for (String message : effectMessages) { +// player.sendMessage(message); +// } +// } +// +// List statsMessages = statsDisplay(fakeSkillType); +// +// if (!statsMessages.isEmpty()) { +// player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self"))); +// +// for (String message : statsMessages) { +// player.sendMessage(message); +// } +// } +// +// player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName)); +// return true; +// } +// return true; +// } +// +// private String getXPGainString(FakeSkillType fakeSkillType) { +// switch (fakeSkillType) { +// case MACHO: +// return "Get beaten up"; +// case JUMPING: +// return "Kris Kross will make ya Jump Jump"; +// case THROWING: +// return "Chuck your items on the floor"; +// case WRECKING: +// return "I'M GONNA WRECK IT!"; +// case CRAFTING: +// return "Craft apple pies"; +// case WALKING: +// return "Walk around the park"; +// case SWIMMING: +// return "Like a fish on a bicycle"; +// case FALLING: +// return "Faceplant the floor, headbutt the ground"; +// case CLIMBING: +// return "Climb the highest mountain"; +// case FLYING: +// return "I believe I can fly"; +// case DIVING: +// return "Scuba club 4000"; +// case PIGGY: +// return "OINK! OINK!"; +// default: +// return "Sit and wait?"; +// } +// } +// +// @Override +// public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { +// if (args.length == 1) { +// return ImmutableList.of("?"); +// } +// return ImmutableList.of(); +// } +// +// private List effectsDisplay(FakeSkillType fakeSkillType) { +// List messages = new ArrayList<>(); +// +// switch (fakeSkillType) { +// case MACHO: +// messages.add(LocaleLoader.getString("Effects.Template", "Punching bag", "Absorb damage, like a bag of sand")); +// break; +// case JUMPING: +// messages.add(LocaleLoader.getString("Effects.Template", "Jump", "PRESS SPACE TO JUMP")); +// messages.add(LocaleLoader.getString("Effects.Template", "Jump Twice", "PRESS SPACE TWICE TO JUMP TWICE")); +// break; +// case THROWING: +// messages.add(LocaleLoader.getString("Effects.Template", "Drop Item", "Randomly drop items, at random")); +// break; +// case WRECKING: +// messages.add(LocaleLoader.getString("Effects.Template", "Ralphinator", "Smash windows with your fists")); +// break; +// case CRAFTING: +// messages.add(LocaleLoader.getString("Effects.Template", "Crafting", "Chance of successful craft")); +// break; +// case WALKING: +// messages.add(LocaleLoader.getString("Effects.Template", "Walk", "Traveling gracefully by foot")); +// break; +// case SWIMMING: +// messages.add(LocaleLoader.getString("Effects.Template", "Swim", "Just keep swimming, swimming, swimming")); +// break; +// case FALLING: +// messages.add(LocaleLoader.getString("Effects.Template", "Skydiving", "Go jump of a cliff. No, seriously.")); +// break; +// case CLIMBING: +// messages.add(LocaleLoader.getString("Effects.Template", "Rock Climber", "Use string to climb mountains faster")); +// break; +// case FLYING: +// messages.add(LocaleLoader.getString("Effects.Template", "Fly", "Throw yourself at the ground and miss")); +// break; +// case DIVING: +// messages.add(LocaleLoader.getString("Effects.Template", "Hold Breath", "Press shift to hold your breath longer")); +// break; +// case PIGGY: +// messages.add(LocaleLoader.getString("Effects.Template", "Carrot Turbo", "Supercharge your pigs with carrots")); +// break; +// } +// +// return messages; +// } +// +// private List statsDisplay(FakeSkillType fakeSkillType) { +// List messages = new ArrayList<>(); +// +// switch (fakeSkillType) { +// case MACHO: +// messages.add(LocaleLoader.formatString("&cDamage Taken: &e{0}%", decimal.format(Misc.getRandom().nextInt(77)))); +// break; +// case JUMPING: +// messages.add(LocaleLoader.formatString("&cDouble Jump Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case THROWING: +// messages.add(LocaleLoader.formatString("&cDrop Item Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(87)))); +// break; +// case WRECKING: +// messages.add(LocaleLoader.formatString("&cWrecking Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(14)))); +// break; +// case CRAFTING: +// messages.add(LocaleLoader.formatString("&cCrafting Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case WALKING: +// messages.add(LocaleLoader.formatString("&cWalk Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case SWIMMING: +// messages.add(LocaleLoader.formatString("&cSwim Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case FALLING: +// messages.add(LocaleLoader.formatString("&cSkydiving Success: &e{0}%", decimal.format(Misc.getRandom().nextInt(37)))); +// break; +// case CLIMBING: +// messages.add(LocaleLoader.formatString("&cRock Climber Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case FLYING: +// messages.add(LocaleLoader.formatString("&cFly Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case DIVING: +// messages.add(LocaleLoader.formatString("&cHold Breath Chance: &e{0}%", decimal.format(Misc.getRandom().nextInt(27)))); +// break; +// case PIGGY: +// messages.add(LocaleLoader.formatString("&cCarrot Turbo Boost: &e{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10)); +// break; +// } +// +// return messages; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 81d727339..18c87f528 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -243,8 +243,6 @@ public class Config extends AutoUpdateConfigLoader { * GENERAL SETTINGS */ - public boolean isAprilFoolsAllowed() { return config.getBoolean("General.AprilFoolsEvent", true); } - /* General Settings */ public boolean getIsMetricsEnabled() { return config.getBoolean("Metrics.bstats", true); } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f4938c319..ab1c46c93 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -971,17 +971,17 @@ public class PlayerListener implements Listener { } } } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { - /* WORLD BLACKLIST CHECK */ - if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) - return; - - if (!mcMMO.getHolidayManager().isAprilFirst()) { - return; - } - - mcMMO.getHolidayManager().handleStatisticEvent(event); - } +// +// @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) +// public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { +// /* WORLD BLACKLIST CHECK */ +// if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) +// return; +// +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// return; +// } +// +// mcMMO.getHolidayManager().handleStatisticEvent(event); +// } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 66d698d1c..f24170690 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -19,7 +19,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll; import com.gmail.nossr50.listeners.*; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.runnables.CheckDateTask; import com.gmail.nossr50.runnables.SaveTimerTask; import com.gmail.nossr50.runnables.backups.CleanBackupsTask; import com.gmail.nossr50.runnables.commands.NotifySquelchReminderTask; @@ -82,7 +81,6 @@ public class mcMMO extends JavaPlugin { private static ModManager modManager; private static DatabaseManager databaseManager; private static FormulaManager formulaManager; - private static HolidayManager holidayManager; private static UpgradeManager upgradeManager; private static MaterialMapStore materialMapStore; private static PlayerLevelUtils playerLevelUtils; @@ -238,7 +236,6 @@ public class mcMMO extends JavaPlugin { PartyManager.loadParties(); formulaManager = new FormulaManager(); - holidayManager = new HolidayManager(); for (Player player : getServer().getOnlinePlayers()) { new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading @@ -371,7 +368,6 @@ public class mcMMO extends JavaPlugin { ScoreboardManager.teardownAll(); formulaManager.saveFormula(); - holidayManager.saveAnniversaryFiles(); placeStore.closeAll(); } catch (Exception e) { @@ -444,10 +440,6 @@ public class mcMMO extends JavaPlugin { return formulaManager; } - public static HolidayManager getHolidayManager() { - return holidayManager; - } - public static ChunkManager getPlaceStore() { return placeStore; } @@ -675,10 +667,6 @@ public class mcMMO extends JavaPlugin { // Update power level tag scoreboards new PowerLevelUpdatingTask().runTaskTimer(this, 2 * Misc.TICK_CONVERSION_FACTOR, 2 * Misc.TICK_CONVERSION_FACTOR); - if (getHolidayManager().nearingAprilFirst()) { - new CheckDateTask().runTaskTimer(this, 10L * Misc.TICK_CONVERSION_FACTOR, 60L * 60L * Misc.TICK_CONVERSION_FACTOR); - } - // Clear the registered XP data so players can earn XP again if (ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) { new ClearRegisteredXPGainTask().runTaskTimer(this, 60, 60); diff --git a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java index b11b73d45..9f52ed5bf 100644 --- a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java @@ -1,23 +1,23 @@ -package com.gmail.nossr50.runnables; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.skills.AprilTask; -import com.gmail.nossr50.util.Misc; -import org.bukkit.scheduler.BukkitRunnable; - -public class CheckDateTask extends BukkitRunnable { - - @Override - public void run() { - if (!mcMMO.getHolidayManager().isAprilFirst()) { - return; - } - - // Set up jokes - new AprilTask().runTaskTimer(mcMMO.p, 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); - mcMMO.getHolidayManager().registerAprilCommand(); - - // Jokes deployed. - this.cancel(); - } -} +//package com.gmail.nossr50.runnables; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.runnables.skills.AprilTask; +//import com.gmail.nossr50.util.Misc; +//import org.bukkit.scheduler.BukkitRunnable; +// +//public class CheckDateTask extends BukkitRunnable { +// +// @Override +// public void run() { +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// return; +// } +// +// // Set up jokes +// new AprilTask().runTaskTimer(mcMMO.p, 60L * Misc.TICK_CONVERSION_FACTOR, 10L * 60L * Misc.TICK_CONVERSION_FACTOR); +// mcMMO.getHolidayManager().registerAprilCommand(); +// +// // Jokes deployed. +// this.cancel(); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java index 6d37f2050..86fd6b819 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AprilTask.java @@ -1,56 +1,56 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.HolidayManager; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.ChatColor; -import org.bukkit.Statistic; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -public class AprilTask extends BukkitRunnable { - - @Override - public void run() { - if (!mcMMO.getHolidayManager().isAprilFirst()) { - this.cancel(); - return; - } - - for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - int random = Misc.getRandom().nextInt(40) + 11; - int betterRandom = Misc.getRandom().nextInt(2000); - if (betterRandom == 0) { - SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); - player.sendMessage(unknown("superskill") + " skill increased by 1. Total (" + unknown("12") + ")"); -// fireworksShow(player); - } - - for (Statistic statistic : mcMMO.getHolidayManager().movementStatistics) { - if (player.getStatistic(statistic) > 0 && player.getStatistic(statistic) % random == 0) { - mcMMO.getHolidayManager().levelUpApril(player, HolidayManager.FakeSkillType.getByStatistic(statistic)); - break; - } - } - } - } - - /*private void fireworksShow(final Player player) { - final int firework_amount = 10; - for (int i = 0; i < firework_amount; i++) { - int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; - mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { - @Override - public void run() { - mcMMO.getHolidayManager().spawnFireworks(player); - } - }, delay); - } - }*/ - - private String unknown(String string) { - return ChatColor.MAGIC + string + ChatColor.RESET + ChatColor.YELLOW; - } -} +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.HolidayManager; +//import com.gmail.nossr50.util.Misc; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import org.bukkit.ChatColor; +//import org.bukkit.Statistic; +//import org.bukkit.entity.Player; +//import org.bukkit.scheduler.BukkitRunnable; +// +//public class AprilTask extends BukkitRunnable { +// +// @Override +// public void run() { +// if (!mcMMO.getHolidayManager().isAprilFirst()) { +// this.cancel(); +// return; +// } +// +// for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { +// int random = Misc.getRandom().nextInt(40) + 11; +// int betterRandom = Misc.getRandom().nextInt(2000); +// if (betterRandom == 0) { +// SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); +// player.sendMessage(unknown("superskill") + " skill increased by 1. Total (" + unknown("12") + ")"); +//// fireworksShow(player); +// } +// +// for (Statistic statistic : mcMMO.getHolidayManager().movementStatistics) { +// if (player.getStatistic(statistic) > 0 && player.getStatistic(statistic) % random == 0) { +// mcMMO.getHolidayManager().levelUpApril(player, HolidayManager.FakeSkillType.getByStatistic(statistic)); +// break; +// } +// } +// } +// } +// +// /*private void fireworksShow(final Player player) { +// final int firework_amount = 10; +// for (int i = 0; i < firework_amount; i++) { +// int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; +// mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { +// @Override +// public void run() { +// mcMMO.getHolidayManager().spawnFireworks(player); +// } +// }, delay); +// } +// }*/ +// +// private String unknown(String string) { +// return ChatColor.MAGIC + string + ChatColor.RESET + ChatColor.YELLOW; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/util/HolidayManager.java index 7004245f6..f89937844 100644 --- a/src/main/java/com/gmail/nossr50/util/HolidayManager.java +++ b/src/main/java/com/gmail/nossr50/util/HolidayManager.java @@ -1,388 +1,388 @@ -package com.gmail.nossr50.util; - -import com.gmail.nossr50.commands.skills.AprilCommand; -import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.datatypes.interactions.NotificationType; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.player.NotificationManager; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import com.gmail.nossr50.util.text.StringUtils; -import com.google.common.collect.ImmutableList; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Statistic; -import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerStatisticIncrementEvent; - -import java.io.*; -import java.util.*; -import java.util.regex.Pattern; - -public final class HolidayManager { - private final ArrayList hasCelebrated; - private final int currentYear; - private static final int START_YEAR = 2011; - - private static final List ALL_COLORS; - private static final List ALL_CHAT_COLORS; - private static final List CHAT_FORMATS; - - public enum FakeSkillType { - MACHO, - JUMPING, - THROWING, - WRECKING, - CRAFTING, - WALKING, - SWIMMING, - FALLING, - CLIMBING, - FLYING, - DIVING, - PIGGY, - UNKNOWN; - - public static FakeSkillType getByName(String skillName) { - for (FakeSkillType type : values()) { - if (type.name().equalsIgnoreCase(skillName)) { - return type; - } - } - return null; - } - - public static FakeSkillType getByStatistic(Statistic statistic) { - switch (statistic) { - case DAMAGE_TAKEN: - return FakeSkillType.MACHO; - case JUMP: - return FakeSkillType.JUMPING; - case DROP: - return FakeSkillType.THROWING; - case MINE_BLOCK: - case BREAK_ITEM: - return FakeSkillType.WRECKING; - case CRAFT_ITEM: - return FakeSkillType.CRAFTING; - case WALK_ONE_CM: - return FakeSkillType.WALKING; - case SWIM_ONE_CM: - return FakeSkillType.SWIMMING; - case FALL_ONE_CM: - return FakeSkillType.FALLING; - case CLIMB_ONE_CM: - return FakeSkillType.CLIMBING; - case FLY_ONE_CM: - return FakeSkillType.FLYING; - case WALK_UNDER_WATER_ONE_CM: - return FakeSkillType.DIVING; - case PIG_ONE_CM: - return FakeSkillType.PIGGY; - default: - return FakeSkillType.UNKNOWN; - } - } - } - - public final Set movementStatistics = EnumSet.of( - Statistic.WALK_ONE_CM, Statistic.SWIM_ONE_CM, Statistic.FALL_ONE_CM, - Statistic.CLIMB_ONE_CM, Statistic.FLY_ONE_CM, Statistic.WALK_UNDER_WATER_ONE_CM, - Statistic.PIG_ONE_CM); - - static { - List colors = new ArrayList<>(); - List chatColors = new ArrayList<>(); - List chatFormats = new ArrayList<>(); - - for (ChatColor color : ChatColor.values()) { - if (color.isColor()) { - chatColors.add(color); - } - else { - chatFormats.add(color); - } - } - -// for (DyeColor color : DyeColor.values()) { -// colors.add(color.getFireworkColor()); -// } - - Collections.shuffle(chatColors, Misc.getRandom()); - Collections.shuffle(colors, Misc.getRandom()); - Collections.shuffle(chatFormats, Misc.getRandom()); - - ALL_CHAT_COLORS = ImmutableList.copyOf(chatColors); - ALL_COLORS = ImmutableList.copyOf(colors); - CHAT_FORMATS = ImmutableList.copyOf(chatFormats); - } - - // This gets called onEnable - public HolidayManager() { - currentYear = Calendar.getInstance().get(Calendar.YEAR); - - File anniversaryFile = new File(mcMMO.getFlatFileDirectory(), "anniversary." + currentYear + ".yml"); - - if (!anniversaryFile.exists()) { - try { - anniversaryFile.createNewFile(); - } - catch (IOException ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - } - - hasCelebrated = new ArrayList<>(); - - try { - hasCelebrated.clear(); - BufferedReader reader = new BufferedReader(new FileReader(anniversaryFile.getPath())); - String line = reader.readLine(); - - while (line != null) { - hasCelebrated.add(line); - line = reader.readLine(); - } - - reader.close(); - } - catch (Exception ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - - cleanupFiles(); - } - - private void cleanupFiles() { - File FlatFileDir = new File(mcMMO.getFlatFileDirectory()); - File legacy = new File(FlatFileDir, "anniversary.yml"); - List toDelete = new ArrayList<>(); - - if (legacy.exists()) { - toDelete.add(legacy); - } - - Pattern pattern = Pattern.compile("anniversary\\.(?:.+)\\.yml"); - - for (String fileName : FlatFileDir.list()) { - if (!pattern.matcher(fileName).matches() || fileName.equals("anniversary." + currentYear + ".yml")) { - continue; - } - - File file = new File(FlatFileDir, fileName); - - if (file.isDirectory()) { - continue; - } - - toDelete.add(file); - } - - for (File file : toDelete) { - if (file.delete()) { - mcMMO.p.debug("Deleted: " + file.getName()); - } - } - } - - // This gets called onDisable - public void saveAnniversaryFiles() { - mcMMO.p.debug("Saving anniversary files..."); - String anniversaryFilePath = mcMMO.getFlatFileDirectory() + "anniversary." + currentYear + ".yml"; - - try { - BufferedWriter writer = new BufferedWriter(new FileWriter(anniversaryFilePath)); - for (String player : hasCelebrated) { - writer.write(player); - writer.newLine(); - } - writer.close(); - } - catch (Exception ex) { - mcMMO.p.getLogger().severe(ex.toString()); - } - } - - // This gets called from /mcmmo command - public void anniversaryCheck(final CommandSender sender) { - GregorianCalendar anniversaryStart = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 3); - GregorianCalendar anniversaryEnd = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 6); - GregorianCalendar day = new GregorianCalendar(); - - if (hasCelebrated.contains(sender.getName())) { - return; - } - - if (!getDateRange(day.getTime(), anniversaryStart.getTime(), anniversaryEnd.getTime())) { - return; - } - - sender.sendMessage(LocaleLoader.getString("Holiday.Anniversary", (currentYear - START_YEAR))); - /*if (sender instanceof Player) { - final int firework_amount = 10; - for (int i = 0; i < firework_amount; i++) { - int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; - mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { - @Override - public void run() { - spawnFireworks((Player) sender); - } - }, delay); - } - }*/ -// else { - /* - * Credit: http://www.geocities.com/spunk1111/ - * (good luck finding that in 3 years heh) - * .''. . *''* :_\/_: . - * :_\/_: _\(/_ .:.*_\/_* : /\ : .'.:.'. - * .''.: /\ : /)\ ':'* /\ * : '..'. -=:o:=- - * :_\/_:'.:::. ' *''* * '.\'/.'_\(/_ '.':'.' - * : /\ : ::::: *_\/_* -= o =- /)\ ' - * '..' ':::' * /\ * .'/.\'. ' * - * * *..* : * - * * * * - * * * * - */ - - /* - * Color map - * AAAA D GGGG JJJJJJ K - * AAAAAA DDDDD EEEGGGGGG JJJJJJ KKKKKKK - * BBBBAAAAAA DDD EEEGGGGGG I JJJJJ KKKKKKK - * BBBBBBACCCCC D FFFF G IIIIIIIHHHHH KKKKKKK - * BBBBBB CCCCC FFFFFF IIIIIII HHH K - * BBBB CCCCC FFFFFF IIIIIII H k - * b FFFF I k - * b i k - * b i k - */ - Object[] colorParams = new Object[]{chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose()}; - sender.sendMessage(String.format(" %1$s.''. %4$s. %7$s*''* %10$s:_\\/_: %11$s.", colorParams)); - sender.sendMessage(String.format(" %1$s:_\\/_: %4$s_\\(/_ %5$s.:.%7$s*_\\/_* %10$s: /\\ : %11$s.'.:.'.", colorParams)); - sender.sendMessage(String.format(" %2$s.''.%1$s: /\\ : %4$s/)\\ %5$s':'%7$s* /\\ * %9$s: %10$s'..'. %11$s-=:o:=-", colorParams)); - sender.sendMessage(String.format("%2$s:_\\/_:%1$s'%3$s.:::. %4$s' %6$s*''* %7$s* %9$s'.\\'/.'%8$s_\\(/_ %11$s'.':'.'", colorParams)); - sender.sendMessage(String.format("%2$s: /\\ : %3$s::::: %6$s*_\\/_* %9$s-= o =-%8$s /)\\ %11$s'", colorParams)); - sender.sendMessage(String.format(" %2$s'..' %3$s':::' %6$s* /\\ * %9$s.'/.\\'. %8$s' %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %6$s*..* %9$s: %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); - sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); -// } - - hasCelebrated.add(sender.getName()); - } - - public boolean getDateRange(Date date, Date start, Date end) { - return !(date.before(start) || date.after(end)); - } - -// public void spawnFireworks(Player player) { -// int power = Misc.getRandom().nextInt(3) + 1; -// Type fireworkType = Type.values()[Misc.getRandom().nextInt(Type.values().length)]; -// double varX = Misc.getRandom().nextGaussian() * 3; -// double varZ = Misc.getRandom().nextGaussian() * 3; +//package com.gmail.nossr50.util; // -// Firework fireworks = (Firework) player.getWorld().spawnEntity(player.getLocation().add(varX, 0, varZ), EntityType.FIREWORK); -// FireworkMeta fireworkmeta = fireworks.getFireworkMeta(); -// FireworkEffect effect = FireworkEffect.builder().flicker(Misc.getRandom().nextBoolean()).withColor(colorChoose()).withFade(colorChoose()).with(fireworkType).trail(Misc.getRandom().nextBoolean()).build(); -// fireworkmeta.addEffect(effect); -// fireworkmeta.setPower(power); -// fireworks.setFireworkMeta(fireworkmeta); +//import com.gmail.nossr50.commands.skills.AprilCommand; +//import com.gmail.nossr50.config.Config; +//import com.gmail.nossr50.datatypes.interactions.NotificationType; +//import com.gmail.nossr50.datatypes.player.McMMOPlayer; +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.locale.LocaleLoader; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.player.NotificationManager; +//import com.gmail.nossr50.util.player.UserManager; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import com.gmail.nossr50.util.text.StringUtils; +//import com.google.common.collect.ImmutableList; +//import org.bukkit.ChatColor; +//import org.bukkit.Color; +//import org.bukkit.Statistic; +//import org.bukkit.command.CommandSender; +//import org.bukkit.command.PluginCommand; +//import org.bukkit.entity.Player; +//import org.bukkit.event.player.PlayerStatisticIncrementEvent; +// +//import java.io.*; +//import java.util.*; +//import java.util.regex.Pattern; +// +//public final class HolidayManager { +// private final ArrayList hasCelebrated; +// private final int currentYear; +// private static final int START_YEAR = 2011; +// +// private static final List ALL_COLORS; +// private static final List ALL_CHAT_COLORS; +// private static final List CHAT_FORMATS; +// +// public enum FakeSkillType { +// MACHO, +// JUMPING, +// THROWING, +// WRECKING, +// CRAFTING, +// WALKING, +// SWIMMING, +// FALLING, +// CLIMBING, +// FLYING, +// DIVING, +// PIGGY, +// UNKNOWN; +// +// public static FakeSkillType getByName(String skillName) { +// for (FakeSkillType type : values()) { +// if (type.name().equalsIgnoreCase(skillName)) { +// return type; +// } +// } +// return null; +// } +// +// public static FakeSkillType getByStatistic(Statistic statistic) { +// switch (statistic) { +// case DAMAGE_TAKEN: +// return FakeSkillType.MACHO; +// case JUMP: +// return FakeSkillType.JUMPING; +// case DROP: +// return FakeSkillType.THROWING; +// case MINE_BLOCK: +// case BREAK_ITEM: +// return FakeSkillType.WRECKING; +// case CRAFT_ITEM: +// return FakeSkillType.CRAFTING; +// case WALK_ONE_CM: +// return FakeSkillType.WALKING; +// case SWIM_ONE_CM: +// return FakeSkillType.SWIMMING; +// case FALL_ONE_CM: +// return FakeSkillType.FALLING; +// case CLIMB_ONE_CM: +// return FakeSkillType.CLIMBING; +// case FLY_ONE_CM: +// return FakeSkillType.FLYING; +// case WALK_UNDER_WATER_ONE_CM: +// return FakeSkillType.DIVING; +// case PIG_ONE_CM: +// return FakeSkillType.PIGGY; +// default: +// return FakeSkillType.UNKNOWN; +// } +// } // } - - private static List colorChoose() { - return ALL_COLORS.subList(0, Math.max(Misc.getRandom().nextInt(ALL_COLORS.size() + 1), 1)); - } - - private static String chatColorChoose() { - StringBuilder ret = new StringBuilder(ALL_CHAT_COLORS.get(Misc.getRandom().nextInt(ALL_CHAT_COLORS.size())).toString()); - - for (ChatColor chatFormat : CHAT_FORMATS) { - if (Misc.getRandom().nextInt(CHAT_FORMATS.size()) == 0) { - ret.append(chatFormat); - } - } - - return ret.toString(); - } - - public boolean isAprilFirst() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return false; - - GregorianCalendar aprilFirst = new GregorianCalendar(currentYear, Calendar.APRIL, 1); - GregorianCalendar aprilSecond = new GregorianCalendar(currentYear, Calendar.APRIL, 2); - GregorianCalendar day = new GregorianCalendar(); - return getDateRange(day.getTime(), aprilFirst.getTime(), aprilSecond.getTime()); - } - - public boolean nearingAprilFirst() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return false; - - GregorianCalendar start = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.MARCH, 28); - GregorianCalendar end = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.APRIL, 2); - GregorianCalendar day = new GregorianCalendar(); - - return mcMMO.getHolidayManager().getDateRange(day.getTime(), start.getTime(), end.getTime()); - } - - public void handleStatisticEvent(PlayerStatisticIncrementEvent event) { - Player player = event.getPlayer(); - Statistic statistic = event.getStatistic(); - int newValue = event.getNewValue(); - - int modifier; - switch (statistic) { - case DAMAGE_TAKEN: - modifier = 500; - break; - case JUMP: - modifier = 500; - break; - case DROP: - modifier = 200; - break; - case MINE_BLOCK: - case BREAK_ITEM: - modifier = 500; - break; - case CRAFT_ITEM: - modifier = 100; - break; - default: - return; - } - - if (newValue % modifier == 0) { - mcMMO.getHolidayManager().levelUpApril(player, FakeSkillType.getByStatistic(statistic)); - } - } - - public void levelUpApril(Player player, FakeSkillType fakeSkillType) { - if(!Config.getInstance().isAprilFoolsAllowed()) - return; - - final McMMOPlayer mmoPlayer = UserManager.getPlayer(player); - if (mmoPlayer == null) return; - - int levelTotal = Misc.getRandom().nextInt(1 + mmoPlayer.getSkillLevel(PrimarySkillType.MINING)) + 1; - SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); - NotificationManager.sendPlayerInformation(player, NotificationType.HOLIDAY, "Holiday.AprilFools.Levelup", StringUtils.getCapitalized(fakeSkillType.toString()), String.valueOf(levelTotal)); -// ParticleEffectUtils.fireworkParticleShower(player, ALL_COLORS.get(Misc.getRandom().nextInt(ALL_COLORS.size()))); - } - - public void registerAprilCommand() { - if(!Config.getInstance().isAprilFoolsAllowed()) - return; - - PluginCommand command = mcMMO.p.getCommand("crafting"); - command.setExecutor(new AprilCommand()); - } -} +// +// public final Set movementStatistics = EnumSet.of( +// Statistic.WALK_ONE_CM, Statistic.SWIM_ONE_CM, Statistic.FALL_ONE_CM, +// Statistic.CLIMB_ONE_CM, Statistic.FLY_ONE_CM, Statistic.WALK_UNDER_WATER_ONE_CM, +// Statistic.PIG_ONE_CM); +// +// static { +// List colors = new ArrayList<>(); +// List chatColors = new ArrayList<>(); +// List chatFormats = new ArrayList<>(); +// +// for (ChatColor color : ChatColor.values()) { +// if (color.isColor()) { +// chatColors.add(color); +// } +// else { +// chatFormats.add(color); +// } +// } +// +//// for (DyeColor color : DyeColor.values()) { +//// colors.add(color.getFireworkColor()); +//// } +// +// Collections.shuffle(chatColors, Misc.getRandom()); +// Collections.shuffle(colors, Misc.getRandom()); +// Collections.shuffle(chatFormats, Misc.getRandom()); +// +// ALL_CHAT_COLORS = ImmutableList.copyOf(chatColors); +// ALL_COLORS = ImmutableList.copyOf(colors); +// CHAT_FORMATS = ImmutableList.copyOf(chatFormats); +// } +// +// // This gets called onEnable +// public HolidayManager() { +// currentYear = Calendar.getInstance().get(Calendar.YEAR); +// +// File anniversaryFile = new File(mcMMO.getFlatFileDirectory(), "anniversary." + currentYear + ".yml"); +// +// if (!anniversaryFile.exists()) { +// try { +// anniversaryFile.createNewFile(); +// } +// catch (IOException ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// } +// +// hasCelebrated = new ArrayList<>(); +// +// try { +// hasCelebrated.clear(); +// BufferedReader reader = new BufferedReader(new FileReader(anniversaryFile.getPath())); +// String line = reader.readLine(); +// +// while (line != null) { +// hasCelebrated.add(line); +// line = reader.readLine(); +// } +// +// reader.close(); +// } +// catch (Exception ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// +// cleanupFiles(); +// } +// +// private void cleanupFiles() { +// File FlatFileDir = new File(mcMMO.getFlatFileDirectory()); +// File legacy = new File(FlatFileDir, "anniversary.yml"); +// List toDelete = new ArrayList<>(); +// +// if (legacy.exists()) { +// toDelete.add(legacy); +// } +// +// Pattern pattern = Pattern.compile("anniversary\\.(?:.+)\\.yml"); +// +// for (String fileName : FlatFileDir.list()) { +// if (!pattern.matcher(fileName).matches() || fileName.equals("anniversary." + currentYear + ".yml")) { +// continue; +// } +// +// File file = new File(FlatFileDir, fileName); +// +// if (file.isDirectory()) { +// continue; +// } +// +// toDelete.add(file); +// } +// +// for (File file : toDelete) { +// if (file.delete()) { +// mcMMO.p.debug("Deleted: " + file.getName()); +// } +// } +// } +// +// // This gets called onDisable +// public void saveAnniversaryFiles() { +// mcMMO.p.debug("Saving anniversary files..."); +// String anniversaryFilePath = mcMMO.getFlatFileDirectory() + "anniversary." + currentYear + ".yml"; +// +// try { +// BufferedWriter writer = new BufferedWriter(new FileWriter(anniversaryFilePath)); +// for (String player : hasCelebrated) { +// writer.write(player); +// writer.newLine(); +// } +// writer.close(); +// } +// catch (Exception ex) { +// mcMMO.p.getLogger().severe(ex.toString()); +// } +// } +// +// // This gets called from /mcmmo command +// public void anniversaryCheck(final CommandSender sender) { +// GregorianCalendar anniversaryStart = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 3); +// GregorianCalendar anniversaryEnd = new GregorianCalendar(currentYear, Calendar.FEBRUARY, 6); +// GregorianCalendar day = new GregorianCalendar(); +// +// if (hasCelebrated.contains(sender.getName())) { +// return; +// } +// +// if (!getDateRange(day.getTime(), anniversaryStart.getTime(), anniversaryEnd.getTime())) { +// return; +// } +// +// sender.sendMessage(LocaleLoader.getString("Holiday.Anniversary", (currentYear - START_YEAR))); +// /*if (sender instanceof Player) { +// final int firework_amount = 10; +// for (int i = 0; i < firework_amount; i++) { +// int delay = (int) (Misc.getRandom().nextDouble() * 3 * Misc.TICK_CONVERSION_FACTOR) + 4; +// mcMMO.p.getServer().getScheduler().runTaskLater(mcMMO.p, new Runnable() { +// @Override +// public void run() { +// spawnFireworks((Player) sender); +// } +// }, delay); +// } +// }*/ +//// else { +// /* +// * Credit: http://www.geocities.com/spunk1111/ +// * (good luck finding that in 3 years heh) +// * .''. . *''* :_\/_: . +// * :_\/_: _\(/_ .:.*_\/_* : /\ : .'.:.'. +// * .''.: /\ : /)\ ':'* /\ * : '..'. -=:o:=- +// * :_\/_:'.:::. ' *''* * '.\'/.'_\(/_ '.':'.' +// * : /\ : ::::: *_\/_* -= o =- /)\ ' +// * '..' ':::' * /\ * .'/.\'. ' * +// * * *..* : * +// * * * * +// * * * * +// */ +// +// /* +// * Color map +// * AAAA D GGGG JJJJJJ K +// * AAAAAA DDDDD EEEGGGGGG JJJJJJ KKKKKKK +// * BBBBAAAAAA DDD EEEGGGGGG I JJJJJ KKKKKKK +// * BBBBBBACCCCC D FFFF G IIIIIIIHHHHH KKKKKKK +// * BBBBBB CCCCC FFFFFF IIIIIII HHH K +// * BBBB CCCCC FFFFFF IIIIIII H k +// * b FFFF I k +// * b i k +// * b i k +// */ +// Object[] colorParams = new Object[]{chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose(), chatColorChoose()}; +// sender.sendMessage(String.format(" %1$s.''. %4$s. %7$s*''* %10$s:_\\/_: %11$s.", colorParams)); +// sender.sendMessage(String.format(" %1$s:_\\/_: %4$s_\\(/_ %5$s.:.%7$s*_\\/_* %10$s: /\\ : %11$s.'.:.'.", colorParams)); +// sender.sendMessage(String.format(" %2$s.''.%1$s: /\\ : %4$s/)\\ %5$s':'%7$s* /\\ * %9$s: %10$s'..'. %11$s-=:o:=-", colorParams)); +// sender.sendMessage(String.format("%2$s:_\\/_:%1$s'%3$s.:::. %4$s' %6$s*''* %7$s* %9$s'.\\'/.'%8$s_\\(/_ %11$s'.':'.'", colorParams)); +// sender.sendMessage(String.format("%2$s: /\\ : %3$s::::: %6$s*_\\/_* %9$s-= o =-%8$s /)\\ %11$s'", colorParams)); +// sender.sendMessage(String.format(" %2$s'..' %3$s':::' %6$s* /\\ * %9$s.'/.\\'. %8$s' %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %6$s*..* %9$s: %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); +// sender.sendMessage(String.format(" %2$s* %9$s* %11$s*", colorParams)); +//// } +// +// hasCelebrated.add(sender.getName()); +// } +// +// public boolean getDateRange(Date date, Date start, Date end) { +// return !(date.before(start) || date.after(end)); +// } +// +//// public void spawnFireworks(Player player) { +//// int power = Misc.getRandom().nextInt(3) + 1; +//// Type fireworkType = Type.values()[Misc.getRandom().nextInt(Type.values().length)]; +//// double varX = Misc.getRandom().nextGaussian() * 3; +//// double varZ = Misc.getRandom().nextGaussian() * 3; +//// +//// Firework fireworks = (Firework) player.getWorld().spawnEntity(player.getLocation().add(varX, 0, varZ), EntityType.FIREWORK); +//// FireworkMeta fireworkmeta = fireworks.getFireworkMeta(); +//// FireworkEffect effect = FireworkEffect.builder().flicker(Misc.getRandom().nextBoolean()).withColor(colorChoose()).withFade(colorChoose()).with(fireworkType).trail(Misc.getRandom().nextBoolean()).build(); +//// fireworkmeta.addEffect(effect); +//// fireworkmeta.setPower(power); +//// fireworks.setFireworkMeta(fireworkmeta); +//// } +// +// private static List colorChoose() { +// return ALL_COLORS.subList(0, Math.max(Misc.getRandom().nextInt(ALL_COLORS.size() + 1), 1)); +// } +// +// private static String chatColorChoose() { +// StringBuilder ret = new StringBuilder(ALL_CHAT_COLORS.get(Misc.getRandom().nextInt(ALL_CHAT_COLORS.size())).toString()); +// +// for (ChatColor chatFormat : CHAT_FORMATS) { +// if (Misc.getRandom().nextInt(CHAT_FORMATS.size()) == 0) { +// ret.append(chatFormat); +// } +// } +// +// return ret.toString(); +// } +// +// public boolean isAprilFirst() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return false; +// +// GregorianCalendar aprilFirst = new GregorianCalendar(currentYear, Calendar.APRIL, 1); +// GregorianCalendar aprilSecond = new GregorianCalendar(currentYear, Calendar.APRIL, 2); +// GregorianCalendar day = new GregorianCalendar(); +// return getDateRange(day.getTime(), aprilFirst.getTime(), aprilSecond.getTime()); +// } +// +// public boolean nearingAprilFirst() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return false; +// +// GregorianCalendar start = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.MARCH, 28); +// GregorianCalendar end = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), Calendar.APRIL, 2); +// GregorianCalendar day = new GregorianCalendar(); +// +// return mcMMO.getHolidayManager().getDateRange(day.getTime(), start.getTime(), end.getTime()); +// } +// +// public void handleStatisticEvent(PlayerStatisticIncrementEvent event) { +// Player player = event.getPlayer(); +// Statistic statistic = event.getStatistic(); +// int newValue = event.getNewValue(); +// +// int modifier; +// switch (statistic) { +// case DAMAGE_TAKEN: +// modifier = 500; +// break; +// case JUMP: +// modifier = 500; +// break; +// case DROP: +// modifier = 200; +// break; +// case MINE_BLOCK: +// case BREAK_ITEM: +// modifier = 500; +// break; +// case CRAFT_ITEM: +// modifier = 100; +// break; +// default: +// return; +// } +// +// if (newValue % modifier == 0) { +// mcMMO.getHolidayManager().levelUpApril(player, FakeSkillType.getByStatistic(statistic)); +// } +// } +// +// public void levelUpApril(Player player, FakeSkillType fakeSkillType) { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return; +// +// final McMMOPlayer mmoPlayer = UserManager.getPlayer(player); +// if (mmoPlayer == null) return; +// +// int levelTotal = Misc.getRandom().nextInt(1 + mmoPlayer.getSkillLevel(PrimarySkillType.MINING)) + 1; +// SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP); +// NotificationManager.sendPlayerInformation(player, NotificationType.HOLIDAY, "Holiday.AprilFools.Levelup", StringUtils.getCapitalized(fakeSkillType.toString()), String.valueOf(levelTotal)); +//// ParticleEffectUtils.fireworkParticleShower(player, ALL_COLORS.get(Misc.getRandom().nextInt(ALL_COLORS.size()))); +// } +// +// public void registerAprilCommand() { +// if(!Config.getInstance().isAprilFoolsAllowed()) +// return; +// +// PluginCommand command = mcMMO.p.getCommand("crafting"); +// command.setExecutor(new AprilCommand()); +// } +//} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bc640f363..563a4dc0c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -49,7 +49,6 @@ General: RetroMode: Enabled: true Locale: en_US - AprilFoolsEvent: true MOTD_Enabled: true EventBroadcasts: true EventInfoOnPlayerJoin: true From 0ae83420e600c0b3e7680dfbff48549b927d88a2 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 31 Mar 2021 15:53:21 -0700 Subject: [PATCH 04/30] 2.1.184 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b7a395d84..e0acdc7b7 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.184-SNAPSHOT + 2.1.184 mcMMO https://github.com/mcMMO-Dev/mcMMO From 72958bb0f3b3a55d5c1b9e448a423276742cb8b8 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:32:56 -0700 Subject: [PATCH 05/30] Herbalism XP exploit fix --- Changelog.txt | 3 ++ pom.xml | 2 +- .../nossr50/listeners/PlayerListener.java | 4 +- .../skills/herbalism/HerbalismManager.java | 45 ++++++++++++++----- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 269b0af14..fcb6d12e9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.185 + Fixed an exploit for Herbalism + Version 2.1.184 Removed April Fools event Fixed a bug where the default treasures.yml file had incorrect keys (see notes) diff --git a/pom.xml b/pom.xml index e0acdc7b7..0707083c3 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.184 + 2.1.185-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index ab1c46c93..7a8262600 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -848,7 +848,9 @@ public class PlayerListener implements Listener { } } } else { - herbalismManager.processBerryBushHarvesting(blockState); + if(!event.getPlayer().isSneaking()) { + herbalismManager.processBerryBushHarvesting(blockState); + } } } break; diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index f4bf66b1d..c4d4b6a32 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -29,6 +29,7 @@ import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import com.gmail.nossr50.util.text.StringUtils; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -40,6 +41,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -111,22 +113,41 @@ public class HerbalismManager extends SkillManager { mmoPlayer.getPlayer().sendMessage("Bush XP: " + xpReward); } -// //Check for double drops -// if(checkDoubleDrop(blockState)) { -// -// if(mmoPlayer.isDebugMode()) { -// mmoPlayer.getPlayer().sendMessage("Double Drops succeeded for Berry Bush"); -// } -// -// //Add metadata to mark this block for double or triple drops -// markForBonusDrops(blockState); -// } - - applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); + CheckBushAge checkBushAge = new CheckBushAge(blockState.getBlock(), mmoPlayer, xpReward); + checkBushAge.runTaskLater(mcMMO.p, 1); } } } + private class CheckBushAge extends BukkitRunnable { + + @NotNull Block block; + @NotNull McMMOPlayer mmoPlayer; + int xpReward; + + public CheckBushAge(@NotNull Block block, @NotNull McMMOPlayer mmoPlayer, int xpReward) { + this.block = block; + this.mmoPlayer = mmoPlayer; + this.xpReward = xpReward; + } + + @Override + public void run() { + BlockState blockState = block.getState(); + + if(blockState.getType().toString().equalsIgnoreCase("sweet_berry_bush")) { + if(blockState.getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) blockState.getBlockData(); + + if(ageable.getAge() <= 1) { + applyXpGain(xpReward, XPGainReason.PVE, XPGainSource.SELF); + } + } + } + } + } + + public boolean canUseHylianLuck() { if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK)) return false; From 1e91ba156d062c4743c86d5fc1ab4e80e657a442 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:33:09 -0700 Subject: [PATCH 06/30] 2.1.185 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0707083c3..c730c8298 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.185-SNAPSHOT + 2.1.185 mcMMO https://github.com/mcMMO-Dev/mcMMO From 0cb3d91f0ea49d4821153665370e99bc8f75f58f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 08:55:04 -0700 Subject: [PATCH 07/30] dev mode --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index fcb6d12e9..f6dfd2839 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.186 + + Version 2.1.185 Fixed an exploit for Herbalism diff --git a/pom.xml b/pom.xml index c730c8298..c595513b0 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.185 + 2.1.186-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 48bf79055aaa526f2a85a412dd101726138ba622 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 11:00:11 -0700 Subject: [PATCH 08/30] Rupture has been reworked --- Changelog.txt | 15 + .../com/gmail/nossr50/api/AbilityAPI.java | 10 +- .../datatypes/meta/RuptureTaskMeta.java | 25 + .../nossr50/datatypes/player/McMMOPlayer.java | 12 +- src/main/java/com/gmail/nossr50/mcMMO.java | 5 +- .../runnables/skills/BleedTimerTask.java | 428 +++++++++--------- .../nossr50/runnables/skills/RuptureTask.java | 142 ++++++ .../skills/herbalism/HerbalismManager.java | 1 - .../nossr50/skills/swords/SwordsManager.java | 65 ++- .../nossr50/skills/taming/TamingManager.java | 21 +- .../nossr50/util/TransientMetadataTools.java | 5 + .../nossr50/util/skills/CombatUtils.java | 6 +- .../util/skills/ParticleEffectUtils.java | 43 +- src/main/resources/advanced.yml | 6 - 14 files changed, 507 insertions(+), 277 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java create mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java diff --git a/Changelog.txt b/Changelog.txt index f6dfd2839..526ae90e8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,19 @@ Version 2.1.186 + Rupture has been reworked to solve a few outstanding issues (see notes) + Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml + Gore no longer applies Rupture + Gore no longer sends a message to the Wolf owner when it triggers + Gore no longer sends a message to players that are hit by it + Rupture no longer sends a message telling you that your target is bleeding + + NOTES: + The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem + Targets will bleed and take "pure" damage while bleeding, this never kills the target. It will reduce them to 0.01 HP. + After 5 seconds since your last attack on the target have transpired Rupture "explodes" dealing a large amount of damage, this damage is not pure and is affected by armor etc. + Rupture no longer tells you that you that you applied it to the target, it should be obvious from the sounds/particle effects + The new Rupture no longer constantly interferes with the vanilla Swipe (the AOE attack built into Minecraft) + The new Rupture has not had a fine tuned balance pass, I will be balancing it frequently after this patch, it may be too weak or too strong in its current form Version 2.1.185 diff --git a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java index 5922ecbe6..ad68b9d7e 100644 --- a/src/main/java/com/gmail/nossr50/api/AbilityAPI.java +++ b/src/main/java/com/gmail/nossr50/api/AbilityAPI.java @@ -2,7 +2,7 @@ package com.gmail.nossr50.api; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -83,6 +83,12 @@ public final class AbilityAPI { } public static boolean isBleeding(LivingEntity entity) { - return BleedTimerTask.isBleeding(entity); + if(entity.isValid()) { + if(entity.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + return true; + } + } + + return false; } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java b/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java new file mode 100644 index 000000000..b484ce8cd --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/meta/RuptureTaskMeta.java @@ -0,0 +1,25 @@ +package com.gmail.nossr50.datatypes.meta; + +import com.gmail.nossr50.runnables.skills.RuptureTask; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class RuptureTaskMeta extends FixedMetadataValue { + + private final @NotNull RuptureTask ruptureTask; + /** + * Initializes a FixedMetadataValue with an Object + * + * @param owningPlugin the {@link Plugin} that created this metadata value + * @param ruptureTask the value assigned to this metadata value + */ + public RuptureTaskMeta(@NotNull Plugin owningPlugin, @NotNull RuptureTask ruptureTask) { + super(owningPlugin, ruptureTask); + this.ruptureTask = ruptureTask; + } + + public @NotNull RuptureTask getRuptureTimerTask() { + return ruptureTask; + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index cbcbbdba5..94face6c1 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -10,6 +10,7 @@ import com.gmail.nossr50.datatypes.chat.ChatChannel; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.interactions.NotificationType; +import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta; import com.gmail.nossr50.datatypes.mods.CustomTool; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.party.PartyTeleportRecord; @@ -23,7 +24,6 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.party.ShareHandler; import com.gmail.nossr50.runnables.skills.AbilityDisableTask; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.runnables.skills.ToolLowerTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; @@ -1080,7 +1080,15 @@ public class McMMOPlayer implements Identified { */ public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); - BleedTimerTask.bleedOut(getPlayer()); + if(getPlayer().hasMetadata(mcMMO.RUPTURE_META_KEY)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY); + + //Punish a logout + ruptureTaskMeta.getRuptureTimerTask().explode(); + ruptureTaskMeta.getRuptureTimerTask().explode(); + ruptureTaskMeta.getRuptureTimerTask().explode(); + } + cleanup(); if (syncSave) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index f24170690..9e442355b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -27,7 +27,6 @@ import com.gmail.nossr50.runnables.party.PartyAutoKickTask; import com.gmail.nossr50.runnables.player.ClearRegisteredXPGainTask; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; import com.gmail.nossr50.runnables.player.PowerLevelUpdatingTask; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.child.ChildConfig; import com.gmail.nossr50.skills.repair.repairables.Repairable; @@ -126,6 +125,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String REPLANT_META_KEY = "mcMMO: Recently Replanted"; + public static final String RUPTURE_META_KEY = "mcMMO: RuptureTask"; public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; public static final String DODGE_TRACKER = "mcMMO: Dodge Tracker"; public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage"; @@ -641,9 +641,6 @@ public class mcMMO extends JavaPlugin { // Cleanup the backups folder new CleanBackupsTask().runTaskAsynchronously(mcMMO.p); - // Bleed timer (Runs every 0.5 seconds) - new BleedTimerTask().runTaskTimer(this, Misc.TICK_CONVERSION_FACTOR, (Misc.TICK_CONVERSION_FACTOR / 2)); - // Old & Powerless User remover long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java index aee720282..49298c2bb 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -1,214 +1,214 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.datatypes.interactions.NotificationType; -import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.MobHealthbarUtils; -import com.gmail.nossr50.util.player.NotificationManager; -import com.gmail.nossr50.util.skills.CombatUtils; -import com.gmail.nossr50.util.skills.ParticleEffectUtils; -import com.gmail.nossr50.util.sounds.SoundManager; -import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.Bukkit; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -public class BleedTimerTask extends BukkitRunnable { - private static final @NotNull Map bleedList = new HashMap<>(); - private static boolean isIterating = false; - - @Override - public void run() { - isIterating = true; - Iterator> bleedIterator = bleedList.entrySet().iterator(); - - while (bleedIterator.hasNext()) { - Entry containerEntry = bleedIterator.next(); - LivingEntity target = containerEntry.getKey(); - int toolTier = containerEntry.getValue().toolTier; - -// String debugMessage = ""; -// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET; - -// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], "; - - if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { - if(target instanceof Player) - { - NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); - } - - bleedIterator.remove(); - continue; - } - - int armorCount = 0; - - double damage; - - if (target instanceof Player) { - damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); - - //Above Bleed Rank 3 deals 50% more damage - if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) - damage = damage * 1.5; - - Player player = (Player) target; - - if (!player.isOnline()) { - continue; - } - - //Count Armor - for (ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) { - //We only want to count slots that contain armor. - if (armorPiece != null) { - armorCount++; - } - } - - } else { - damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); - -// debugMessage+="BaseDMG=["+damage+"], "; - - //Above Bleed Rank 3 deals 50% more damage - if (containerEntry.getValue().bleedRank >= 3) - { - damage = damage * 1.5; - } - -// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], "; - - - MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars - } - -// debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], "; - - if(armorCount > 3) - { - damage = damage * .75; - } - -// debugMessage+="AfterRankAndArmorChecks["+damage+"], "; - - //Weapons below Diamond get damage cut in half - if(toolTier < 4) - damage = damage / 2; - -// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], "; - - //Wood weapons get damage cut in half again - if(toolTier < 2) - damage = damage / 2; - -// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], "; - - double victimHealth = target.getHealth(); - -// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], "; - - //Fire a fake event - FakeEntityDamageByEntityEvent fakeEntityDamageByEntityEvent = (FakeEntityDamageByEntityEvent) CombatUtils.sendEntityDamageEvent(containerEntry.getValue().damageSource, target, EntityDamageEvent.DamageCause.CUSTOM, damage); - Bukkit.getPluginManager().callEvent(fakeEntityDamageByEntityEvent); - - CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier); - - double victimHealthAftermath = target.getHealth(); - -// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], "; - - if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath) - { - //Play Bleed Sound - SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); - - ParticleEffectUtils.playBleedEffect(target); - } - - //Lower Bleed Ticks - BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); - loweredBleedContainer.bleedTicks -= 1; - -// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]"; - containerEntry.setValue(loweredBleedContainer); - -// Bukkit.broadcastMessage(debugMessage); - } - isIterating = false; - } - - public static @NotNull BleedContainer copyContainer(@NotNull BleedContainer container) - { - LivingEntity target = container.target; - LivingEntity source = container.damageSource; - int bleedTicks = container.bleedTicks; - int bleedRank = container.bleedRank; - int toolTier = container.toolTier; - - return new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); - } - - /** - * Instantly Bleed out a LivingEntity - * - * @param entity LivingEntity to bleed out - */ - public static void bleedOut(@NotNull LivingEntity entity) { - /* - * Don't remove anything from the list outside of run() - */ - - if (bleedList.containsKey(entity)) { - CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource); - } - } - - /** - * Add a LivingEntity to the bleedList if it is not in it. - * - * @param entity LivingEntity to add - * @param attacker source of the bleed/rupture - * @param ticks Number of bleeding ticks - */ - public static void add(@NotNull LivingEntity entity, @NotNull LivingEntity attacker, int ticks, int bleedRank, int toolTier) { - if (!Bukkit.isPrimaryThread()) { - throw new IllegalStateException("Cannot add bleed task async!"); - } - - if(isIterating) { - //Used to throw an error here, but in reality all we are really doing is preventing concurrency issues from other plugins being naughty and its not really needed - //I'm not really a fan of silent errors, but I'm sick of seeing people using crazy enchantments come in and report this "bug" - return; - } - -// if (isIterating) throw new IllegalStateException("Cannot add task while iterating timers!"); - - if(toolTier < 4) - ticks = Math.max(1, (ticks / 3)); - - ticks+=1; - - BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); - bleedList.put(entity, newBleedContainer); - } - - public static boolean isBleedOperationAllowed() { - return !isIterating && Bukkit.isPrimaryThread(); - } - - public static boolean isBleeding(@NotNull LivingEntity entity) { - return bleedList.containsKey(entity); - } -} +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.config.AdvancedConfig; +//import com.gmail.nossr50.datatypes.interactions.NotificationType; +//import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.MobHealthbarUtils; +//import com.gmail.nossr50.util.player.NotificationManager; +//import com.gmail.nossr50.util.skills.CombatUtils; +//import com.gmail.nossr50.util.skills.ParticleEffectUtils; +//import com.gmail.nossr50.util.sounds.SoundManager; +//import com.gmail.nossr50.util.sounds.SoundType; +//import org.bukkit.Bukkit; +//import org.bukkit.entity.LivingEntity; +//import org.bukkit.entity.Player; +//import org.bukkit.event.entity.EntityDamageEvent; +//import org.bukkit.inventory.ItemStack; +//import org.bukkit.scheduler.BukkitRunnable; +//import org.jetbrains.annotations.NotNull; +// +//import java.util.HashMap; +//import java.util.Iterator; +//import java.util.Map; +//import java.util.Map.Entry; +// +//public class BleedTimerTask extends BukkitRunnable { +// private static final @NotNull Map bleedList = new HashMap<>(); +// private static boolean isIterating = false; +// +// @Override +// public void run() { +// isIterating = true; +// Iterator> bleedIterator = bleedList.entrySet().iterator(); +// +// while (bleedIterator.hasNext()) { +// Entry containerEntry = bleedIterator.next(); +// LivingEntity target = containerEntry.getKey(); +// int toolTier = containerEntry.getValue().toolTier; +// +//// String debugMessage = ""; +//// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET; +// +//// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], "; +// +// if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { +// if(target instanceof Player) +// { +// NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); +// } +// +// bleedIterator.remove(); +// continue; +// } +// +// int armorCount = 0; +// +// double damage; +// +// if (target instanceof Player) { +// damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); +// +// //Above Bleed Rank 3 deals 50% more damage +// if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) +// damage = damage * 1.5; +// +// Player player = (Player) target; +// +// if (!player.isOnline()) { +// continue; +// } +// +// //Count Armor +// for (ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) { +// //We only want to count slots that contain armor. +// if (armorPiece != null) { +// armorCount++; +// } +// } +// +// } else { +// damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); +// +//// debugMessage+="BaseDMG=["+damage+"], "; +// +// //Above Bleed Rank 3 deals 50% more damage +// if (containerEntry.getValue().bleedRank >= 3) +// { +// damage = damage * 1.5; +// } +// +//// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], "; +// +// +// MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars +// } +// +//// debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], "; +// +// if(armorCount > 3) +// { +// damage = damage * .75; +// } +// +//// debugMessage+="AfterRankAndArmorChecks["+damage+"], "; +// +// //Weapons below Diamond get damage cut in half +// if(toolTier < 4) +// damage = damage / 2; +// +//// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], "; +// +// //Wood weapons get damage cut in half again +// if(toolTier < 2) +// damage = damage / 2; +// +//// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], "; +// +// double victimHealth = target.getHealth(); +// +//// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], "; +// +// //Fire a fake event +// FakeEntityDamageByEntityEvent fakeEntityDamageByEntityEvent = (FakeEntityDamageByEntityEvent) CombatUtils.sendEntityDamageEvent(containerEntry.getValue().damageSource, target, EntityDamageEvent.DamageCause.CUSTOM, damage); +// Bukkit.getPluginManager().callEvent(fakeEntityDamageByEntityEvent); +// +// CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier); +// +// double victimHealthAftermath = target.getHealth(); +// +//// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], "; +// +// if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath) +// { +// //Play Bleed Sound +// SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); +// +// ParticleEffectUtils.playBleedEffect(target); +// } +// +// //Lower Bleed Ticks +// BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); +// loweredBleedContainer.bleedTicks -= 1; +// +//// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]"; +// containerEntry.setValue(loweredBleedContainer); +// +//// Bukkit.broadcastMessage(debugMessage); +// } +// isIterating = false; +// } +// +// public static @NotNull BleedContainer copyContainer(@NotNull BleedContainer container) +// { +// LivingEntity target = container.target; +// LivingEntity source = container.damageSource; +// int bleedTicks = container.bleedTicks; +// int bleedRank = container.bleedRank; +// int toolTier = container.toolTier; +// +// return new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); +// } +// +// /** +// * Instantly Bleed out a LivingEntity +// * +// * @param entity LivingEntity to bleed out +// */ +// public static void bleedOut(@NotNull LivingEntity entity) { +// /* +// * Don't remove anything from the list outside of run() +// */ +// +// if (bleedList.containsKey(entity)) { +// CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource); +// } +// } +// +// /** +// * Add a LivingEntity to the bleedList if it is not in it. +// * +// * @param entity LivingEntity to add +// * @param attacker source of the bleed/rupture +// * @param ticks Number of bleeding ticks +// */ +// public static void add(@NotNull LivingEntity entity, @NotNull LivingEntity attacker, int ticks, int bleedRank, int toolTier) { +// if (!Bukkit.isPrimaryThread()) { +// throw new IllegalStateException("Cannot add bleed task async!"); +// } +// +// if(isIterating) { +// //Used to throw an error here, but in reality all we are really doing is preventing concurrency issues from other plugins being naughty and its not really needed +// //I'm not really a fan of silent errors, but I'm sick of seeing people using crazy enchantments come in and report this "bug" +// return; +// } +// +//// if (isIterating) throw new IllegalStateException("Cannot add task while iterating timers!"); +// +// if(toolTier < 4) +// ticks = Math.max(1, (ticks / 3)); +// +// ticks+=1; +// +// BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); +// bleedList.put(entity, newBleedContainer); +// } +// +// public static boolean isBleedOperationAllowed() { +// return !isIterating && Bukkit.isPrimaryThread(); +// } +// +// public static boolean isBleeding(@NotNull LivingEntity entity) { +// return bleedList.containsKey(entity); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java new file mode 100644 index 000000000..681578577 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -0,0 +1,142 @@ +package com.gmail.nossr50.runnables.skills; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.util.MobHealthbarUtils; +import com.gmail.nossr50.util.skills.ParticleEffectUtils; +import com.google.common.base.Objects; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class RuptureTask extends BukkitRunnable { + + public static final int FIVE_SECOND_DURATION = 20 * 5; + public static final int DAMAGE_TICK_INTERVAL = 10; + + private final @NotNull McMMOPlayer ruptureSource; + private final @NotNull LivingEntity targetEntity; + private final int ruptureRank; + private final int expireTick; + + private int ruptureTick; + private int damageTickTracker; + private final double damageValue; //TODO: Make configurable + + public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, int ruptureRank, double damageValue) { + this.ruptureSource = ruptureSource; + this.targetEntity = targetEntity; + this.ruptureRank = ruptureRank; + this.expireTick = FIVE_SECOND_DURATION; + this.damageValue = damageValue; + + this.ruptureTick = 0; + this.damageTickTracker = 0; + } + + @Override + public void run() { + //Check validity + if(targetEntity.isValid()) { + ruptureTick += 1; //Advance rupture tick by 1. + damageTickTracker += 1; //Increment damage tick tracker + + //Rupture hasn't ended yet + if(ruptureTick < expireTick) { + + //Is it time to damage? + if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { + damageTickTracker = 0; //Reset + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + + if(targetEntity.getHealth() > 0.01) { + double healthBeforeRuptureIsApplied = targetEntity.getHealth(); + double damagedHealth = healthBeforeRuptureIsApplied - getTickDamage(); + + if(damagedHealth <= 0) { + mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); + } else { + targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() + + //TODO: Do we need to set last damage? Double check + double finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); + + //Update health bars + MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); + + if(finalDamage <= 0) { + mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); + } else { + //Actually should this even be done? + targetEntity.setLastDamage(finalDamage); + } + } + } + } + } else { + explode(); + } + } else { + targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + this.cancel(); //Task no longer needed + } + } + + public void explode() { + ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + + if(ruptureSource.getPlayer() != null && ruptureSource.getPlayer().isValid()) { + targetEntity.damage(getExplosionDamage(), ruptureSource.getPlayer()); + } else { + targetEntity.damage(getExplosionDamage(), null); + } + + targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + this.cancel(); //Task no longer needed + } + + private double getTickDamage() { + double tickDamage = damageValue; + + if(targetEntity.getHealth() <= tickDamage) { + tickDamage = targetEntity.getHealth() - 0.01; + + if(tickDamage <= 0) { + tickDamage = 0; + } + } + + return tickDamage; + } + + private int getExplosionDamage() { + //TODO: Balance pass + return ruptureRank * 10; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RuptureTask that = (RuptureTask) o; + return ruptureRank == that.ruptureRank && expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.damageValue, damageValue) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); + } + + @Override + public int hashCode() { + return Objects.hashCode(ruptureSource, targetEntity, ruptureRank, expireTick, ruptureTick, damageTickTracker, damageValue); + } + + @Override + public String toString() { + return "RuptureTimerTask{" + + "ruptureSource=" + ruptureSource + + ", targetEntity=" + targetEntity + + ", ruptureRank=" + ruptureRank + + ", expireTick=" + expireTick + + ", ruptureTick=" + ruptureTick + + ", damageTickTracker=" + damageTickTracker + + ", damageValue=" + damageValue + + '}'; + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index c4d4b6a32..85f87ed51 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -29,7 +29,6 @@ import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import com.gmail.nossr50.util.text.StringUtils; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index 1c3fa3766..87efaffda 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -1,12 +1,15 @@ package com.gmail.nossr50.skills.swords; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; +import com.gmail.nossr50.datatypes.meta.RuptureTaskMeta; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.runnables.skills.RuptureTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; @@ -60,32 +63,50 @@ public class SwordsManager extends SkillManager { * * @param target The defending entity */ - public void ruptureCheck(@NotNull LivingEntity target) throws IllegalStateException { - if(BleedTimerTask.isBleedOperationAllowed()) { - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { + public void processRupture(@NotNull LivingEntity target) throws IllegalStateException { + if(target.hasMetadata(mcMMO.REPLANT_META_KEY)) { + if(mmoPlayer.isDebugMode()) { + mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTask ruptureTask = (RuptureTask) target.getMetadata(mcMMO.RUPTURE_META_KEY); + mmoPlayer.getPlayer().sendMessage(ruptureTask.toString()); + } - if (target instanceof Player) { - Player defender = (Player) target; + return; //Don't apply bleed + } - //Don't start or add to a bleed if they are blocking - if(defender.isBlocking()) - return; + if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { - if (NotificationManager.doesPlayerUseNotifications(defender)) { - if(!BleedTimerTask.isBleeding(defender)) - NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); - } - } + if (target instanceof Player) { + Player defender = (Player) target; - BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); + //Don't start or add to a bleed if they are blocking + if(defender.isBlocking()) + return; - if (mmoPlayer.useChatNotifications()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); + if (NotificationManager.doesPlayerUseNotifications(defender)) { + NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); } } + + double tickDamageValue = target instanceof Player ? AdvancedConfig.getInstance().getRuptureDamagePlayer() : AdvancedConfig.getInstance().getRuptureDamageMobs(); + + RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.SWORDS_RUPTURE), tickDamageValue); + RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); + + ruptureTask.runTaskTimer(mcMMO.p, 0, 1); + target.setMetadata(mcMMO.RUPTURE_META_KEY, ruptureTaskMeta); + +// if (mmoPlayer.useChatNotifications()) { +// NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); +// } } } + private int getRuptureRank() { + return RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); + } + public double getStabDamage() { int rank = RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_STAB); @@ -112,14 +133,8 @@ public class SwordsManager extends SkillManager { return 1; } - public int getRuptureBleedTicks() - { - int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); - - if(bleedTicks > Swords.bleedMaxTicks) - bleedTicks = Swords.bleedMaxTicks; - - return bleedTicks; + public int getRuptureBleedTicks() { + return RuptureTask.FIVE_SECOND_DURATION / RuptureTask.DAMAGE_TICK_INTERVAL; } /** diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index 859892c20..23a12081b 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -12,7 +12,6 @@ import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -168,21 +167,13 @@ public class TamingManager extends SkillManager { * @param damage The initial damage */ public double gore(@NotNull LivingEntity target, double damage) { - if(BleedTimerTask.isBleedOperationAllowed()) { - if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.TAMING_GORE, getPlayer())) { - return 0; - } +// if (target instanceof Player) { +// NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); +// } +// +// NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.Gore"); - BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1, 2); - - if (target instanceof Player) { - NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); - } - - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.Gore"); - - damage = (damage * Taming.goreModifier) - damage; - } + damage = (damage * Taming.goreModifier) - damage; return damage; } diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index b84e8c60e..6a55c5a43 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -33,6 +33,11 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); } + if(livingEntity.hasMetadata(mcMMO.REPLANT_META_KEY)) { + livingEntity.removeMetadata(mcMMO.REPLANT_META_KEY, pluginRef); + } + + //Cleanup mob metadata mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); } diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index f2ab26669..f28f6762e 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -12,7 +12,6 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.ArcheryManager; import com.gmail.nossr50.skills.axes.AxesManager; @@ -41,6 +40,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import java.util.EnumMap; import java.util.HashMap; @@ -96,7 +96,7 @@ public final class CombatUtils { if(target.getHealth() - event.getFinalDamage() >= 1) { if (swordsManager.canUseRupture()) { - swordsManager.ruptureCheck(target); + swordsManager.processRupture(target); } } @@ -714,7 +714,7 @@ public final class CombatUtils { NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); } - UserManager.getPlayer(attacker).getSwordsManager().ruptureCheck(target); + UserManager.getPlayer(attacker).getSwordsManager().processRupture(target); break; case AXES: diff --git a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java index 40fad662b..8d0f75937 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,17 +1,19 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.apache.commons.lang.math.RandomUtils; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.Arrays; + public final class ParticleEffectUtils { private ParticleEffectUtils() {} @@ -27,9 +29,40 @@ public final class ParticleEffectUtils { return; } - livingEntity.getWorld().playEffect(livingEntity.getEyeLocation(), Effect.STEP_SOUND, Material.REDSTONE_WIRE); + Location origin = livingEntity.getEyeLocation().clone(); + World world = origin.getWorld(); + + double x = origin.getX(); + double y = origin.getY(); + double z = origin.getZ(); + + double offSetVal = 0.3D; + + Location locA = new Location(world, x - offSetVal, y, z); + Location locB = new Location(world, x + offSetVal, y, z); + Location locC = new Location(world, x, y + offSetVal, z); + Location locD = new Location(world, x, y - offSetVal, z); + Location locE = new Location(world, x, y, z + offSetVal); + Location locF = new Location(world, x, y, z - offSetVal); + + Location locG = new Location(world, x + offSetVal, y, z + offSetVal); + Location locH = new Location(world, x - offSetVal, y, z - offSetVal); + Location locI = new Location(world, x - offSetVal, y - offSetVal, z - offSetVal); + Location locJ = new Location(world, x + offSetVal, y - offSetVal, z + offSetVal); + Location locK = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); + Location locL = new Location(world, x - offSetVal, y + offSetVal, z - offSetVal); + + Location[] particleLocations = new Location[]{ locA, locB, locC, locD, locE, locF, locG, locH, locI, locJ, locK, locL}; + + for(Location location : particleLocations) { + if(RandomUtils.nextInt(100) > 30) { + //TODO: Change + livingEntity.getWorld().playEffect(location, Effect.STEP_SOUND, Material.REDSTONE_WIRE); + } + } } + public static void playDodgeEffect(Player player) { if (!Config.getInstance().getDodgeEffectEnabled()) { return; diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index e9979909c..90a783a72 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -465,13 +465,7 @@ Skills: # DamageMobs: Bleeding damage dealt to mobs DamagePlayer: 2.0 DamageMobs: 3.0 - - # These settings determine how long the Bleeding effect lasts - MaxTicks: 8 - BaseTicks: 2 - CounterAttack: - # ChanceMax: Maximum chance of triggering a counter attack # MaxBonusLevel: On this level, the chance to Counter will be ChanceMax: 30.0 From affecfeeebb1d97bafab94661c12c2a193230e82 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:02:21 -0700 Subject: [PATCH 09/30] Added config options for Rupture and updated the Swords command --- Changelog.txt | 19 ++++- .../commands/skills/SwordsCommand.java | 48 +++++++----- .../gmail/nossr50/config/AdvancedConfig.java | 78 +++++++------------ .../nossr50/runnables/skills/RuptureTask.java | 65 ++++++++-------- .../gmail/nossr50/skills/swords/Swords.java | 2 - .../nossr50/skills/swords/SwordsManager.java | 9 ++- src/main/resources/advanced.yml | 46 ++++++++--- .../resources/locale/locale_en_US.properties | 6 +- 8 files changed, 149 insertions(+), 124 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 526ae90e8..89fef502a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,11 +1,26 @@ Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) - Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml - Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml Gore no longer applies Rupture Gore no longer sends a message to the Wolf owner when it triggers Gore no longer sends a message to players that are hit by it Rupture no longer sends a message telling you that your target is bleeding + Updated locale string 'Swords.SubSkill.Rupture.Description' + Updated locale string 'Swords.SubSkill.Rupture.Stat.Extra' + Updated locale string 'Swords.Combat.Rupture.Note' + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Mobs' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Mobs' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Players' to advanced.yml + Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Mobs' to advanced.yml + Removed 'Skills.Swords.Rupture.ChanceMax' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxBonusLevel.Standard' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxBonusLevel.RetroMode' from advanced.yml + Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml + Removed 'Skills.Swords.Rupture.DamagePlayer' from advanced.yml + Removed 'Skills.Swords.Rupture.DamageMobs' from advanced.yml NOTES: The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java index 1e6bf1d72..4ca8749e6 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; @@ -19,15 +20,16 @@ import java.util.List; public class SwordsCommand extends SkillCommand { private String counterChance; private String counterChanceLucky; - private int bleedLength; - private String bleedChance; - private String bleedChanceLucky; private String serratedStrikesLength; private String serratedStrikesLengthEndurance; + private String rupturePureTickDamageAgainstPlayers, rupturePureTickDamageAgainstMobs, + ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs, + ruptureLengthSecondsAgainstPlayers, ruptureLengthSecondsAgainstMobs, ruptureChanceToApply, ruptureChanceToApplyLucky; + private boolean canCounter; private boolean canSerratedStrike; - private boolean canBleed; + private boolean canRupture; public SwordsCommand() { super(PrimarySkillType.SWORDS); @@ -43,12 +45,19 @@ public class SwordsCommand extends SkillCommand { } // SWORDS_RUPTURE - if (canBleed) { - bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks(); + if (canRupture) { + int ruptureRank = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE); + ruptureLengthSecondsAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(true)); + ruptureLengthSecondsAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(false)); - String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE); - bleedChance = bleedStrings[0]; - bleedChanceLucky = bleedStrings[1]; + rupturePureTickDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(true, ruptureRank)); + rupturePureTickDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(false, ruptureRank)); + + ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank)); + ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank)); + + ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank)); + ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } // SERRATED STRIKES @@ -61,7 +70,7 @@ public class SwordsCommand extends SkillCommand { @Override protected void permissionsCheck(Player player) { - canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE); + canRupture = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE); canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK); canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player); } @@ -70,22 +79,21 @@ public class SwordsCommand extends SkillCommand { protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { List messages = new ArrayList<>(); - int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks(); - double ruptureDamagePlayers = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer(); - double ruptureDamageMobs = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs(); - if (canCounter) { messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : "")); } - if (canBleed) { - messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance) - + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : "")); + if (canRupture) { + messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, ruptureChanceToApply) + + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ruptureChanceToApplyLucky) : "")); messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE, - String.valueOf(ruptureTicks), - String.valueOf(ruptureDamagePlayers), - String.valueOf(ruptureDamageMobs))); + ruptureLengthSecondsAgainstPlayers, + ruptureLengthSecondsAgainstMobs, + rupturePureTickDamageAgainstPlayers, + rupturePureTickDamageAgainstMobs, + ruptureExplosionDamageAgainstPlayers, + ruptureExplosionDamageAgainstMobs)); messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); } diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index bb8f8167e..37784f28e 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -5,6 +5,9 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.mcMMO; import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -310,25 +313,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { } /* SWORDS */ - if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) { - reason.add("Skills.Swords.Rupture.ChanceMax should be at least 1!"); - } - - if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) { - reason.add("Skills.Swords.Rupture.MaxBonusLevel should be at least 1!"); - } - - if (getRuptureMaxTicks() < 1) { - reason.add("Skills.Swords.Rupture.MaxTicks should be at least 1!"); - } - - if (getRuptureMaxTicks() < getRuptureBaseTicks()) { - reason.add("Skills.Swords.Rupture.MaxTicks should be at least Skills.Swords.Rupture.BaseTicks!"); - } - - if (getRuptureBaseTicks() < 1) { - reason.add("Skills.Swords.Rupture.BaseTicks should be at least 1!"); - } if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); @@ -665,13 +649,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public double getGracefulRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); } /* ALCHEMY */ - /*public int getCatalysisUnlockLevel() { return config.getInt("Skills.Alchemy.Catalysis.UnlockLevel", 100); }*/ public int getCatalysisMaxBonusLevel() { return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); } public double getCatalysisMinSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); } public double getCatalysisMaxSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); } - //public int getConcoctionsTierLevel(Alchemy.Tier tier) { return config.getInt("Skills.Alchemy.Rank_Levels.Rank_" + rank); } /* ARCHERY */ public double getSkillShotRankDamageMultiplier() { return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); } @@ -700,7 +682,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { //Nothing to configure, everything is already configurable in config.yml /* FISHING */ - //public int getFishingTierLevel(int rank) { return config.getInt("Skills.Fishing.Rank_Levels.Rank_" + rank); } public double getShakeChance(int rank) { return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); } public int getFishingVanillaXPModifier(int rank) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); } @@ -712,9 +693,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public int getFishingReductionMaxWaitCap() { return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Max_Wait", 100);} public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); } - /*public int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); } - public int getMasterAnglerUnlockLevel() {return config.getInt("Skills.Fishing.MasterAngler.UnlockLevel", 125); }*/ public double getMasterAnglerBoatModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); } public double getMasterAnglerBiomeModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); } @@ -737,23 +716,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); } public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); } - /* Arcane Forging */ - //public int getArcaneForgingRankLevel(int rank) { return config.getInt("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank); } - public boolean getArcaneForgingEnchantLossEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); } public double getArcaneForgingKeepEnchantsChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); } public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); } public double getArcaneForgingDowngradeChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); } - /* SALVAGE */ - //public double getSalvageMaxPercentage() { return config.getDouble("Skills.Salvage.MaxPercentage", 100.0D); } - //public int getSalvageMaxPercentageLevel() { return config.getInt("Skills.Salvage.MaxPercentageLevel", 1000); } - public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); } public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); } - //public int getArcaneSalvageRankLevel(int rank) { return config.getInt("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank); } public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); } public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); } @@ -765,19 +736,35 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { return config.getInt("Skills.Smelting.FuelEfficiency.Standard.MaxBonusLevel", 100); } - /*public int getFluxMiningUnlockLevel() { return config.getInt("Skills.Smelting.FluxMining.UnlockLevel", 250); }*/ public double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); } - public int getSmeltingRankLevel(int rank) { return config.getInt("Skills.Smelting.Rank_Levels.Rank_" + rank); } - - public int getSmeltingVanillaXPBoostMultiplier(int rank) { return config.getInt("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank); } - /* SWORDS */ - public double getRuptureDamagePlayer() { return config.getDouble("Skills.Swords.Rupture.DamagePlayer", 1.0); } - public double getRuptureDamageMobs() { return config.getDouble("Skills.Swords.Rupture.DamageMobs", 2.0); } + public double getRuptureTickDamage(boolean isTargetPlayer, int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + String key = root + targetType + ".Rank_" + rank; - public int getRuptureMaxTicks() { return config.getInt("Skills.Swords.Rupture.MaxTicks", 8); } - public int getRuptureBaseTicks() { return config.getInt("Skills.Swords.Rupture.BaseTicks", 2); } + return config.getDouble(key, 1.0D); + } + + public int getRuptureDurationSeconds(boolean isTargetPlayer) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + return config.getInt(root + targetType, 5); + } + + public double getRuptureExplosionDamage(boolean isTargetPlayer, int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_"; + String targetType = isTargetPlayer ? "Players" : "Mobs"; + String key = root + targetType + ".Rank_" + rank; + + return config.getDouble(key, 40.0D); + } + + public double getRuptureChanceToApplyOnHit(int rank) { + String root = "Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit.Rank_"; + return config.getDouble(root + rank, 33); + } public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); } @@ -785,24 +772,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); } /* TAMING */ - //public int getGoreRuptureTicks() { return config.getInt("Skills.Taming.Gore.RuptureTicks", 2); } public double getGoreModifier() { return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); } - /*public int getFastFoodUnlock() { return config.getInt("Skills.Taming.FastFood.UnlockLevel", 50); }*/ public double getFastFoodChance() { return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); } public double getPummelChance() { return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); } - //public int getEnviromentallyAwareUnlock() { return config.getInt("Skills.Taming.EnvironmentallyAware.UnlockLevel", 100); } - - /*public int getThickFurUnlock() { return config.getInt("Skills.Taming.ThickFur.UnlockLevel", 250); }*/ public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); } - /*public int getHolyHoundUnlock() {return config.getInt("Skills.Taming.HolyHound.UnlockLevel", 375); }*/ - - /*public int getShockProofUnlock() { return config.getInt("Skills.Taming.ShockProof.UnlockLevel", 500); }*/ public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); } - /*public int getSharpenedClawsUnlock() { return config.getInt("Skills.Taming.SharpenedClaws.UnlockLevel", 750); }*/ public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); } public double getMinHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 681578577..4ef254b57 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -1,37 +1,38 @@ package com.gmail.nossr50.runnables.skills; +import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.MobHealthbarUtils; import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.google.common.base.Objects; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; public class RuptureTask extends BukkitRunnable { - public static final int FIVE_SECOND_DURATION = 20 * 5; public static final int DAMAGE_TICK_INTERVAL = 10; private final @NotNull McMMOPlayer ruptureSource; private final @NotNull LivingEntity targetEntity; - private final int ruptureRank; private final int expireTick; private int ruptureTick; private int damageTickTracker; - private final double damageValue; //TODO: Make configurable + private final double pureTickDamage; //TODO: Make configurable + private final double explosionDamage; //TODO: Make configurable - public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, int ruptureRank, double damageValue) { + public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { this.ruptureSource = ruptureSource; this.targetEntity = targetEntity; - this.ruptureRank = ruptureRank; - this.expireTick = FIVE_SECOND_DURATION; - this.damageValue = damageValue; + this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player); this.ruptureTick = 0; this.damageTickTracker = 0; + this.pureTickDamage = pureTickDamage; + this.explosionDamage = explosionDamage; } @Override @@ -48,10 +49,11 @@ public class RuptureTask extends BukkitRunnable { if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { damageTickTracker = 0; //Reset ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + double finalDamage = 0; //Used for mob health bars and setting last damage if(targetEntity.getHealth() > 0.01) { double healthBeforeRuptureIsApplied = targetEntity.getHealth(); - double damagedHealth = healthBeforeRuptureIsApplied - getTickDamage(); + double damagedHealth = healthBeforeRuptureIsApplied - calculateAdjustedTickDamage(); if(damagedHealth <= 0) { mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); @@ -59,10 +61,7 @@ public class RuptureTask extends BukkitRunnable { targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() //TODO: Do we need to set last damage? Double check - double finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); - - //Update health bars - MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); + finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); if(finalDamage <= 0) { mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); @@ -72,6 +71,9 @@ public class RuptureTask extends BukkitRunnable { } } } + + //Update Health bars + MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); } } else { explode(); @@ -95,8 +97,8 @@ public class RuptureTask extends BukkitRunnable { this.cancel(); //Task no longer needed } - private double getTickDamage() { - double tickDamage = damageValue; + private double calculateAdjustedTickDamage() { + double tickDamage = pureTickDamage; if(targetEntity.getHealth() <= tickDamage) { tickDamage = targetEntity.getHealth() - 0.01; @@ -109,9 +111,21 @@ public class RuptureTask extends BukkitRunnable { return tickDamage; } - private int getExplosionDamage() { - //TODO: Balance pass - return ruptureRank * 10; + private double getExplosionDamage() { + return explosionDamage; + } + + @Override + public String toString() { + return "RuptureTask{" + + "ruptureSource=" + ruptureSource + + ", targetEntity=" + targetEntity + + ", expireTick=" + expireTick + + ", ruptureTick=" + ruptureTick + + ", damageTickTracker=" + damageTickTracker + + ", pureTickDamage=" + pureTickDamage + + ", explosionDamage=" + explosionDamage + + '}'; } @Override @@ -119,24 +133,11 @@ public class RuptureTask extends BukkitRunnable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; RuptureTask that = (RuptureTask) o; - return ruptureRank == that.ruptureRank && expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.damageValue, damageValue) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); + return expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.pureTickDamage, pureTickDamage) == 0 && Double.compare(that.explosionDamage, explosionDamage) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); } @Override public int hashCode() { - return Objects.hashCode(ruptureSource, targetEntity, ruptureRank, expireTick, ruptureTick, damageTickTracker, damageValue); - } - - @Override - public String toString() { - return "RuptureTimerTask{" + - "ruptureSource=" + ruptureSource + - ", targetEntity=" + targetEntity + - ", ruptureRank=" + ruptureRank + - ", expireTick=" + expireTick + - ", ruptureTick=" + ruptureTick + - ", damageTickTracker=" + damageTickTracker + - ", damageValue=" + damageValue + - '}'; + return Objects.hashCode(ruptureSource, targetEntity, expireTick, ruptureTick, damageTickTracker, pureTickDamage, explosionDamage); } } diff --git a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java index c15d05ab7..0c2bd8fad 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java @@ -3,8 +3,6 @@ package com.gmail.nossr50.skills.swords; import com.gmail.nossr50.config.AdvancedConfig; public class Swords { - public static int bleedMaxTicks = AdvancedConfig.getInstance().getRuptureMaxTicks(); - public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier(); public static double serratedStrikesModifier = AdvancedConfig.getInstance().getSerratedStrikesModifier(); diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index 87efaffda..a24ee24e4 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -89,9 +89,10 @@ public class SwordsManager extends SkillManager { } } - double tickDamageValue = target instanceof Player ? AdvancedConfig.getInstance().getRuptureDamagePlayer() : AdvancedConfig.getInstance().getRuptureDamageMobs(); + RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, + AdvancedConfig.getInstance().getRuptureTickDamage(target instanceof Player, getRuptureRank()), + AdvancedConfig.getInstance().getRuptureExplosionDamage(target instanceof Player, getRuptureRank())); - RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.SWORDS_RUPTURE), tickDamageValue); RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); ruptureTask.runTaskTimer(mcMMO.p, 0, 1); @@ -133,8 +134,8 @@ public class SwordsManager extends SkillManager { return 1; } - public int getRuptureBleedTicks() { - return RuptureTask.FIVE_SECOND_DURATION / RuptureTask.DAMAGE_TICK_INTERVAL; + public int getRuptureBleedTicks(boolean isTargetPlayer) { + return AdvancedConfig.getInstance().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL; } /** diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 90a783a72..2bf6ebf2f 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -454,17 +454,41 @@ Skills: ### Swords: Rupture: - # ChanceMax: Maximum chance of triggering bleeding - # MaxBonusLevel: On this level, the chance to cause Bleeding will be - ChanceMax: 33.0 - MaxBonusLevel: - Standard: 100 - RetroMode: 1000 - - # DamagePlayer: Bleeding damage dealt to players - # DamageMobs: Bleeding damage dealt to mobs - DamagePlayer: 2.0 - DamageMobs: 3.0 + Rupture_Mechanics: + # This is % chance, 15 would mean 15% percent of the time + Chance_To_Apply_On_Hit: + Rank_1: 15 + Rank_2: 33 + Rank_3: 40 + Rank_4: 66 + Duration_In_Seconds: + Against_Players: 5 + Against_Mobs: 5 + # Tick interval damage is applied twice a second during rupture, it is "pure" and does not get lowered from armor or absorption etc + Tick_Interval_Damage: + Against_Players: + Rank_1: 0.1 + Rank_2: 0.15 + Rank_3: 0.2 + Rank_4: 0.3 + Against_Mobs: + Rank_1: 0.5 + Rank_2: 0.75 + Rank_3: 0.9 + Rank_4: 1 + # If Rupture runs for 5 seconds without being reapplied, it explodes + # this damage is **NOT** pure and is reduced dramatically vs armor/absorption/etc + Explosion_Damage: + Against_Players: + Rank_1: 10 + Rank_2: 20 + Rank_3: 30 + Rank_4: 40 + Against_Mobs: + Rank_1: 10 + Rank_2: 20 + Rank_3: 30 + Rank_4: 40 CounterAttack: # ChanceMax: Maximum chance of triggering a counter attack # MaxBonusLevel: On this level, the chance to Counter will be diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 3038d17b1..4e702d860 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick happens every 0.5 seconds! +Swords.Combat.Rupture.Note=&7NOTE: Pure tick damage is dealt twice a second during Rupture and bypasses resistances but IS never lethal, an explosion goes off after 5 seconds with is reduced by armor and other resistances. Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -420,7 +420,7 @@ Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes Swords.SubSkill.SerratedStrikes.Description=Deal partial damage in an AOE with a chance to apply Rupture! Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length Swords.SubSkill.Rupture.Name=Rupture -Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT +Swords.SubSkill.Rupture.Description=A damage over time effect that ends explosively Swords.SubSkill.Stab.Name=Stab Swords.SubSkill.Stab.Description=Adds bonus damage to your attacks. Swords.SubSkill.Stab.Stat=Stab Damage @@ -428,7 +428,7 @@ Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG Swords.SubSkill.Rupture.Stat=Rupture Chance -Swords.SubSkill.Rupture.Stat.Extra=Rupture: &a{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] +Swords.SubSkill.Rupture.Stat.Extra=Rupture: Duration in seconds: &a{0} vs Players, {1} vs Mobs. Pure Tick Damage: {2} vs Players, {3} vs Mobs. Explosion Damage: {4} vs Players, {5} vs Mobs Swords.Effect.4=Serrated Strikes Rupture+ Swords.Effect.5={0} Tick Rupture Swords.Listener=Swords: From a58a3d91dce388387fa1e8b8a8d7068c73928846 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:13:54 -0700 Subject: [PATCH 10/30] tweak locale / command output --- Changelog.txt | 2 ++ .../com/gmail/nossr50/commands/skills/SwordsCommand.java | 9 ++++----- src/main/resources/locale/locale_en_US.properties | 6 ++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 89fef502a..46a178ee0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,8 @@ Version 2.1.186 Updated locale string 'Swords.SubSkill.Rupture.Description' Updated locale string 'Swords.SubSkill.Rupture.Stat.Extra' Updated locale string 'Swords.Combat.Rupture.Note' + Added locale string 'Swords.SubSkill.Rupture.Stat.TickDamage' + Added locale string 'Swords.SubSkill.Rupture.Stat.ExplosionDamage' Added 'Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit' to advanced.yml Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Players' to advanced.yml Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Mobs' to advanced.yml diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java index 4ca8749e6..3fbe8726f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -89,11 +89,10 @@ public class SwordsCommand extends SkillCommand { + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ruptureChanceToApplyLucky) : "")); messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE, ruptureLengthSecondsAgainstPlayers, - ruptureLengthSecondsAgainstMobs, - rupturePureTickDamageAgainstPlayers, - rupturePureTickDamageAgainstMobs, - ruptureExplosionDamageAgainstPlayers, - ruptureExplosionDamageAgainstMobs)); + ruptureLengthSecondsAgainstMobs)); + + messages.add(LocaleLoader.getString("Swords.SubSkill.Rupture.Stat.TickDamage", rupturePureTickDamageAgainstPlayers, rupturePureTickDamageAgainstMobs)); + messages.add(LocaleLoader.getString("Swords.SubSkill.Rupture.Stat.ExplosionDamage", ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs)); messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 4e702d860..64aab7ea8 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7NOTE: Pure tick damage is dealt twice a second during Rupture and bypasses resistances but IS never lethal, an explosion goes off after 5 seconds with is reduced by armor and other resistances. +Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is dealt twice a second and bypasses armor, explosion damage does not Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -428,7 +428,9 @@ Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG Swords.SubSkill.Rupture.Stat=Rupture Chance -Swords.SubSkill.Rupture.Stat.Extra=Rupture: Duration in seconds: &a{0} vs Players, {1} vs Mobs. Pure Tick Damage: {2} vs Players, {3} vs Mobs. Explosion Damage: {4} vs Players, {5} vs Mobs +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Rupture Duration: &e{0}&a vs Players, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]Rupture Pure Tick Damage: &e{0}&a vs Players, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Rupture Explosion Damage: &e{0}&a vs Players, &e{1}&a vs Mobs Swords.Effect.4=Serrated Strikes Rupture+ Swords.Effect.5={0} Tick Rupture Swords.Listener=Swords: From 48afb81174145810961604e5a86aa6cfd0f50629 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 12:16:40 -0700 Subject: [PATCH 11/30] Another locale tweak --- src/main/resources/locale/locale_en_US.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 64aab7ea8..7d827f50e 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable! #SWORDS Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Ready=&3You &6ready&3 your Sword. -Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is dealt twice a second and bypasses armor, explosion damage does not +Swords.Combat.Rupture.Note=&7(Rupture Note): Periodic damage is non-lethal occuring twice a second and bypasses armor, explosion damage is lethal and does not bypass armor/resistances Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding=&a**ENEMY BLEEDING** @@ -428,7 +428,7 @@ Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG Swords.SubSkill.Rupture.Stat=Rupture Chance -Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Rupture Duration: &e{0}&a vs Players, &e{1}&a vs Mobs. +Swords.SubSkill.Rupture.Stat.Extra=[[DARK_AQUA]]Rupture Duration: &e{0}s&a vs Players, &e{1}s&a vs Mobs. Swords.SubSkill.Rupture.Stat.TickDamage=[[DARK_AQUA]]Rupture Pure Tick Damage: &e{0}&a vs Players, &e{1}&a vs Mobs. Swords.SubSkill.Rupture.Stat.ExplosionDamage=[[DARK_AQUA]]Rupture Explosion Damage: &e{0}&a vs Players, &e{1}&a vs Mobs Swords.Effect.4=Serrated Strikes Rupture+ From 002887e24421c7bd0d130996d74a8a6a5455bb0a Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 3 Apr 2021 03:47:43 +0200 Subject: [PATCH 12/30] Sanitize ability buffs when using Item Frames (#4475) * Remove skill ability buffs from items when placed into Item Frames * Ensure compatibility on versions before 1.16 --- .../nossr50/listeners/PlayerListener.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 7a8262600..b8b9153c2 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -973,6 +973,43 @@ public class PlayerListener implements Listener { } } } + + /** + * When a {@link Player} attempts to place an {@link ItemStack} + * into an {@link ItemFrame}, we want to make sure to remove any + * Ability buffs from that item. + * + * @param event The {@link PlayerInteractEntityEvent} to handle + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + /* + * We can check for an instance instead of EntityType here, so we are + * ready for the infamous "Glow Item Frame" in 1.17 too! + */ + if (event.getRightClicked() instanceof ItemFrame) { + ItemFrame frame = (ItemFrame) event.getRightClicked(); + + // Check for existing items (ignore rotations) + if (frame.getItem().getType() != Material.AIR) { + return; + } + + // Get the item the Player is about to place + ItemStack itemInHand; + + if (event.getHand() == EquipmentSlot.OFF_HAND) { + itemInHand = event.getPlayer().getInventory().getItemInOffHand(); + } + else { + itemInHand = event.getPlayer().getInventory().getItemInMainHand(); + } + + // and remove any skill ability buffs! + SkillUtils.removeAbilityBuff(itemInHand); + } + } + // // @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) // public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) { From a2ee4be86a7719d768ccb7bf93af2458ee85b31f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:31:19 -0700 Subject: [PATCH 13/30] Fix some bugs with Rupture and fix a small memory leak --- Changelog.txt | 4 ++- .../commands/skills/MmoInfoCommand.java | 1 - .../commands/skills/SwordsCommand.java | 3 +- .../gmail/nossr50/config/AdvancedConfig.java | 3 -- .../nossr50/listeners/EntityListener.java | 6 +++- .../nossr50/listeners/PlayerListener.java | 1 + src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../nossr50/runnables/skills/RuptureTask.java | 28 ++++++++----------- .../nossr50/skills/swords/SwordsManager.java | 13 +++++---- .../gmail/nossr50/util/MobHealthbarUtils.java | 2 +- .../nossr50/util/TransientMetadataTools.java | 12 +++++--- .../nossr50/util/skills/CombatUtils.java | 5 ++-- .../util/skills/ParticleEffectUtils.java | 9 +++--- 13 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 46a178ee0..5d8e8ce0f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,7 @@ Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) + Fixed an exploit involving enchantments (thanks TheBusyBiscuit) + Fixed a very small memory leak that would only happen in very rare situations Gore no longer applies Rupture Gore no longer sends a message to the Wolf owner when it triggers Gore no longer sends a message to players that are hit by it @@ -27,7 +29,7 @@ Version 2.1.186 NOTES: The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem Targets will bleed and take "pure" damage while bleeding, this never kills the target. It will reduce them to 0.01 HP. - After 5 seconds since your last attack on the target have transpired Rupture "explodes" dealing a large amount of damage, this damage is not pure and is affected by armor etc. + After 5 seconds of not applying Rupture on the target Rupture explodes dealing a large amount of damage, this damage is not pure and is affected by armor etc. Rupture no longer tells you that you that you applied it to the target, it should be obvious from the sounds/particle effects The new Rupture no longer constantly interferes with the vanilla Swipe (the AOE attack built into Minecraft) The new Rupture has not had a fine tuned balance pass, I will be balancing it frequently after this patch, it may be too weak or too strong in its current form diff --git a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java index 0169c3918..e724ee8cd 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.listeners.InteractionManager; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.Permissions; diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java index 3fbe8726f..69a5e86ec 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.commands.skills; import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; @@ -56,7 +55,7 @@ public class SwordsCommand extends SkillCommand { ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank)); ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank)); - ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank)); + ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) + "%"); ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33); } diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 37784f28e..7e6f8e8a3 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -5,9 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.mcMMO; import net.md_5.bungee.api.ChatColor; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 414bbde52..f01a13d71 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -489,6 +489,10 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; + if(event.getEntity().hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { + event.getEntity().removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, mcMMO.p); + } + if(event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); @@ -661,7 +665,7 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onEntityDeathLowest(EntityDeathEvent event) { - mcMMO.getTransientMetadataTools().cleanAllMobMetadata(event.getEntity()); + mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getEntity()); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index b8b9153c2..481258b96 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -546,6 +546,7 @@ public class PlayerListener implements Listener { //Use a sync save if the server is shutting down to avoid race conditions mcMMOPlayer.logout(mcMMO.isServerShutdownExecuted()); + mcMMO.getTransientMetadataTools().cleanAllLivingEntityMetadata(event.getPlayer()); } /** diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 9e442355b..cdeb9768b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -125,6 +125,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String REPLANT_META_KEY = "mcMMO: Recently Replanted"; + public static final String EXPLOSION_FROM_RUPTURE = "mcMMO: Rupture Explosion"; public static final String RUPTURE_META_KEY = "mcMMO: RuptureTask"; public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; public static final String DODGE_TRACKER = "mcMMO: Dodge Tracker"; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java index 4ef254b57..9e4f3ee2b 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java @@ -8,6 +8,7 @@ import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.google.common.base.Objects; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; @@ -27,7 +28,7 @@ public class RuptureTask extends BukkitRunnable { public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) { this.ruptureSource = ruptureSource; this.targetEntity = targetEntity; - this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player); + this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player) * 20; this.ruptureTick = 0; this.damageTickTracker = 0; @@ -44,12 +45,10 @@ public class RuptureTask extends BukkitRunnable { //Rupture hasn't ended yet if(ruptureTick < expireTick) { - //Is it time to damage? if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { damageTickTracker = 0; //Reset ParticleEffectUtils.playBleedEffect(targetEntity); //Animate - double finalDamage = 0; //Used for mob health bars and setting last damage if(targetEntity.getHealth() > 0.01) { double healthBeforeRuptureIsApplied = targetEntity.getHealth(); @@ -59,21 +58,8 @@ public class RuptureTask extends BukkitRunnable { mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); } else { targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() - - //TODO: Do we need to set last damage? Double check - finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); - - if(finalDamage <= 0) { - mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); - } else { - //Actually should this even be done? - targetEntity.setLastDamage(finalDamage); - } } } - - //Update Health bars - MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p); } } else { explode(); @@ -84,8 +70,15 @@ public class RuptureTask extends BukkitRunnable { } } + public void refreshRupture() { + damageTickTracker = DAMAGE_TICK_INTERVAL; + ruptureTick = 0; + } + public void explode() { - ParticleEffectUtils.playBleedEffect(targetEntity); //Animate + targetEntity.setMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, new FixedMetadataValue(mcMMO.p, "null")); + + ParticleEffectUtils.playGreaterImpactEffect(targetEntity); //Animate if(ruptureSource.getPlayer() != null && ruptureSource.getPlayer().isValid()) { targetEntity.damage(getExplosionDamage(), ruptureSource.getPlayer()); @@ -94,6 +87,7 @@ public class RuptureTask extends BukkitRunnable { } targetEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, mcMMO.p); + this.cancel(); //Task no longer needed } diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index a24ee24e4..66d285934 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -63,19 +63,20 @@ public class SwordsManager extends SkillManager { * * @param target The defending entity */ - public void processRupture(@NotNull LivingEntity target) throws IllegalStateException { - if(target.hasMetadata(mcMMO.REPLANT_META_KEY)) { + public void processRupture(@NotNull LivingEntity target) { + if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + if(mmoPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); - RuptureTask ruptureTask = (RuptureTask) target.getMetadata(mcMMO.RUPTURE_META_KEY); - mmoPlayer.getPlayer().sendMessage(ruptureTask.toString()); + mmoPlayer.getPlayer().sendMessage(ruptureTaskMeta.getRuptureTimerTask().toString()); } + ruptureTaskMeta.getRuptureTimerTask().refreshRupture(); return; //Don't apply bleed } - if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) { + if (RandomChanceUtil.rollDice(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(getRuptureRank()), 100)) { if (target instanceof Player) { Player defender = (Player) target; diff --git a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java index 57c7afe92..9c1f6b76e 100644 --- a/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java +++ b/src/main/java/com/gmail/nossr50/util/MobHealthbarUtils.java @@ -131,7 +131,7 @@ public final class MobHealthbarUtils { return null; } - int coloredDisplay = (int) Math.ceil(fullDisplay * (healthPercentage / 100.0D)); + int coloredDisplay = (int) Math.max(Math.ceil(fullDisplay * (healthPercentage / 100.0D)), 0.5); int grayDisplay = fullDisplay - coloredDisplay; StringBuilder healthbar = new StringBuilder(color + ""); diff --git a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java index 6a55c5a43..b32945525 100644 --- a/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java +++ b/src/main/java/com/gmail/nossr50/util/TransientMetadataTools.java @@ -2,16 +2,17 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.mcMMO; import org.bukkit.entity.LivingEntity; +import org.jetbrains.annotations.NotNull; public class TransientMetadataTools { public static final String OLD_NAME_METAKEY = TransientMetadataTools.OLD_NAME_METAKEY; private final mcMMO pluginRef; - public TransientMetadataTools(mcMMO pluginRef) { + public TransientMetadataTools(@NotNull mcMMO pluginRef) { this.pluginRef = pluginRef; } - public void cleanAllMobMetadata(LivingEntity livingEntity) { + public void cleanAllLivingEntityMetadata(@NotNull LivingEntity livingEntity) { //Since its not written anywhere, apparently the GC won't touch objects with metadata still present on them if (livingEntity.hasMetadata(mcMMO.customNameKey)) { livingEntity.setCustomName(livingEntity.getMetadata(mcMMO.customNameKey).get(0).asString()); @@ -33,10 +34,13 @@ public class TransientMetadataTools { livingEntity.removeMetadata(mcMMO.travelingBlock, pluginRef); } - if(livingEntity.hasMetadata(mcMMO.REPLANT_META_KEY)) { - livingEntity.removeMetadata(mcMMO.REPLANT_META_KEY, pluginRef); + if(livingEntity.hasMetadata(mcMMO.RUPTURE_META_KEY)) { + livingEntity.removeMetadata(mcMMO.RUPTURE_META_KEY, pluginRef); } + if(livingEntity.hasMetadata(mcMMO.EXPLOSION_FROM_RUPTURE)) { + livingEntity.removeMetadata(mcMMO.EXPLOSION_FROM_RUPTURE, pluginRef); + } //Cleanup mob metadata mcMMO.getCompatibilityManager().getPersistentDataLayer().removeMobFlags(livingEntity); diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index f28f6762e..615ad89eb 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -12,6 +12,7 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.ArcheryManager; import com.gmail.nossr50.skills.axes.AxesManager; @@ -40,7 +41,6 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.gmail.nossr50.runnables.skills.AwardCombatXpTask; import java.util.EnumMap; import java.util.HashMap; @@ -93,8 +93,7 @@ public final class CombatUtils { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.SWORDS); } - if(target.getHealth() - event.getFinalDamage() >= 1) - { + if(target.getHealth() - event.getFinalDamage() > 0) { if (swordsManager.canUseRupture()) { swordsManager.processRupture(target); } diff --git a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java index 8d0f75937..f63b5dd83 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ParticleEffectUtils.java @@ -1,19 +1,18 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import org.apache.commons.lang.math.RandomUtils; -import org.bukkit.*; +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Arrays; - public final class ParticleEffectUtils { private ParticleEffectUtils() {} From d25784bf4145fb9bc7a8f014cb47a1bfbe35b03c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:33:48 -0700 Subject: [PATCH 14/30] Give XP when sneaking for bushes --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/listeners/PlayerListener.java | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5d8e8ce0f..e92404700 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -2,6 +2,7 @@ Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) Fixed an exploit involving enchantments (thanks TheBusyBiscuit) Fixed a very small memory leak that would only happen in very rare situations + Fixed a bug where XP wasn't granted while sneaking and interacting with a berry bush Gore no longer applies Rupture Gore no longer sends a message to the Wolf owner when it triggers Gore no longer sends a message to players that are hit by it diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 481258b96..bf4b3faa0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -849,9 +849,7 @@ public class PlayerListener implements Listener { } } } else { - if(!event.getPlayer().isSneaking()) { - herbalismManager.processBerryBushHarvesting(blockState); - } + herbalismManager.processBerryBushHarvesting(blockState); } } break; From 3e60dfcf989020951f1905160864eb1579edbbf7 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 2 Apr 2021 20:37:05 -0700 Subject: [PATCH 15/30] 2.1.186 --- Changelog.txt | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index e92404700..6fb6bce10 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -34,6 +34,9 @@ Version 2.1.186 Rupture no longer tells you that you that you applied it to the target, it should be obvious from the sounds/particle effects The new Rupture no longer constantly interferes with the vanilla Swipe (the AOE attack built into Minecraft) The new Rupture has not had a fine tuned balance pass, I will be balancing it frequently after this patch, it may be too weak or too strong in its current form + Rupture does not stack between players, whoever applied Rupture first determines its strength, this will change in the future (Stronger Ruptures will overwrite weaker ones) + When you reapply rupture it immediately triggers a damage tick + Version 2.1.185 diff --git a/pom.xml b/pom.xml index c595513b0..6a7cbf897 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.186-SNAPSHOT + 2.1.186 mcMMO https://github.com/mcMMO-Dev/mcMMO From e8577e4a9e3c045dd87e8115bdd120151d604490 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:46:01 -0700 Subject: [PATCH 16/30] Fix ClassCastException for Rupture Fixes #4476 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java | 2 +- .../java/com/gmail/nossr50/skills/swords/SwordsManager.java | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6fb6bce10..545e4df50 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.187 + Fixed a ClassCastException error involving Rupture + Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) Fixed an exploit involving enchantments (thanks TheBusyBiscuit) diff --git a/pom.xml b/pom.xml index 6a7cbf897..4c017cff6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.186 + 2.1.187-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index 94face6c1..ec2ff905d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -1081,7 +1081,7 @@ public class McMMOPlayer implements Identified { public void logout(boolean syncSave) { Player thisPlayer = getPlayer(); if(getPlayer().hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(mcMMO.RUPTURE_META_KEY).get(0); //Punish a logout ruptureTaskMeta.getRuptureTimerTask().explode(); diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index 66d285934..d6d07b62e 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -65,7 +65,7 @@ public class SwordsManager extends SkillManager { */ public void processRupture(@NotNull LivingEntity target) { if(target.hasMetadata(mcMMO.RUPTURE_META_KEY)) { - RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY); + RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) target.getMetadata(mcMMO.RUPTURE_META_KEY).get(0); if(mmoPlayer.isDebugMode()) { mmoPlayer.getPlayer().sendMessage("Rupture task ongoing for target " + target.toString()); From 716272fefcffed9ce039c0a8a43c3efc0ed47bd0 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:46:41 -0700 Subject: [PATCH 17/30] 2.1.187 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4c017cff6..2da80d8f9 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.187-SNAPSHOT + 2.1.187 mcMMO https://github.com/mcMMO-Dev/mcMMO From fe713c9931f4b269be890d51ca61d1cc8a0cde2f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 3 Apr 2021 09:53:34 -0700 Subject: [PATCH 18/30] dev mode --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2da80d8f9..a10e1f840 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.187 + 2.1.188-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From db55635f0dec5eee1bd6dde0c4bc80218446404c Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 4 Apr 2021 18:23:13 -0700 Subject: [PATCH 19/30] Tweak UP warning --- src/main/java/com/gmail/nossr50/mcMMO.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index cdeb9768b..7f05b0732 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -148,9 +148,6 @@ public class mcMMO extends JavaPlugin { public static FixedMetadataValue metadataValue; public static final String ULTRA_PERMISSONS = "UltraPermissons"; - public static final String UP_WARNING_2 = "Stop using " + ULTRA_PERMISSONS + " with mcMMO immediately!"; - public static final String UP_WARNING_1 = "mcMMO has detected " + ULTRA_PERMISSONS + " on your server, users have reported a severe plugin conflict between these two plugins which severely degrades server performance"; - public static final String UP_WARNING_3 = "The author of UltraPermissions has passed away and its unlikely this issue will ever be solved"; public mcMMO() { p = this; @@ -271,15 +268,7 @@ public class mcMMO extends JavaPlugin { } if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - Bukkit.getScheduler().runTaskTimer(this, () -> { - getLogger().severe(UP_WARNING_1); - getLogger().severe(UP_WARNING_2); - getLogger().severe(UP_WARNING_3); - - Bukkit.broadcastMessage(UP_WARNING_1); - Bukkit.broadcastMessage(UP_WARNING_2); - Bukkit.broadcastMessage(UP_WARNING_3); - }, 0L, 1200L); + getLogger().info("mcMMO has detected UltraPermissions is running, make sure to keep both mcMMO and UltraPermissions updated as older versions of UltraPermissions had performance degradation issues when used in conjunction with mcMMO"); } } From 3b7f416ed99b281436713ecf1a0a6feb072e0f26 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 12:39:49 -0700 Subject: [PATCH 20/30] Up default ShakeChance and remove useless entries --- Changelog.txt | 6 ++++++ src/main/resources/advanced.yml | 9 +-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 545e4df50..b3306a5f5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,11 @@ Version 2.1.187 Fixed a ClassCastException error involving Rupture + Default Shake chance increased from 15% to 30% (update advanced.yml manually or delete the file to regenerate it and receive these changes) + Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, these entries were a mistake) + Modified the warning about UltraPermissions + + NOTES: + The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index 2bf6ebf2f..2ff9795d4 100644 --- a/src/main/resources/advanced.yml +++ b/src/main/resources/advanced.yml @@ -206,14 +206,7 @@ Skills: Fishing: ShakeChance: - Rank_1: 15.0 - Rank_2: 15.0 - Rank_3: 25.0 - Rank_4: 35.0 - Rank_5: 45.0 - Rank_6: 55.0 - Rank_7: 65.0 - Rank_8: 75.0 + Rank_1: 30 # VanillaXPMultiplier: Vanilla XP gained from fishing is multiplied by these values. VanillaXPMultiplier: From c5f46665250ca56d8f574747625a97fe243768e1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 12:47:03 -0700 Subject: [PATCH 21/30] Fixing Shake showing the wrong chance to succeed --- Changelog.txt | 1 + .../java/com/gmail/nossr50/skills/fishing/FishingManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index b3306a5f5..30e41741c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.187 Fixed a ClassCastException error involving Rupture + Fixed a bug where /fishing was showing the wrong shake chance Default Shake chance increased from 15% to 30% (update advanced.yml manually or delete the file to regenerate it and receive these changes) Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, these entries were a mistake) Modified the warning about UltraPermissions diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java index b64de6a37..22f8eecc7 100644 --- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java @@ -198,7 +198,7 @@ public class FishingManager extends SkillManager { } public double getShakeChance() { - return AdvancedConfig.getInstance().getShakeChance(getLootTier()); + return AdvancedConfig.getInstance().getShakeChance(RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.FISHING_SHAKE)); } protected int getVanillaXPBoostModifier() { From 2d11b7befcdb3b3125c2aab22b05a12306812e90 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:41:37 -0700 Subject: [PATCH 22/30] Fixed treasures only requiring level 0 --- Changelog.txt | 9 +- .../config/treasure/TreasureConfig.java | 117 +++++++++++++----- src/main/resources/treasures.yml | 62 +++++----- 3 files changed, 126 insertions(+), 62 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 30e41741c..8811d09a8 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,13 +1,18 @@ -Version 2.1.187 - Fixed a ClassCastException error involving Rupture +Version 2.1.188 + Updated default entries in treasures.yml to use "Level_Requirement" instead of "Drop_Level" + Fixed a bug where excavation treasures only required level 0 instead of loading the value from the config Fixed a bug where /fishing was showing the wrong shake chance Default Shake chance increased from 15% to 30% (update advanced.yml manually or delete the file to regenerate it and receive these changes) Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, these entries were a mistake) Modified the warning about UltraPermissions NOTES: + This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. +Version 2.1.187 + Fixed a ClassCastException error involving Rupture + Version 2.1.186 Rupture has been reworked to solve a few outstanding issues (see notes) Fixed an exploit involving enchantments (thanks TheBusyBiscuit) diff --git a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java index 1dd4a7217..eb9030d71 100755 --- a/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java +++ b/src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java @@ -25,8 +25,10 @@ public class TreasureConfig extends ConfigLoader { public static final String FILENAME = "treasures.yml"; public static final String LEVEL_REQUIREMENT_RETRO_MODE = ".Level_Requirement.Retro_Mode"; public static final String LEVEL_REQUIREMENT_STANDARD_MODE = ".Level_Requirement.Standard_Mode"; - public static final String LEVEL_REQUIREMENT_INVALID = ".Level_Requirement.Standard"; + public static final String WRONG_KEY_VALUE_STANDARD = ".Drop_Level.Standard_Mode"; + public static final String WRONG_KEY_VALUE_RETRO = ".Drop_Level.Retro_Mode"; public static final String LEGACY_DROP_LEVEL = ".Drop_Level"; + public static final String WRONG_KEY_ROOT = ".Drop_Level"; private static TreasureConfig instance; public HashMap> excavationMap = new HashMap<>(); @@ -66,7 +68,7 @@ public class TreasureConfig extends ConfigLoader { } private void loadTreasures(String type) { - boolean updatedFile = false; + boolean shouldWeUpdateFile = false; boolean isExcavation = type.equals("Excavation"); boolean isHylian = type.equals("Hylian_Luck"); @@ -110,38 +112,38 @@ public class TreasureConfig extends ConfigLoader { int xp = config.getInt(type + "." + treasureName + ".XP"); double dropChance = config.getDouble(type + "." + treasureName + ".Drop_Chance"); - int legacyDropLevel = config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + DropLevelKeyConversionType conversionType; + + //Check for legacy drop level values and convert + if(getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.LEGACY) != -1) { + //Legacy Drop level, needs to be converted + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.LEGACY); + } + + //Check for a bad key that was accidentally shipped out to some users + if(getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.WRONG_KEY_STANDARD) != -1) { + //Partially converted to the new system, I had a dyslexic moment so some configs have this + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.WRONG_KEY_STANDARD); + } + + //Check for a bad key that was accidentally shipped out to some users + if(getWrongKeyValue(type, treasureName, DropLevelKeyConversionType.WRONG_KEY_RETRO) != -1) { + //Partially converted to the new system, I had a dyslexic moment so some configs have this + shouldWeUpdateFile = processAutomaticKeyConversion(type, shouldWeUpdateFile, treasureName, DropLevelKeyConversionType.WRONG_KEY_RETRO); + } + int dropLevel = -1; - int badDefaults = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, -1); - - //Hacky fix for bad keys in treasures.yml defaults - if(badDefaults != -1) { - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_INVALID, null); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, badDefaults); - updatedFile = true; - } - - - if(legacyDropLevel >= 0) { - //Config needs to be updated to be more specific - mcMMO.p.getLogger().info("(" + treasureName + ") Updating Drop_Level in treasures.yml for treasure to match new expected format"); - config.set(type + "." + treasureName + LEGACY_DROP_LEVEL, null); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, legacyDropLevel * 10); - config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, legacyDropLevel); - updatedFile = true; - } - if(mcMMO.isRetroModeEnabled()) { - dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, 0); + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, -1); } else { - dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, 0); + dropLevel = config.getInt(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, -1); } - if(dropLevel < 0) { - mcMMO.p.getLogger().info("Treasure drop level wasn't valid, using a default value."); - //Set it to the "max" if we don't have a drop level - dropLevel = 0; + if(dropLevel == -1) { + mcMMO.p.getLogger().severe("Could not find a Level_Requirement entry for treasure " + treasureName); + mcMMO.p.getLogger().severe("Skipping treasure"); + continue; } if (xp < 0) { @@ -256,7 +258,7 @@ public class TreasureConfig extends ConfigLoader { } //Apply our fix - if(updatedFile) { + if(shouldWeUpdateFile) { try { config.save(getFile()); } catch (IOException e) { @@ -265,6 +267,63 @@ public class TreasureConfig extends ConfigLoader { } } + private boolean processAutomaticKeyConversion(String type, boolean shouldWeUpdateTheFile, String treasureName, DropLevelKeyConversionType conversionType) { + switch (conversionType) { + case LEGACY: + int legacyDropLevel = getWrongKeyValue(type, treasureName, conversionType); //Legacy only had one value, Retro Mode didn't have a setting + //Config needs to be updated to be more specific + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: Legacy] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + config.set(type + "." + treasureName + LEGACY_DROP_LEVEL, null); //Remove legacy entry + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, legacyDropLevel * 10); //Multiply by 10 for Retro + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, legacyDropLevel); + shouldWeUpdateTheFile = true; + break; + case WRONG_KEY_STANDARD: + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: STANDARD] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + int wrongKeyValueStandard = getWrongKeyValue(type, treasureName, conversionType); + config.set(type + "." + treasureName + WRONG_KEY_ROOT, null); //We also kill the Retro key here as we have enough information for setting in values if needed + + if(wrongKeyValueStandard != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_STANDARD_MODE, wrongKeyValueStandard); + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, wrongKeyValueStandard * 10); //Multiply by 10 for Retro + } + + shouldWeUpdateTheFile = true; + break; + case WRONG_KEY_RETRO: + mcMMO.p.getLogger().info("(" + treasureName + ") [Fixing bad address: RETRO] Converting Drop_Level to Level_Requirement in treasures.yml for treasure to match new expected format"); + int wrongKeyValueRetro = getWrongKeyValue(type, treasureName, conversionType); + config.set(type + "." + treasureName + WRONG_KEY_ROOT, null); //We also kill the Retro key here as we have enough information for setting in values if needed + + if(wrongKeyValueRetro != -1) { + config.set(type + "." + treasureName + LEVEL_REQUIREMENT_RETRO_MODE, wrongKeyValueRetro); + } + + shouldWeUpdateTheFile = true; + break; + } + return shouldWeUpdateTheFile; + } + + private int getWrongKeyValue(String type, String treasureName, DropLevelKeyConversionType dropLevelKeyConversionType) { + switch (dropLevelKeyConversionType) { + case LEGACY: + return config.getInt(type + "." + treasureName + LEGACY_DROP_LEVEL, -1); + case WRONG_KEY_STANDARD: + return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_STANDARD, -1); + case WRONG_KEY_RETRO: + return config.getInt(type + "." + treasureName + WRONG_KEY_VALUE_RETRO, -1); + } + + return -1; + } + + private enum DropLevelKeyConversionType { + LEGACY, + WRONG_KEY_STANDARD, + WRONG_KEY_RETRO + } + private void AddHylianTreasure(String dropper, HylianTreasure treasure) { if (!hylianMap.containsKey(dropper)) hylianMap.put(dropper, new ArrayList<>()); diff --git a/src/main/resources/treasures.yml b/src/main/resources/treasures.yml index 22203b508..ad3ae1464 100755 --- a/src/main/resources/treasures.yml +++ b/src/main/resources/treasures.yml @@ -6,7 +6,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + Level_Requirement: Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] @@ -14,7 +14,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: + Level_Requirement: Standard_Mode: 10 Retro_Mode: 1000 Drops_From: [Gravel] @@ -22,7 +22,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 10.0 - Drop_Level: + Level_Requirement: Standard_Mode: 20 Retro_Mode: 200 Drops_From: [Gravel] @@ -30,7 +30,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block, Mycelium] @@ -38,7 +38,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 15 Retro_Mode: 150 Drops_From: [Clay] @@ -46,7 +46,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] @@ -54,7 +54,7 @@ Excavation: Amount: 1 XP: 30 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Gravel] @@ -62,7 +62,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -70,7 +70,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -78,7 +78,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 1.0 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Grass_Block] @@ -86,7 +86,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 65 Retro_Mode: 650 Drops_From: [Sand, Red_Sand] @@ -94,7 +94,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.1 - Drop_Level: + Level_Requirement: Standard_Mode: 50 Retro_Mode: 500 Drops_From: [Clay] @@ -102,7 +102,7 @@ Excavation: Amount: 1 XP: 150 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 75 Retro_Mode: 750 Drops_From: [Clay] @@ -110,7 +110,7 @@ Excavation: Amount: 1 XP: 200 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Clay] @@ -118,7 +118,7 @@ Excavation: Amount: 1 XP: 80 Drop_Chance: 5.0 - Drop_Level: + Level_Requirement: Standard_Mode: 5 Retro_Mode: 50 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Mycelium] @@ -126,7 +126,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] @@ -134,7 +134,7 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] @@ -142,7 +142,7 @@ Excavation: Amount: 1 XP: 1000 Drop_Chance: 0.13 - Drop_Level: + Level_Requirement: Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] @@ -150,7 +150,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 1.33 - Drop_Level: + Level_Requirement: Standard_Mode: 35 Retro_Mode: 350 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Mycelium] @@ -158,7 +158,7 @@ Excavation: Amount: 1 XP: 100 Drop_Chance: 0.5 - Drop_Level: + Level_Requirement: Standard_Mode: 85 Retro_Mode: 850 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Mycelium, Soul_Sand, Soul_Soil] @@ -166,20 +166,20 @@ Excavation: Amount: 1 XP: 3000 Drop_Chance: 0.05 - Drop_Level: + Level_Requirement: Standard_Mode: 25 Retro_Mode: 250 Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand, Soul_Soil] # # Settings for Hylian Luck -# If you are in retro mode, Drop_Level is multiplied by 10. +# If you are in retro mode, Level_Requirement is multiplied by 10. ### Hylian_Luck: MELON_SEEDS: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -187,7 +187,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -195,7 +195,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Bushes] @@ -203,7 +203,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -211,7 +211,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -219,7 +219,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Flowers] @@ -227,7 +227,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] @@ -235,7 +235,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] @@ -243,7 +243,7 @@ Hylian_Luck: Amount: 1 XP: 0 Drop_Chance: 100.0 - Drop_Level: + Level_Requirement: Standard_Mode: 0 Retro_Mode: 0 Drops_From: [Pots] \ No newline at end of file From 4c237b2e9c687ff2d3e576e91130f28523619fa4 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:50:27 -0700 Subject: [PATCH 23/30] Tweak UP msg, remove debug msg about unused keys --- Changelog.txt | 3 ++- .../gmail/nossr50/config/AutoUpdateConfigLoader.java | 10 +++++----- src/main/java/com/gmail/nossr50/mcMMO.java | 4 +++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 8811d09a8..187e97474 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -3,8 +3,9 @@ Version 2.1.188 Fixed a bug where excavation treasures only required level 0 instead of loading the value from the config Fixed a bug where /fishing was showing the wrong shake chance Default Shake chance increased from 15% to 30% (update advanced.yml manually or delete the file to regenerate it and receive these changes) - Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, these entries were a mistake) + Removed entries for ranks 2-8 of Shake from advanced.yml (Shake only has one rank, the extra entries were a mistake) Modified the warning about UltraPermissions + Removed the debug message about potentially unused keys (only shown if you had debug mode enabled in config.yml) NOTES: This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything diff --git a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java index 63189aea2..831dcf144 100644 --- a/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java +++ b/src/main/java/com/gmail/nossr50/config/AutoUpdateConfigLoader.java @@ -53,11 +53,11 @@ public abstract class AutoUpdateConfigLoader extends ConfigLoader { if (!newKeys.isEmpty() || !oldKeys.isEmpty()) { needSave = true; } - - for (String key : oldKeys) { - plugin.debug("Detected potentially unused key: " + key); - //config.set(key, null); - } +// +// for (String key : oldKeys) { +// plugin.debug("Detected potentially unused key: " + key); +// //config.set(key, null); +// } for (String key : newKeys) { plugin.debug("Adding new key: " + key + " = " + internalConfig.get(key)); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 7f05b0732..21a393f7d 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -268,7 +268,9 @@ public class mcMMO extends JavaPlugin { } if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - getLogger().info("mcMMO has detected UltraPermissions is running, make sure to keep both mcMMO and UltraPermissions updated as older versions of UltraPermissions had performance degradation issues when used in conjunction with mcMMO"); + Bukkit.getScheduler().runTaskLater(this, () -> { + getLogger().severe("mcMMO and UltraPermissions have a severe conflict resulting in extreme server performance degradation, an update will be available soon (according to the UltraPermission devs) that will fix this issue. For now it is not advised to use these plugins at the same time. It is advised that you keep mcMMO and UltraPermission up to date."); + }, 20); } } From 2db7d832163d73c6c62e964ee1f8511a8693a292 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:50:59 -0700 Subject: [PATCH 24/30] 2.1.188 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a10e1f840..a4566da14 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.188-SNAPSHOT + 2.1.188 mcMMO https://github.com/mcMMO-Dev/mcMMO From eb8af696058b42f9434e51101839728f2b9ba6cf Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 5 Apr 2021 13:56:16 -0700 Subject: [PATCH 25/30] Update changelog --- Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 187e97474..fab94830a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,7 +9,7 @@ Version 2.1.188 NOTES: This update makes changes to treasures.yml automatically to apply the fix, you don't need to do anything - The latest versions of UltraPermissions should play nicely with mcMMO, but older versions do not. Make sure to update UltraPermissions. + UltraPermissions devs are working on a fix for the performance issue bug Version 2.1.187 Fixed a ClassCastException error involving Rupture From c526208da4f08c289a9e666812e04451ae78f9a4 Mon Sep 17 00:00:00 2001 From: TheSummerGrinch <66258844+TheSummerGrinch@users.noreply.github.com> Date: Tue, 6 Apr 2021 00:50:14 +0200 Subject: [PATCH 26/30] Various improvements to grammar and consistency. (#4479) --- .../resources/locale/locale_nl.properties | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index e446f7162..23150baba 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -1,8 +1,8 @@ -Acrobatics.Ability.Proc=&a**VeiligeLanding** +Acrobatics.Ability.Proc=&a**Veilige Landing** Acrobatics.Combat.Proc=&a**Ontweken** Acrobatics.DodgeChance=Ontwijk Kans: &e{0} Acrobatics.SubSkill.Roll.Name=Rollen -Acrobatics.SubSkill.GracefulRoll.Name=Veilige Roll +Acrobatics.SubSkill.GracefulRoll.Name=Veilige Rol Acrobatics.SubSkill.Dodge.Name=Ontwijken Acrobatics.Listener=Acrobatiek Acrobatics.SubSkill.Roll.Chance=Rol Kans: &e{0} @@ -18,19 +18,19 @@ Archery.SubSkill.ArrowRetrieval.Description=Kans om pijlen te krijgen van lijken Archery.Listener=Boogschieten: Archery.SkillName=BOOGSCHIETEN Archery.Skillup= Boogschieten ervaring toegenomen met {0}. Totaal ({1}) -Axes.Ability.Bonus.0=Bijl Meesterschap +Axes.Ability.Bonus.0=Bijl Vaardigheid Axes.Ability.Bonus.1=Bonus {0} schade Axes.Ability.Bonus.4=Grotere impact Axes.Ability.Lower=&a**JE STOP JE BIJL WEER WEG** Axes.Ability.Ready=&a**JE HOUDT JE BIJL GEREED** Axes.Combat.CritStruck=&4Je bent KRITISCH geraakt -Axes.Combat.CriticalHit=Kritische Klap +Axes.Combat.CriticalHit=Ernstige Klap Axes.Combat.GI.Proc=&a ** GESLAGEN MET GROTE KRACHT ** Axes.Combat.GI.Struck=**GETROFFEN MET MEER SCHADE** Axes.Combat.SS.Length=Schedel Splijter Lengte: &e{0}s Axes.SubSkill.SkullSplitter.Name=Schedel Splijter Axes.SubSkill.SkullSplitter.Description=Veroorzaak AoE Schade -Axes.SubSkill.CriticalStrikes.Name=Kritieke Slag +Axes.SubSkill.CriticalStrikes.Name=Ernstige Slag Axes.SubSkill.CriticalStrikes.Description=Verdubbelde Schade Axes.SubSkill.AxeMastery.Name=Bijl Meesterschap Axes.SubSkill.AxeMastery.Description=Voegt DMG bonus toe @@ -69,7 +69,7 @@ Fishing.SubSkill.MagicHunter.Description=Vind Enchanted Spullen Fishing.SubSkill.Shake.Name=Schudden (vs. Wezens) Fishing.SubSkill.Shake.Description=Schud items af van mobs w/ hengel Fishing.SubSkill.FishermansDiet.Name=Visserman\'s dieet -Fishing.SubSkill.FishermansDiet.Description=Verbetert de honger hersteld vanaf geviste voedingsmiddelen +Fishing.SubSkill.FishermansDiet.Description=Verbetert de honger hersteld door geviste voedingsmiddelen Fishing.SubSkill.MasterAngler.Name=Meester Hengelaar Fishing.SubSkill.IceFishing.Name=Ijs Vissen Fishing.SubSkill.IceFishing.Description=Stelt je in staat om te vissen in de ijzige biomen @@ -84,7 +84,7 @@ Herbalism.Ability.Ready=&a**JE HOUDT JE ZEIS GEREED** Herbalism.SubSkill.GreenThumb.Name=Groene Duim (Graan) Herbalism.SubSkill.GreenThumb.Description.2=Maak stenen bemost, of laat gras groeien Herbalism.SubSkill.FarmersDiet.Name=Boeren dieet -Herbalism.SubSkill.FarmersDiet.Description=Verbetert de honger herstel van gekweekte voedingsmiddelen +Herbalism.SubSkill.FarmersDiet.Description=Verbetert de honger hersteld door gekweekte voedingsmiddelen Herbalism.SubSkill.DoubleDrops.Name=Dubbele drops (Alle Kruiden) Herbalism.SubSkill.DoubleDrops.Description=Het dubbele van de normale buit Herbalism.SubSkill.HylianLuck.Name=Hylian Geluk @@ -110,7 +110,7 @@ Mining.SkillName=MIJNBOUW Mining.Skills.SuperBreaker.Off= ** Super Breaker is uitgewerkt ** Mining.Skills.SuperBreaker.Other.Off=Super Breker &ais uitgewerkt voor &e{0} Mining.Skills.SuperBreaker.Refresh=&aJe&eSuper Breeker &akracht is hersteld! -Mining.Skillup=Mijn ervaring toegenomen met {0}. Totaal: ({1}) +Mining.Skillup=Mijn ervaring is toegenomen met {0}. Totaal: ({1}) Mining.Blast.Boom=&7**BOEM** Mining.Blast.Radius.Increase= Ontploffings Radius Verhoging: &e {0} Mining.Blast.Rank=Explosie Mining: &e Rang {0}/8 &7({1}) @@ -127,18 +127,18 @@ Repair.SubSkill.StoneRepair.Description=Repareer Stenen Gereedschap & Wapenuitru Repair.SubSkill.RepairMastery.Name=Reparatie Meesterschap Repair.SubSkill.RepairMastery.Description=Toegenomen reparatie aantal Repair.SubSkill.SuperRepair.Name=Super Reparatie -Repair.SubSkill.SuperRepair.Description=Verdubbelde effectiefheid +Repair.SubSkill.SuperRepair.Description=Verdubbelde effectiviteit Repair.SubSkill.DiamondRepair.Name=Diamanten Reparatie ({0}+ SKILL) Repair.SubSkill.DiamondRepair.Description=Repareer Diamanten Gereedschap & Wapenuitrusting Repair.SubSkill.ArcaneForging.Name=Arcane Smeden Repair.SubSkill.ArcaneForging.Description=Magische voorwerpen repareren -Repair.Listener.Anvil=&4Je hebt een aambeeld geplaatst, met een aambeeld kun je je gereedschappen en pantser mee repareren +Repair.Listener.Anvil=&4Je hebt een aambeeld geplaatst. Met een aambeeld kun je je gereedschappen en pantser repareren Repair.Listener=Repareer: Repair.SkillName=REPAREER Repair.Skills.AdeptDiamond=&4Je bent nog niet sterk genoeg om diamant te repareren. -Repair.Skills.AdeptGold=&4Je bent niet goed genoeg om goud te repareren. +Repair.Skills.AdeptGold=&4Je bent niet vaardig genoeg om goud te repareren. Repair.Skills.AdeptIron=&4Je bent niet vaardig genoeg om Ijzer te repareren. -Repair.Skills.AdeptStone=&4Je bent nog niet sterk genoeg om steen te repareren. +Repair.Skills.AdeptStone=&4Je bent nog niet vaardig genoeg om steen te repareren. Repair.Skills.FeltEasy=&7Dat voelde makkelijk. Repair.Skills.FullDurability=[[GRIJS]] Dat is bij volledige duurzaamheid. Repair.Skillup=Repareer ervaring toegenomen met {0}. Totaal: ({1}) @@ -164,9 +164,9 @@ Swords.Effect.5={0} Tick Bloeden Swords.SubSkill.Bleed.Name=Bloeden Swords.Listener=Zwaarden: Swords.SkillName=ZWAARDEN -Swords.Skills.SS.Off=**Serrated Strikes is uitgewerkt** +Swords.Skills.SS.Off=**Gekartelde Slag is uitgewerkt** Swords.Skills.SS.On=&a**GEKARTELDE SLAG GEACTIVEERD** -Swords.Skills.SS.Refresh=&aJe &eGekarteld Slag &a kracht is hersteld! +Swords.Skills.SS.Refresh=&aJe &eGekartelde Slag &a kracht is hersteld! Swords.Skills.SS.Other.Off=Gekartelde Slag&a is uitgewerkt voor &e{0} Swords.Skills.SS.Other.On=&a{0}&2 heeft &cGekartelde Slag&2gebruikt! Swords.Skillup=Zwaarden ervaring toegenomen met {0}. Totaal: ({1}) @@ -180,13 +180,13 @@ Taming.Ability.Bonus.7=+{0} Schade Taming.Ability.Bonus.8=Snel Eten Service Taming.SubSkill.ShockProof.Name=Schokbestendig Taming.SubSkill.ShockProof.Description=Explosieve Schade Verkleining -Taming.SubSkill.CallOfTheWild.Name=Roep van het WIld +Taming.SubSkill.CallOfTheWild.Name=Roep van het Wild Taming.SubSkill.CallOfTheWild.Description=Roep een dier aan je zijde op Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Buk en linkermuisknop met {0} Vis in je hand Taming.Effect.15=&7COTW (Wolf): Buk en linkermuisknop met {0} Botten in je hand Taming.SubSkill.FastFoodService.Name=Fast Food Service Taming.SubSkill.FastFoodService.Description=Kans voor wolven na een aanval te regeneren -Taming.SubSkill.Gore.Description=Kritische Slag dat Blood toepast +Taming.SubSkill.Gore.Description=Ernstige Slag dat Blood toepast Taming.SubSkill.SharpenedClaws.Name=Geslepen Klauwen Taming.SubSkill.SharpenedClaws.Description=Schade Bonus Taming.SubSkill.EnvironmentallyAware.Name=Omgevings bewust @@ -266,17 +266,17 @@ Commands.mmoedit.Modified.2={0} is aangepast voor {1}. Commands.mcconvert.Database.Same= Je maakt al gebruik van de {0} database! Commands.mcconvert.Database.InvalidType= {0} is geen geldig soort database. Commands.ModDescription=- Lees instructie mod beschrijving -Commands.NoConsole=Deze commando wordt niet ondersteund vanuit de console. +Commands.NoConsole=Dit commando wordt niet ondersteund vanuit de console. Commands.Other=&a--OVERIGE COMMANDS-- Commands.Party.Header=-----[]&aGROEP&c[]----- Commands.Party.Status=&8NAAM: &f{0} {1} Commands.Party.ShareMode=&8DEEL MODUS: Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.Accept=- Accepteer groep uitnodiging +Commands.Party.Accept=- Accepteer groepsuitnodiging Commands.Party.Chat.Off=Groep\'s Chat &cUit Commands.Party.Chat.On=Groep\'s Chat &aAan Commands.Party.Commands=&a--GROEP COMMANDOS-- -Commands.Party.Invite.0=ALERT: &aJij hebt een groep uitnodiging ontvangen voor {0} van {1} +Commands.Party.Invite.0=ALERT: &aJij hebt een groepsuitnodiging ontvangen voor {0} van {1} Commands.Party.Invite=- Verstuur groepsuitnodiging Commands.Party.Join=&7heeft zich aangesloten bij de groep: {0} Commands.Party.Create=&7Groep aangemaakt: {0} @@ -286,21 +286,21 @@ Commands.Party.AlreadyExists=&4Groep {0} bestaat al! Commands.Party.Kick=Je bent verwijderd uit de groep {0}! Commands.Party.Leave=Je hebt de groep verlaten Commands.Party.Members.Header=-----[]&aLEDEN&c[]----- -Commands.Party.None=Je bent niet in een groep. +Commands.Party.None=Je zit niet in een groep. Commands.Party.Quit=- Verlaat je huidige groep -Commands.Party.Teleport= &c- Teleport naar een groepslid +Commands.Party.Teleport= &c- Teleporteer naar een groepslid Commands.Party.Toggle=- Zet Party Chat aan/uit Commands.Party.1=- Maak een nieuwe groep Commands.Party.2=- Ga bij een spelers groep -Commands.ptp.NoRequests= Je hebt geen teleporteren aanvragen op dit moment -Commands.ptp.RequestExpired=Groep\'s teleport verzoek is verlopen! +Commands.ptp.NoRequests= Je hebt geen teleportatie aanvragen op dit moment +Commands.ptp.RequestExpired=Groep\'s teleportatie verzoek is verlopen! Commands.PowerLevel.Leaderboard=--mcMMO&9 Kracht Level &eLeiderbord-- Commands.PowerLevel=&4KRACHT LEVEL: &a{0} Commands.Reset=Reset een niveau level naar 0 Commands.Skill.Invalid= Dat is geen geldig skillname! Commands.Skill.Leaderboard=--mcMMO &9{0}&e Ranglijst -- -Commands.Stats.Self=Je status -Commands.Stats=- Laat je mcMMO statussen zien +Commands.Stats.Self=Jouw status +Commands.Stats=- Laat jouw mcMMO statussen zien Commands.ToggleAbility= - Toggle Kracht activering met rechts klikken Commands.Usage.Level=niveau Commands.Usage.Message=bericht @@ -309,8 +309,8 @@ Commands.Usage.Password=wachtwoord Commands.Usage.Player=speler Commands.Usage.Skill=Niveau Commands.Usage.XP=xp -mcMMO.NoPermission=&4Te wijning permissions. -mcMMO.NoSkillNote=&8als je geen toegang hebt tot een vermogen, wordt die hier niet getoont +mcMMO.NoPermission=&4Te weining machtigingen. +mcMMO.NoSkillNote=&8als je geen toegang hebt tot een vermogen, wordt die hier niet getoond Party.Forbidden=[mcMMO] Groepen zijn niet toegestaan in deze wereld (zie Machtigingen) Party.Help.1=Maak een groep aan met &3{0} [password]. Party.Help.10=Gebruik &3{0} &com XP delen met groepsleden te activeren @@ -321,9 +321,9 @@ Party.Invite.Self=Je kan jezelf niet uitnodigen! Party.IsLocked=Deze groep is al gesloten! Party.IsntLocked=Deze groep is niet gesloten! Party.Locked=De groep is gesloten, alleen de groepsleider kan spelers uitnodigen. -Party.NotInYourParty=&4{0} zit niet in jou groep +Party.NotInYourParty=&4{0} zit niet in jouw groep Party.NotOwner=&4Jij bent niet de groepsleider. -Party.Owner.New=&a{0} is de nieuwe groep leider. +Party.Owner.New=&a{0} is de nieuwe groepsleider. Party.Owner.NotLeader=&4Jij bent niet meer de groepsleider. Party.Owner.Player=&aJij bent nu de groep eigenaar. Party.Password.None=Deze groep is vergrendeld met een wachtwoord. Voer het wachtwoord in om in deze groep te komen. @@ -337,8 +337,8 @@ Party.PlayerNotInParty=&4{0} zit niet in een groep Party.Specify=Je moet een groep invullen. Party.Teleport.Dead=[RED]Je kan niet naar een dode speler teleporteren. Party.Teleport.Hurt=Je hebt schade opgelopen in de afgelopen {0} seconden en je kan niet teleporten. -Party.Teleport.Player=&a Je hebt geteleporteerd naar {0}. -Party.Teleport.Target=&a{0} is naar jou toe gedeporteerd. +Party.Teleport.Player=&a Je bent geteleporteerd naar {0}. +Party.Teleport.Target=&a{0} is naar jou toe geteleporteerd. Party.Teleport.Disabled={0} staat groeps-teleportaties niet toe. Party.Rename.Same=Dat is al de naam van uw groep! Party.Join.Self=Je kan niet meedoen met jezelf! @@ -373,7 +373,7 @@ Commands.XPGain=&8XP GEWONNEN: &f{0} Commands.xplock.locked=&6Jou XP BALK is nu bevroren op {0}! Commands.xplock.unlocked=&6Jou XP BALK is nu&aONTGRENDELD&6! Commands.xprate.over=mcMMO XP Verdubbeling Evenement is VOORBIJ!! -Commands.xprate.proper.0=Juiste gebruiking om de XP snelheid te veranderen is /xprate +Commands.xprate.proper.0=De juiste manier om de XP snelheid te veranderen is /xprate Commands.xprate.proper.1=De juiste manier om de XP rate te herstellen is /xprate reset Commands.xprate.started.0=&6XP EVENEMENT VOOR MCMMO IS BEGONNEN! XPRate.Event=&6mcMMO is momenteel in een XP verdubbeling evenement! XP verdubbeling is {0}x! @@ -383,7 +383,7 @@ Effects.Parent=&6{0} - Effects.Template=&3{0}: &a{1} Guides.Header=&6-=&a{0} Handleiding&6=- Guides.Page.Invalid=Geen geldig paginanummer! -Guides.Page.OutOfRange=Deze pagina bestaat niet, er zijn in totaal {0} pagina\'s. +Guides.Page.OutOfRange=Deze pagina bestaat niet. Er zijn in totaal {0} pagina\'s. Guides.Smelting.Section.0=Komt binnenkort... Inspect.OfflineStats=mcMMO statistieken voor offline-speler &e{0} Inspect.Stats=&amcMMO Statistieken voor &e{0} @@ -392,8 +392,8 @@ Item.ChimaeraWing.Fail=**CHIMAERA VLEUGEL MISLUKT** Item.ChimaeraWing.Pass=**CHIMAERA VLEUGEL** Item.ChimaeraWing.Name=Chimaera Vleugel Item.ChimaeraWing.Lore=&7 Teleporteert je naar je bed. -Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachter om dit te gebruiken. &e({0}s) -Teleport.Commencing=&7Teleport poging in &6({0}) &7seconden, Sta stil AUB... +Item.Injured.Wait=Je bent recent gewond geraakt en je moet wachten om dit te gebruiken. &e({0}s) +Teleport.Commencing=&7Teleporteer poging in &6({0}) &7seconden, Sta stil AUB... Skills.Disarmed=&4Je bent ontwapend! Skills.NeedMore=&4Jij hebt te weinig &7{0} Skills.TooTired=Jij bent te moe om die kracht opnieuw te gebruiken. &e({0}s) From 44c820089c9c1785ca25f22e5fe4e916ef525ca1 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 6 Apr 2021 14:48:53 -0700 Subject: [PATCH 27/30] remove UP warning --- src/main/java/com/gmail/nossr50/mcMMO.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 21a393f7d..99d7a461f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -266,12 +266,6 @@ public class mcMMO extends JavaPlugin { else metrics.addCustomChart(new SimplePie("leveling_system", () -> "Standard")); } - - if(pluginManager.getPlugin(ULTRA_PERMISSONS) != null) { - Bukkit.getScheduler().runTaskLater(this, () -> { - getLogger().severe("mcMMO and UltraPermissions have a severe conflict resulting in extreme server performance degradation, an update will be available soon (according to the UltraPermission devs) that will fix this issue. For now it is not advised to use these plugins at the same time. It is advised that you keep mcMMO and UltraPermission up to date."); - }, 20); - } } catch (Throwable t) { From ef48fbee8927601ddb5881565d7bfa268d1df170 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 6 Apr 2021 15:01:51 -0700 Subject: [PATCH 28/30] dev mode + update changelog --- Changelog.txt | 14 ++++++++++++++ pom.xml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index fab94830a..214066e89 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,17 @@ +Version 2.1.189 + Removed UP warning + + NOTES: + Ultra Permissions is SAFE to use with mcMMO + After getting in contact with the UltraPermissions devs and exhaustive testing, I have concluded that using UltraPermissions is completely safe with mcMMO. The users who had an issue with performance currently have an unknown cause, potentially it is from a plugin using the UltraPermissions API I really can't say without more data. My apologies to the UltraPermissions team for reporting an issue between our two plugins directly, as that is not the case. I would have tested it myself sooner but UltraPermissions was closed source and premium so I wasn't particularly motivated to do so, however I have been given access to the binaries so now I can do all the testing I want if future issues ever arise which I have zero expectations that they will. + + UltraPermissions is as efficient as LuckPerms + I have done a lot of profiling of UltraPermissions via Spark in the last few hours, I also compared it to LuckPerms. I wasn't expecting it, but UltraPermissions runs just as fast as LuckPerms if not faster. So it has no performance issues whatsoever from my point of view. + + Use whatever permission plugin you like, there will be no difference between using LuckPerms or UltraPermissions with mcMMO. + + If you had issues with UltraPermissions please contact the UP devs + If you experience lag with mcMMO and UltraPermissions, we are trying to determine the culprit. It is likely the culprit is from another plugin doing bad things with the UltraPermissions API. Please get in contact with the UltraPermission devs if you run into issues ( @MATRIX | Timo K. & @Liz3 ). Neither I nor they can replicate it so we need you guys to provide more data. Version 2.1.188 Updated default entries in treasures.yml to use "Level_Requirement" instead of "Drop_Level" Fixed a bug where excavation treasures only required level 0 instead of loading the value from the config diff --git a/pom.xml b/pom.xml index a4566da14..577fc927d 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.188 + 2.1.189-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From 6336101992e5441fd1d74d55297406a9ea8841e5 Mon Sep 17 00:00:00 2001 From: Mich3l3k <47540709+Mich3l3k@users.noreply.github.com> Date: Thu, 8 Apr 2021 01:10:50 +0200 Subject: [PATCH 29/30] Update locale_pl.properties (#4470) You're welcome :D I will translate Guides soon --- .../resources/locale/locale_pl.properties | 1678 +++++++++++------ 1 file changed, 1121 insertions(+), 557 deletions(-) diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index dda260bdf..4cbc5109c 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -1,577 +1,1141 @@ -Acrobatics.Ability.Proc=&a**Mi\u0119kkie L\u0105dowanie** -Acrobatics.Combat.Proc=&a**Unikni\u0119to** -Acrobatics.DodgeChance=Szansa na Unik: &e{0} -Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t -Acrobatics.SubSkill.Roll.Description=Redukuje lub te\u017c ca\u0142kowicie usuwa obra\u017cenia od upadku -Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny Przewr\u00f3t -Acrobatics.SubSkill.GracefulRoll.Description=Dwukrotnie bardziej efektywne niz zwykly Przewrot -Acrobatics.SubSkill.Dodge.Name=Unik -Acrobatics.SubSkill.Dodge.Description=Redukuje obra\u017cenia o po\u0142owe -Acrobatics.Listener=Akrobatyka: -Acrobatics.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: &e{0} -Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0141agodny Przewr\u00f3t: &e{0} -Acrobatics.Roll.Text=**Przewr\u00f3t** -Acrobatics.SkillName=AKROBATYKA -Acrobatics.Skillup=Umiejetnosc akrobatyka wzrosla o {0}. Razem ({1}) -Archery.Combat.DazeChance=Szansa na Oszolomienie: &e{0} -Archery.Combat.RetrieveChance=Szansa na Odzyskanie Strza\u0142: &e{0} -Archery.Combat.SkillshotBonus=Dodatkowe Obra\u017cenia dla Umiej\u0119tno\u015bci: &e{0} -Archery.SubSkill.SkillShot.Name=Umiej\u0119tno\u015b\u0107 Aktywna -Archery.SubSkill.SkillShot.Description=Zwi\u0119ksza obra\u017cenia zadane z \u0142uku -Archery.SubSkill.Daze.Name=Oszo\u0142omienie -Archery.SubSkill.Daze.Description=Oszalamia, straszy i zadaje {0} obrazen. -Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie Strza\u0142 -Archery.SubSkill.ArrowRetrieval.Description=Szansa na wyci\u0105gni\u0119cie strza\u0142 z martwego cia\u0142a -Archery.Listener=Lucznictwo -Archery.SkillName=LUCZNICTWO -Archery.Skillup=Umiejetnosc lucznictwo wzrosla o {0}. Razem ({1}) -Axes.Ability.Bonus.0=Mistrzostwo pos\u0142ugiwania si\u0119 siekier\u0105 -Axes.Ability.Bonus.1={0} Bonusowych obra\u017ce\u0144 -Axes.Ability.Bonus.2=Wstrz\u0105s od Zbroi -Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obra\u017ce\u0144 dla opancerzonych cel\u00f3w -Axes.Ability.Bonus.4=Trafienie Krytyczne -Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obra\u017ce\u0144 dla nieopancerzonych cel\u00f3w -Axes.Ability.Lower=&7**CHOWASZ SIEKIERE** -Axes.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJ\u0104 SIEKIERE** -Axes.Combat.CritStruck=&4Trafiono cie krytycznie! -Axes.Combat.CritChance=Szansa na Trafienie Krytyczne: &e{0} -Axes.Combat.CriticalHit=TRAFIENIE KRYTYCZNE! -Axes.Combat.GI.Proc=&a**UDERZONO Z WIELK\u0104 MOC\u0104** -Axes.Combat.GI.Struck=TRAFIENIE KRYTYCZNE! -Axes.Combat.SS.Length=D\u0142ugo\u015bc \u0141amacza Czaszki: &e{0}s -Axes.SubSkill.SkullSplitter.Name=\u0141amacz Czaszek -Axes.SubSkill.SkullSplitter.Description=Zadaje obra\u017cenia obszarowe -Axes.SubSkill.CriticalStrikes.Name=Krytyczne Uderzenia -Axes.SubSkill.CriticalStrikes.Description=Podwojne obrazania -Axes.SubSkill.AxeMastery.Name=Mistrzostwo pos\u0142ugiwania si\u0119 siekier\u0105 -Axes.SubSkill.AxeMastery.Description=Dodaje bonus do obrazen -Axes.SubSkill.ArmorImpact.Name=Wstrz\u0105s od Zbroi -Axes.SubSkill.ArmorImpact.Description=Uderz z odpowiedni\u0105 si\u0142a aby przebi\u0107 zbroj\u0119 -Axes.SubSkill.GreaterImpact.Name=Trafienie Krytyczne -Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia nieopancerzonym celom -Axes.Listener=Siekiery: -Axes.SkillName=TOPORY -Axes.Skills.SS.Off=**\u0141amacz Czaszek si\u0119 sko\u0144czy\u0142** -Axes.Skills.SS.On=&a**\u0141amacz Czaszek AKTYWOWANY** -Axes.Skills.SS.Refresh=&aTwoja zdolno\u015b\u0107 &e\u0141amacz Czaszek &ajest ju\u017c dost\u0119pna! -Axes.Skills.SS.Other.Off=\u0141amacz Czaszek&a si\u0119 sko\u0144czy\u0142 &e{0} -Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &c\u0141amacza Czaszki! -Axes.Skillup=Umiej\u0119tno\u015b\u0107 \u015bcinania wzros\u0142a o {0}. Razem ({1}) -Excavation.Ability.Lower=&7**CHOWASZ \u0141OPAT\u0118** -Excavation.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJ\u0104 \u0141OPAT\u0118** -Excavation.SubSkill.GigaDrillBreaker.Name=Mia\u017cdz\u0105ce Wiert\u0142o -Excavation.SubSkill.GigaDrillBreaker.Description=3x Szansa na znalezienie przedmiotu, 3x mno\u017cnik zdobywania do\u015bwiadczenia, +pr\u0119dko\u015b\u0107 -Excavation.SubSkill.TreasureHunter.Name=Lowca Skarbow -Excavation.SubSkill.TreasureHunter.Description=Umiej\u0119tno\u015b\u0107 wykopywania skarb\u00f3w. -Excavation.Effect.Length=D\u0142ugo\u015bc Mia\u017cdz\u0105cego Wiert\u0142a: &e{0}s -Excavation.Listener=Wykopaliska: -Excavation.SkillName=KOPANIE -Excavation.Skills.GigaDrillBreaker.Off=**Mia\u017cdz\u0105ce Wiert\u0142o si\u0119 sko\u0144czy\u0142o** -Excavation.Skills.GigaDrillBreaker.On=&a**MIA\u017bDZ\u0104CE WIERT\u0141O AKTYWOWANE** -Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eMia\u017cdz\u0105ce Wiert\u0142o &ajest ju\u017c dost\u0119pna! -Excavation.Skills.GigaDrillBreaker.Other.Off=Mia\u017cdz\u0105ce Wiert\u0142o&a si\u0119 sko\u0144czy\u0142o &e{0} -Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cMia\u017cdz\u0105ce Wiert\u0142o! -Excavation.Skillup=Umiej\u0119tno\u015b\u0107 wykopalisk wzros\u0142a o {0}. Razem({1}) -Fishing.Ability.Chance=Szansa na zlapanie ryby: &e{0} -Fishing.Ability.Info=Magiczny \u0141owca: &7 **Ulepsza si\u0119 wraz z rang\u0105 Poszukiwacza Skarb\u00f3w** -Fishing.Ability.Locked.0=ZABLOKOWANY DO POZIOMU {0}+ SKILL -Fishing.Ability.Locked.1=DOSTEPNE OD POZIOMU {0}+ (LODOWE LOWIENIE RYB) -Fishing.Ability.Rank=Ranga lowienia skarbow: &e{0}/5 -Fishing.Ability.TH.MagicRate=Szanse na Magicznego \u0141owc\u0119: &e{0} -Fishing.Ability.Shake=Szansa na Wstrz\u0105s: &e{0} -Fishing.Ability.IceFishing=Lodowe lowienie ryb: Idz lowic ryby w lodzie -Fishing.Ability.FD=Dieta Rybaka: &eRanga {0} -Fishing.SubSkill.TreasureHunter.Name=Lowca Skarbow (Pasywna) -Fishing.SubSkill.TreasureHunter.Description=\u0141owi\u0107 r\u00f3\u017cne obiekty -Fishing.SubSkill.MagicHunter.Name=Magiczny Lowca -Fishing.SubSkill.MagicHunter.Description=Znajdowanie Zakletych Przedmiotow -Fishing.SubSkill.Shake.Name=Potrz\u0105\u015bni\u0119cie (przeciwko jednostkom) -Fishing.SubSkill.Shake.Description=Okradaj potwory z przedmiot\u00f3w u\u017cywaj\u0105c w\u0119dki. -Fishing.SubSkill.FishermansDiet.Name=Dieta Rybaka -Fishing.SubSkill.FishermansDiet.Description=Zwi\u0119ksza nasycenie posi\u0142k\u00f3w (ryby) -Fishing.SubSkill.IceFishing.Name=Lodowe lowienie ryb -Fishing.SubSkill.IceFishing.Description=Pozwala na lowienie ryb w zimowych biomach -Fishing.Chance.Raining=&9 Bonus od Deszczu -Fishing.Listener=Rybactwo -Fishing.Ability.TH.MagicFound=&7Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii... -Fishing.SkillName=RYBACTWO -Fishing.Skillup=Umiej\u0119tno\u015b\u0107 \u0142owienia wzros\u0142a o {0}. Razem ({1}) -Herbalism.Ability.DoubleDropChance=Szansa na Podw\u00f3jny Drop: &e{0} -Herbalism.Ability.FD=Dieta Farmera: &ePoziom {0} -Herbalism.Ability.GTe.Length=D\u0142ugo\u015b\u0107 ?Green Terra?: &e{0}s -Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion aby u\u017cy\u0107 Zielonego \u017bycia. -Herbalism.Ability.GTh.Chance=Szansa na Zielony Palec: &e{0} -Herbalism.Ability.GTh.Fail=&a**ZIELONY PALEC SI\u0118 NIE UDA\u0141** -Herbalism.Ability.GTh.Stage=Etap Zielonego Dotyku: &e Ro\u015bliny rosn\u0105 w etapie {0} -Herbalism.Ability.GTh=&a**ZIELONY PALEC** -Herbalism.Ability.HylianLuck=Szansa na Szczescie Hylian: &e{0} -Herbalism.Ability.Lower=&7**CHOWASZ SWOJ\u0104 MOTYKE** -Herbalism.Ability.Ready=&a**PRZYGOTOWUJESZ MOTYKE** -Herbalism.SubSkill.GreenTerra.Name=Zielone \u017bycie (ZDOLNO\u015a\u0106) -Herbalism.SubSkill.GreenTerra.Description=Rozprzestrzenia \u017cycie na powierzchni, 3x wi\u0119ksza szansa na zdobycie przedmiot\u00f3w -Herbalism.SubSkill.GreenThumb.Name=Zielony palec (Pszenica) -Herbalism.SubSkill.GreenThumb.Description=Automatycznie zasadza ro\u015bliny podczas ich zbierania -Herbalism.SubSkill.GreenThumb.Description.2=Oplata ceg\u0142y zieleni\u0105, lub te\u017c wspomaga rozw\u00f3j trawy. -Herbalism.SubSkill.FarmersDiet.Name=Dieta Farmerska -Herbalism.SubSkill.FarmersDiet.Description=Zwi\u0119ksza nasycenie posi\u0142k\u00f3w -Herbalism.SubSkill.DoubleDrops.Name=Podw\u00f3jny Drop (Wszystkie Zielska) -Herbalism.SubSkill.DoubleDrops.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w -Herbalism.SubSkill.HylianLuck.Name=Szczescie Hylian -Herbalism.SubSkill.HylianLuck.Description=Daje niewielka szanse na znalezienie rzadkich przedmiot\u00f3w -Herbalism.HylianLuck=&aSzczescie Hyrule jest dzisiaj z Toba! -Herbalism.Listener=Zielarstwo -Herbalism.SkillName=ZIELARSTWO -Herbalism.Skills.GTe.On=&a**?GREEN TERRA? AKTYWOWANA** -Herbalism.Skills.GTe.Refresh=&aTwoja zdolno\u015b\u0107 &e?Green Terra?&ajest ju\u017c gotowa! -Herbalism.Skills.GTe.Other.Off=?Green Terra?&a si\u0119 sko\u0144czy\u0142o &e{0} -Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142 &c?Green Terra?! -Herbalism.Skillup=Umiej\u0119tno\u015b\u0107 zielarstwa wzros\u0142a o {0}. Ca\u0142kowicie ({1}) -Mining.Ability.Length=D\u0142ugo\u015bc Super Kopacza: &e{0}s -Mining.Ability.Locked.0=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Mining.Ability.Locked.1=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Mining.Ability.Locked.2=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Mining.Ability.Lower=&7**CHOWASZ SW\u00d3J KILOF** -Mining.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJA SIEKIERE** -Mining.SubSkill.SuperBreaker.Name=Super \u0141amacz (ZDOLNO\u015a\u0106) -Mining.SubSkill.SuperBreaker.Description=Szybko\u015b\u0107+, Szansa potr\u00f3jnego dropa -Mining.SubSkill.DoubleDrops.Name=Podwojny Drop -Mining.SubSkill.DoubleDrops.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w -Mining.SubSkill.BlastMining.Name=Szybki Kopacz -Mining.SubSkill.BlastMining.Description=Bonus do wydobycia z TNT -Mining.SubSkill.BiggerBombs.Name=Wieksze bomby -Mining.SubSkill.BiggerBombs.Description=Zwieksza zasieg wybuchu TNT -Mining.SubSkill.DemolitionsExpertise.Name=Mistrzostwo w pos\u0142ugiwaniu si\u0119 materia\u0142ami wybuchowymi -Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obrazenia od explozji TNT -Mining.Effect.Decrease=Redukcja Obra\u017ce\u0144 od Materia\u0142\u00f3w Wybuchowych: &e{0} -Mining.Effect.DropChance=Szansa na Podw\u00f3jny Drop: &e{0} -Mining.Listener=G\u00f3rnictwo -Mining.SkillName=GORNICTWO -Mining.Skills.SuperBreaker.Off=**Super \u0141amacz si\u0119 sko\u0144czy\u0142** -Mining.Skills.SuperBreaker.On=&a**SUPER \u0141AMACZ AKTYWOWANY** -Mining.Skills.SuperBreaker.Other.Off=Super Kopacz&a si\u0119 sko\u0144czy\u0142 &e{0} -Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Kopacza! -Mining.Skills.SuperBreaker.Refresh=&aTwoja zdolno\u015b\u0107 &eSuper \u0141amacz &ajest ju\u017c dost\u0119pna! -Mining.Skillup=Umiejetnosc Gornictwa wzrosla o {0}. Calkowicie ({1}) -Mining.Blast.Boom=&7**BOOM** -Mining.Blast.Radius.Increase=Zasi\u0119g zwi\u0119kszony o: &e+{0} -Mining.Blast.Rank=Szybki Kopacz: &e Ranga {0}/8 &7({1}) -Mining.Blast.Other.On=&a{0}&2 u\u017cy\u0142 &cSzybkiego Kopacza! -Mining.Blast.Refresh=&aTwoja zdolno\u015b\u0107 &eB\u0142yskawiczny Kopacz &ajest ju\u017c dost\u0119pna! -Repair.SubSkill.Repair.Name=Naprawa -Repair.SubSkill.Repair.Description=Naprawa Narz\u0119dzi i Pancerza -Repair.SubSkill.GoldRepair.Name=Naprawa Z\u0142ota ({0}+ SKILL) -Repair.SubSkill.GoldRepair.Description=Naprawa Z\u0142otych Narz\u0119dzi i Pancerza -Repair.SubSkill.IronRepair.Name=Naprawa \u017belaza ({0}+ SKILL) -Repair.SubSkill.IronRepair.Description=Naprawa \u017belaznych Narz\u0119dzi i Pancerza -Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ SKILL) -Repair.SubSkill.StoneRepair.Description=Naprawa Kamiennych Narz\u0119dzi -Repair.SubSkill.RepairMastery.Name=Mistrzostwo napraw -Repair.SubSkill.RepairMastery.Description=Zwi\u0119kszono ilo\u015b\u0107 napraw -Repair.SubSkill.SuperRepair.Name=Super Naprawa -Repair.SubSkill.SuperRepair.Description=Podw\u00f3jnia efektywno\u015b\u0107 -Repair.SubSkill.DiamondRepair.Name=Naprawa Diamentu ({0}+ SKILL) -Repair.SubSkill.DiamondRepair.Description=Naprawa diamentowych narzedzi i pancerza -Repair.SubSkill.ArcaneForging.Name=Kowalstwo Ezoteryczne -Repair.SubSkill.ArcaneForging.Description=Naprawa rzeczy magicznych -Repair.SubSkill.Salvage.Name=Odzyskiwanie ({0}+ SKILL) -Repair.SubSkill.Salvage.Description=Odzyskiwanie Narz\u0119dzi i Pancerza -Repair.Error=&4mcMMO napotka\u0142 problem pr\u00f3buj\u0105c naprawi\u0107 ten przedmiot! -Repair.Listener.Anvil=&4Postawi\u0142e\u015b kowad\u0142o - kowad\u0142a s\u0142u\u017c\u0105 do naprawiania narz\u0119dzi i zbroi. -Repair.Listener.Anvil2=&4Postawi\u0142e\u015b kowad\u0142o Odzysku, u\u017cyj go aby Odzyska\u0107 narz\u0119dzia oraz zbroj\u0119. -Repair.Listener=Naprawa: -Repair.SkillName=Naprawa -Repair.Skills.AdeptSalvage=&4Nie masz odpowiedniego poziomu aby Odzyskiwa\u0107 przedmioty. -Repair.Skills.AdeptDiamond=&4Masz za niski poziom aby naprawia\u0107 diament. -Repair.Skills.AdeptGold=&4Masz za niski poziom aby naprawia\u0107 z\u0142oto. -Repair.Skills.AdeptIron=&4Masz za niski poziom aby naprawia\u0107 \u017celazo. -Repair.Skills.AdeptStone=&4Masz za niski poziom aby naprawi\u0107 kamie\u0144. -Repair.Skills.Adept=Musisz mie\u0107 &e{0}&c poziom \u017ceby naprawi\u0107 &e{1} -Repair.Skills.FeltEasy=&7Bu\u0142ka z mas\u0142em. -Repair.Skills.FullDurability=&7Ten przedmiot jest ju\u017c w pe\u0142ni sprawny. -Repair.Skills.SalvageSuccess=&7Przedmiot Odzyskany! -Repair.Skills.NotFullDurability=&4Nie mo\u017cesz odzyska\u0107 uszkodzonych przedmiot\u00f3w. -Repair.Skills.Mastery=Mistrzostwo Napraw: &e {0} dodatkowej wytrzyma\u0142o\u015bci dla przedmiot\u00f3w -Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 zestackowanych przedmiot\u00f3w. -Repair.Skills.Super.Chance=Szansa Super Naprawy: &e{0} -Repair.Skillup=Umiejetnosc naprawiania wzrosla o {0}. Razem ({1}) -Repair.Pretty.Name=Naprawa -Salvage.Pretty.Name=Przetapianie -Repair.Arcane.Chance.Downgrade=&7AF Szansa na zdegradowanie: &e{0}% -Repair.Arcane.Chance.Success=&7AF Szanse na sukces: &e{0}% -Repair.Arcane.Downgrade=Energia magiczna tego przedmiotu spad\u0142a. -Repair.Arcane.Fail=Moc Arcane na zawsze opuscila przedmiot ! -Repair.Arcane.Lost=Nie posiada\u0142e\u015b wystarczaj\u0105co du\u017co do\u015bwiadczenia aby zatrzyma\u0107 ulepszenia. -Repair.Arcane.Perfect=&aNasyci\u0142e\u015b ten przedmiot magiczn\u0105 moc\u0105. -Repair.Arcane.Rank=Kowalstwo Ezoteryczne: &eRanga {0}/4 -Swords.Ability.Lower=&7**CHOWASZ SW\u00d3J MIECZ** -Swords.Ability.Ready=&a **PODNIOSLES SWOJ MIECZ** -Swords.Combat.Bleed.Chance=Szansa na Krwawienie: &e{0} -Swords.Combat.Bleed.Length=D\u0142ugo\u015bc Krwotoku: &e{0} ticks -Swords.Combat.Bleed.Note=&7NOTE: &e1 tykni\u0119cie zdarza si\u0119 co 2 sekundy -Swords.Combat.Bleeding.Started=&4 Krwawisz! -Swords.Combat.Bleeding.Stopped=&7Krwawienie &austa\u0142o&7! -Swords.Combat.Bleeding=&a**PRZECIWNIK KRAWI** -Swords.Combat.Counter.Chance=Szansa na Kontratak: &e{0} -Swords.Combat.Counter.Hit=&4Kontratak! -Swords.Combat.Countered=&a**KONTR-ATAK** -Swords.Combat.SS.Struck=&4Zosta\u0142e\u015b powalony przez Z\u0104BKOWANY ATAK! -Swords.SubSkill.CounterAttack.Name=Kontratak -Swords.SubSkill.SerratedStrikes.Name=Z\u0105bkowany Atak (ZDOLNO\u015a\u0106) -Swords.SubSkill.SerratedStrikes.Description={0} obrazen obszarowych, Krawienie+ obszarowo -Swords.Effect.4=Z\u0105bkowany Atak spowodowa\u0142 krwawienie -Swords.Effect.5={0} Czas miedzy krawieniem -Swords.SubSkill.Bleed.Name=Krwawienie -Swords.SubSkill.Bleed.Description=Spowodowano krwawienie -Swords.Listener=Miecze -Swords.SkillName=MIECZE -Swords.Skills.SS.Off=**Z\u0105bkowany Atak si\u0119 sko\u0144czy\u0142** -Swords.Skills.SS.On=&a**?Z\u0104BKOWANY? ATAK AKTYWOWANY** -Swords.Skills.SS.Refresh=&aTw\u00f3j &eZ\u0105bkowany Atak &ajest ju\u017c dost\u0119pny! -Swords.Skills.SS.Other.Off=Z\u0105bkowany Atak&a si\u0119 sko\u0144czy\u0142 &e{0} -Swords.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cZ\u0105bkowanego Ciosu! -Swords.Skillup=Umiej\u0119tno\u015b\u0107 Pos\u0142ugiwania si\u0119 Mieczem wzros\u0142a o {0}. Ca\u0142kowicie ({1}) -Swords.SS.Length=D\u0142ugo\u015b\u0107 Z\u0105bkowanego Ataku: &e{0}s -Taming.Ability.Bonus.0=Przyjazne dla \u015brodowiska -Taming.Ability.Bonus.1=Wilki unikn\u0119\u0142y zagro\u017cenia -Taming.Ability.Bonus.2=Grube Futro -Taming.Ability.Bonus.3=1/{0} Obrazenia, Odpornosc na ogien -Taming.Ability.Bonus.4=Odporno\u015b\u0107 na wstrz\u0105sy -Taming.Ability.Bonus.5=Eksplozje powoduja 1/{0} typowych obrazen -Taming.Ability.Bonus.6=Zaostrzone Pazury -Taming.Ability.Bonus.7=+{0} Obrazen -Taming.Ability.Bonus.8=Serwis FastFood\'u -Taming.Ability.Bonus.9={0} Szansa przy ataku na odnowienie \u017cycia -Taming.Ability.Bonus.11=Odzyskuj zdrowie podczas otrzymania obrazen od magii czy trucizny -Taming.Ability.Locked.0=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Taming.Ability.Locked.1=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Taming.Ability.Locked.2=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Taming.Ability.Locked.3=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Taming.Ability.Locked.4=ZABLOKOWANE DO POZIOMU {0}+ SKILL -Taming.Combat.Chance.Gore=Szansa na Brutalno\u015b\u0107: &e{0} -Taming.SubSkill.BeastLore.Name=Wiedza o zwierz\u0119tach -Taming.SubSkill.BeastLore.Description=Ko\u015b\u0107 - przyci\u0105ga uwag\u0119 wilk\u00f3w i ocelot\u00f3w -Taming.SubSkill.ShockProof.Name=Odporno\u015b\u0107 na wstrz\u0105sy -Taming.SubSkill.ShockProof.Description=Redukcja obra\u017ce\u0144 wybuchowych -Taming.SubSkill.CallOfTheWild.Name=Wezwanie Dzikich -Taming.SubSkill.CallOfTheWild.Description=Przywo\u0142uje zwierze po twojej stronie -Taming.SubSkill.CallOfTheWild.Description.2=&7COTW (Ocelot): Kucnij i kliknij LPM {0} z ryb\u0105 w r\u0119ce -Taming.Effect.15=&7COTW (Wolf): Kucnij i kliknij LPM {0} z ko\u015bci\u0105 w d\u0142oni -Taming.SubSkill.FastFoodService.Name=Serwis FastFood\'u -Taming.SubSkill.FastFoodService.Description=Szansa dla wilk\u00f3w na odnowienie \u017cycia przy ataku -Taming.SubSkill.Gore.Name=Brutalno\u015b\u0107 -Taming.SubSkill.Gore.Description=Cios krytyczny kt\u00f3ry wywo\u0142uje krwawienie -Taming.SubSkill.SharpenedClaws.Name=Zaostrzone Pazury -Taming.SubSkill.SharpenedClaws.Description=Dodatkowe Obra\u017cenia -Taming.SubSkill.EnvironmentallyAware.Name=Przyjazne dla \u015brodowiska -Taming.SubSkill.EnvironmentallyAware.Description=Strach przed Kaktusami/Law\u0105, Odporno\u015b\u0107 obra\u017cenia ze spadania -Taming.SubSkill.ThickFur.Name=Grube Futro -Taming.SubSkill.ThickFur.Description=Redukcja Obra\u017ce\u0144, Odporno\u015b\u0107 na ogie\u0144 -Taming.Listener.Wolf=&8Tw\u00f3j wilk biegnie do ciebie... -Taming.Listener=Oswajanie: -Taming.SkillName=OSWAJANIE -Taming.Skillup=Umiej\u0119tno\u015b\u0107 oswajania wzros\u0142a o {0}. Razem ({1}) -Taming.Summon.Complete=&aPrzywo\u0142ywanie uko\u0144czone -Taming.Summon.Fail.Ocelot=Obecnie masz przy sobie zbyt du\u017co ocelot\u00f3w aby przywo\u0142a\u0107 kolejnego. -Taming.Summon.Fail.Wolf=Obecnie masz przy sobie zbyt du\u017co wilk\u00f3w aby przywo\u0142a\u0107 kolejnego. -Unarmed.Ability.Berserk.Length=D\u0142ugo\u015b\u0107 Berserka: &e{0}s -Unarmed.Ability.Bonus.0=Styl \u017belaznej D\u0142oni -Unarmed.Ability.Bonus.1=Ulepszenie obra\u017ce\u0144 +{0} -Unarmed.Ability.Chance.ArrowDeflect=Szansa na Odbicie Strza\u0142y: &e{0} -Unarmed.Ability.Chance.Disarm=Szansa na Rozbrojenie: &e{0} -Unarmed.Ability.Chance.IronGrip=Szansa za Zelazny Chwyt: &e{0} -Unarmed.Ability.IronGrip.Attacker=Tw\u00f3j przeciwnik ma \u017celazny u\u015bcisk! -Unarmed.Ability.IronGrip.Defender=&aTw\u00f3j \u017belazny Uchwyt uchroni\u0142 ci\u0119 przed Rozbrojeniem! -Unarmed.Ability.Lower=&7**OPUSZCZASZ SWOJE PI\u0118\u015aCI** -Unarmed.Ability.Ready=&a**PRZYGOTOWUJESZ SWOJE PIESCI** -Unarmed.SubSkill.Berserk.Name=Berserk (Zdolnosc) -Unarmed.SubSkill.Berserk.Description=+50% DMG, Niszczy slabe materialy -Unarmed.SubSkill.Disarm.Name=Rozbrojenie -Unarmed.SubSkill.Disarm.Description=Rozbraja przeciwnika z przedmiotu trzymanego przez niego w r\u0119ku -Unarmed.SubSkill.IronArmStyle.Name=Styl zelaznego ramienia -Unarmed.SubSkill.IronArmStyle.Description=Wzmacnia twoj\u0105 d\u0142o\u0144 w czasie -Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strzaly -Unarmed.SubSkill.ArrowDeflect.Description=Odbijanie strzal -Unarmed.SubSkill.IronGrip.Name=Zelazny Chwyt -Unarmed.SubSkill.IronGrip.Description=Zapobiega przed Twoim rozbrojeniem -Unarmed.Listener=NIEUZBROJONY -Unarmed.SkillName=NIEUZBROJONY -Unarmed.Skills.Berserk.Off=**Berserk si\u0119 sko\u0144czy\u0142** -Unarmed.Skills.Berserk.On=&a**BERSERK AKTYWOWANY** -Unarmed.Skills.Berserk.Other.Off=Berserk&a si\u0119 sko\u0144czy\u0142 &e{0} -Unarmed.Skills.Berserk.Other.On=&a{0}&2 u\u017cy\u0142 &cBerserka! -Unarmed.Skills.Berserk.Refresh=&aTwoja zdolno\u015b\u0107 &eBerserka &ajest ju\u017c dost\u0119pna! -Unarmed.Skillup=Umiej\u0119tno\u015b\u0107 boksowania zwi\u0119kszona o {0}. Ca\u0142kowicie ({1}) -Woodcutting.Ability.0=Dmucharka do li\u015bci -Woodcutting.Ability.1=Zdmuchuje li\u015bcie -Woodcutting.Ability.Chance.DDrop=Szansa na Dwukrotny Drop: &e{0} -Woodcutting.Ability.Length=D\u0142ugo\u015bc Powalacza Drzew: &e{0}s -Woodcutting.Ability.Locked.0=ZABLOKOWANY DO POZIOMU {0}+ SKILL -Woodcutting.SubSkill.TreeFeller.Name=Powalacz Drzew -Woodcutting.SubSkill.TreeFeller.Description=Sprawia, i\u017c drzewa eksploduj\u0105 -Woodcutting.SubSkill.LeafBlower.Name=Dmucharka do li\u015bci -Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje li\u015bcie -Woodcutting.SubSkill.HarvestLumber.Name=Podwojny Drop -Woodcutting.SubSkill.HarvestLumber.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w -Woodcutting.Listener=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Woodcutting.SkillName=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Woodcutting.Skills.TreeFeller.Off=**Powalacz Drzew si\u0119 sko\u0144czy\u0142** -Woodcutting.Skills.TreeFeller.On=&a**POWALACZ DRZEW AKTYWOWANY** -Woodcutting.Skills.TreeFeller.Refresh=&aTwoja zdolno\u015b\u0107 &ePowalacz Drzew &a jest ju\u017c dost\u0119pna! -Woodcutting.Skills.TreeFeller.Other.Off=Powalenie Drzewa&a si\u0119 sko\u0144czy\u0142o &e{0} -Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &cPowalacza Drzew! -Woodcutting.Skills.TreeFeller.Splinter=TWOJA SIEKIERA ROZPAD\u0141A SI\u0118 NA DRZAZGI! -Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt du\u017ce! -Woodcutting.Skillup=Umiej\u0119tno\u015b\u0107 \u015bcinania wzros\u0142a o {0}. Razem ({1}) -Ability.Generic.Refresh=&a**UMIEJ\u0118TNO\u015aCI DOST\u0118PNE!** +#I'm going to try to normalize our locale file, forgive the mess for now. + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM +JSON.Rank=Ranga +JSON.DescriptionHeader=Opis +JSON.JWrapper.Header=Detale +JSON.Type.Passive=Pasywnie +JSON.Type.Active=Aktywne +JSON.Type.SuperAbility=Super umiej\u0119tno\u015b\u0107 +JSON.Locked=-=[ZABLOKOWANE]=- +JSON.LevelRequirement=Wymagany poziom +JSON.JWrapper.Target.Type=Typ Celu: +JSON.JWrapper.Target.Block=Blok +JSON.JWrapper.Target.Player=Gracz +JSON.JWrapper.Perks.Header=&6Szcz\u0119\u015bliwe Perki +JSON.JWrapper.Perks.Lucky={0}% Lepszej Szansy +JSON.Hover.Tips=Wskaz\u00f3wka +JSON.Acrobatics=Akrobatyka +JSON.Alchemy=Alchemia +JSON.Archery=\u0141ucznictwo +JSON.Axes=Siekiery +JSON.Excavation=Wykopalisko +JSON.Fishing=Rybarz +JSON.Herbalism=Zielarstwo +JSON.Mining=G\u00f3rnictwo +JSON.Repair=Naprawiacz +JSON.Salvage=Odzyskiwacz +JSON.Swords=Miecze +JSON.Taming=Tresowanie +JSON.Unarmed=Niezr\u0119czno\u015b\u0107 +JSON.Woodcutting=\u015acinacz Drzew +JSON.URL.Website=Oficjalna strona mcMMO! +JSON.URL.Discord=Oficjalny discord mcMMO! +JSON.URL.Patreon=Wesprzyj nossr50 i jego projekt mcMMO na Patreon! +JSON.URL.Spigot=Oficjalna strona pluginu mcMMO na Spigot! +JSON.URL.Translation=T\u0142umaczenie mcMMO na inne j\u0119zyki! +JSON.URL.Wiki=Oficjalne wiki mcMMO! +JSON.SkillUnlockMessage=&6[ mcMMO&e @&3{0} &6Ranga &3{1}&6 Odblokowana! ] +JSON.Hover.Rank=&e&lRanga:&r &f{0} +JSON.Hover.NextRank=&7&oNast\u0119pne ulepszenie na poziomie {0} +# for JSON.Hover.Mystery you can add {0} to insert the level required into the name, I don't like how that looks so I'm not doing that atm +JSON.Hover.Mystery=&7??? +JSON.Hover.Mystery2=&e[&8{0}&e]&8???&r +JSON.Hover.SkillName=&3{0}&r +JSON.Hover.SuperAbility=&5{0}&r +JSON.Hover.MaxRankSkillName=&6{0}&r +JSON.Hover.AtSymbolSkills=&e@ +JSON.Hover.AtSymbolURL=&e@ + +#This is the message sent to players when an ability is activated +JSON.Notification.SuperAbility={0} + +#These are the JSON Strings used for SubSkills +JSON.Acrobatics.Roll.Interaction.Activated=Pr\u00f3ba &c\u0141agodnego przewrotu +JSON.Acrobatics.SubSkill.Roll.Details.Tips=Je\u015bli b\u0119dziesz kuca\u0142 w czasie spadania, otrzymasz tylko po\u0142ow\u0119 obra\u017ce\u0144! +Anvil.SingleItemStack=&cNie mo\u017cesz odzyska\u0107 ani naprawi\u0107 stos\u00f3w przedmiot\u00f3w, kt\u00f3re zawieraj\u0105 wi\u0119cej ni\u017c jeden przedmiot, najpierw podziel stos. + +#DO NOT USE COLOR CODES IN THE JSON KEYS +#COLORS ARE DEFINED IN advanced.yml IF YOU WISH TO CHANGE THEM + +mcMMO.Template.Prefix=&6(&amcMMO&6) &7{0} +# BEGIN STYLING +Ability.Generic.Refresh=&a**OD\u015aWIE\u017bONO UMIEJ\u0118TNO\u015aCI!** Ability.Generic.Template.Lock=&7{0} -Ability.Generic.Template=&6{0}: &3{1} -Combat.ArrowDeflect=&f**ODBICIE STRZALY** -Combat.BeastLore=&a**WIEDZA O ZWIERZETACH** -Combat.BeastLoreHealth=&3\u017bycie (&a{0}&3/{1}) -Combat.BeastLoreOwner=&3Wlasciciel (&c{0}&3) -Combat.Gore=&a**KRWOTOK** -Combat.StruckByGore=**WYKRWAWIASZ SI\u0118** -Combat.TargetDazed=Cel zostal &4oszolomiony. -Combat.TouchedFuzzy=&4Zostales oszolomiony. -mcMMO.Description=&3O &emcMMO&3 Project:,&6mcMMO jest &copen source&6 modem RPG stworzonym w lutym 2011 r.,&6przez &9nossr50&6. Celem jest wprowadzenie doswiadczen RPG.,&3Porady:,&6 - &aUzywaj &c/mcmmo help&a by zobaczyc komendy,&6 - &aPisz &c/NAZWA_UMIEJETNOSCI&a by zobaczyc informacje na jej temat,&3Programisci:,&6 - &anossr50 &9(Zalozyciel),&6 - &aGJ &9(Manager projektu),&6 - &aNuclearW &9(Developer),&6 - &abm01 &9(Developer),&6 - &aTfT_02 &9(Developer),&6 - &aGlitchfinder &9(Developer),&6 - &at00thpick1 &9(Developer),&3Przydatne linki:,&6 - &ahttps://github.com/mcMMO-Dev/mcMMO/issues&6 Zglaszanie bled\u00f3w,&6 - &a#mcmmo @ irc.esper.net&6 IRC Chat, -Commands.addlevels.AwardAll.1=&aOtrzyma\u0142e\u015b {0} poziom\u00f3w we wszystkich dziedzinach! -Commands.addlevels.AwardAll.2=Wszystkie dziedziny zosta\u0142y zmienione na poziom {0}. -Commands.addlevels.AwardSkill.1=&aZdoby\u0142e\u015b {0} poziom\u00f3w w dziedzinie {1}! -Commands.addlevels.AwardSkill.2={0} zosta\u0142 zmieniony dla {1}. -Commands.addxp.AwardAll=&aOtrzyma\u0142e\u015b {0} XP\'a we wszystkich dziedzinach! -Commands.addxp.AwardSkill=&aOtrzyma\u0142e\u015b {0} XP\'a we dziedzinie {1}! -Commands.Ability.Off=Umiej\u0119tno\u015b\u0107 wy\u0142\u0105czona &c -Commands.Ability.On=Umiej\u0119tno\u015b\u0107 w\u0142\u0105czona &a -Commands.AdminChat.Off=Czat tylko dla adminow &c Wylaczony -Commands.AdminChat.On=Czat tylko dla adminow &c W\u0142\u0105czony -Commands.AdminToggle=- Wlacza/wylacza czat adminow -Commands.Chat.Console=\"Konsola\" -Commands.Disabled=Komenda ta jest wylaczona. -Commands.DoesNotExist=Nie ma takiego gracza! -Commands.GodMode.Disabled=Nie\u015bmiertelno\u015b\u0107 wy\u0142\u0105czona -Commands.GodMode.Enabled=Nie\u015bmiertelno\u015b\u0107 w\u0142\u0105czona -Commands.GodMode.Forbidden=[mcMMO] Nie\u015bmiertelno\u015b\u0107 nie jest dozwolona na tym \u015bwiecie. -Commands.Inspect= &c- Pokazuje informacje o graczu -Commands.Party.Invite.Accepted=&aZaproszenie zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} -Commands.Invite.Success=&aPomyslnie wyslano zaproszenie -Commands.Leaderboards= &c- Rankingi -Commands.mcc.Header=---[]&emcMMO Komendy&c[]--- -Commands.mcgod=- W\u0142\u0105cza/Wy\u0142\u0105cza Nie\u015bmiertelno\u015b\u0107 -Commands.mchud.Invalid=Nie ma takiego Typu Interfejsu. -Commands.mcpurge.Success=&aBaza danych zosta\u0142a wyczyszczona! -Commands.mcrank.Heading=&6-=OSOBISTE RANKINGI=- -Commands.mcrank.Overall=Og\u00f3lne Statystyki&a - &6Ranga &f#&a{0} -Commands.mcrank.Player=CEL: &f{0} -Commands.mcrank.Skill={0}&a - &6Ranga &f#&a{1} +# Skill Command Styling +Ability.Generic.Template=&3{0}: &a{1} +Ability.Generic.Template.Custom=&3{0} +Skills.Overhaul.Header=&c[]=====[]&a {0} &c[]=====[] +Effects.Effects=EFEKTY +Effects.SubSkills.Overhaul=Sub-umiej\u0119tno\u015bci +Effects.Child.Overhaul=&3Child Lv.&e {0}&3: {1} +Effects.Child.ParentList=&a{0}&6(&3Lv.&e{1}&6) +Effects.Level.Overhaul=&6LVL: &e{0} &3XP&e(&6{1}&e/&6{2}&e) +Effects.Parent=&6{0} - +Effects.Template=&3{0}: &a{1} +Commands.Stats.Self.Overhaul=Statystyki +Commands.XPGain.Overhaul=&6ZYSK XP: &3{0} +MOTD.Version.Overhaul=&6[mcMMO] &3Era Remontu&6 - &3{0} +Overhaul.mcMMO.Header=&c[]=====[]&a mcMMO - Era Remontu &c[]=====[] +Overhaul.mcMMO.Url.Wrap.Prefix=&c[| +Overhaul.mcMMO.Url.Wrap.Suffix=&c|] +Overhaul.mcMMO.MmoInfo.Wiki=&e[&fZobacz t\u0119 umiej\u0119tno\u015b\u0107 na wiki!&e] +# Overhaul.Levelup can take {0} - Skill Name defined in Overhaul.Name {1} - Amount of levels gained {2} - Level in skill +Overhaul.Levelup=&l{0} wzros\u0142o/a do &r&a&l{2}&r&f. +Overhaul.Name.Acrobatics=Akrobatyka +Overhaul.Name.Alchemy=Alchemia +Overhaul.Name.Archery=\u0141ucznictwo +Overhaul.Name.Axes=Siekiery +Overhaul.Name.Excavation=Wykopalisko +Overhaul.Name.Fishing=Rybarz +Overhaul.Name.Herbalism=Zielarstwo +Overhaul.Name.Mining=G\u00f3rnictwo +Overhaul.Name.Repair=Naprawiacz +Overhaul.Name.Salvage=Odzyskiwacz +Overhaul.Name.Smelting=Przepalanie +Overhaul.Name.Swords=Miecze +Overhaul.Name.Taming=Tresowanie +Overhaul.Name.Unarmed=Niezr\u0119czno\u015b\u0107 +Overhaul.Name.Woodcutting=\u015acinacz Drzew +# /mcMMO Command Style Stuff +Commands.mcc.Header=&c---[]&amcMMO Komendy&c[]--- +Commands.Other=&c---[]&aSPECJALNE KOMENDY&c[]--- +Commands.Party.Header=&c-----[]&aDRU\u017bYNA&c[]----- +Commands.Party.Features.Header=&c-----[]&aFUNKCJE&c[]----- +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! +XPBar.Template={0} +XPBar.Template.EarlyGameBoost=&6Nauka nowej umiej\u0119tno\u015bci... +XPBar.Acrobatics=Akrobatyka Lv.&6{0} +XPBar.Alchemy=Alchemia Lv.&6{0} +XPBar.Archery=\u0141ucznictwo Lv.&6{0} +XPBar.Axes=Siekiery Lv.&6{0} +XPBar.Excavation=Wykopalisko Lv.&6{0} +XPBar.Fishing=Rybarz Lv.&6{0} +XPBar.Herbalism=Zielarstwo Lv.&6{0} +XPBar.Mining=G\u00f3rnictwo Lv.&6{0} +XPBar.Repair=Naprawiacz Lv.&6{0} +XPBar.Salvage=Odzyskiwacz Lv.&6{0} +XPBar.Smelting=Przepalanie Lv.&6{0} +XPBar.Swords=Miecze Lv.&6{0} +XPBar.Taming=Tresowanie Lv.&6{0} +XPBar.Unarmed=Niezr\u0119czno\u015b\u0107 Lv.&6{0} +XPBar.Woodcutting=\u015acinacz Drzew Lv.&6{0} +#This is just a preset template that gets used if the 'ExtraDetails' setting is turned on in experience.yml (off by default), you can ignore this template and just edit the strings above +XPBar.Complex.Template={0} &3 {4}&f% &3(&f{1}&3/&f{2}&3) +# XP BAR Allows for the following variables -- {0} = Skill Level, {1} Current XP, {2} XP Needed for next level, {3} Power Level, {4} Percentage of Level +# Make sure you turn on Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained if you want the XP bar title to update every time a player gains XP! +# END STYLING + +#ACROBATICS +Acrobatics.Ability.Proc=&a**\u0141askawe L\u0105dowanie** +Acrobatics.Combat.Proc=&a**Unik** +Acrobatics.SubSkill.Roll.Stats=&6Szansa na &e{0}%&6 Szansa na \u0142\u0105ske&e {1}% +Acrobatics.SubSkill.Roll.Stat=Szansa na +Acrobatics.SubSkill.Roll.Stat.Extra=Szansa na \u0141agodny Przewr\u00f3t +Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t +Acrobatics.SubSkill.Roll.Description=Wyl\u0105duj strategicznie, aby unikn\u0105\u0107 uszkodze\u0144. +Acrobatics.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: &e{0} +Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0142agodny przewr\u00f3t: &e{0} +Acrobatics.SubSkill.Roll.Mechanics=&7Przewr\u00f3t to biernie aktywna Sub-Umiej\u0119tno\u015b\u0107.\nZawsze kiedy otrzymujesz obra\u017cenia od wysoko\u015bci, jest szansa, \u017ce zostan\u0105 one zredukowane bazuj\u0105c na poziomie umiej\u0119tno\u015bci, na poziomie &e{6}%&7 masz &e{0}%&7 szansy na zablokowanie obra\u017ce\u0144, i &e{1}%&7 je\u015bli aktywujesz \u0142agony przewr\u00f3t.\nSzansa na sukces jest skalowana w zale\u017cno\u015bci od twojego poziomu umiej\u0119tno\u015bci na liniowej krzywej, a\u017c do poziomu &e{2}&7 gdzie osi\u0105ga maximum, ka\u017cdy poziom akrobatyki daje Ci &e{3}%&7 szansy na sukces.\nPrzytrzymuj\u0105c przycisk skradania si\u0119, mo\u017cesz podwoi\u0107 swoje szanse, aby unikn\u0105\u0107 obra\u017ce\u0144 od upadku! Przytrzymywanie shiftu zamienia Przewr\u00f3t na \u0141agodny Przewr\u00f3t. +Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny przewr\u00f3t +Acrobatics.SubSkill.GracefulRoll.Description=Podwaja efekt normalnego przewrotu. +Acrobatics.SubSkill.Dodge.Name=Unik +Acrobatics.SubSkill.Dodge.Description=Redukuje obra\u017cenia od ataku o po\u0142ow\u0119 +Acrobatics.SubSkill.Dodge.Stat=Szansa na unik +Acrobatics.Listener=Akrobatyka: +Acrobatics.Roll.Text=&o**Przewr\u00f3t** +Acrobatics.SkillName=AKROBATYKA +#ALCHEMY +Alchemy.SubSkill.Catalysis.Name=Kataliza +Alchemy.SubSkill.Catalysis.Description=Zwi\u0119ksza szybko\u015b\u0107 warzenia mikstur. +Alchemy.SubSkill.Catalysis.Stat=Szybko\u015b\u0107 warzenia mikstur. +Alchemy.SubSkill.Concoctions.Name=Mikstury +Alchemy.SubSkill.Concoctions.Description=Warz mikstury z wi\u0119ksz\u0105 ilo\u015bci\u0105 sk\u0142adnik\u00f3w. +Alchemy.SubSkill.Concoctions.Stat=Ranking mikstur: &a{0}&3/&a{1} +Alchemy.SubSkill.Concoctions.Stat.Extra=Sk\u0142adniki [&a{0}&3]: &a{1} +Alchemy.Listener=Alchemia: +Alchemy.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015aCI (KATALIZA) +Alchemy.SkillName=ALCHEMIA +#ARCHERY + + +Archery.SubSkill.SkillShot.Name=Umiej\u0119tne strzelanie +Archery.SubSkill.SkillShot.Description=Zwi\u0119ksza obra\u017cenia zadawane \u0142ukiem +Archery.SubSkill.SkillShot.Stat=Premia do obra\u017ce\u0144 od \u0142uku +Archery.SubSkill.Daze.Name=Oszo\u0142omienie +Archery.SubSkill.Daze.Description=Osza\u0142amia wroga i zadaje dodatkowe obra\u017cenia +Archery.SubSkill.Daze.Stat=Szansa na oszo\u0142omienie +Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie strza\u0142 +Archery.SubSkill.ArrowRetrieval.Description=Szansa na odzyskanie strza\u0142 ze zw\u0142ok +Archery.SubSkill.ArrowRetrieval.Stat=Szansa na odzyskanie strza\u0142y +Archery.SubSkill.ArcheryLimitBreak.Name=Prze\u0142amywanie granic \u0142ucznictwa +Archery.SubSkill.ArcheryLimitBreak.Description=Prze\u0142am swoje limity. Znacznie zwi\u0119ksza obra\u017cenia zadawane przeciwnikom! +Archery.SubSkill.ArcheryLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amywanie Limit\u00f3w. +Archery.Listener=\u0141ucznictwo: +Archery.SkillName=\u0141UCZNICTWO +#AXES +Axes.Ability.Bonus.0=Mistrz Siekiery +Axes.Ability.Bonus.1=Bonusowe {0} obra\u017ce\u0144 +Axes.Ability.Bonus.2=Uderzenie zbroi +Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obra\u017ce\u0144 zbroi +Axes.Ability.Bonus.4=Wi\u0119kszy Wp\u0142yw +Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obra\u017ce\u0144 przeciwnikom bez zbroi. +Axes.Ability.Lower=&7Opuszczasz sw\u00f3j top\u00f3r. +Axes.Ability.Ready=&6Przygotuj&3 sw\u00f3j top\u00f3r. +Axes.Ability.Ready.Extra=&6Przygotuj&3 sw\u00f3j top\u00f3r. &7({0} pozosta\u0142o {1}s czasu odnowienia) +Axes.Combat.CritStruck=&4Zosta\u0142e\u015b KRYTYCZNIE trafiony! +Axes.Combat.CriticalHit=KRYTYCZNE UDERZENIE! +Axes.Combat.GI.Proc=&a**UDERZAJ Z WIELK\u0104 SI\u0141\u0104** +Axes.Combat.GI.Struck=**UDERZENIE Z WI\u0118KSZYM WP\u0141YWEM** +Axes.Combat.SS.Struck=&4Uderzono przez PRZECINACZ CZASZEK! +Axes.SubSkill.SkullSplitter.Name=Przecinacz czaszek +Axes.SubSkill.SkullSplitter.Description=Zadaje obra\u017cenia AoE +Axes.SubSkill.SkullSplitter.Stat=Trwanie Przecinacza Czaszek +Axes.SubSkill.CriticalStrikes.Name=Trafienie krytyczne +Axes.SubSkill.CriticalStrikes.Description=Podw\u00f3jne obra\u017cenia +Axes.SubSkill.CriticalStrikes.Stat=Szansa na trafienie krytyczne +Axes.SubSkill.AxeMastery.Name=Mistrz Siekiery +Axes.SubSkill.AxeMastery.Description=Dodaje dodatkowe obra\u017cenia +Axes.SubSkill.AxesLimitBreak.Name=Prze\u0142amanie limit\u00f3w siekier +Axes.SubSkill.AxesLimitBreak.Description=Prze\u0142amujesz swoje granice. Zwi\u0119ksza obra\u017cenia zadawane przeciwnikom. +Axes.SubSkill.AxesLimitBreak.Stat=Maksymalne obra\u017cenia Prze\u0142amanie Limit\u00f3w +Axes.SubSkill.ArmorImpact.Name=Uderzenie pancerza +Axes.SubSkill.ArmorImpact.Description=Uderzenie z si\u0142\u0105 wystarczaj\u0105c\u0105 do zniszczenia zbroi +Axes.SubSkill.GreaterImpact.Name=Wi\u0119kszy wp\u0142yw +Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia dla byt\u00f3w bez zbroi. +Axes.Listener=Siekiery: +Axes.SkillName=SIEKIERY +Axes.Skills.SS.Off=**Przecinacz Czaszek zosta\u0142 zu\u017cyty** +Axes.Skills.SS.On=&a**Przecinacz Czaszek AKTYWOWANY** +Axes.Skills.SS.Refresh=&aTw\u00f3j &ePrzecinacz Czaszek &azosta\u0142 od\u015bwie\u017cony! +Axes.Skills.SS.Other.Off=Przecinacz czaszek zosta\u0142 zu\u017cyty na &e{0} +Axes.Skills.SS.Other.On=&a{0}&2 u\u017cy\u0142 &cPrzecinacz Czaszek! +#EXCAVATION +Excavation.Ability.Lower=&7Opuszczasz swoj\u0105 \u0142opat\u0119. +Excavation.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 \u0141opat\u0119. +Excavation.SubSkill.GigaDrillBreaker.Name=Giga Wiert\u0142ol +Excavation.SubSkill.GigaDrillBreaker.Description=3x Cz\u0119stotliwo\u015b\u0107 dropu, 3x EXP, +Pr\u0119dko\u015b\u0107 +Excavation.SubSkill.GigaDrillBreaker.Stat=Czas odnowienia Giga Wiert\u0142a +Excavation.SubSkill.Archaeology.Name=Archeologia +Excavation.SubSkill.Archaeology.Description=Odkryj tajemnice tego \u015bwiata! Wysokie poziomy umiej\u0119tno\u015bci zwi\u0119kszaj\u0105 Twoje szanse na znalezienie kul do\u015bwiadczenia, gdy znajdziesz skarb! +Excavation.SubSkill.Archaeology.Stat=Szansa Archeologii na kul\u0119 do\u015bwiadczenia +Excavation.SubSkill.Archaeology.Stat.Extra=Liczba z Archeologii na kul\u0119 do\u015bwiadczenia +Excavation.Listener=Wykopalisko: +Excavation.SkillName=WYKOPALISKO +Excavation.Skills.GigaDrillBreaker.Off=**Giga Wiert\u0142o przesta\u0142o dzia\u0142a\u0107** +Excavation.Skills.GigaDrillBreaker.On=&a**GIGA WIERT\u0141O AKTYWOWANO** +Excavation.Skills.GigaDrillBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eGiga Wiert\u0142o &azosta\u0142a od\u015bwie\u017cona! +Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Wiert\u0142o&a przesta\u0142o dzia\u0142a\u0107 na &e{0} +Excavation.Skills.GigaDrillBreaker.Other.On=&a{0}&2 u\u017cy\u0142/a &cGiga Wiert\u0142o! +#FISHING +Fishing.ScarcityTip=&e&oTen obszar cierpi z powodu prze\u0142owienia. Zarzu\u0107 w\u0119dk\u0119 w inne miejsce, aby z\u0142owi\u0107 wi\u0119cej ryb. Co najmniej {0} bloki dalej. +Fishing.Scared=&7&oChaotyczne ruchy odstraszaj\u0105 ryby! +Fishing.Exhausting=&c&oNiew\u0142a\u015bciwe u\u017cycie w\u0119dki spowoduje zm\u0119czenie i zu\u017cycie w\u0119dki! +Fishing.LowResourcesTip=&7Wyczuwasz, \u017ce na tym obszarze nie zosta\u0142o wiele ryb. Spr\u00f3buj \u0142owi\u0107 co najmniej {0} bloki dalej. +Fishing.Ability.Info=Magic Hunter: &7 **Ulepsz z rang\u0105 \u0141owca Nagr\u00f3d** +Fishing.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (POTRZ\u0104SANIE) +Fishing.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MRO\u0179NE PO\u0141OWY) +Fishing.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (MISTRZ \u0141OWIENIA) +Fishing.SubSkill.TreasureHunter.Name=\u0141owca Nagr\u00f3d +Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects +Fishing.SubSkill.TreasureHunter.Stat=Ranga \u0141owcy Nagr\u00f3d: &a{0}&3/&a{1} +Fishing.SubSkill.TreasureHunter.Stat.Extra=Cz\u0119stotliwo\u015b\u0107 dropu: &7Zwyk\u0142e: &e{0} &aNiezwyk\u0142e: &e{1}\n&9Rzadkie: &e{2} &dEpickie: &e{3} &6Legendarne: &e{4} &bMityczne: &e{5} +Fishing.SubSkill.MagicHunter.Name=\u0141owca Magii +Fishing.SubSkill.MagicHunter.Description=Znajd\u017a zakl\u0119te przedmioty +Fishing.SubSkill.MagicHunter.Stat=Szansa \u0142owcy magii +Fishing.SubSkill.Shake.Name=Potrz\u0105sanie +Fishing.SubSkill.Shake.Description=Strz\u0105\u015bnij przedmioty z mob\u00f3w lub w\u0119dki gracza. +Fishing.SubSkill.Shake.Stat=Szansa na Potrz\u0105\u015bni\u0119cie +Fishing.SubSkill.FishermansDiet.Name=Dieta rybaka +Fishing.SubSkill.FishermansDiet.Description=Poprawia g\u0142\u00f3d przywracany z ryb +Fishing.SubSkill.FishermansDiet.Stat=Ranga Diety Rybaka:&a {0} +Fishing.SubSkill.MasterAngler.Name=Mistrz w\u0119dkarstwa +Fishing.SubSkill.MasterAngler.Description=Ryby \u0142owione s\u0105 cz\u0119\u015bciej, lepiej sprawdza si\u0119 podczas \u0142owienia z \u0142odzi. +Fishing.SubSkill.MasterAngler.Stat=Skr\u00f3cenie czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds +Fishing.SubSkill.MasterAngler.Stat.Extra=Skr\u00f3cenie maksymalnego czasu oczekiwania na w\u0119dkowanie: &a-{0} seconds +Fishing.SubSkill.IceFishing.Name=Ice Fishing +Fishing.SubSkill.IceFishing.Description=Pozwala \u0142owi\u0107 w lodowatych biomach +Fishing.SubSkill.IceFishing.Stat=Mro\u017ane Po\u0142owy +Fishing.Chance.Raining=&9 Premia za deszcz +Fishing.Listener=W\u0119dkarstwo: +Fishing.Ability.TH.MagicFound=&7Z tym haczykiem czujesz odrobin\u0119 magii... +Fishing.Ability.TH.Boom=&7BOOM TIME!!! +Fishing.Ability.TH.Poison=&7 +Fishing.SkillName=W\u0118DKARSTWO +#HERBALISM +Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion, aby rozprzestrzeni\u0107 Zielona Tera. +Herbalism.Ability.GTh.Fail=**ZIELONA TERA ZAWODZI** +Herbalism.Ability.GTh=&a**GREEN THUMB** +Herbalism.Ability.Lower=&7Opuszczasz swoj\u0105 motyk\u0119. +Herbalism.Ability.Ready=&6Przygotowujesz&3 swoj\u0105 motyk\u0119. +Herbalism.Ability.ShroomThumb.Fail=**HALUCYNKI ZAWODZ\u0104** +Herbalism.SubSkill.GreenTerra.Name=Zielony L\u0105d +Herbalism.SubSkill.GreenTerra.Description=Rozprzestrze\u0144 Terr\u0119, 3x Drops, Boosts Green Thumb +Herbalism.SubSkill.GreenTerra.Stat=Czas odnowienia Zielonej Terry +Herbalism.SubSkill.GreenThumb.Name=Zielona R\u0105czka +Herbalism.SubSkill.GreenThumb.Description=Automatycznie sadzi nasiona, kiedy uprawisz ziemi\u0119. +Herbalism.SubSkill.GreenThumb.Stat=Szansa na Zielona R\u0105czka +Herbalism.SubSkill.GreenThumb.Stat.Extra=Etap Zielonej R\u0105czki: &a Uprawy rosn\u0105 w fazie {0} +Herbalism.Effect.4=Zielona R\u0105czka (Bloki) +Herbalism.SubSkill.GreenThumb.Description.2=Spraw, aby ceg\u0142y by\u0142y omsza\u0142e lub spraw, aby trawa uros\u0142a +Herbalism.SubSkill.FarmersDiet.Name=Dieta Farmera +Herbalism.SubSkill.FarmersDiet.Description=Zwi\u0119ksza g\u0142\u00f3d przywracany z \u017cywno\u015bci uprawianej +Herbalism.SubSkill.FarmersDiet.Stat=Ranga Diety Farmera: &a {0} +Herbalism.SubSkill.DoubleDrops.Name=Podw\u00f3jny \u0142up +Herbalism.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up +Herbalism.SubSkill.DoubleDrops.Stat=Szansa na podw\u00f3jny drop +Herbalism.SubSkill.HylianLuck.Name=Wielkie Szcz\u0119\u015bcie +Herbalism.SubSkill.HylianLuck.Description=Daje niewielk\u0105 szans\u0119 na znale\u017aenie rzadkich przedmiot\u00f3w +Herbalism.SubSkill.HylianLuck.Stat=Szansa na Wielkie Szcz\u0119\u015bcie +Herbalism.SubSkill.ShroomThumb.Name=Halucynki +Herbalism.SubSkill.ShroomThumb.Description=Roz\u0142\u00f3\u017c grzybni\u0119 na ziemi i trawie +Herbalism.SubSkill.ShroomThumb.Stat=Szansa na Halucynki +Herbalism.HylianLuck=&aSzcz\u0119\u015bcie Hyrule jest dzi\u015b z tob\u0105! +Herbalism.SkillName=ZIELARSTWO +Herbalism.Skills.GTe.Off=**Zielona Terra wy\u0142\u0105czy\u0142a si\u0119** +Herbalism.Skills.GTe.On=&a**ZIELONA TERRA AKTYWOWANA** +Herbalism.Skills.GTe.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eZielona Terra &azosta\u0142a od\u015bwie\u017cona! +Herbalism.Skills.GTe.Other.Off=Zielona Terra&a zosta\u0142a wy\u0142\u0105czona na &e{0} +Herbalism.Skills.GTe.Other.On=&a{0}&2 u\u017cy\u0142/a &cZielona Terra! +#MINING +Mining.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PODMUCH G\u00d3RNICTWA) +Mining.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WI\u0118KSZE BOMBY) +Mining.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (EKSPERTYZY ROZBI\u00d3RKI) +Mining.Ability.Lower=&7Opuszczasz sw\u00f3j kilof. +Mining.Ability.Ready=&3You &6ready&3 Tw\u00f3j kilof. +Mining.SubSkill.SuperBreaker.Name=Super Niszczyciel +Mining.SubSkill.SuperBreaker.Description=Pr\u0119dko\u015b\u0107+, Szansa na potr\u00f3jny \u0142up +Mining.SubSkill.SuperBreaker.Stat=Trwanie: Super Niszczyciel +Mining.SubSkill.DoubleDrops.Name=Podw\u00f3jny drop +Mining.SubSkill.DoubleDrops.Description=Podwaja normalny \u0142up +Mining.SubSkill.DoubleDrops.Stat=Podw\u00f3jna szansa na upuszczenie +Mining.SubSkill.BlastMining.Name=Podmuch G\u00f3rnictwa +Mining.SubSkill.BlastMining.Description=Premie do wydobywania z TNT +Mining.SubSkill.BlastMining.Stat=Blast Mining:&a Rank {0}/{1} &7({2}) +Mining.SubSkill.BlastMining.Stat.Extra=Blast Radius Increase: &a+{0} +Mining.SubSkill.BiggerBombs.Name=Wi\u0119ksze bomby +Mining.SubSkill.BiggerBombs.Description=Zwi\u0119ksza promie\u0144 wybuchu +Mining.SubSkill.DemolitionsExpertise.Name=Ekspertyzy Rozbi\u00f3rki +Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obra\u017cenia zadawane TNT +Mining.SubSkill.DemolitionsExpertise.Stat=Zmniejszenie obra\u017ce\u0144 od eksperta od wyburze\u0144 +Mining.Listener=G\u00f3rnictwo: +Mining.SkillName=G\u00d3RNICTWO +Mining.Skills.SuperBreaker.Off=**Super Niszczyciel wy\u0142\u0105czy\u0142 si\u0119** +Mining.Skills.SuperBreaker.On=&a**SUPER NISZCZYCIEL AKTYWOWANY** +Mining.Skills.SuperBreaker.Other.Off=Super Niszczyciel&a wy\u0142\u0105czy\u0142 si\u0119 na for &e{0} +Mining.Skills.SuperBreaker.Other.On=&a{0}&2 u\u017cy\u0142 &cSuper Niszczyciel! +Mining.Skills.SuperBreaker.Refresh=&aTwoja umiej\u0119tno\u015b\u0107 &eSuper Niszczyciel &azosta\u0142a od\u015bwie\u017cona! +#Blast Mining +Mining.Blast.Boom=&7**BOOM** +Mining.Blast.Cooldown= +Mining.Blast.Effect=+{0} ore yield, {1}x drops +Mining.Blast.Other.On=&a{0}&2 has used &cBlast Mining! +Mining.Blast.Refresh=&aYour &eBlast Mining &aability is refreshed! +#REPAIR +Repair.SubSkill.Repair.Name=Naprawa +Repair.SubSkill.Repair.Description=Naprawa Narz\u0119dzi i Zbroi +Repair.SubSkill.GoldRepair.Name=Naprawa Z\u0142ota ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.GoldRepair.Description=Naprawa z\u0142otych narz\u0119dzi & zbroi +Repair.SubSkill.IronRepair.Name=Naprawa \u017belaza ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.IronRepair.Description=Naprawa \u017celaznych narz\u0119dzi & zbroi +Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ UMIEJ\u0118TNO\u015a\u0106) +Repair.SubSkill.StoneRepair.Description=Naprawa kamiennych narz\u0119dzi +Repair.SubSkill.RepairMastery.Name=Mistrz napraw +Repair.SubSkill.RepairMastery.Description=Zwi\u0119kszona kwota naprawy +Repair.SubSkill.RepairMastery.Stat=Mistrz napraw: &aDodatkowo przywr\u00f3cono {0} wytrzyma\u0142o\u015bci. +Repair.SubSkill.SuperRepair.Name=Super Naprawa +RepairRepair.SubSkill.SuperRepair.Description=Podwojona skuteczno\u015b\u0107 +Repair.SubSkill.SuperRepair.Stat=Szansa na Super Napraw\u0119 +Repair.SubSkill.DiamondRepair.Name=Naprawa Diament\u00f3w ({0}+ SKILL) +Repair.SubSkill.DiamondRepair.Description=Napraw diamentowe narz\u0119dzia i zbroj\u0119 +Repair.SubSkill.ArcaneForging.Name=Tajemne Fa\u0142szowanie +Repair.SubSkill.ArcaneForging.Description=Naprawa magicznych przedmiot\u00f3w +Repair.SubSkill.ArcaneForging.Stat=Ranga Tajemnego Fa\u0142szowania: &e {0}/{1} +Repair.SubSkill.ArcaneForging.Stat.Extra=&3Szansa na Tajemne Fa\u0142szowanie:&7 Powodzenie: &a{0}&7%, Niepowodzenie: &c{1}&7% +Repair.Error=&4mcMMO napotka\u0142 b\u0142\u0105d podczas pr\u00f3by naprawy tego przedmiotu! +Repair.Listener.Anvil=&4r Umie\u015bci\u0142e\u015b kowad\u0142o, kowad\u0142a mog\u0105 naprawia\u0107 narz\u0119dzia i zbroj\u0119. +Repair.Listener=Naprawianie: +Repair.SkillName=NAPRAWIANIE +Repair.Skills.AdeptDiamond=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Diament. +Repair.Skills.AdeptGold=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 z\u0142oto. +Repair.Skills.AdeptIron=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 \u017celazo. +Repair.Skills.AdeptStone=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby naprawi\u0107 Stone. +Repair.Skills.Adept=&cMusisz mie\u0107 &e{0}&c poziom, aby naprawi\u0107 &e{1} +Repair.Skills.FeltEasy=&7To by\u0142o \u0142atwe. +Repair.Skills.FullDurability=&7To znaczy przy pe\u0142nej trwa\u0142o\u015bci. +Repair.Skills.StackedItems=&4Nie mo\u017cesz naprawia\u0107 u\u0142o\u017conych w stos przedmiot\u00f3w. +Repair.Pretty.Name=Naprawianie +#Arcane Forging +Repair.Arcane.Downgrade=W przypadku tego przedmiotu zmniejszono tajemn\u0105 moc. +Repair.Arcane.Fail=Tajemna moc na sta\u0142e opu\u015bci\u0142a przedmiot. +Repair.Arcane.Lost=Nie mia\u0142e\u015b wystarczaj\u0105cych umiej\u0119tno\u015bci, aby zachowa\u0107 jakiekolwiek zakl\u0119cia. +Repair.Arcane.Perfect=&aUtrzyma\u0142e\u015b/a\u015b tajemn\u0105 moc w tym przedmiocie. +#SALVAGE +Salvage.Pretty.Name=Odzyskiwanie +Salvage.SubSkill.UnderstandingTheArt.Name=Zrozumie\u0107 sztuk\u0119 +Salvage.SubSkill.UnderstandingTheArt.Description=Nie tylko przekopujesz \u015bmieci s\u0105siad\u00f3w, ale tak\u017ce dbasz o \u015brodowisko. +\nWzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci Odzyskiwacza. +Salvage.SubSkill.ScrapCollector.Name=Zbieracz z\u0142omu +Salvage.SubSkill.ScrapCollector.Description=Odzyskaj materia\u0142y z przedmiotu, idealne odzyskanie zale\u017cy od umiej\u0119tno\u015bci i szcz\u0119\u015bcia. +Salvage.SubSkill.ScrapCollector.Stat=Zbieracz z\u0142omu: &aOdzyskaj do & e {0} & jednej rzeczy. W gr\u0119 wchodzi troch\u0119 szcz\u0119\u015bcia. +Salvage.SubSkill.ArcaneSalvage.Name=Tajemne odzyskiwanie +Salvage.SubSkill.ArcaneSalvage.Description=Wydobywaj zakl\u0119cia z przedmiot\u00f3w +Salvage.SubSkill.ArcaneSalvage.Stat=Ranga Tajemnego odzyskiwania: &e {0}/{1} +Salvage.Ability.Bonus.0=Zbieracz z\u0142omu +Salvage.Ability.Bonus.1= +Salvage.Arcane.ExtractFull=&7 Szansa na pe\u0142ne zakl\u0119cia +Salvage.Arcane.ExtractPartial=&7 Szansa na cz\u0119\u015bciowe zakl\u0119cia +Salvage.Skills.Success=&aOdzyskano przedmiot! +Salvage.Skills.Adept.Damaged=&4Nie masz wystarczaj\u0105cych umiej\u0119tno\u015bci, aby odzyska\u0107 uszkodzone przedmioty. +Salvage.Skills.Adept.Level=Musisz by\u0107 na poziomie & e {0} & c, aby odzyska\u0107 & e {1} +Salvage.Skills.TooDamaged=&4Ten przedmiot jest zbyt uszkodzony, aby go uratowa\u0107. +Salvage.Skills.ArcaneFailed=&cNie uda\u0142o Ci si\u0119 wydoby\u0107 wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcanePartial=&cUda\u0142o Ci si\u0119 tylko wydoby\u0107 cz\u0119\u015b\u0107 wiedzy zawartej w tym elemencie. +Salvage.Skills.ArcaneSuccess=&aJeste\u015b w stanie wydoby\u0107 ca\u0142\u0105 wiedz\u0119 zawart\u0105 w tym elemencie! +Salvage.Listener.Anvil=&4Umie\u015bci\u0142e\u015b/a\u015b kowad\u0142o, u\u017cyj go do zbroi i narz\u0119dzi. +Salvage.Listener=Odzyskiwanie: +Salvage.SkillName=ODZYSKIWANIE +Salvage.Skills.Lottery.Normal=&6Uda\u0142o Ci si\u0119 odzyska\u0107 & 3 {0} & 6 materia\u0142\u00f3w z & e {1} & 6. +Salvage.Skills.Lottery.Perfect=&a&lPerfekcyjnie! & r & 6 Odzyska\u0142e\u015b/a\u015b & 3 {1} & 6 bez wysi\u0142ku, odzyskuj\u0105c & 3 {0} & 6 materia\u0142\u00f3w. +Salvage.Skills.Lottery.Untrained=&7Nie jeste\u015b odpowiednio przeszkolony w odzyskiwaniu. Uda\u0142o Ci si\u0119 odzyska\u0107 tylko & c {0} & 7 materia\u0142\u00f3w z & a {1} & 7. +#Anvil (Shared between SALVAGE and REPAIR) +Anvil.Unbreakable=Ten przedmiot jest niezniszczalny! +#SWORDS +Swords.Ability.Lower=&7Opuszczasz sw\u00f3j miecz. +Swords.Ability.Ready=&6Przygotowujesz&3 sw\u00f3j miecz. +Swords.Combat.Rupture.Note=&7NOTATKA: &e1 P\u0119kni\u0119cie zdarza si\u0119 co 0,5 sekundy! +Swords.Combat.Bleeding.Started=&4 Krwawisz! +Swords.Combat.Bleeding.Stopped=&7Krwawienie ju\u017c si\u0119 zatrzyma\u0142o&7! +Swords.Combat.Bleeding=&a**PRZECIWNIK KRWAWI** +Swords.Combat.Counter.Hit=&4Zaatakuj kontraatakiem! +Swords.Combat.Countered=&a**KONTRAATAK** +Swords.Combat.SS.Struck=&4Uderzone ZW\u0118Z\u0141YMI STRIKAMI! +Swords.SubSkill.CounterAttack.Name=Kontratak +Swords.SubSkill.CounterAttack.Description=Odbij cz\u0119\u015b\u0107 obra\u017ce\u0144, gdy zostaniesz zaatakowany! +Swords.SubSkill.CounterAttack.Stat=Szansa na kontratak +Swords.SubSkill.SerratedStrikes.Name=Z\u0105bkowane uderzenia +Swords.SubSkill.SerratedStrikes.Description=Zadaje dodatkowe obra\u017cenia AoE z szans\u0105 na Pot\u0119\u017cne krwawienie! +Swords.SubSkill.SerratedStrikes.Stat=Z\u0105bkowana d\u0142ugo\u015b\u0107 uderze\u0144 +Swords.SubSkill.Rupture.Name=Pot\u0119\u017cne krwawienie +Swords.SubSkill.Rupture.Description=Zastosuj pot\u0119\u017cne krwawienie DoT +Swords.SubSkill.Stab.Name=Sztylet +Swords.SubSkill.Stab.Description=Dodaje dodatkowe obra\u017cenia do twoich atak\u00f3w. +Swords.SubSkill.Stab.Stat=Obra\u017cenia d\u017agni\u0119cia +Swords.SubSkill.SwordsLimitBreak.Name=Prze\u0142amywanie limit\u00f3w miecza +Swords.SubSkill.SwordsLimitBreak.Description=Prze\u0142amywanie limit\u00f3w. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. +Swords.SubSkill.SwordsLimitBreak.Stat=Prze\u0142amywanie limit\u00f3w max obra\u017ce\u0144 +Swords.SubSkill.Rupture.Stat=Szansa na Rozerwanie +Swords.SubSkill.Rupture.Stat.Extra=Rozerwanie: &a{0} ticks [{1} DMG vs Gracz] [{2} DMG vs Moby] +Swords.Effect.4=Krwawienie+ z\u0105bkowane uderzenia +Swords.Effect.5={0} Tick Rupture +Swords.Listener=Miecze: +Swords.SkillName=MIECZE +Swords.Skills.SS.Off=**Z\u0105bkowane Uderzenia przesta\u0142y dzia\u0142a\u0107** +Swords.Skills.SS.On=&a**AKTYWOWANE Z\u0104BKOWANE UDERZENIA** +Swords.Skills.SS.Refresh=&aTwoje &eZ\u0105bkowane uderzenia zosta\u0142y od\u015bwie\u017cone! +Swords.Skills.SS.Other.Off=Z\u0105bkowane uderzenia & a przesta\u0142y dzia\u0142a\u0107 na & e {0} +Swords.Skills.SS.Other.On=&a{0}&2u\u017cy\u0142 & cZ\u0105bkowane uderzenia! +#TAMING +Taming.Ability.Bonus.0=Przyjazny \u015brodowisku +Taming.Ability.Bonus.1=Wilki unikaj\u0105 niebezpiecze\u0144stwa +Taming.Ability.Bonus.2=Grube futro +Taming.Ability.Bonus.3=1/{0} Obra\u017ce\u0144, odporno\u015b\u0107 na ogie\u0144 +Taming.Ability.Bonus.4=Odporno\u015b\u0107 na wstrz\u0105sy +Taming.Ability.Bonus.5=Materia\u0142y wybuchowe zadaj\u0105 1/{0} normalnych obra\u017ce\u0144 +Taming.Ability.Bonus.6=Zaostrzone pazury +Taming.Ability.Bonus.7=+{0} Obra\u017ce\u0144 +Taming.Ability.Bonus.8=Us\u0142ugi Fast Food +Taming.Ability.Bonus.9={0} Szansy na uleczenie przy ataku +Taming.Ability.Bonus.10=Nieskalany Pies +Taming.Ability.Bonus.11=Odzyskuje zdrowie, gdy zostanie zraniony przez magi\u0119 lub trucizn\u0119 +Taming.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (PRZYJAZNY \u015aRODOWISKU) +Taming.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (GRUBE FUTRO) +Taming.Ability.Locked.2=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ODPORNO\u015a\u0106 NA WSTRZ\u0104SY) +Taming.Ability.Locked.3=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (ZAOSTRZONE PAZURY) +Taming.Ability.Locked.4=ZABLOKOWANE DO {0}+UMIEJ\u0118TNO\u015a\u0106 (SERWIS FAST FOOD) +Taming.Ability.Locked.5=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (NIESKALANY PIES) +Taming.Combat.Chance.Gore=Szansa na Przelew Krwi +Taming.SubSkill.BeastLore.Name=Wiedza Bestii +Taming.SubSkill.BeastLore.Description=Walenie ko\u015bci\u0105 kontroluje koty i psy. +Taming.SubSkill.ShockProof.Name=Odporno\u015b\u0107 na wstrz\u0105sy +Taming.SubSkill.ShockProof.Description=Redukcja obra\u017ce\u0144 od wybuchu +Taming.SubSkill.CallOfTheWild.Name=Zew natury +Taming.SubSkill.CallOfTheWild.Description=Wzywa zwierze na Twoj\u0105 stron\u0119 +Taming.SubSkill.CallOfTheWild.Description.2=&7Zew natury: Kucnij i kliknij lewym przyciskiem myszy \n {0} {1} (Kot), {2} {3} (Pies), {4} {5} (Ko\u0144) +Taming.SubSkill.FastFoodService.Name=Serwis Fast Food +Taming.SubSkill.FastFoodService.Description=Szansa wilk\u00f3w na uleczenie przy ataku +Taming.SubSkill.HolyHound.Name=Nieskalany Pies +Taming.SubSkill.HolyHound.Description=Uleczono przez Magi\u0119 & Trucizn\u0119 +Taming.SubSkill.Gore.Name=Przelew Krwi +Taming.SubSkill.Gore.Description=Krytyczne Uderzenie, kt\u00f3re nak\u0142ada Rozerwanie. +Taming.SubSkill.SharpenedClaws.Name=Zaostrzone pazury +Taming.SubSkill.SharpenedClaws.Description=Dodatkowe obra\u017cenia +Taming.SubSkill.EnvironmentallyAware.Name=Przyjazny \u015brodowisku +Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lawa Fobia, Odporny na obra\u017cenia od upadku. +Taming.SubSkill.ThickFur.Name=Grube futro +Taming.SubSkill.ThickFur.Description=Redukcja obra\u017ce\u0144, Odporno\u015b\u0107 na ogie\u0144 +Taming.SubSkill.Pummel.Name=Odepchni\u0119cie +Taming.SubSkill.Pummel.Description=Twoje wilki maj\u0105 szans\u0119 odepchn\u0105\u0107 wrog\u00f3w +Taming.SubSkill.Pummel.TargetMessage=Zosta\u0142e\u015b/a\u015b odepchni\u0119ty przez wilka! +Taming.Listener.Wolf=&8Tw\u00f3j wilk wraca do Ciebie... +Taming.Listener=Tresowanie: +Taming.SkillName=TRESOWANIE +Taming.Summon.COTW.Success.WithoutLifespan=&a(Zew natury) &7Wezwa\u0142e\u015b/a\u015b &6{0}&7 +Taming.Summon.COTW.Success.WithLifespan=&a(Zew natury) &7Wezwa\u0142e\u015b/a\u015b &6{0}&7 na czas &6{1}&7 sekund. +Taming.Summon.COTW.Limit=&a(Zew natury) &7Mo\u017cesz mie\u0107 tylko &c{0} &7wezwanych &7{1} w tym samym czasie. +Taming.Summon.COTW.TimeExpired=&a(Zew natury) &7Czas si\u0119 sko\u0144czy\u0142, Tw\u00f3j &6{0}&7 odlatuje. +Taming.Summon.COTW.Removed=&a(Zew natury) &7Tw\u00f3j przywo\u0142any &6{0}&7 znikn\u0105\u0142 z tego \u015bwiata :c +Taming.Summon.COTW.BreedingDisallowed=&a(Zew natury) &cNie mo\u017cesz rozmna\u017ca\u0107 przywo\u0142anego zwierz\u0119cia. +Taming.Summon.COTW.NeedMoreItems=&a(Zew natury) &7Potrzebujesz wi\u0119cej &e{0}&7 o &3{1}&7(s) +Taming.Summon.Name.Format=&6(Zew natury) &f{0}'s {1} +#UNARMED +Unarmed.Ability.Bonus.0=Steel Arm Style +Unarmed.Ability.Bonus.1=+{0} DMG Upgrade +Unarmed.Ability.IronGrip.Attacker=Tw\u00f3j przeciwnik ma \u017celazny u\u015bcisk! +Unarmed.Ability.IronGrip.Defender=&aTw\u00f3j \u017celazny u\u015bcisk uchroni\u0142 ci\u0119 przed rozbrojeniem! +Unarmed.Ability.Lower=&7Opuszczasz pi\u0119\u015bci. +Unarmed.Ability.Ready=&3You &6ready&3twoje pi\u0119\u015bci. +Unarmed.SubSkill.Berserk.Name=Sza\u0142 +Unarmed.SubSkill.Berserk.Description=+50% DMG, \u0141amie s\u0142abe materia\u0142y +Unarmed.SubSkill.Berserk.Stat=D\u0142ugo\u015b\u0107 Sza\u0142u +Unarmed.SubSkill.Disarm.Name=Rozbraja\u0107 +Unarmed.SubSkill.Disarm.Description=Upuszcza trzymany w d\u0142oni przedmiot przeciwnika +Unarmed.SubSkill.Disarm.Stat=Szansa na rozbrojenie +Unarmed.SubSkill.UnarmedLimitBreak.Name=Nieuzbrojone prze\u0142amanie limitu +Unarmed.SubSkill.UnarmedLimitBreak.Description=Prze\u0142amywanie granic. Zwi\u0119kszone obra\u017cenia zadawane trudnym przeciwnikom. Przeznaczony dla PVP, zale\u017cnie od ustawie\u0144 serwera, czy zwi\u0119kszy obra\u017cenia w PVE, czy nie. +Unarmed.SubSkill.UnarmedLimitBreak.Stat=Limit Break Max DMG +Unarmed.SubSkill.SteelArmStyle.Name=Styl stalowego ramienia +Unarmed.SubSkill.SteelArmStyle.Description=Z czasem twardnieje rami\u0119 +Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strza\u0142 +Unarmed.SubSkill.ArrowDeflect.Description=Odbij strza\u0142y +Unarmed.SubSkill.ArrowDeflect.Stat=Szansa na odbicie strza\u0142y +Unarmed.SubSkill.IronGrip.Name=Iron Grip +Unarmed.SubSkill.IronGrip.Description=Zapobiega rozbrojeniu +Unarmed.SubSkill.IronGrip.Stat=Szansa na \u017celazny chwyt +Unarmed.SubSkill.BlockCracker.Name= +Unarmed.SubSkill.BlockCracker.Description=Rozbijaj ska\u0142y pi\u0119\u015bciami +Unarmed.Listener=Niezr\u0119czno\u015b\u0107: +Unarmed.SkillName=NIEZR\u0118CZNO\u015a\u0106 +Unarmed.Skills.Berserk.Off=**Sza\u0142 si\u0119 sko\u0144czy\u0142** +Unarmed.Skills.Berserk.On=&a**BERSERK AKTYWOWANY** +Unarmed.Skills.Berserk.Other.Off=Berserk&a has worn off for &e{0} +Unarmed.Skills.Berserk.Other.On=&a{0}&2 has used &cBerserk! +Unarmed.Skills.Berserk.Refresh=&aYour &eBerserk & Aability zosta\u0142y od\u015bwie\u017cone! + +#WOODCUTTING +Woodcutting.Ability.0=Dmuchawa do li\u015bci +Woodcutting.Ability.1=Zdmuchuje li\u015bcie +Woodcutting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (DMUCHAWA DO LI\u015aCI) +Woodcutting.SubSkill.TreeFeller.Name=\u015acinacz Drzew +Woodcutting.SubSkill.TreeFeller.Description=Spraw, by drzewa eksplodowa\u0142y +Woodcutting.SubSkill.TreeFeller.Stat=Tree Feller Length +Woodcutting.SubSkill.LeafBlower.Name=Dmuchawa do li\u015bci +Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje li\u015bcie +Woodcutting.SubSkill.KnockOnWood.Name=Stukni\u0119cie w Drewno +Woodcutting.SubSkill.KnockOnWood.Description=Znajd\u017a dodatkowe przedmioty podczas korzystania z \u015acinacz Drzew +Woodcutting.SubSkill.KnockOnWood.Stat=Stukni\u0119cie w Drewno +Woodcutting.SubSkill.KnockOnWood.Loot.Normal=Standardowy \u0142up z drzewa +Woodcutting.SubSkill.KnockOnWood.Loot.Rank2=Standardowy \u0142up z drzew i kul do\u015bwiadczenia +Woodcutting.SubSkill.HarvestLumber.Name=\u017bniwa Budulca +Woodcutting.SubSkill.HarvestLumber.Description=Umiej\u0119tnie wydobywanie wi\u0119cej drewna +Woodcutting.SubSkill.HarvestLumber.Stat=Podw\u00f3jna szansa \u0142upu +Woodcutting.SubSkill.Splinter.Name=Kawa\u0142ki +Woodcutting.SubSkill.Splinter.Description=Ci\u0119cie drzew bardziej efektywnie. +Woodcutting.SubSkill.BarkSurgeon.Name=Chirurg Kory +Woodcutting.SubSkill.BarkSurgeon.Description=Wydobywaj przydatne materia\u0142y podczas \u015bcinania drzew. +Woodcutting.SubSkill.NaturesBounty.Name=Nagroda natury +Woodcutting.SubSkill.NaturesBounty.Description=Zbieraj do\u015bwiadczenie z natury. +Woodcutting.Listener=\u015acinacz Drzew: +Woodcutting.SkillName=\u015aCINACZ DRZEW +Woodcutting.Skills.TreeFeller.Off=**\u015acinacz Drzew przesta\u0142 dzia\u0142a\u0107** +Woodcutting.Skills.TreeFeller.On=&a**\u015aCINACZ DRZEW AKTYWOWANY** +Woodcutting.Skills.TreeFeller.Refresh=&aTwoja umiej\u0119tno\u015b\u015b &e\u015acinacz Drzew &azosta\u0142a od\u015bwie\u017cona! +Woodcutting.Skills.TreeFeller.Other.Off=\u015acinacz Drzew&a przesta\u0142 dzia\u0142a\u0107 na &e{0} +Woodcutting.Skills.TreeFeller.Other.On=&a{0}&2 u\u017cy\u0142 &c\u015acinacz Drzew! +Woodcutting.Skills.TreeFeller.Splinter=TW\u00d3J TOP\u00d3R ROZKLEJA SI\u0118 NA DZIESI\u0104TKI KAWA\u0141K\u00d3W! +Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt du\u017ce! +#ABILITIY + +#COMBAT +Combat.ArrowDeflect=&f**UGINANIE STRZA\u0141** +Combat.BeastLore=&a**WIEDZA BESTII** +Combat.BeastLoreHealth=&3Zdrowie (&a{0}&3/{1}) +Combat.BeastLoreOwner=&3W\u0142a\u015bciciel (&c{0}&3) +Combat.BeastLoreHorseSpeed=&3Pr\u0119dko\u015b\u0107 konia (&a{0} bloki/s&3) +Combat.BeastLoreHorseJumpStrength=&3Si\u0142a skoku konia (&aMax {0} blok\u00f3w&3) +Combat.Gore=&a**ROZLANA KREW** +Combat.StruckByGore=**ZOSTA\u0141E\u015a ZRANIONY** +Combat.TargetDazed=Cel by\u0142 &4Oszo\u0142omiony +Combat.TouchedFuzzy=&4Czy\u0107 sko\u0142owanie. +#COMMANDS +##generic +mcMMO.Description=&3O &emcMMO&3 Projekt:,&6mcMMO jest to &cotwarty kod&6 RPG plugin stworzony w Styczniu 2011,&6przez &9nossr50&6. Celem jest zapewnienie wysokiej jako\u015bci wra\u017ce\u0144 z gry RPG.,&3Wskaz\u00f3wki:,&6 - &aU\u017cyj &c/mcmmo help&a by zobaczy\u0107 komendy,&6 - &aWpisz &c/NAZWA_UMI\u0118J\u0118TNO\u015aCI&a by zobaczy\u0107 detale konkertnej umiej\u0119tno\u015bci,&3Deweloperzy:,&6 - &anossr50 &9(Tw\u00f3rca & Kierownik Projektu),&6 - &aelectronicboy &9(Dev),&6 - &akashike &9(Dev),&6 - &at00thpick1 &9(Opiekun wersji Classic) +mcMMO.Description.FormerDevs=&3Byli tw\u00f3rcy: &aGJ, NuclearW, bm01, TfT_02, Glitchfinder +Commands.addlevels.AwardAll.1=&aZostano nagrodzonym {0} we wszystkich poziomach! +Commands.addlevels.AwardAll.2=Wszystkie umiej\u0119tno\u015bci zosta\u0142y zmodyfikowane o {0}. +Commands.addlevels.AwardSkill.1=&aZostano nagrodzonym o {0} poziomy/\u00f3w w {1}! +Commands.addlevels.AwardSkill.2={0} zosta\u0142o/a zmodyfikowana o {1}. +Commands.addxp.AwardAll=&aZostano nagrodzonym o {0} XP we wszystkich poziomach! +Commands.addxp.AwardSkill=&aZostano nagrodzonym o {0} XP w {1}! +Commands.Ability.Off=U\u017cywanie umiej\u0119tno\u015bci: &cWy\u0142\u0105czone +Commands.Ability.On=U\u017cywanie umiej\u0119tno\u015bci &aW\u0142\u0105czone +Commands.Ability.Toggle=Zmieniono u\u017cywanie umiej\u0119tno\u015bci dla &e{0} +Commands.AdminChat.Off=Admin Chat &cW\u0142\u0105czone +Commands.AdminChat.On=Admin Chat &cWy\u0142\u0105czone +Commands.AdminToggle=&a- Prze\u0142\u0105cz czat Admin\u00f3w +Commands.Chat.Console=*Konsola* +Commands.Cooldowns.Header=&6--= &amcMMO Czas Odnowienia Umiej\u0119tno\u015bci&6 =-- +Commands.Cooldowns.Row.N=\ &c{0}&f - &6Pozosta\u0142o sekund: {1} +Commands.Cooldowns.Row.Y=\ &b{0}&f - &2Gotowe! +Commands.Database.CooldownMS=Musisz odczeka\u0107 {0} milisekund zanim u\u017cyjesz tej komendy. +Commands.Database.Cooldown=Musisz odczeka\u0107 {0} sekund zanim u\u017cyjesz tej komendy ponownie. +Commands.Database.Processing=Twoje poprzednie polecenie jest nadal przetwarzane. Prosz\u0119 czeka\u0107. +Commands.Disabled=Ta komenda jest wy\u0142\u0105czona. +Commands.DoesNotExist= &cTen gracz nie istnieje w bazie danych! +Commands.GodMode.Disabled=mcMMO Godmode Wy\u0142\u0105czony +Commands.GodMode.Enabled=mcMMO Godmode W\u0142\u0105czony +Commands.AdminChatSpy.Enabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn w\u0142\u0105czone +Commands.AdminChatSpy.Disabled=mcMMO Podgl\u0105danie czat\u00f3w dru\u017cyn wy\u0142\u0105czone +Commands.AdminChatSpy.Toggle=mcMMO Czat w grupie zosta\u0142 prze\u0142\u0105czony dla &e{0} +Commands.AdminChatSpy.Chat=&6[SPY: &a{0}&6] &f{1} +Commands.GodMode.Forbidden=[mcMMO] Godmode nie jest dozwolony na tym \u015bwiecie (Zobacz Permisje) +Commands.GodMode.Toggle=Tryb Godmode zosta\u0142 prze\u0142\u0105czony dla &e{0} +Commands.Healthbars.Changed.HEARTS=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &cZdrowie&f. +Commands.Healthbars.Changed.BAR=[mcMMO] Tw\u00f3j typ wy\u015bwietlania paska zdrowia zosta\u0142 zmieniony na &eBar&f. +Commands.Healthbars.Changed.DISABLED=[mcMMO] Twoje paski zdrowia mob\u00f3w zosta\u0142y &7wy\u0142\u0105czone&f. +Commands.Healthbars.Invalid=B\u0142\u0119dny pasek zdrowia! +Commands.Inspect= &a- Zobacz szczeg\u00f3\u0142owe informacje o graczu +Commands.Invite.Success=&aPomy\u015blnie wys\u0142ano zaproszenie. +Commands.Leaderboards= &a- Rankingi +Commands.mcgod=&a- Prze\u0142\u0105cz GodMode +Commands.mchud.Invalid=To nie jest prawid\u0142owy typ HUD. +Commands.mcpurge.Success=&aBaza danych zosta\u0142a pomy\u015blnie wyczyszczona! +Commands.mcrank.Heading=&6-=RANGI OSOBISTE=- +Commands.mcrank.Overall=Og\u00f3lne&a - &6Ranga &f#&a{0} +Commands.mcrank.Player=&eRanga gracza &f{0} +Commands.mcrank.Skill=&e{0}&a - &6Ranga &f#&a{1} Commands.mcrank.Unranked=&fBez Rangi -Commands.mcrefresh.Success=Umiejetnosci &c{0} zostaly odnowione. -Commands.mcremove.Success=&a{0} zosta\u0142 usuni\u0119ty z bazy danych! -Commands.mctop.Tip=&6Porada: Wpisz &c/mcrank&6 aby zobaczy\u0107 swoje rankingi! -Commands.mmoedit=[player] &c - Modyfikuje cel -Commands.mmoedit.Modified.1=&aTw\u00f3j poziom w {0} zosta\u0142 zmieniony na {1}! -Commands.mmoedit.Modified.2={0} zosta\u0142 zmieniony na {1}. -Commands.ModDescription=- Przeczytaj opis -Commands.NoConsole=Konsola nie obs\u0142uguje tej komendy. -Commands.Notifications.Off=Informacje na temat umiejetnosci &cwylaczone -Commands.Notifications.On=Informacje na temat umiejetnosci &awlaczone -Commands.Other=&a--POZOSTA\u0141E KOMENDY-- -Commands.Party.Header=-----[]&aDRUZYNA&c[]----- -Commands.Party.ShareMode=&8TRYB DZIELENIA SIE: +Commands.mcrefresh.Success={0} - Czas odnowienia od\u015bwie\u017cony. +Commands.mcremove.Success=&a{0} - Pomy\u015blnie usuni\u0119to z bany danych! +Commands.mctop.Tip=&6Tip: U\u017cyj &c/mcrank&6 aby wy\u015bwietli\u0107 wszystkie swoje osobiste rangi! +Commands.mmoedit=[player] &a - Modifikuj cel +Commands.mmoedit.AllSkills.1=&aPoziom wszystkich Twoim umiej\u0119tno\u015bci zmieniono na {0}! +Commands.mmoedit.Modified.1=&aTw\u00f3j poziom {0} zmieniono na {1}! +Commands.mmoedit.Modified.2={0} zosta\u0142/a zmodyfikowana dla {1}. +Commands.mcconvert.Database.Same=Ju\u017c u\u017cywasz bazy danych {0}! +Commands.mcconvert.Database.InvalidType={0} nie jest poprawnym typem bazy danych. +Commands.mcconvert.Database.Start=&7Rozpoczynanie konwersji z {0} do {1}... +Commands.mcconvert.Database.Finish=&7Migracja bazy danych zako\u0144czona; {1} ma teraz wszystkie dane z bazy danych {0}. +Commands.mmoshowdb=Aktualna baza danych w u\u017cyciu to &a{0} +Commands.mcconvert.Experience.Invalid=Nieznany typ formu\u0142y! Prawod\u0142owe typy to: &aLINIOWY &ci &aEXPONENTIAL. +Commands.mcconvert.Experience.Same=Aktualny typ formu\u0142y to {0} +Commands.mcconvert.Experience.Start=&7Rozpoczynanie konwersji z {0} do {1} krzywej +Commands.mcconvert.Experience.Finish=&7Uko\u0144czono konwersj\u0119 formu\u0142y; teraz korzystam z {0} \u015bredniejj XP. +Commands.ModDescription=&a- Przeczytaj kr\u00f3tki opis moda +Commands.NoConsole=Tej komendy nie mo\u017cesz u\u017cy\u0107 przez konsol\u0119. +Commands.Notifications.Off=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &cWy\u0142\u0105czono +Commands.Notifications.On=Prze\u0142\u0105czono powiadomienia o umiej\u0119tno\u015bciach: &aW\u0142\u0105czono +Commands.Offline=Ta komenda nie dzia\u0142a na graczy off-line. +Commands.NotLoaded=Profil gracza nie jest jeszcze za\u0142adowany. +Commands.Party.Status=&8NAZWA: &f{0} {1} &8POZIOM: &3{2} +Commands.Party.Status.Alliance=&8SOJUSZNICY: &f{0} +Commands.Party.UnlockedFeatures=&8Odblokowane funkcje: &7&o{0} +Commands.Party.ShareMode=&8TRYB UDOST\u0118PNIANIA: Commands.Party.ItemShare=&7PRZEDMIOT &3({0}) Commands.Party.ExpShare=&7EXP &3({0}) -Commands.Party.MembersNear=&8OBOK CIEBIE &3{0}&8/&3{1} -Commands.Party.Accept=- Akceptuje zaproszenie grupy -Commands.Party.Chat.Off=Czat wy\u0142acznie dla dru\u017cyny &cOff -Commands.Party.Chat.On=Czat wy\u0142acznie dla dru\u017cyny w\u0142\u0105czony &c -Commands.Party.Commands=&a--KOMENDY DLA DRU\u017bYN-- -Commands.Party.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} -Commands.Party.Invite.1=Wpisz &a/party accept&e by akceptowac zaproszenie -Commands.Party.Invite=- Wysyla zaproszenie do druzyny -Commands.Party.Join=&7Dolaczono do druzyny: {0} -Commands.Party.Create=&7Utworzono druzyne: {0} -Commands.Party.Rename=&7Nazwa druzyny zmieniona na: &f{0} -Commands.Party.SetSharing=&7Druzyny {0} dzielenie sie przedmiotami ustawiono na: &3{1} -Commands.Party.AlreadyExists=&4Druzyna {0} juz istnieje! -Commands.Party.Kick=Zosta\u0142e\u015b wyrzucony z dru\u017cyny {0}! -Commands.Party.Leave=Opu\u015bci\u0142e\u015b dru\u017cyn\u0119. -Commands.Party.Members.Header=-----[]&aCZLONKOWIE&c[]----- -Commands.Party.None=Nie jestes w druzynie. -Commands.Party.Quit=- Opuszcza obecn\u0105 dru\u017cyne -Commands.Party.Teleport= &c- Teleportacja do czlonka grupy. -Commands.Party.Toggle=- W\u0142\u0105cza/Wy\u0142\u0105cza czat dla dru\u017cyn -Commands.Party.1=- Tworzy nowa druzyne -Commands.Party.2=- Dolacza do druzyny gracza -Commands.ptp.Enabled=Teleportacja druzynowa &aaktywna -Commands.ptp.Disabled=Teleportacja druzynowa &cwylaczona -Commands.ptp.NoRequests=Nie masz zadnych zadan teleportacji w tym momencie -Commands.ptp.NoWorldPermissions=[mcMMO] Nie masz uprawnien do teleportacji do swiata {0}. -Commands.ptp.Request1={0} &achce sie steleportowac do Ciebie. -Commands.ptp.Request2=&aBy sie steleportowac, wpisz &e/ptp accept. &aZadanie wygasa po &c{0} &asekundach. -Commands.ptp.AcceptAny.Disabled=Potwierdzenie zadania teleportacji druzynowej &cwylaczone -Commands.ptp.RequestExpired=Zadanie druzynowego teleportu wygaslo! -Commands.PowerLevel.Leaderboard=--mcMMO&9 Poziom Mocy &eRanking-- -Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAKSYMALNY POZIOM: &e{1} +Commands.Party.ItemShareCategories=&8Udost\u0119pnianie przedmiot\u00f3w: &7&o{0} +Commands.Party.MembersNear=&8BLISKO CIEBIE &3{0}&8/&3{1} +Commands.Party.Accept=&a- Zaakceptuj zaproszenie do dru\u017cyny +Commands.Party.Chat.Off=Czat dru\u017cyny &cWy\u0142\u0105czono +Commands.Party.Chat.On=Czat dru\u017cyny &aW\u0142\u0105czono +Commands.Party.Commands=&c---[]&aKOMENDY DRU\u017bYNY&c[]--- +Commands.Party.Invite.0=&cALERT: &aOtrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1} +Commands.Party.Invite.1=&eWpisz &a/party accept&e aby zaakceptowa\u0107 zaproszenie +Commands.Party.Invite=&a- Wy\u015blij zaproszenie do dru\u017cyny +Commands.Party.Invite.Accepted=&aZaproszenie Zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0} +Commands.Party.Join=&7Do\u0142\u0105czy\u0142 do dru\u017cyny: {0} +Commands.Party.PartyFull=&6{0}&c jest pe\u0142na! +Commands.Party.PartyFull.Invite=Nie mo\u017cesz zaprosi\u0107 &e{0}&c do &a{1}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{2}&c cz\u0142onk\u00f3w! +Commands.Party.PartyFull.InviteAccept=Nie mo\u017cesz do\u0142\u0105czy\u0107 do &a{0}&c, poniewa\u017c dru\u017cyna ma ju\u017c &3{1}&c cz\u0142onk\u00f3w! +Commands.Party.Create=&7Stworzone dru\u017cyny: {0} +Commands.Party.Rename=&7Nazwa dru\u017cyny zmieniona na: &f{0} +Commands.Party.SetSharing=&7Udost\u0119pnianie dru\u017cyny {0} ustawione na: &3{1} +Commands.Party.ToggleShareCategory=&7Udost\u0119pnianie przedmiot\u00f3w dru\u017cyny &6{0} &7zosta\u0142o &3{1} +Commands.Party.AlreadyExists=&4PDru\u017cyna {0} ju\u017c istnieje! +Commands.Party.Kick=&cZosta\u0142e\u015b/a\u015b wyrzucony/a z dru\u017cyny &a{0}&c! +Commands.Party.Leave=&eOpuszczono dru\u017cyn\u0119 +Commands.Party.Members.Header=&c-----[]&aCZ\u0141ONKOWIE&c[]----- +Commands.Party.None=&cNie jeste\u015b w dru\u017cynie. +Commands.Party.Quit=&a- Opu\u015b\u0107 swoj\u0105 dru\u017cyn\u0119 +Commands.Party.Teleport=&a- Teleportuj do cz\u0142onka dru\u017cyny +Commands.Party.Toggle=&a- Prze\u0142\u0105cz czat dru\u017cyny +Commands.Party1=&a- Stw\u00f3rz now\u0105 dru\u017cyn\u0119 +Commands.Party2=&a- Do\u0142\u0105cz do dru\u017cyny +Commands.Party.Alliance.Header=&c-----[]&aSOJUSZ DRU\u017bYN&c[]----- +Commands.Party.Alliance.Ally=&f{0} &8JEST ZWI\u0104ZANY/A Z: &f{1} +Commands.Party.Alliance.Members.Header=&c-----[]&aCZ\u0141ONKOWIE SOJUSZU&c[]----- +Commands.Party.Alliance.Invite.0=ALERT: &aOtrzyma\u0142e\u015b zaproszenie do sojuszu w dru\u017cynie {0} do {1} +Commands.Party.Alliance.Invite.1=Wpisz &a/party alliance accept&e aby zaakceptowa\u0107 zaproszenie +Commands.Party.Alliance.Invite.Accepted=&aZaproszenie do sojuszu zaakceptowane. +Commands.Party.Alliance.None=&cTwoja dru\u017cyna nie ma sojuszu. +Commands.Party.Alliance.AlreadyAllies=&cTwoja dru\u017cyna ma ju\u017c sojusz. Rozwi\u0105\u017c sojusz &3/party alliance disband +Commands.Party.Alliance.Help.0=&cTa dru\u017cyna nie zawar\u0142a jeszcze sojuszu. Mo\u017cesz +Commands.Party.Alliance.Help.1=&czaprosi\u0107 lidera u\u017cywaj\u0105c &3/party alliance invite &c. +Commands.ptp.Enabled=Teleportowanie w dru\u017cynie &aew\u0142\u0105czone +Commands.ptp.Disabled=Teleportowanie w dru\u017cynie &cwy\u0142\u0105czone +Commands.ptp.NoRequests=&cNie masz aktualnie pr\u00f3\u015bb o teleportacj\u0119 +Commands.ptp.NoWorldPermissions=&c[mcMMO] Nie masz permisji, aby zteleportowa\u0107 si\u0119 do \u015bwiata {0}. +Commands.ptp.Request1=&e{0} &awys\u0142a\u0142/a pro\u015bb\u0119 o teleportacj\u0119. +Commands.ptp.Request2=&aAby zaakceptowa\u0107, wpisz &e/ptp accept&a. Pro\u015bba wyga\u015bnie za &c{0} &asekund. +Commands.ptp.AcceptAny.Enabled=Potwierdzanie teleportowania w dru\u017cynie &aw\u0142\u0105czone +Commands.ptp.AcceptAny.Disabled=Potwierdzanie teleportowania w dru\u017cynie &cwy\u0142\u0105czone +Commands.ptp.RequestExpired=&cPro\u015bba o teleport dru\u017cyny wygas\u0142a! +Commands.PowerLevel.Leaderboard=&e--mcMMO&9 Poziom Mocy &elider\u00f3w-- +Commands.PowerLevel.Capped=&4POZIOM MOCY: &a{0} &4MAX POZIOM: &e{1} Commands.PowerLevel=&4POZIOM MOCY: &a{0} -Commands.Reset.All=&aWszystkie twoje umiej\u0119tno\u015bci zosta\u0142y zresetowane. -Commands.Reset.Single=&aTw\u00f3j poziom w {0} zosta\u0142 zresetowany. -Commands.Reset=Resetuje poziom umiej\u0119tno\u015bci do 0 -Commands.Skill.Invalid=Nie ma takiej umiej\u0119tno\u015bci! -Commands.Skill.Leaderboard=--mcMMO &9{0}&e Ranking-- -Commands.SkillInfo=- Zobacz szczeg\u00f3lowe informacje na temat tej umiejetnosci -Commands.Stats.Self=TWOJE STATYSTYKI -Commands.Stats=- Zobacz swoje statystyki -Commands.ToggleAbility=- W\u0142\u0105cza/Wy\u0142\u0105cza zdolno\u015b\u0107 PPM -Commands.Usage.1=W\u0142a\u015bciwa komenda to /{0} {1} -Commands.Usage.2=W\u0142a\u015bciwa komenda to /{0} {1} {2} -Commands.Usage.3=W\u0142a\u015bciwa komenda to /{0} {1} {2} {3} +Commands.Reset.All=&aWszystkie Twoje poziomy umiej\u0119tno\u015bci pomy\u015blnie zresetowano. +Commands.Reset.Single=&aPoziom Twojej umiej\u0119tno\u015bci {0} pomy\u015blnie zresetowano. +Commands.Reset=&a- Zresetuj poziom umiej\u0119tno\u015bci do 0 +Commands.Scoreboard.Clear=&3mcMMO Tablica wynik\u00f3w oczyszczona. +Commands.Scoreboard.NoBoard=&cTablica wynik\u00f3w mcMMO jest nieaktywna. +Commands.Scoreboard.Keep=&3Tablica wynik\u00f3w mcMMO pozostanie, p\u00f3ki nie u\u017cyjesz &a/mcscoreboard clear&3. +Commands.Scoreboard.Timer=&3Tablica wynik\u00f3w mcMMO zostanie wyczyszona za &6{0}&3 sekund od teraz. +Commands.Scoreboard.Help.0=&6 == &aPomoc dla &c/mcscoreboard&6 == +Commands.Scoreboard.Help.1=&3/mcscoreboard&b clear &f - czy\u015bci tablic\u0119 wynik\u00f3w mcMMO +Commands.Scoreboard.Help.2=&3/mcscoreboard&b keep &f - utrzymuj tablic\u0119 wynik\u00f3w mcMMO +Commands.Scoreboard.Help.3=&3/mcscoreboard&b time [n] &f - wyczy\u015b\u0107 tablic\u0119 wynik\u00f3w McMMO za &dn&f sekund +Commands.Scoreboard.Tip.Keep=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard keep&6 while the scoreboard is shown to keep it from going away. +Commands.Scoreboard.Tip.Clear=&6Wskaz\u00f3wka: U\u017cyj &c/mcscoreboard clear&6 pozby\u0107 si\u0119 tablicy wynik\u00f3w. +Commands.XPBar.Reset=&6Ustawienia paska XP Bar dla mcMMO zosta\u0142y zresetowane. +Commands.XPBar.SettingChanged=&6Ustawienia paska XP Bar dla &a{0}&6 zosta\u0142/a ustawiony/a na &a{1} +Commands.Skill.Invalid=To nie jest poprawna nazwa umiej\u0119tno\u015bci! +Commands.Skill.ChildSkill=Umiej\u0119tno\u015bci dziecka nie s\u0105 wa\u017cne dla tego polecenia! +Commands.Skill.Leaderboard=--mcMMO &9{0}&e Tablica Wynik\u00f3w-- +Commands.SkillInfo=&a- Poka\u017c informacje dot. konkretnej umiej\u0119tno\u015bci +Commands.Stats=&a- Poka\u017c swoje statystyki mcMMO +Commands.ToggleAbility=&a- Prze\u0142\u0105cz aktywacj\u0119 umiej\u0119tno\u015bci prawym przyciskiem myszy +Commands.Usage.0=&cW\u0142a\u015bciwe u\u017cycie to /{0} +Commands.Usage.1=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} +Commands.Usage.2=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} +Commands.Usage.3=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3} +Commands.Usage.3.XP=&cW\u0142a\u015bciwe u\u017cycie to /{0} {1} {2} {3}&7 (Mo\u017cesz doda\u0107 -s, aby wykona\u0107 polecenie bez informowania o tym gracza) +Commands.Usage.FullClassName=nazwa klasy Commands.Usage.Level=poziom Commands.Usage.Message=wiadomo\u015b\u0107 Commands.Usage.Page=strona -Commands.Usage.Password=haslo +Commands.Usage.PartyName=nazwa +Commands.Usage.Password=has\u0142o Commands.Usage.Player=gracz -Commands.Usage.Skill=zdolno\u015b\u0107 +Commands.Usage.Rate=ocena +Commands.Usage.Skill=umiej\u0119tno\u015b\u0107 +Commands.Usage.SubSkill=sub-umiej\u0119tno\u015b\u0107 Commands.Usage.XP=xp -mcMMO.NoInvites=Nie masz zadnych zaproszen -mcMMO.NoPermission=&4Nie wystarczaj\u0105ce uprawnienia. -mcMMO.NoSkillNote=&8Je\u015bli nie posiadasz dost\u0119pu do zdolno\u015bci, nie b\u0119dzie ona tu ukazana. -Party.Forbidden=[mcMMO] Dru\u017cyny nie s\u0105 dozwolone na tym \u015bwiecie -Party.Help.9=Uzyj &3{0} &cby dzielic sie przedmiotami z czlonkami druzyny -Party.Help.10=Uzyj &3{0} &cby aktywowac dzielenie sie XP z czlonkami druzyny -Party.InformedOnJoin={0} &adolaczyl do Twojej druzyny -Party.InformedOnQuit={0} &aopuscil Twoja druzyne -Party.InformedOnNameChange=&6{0} &azmienil nazwe druzyny na &f{1} -Party.InvalidName=&4Nie istnieje dru\u017cyna o takiej nazwie! -Party.Invite.Self=Nie mozesz zaprosic siebie samego! -Party.IsLocked=Ta grupa jest juz zamknieta! -Party.IsntLocked=Ta grupa nie jest zamkni\u0119ta! -Party.Locked=Grupa jest zamknieta, tylko wlasciciel moze dodac graczy. -Party.NotInYourParty=&4{0} nie jest cz\u0142onkiem twojej dru\u017cyny. -Party.NotOwner=&4Nie jeste\u015b liderem grupy. -Party.Owner.New=&a{0} jest nowym liderem grupy. -Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c liderem grupy. -Party.Owner.Player=&aJeste\u015b teraz liderem grupy. -Party.Password.Incorrect=Has\u0142o grupy nieprawid\u0142owe. -Party.Password.Set=&aHaslo grupy zmienione na: {0} -Party.Password.Removed=&aHaslo druzyny zostalo wyczyszczone. -Party.Player.Invalid=Nie ma takiego gracza. -Party.NotOnline=&4{0} jest offline! -Party.Player.InSameParty={0} juz jest w Twojej druzynie! -Party.PlayerNotInParty=&4{0} nie jest w druzynie -Party.Teleport.Dead=Nie mo\u017cesz si\u0119 teleportowa\u0107 do zmar\u0142ego gracza. -Party.Teleport.Hurt=Zostales ranny przed {0} sekundami i nie mozesz sie steleportowac. -Party.Teleport.Player=&aTeleportowa\u0142e\u015b si\u0119 do {0}. -Party.Teleport.Self=Nie mo\u017cesz teleportowa\u0107 si\u0119 do samego siebie! +Commands.Description.mmoinfo=Przeczytaj szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bci lub mechanice. +Commands.MmoInfo.Mystery=&7Nie odblokowa\u0142e\u015b/a\u015b jeszcze tej umiej\u0119tno\u015bci, ale kiedy to zrobisz, b\u0119dziesz m\u00f3g\u0142 przeczyta\u0107 o niej szczeg\u00f3\u0142y tutaj! +Commands.MmoInfo.NoMatch=Ta sub-umiej\u0119tno\u015b\u0107 nie istnieje! +Commands.MmoInfo.Header=&3-=[]=====[]&6 MMO Info &3[]=====[]=- +Commands.MmoInfo.SubSkillHeader=&6Nazwa:&e {0} +Commands.MmoInfo.DetailsHeader=&3-=[]=====[]&a Detale &3[]=====[]=- +Commands.MmoInfo.OldSkill=&7mcUmiej\u0119tno\u015bci MMO s\u0105 przekszta\u0142cane w ulepszony modu\u0142owy system umiej\u0119tno\u015bci, niestety ta umiej\u0119tno\u015b\u0107 nie zosta\u0142a jeszcze przekonwertowana i brakuje jej szczeg\u00f3\u0142owych statystyk. Nowy system pozwoli na szybsze udost\u0119pnianie nowych umiej\u0119tno\u015bci mcMMO i wi\u0119ksz\u0105 elastyczno\u015b\u0107 w przypadku istniej\u0105cych umiej\u0119tno\u015bci. +Commands.MmoInfo.Mechanics=&3-=[]=====[]&6 Mechanika &3[]=====[]=- +Commands.MmoInfo.Stats=STATYSTKI: {0} +Commands.Mmodebug.Toggle=mcMMO Tryb Debugowania jest teraz &6{0}&7, u\u017cyj tej komendy ponownie, aby prze\u0142\u0105czy\u0107. W trybie debugowania mo\u017cesz klika\u0107 bloki, aby wy\u015bwietli\u0107 przydatne informacje u\u017cywane do obs\u0142ugi. +mcMMO.NoInvites=&cYou have no invites at this time +mcMMO.NoPermission=&4Niewystarczaj\u0105ce uprawnienia. +mcMMO.NoSkillNote=&8Je\u015bli nie masz dost\u0119pu do danej umiej\u0119tno\u015bci, nie zostanie ona tutaj pokazana. +##party +Party.Forbidden=[mcMMO] Dru\u017cyny nie s\u0105 dozwolone na tym \u015bwiecie (Zobacz permisje) +Party.Help.0=&cPrawid\u0142owe u\u017cycie to &3{0} [has\u0142o]. +Party.Help.1=&cAby stworzy\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} [has\u0142o]. +Party.Help.2=&cSkonsultuj si\u0119 z &3{0} &cpo wi\u0119cej informacji +Party.Help.3=&cu\u017cyj &3{0} [has\u0142o] &caby do\u0142\u0105czy\u0107 lub &3{1} &copu\u015bci\u0107 +Party.Help.4=&cAby zablokowa\u0107 lub odblokowa\u0107 dru\u017cyn\u0119, u\u017cyj &3{0} +Party.Help.5=&cAby zabezpieczy\u0107 swoj\u0105 dru\u017cyn\u0119 has\u0142em, u\u017cyj &3{0} +Party.Help.6=&cAby wyrzuci\u0107 gracza z dru\u017cyny, u\u017cyj &3{0} +Party.Help.7=&cAby przenie\u015b\u0107 w\u0142asno\u015b\u0107 swojej dro\u017cyny, u\u017cyj &3{0} +Party.Help.8=&cAby rozwi\u0105za\u0107 swoj\u0105 dru\u017cyn\u0119, u\u017cyj &3{0} +Party.Help.9=&cU\u017cyj &3{0} &caby udost\u0119pnia\u0107 przedmioty cz\u0142onkom dru\u017cyny +Party.Help.10=&cU\u017cyj &3{0} &cudost\u0119pnia\u0107 XP cz\u0142onkom dru\u017cyny +Party.InformedOnJoin={0} &ado\u0142\u0105czy\u0142/a do dru\u017cyny +Party.InformedOnQuit={0} &aopu\u015bci\u0142/a dru\u017cyn\u0119 +Party.InformedOnNameChange=&6{0} &austawi\u0142/a nazw\u0119 dru\u017cyny na &f{1} +Party.InvalidName=&4To nie jest prawid\u0142owa nazwa dru\u017cyny. +Party.Invite.Self=&cNie mo\u017cesz zaprosi\u0107 samego siebie! +Party.IsLocked=&cTa dru\u017cyna jest zablokowana! +Party.IsntLocked=&cTa dru\u017cyna nie jest zablokowana! +Party.Locked=&cDru\u017cyna jest zablokowana, tylko w\u0142a\u015bciciel/ka mo\u017ce zaprosi\u0107 nowych cz\u0142onk\u00f3w. +Party.NotInYourParty=&4{0} nie jest Twoj\u0105 dru\u017cyn\u0105 +Party.NotOwner=&4Nie jeste\u015b w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Target.NotOwner=&4{0} nie jest w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.New=&a{0} jest nowym/\u0105 w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.NotLeader=&4Nie jeste\u015b ju\u017c w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Owner.Player =&aJeste\u015b teraz w\u0142a\u015bcicielem/k\u0105 dru\u017cyny. +Party.Password.None=&cTa dru\u017cyna jest chroniona has\u0142em. Wpisz has\u0142o, aby do\u0142\u0105czy\u0107. +Party.Password.Incorrect=&cNiepoprawne has\u0142o. +Party.Password.Set=&aUstawiono has\u0142o dru\u017cyny na {0} +Party.Password.Removed=&aUsuni\u0119to has\u0142o dru\u017cyny. +Party.Player.Invalid=&cNie znaleziono takiego gracza. +Party.NotOnline=&4{0} nie jest on-line! +Party.Player.InSameParty=&c{0} ju\u017c jest w Twojej dru\u017cynie! +Party.PlayerNotInParty=&4{0} nie jest w dru\u017cynie +Party.Specify=&cMusisz poda\u0107 dru\u017cyn\u0119. +Party.Teleport.Dead=&cNie mo\u017cesz si\u0119 zteleportowa\u0107 do martwego przyjaciela. +Party.Teleport.Hurt=&cZosta\u0142e\u015b/a\u015b zraniony przez ostatnie {0} sekund i nie mo\u017cna si\u0119 teleportowa\u0107. +Party.Teleport.Player=&aTeleportowano do {0}. +Party.Teleport.Self=&cNie mo\u017cesz si\u0119 teleportowa\u0107 do siebie! Party.Teleport.Target=&a{0} teleportowa\u0142 si\u0119 do Ciebie. -Party.Teleport.Disabled={0} nie zezwala na teleportacje druzynowa. -Party.Rename.Same=Taka juz jest wlasnie nazwa Twojej druzyny! -Party.Join.Self=Nie mozesz dolaczyc do samego siebie! -Party.Unlocked=&7Grupa jest otwarta dla wszystkich. -Party.Disband=&7Druzyna zostala rozwiazana -Party.Status.Locked=&4(TYLKO NA ZAPROSZENIE) -Party.ShareType.Xp=EXP -Party.ShareType.Item=PRZEDMIOTOWY +Party.Teleport.Disabled=&c{0} nie pozwala na dru\u017cynowe teleportowanie. +Party.Rename.Same=&cWpisz inn\u0105 nazw\u0119 jaskini, nie aktualn\u0105! +Party.Join.Self=&cNie mo\u017cesz do\u0142\u0105czy\u0107 do siebie! +Party.Unlocked=&7Dru\u017cyna jest odblokowana +Party.Disband=&7Dru\u017cyna zosta\u0142a rozwi\u0105zana +Party.Alliance.Formed=&7Twoja dru\u017cyna jest w sojuszu z &a{0} +Party.Alliance.Disband=&7Twoja dru\u017cyna nie jest ju\u017c w sojuszu z &c{0} +Party.Status.Locked=&4(TYLKO-ZAPROSZENI) +Party.Status.Unlocked=&2(OTWARTA) +Party.LevelUp=&eZwi\u0119kszono poziom dru\u017cyny: {0}. Aktualnie: ({1}) +Party.Feature.Chat=Czat Dru\u017cyny +Party.Feature.Teleport=Teleport dru\u017cyny +Party.Feature.Alliance=Sojusze +Party.Feature.ItemShare=Udost\u0119pnianie przedmiot\u00f3w +Party.Feature.XpShare=Udost\u0119pnianie XP +Party.Feature.Locked.Chat=ZABLOKOWANE DO {0}+ (CZAT DRU\u017bYNY) +Party.Feature.Locked.Teleport=ZABLOKOWANE DO {0}+ (TELEPORT DRU\u017bYNY) +Party.Feature.Locked.Alliance=ZABLOKOWANE DO {0}+ (SOJUSZE) +Party.Feature.Locked.ItemShare=ZABLOKOWANE DO {0}+ (UDOST\u0118PNIANIE PRZEDMIOT\u00d3W) +Party.Feature.Locked.XpShare=ZABLOKOWANE DO {0}+ UDOST\u0118PNIANIE XP) +Party.Feature.Disabled.1=&cNie odblokowano jeszcze czatu dry\u017cyny. +Party.Feature.Disabled.2=&cNie odblokowano jeszcze teleportu dru\u017cyny. +Party.Feature.Disabled.3=&cNie odblokowano jeszcze sojuszy dry\u017cyny. +Party.Feature.Disabled.4=&cNie odblokowano jeszcze udost\u0119pniani przedmiot\u00f3w. +Party.Feature.Disabled.5=&cNie odblokowano jeszcze udost\u0119pniania XP. +Party.ShareType.Xp=XP +Party.ShareType.Item=PRZEDMIOT +Party.ShareMode.None=\u017bADEN Party.ShareMode.Equal=R\u00d3WNY Party.ShareMode.Random=LOSOWY -Party.ItemShare.Disabled=Druzynowe dzielenie sie przedmiotami jest wylaczone. -Party.ItemShare.Category.Loot=Loot +Party.ItemShare.Category.Loot=\u0142up Party.ItemShare.Category.Mining=G\u00f3rnictwo -Party.ItemShare.Category.Herbalism=Zielarstwo -Party.ItemShare.Category.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Party.ItemShare.Category.Misc=R\u00f3zne -Commands.XPGain.Acrobatics=Upadanie -Commands.XPGain.Archery=Atak potworow -Commands.XPGain.Axes=Atak potworow -Commands.XPGain.Child=Podnosi poziomy z nadrzednych umiejetnosci -Commands.XPGain.Excavation=Kopanie i odnajdywanie skarb\u00f3w -Commands.XPGain.Fishing=Rybactwo -Commands.XPGain.Herbalism=Zbieranie Zi\u00f3\u0142 -Commands.XPGain.Mining=Wydobywa Kamie\u0144 i Surowce -Commands.XPGain.Repair=Naprawianie -Commands.XPGain.Swords=Atak potworow -Commands.XPGain.Taming=Oswoj zwierze, lub walcz ze swoimi wilkami. -Commands.XPGain.Unarmed=Atak potworow -Commands.XPGain.Woodcutting=\u0052\u0105\u0062\u0061\u006e\u0069\u0065 -Commands.XPGain=&8Zdobyte do\u015bwiadczenie: &f{0} -Commands.xplock.locked=&6Tw\u00f3j pasek XP\'a jest zablokowany {0}! -Commands.xplock.unlocked=&6Tw\u00f3j pasek XP\'a jest odblokowany {0}! -Commands.xprate.modified=Modyfikator zdobywania do\u015bwiadczenia zosta\u0142 zmieniony na {0} -Commands.xprate.over=&6Event&c zwi\u0119kszonego zdobywania XP\'a jest zako\u0144czony! -Commands.xprate.proper.0=Aby zmieni\u0107 mno\u017cnik XP - /xprate -Commands.xprate.proper.1=Aby przywr\u00f3ci\u0107 normalny mno\u017cnik zdobywania XP\'a - /xprate reset -Commands.xprate.proper.2=Wpisz true/false aby okre\u015bli\u0107 czy jest to EVENT czy te\u017c nie -Commands.xprate.started.0=&6EVENT zwi\u0119kszonego zdobywania XP\'a w\u0142a\u015bnie si\u0119 zacz\u0105\u0142! -Commands.xprate.started.1=&6Mno\u017cnik zdobywania XP\'a wynosi {0}x! -XPRate.Event=&6mcMMO is currently in an XP rate event! XP rate is {0}x! -Effects.Effects=EFEKTY -Effects.Child=&8LVL: &a{0} -Effects.Level=&8Poziom: &a{0} &3Doswiadczenie&e(&6{1}&e/&6{2}&e) -Effects.Parent=&6{0} - -Effects.Template=&3{0}: &a{1} -Guides.Available=&7Przewodnik dla {0} jest dost\u0119pny - wpisz /{1} ? [strona] -Guides.Header=&6-=&a{0} Przewodnik&6=- -Guides.Page.Invalid=Niew\u0142a\u015bciwa strona! -Guides.Page.OutOfRange=Ta strona nie istnieje, jest tylko {0} stron. -Guides.Usage= W\u0142a\u015bciwa Komenda to /{0} ? [strona] -Guides.Smelting.Section.0=Wkrotce... -Inspect.Offline=Nie masz odpowiednich uprawnie\u0144 aby przygl\u0105da\u0107 si\u0119 graczom offline! -Inspect.OfflineStats=Statystyki Gracza Offline &e{0} -Inspect.Stats=&aStatystyki Gracza &e{0} -Inspect.TooFar=Jeste\u015b zbyt daleko aby przyjrze\u0107 si\u0119 temu graczowi! -Item.ChimaeraWing.Fail=**U\u017bYCIE SKRZYD\u0141A CHIMERY NIE POWIOD\u0141O SI\u0118** -Item.ChimaeraWing.Pass=**SKRZYD\u0141O CHIMERY** -Item.ChimaeraWing.Name=Skrzydlo Chimery -Item.ChimaeraWing.Lore=&7Teleportuje Cie do Twojego l\u00f3zka. -Item.Generic.Wait=Musisz poczekac, nim bedziesz m\u00f3gl uzyc tego ponownie! &e({0}s) -Item.Injured.Wait=Zosta\u0142e\u015b ostatnio ranny i musisz poczeka\u0107 aby tego u\u017cy\u0107. &e({0}s) -Teleport.Commencing=&7Teleportacja za &6({0}) &7sekund, nie ruszaj sie... +Party.ItemShare.Category.Herbalism=Tresowanie +Party.ItemShare.Category.Woodcutting=\u015acinanie Drzew +Party.ItemShare.Category.Misc=R\u00f3\u017cne +##xp +Commands.XPGain.Acrobatics=Spadanie +Commands.XPGain.Alchemy=Warzenie Mikstur +Commands.XPGain.Archery=Atakowanie potwor\u00f3w +Commands.XPGain.Axes=Atakowanie potwor\u00f3w +Commands.XPGain.Child=Zyskuje poziomy dzi\u0119ki g\u0142\u00f3wnym umiej\u0119tno\u015bci\u0105 +Commands.XPGain.Excavation=Kopanie i znajdowanie skarb\u00f3w +Commands.XPGain.Fishing=\u0141owienie +Commands.XPGain.Herbalism=Zbieranie zi\u00f3\u0142 +Commands.XPGain.Mining=Kopanie kamienia & rud +Commands.XPGain.Repair=Naprawa +Commands.XPGain.Swords=Atakowanie potwor\u00f3w +Commands.XPGain.Taming=Rozmna\u017canie zwierz\u0105t, albo walka w/ z twoimi psami +Commands.XPGain.Unarmed=Atakowanie potwor\u00f3w +Commands.XPGain.Woodcutting=\u015acianie drzew +Commands.XPGain=&8ZDOBYWANIE XP: &f{0} +Commands.xplock.locked=&6Tw\u00f3j pasek XP jest teraz zablokowany na {0}! +Commands.xplock.unlocked=&6Tw\u00f3j pasek XP jest teraz &aODBLOKOWANY&6! +Commands.xprate.modified=&cMNO\u017bNIK XP zosta\u0142 zmieniony na {0} +Commands.xprate.over=&cEvent mcMMO XP w\u0142a\u015bnie si\u0119 sko\u0144czy\u0142!! +Commands.xprate.proper.0=&cW\u0142a\u015bciwe u\u017cycie do zmieny cz\u0119sto\u015bci XP to /xprate +Commands.xprate.proper.1=&cW\u0142a\u015bciwe u\u017cycie do zresetowania g\u0119sto\u015bci XP to /xprate reset +Commands.xprate.proper.2=&cPodaj warto\u015b\u0107 true lub false, aby wskaza\u0107, czy jest to event XP, czy nie. +Commands.NegativeNumberWarn=Nie u\u017cywaj liczb na minusie! +Commands.Event.Start=&amcMMO&6 Event! +Commands.Event.Stop=&amcMMO&3 Event Zako\u0144czony! +Commands.Event.Stop.Subtitle=&aMam nadziej\u0119, \u017ce mi\u0142o si\u0119 bawili\u015bcie! +Commands.Event.XP=&3Mno\u017cnik XP to teraz &6{0}&3x +Commands.xprate.started.0=&6XP EVENT mcMMO W\u0141A\u015aNIE SI\u0118 ROZPOCZ\u0104\u0141! +Commands.xprate.started.1=&6MNO\u017bNIK mcMMO XP WYNOSI TERAZ {0}x! + +# Admin Notifications +Server.ConsoleName=&e[Server] +Notifications.Admin.XPRate.Start.Self=&7Ustawi\u0142e\u015b/a\u015b globalny mno\u017cnik XP na &6{0}x +Notifications.Admin.XPRate.End.Self=&7Zako\u0144czy\u0142e\u015b/a\u015b event mno\u017cnika XP. +Notifications.Admin.XPRate.End.Others={0} &7zako\u0144czy\u0142/a event mcMMO XP. +Notifications.Admin.XPRate.Start.Others={0} &7rozpocz\u0105\u0142/\u0119\u0142a lub zmodyfikowa\u0142/a wydarzenie zwi\u0105zane z XP z globalnym mno\u017cnikiem {1}x +Notifications.Admin.Format.Others=&6(&amcMMO &3Admin&6) &7{0} +Notifications.Admin.Format.Self=&6(&amcMMO&6) &7{0} + +# Event +XPRate.Event=&6aAktualnie jest wydarzenie mcMMO event! Mno\u017cnik XP to {0}x! + +#GUIDES +Guides.Available=&7Poradnik dla {0} jest dost\u0119pny - Wpisz /{1} ? [strona] +Guides.Header=&6-=&a{0} PORADNIK&6=- +Guides.Page.Invalid=Nieprawid\u0142owy numer strony! +Guides.Page.OutOfRange=Ta strona nie istnieje, jest/s\u0105 tylko {0} stron/a/y. +Guides.Usage= Prawod\u0142owe u\u017cycie to /{0} ? [strona] +##Acrobatics +Guides.Acrobatics.Section.0=&3O Akrobatyce:\n&eakrobatyka to sztuka poruszania si\u0119 z wdzi\u0119kiem w mcMMO.\n&eZapewnia premie bojowe i premie do obra\u017ce\u0144 otoczenia.\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 PD w tej umiej\u0119tno\u015bci, musisz wykona\u0107 unik\n&ew walce lub przetrwa\u0107 upadki z wysoko\u015bci, kt\u00f3re ci\u0119 rani\u0105. +Guides.Acrobatics.Section.1=&3How does Rolling work?\n&eYou have a passive chance when you take fall damage\n&eto negate the damage done. You can hold the sneak button to\n&edouble your chances during the fall.\n&eThis triggers a Graceful Roll instead of a standard one.\n&eGraceful Rolls are like regular rolls but are twice as likely to\n&eoccur and provide more damage safety than regular rolls.\n&eRolling chance is tied to your skill level +Guides.Acrobatics.Section.2=&3How does Dodge work?\n&eDodge is a passive chance when you are\n&einjured in combat to halve the damage taken.\n&eIt is tied to your skill level. +##Alchemy +Guides.Alchemy.Section.0=&3O Alchemi:\n&eAlchemia polega na warzeniu mikstur.\n&eZapewnia przyspieszenie czasu warzenia mikstury,\n&ea tak\u017ce dodanie nowych (wcze\u015bniej) nieosi\u0105galnych mikstur. \n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP tej umiej\u0119tno\u015bci, musisz warzy\u0107 mikstury. +Guides.Alchemy.Section.1=&3How does Catalysis work?\n&eCatalysis speeds of the brewing process, with a\n&emax speed of 4x at level 1000.\n&eThis ability is unlocked at level 100 by default. +Guides.Alchemy.Section.2=&3How does Concoctions work?\n&eConcoctions allows brewing of more potions with custom ingredients.\n&eWhich special ingredients are unlocked is determined\n&eby your Rank. There are 8 ranks to unlock. +Guides.Alchemy.Section.3=&3Concoctions tier 1 ingredients:\n&eBlaze Powder, Fermented Spider Eye, Ghast Tear, Redstone,\n&eGlowstone Dust, Sugar, Glistering Melon, Golden Carrot,\n&eMagma Cream, Nether Wart, Spider Eye, Suplhur, Water Lily,\n&ePufferfish\n&e(Vanilla Potions) +Guides.Alchemy.Section.4=&3Concoctions tier 2 ingredients:\n&eCarrot (Potion of Haste)\n&eSlimeball (Potion of Dullness)\n\n&3Concoctions tier 3 ingredients:\n&eQuartz (Potion of Absorption)\n&eRed Mushroom (Potion of Leaping) +Guides.Alchemy.Section.5=&3Concoctions tier 4 ingredients:\n&eApple (Potion of Health Boost)\n&eRotten Flesh (Potion of Hunger)\n\n&3Concoctions tier 5 ingredients:\n&eBrown Mushroom (Potion of Nausea)\n&eInk Sack (Potion of Blindness) +Guides.Alchemy.Section.6=&3Concoctions tier 6 ingredients:\n&eFern (Potion of Saturation)\n\n&3Concoctions tier 7 ingredients:\n&ePoisonous Potato (Potion of Decay)\n\n&3Concoctions tier 8 ingredients:\n&eRegular Golden Apple (Potion of Resistance) +##Archery +Guides.Archery.Section.0=&3O \u0141ucznictwie:\n&e\u0141ucznictwo polega na strzelaniu z \u0142uku strza\u0142.\n&eZapewnia r\u00f3\u017cne bonusy bojowe, takie jak zwi\u0119kszenie obra\u017ce\u0144,\n&ekt\u00f3re skaluje si\u0119 z twoim poziomem i daje mo\u017cliwo\u015b\u0107 oszo\u0142omienia\n&eprzeciwnik\u00f3w w PvP. W dodatku mo\u017cesz odzyska\u0107\n&ecz\u0119\u015b\u0107 strza\u0142 z martwych wrog\u00f3w.\n\n\n&3ZDOBYWANIE XP:\n&eAby zdoby\u0107 XP w tej umiej\u0119tno\u015bci, musisz strzela\u0107 do mob\u00f3w lub\n&edo innych graczy. +Guides.Archery.Section.1=&3How does Skill Shot work?\n&eSkill Shot provides additional damage to your shots.\n&eThe bonus damage from Skill Shot increases as you\n&elevel in Archery.\n&eWith the default settings, your archery damage increases 10%\n&eevery 50 levels, to a maximum of 200% bonus damage. +Guides.Archery.Section.2=&3How does Daze work?\n&eYou have a passive chance to daze other players when\n&eyou shoot them. When Daze triggers it forces your opponents\n&eto look straight up for a short duration.\n&eA Daze shot also deals an additional 4 damage (2 hearts). +Guides.Archery.Section.3=&3How does Arrow Retrieval work?\n&eYou have a passive chance to retrieve some of your arrows\n&ewhen you kill a mob with your bow.\n&eThis chance increases as you level in Archery.\n&eBy default, this ability increases by 0.1% per level, up to 100%\n&eat level 1000. +##Axes +Guides.Axes.Section.0=&3About Axes:\n&eZ umiej\u0119tno\u015bci\u0105 Topory mo\u017cesz zrobi\u0107 co\u015b wi\u0119cej\n&eni\u017c niszczy\u0107 lasy! Mo\u017cesz hakowa\u0107 i sieka\u0107 moby\n&ei graczy, aby zdobywa\u0107 XP, musisz atakowa\u0107 moby siekier\u0105 z efektem\n&eodrzucenie i zada\u0107 \u015bmiertelny cios.\n&eTw\u00f3j top\u00f3r r\u00f3wnie\u017c staje si\u0119 r\u0119cznym r\u0119bakiem,\n&eponiewa\u017c bardzo obni\u017casz poziom zbroi\n&przeciwnika wraz z poziomiem umiej\u0119tno\u015bci.\n&3ZDOBYWANIE XP:\n&eAby zdobywa\u0107 XP musisz atakowa\u0107 moby\n&elub graczy siekier\u0105. +Guides.Axes.Section.1=&3How does Skull Splitter work?\n&eThis ability allows you to deal an AoE (Area of Effect) hit.\n&eThis AoE hit will deal half as much damage as you did to the\n&emain target, so it's great for clearing out large piles of mobs. +Guides.Axes.Section.2=&3How does Critical Strikes work?\n&eCritical Strikes is a passive ability which gives players a\n&echance to deal additional damage.\n&eWith the default settings, every 2 skill levels in Axes awards a\n&e0.1% chance to deal a Critical Strike, causing 2.0 times damage\n&eto mobs or 1.5 times damage against other players. +Guides.Axes.Section.3=&3How does Axe Mastery work?\n&eAxe Mastery is a passive ability that will add additional damage\n&eto your hits when using Axes.\n&eBy default, the bonus damage increases by 1 every 50 levels,\n&eup to a cap of 4 extra damage at level 200. +Guides.Axes.Section.4=&3How does Armor Impact work?\n&eStrike with enough force to shatter armor!\n&eArmor Impact has a passive chance to damage your\n&eopponent's armor. This damage increases as you level in Axes. +Guides.Axes.Section.5=&3How does Greater Impact work?\n&eYou have a passive chance to achieve a greater impact when\n&ehitting mobs or players with your axe.\n&eBy default this chance is 25%. This passive ability has an\n&eextreme knockback effect, similar to the Knockback II\n&eenchantment. In addition, it deals bonus damage to the target. +##Excavation +Guides.Excavation.Section.0=&3About Excavation:\n&eExcavation is the act of digging up dirt to find treasures.\n&eBy excavating the land you will find treasures.\n&eThe more you do this the more treasures you can find.\n\n&3XP GAIN:\n&eTo gain XP in this skill you must dig with a shovel in hand.\n&eOnly certain materials can be dug up for treasures and XP. +Guides.Excavation.Section.1=&3Compatible Materials:\n&eGrass, Dirt, Sand, Clay, Gravel, Mycelium, Soul Sand, Snow +Guides.Excavation.Section.2=&3How to use Giga Drill Breaker:\n&eWith a shovel in hand right click to ready your tool.\n&eOnce in this state you have about 4 seconds to make\n&econtact with Excavation compatible materials this will\n&eactivate Giga Drill Breaker. +Guides.Excavation.Section.3=&3What is Giga Drill Breaker?\n&eGiga Drill Breaker is an ability with a cooldown\n&etied to Excavation skill. It triples your chance\n&eof finding treasures and enables instant break\n&eon Excavation materials. +Guides.Excavation.Section.4=&3How does Archaeology work?\n&eEvery possible treasure for Excavation has its own\n&eskill level requirement for it to drop, as a result it's\n&edifficult to say how much it is helping you.\n&eJust keep in mind that the higher your Excavation skill\n&eis, the more treasures that can be found.\n&eAnd also keep in mind that each type of Excavation\n&ecompatible material has its own unique list of treasures.\n&eIn other words you will find different treasures in Dirt\nðan you would in Gravel. +Guides.Excavation.Section.5=&3Notes about Excavation:\n&eExcavation drops are completely customizeable\n&eSo results vary server to server. +##Fishing +Guides.Fishing.Section.0=&3About Fishing:\n&eWith the Fishing skill, Fishing is exciting again!\n&eFind hidden treasures, and shake items off mobs.\n\n&3XP GAIN:\n&eCatch fish. +Guides.Fishing.Section.1=&3How does Treasure Hunter work?\n&eThis ability allows you to find treasure from fishing \n&ewith a small chance of the items being enchanted.\n&eEvery possible treasure for Fishing has a chance\n&eto drop on any level. It depends however\n&ewhat the rarity of the item is how often it will drop.\n&eThe higher your Fishing skill is, the better\n&eyour chances are to find better treasures. +Guides.Fishing.Section.2=&3How does Ice Fishing work?\n&eThis passive skill allows you to fish in ice lakes!\n&eCast your fishing rod in an ice lake and the ability will\n&ecreate a small hole in the ice to fish in. +Guides.Fishing.Section.3=&3How does Master Angler work?\n&eThis passive skill increases the bite chance while fishing.\n&eWhen you've unlocked this ability, fishing while in\n&ea boat improves odds of catching a fish. +Guides.Fishing.Section.4=&3How does Shake work?\n&eThis active ability allows you to shake items loose from mobs\n&eby hooking them with the fishing rod. \n&eMobs will drop items they would normally drop on death.\n&eIt is also possible to acquire mob skulls, which are normally \n&eunobtainable in survival mode. +Guides.Fishing.Section.5=&3How does Fisherman's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&efrom eating fish. +Guides.Fishing.Section.6=&3Notes about Fishing:\n&eFishing drops are completely customizable,\n&eso results vary server to server. +##Herbalism +Guides.Herbalism.Section.0=&3About Herbalism:\n&eHerbalism is about collecting herbs and plants.\n\n\n&3XP GAIN:\n&eCollect plants and herbs. +Guides.Herbalism.Section.1=&3Compatible Blocks\n&eWheat, Potatoes, Carrots, Melons, \n&ePumpkins, Sugar Canes, Cocoa Beans, Flowers, Cacti, Mushrooms,\n&eNether Wart, Lily Pads, and Vines. +Guides.Herbalism.Section.2=&3How does Green Terra work?\n&eGreen Terra is an active ability, you can right-click\n&ewhile holding a hoe to activate Green Terra.\n&eGreen Terra grants players a chance to get 3x drops from\n&eharvesting plants. It also gives players the ability to\n&espread life into blocks and transform them using seeds\n&efrom your inventory. +Guides.Herbalism.Section.3=&3How does Green Thumb (Crops) work?\n&eThis passive ability will automatically replant crops when\n&eharvesting.\n&eYour chance of success depends on your Herbalism skill. +Guides.Herbalism.Section.4=&3How does Green Thumb (Cobble/Stone Brick/Dirt) work?\n&eThis active ability allows you to turn blocks into their\n&e"plant-related" counterparts. You can do this by right-clicking\n&ea block, while holding seeds. This will consume 1 seed. +Guides.Herbalism.Section.5=&3How does Farmer's Diet work?\n&eThis passive skill increases the amount of hunger restored \n&ewhen eating Bread, Cookies, Melons, Mushroom Soup, Carrots,\n&eand Potatoes. +Guides.Herbalism.Section.6=&3How does Hylian Luck work?\n&eThis passive ability gives you a chance to find rare items\n&ewhen certain blocks are broken with a sword. +Guides.Herbalism.Section.7=&3How do Double Drops work?\n&eThis passive ability gives players more yield from their\n&eharvests. +##Mining +Guides.Mining.Section.0=&3About Mining:\n&eMining consists of mining stone and ores. It provides bonuses\n&eto the amount of materials dropped while mining.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you must mine with a pickaxe in hand.\n&eOnly certain blocks award XP. +Guides.Mining.Section.1=&3Compatible Materials:\n&eStone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n&eLapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n&eGlowstone, and Netherrack. +Guides.Mining.Section.2=&3How to use Super Breaker:\n&eWith a pickaxe in your hand, right click to ready your tool.\n&eOnce in this state, you have about 4 seconds to make contact\n&ewith Mining compatible materials, which will activate Super\n&eBreaker. +Guides.Mining.Section.3=&3What is Super Breaker?\n&eSuper Breaker is an ability with a cooldown tied to the Mining\n&eskill. It triples your chance of extra items dropping and\n&eenables instant break on Mining materials. +Guides.Mining.Section.4=&3How to use Blast Mining:\n&eWith a pickaxe in hand,\n&ecrouch and right-click on TNT from a distance. This will cause the TNT\n&eto instantly explode. +Guides.Mining.Section.5=&3How does Blast Mining work?\n&eBlast Mining is an ability with a cooldown tied to the Mining\n&eskill. It gives bonuses when mining with TNT and allows you\n&eto remote detonate TNT. There are three parts to Blast Mining.\n&eThe first part is Bigger Bombs, which increases blast radius.\n&eThe second is Demolitions Expert, which decreases damage\n&efrom TNT explosions. The third part simply increases the\n&eamount of ores dropped from TNT and decreases the\n&edebris dropped. +##Repair +Guides.Repair.Section.0=&3About Repair:\n&eRepair allows you to use an iron block to repair armor and\n&etools.\n\n&3XP GAIN:\n&eRepair tools or armor using the mcMMO Anvil. This is an\n&eiron block by default and should not be confused with\nðe Vanilla Minecraft Anvil. +Guides.Repair.Section.1=&3How can I use Repair?\n&ePlace down a mcMMO Anvil and right-click to repair the item \n&eyou're currently holding. This consumes 1 item on every use. +Guides.Repair.Section.2=&3How does Repair Mastery work?\n&eRepair Mastery increases the repair amount. The extra amount\n&erepaired is influenced by your Repair skill level. +Guides.Repair.Section.3=&3How does Super Repair work?\n&eSuper Repair is a passive ability. When repairing an item,\n&eit grants players a chance to repair an item with\n&edouble effectiveness. +Guides.Repair.Section.4=&3How does Arcane Forging work?\n&eThis passive ability allows you to repair items with a certain\n&echance of maintaining its enchantments. The enchants may be\n&ekept at their existing levels, downgraded to a lower level,\n&eor lost entirely. +##Salvage +Guides.Salvage.Section.0=&3About Salvage:\n&eSalvage allows you to use a gold block to salvage armor and\n&etools.\n\n&3XP GAIN:\n&eSalvage is a child skill of Repair and Fishing, your Salvage\n&eskill level is based on your Fishing and Repair skill levels. +Guides.Salvage.Section.1=&3How can I use Salvage?\n&ePlace down a mcMMO Salvage Anvil and right-click to salvage\nðe item you're currently holding. This will break apart the item,\n&eand give back materials used to craft the item.\n\n&eFor example, salvaging an iron pickaxe will give you iron bars. +Guides.Salvage.Section.2=&3How does Advanced Salvage work?\n&eWhen unlocked, this ability allows you to salvage damaged items.\n&eThe yield percentage increases as you level up. A higher yield\n&emeans that you can get more materials back.\n&eWith advanced salvage you will always get 1 material back,\n&eunless the item is too damaged. So you don't have to worry\n&eabout destroying items without getting anything in return. +Guides.Salvage.Section.3=&3To illustrate how this works, here's an example:\n&eLet's say we salvage a gold pickaxe which is damaged for 20%,\nðis means that the maximum amount you could get is only 2\n&e(because the pick is crafted with 3 ingots - each worth\n&e33,33% durability) which is equal to 66%. If your yield\n&epercentage is below 66% you are not able to get 2 ingots.\n&eIf it is above this value you are able to gain the "full amount",\n&ewhich means that you will get 2 ingots. +Guides.Salvage.Section.4=&3How does Arcane Salvage work?\n&eThis ability allows you to get enchanted books when salvaging\n&eenchanted items. Depending on your level the chance of\n&esuccessfully extracting a full or partial enchantment varies.\n\n&eWhen an enchantment is partially extracted, the enchantment\n&ebook will have a lower level enchantment compared to what\n&eit was on the item. +##Smelting +Guides.Smelting.Section.0=Coming soon... +##Swords +Guides.Swords.Section.0=&3About Swords:\n&eThis skill awards combat bonuses to anyone fighting with a\n&esword.\n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs or \n&eother players when wielding a sword. +Guides.Swords.Section.1=&3How does Serrated Strikes work?\n&eSerrated Strikes is an active ability, you can activate it by\n&eright-clicking with a sword. This ability allows you to deal \n&ean AoE (Area of Effect) hit. This AoE will do a bonus 25%\n&edamage and will inflict a bleed effect that lasts for 5 ticks. +Guides.Swords.Section.2=&3How does Counter Attack work?\n&eCounter Attack is an active ability. When blocking and taking\n&ehits from mobs, you will have a chance to reflect 50% of \nðe damage that was taken. +Guides.Swords.Section.3=&3How does Rupture work?\n&eRupture causes enemies to take damage every two seconds. The \n&etarget will bleed until the effect wears off, or death, \n&ewhichever comes first.\n&eThe duration of the bleed is increased by your sword skill. +##Taming +Guides.Taming.Section.0=&3About Taming:\n&eTaming will give players various combat bonuses when using\n&etamed wolves.\n\n&3XP GAIN:\n&eTo gain XP in this skill, you need to tame wolves/ocelots or\n&eget into combat with your wolves. +Guides.Taming.Section.1=&3How does Call of the Wild work?\n&eCall of the Wild is an active ability that will allow you to summon\n&ea wolf or an ocelot by your side. You can do this by\n&esneaking + left-clicking while holding bones or fish. +Guides.Taming.Section.2=&3How does Beast Lore work?\n&eBeast Lore allows players to inspect pets and to check the\n&estats of wolves and ocelots. Left-click a wolf or ocelot to use\n&eBeast Lore. +Guides.Taming.Section.3=&3How does Gore work?\n&eGore is a passive ability that has a chance of inflicting a\n&ebleeding effect on your wolves' targets. +Guides.Taming.Section.4=&3How does Sharpened Claws work?\n&eSharpened Claws provides a damage bonus to damage dealt\n&eby wolves. The damage bonus depends on your Taming level. +Guides.Taming.Section.5=&3How does Environmentally Aware work?\n&eThis passive ability will allow wolves to teleport to you when\nðey get near hazards, such as Cacti/Lava. It will also give\n&ewolves fall damage immunity. +Guides.Taming.Section.6=&3How does Thick Fur work?\n&eThis passive ability will reduce damage and make wolves\n&efire resistant. +Guides.Taming.Section.7=&3How does Shock Proof work?\n&eThis passive ability reduces damage done to wolves\n&efrom explosions. +Guides.Taming.Section.8=&3How does Fast Food Service work?\n&eThis passive ability gives wolves a chance to heal whenever\nðey perform an attack. +##Unarmed +Guides.Unarmed.Section.0=&3About Unarmed:\n&eUnarmed will give players various combat bonuses when using\n&eyour fists as a weapon. \n\n&3XP GAIN:\n&eXP is gained based on the amount of damage dealt to mobs \n&eor other players when unarmed. +Guides.Unarmed.Section.1=&3How does Berserk work?\n&eBeserk is an active ability that is activated by\n&eright-clicking. While in Beserk mode, you deal 50% more\n&edamage and you can break weak materials instantly, such as\n&eDirt and Grass. +Guides.Unarmed.Section.2=&3How does Steel Arm Style work?\n&eSteel Arm Style increases the damage dealt when hitting mobs or\n&eplayers with your fists. +Guides.Unarmed.Section.3=&3How does Arrow Deflect work?\n&eArrow Deflect is a passive ability that gives you a chance\n&eto deflect arrows shot by Skeletons or other players.\n&eThe arrow will fall harmlessly to the ground. +Guides.Unarmed.Section.4=&3How does Iron Grip work?\n&eIron Grip is a passive ability that counters disarm. As your\n&eunarmed level increases, the chance of preventing a disarm increases. +Guides.Unarmed.Section.5=&3How does Disarm work?\n&eThis passive ability allows players to disarm other players,\n&ecausing the target's equipped item to fall to the ground. +##Woodcutting +Guides.Woodcutting.Section.0=&3About Woodcutting:\n&eWoodcutting is all about chopping down trees.\n\n&3XP GAIN:\n&eXP is gained whenever you break log blocks. +Guides.Woodcutting.Section.1=&3How does Tree Feller work?\n&eTree Feller is an active ability, you can right-click\n&ewhile holding an ax to activate Tree Feller. This will\n&ecause the entire tree to break instantly, dropping all\n&eof its logs at once. +Guides.Woodcutting.Section.2=&3How does Leaf Blower work?\n&eLeaf Blower is a passive ability that will cause leaf\n&eblocks to break instantly when hit with an axe. By default,\nðis ability unlocks at level 100. +Guides.Woodcutting.Section.3=&3How do Double Drops work?\n&eThis passive ability gives you a chance to obtain an extra\n&eblock for every log you chop. +#INSPECT +Inspect.Offline= &cNie masz uprawnie\u0144 do sprawdzania graczy offline! +Inspect.OfflineStats=Statystyki mcMMO dla gracza off-line &e{0} +Inspect.Stats=&Statystyki amcMMO dla &e{0} +Inspect.TooFar=Jeste\u015b za daleko, aby sprawdzi\u0107 tego gracza! +#ITEMS +Item.ChimaeraWing.Fail=&c**CHIMAERA WING FAILED!** +Item.ChimaeraWing.Pass=**CHIMAERA WING** +Item.ChimaeraWing.Name=Chimaera Wing +Item.ChimaeraWing.Lore=&7Teleportuje Ci\u0119 do \u0142\u00f3\u017cka. +Item.ChimaeraWing.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! +Item.NotEnough=Potrzebujesz &e{0}&c wi\u0119cej o &6{1}&c! +Item.Generic.Wait=Musisz odczeka\u0107 zanim ponownie to u\u017cyjesz! &e({0}s) +Item.Injured.Wait=Niedawno by\u0142e\u015b kontuzjowany i musisz poczeka\u0107, zanim to wykorzystasz. &e({0}s) +Item.FluxPickaxe.Name=Topi\u0105cy Kilof +Item.FluxPickaxe.Lore.1=&7Ma szanse na natychmiastowe przepalenie rudy. +Item.FluxPickaxe.Lore.2=&7Wymaga poziomu &6Przepalanie: &7{0}+ +#TELEPORTATION +Teleport.Commencing=&7Rozpoczynanie teleportacji… Przez &6({0}) &7sekund, nie ruszaj si\u0119... Teleport.Cancelled=&4Teleportacja anulowana! -Skills.Disarmed=&4Zostales rozbrojony! -Skills.Header=-----[]&a{0}&c[]----- -Skills.NeedMore=&4Potrzebujesz wiecej +#SKILLS +Skills.Child=&6(SUB-UMIEJ\u0118TNO\u015aCI) +Skills.Disarmed=&4Zosta\u0142e\u015b rozbrojony! +Skills.Header=-----[] &a{0}&c []----- +Skills.NeedMore=&4Potrzebujesz wi\u0119cej &7{0} +Skills.NeedMore.Extra=&4Potrzebujesz wi\u0119cej &7{0}{1} +Skills.Parents= UMIEJ\u0118TNO\u015a\u0106 Skills.Stats={0}&a{1}&3 XP(&7{2}&3/&7{3}&3) -Skills.TooTired=Musisz odpoczac zanim ponownie uzyjesz tej umiejetnosci. -Skills.ConfirmOrCancel=&aPrawy-klik ponownie by potwierdzic &6{0}&a. Lewy-klik by anulowac. -Stats.Header.Combat=&6-=UMIEJ\u0118TNO\u015aCI BOJOWE=- -Stats.Header.Gathering=&6-=UMIEJ\u0118TNO\u015aCI ZBIERANIA=- -Stats.Header.Misc=&6-=ROZNE UMIEJETNOSCI=- +Skills.ChildStats={0}&a{1} +Skills.MaxXP=Max +Skills.TooTired=Jeste\u015b zbyt zm\u0119czony, aby ponownie u\u017cy\u0107 tej zdolno\u015bci. &e({0}s) +Skills.TooTired.Named=&7(&6{0}&e {1}s&7) +Skills.TooTired.Extra=&6{0} &eCzas Odnowienia Super Umiej\u0119tno\u015bci - {1} +Skills.Cancelled=&6{0} &canulowano! +Skills.ConfirmOrCancel=&aKliknij Prawy-przycisk-myszy, aby potwierdzi\u0107 &6{0}&a. Lewy, aby anulowa\u0107. +Skills.AbilityGateRequirementFail=&7Potrzebujesz wi\u0119kszy poziom o &e{0}&7, aby u\u017cy\u0107 super umiej\u0119tno\u015b\u0107 &3{1}&7. +#STATISTICS +Stats.Header.Combat=&6-=UMIEJ\u0118TNO\u015aCI WALKI=- +Stats.Header.Gathering=&6-=ZBI\u00d3R UMIEJ\u0118TNO\u015aCI=- +Stats.Header.Misc=&6-=R\u00d3\u017bNE UMIEJ\u0118TNO\u015aCI=- Stats.Own.Stats=&a[mcMMO] Statystyki +#PERKS Perks.XP.Name=Do\u015bwiadczenie -Perks.XP.Desc=Otrzymuje {0}x XP\'a. +Perks.XP.Desc=Otrzymuj zwi\u0119kszone XP w niekt\u00f3rych wiadomo\u015bciach. Perks.Lucky.Name=Szcz\u0119\u015bcie -Perks.Lucky.Desc=Daje {0} i umiej\u0119tno\u015bciom o 33.3% lepsz\u0105 szanse na aktywacj\u0119. -Perks.Lucky.Desc.Login=Daje wybranym skillom i umiej\u0119tno\u015bciom o 33.3% lepsz\u0105 szanse na aktywacj\u0119. -Perks.Lucky.Bonus=&6 ({0} ze zdolno\u015bci\u0105 Szcz\u0119\u015bcia) -Perks.Cooldowns.Name=Szybka Regeneracja -Perks.Cooldowns.Desc=Zmniejsza czas odnowienia zdolno\u015bci o {0}. +Perks.Lucky.Desc=Daje {0} umiej\u0119tno\u015bci i zdolno\u015bci o 33.3% wi\u0119kszej szansy na aktywacje. +Perks.Lucky.Desc.Login=Daje niekt\u00f3rym umiej\u0119tno\u015bciom i zdolno\u015bciom o 33,3% wi\u0119ksz\u0105 szans\u0119 na aktywacj\u0119. +Perks.Lucky.Bonus=&6 ({0} z perkiem Szcz\u0119\u015bcie) +Perks.Cooldowns.Name=Szybki powr\u00f3t do zdrowia +Perks.Cooldowns.Desc=Skraca czas odnowienia o {0}. Perks.ActivationTime.Name=Wytrzyma\u0142o\u015b\u0107 -Perks.ActivationTime.Desc=Zwi\u0119ksza czas na u\u017cycie zdolno\u015bci o {0} sekund. -Perks.ActivationTime.Bonus=&6 ({0}s ze zdolno\u015bci\u0105 Wytrzyma\u0142o\u015bci) -MOTD.Donate=&3Informacje o Dotacji: -MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Kara za \u015amier\u0107: &4{0}% -MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Statystyki Wampirycznych Pijawek: &4{0}% -MOTD.PerksPrefix=[mcMMO Zdolno\u015bci] -MOTD.Version=&6[mcMMO] Obecna Wersja &3{0} -MOTD.Website=&6[mcMMO] &a{0}&e - Strona mcMMO -Smelting.Ability.FuelEfficiency=Mnoznik wydajnosci paliwa: &e{0}x -Smelting.Ability.Locked.0=DOSTEPNE OD POZIOMU {0}+ (VANILLA XP BOOST) -Smelting.Ability.Locked.1=DOSTEPNE OD POZIOMU {0}+ (FLUX MINING) -Smelting.Ability.SecondSmelt=Szansa na drugie przetopienie: &e{0} -Smelting.Ability.VanillaXPBoost=Vanilla mnoznik XP: &e{0}x -Smelting.SubSkill.FuelEfficiency.Name=Wydajnosc paliwa -Smelting.SubSkill.FuelEfficiency.Description=Zwieksza czas spalania sie paliwa w piecu podczas przetapiania -Smelting.SubSkill.SecondSmelt.Name=Drugie przetopienie -Smelting.SubSkill.SecondSmelt.Description=Podwaja zasoby zdobyte z przetapiania -Smelting.Effect.4=Vanilla XP Boost -Smelting.Effect.5=Zwieksza XP zdobywane poprzez przetapianie -Smelting.SubSkill.FluxMining.Description=Szansa dla zl\u00f3z by zostaly natychmiastowo przetopione podczas wykopywania -Smelting.FluxMining.Success=&aZloze przetopilo sie samoistnie! -Smelting.Listener=Przetapianie: -Smelting.SkillName=PRZETAPIANIE -Commands.Description.adminchat=Wlacza/wylacza czat admin\u00f3w lub wysyla wiadomosc na czat admin\u00f3w -Commands.Description.mcnotify=Wlacza/wylacza informacje na temat umiejetnosci mcMMO na czacie -Commands.Description.vampirism=Zmodyfikuj wartosc procentowa na aktywowanie wampiryzmu mcMMO lub go wlacz/wylacz -UpdateChecker.Outdated=Uzywasz przestarzalej wersji mcMMO! -UpdateChecker.NewAvailable=Dostepna jest nowa wersja na BukkitDev. -Commands.XPBar.Usage=Proper usage is /mmoxpbar -Commands.Description.mmoxpbar=Player settings for mcMMO XP bars -Commands.Description.mmocompat=Information about mcMMO and whether or not its in compatibility mode or fully functional. +Perks.ActivationTime.Desc=Zwi\u0119ksza czas aktywacji umiej\u0119tno\u015bci o {0} sekund. +Perks.ActivationTime.Bonus=&6 ({0}s z perkiem Wytrzyma\u0142o\u015b\u0107) +#HARDCORE +Hardcore.Mode.Disabled=&6[mcMMO] Hardcore mode {0} wy\u0142\u0105czony dla {1}. +Hardcore.Mode.Enabled=&6[mcMMO] Hardcore mode {0} w\u0142\u0105czony dla {1}. +Hardcore.DeathStatLoss.Name=Skill Death Penalty +Hardcore.DeathStatLoss.PlayerDeath=&6[mcMMO] &4Straci\u0142e\u015b/a\u015b &9{0}&4 poziom\u00f3w przez \u015bmier\u0107. +Hardcore.DeathStatLoss.PercentageChanged=&6[mcMMO] Procent utraty statystyk zosta\u0142 zmieniony na {0}. +Hardcore.Vampirism.Name=Wampiryzm +Hardcore.Vampirism.Killer.Failure=&6[mcMMO] &e{0}&7 by\u0142/a zbyt niewykwalifikowany, aby udzieli\u0107 ci jakiejkolwiek wiedzy. +Hardcore.Vampirism.Killer.Success=&6[mcMMO] &3Ukrad\u0142e\u015b/a\u015b &9{0}&3 poziom\u00f3w od &e{1}. +Hardcore.Vampirism.Victim.Failure=&6[mcMMO] &e{0}&7 nie by\u0142 wstanie Ci ukra\u015b\u0107 umiej\u0119tno\u015bci! +Hardcore.Vampirism.Victim.Success=&6[mcMMO] &e{0}&4 ukrad\u0142/a &9{1}&4 poziom\u00f3w od Ciebie! +Hardcore.Vampirism.PercentageChanged=&6[mcMMO] Procent wampiryzmu zosta\u0142 zmieniony na {0}. +#MOTD +MOTD.Donate=&3Info o Donacjach: +MOTD.Hardcore.Enabled=&6[mcMMO] &3Hardcore Mode w\u0142\u0105czony: &4{0} +MOTD.Hardcore.DeathStatLoss.Stats=&6[mcMMO] &3Skill Death Penalty: &4{0}% +MOTD.Hardcore.Vampirism.Stats=&6[mcMMO] &3Vampirism Stat Leech: &4{0}% +MOTD.PerksPrefix=&6[mcMMO Perki] +MOTD.Version=&6[mcMMO] Wersja: &3{0} +MOTD.Website=&6[mcMMO] &a{0}&e - Strona Internetowa mcMMO +#SMELTING +Smelting.SubSkill.UnderstandingTheArt.Name=Zrozumie\u0107 Sztuk\u0119 +Smelting.SubSkill.UnderstandingTheArt.Description=Mo\u017ce sp\u0119dzasz za du\u017co czasu przepalaj\u0105c rudy w jaskini.\nTa umiej\u0119tno\u015b\u0107 wzmacnia r\u00f3\u017cne w\u0142a\u015bciwo\u015bci wytapiania. +Smelting.SubSkill.UnderstandingTheArt.Stat=Mno\u017cnik XP z piecyk\u00f3w: &e{0}x +Smelting.Ability.Locked.0=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (WZMOCNIEENIE XP VANILLA) +Smelting.Ability.Locked.1=ZABLOKOWANE DO {0}+ UMIEJ\u0118TNO\u015a\u0106 (G\u00d3RNICZE PRZEPALANIE) +Smelting.SubSkill.FuelEfficiency.Name=Efektywno\u015b\u0107 Paliwa +Smelting.SubSkill.FuelEfficiency.Description=Zwi\u0119ksza czas po jakim spala si\u0119 paliwo u\u017cywane w piecyku. +Smelting.SubSkill.FuelEfficiency.Stat=Mno\u017cnik efektywno\u015bci paliwa: &e{0}x +Smelting.SubSkill.SecondSmelt.Name=Podw\u00f3jne przepalanie +Smelting.SubSkill.SecondSmelt.Description=Podwaja zasoby przepalone w piecyku +Smelting.SubSkill.SecondSmelt.Stat=Druga szansa na przepalenie +Smelting.Effect.4=Wzmocnienie XP vanilla +Smelting.Effect.5=Zwi\u0119ksza XP dostawane za przepalanie w piecykach +Smelting.SubSkill.FluxMining.Name=G\u00f3rnicze Przepalanie +Smelting.SubSkill.FluxMining.Description=Szansa na przepalenie rudy po jej wykopaniu +Smelting.SubSkill.FluxMining.Stat=Szansa na przepalenie +Smelting.Listener=Przepalanie: +Smelting.SkillName=PRZEPALANIE +#COMMAND DESCRIPTIONS +Commands.Description.addlevels=Dodaj poziomy mcMMO do u\u017cytkownika +Commands.Description.adminchat=W\u0142\u0105cz/wy\u0142\u0105cz czat administratora mcMMO lub wysy\u0142anie wiadomo\u015bci na czacie administracyjnym +Commands.Description.addxp=Dodano mcMMO XP graczowi +Commands.Description.hardcore=Zmodyfikuj procent hardcore mcMMO lub w\u0142\u0105cz/wy\u0142\u0105cz tryb hardcore +Commands.Description.inspect=Wy\u015bwietl szczeg\u00f3\u0142owe informacje mcMMO o innym graczu +Commands.Description.mcability=W\u0142\u0105cz/wy\u0142\u0105cz przygotowywanie umiej\u0119tno\u015bci mcMMO po klikni\u0119ciu prawym przyciskiem myszy +Commands.Description.mccooldown=Zobacz wszystkie czasy odnowienia zdolno\u015bci mcMMO +Commands.Description.mcchatspy=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO spy czat\u00f3w dru\u017cynowych +Commands.Description.mcgod=Prze\u0142\u0105cz mcMMO god-mode: w\u0142\u0105cz/wy\u0142\u0105cz +Commands.Description.mchud=Zmie\u0144 sw\u00f3j styl mcMMO HUD +Commands.Description.mcmmo=Poka\u017c kr\u00f3tki opis mcMMO +Commands.Description.mcnotify=W\u0142\u0105cz/wy\u0142\u0105cz mcMMO wy\u015bwietlanie powiadomie\u0144 o umiej\u0119tno\u015bciach na czacie +Commands.Description.mcpurge=Usu\u0144 u\u017cytkownik\u00f3w bez poziom\u00f3w umiej\u0119tno\u015bci mcMMO i u\u017cytkownik\u00f3w, kt\u00f3rzy nie nawi\u0105zali po\u0142\u0105czenia od ponad {0} miesi\u0119cy z baz\u0105 danych mcMMO. +Commands.Description.mcrank=Poka\u017c ranking mcMMO dla gracza +Commands.Description.mcrefresh=Od\u015bwie\u017c wszystkie czasy odnowienia mcMMO +Commands.Description.mcremove=Usu\u0144 gracza z bazy danych mcMMO +Commands.Description.mcscoreboard=Zarz\u0105dzaj tablic\u0105 wynik\u00f3w mcMMO +Commands.Description.mcstats=Poka\u017c swoje poziomy i XP w mcMMO +Commands.Description.mctop=Poka\u017c tablice lider\u00f3w mcMMO +Commands.Description.mmoedit=Edytuj poziomy mcMMO dla u\u017cytkownika +Commands.Description.mmodebug=Prze\u0142\u0105cz tryb debugowania, kt\u00f3ry wy\u015bwietla przydatne informacje po trafieniu w bloki +Commands.Description.mmoupdate=Przeprowad\u017a migracj\u0119 bazy danych mcMMO ze starej bazy danych do bie\u017c\u0105cej +Commands.Description.mcconvert=Konwertuje typy baz danych lub typy formu\u0142 do\u015bwiadczenia +Commands.Description.mmoshowdb=Poka\u017c nazw\u0119 bie\u017c\u0105cego typu bazy danych (do p\u00f3\u017aniejszego u\u017cycia /mmoupdate) +Commands.Description.party=Kontroluj r\u00f3\u017cne ustawienia dru\u017cyn mcMMO +Commands.Description.partychat=W\u0142\u0105cz / wy\u0142\u0105cz czat grupy mcMMO lub wysy\u0142anie wiadomo\u015bci czatu w grupie +Commands.Description.ptp=Teleportuj si\u0119 do cz\u0142onka dru\u017cyny mcMMO +Commands.Description.Skill=Wy\u015bwietl szczeg\u00f3\u0142owe informacje o umiej\u0119tno\u015bciach mcMMO dla gracza {0} +Commands.Description.skillreset=Zresetuj poziomy mcMMO dla u\u017cytkownika +Commands.Description.vampirism=Zmodyfikuj procent wampiryzmu mcMMO lub w\u0142\u0105cz/wy\u0142\u0105cz tryb wampiryzmu +Commands.Description.xplock=Zablokuj pasek mcMMO XP na okre\u015blonej umiej\u0119tno\u015bci mcMMO +Commands.Description.xprate=Zmie\u0144 ilo\u015b\u0107 mcMMO XP lub rozpocznij wydarzenie mcMMO XP +#UPDATE CHECKER +UpdateChecker.Outdated=U\u017cywasz przestarza\u0142ej wersji mcMMO! +UpdateChecker.NewAvailable=Jest nowa wersja dost\u0119pna na Spigot. +#SCOREBOARD HEADERS +Scoreboard.Header.PlayerStats=&emcMMO Statystyki +Scoreboard.Header.PlayerCooldowns=&emcMMO Czas Odnowienia +Scoreboard.Header.PlayerRank=&emcMMO Rangi +Scoreboard.Header.PlayerInspect=&emcMMO Statystyki: {0} +Scoreboard.Header.PowerLevel=&cPoziom Mocy +Scoreboard.Misc.PowerLevel=&6Poziom Poziomu +Scoreboard.Misc.Level=&3Poziom +Scoreboard.Misc.CurrentXP=&aAktualne XP +Scoreboard.Misc.RemainingXP=&eBrakuj\u0105ce XP +Scoreboard.Misc.Cooldown=&dCzas Odnowienia +Scoreboard.Misc.Overall=&6Og\u00f3lne +Scoreboard.Misc.Ability=Umiej\u0119tno\u015b\u0107 +#DATABASE RECOVERY +Profile.PendingLoad=&cTwoja baza danych graczy mcMMO nie zosta\u0142a jeszcze za\u0142adowana. +Profile.Loading.Success=&aTw\u00f3j profil mcMMO zosta\u0142 za\u0142adowany. +Profile.Loading.FailurePlayer=&cmcMMO is having trouble loading your data, we have attempted to load it &a{0}&c times.&c You may want to contact the server admins about this issue. mcMMO will attempt to load your data until you disconnect, you will not gain XP or be able to use skills while the data is not loaded. +Profile.Loading.FailureNotice=&4[A]&c mcMMO nie m\u00f3g\u0142 za\u0142adowa\u0107 danych odtwarzacza dla &e{0}&c. &dSprawd\u017a konfiguracj\u0119 bazy danych. Pr\u00f3by podj\u0119te do tej pory: {1}. +#Holiday +Holiday.AprilFools.Levelup=&6{0} jest teraz na poziomie &a{1}&6! +Holiday.Anniversary=&9Szcz\u0119\u015bliwej {0} rocznicy!\n&9Na cze\u015b\u0107 ca\u0142ej pracy nossr50 i wszystkich tw\u00f3rc\u00f3w, oto pokaz sztucznych ogni! +#Reminder Messages +Reminder.Squelched=&7Przypomnienie: Obecnie nie otrzymujesz powiadomie\u0144 od mcMMO, aby w\u0142\u0105czy\u0107 powiadomienia, uruchom ponownie komend\u0119 /mcnotify. To jest automatyczne przypomnienie godzinowe. +#Locale +Locale.Reloaded=&aPliki lokalne prze\u0142adowane! +#Player Leveling Stuff +LevelCap.PowerLevel=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom mocy wynosz\u0105cy &c{0}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy od tej umiej\u0119tno\u015bci. +LevelCap.Skill=&6(&amcMMO&6) &eOsi\u0105gn\u0105\u0142e\u015b maksymalny poziom &c{0}&e dla &6{1}&e. Od tego momentu przestaniesz zdobywa\u0107 kolejne poziomy tej umiej\u0119tno\u015bci. +Commands.XPBar.Usage=Prawid\u0142owe u\u017cycie to /mmoxpbar +Commands.Description.mmoxpbar=Ustawienia paska mcMMO XP dla gracza +Commands.Description.mmocompat=Informacje o mcMMO i czy jest w trybie zgodno\u015bci lub w pe\u0142ni funkcjonalna. +Compatibility.Layer.Unsupported=&6Kompatybilno\u015b\u0107 dla &a{0}&6 is nie jest wspierana dla tej wersji Minecraft. +Compatibility.Layer.PartialSupport=&6Kompatybilno\u015b\u0107 dla &a{0}&6 nie jest w pe\u0142ni wspierana dla tej wersji Minecraft, ale mcMMO uruchamia dodatkowy system, aby emulowa\u0107 niekt\u00f3re brakuj\u0105ce funkcje. +Commands.XPBar.DisableAll=&6 Wszystkie paski mcMMO XP s\u0105 teraz wy\u0142\u0105czone, u\u017cyj /mmoxpbar reset, aby przywr\u00f3ci\u0107 ustawienia domy\u015blne. +#Modern Chat Settings +Chat.Style.Admin=&b(A) &r{0} &b\u2192 &r{1} +Chat.Style.Party=&a(P) &r{0} &a\u2192 &r{1} +Chat.Style.Party.Leader=&a(P) &r{0} &6\u2192 &r{1} +Chat.Identity.Console=&6* Konsola * +Chat.Channel.On=&6(&amcMMO-Chat&6) &eTwoje wiadomo\u015bci czatu b\u0119d\u0105 teraz automatycznie dostarczane do kana\u0142u &a{0}&e. +Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Twoje wiadomo\u015bci na czacie nie b\u0119d\u0105 ju\u017c automatycznie dostarczane do okre\u015blonych kana\u0142\u00f3w czatu. +Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1} +Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom &a{1}&7 w &3{2}&7! +Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 osi\u0105gn\u0105\u0142 poziom mocy &a{1}&7! +Scoreboard.Recovery=Pr\u00f3ba odzyskania tablicy wynik\u00f3w mcMMO... From 0636f578ddeebf12ff1019dfc5b2b4edd13f2d34 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 7 Apr 2021 16:16:04 -0700 Subject: [PATCH 30/30] Update changelog --- Changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.txt b/Changelog.txt index 214066e89..14423b85a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,6 @@ Version 2.1.189 Removed UP warning + Updated pl locale (Thanks Mich3l3k) NOTES: Ultra Permissions is SAFE to use with mcMMO