1
0
mirror of https://github.com/mcMMO-Dev/mcMMO.git synced 2026-02-18 17:53:00 +01:00

Compare commits

..

43 Commits

Author SHA1 Message Date
TfT_02
b791649432 Also include the end value! 2014-06-09 18:22:40 +02:00
TfT_02
306ac5d949 Add debug messages 2014-06-09 17:21:06 +02:00
TfT_02
fb75eac1f7 Minor cleanup 2014-06-09 17:20:55 +02:00
TfT_02
44a4448527 Add support for data value ranges in blocks.yml
For example `Block_1|0-5`
2014-06-09 13:43:34 +02:00
TfT_02
001ea19b1c Update pom.xml and changelog 2014-06-09 00:07:34 +02:00
TfT_02
3f347091c4 Update changelog 2014-06-09 00:05:06 +02:00
TfT_02
f4dbbd7e57 Fix an IndexOutOfBoundsException: Index: 0
In SaveTimerTask.java

Fixes #2039
2014-06-09 00:05:05 +02:00
TfT_02
e4d3cb5f4d Remove PvpLogger checks
No longer needed when testing with Combat Tag v6.1.4, the NPCs have
metadata „NPC”.

Fixes #2017
2014-06-09 00:05:05 +02:00
riking
e455b41ab9 Save users asynchronously 2014-06-09 00:05:05 +02:00
TfT_02
ea704a87db Remove this check here, allows Salvage in Adv mode
We’re already checking if the players game mode isn’t CREATIVE, so we
can safely remove this check.

Fixes #2059
2014-06-09 00:05:04 +02:00
TfT_02
813d9049c2 Added missing Salvage permissions to plugin.yml 2014-06-09 00:05:04 +02:00
TfT_02
67314e1320 Actually fix maximumQuantity reading from config
Now we try to automatically detect the maximum quantity if possible and
fall back to the config if the user has set a value there.

Also fixed the feedback message which said „Minimum quantity” instead
of „Maximum quantity”
2014-06-09 00:05:04 +02:00
TfT_02
0e6611c7e9 Check permission before sending anvil messages 2014-06-09 00:05:04 +02:00
TfT_02
7d82d5ff7b Let config key take priority here 2014-06-09 00:05:04 +02:00
TfT_02
eb51081a66 Cleanup RepairConfig leftovers in SalvageConfig
Some copy/pasta I forgot to remove
2014-06-09 00:05:03 +02:00
TfT_02
00c89d2cf6 Fix Maximum Quantity in Salvage configs 2014-06-09 00:05:03 +02:00
TfT_02
d88afaf696 Don't display child skills on scoreboards
This fixes an issue where the scoreboard would not display properly
when using /mcstats or /inspect.

Fixes #2037
2014-06-09 00:05:01 +02:00
TfT_02
c6be608e5e Add SALVAGE to MISC_SKILLS List 2014-06-09 00:03:34 +02:00
TfT_02
9def3d5eb4 Add changelog entry for Salvage child skill
Closes #561
2014-06-09 00:03:34 +02:00
TfT_02
a052bfda7e Minor cleanup of imports 2014-06-09 00:03:33 +02:00
TfT_02
c35c3c0dab A whole bunch of more work to convert Salvage to a child skill 2014-06-09 00:03:32 +02:00
GJ
23f5946cac Convert Salvage to a child skill. 2014-06-09 00:03:30 +02:00
TfT_02
813eeb8873 Fix a NPE when tab completing with /ptp
Fixes #2013
2014-06-09 00:03:29 +02:00
TfT_02
8e60403fc1 Fix a bunch of small formatting issues 2014-06-09 00:03:23 +02:00
Sean Porter
23b4ff7134 Redstone ore now throws events when it flips on or off.
Fixes issue #2021
2014-06-09 00:02:49 +02:00
TfT_02
b16dec4532 Added API to check if an entity is bleeding 2014-06-09 00:02:49 +02:00
TfT_02
271ba2e5f1 Use getAllyName() here instead 2014-06-09 00:02:48 +02:00
TfT_02
c9ab2bebd6 Add option to prevent hopper transfers of bottles 2014-06-09 00:02:48 +02:00
TfT_02
ef4bbca36a Update README.md 2014-06-09 00:02:47 +02:00
TfT_02
ad789ea2bf Fix /party teleport command
Why did we use getCommand("ptp").getExecutor() again?

Fixes #1995
2014-06-09 00:02:47 +02:00
TfT_02
b848968094 Added API to XP events to get XP gain reason 2014-06-09 00:01:24 +02:00
Sean Porter
c572054e67 Fix the calculations for Iron Arm Style in the Unarmed command. 2014-06-09 00:00:36 +02:00
TfT_02
2e6a43ac97 Fix bug where dodge would check the wrong player 2014-06-09 00:00:35 +02:00
TfT_02
837e59d187 Check if player has a mcMMOPlayer object
Fixes #1976
2014-06-09 00:00:34 +02:00
TfT_02
7f7aa9e799 Prevent accidentally breaking regrown crops
Adds #828
2014-06-09 00:00:34 +02:00
TfT_02
10c18de9bf Added option to open /mcstats after logging in
Added #1033
2014-06-09 00:00:34 +02:00
TfT_02
0b92023937 Players need to be in a party to use /ptp
Fixes #1967
2014-06-09 00:00:33 +02:00
TfT_02
04f02ca7f4 Support MATERIAL|data format in treasures.yml
Allows users to use the same material type for multiple treasures in
treasures.yml

Fixes #1965
2014-06-09 00:00:33 +02:00
TfT_02
d701553efe Check event.getBow() != null
Fixes #1933
2014-06-09 00:00:32 +02:00
TfT_02
e812a949db Vanished players no longer get hit by AoE effects
Fixes #1964
2014-06-09 00:00:32 +02:00
TfT_02
f88dd29926 Updater should not be running on the main thread
Fixes #1957
2014-06-09 00:00:26 +02:00
TfT_02
c588708056 Move PlayerUpdateInventoryTask to runnables.player 2014-06-08 23:59:52 +02:00
TfT_02
a9f800ac68 Add option to drop extra fish
Allows enabling of old fishing mechanic where fish was always caught,
even when a treasure was found
2014-06-08 23:59:20 +02:00
51 changed files with 527 additions and 643 deletions

View File

@@ -7,7 +7,7 @@ Key:
! Change
- Removal
Version 1.5.01-dev
Version 1.4.09-dev
+ Added new child skill; Salvage
+ Added new feature to Herbalism. Instantly-regrown crops are protected from being broken for 1 second
+ Added option to config.yml to show the /mcstats scoreboard automatically after logging in
@@ -24,23 +24,8 @@ Version 1.5.01-dev
! Changed player data saving. Save tasks are now asynchronous
! Vanished players no longer get hit by AoE effects
! Changed Alchemy config option 'Prevent_Hopper_Transfer' renamed to 'Prevent_Hopper_Transfer_Ingredients'
! Changed Alchemy XP distribution. XP is granted based on the stage of the potion.
- Removed salvage ability from Repair, salvage has it's own (child) skill now
Version 1.5.00
+ Added Podzol & Red Sand to Excavation
+ Added Hardened Clay, Stained Clay, and Packed Ice to Mining blocks
+ Added Acacia and Dark Oak to Woodcutting blocks
+ Added Salmon, Clownfish, and Pufferfish to Fishing XP
+ Added new flowers and grasses to Herbalism XP
+ Added option to config.yml which allows players to always catch fish, even when a treasure is found
+ Added option to config.yml to override vanilla Minecraft treasures
! Fishing XP now depends on the type of fish.
! Woodcutting XP in experience.yml and Woodcutting double drops in config.yml now use the tree species names. Oak is now Generic, and Spruce is now Redwood.
! Red_Rose was replaced by Poppy, and so the key in experience.yml has been updated accordingly.
- Removed deprecated permission nodes
- Removed "Treasure found!" message
Version 1.4.08
+ Added a new skill; Alchemy. Special thanks to EasyMFnE for creating this!
+ Added SecondaryAbilityType enum, and new SecondaryAbilityWeightedActivationCheckEvent, fired when a secondary ability checkes its activation chances

View File

@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId>
<version>1.5.01-SNAPSHOT</version>
<version>1.4.09-SNAPSHOT</version>
<name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url>
<issueManagement>
@@ -121,7 +121,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>LATEST</version>
<version>1.6.4-R2.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.block.Biome;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
@@ -97,7 +98,9 @@ public class FishingCommand extends SkillCommand {
location = player.getLocation();
}
if (Fishing.masterAnglerBiomes.contains(location.getBlock().getBiome())) {
Biome biome = location.getBlock().getBiome();
if (biome == Biome.RIVER || biome == Biome.OCEAN) {
rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier();
}

View File

@@ -5,7 +5,6 @@ import java.util.List;
import java.util.Set;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
@@ -453,7 +452,6 @@ public class Config extends AutoUpdateConfigLoader {
/* Fishing */
public boolean getFishingDropsEnabled() { return config.getBoolean("Skills.Fishing.Drops_Enabled", true); }
public boolean getFishingOverrideTreasures() { return config.getBoolean("Skills.Fishing.Override_Vanilla_Treasures", true); }
public boolean getFishingExtraFish() { return config.getBoolean("Skills.Fishing.Extra_Fish", true); }
/* Mining */
@@ -483,7 +481,10 @@ public class Config extends AutoUpdateConfigLoader {
public double getTamingCOTWRange() { return config.getDouble("Skills.Taming.Call_Of_The_Wild.Range", 40.0D); }
/* Woodcutting */
public boolean getWoodcuttingDoubleDropsEnabled(TreeSpecies species) { return config.getBoolean("Double_Drops.Woodcutting." + StringUtils.getPrettyTreeSpeciesString(species).replace(" ", "_")); }
public boolean getOakDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Oak", true); }
public boolean getBirchDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Birch", true); }
public boolean getSpruceDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Spruce", true); }
public boolean getJungleDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Jungle", true); }
public boolean getTreeFellerSoundsEnabled() { return config.getBoolean("Skills.Woodcutting.Tree_Feller_Sounds", true); }
/* AFK Leveling */

View File

@@ -4,16 +4,12 @@ import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
import org.bukkit.entity.EntityType;
import org.bukkit.material.LongGrass;
import org.bukkit.material.MaterialData;
import com.gmail.nossr50.config.AutoUpdateConfigLoader;
import com.gmail.nossr50.datatypes.experience.FormulaType;
import com.gmail.nossr50.datatypes.skills.MaterialType;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
import com.gmail.nossr50.util.StringUtils;
public class ExperienceConfig extends AutoUpdateConfigLoader {
@@ -81,10 +77,8 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
*/
/* Alchemy */
for (PotionStage potionStage : PotionStage.values()) {
if (getPotionXP(potionStage) < 0) {
reason.add("Experience.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!");
}
if (getPotionXP() <= 0) {
reason.add("Experience.Alchemy.Potion should be greater than 0!");
}
/* Combat XP Multipliers */
@@ -109,7 +103,9 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
}
/* Fishing */
// TODO: Add validation for each fish type once enum is available.
if (getFishingBaseXP() <= 0) {
reason.add("Experience.Fishing.Base should be greater than 0!");
}
if (getFishingShakeXP() <= 0) {
reason.add("Experience.Fishing.Shake should be greater than 0!");
@@ -130,12 +126,20 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
}
/* Woodcutting */
for (TreeSpecies species : TreeSpecies.values()) {
String key = "Experience.Woodcutting." + StringUtils.getPrettyTreeSpeciesString(species).replace(" ", "_");
if (getWoodcuttingXPOak() <= 0) {
reason.add("Experience.Woodcutting.Oak should be greater than 0!");
}
if (config.getInt(key) <= 0) {
reason.add(key + " should be greater than 0!");
}
if (getWoodcuttingXPBirch() <= 0) {
reason.add("Experience.Woodcutting.Birch should be greater than 0!");
}
if (getWoodcuttingXPSpruce() <= 0) {
reason.add("Experience.Woodcutting.Spruce should be greater than 0!");
}
if (getWoodcuttingXPJungle() <= 0) {
reason.add("Experience.Woodcutting.Jungle should be greater than 0!");
}
if (getWoodcuttingXPHugeBrownMushroom() <= 0) {
@@ -204,111 +208,12 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
public double getFeatherFallXPModifier() { return config.getDouble("Experience.Acrobatics.FeatherFall_Multiplier", 2.0); }
/* Alchemy */
public double getPotionXP(PotionStage stage) { return config.getDouble("Experience.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); }
public double getPotionXP() { return config.getDouble("Experience.Alchemy.Potion", 150D); }
/* Fishing */
public int getFishXp(MaterialData data) {
switch (data.getData()) {
case 0x0:
return config.getInt("Experience.Fishing.Raw_Fish", 800);
case 0x1:
return config.getInt("Experience.Fishing.Raw_Salmon", 800);
case 0x2:
return config.getInt("Experience.Fishing.Clownfish", 800);
case 0x3:
return config.getInt("Experience.Fishing.Pufferfish", 800);
default:
return 0;
}
}
public int getFishingBaseXP() { return config.getInt("Experience.Fishing.Base", 800); }
public int getFishingShakeXP() { return config.getInt("Experience.Fishing.Shake", 50); }
/* Herbalism */
public int getFlowerAndGrassXp(MaterialData data) {
Material type = data.getItemType();
if (type == Material.RED_ROSE) {
switch (data.getData()) {
case 0x0:
return config.getInt("Experience.Herbalism.Poppy", 100);
case 0x1:
return config.getInt("Experience.Herbalism.Blue_Orchid", 150);
case 0x2:
return config.getInt("Experience.Herbalism.Allium", 300);
case 0x3:
return config.getInt("Experience.Herbalism.Azure_Bluet", 150);
case 0x4:
return config.getInt("Experience.Herbalism.Red_Tulip", 150);
case 0x5:
return config.getInt("Experience.Herbalism.Orange_Tulip", 150);
case 0x6:
return config.getInt("Experience.Herbalism.White_Tulip", 150);
case 0x7:
return config.getInt("Experience.Herbalism.Pink_Tulip", 150);
case 0x8:
return config.getInt("Experience.Herbalism.Oxeye_Daisy", 150);
default:
return 0;
}
}
else if (type == Material.LONG_GRASS) {
switch (((LongGrass) data).getSpecies()) {
case DEAD:
return config.getInt("Experience.Herbalism.Dead_Bush", 30);
case FERN_LIKE:
return config.getInt("Experience.Herbalism.Small_Fern", 10);
case NORMAL:
return config.getInt("Experience.Herbalism.Small_Grass", 10);
default:
return 0;
}
}
else if (type == Material.DOUBLE_PLANT) {
switch (data.getData()) {
case 0x0:
return config.getInt("Experience.Herbalism.Sunflower", 50);
case 0x1:
return config.getInt("Experience.Herbalism.Lilac", 50);
case 0x2:
return config.getInt("Experience.Herbalism.Tall_Grass", 50);
case 0x3:
return config.getInt("Experience.Herbalism.Tall_Fern", 50);
case 0x4:
return config.getInt("Experience.Herbalism.Rose_Bush", 50);
case 0x5:
return config.getInt("Experience.Herbalism.Peony", 50);
default:
return 0;
}
}
return 0;
}
/* Repair */
public double getRepairXPBase() { return config.getDouble("Experience.Repair.Base", 1000.0); }
public double getRepairXP(MaterialType repairMaterialType) { return config.getDouble("Experience.Repair." + StringUtils.getCapitalized(repairMaterialType.toString())); }
@@ -319,7 +224,10 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
public int getTamingXPOcelot() { return config.getInt("Experience.Taming.Animal_Taming.Ocelot", 500); }
/* Woodcutting */
public int getWoodcuttingTreeXP(TreeSpecies species) { return config.getInt("Experience.Woodcutting." + StringUtils.getPrettyTreeSpeciesString(species).replace(" ", "_")); }
public int getWoodcuttingXPOak() { return config.getInt("Experience.Woodcutting.Oak", 70); }
public int getWoodcuttingXPBirch() { return config.getInt("Experience.Woodcutting.Birch", 90); }
public int getWoodcuttingXPSpruce() { return config.getInt("Experience.Woodcutting.Spruce", 80); }
public int getWoodcuttingXPJungle() { return config.getInt("Experience.Woodcutting.Jungle", 100); }
public int getWoodcuttingXPHugeBrownMushroom() { return config.getInt("Experience.Woodcutting.Huge_Mushroom_Brown", 70); }
public int getWoodcuttingXPHugeRedMushroom() { return config.getInt("Experience.Woodcutting.Huge_Mushroom_Red", 70); }
}

View File

@@ -68,39 +68,61 @@ public class CustomBlockConfig extends ConfigLoader {
Material blockMaterial = Material.matchMaterial(blockInfo[0]);
if (blockMaterial == null) {
plugin.getLogger().warning("Invalid material name. This item will be skipped. - " + blockInfo[0]);
plugin.getLogger().warning("Invalid material name. [" + blockInfo[0] + "] This item will be skipped. - " + blockName);
continue;
}
if (blockInfo.length == 2) {
String[] dataInfo = blockInfo[1].split("[-]");
if (dataInfo.length == 2) {
byte startData = Byte.valueOf(dataInfo[0]);
byte endData = Byte.valueOf(dataInfo[1]);
System.out.println(blockName + " Data range; [" + startData + " - " + endData + "]");
for (byte blockData = startData; blockData <= endData; blockData++) {
MaterialData blockMaterialData = new MaterialData(blockMaterial, blockData);
loadBlock(skillType, blockList, blockName, blockMaterialData);
}
return;
}
}
byte blockData = (blockInfo.length == 2) ? Byte.valueOf(blockInfo[1]) : 0;
MaterialData blockMaterialData = new MaterialData(blockMaterial, blockData);
if (blockList != null) {
blockList.add(blockMaterialData);
}
if (skillType.equals("Ability_Blocks")) {
continue;
}
int xp = config.getInt(skillType + "." + blockName + ".XP_Gain");
int smeltingXp = 0;
if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) {
customOres.add(blockMaterialData);
smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10);
}
else if (skillType.equals("Woodcutting")) {
if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) {
customLogs.add(blockMaterialData);
}
else {
customLeaves.add(blockMaterialData);
xp = 0; // Leaves don't grant XP
}
}
customBlockMap.put(blockMaterialData, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled"), smeltingXp));
loadBlock(skillType, blockList, blockName, blockMaterialData);
}
}
private void loadBlock(String skillType, List<MaterialData> blockList, String blockName, MaterialData blockMaterialData) {
System.out.println("Loading block: " + blockMaterialData.getItemType() + " " + blockMaterialData.getData());
if (blockList != null) {
blockList.add(blockMaterialData);
}
if (skillType.equals("Ability_Blocks")) {
return;
}
int xp = config.getInt(skillType + "." + blockName + ".XP_Gain");
int smeltingXp = 0;
if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) {
customOres.add(blockMaterialData);
smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10);
}
else if (skillType.equals("Woodcutting")) {
if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) {
customLogs.add(blockMaterialData);
}
else {
customLeaves.add(blockMaterialData);
xp = 0; // Leaves don't grant XP
}
}
customBlockMap.put(blockMaterialData, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled"), smeltingXp));
}
}

View File

@@ -35,8 +35,6 @@ public class TreasureConfig extends ConfigLoader {
public List<ExcavationTreasure> excavationFromMycel = new ArrayList<ExcavationTreasure>();
public List<ExcavationTreasure> excavationFromSoulSand = new ArrayList<ExcavationTreasure>();
public List<ExcavationTreasure> excavationFromSnow = new ArrayList<ExcavationTreasure>();
public List<ExcavationTreasure> excavationFromRedSand = new ArrayList<ExcavationTreasure>();
public List<ExcavationTreasure> excavationFromPodzol = new ArrayList<ExcavationTreasure>();
public List<HylianTreasure> hylianFromBushes = new ArrayList<HylianTreasure>();
public List<HylianTreasure> hylianFromFlowers = new ArrayList<HylianTreasure>();
@@ -376,14 +374,6 @@ public class TreasureConfig extends ConfigLoader {
if (dropList.contains("Snow")) {
excavationFromSnow.add(excavationTreasure);
}
if (dropList.contains("Red_Sand")) {
excavationFromRedSand.add(excavationTreasure);
}
if (dropList.contains("Podzol")) {
excavationFromPodzol.add(excavationTreasure);
}
}
else if (isHylian) {
HylianTreasure hylianTreasure = new HylianTreasure(item, xp, dropChance, dropLevel);

View File

@@ -1,70 +0,0 @@
package com.gmail.nossr50.datatypes.skills.alchemy;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.Potion;
public enum PotionStage {
FIVE(5),
FOUR(4),
THREE(3),
TWO(2),
ONE(1);
int numerical;
private PotionStage(int numerical) {
this.numerical = numerical;
}
public int toNumerical() {
return numerical;
}
private static PotionStage getPotionStageNumerical(int numerical) {
for (PotionStage potionStage : values()) {
if (numerical >= potionStage.toNumerical()) {
return potionStage;
}
}
return ONE;
}
public static PotionStage getPotionStage(AlchemyPotion input, AlchemyPotion output) {
PotionStage potionStage = getPotionStage(output);
if (getPotionStage(input) == potionStage) {
potionStage = PotionStage.FIVE;
}
return potionStage;
}
public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) {
Potion potion = Potion.fromItemStack(new ItemStack(Material.POTION, 1, alchemyPotion.getDataValue()));
int stage = 1;
// Check if potion isn't awkward or mundane
if (potion.getType() != null) {
stage++;
}
// Check if potion has a glowstone dust amplifier
if (potion.getLevel() > 1) {
stage++;
}
// Check if potion has a redstone dust amplifier
if (potion.hasExtendedDuration()) {
stage++;
}
// Check if potion has a gunpowder amplifier
if (potion.isSplash()) {
stage++;
}
return PotionStage.getPotionStageNumerical(stage);
}
}

View File

@@ -37,7 +37,6 @@ import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.projectiles.ProjectileSource;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.AdvancedConfig;
@@ -177,11 +176,7 @@ public class EntityListener implements Listener {
}
if (attacker instanceof Projectile) {
ProjectileSource projectileSource = ((Projectile) attacker).getShooter();
if (projectileSource instanceof LivingEntity) {
attacker = (LivingEntity) projectileSource;
}
attacker = ((Projectile) attacker).getShooter();
}
else if (attacker instanceof Tameable) {
AnimalTamer animalTamer = ((Tameable) attacker).getOwner();

View File

@@ -24,7 +24,6 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerStatisticIncrementEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack;
@@ -226,13 +225,6 @@ public class PlayerListener implements Listener {
return;
case CAUGHT_FISH:
//TODO Update to new API once available! Waiting for case CAUGHT_TREASURE:
Item fishingCatch = (Item) event.getCaught();
if (Config.getInstance().getFishingOverrideTreasures() && fishingCatch.getItemStack().getType() != Material.RAW_FISH) {
fishingCatch.setItemStack(new ItemStack(Material.RAW_FISH, 1));
}
if (Permissions.vanillaXpBoost(player, SkillType.FISHING)) {
event.setExpToDrop(fishingManager.handleVanillaXpBoost(event.getExpToDrop()));
}
@@ -702,13 +694,4 @@ public class PlayerListener implements Listener {
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) {
if (!mcMMO.getHolidayManager().isAprilFirst()) {
return;
}
mcMMO.getHolidayManager().handleStatisticEvent(event);
}
}

View File

@@ -2,7 +2,6 @@ package com.gmail.nossr50.runnables.skills;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@@ -20,7 +19,6 @@ public class AprilTask extends BukkitRunnable {
}
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
int random = Misc.getRandom().nextInt(40) + 11;
int betterRandom = Misc.getRandom().nextInt(2000);
if (betterRandom == 0) {
player.playSound(player.getLocation(), Sound.LEVEL_UP, Misc.LEVELUP_VOLUME, Misc.LEVELUP_PITCH);
@@ -28,9 +26,10 @@ public class AprilTask extends BukkitRunnable {
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));
for (HolidayManager.FakeSkillType fakeSkillType : HolidayManager.FakeSkillType.values()) {
int random = Misc.getRandom().nextInt(250);
if (random == 0) {
mcMMO.getHolidayManager().levelUpApril(player, fakeSkillType);
break;
}
}

View File

@@ -9,7 +9,6 @@ import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.XPGainReason;
import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.StringUtils;
@@ -65,7 +64,7 @@ public class AlchemyManager extends SkillManager {
return Math.min(Alchemy.catalysisMaxSpeed, Alchemy.catalysisMinSpeed + (Alchemy.catalysisMaxSpeed - Alchemy.catalysisMinSpeed) * (skillLevel - Alchemy.catalysisUnlockLevel) / (Alchemy.catalysisMaxBonusLevel - Alchemy.catalysisUnlockLevel)) * (isLucky ? LUCKY_MODIFIER : 1.0);
}
public void handlePotionBrewSuccesses(PotionStage potionStage, int amount) {
applyXpGain((float) (ExperienceConfig.getInstance().getPotionXP(potionStage) * amount), XPGainReason.PVE);
public void handlePotionBrewSuccesses(int amount) {
applyXpGain((float) (ExperienceConfig.getInstance().getPotionXP() * amount), XPGainReason.PVE);
}
}

View File

@@ -17,7 +17,6 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion;
import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage;
import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask;
import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask;
import com.gmail.nossr50.util.Permissions;
@@ -115,8 +114,7 @@ public final class AlchemyPotionBrewer {
inventory.setItem(i, output.toItemStack(item.getAmount()).clone());
if (player != null) {
PotionStage potionStage = PotionStage.getPotionStage(input, output);
UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(potionStage, 1);
UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(1);
}
}
}

View File

@@ -21,13 +21,13 @@ public class Excavation {
protected static List<ExcavationTreasure> getTreasures(BlockState blockState) {
switch (blockState.getType()) {
case DIRT:
return blockState.getRawData() == 0x2 ? TreasureConfig.getInstance().excavationFromPodzol : TreasureConfig.getInstance().excavationFromDirt;
return TreasureConfig.getInstance().excavationFromDirt;
case GRASS:
return TreasureConfig.getInstance().excavationFromGrass;
case SAND:
return blockState.getRawData() == 0x1 ? TreasureConfig.getInstance().excavationFromRedSand : TreasureConfig.getInstance().excavationFromSand;
return TreasureConfig.getInstance().excavationFromSand;
case GRAVEL:
return TreasureConfig.getInstance().excavationFromGravel;

View File

@@ -1,12 +1,9 @@
package com.gmail.nossr50.skills.fishing;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
@@ -57,13 +54,6 @@ public final class Fishing {
public static int fishermansDietRankLevel2 = fishermansDietRankLevel1 * 2;
public static int fishermansDietMaxLevel = fishermansDietRankLevel1 * 5;
public static Set<Biome> masterAnglerBiomes = EnumSet.of(Biome.RIVER, Biome.OCEAN, Biome.DEEP_OCEAN);
public static Set<Biome> iceFishingBiomes = EnumSet.of(
Biome.FROZEN_OCEAN, Biome.FROZEN_RIVER,
Biome.TAIGA, Biome.TAIGA_HILLS, Biome.TAIGA_MOUNTAINS,
Biome.ICE_PLAINS, Biome.ICE_MOUNTAINS, Biome.ICE_PLAINS_SPIKES,
Biome.COLD_TAIGA, Biome.COLD_TAIGA_HILLS, Biome.COLD_TAIGA_MOUNTAINS);
private Fishing() {}
/**

View File

@@ -12,6 +12,7 @@ import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.WeatherType;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.enchantments.Enchantment;
@@ -198,7 +199,10 @@ public class FishingManager extends SkillManager {
}
// Make sure this is a body of water, not just a block of ice.
if (!Fishing.iceFishingBiomes.contains(block.getBiome()) && (block.getRelative(BlockFace.DOWN, 3).getType() != Material.STATIONARY_WATER)) {
Biome biome = block.getBiome();
boolean isFrozenBiome = (biome == Biome.FROZEN_OCEAN || biome == Biome.FROZEN_RIVER || biome == Biome.TAIGA || biome == Biome.TAIGA_HILLS || biome == Biome.ICE_PLAINS || biome == Biome.ICE_MOUNTAINS);
if (!isFrozenBiome && (block.getRelative(BlockFace.DOWN, 3).getType() != Material.STATIONARY_WATER)) {
return false;
}
@@ -278,11 +282,12 @@ public class FishingManager extends SkillManager {
public void masterAngler(Fish hook) {
Player player = getPlayer();
Location location = hook.getLocation();
Biome biome = location.getBlock().getBiome();
double biteChance = hook.getBiteChance();
hookLocation = location;
if (Fishing.masterAnglerBiomes.contains(location.getBlock().getBiome())) {
if (biome == Biome.RIVER || biome == Biome.OCEAN) {
biteChance = biteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier();
}
@@ -300,7 +305,6 @@ public class FishingManager extends SkillManager {
*/
public void handleFishing(Item fishingCatch) {
this.fishingCatch = fishingCatch;
int fishXp = ExperienceConfig.getInstance().getFishXp(fishingCatch.getItemStack().getData());
int treasureXp = 0;
Player player = getPlayer();
FishingTreasure treasure = null;
@@ -311,6 +315,8 @@ public class FishingManager extends SkillManager {
}
if (treasure != null) {
player.sendMessage(LocaleLoader.getString("Fishing.Ability.TH.ItemFound"));
ItemStack treasureDrop = treasure.getDrop().clone(); // Not cloning is bad, m'kay?
Map<Enchantment, Integer> enchants = new HashMap<Enchantment, Integer>();
@@ -350,7 +356,7 @@ public class FishingManager extends SkillManager {
}
}
applyXpGain(fishXp + treasureXp, XPGainReason.PVE);
applyXpGain(ExperienceConfig.getInstance().getFishingBaseXP() + treasureXp, XPGainReason.PVE);
}
/**
@@ -449,8 +455,6 @@ public class FishingManager extends SkillManager {
*/
private FishingTreasure getFishingTreasure() {
double diceRoll = Misc.getRandom().nextDouble() * 100;
diceRoll -= getPlayer().getItemInHand().getEnchantmentLevel(Enchantment.LUCK);
FishingTreasure treasure = null;
for (Rarity rarity : Rarity.values()) {

View File

@@ -148,12 +148,7 @@ public class HerbalismManager extends SkillManager {
processGreenThumbPlants(blockState, greenTerra);
}
if (material == Material.DOUBLE_PLANT || material == Material.RED_ROSE || material == Material.LONG_GRASS) {
xp = ExperienceConfig.getInstance().getFlowerAndGrassXp(blockState.getData());
}
else {
xp = ExperienceConfig.getInstance().getXp(skill, material);
}
xp = ExperienceConfig.getInstance().getXp(skill, material);
if (Config.getInstance().getDoubleDropsEnabled(skill, material) && Permissions.secondaryAbilityEnabled(player, SecondaryAbility.HERBALISM_DOUBLE_DROPS)) {
drops = blockState.getBlock().getDrops();

View File

@@ -39,13 +39,11 @@ public class Mining {
switch (blockType) {
case ENDER_STONE:
case GOLD_ORE:
case HARD_CLAY:
case IRON_ORE:
case MOSSY_COBBLESTONE:
case NETHERRACK:
case OBSIDIAN:
case SANDSTONE:
case STAINED_CLAY:
handleMiningDrops(blockState);
return;
@@ -57,13 +55,12 @@ public class Mining {
case COAL_ORE:
case DIAMOND_ORE:
case EMERALD_ORE:
case REDSTONE_ORE:
case GLOWSTONE:
case LAPIS_ORE:
case PACKED_ICE:
case QUARTZ_ORE:
case REDSTONE_ORE:
case STONE:
case EMERALD_ORE:
case QUARTZ_ORE:
Misc.dropItem(blockState.getLocation(), new ItemStack(blockType));
return;
@@ -85,20 +82,17 @@ public class Mining {
case COAL_ORE:
case DIAMOND_ORE:
case EMERALD_ORE:
case ENDER_STONE:
case GLOWSTONE:
case GOLD_ORE:
case HARD_CLAY:
case IRON_ORE:
case LAPIS_ORE:
case STONE:
case ENDER_STONE:
case GOLD_ORE:
case IRON_ORE:
case MOSSY_COBBLESTONE:
case NETHERRACK:
case OBSIDIAN:
case PACKED_ICE:
case REDSTONE_ORE:
case SANDSTONE:
case STAINED_CLAY:
case STONE:
case QUARTZ_ORE:
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
return;

View File

@@ -5,7 +5,6 @@ import java.util.List;
import java.util.Set;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.inventory.ItemStack;
@@ -56,19 +55,28 @@ public final class Woodcutting {
return mcMMO.getModManager().getBlock(blockState).getXpGain();
}
//TODO Remove this workaround when casting to Tree works again
TreeSpecies species = TreeSpecies.GENERIC;
if (blockState.getData() instanceof Tree) {
species = ((Tree) blockState.getData()).getSpecies();
switch (((Tree) blockState.getData()).getSpecies()) {
case GENERIC:
return ExperienceConfig.getInstance().getWoodcuttingXPOak();
case REDWOOD:
return ExperienceConfig.getInstance().getWoodcuttingXPSpruce();
case BIRCH:
return ExperienceConfig.getInstance().getWoodcuttingXPBirch();
case JUNGLE:
int xp = ExperienceConfig.getInstance().getWoodcuttingXPJungle();
if (experienceGainMethod == ExperienceGainMethod.TREE_FELLER) {
xp *= 0.5;
}
return xp;
default:
return 0;
}
int xp = ExperienceConfig.getInstance().getWoodcuttingTreeXP(species);
if (species == TreeSpecies.JUNGLE && experienceGainMethod == ExperienceGainMethod.TREE_FELLER) {
xp *= 0.5;
}
return xp;
}
/**
@@ -81,14 +89,33 @@ public final class Woodcutting {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
}
else {
//TODO Remove this workaround when casting to Tree works again
TreeSpecies species = TreeSpecies.GENERIC;
if (blockState.getData() instanceof Tree) {
species = ((Tree) blockState.getData()).getSpecies();
}
switch (((Tree) blockState.getData()).getSpecies()) {
case GENERIC:
if (Config.getInstance().getOakDoubleDropsEnabled()) {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
}
return;
if (Config.getInstance().getWoodcuttingDoubleDropsEnabled(species)) {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
case REDWOOD:
if (Config.getInstance().getSpruceDoubleDropsEnabled()) {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
}
return;
case BIRCH:
if (Config.getInstance().getBirchDoubleDropsEnabled()) {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
}
return;
case JUNGLE:
if (Config.getInstance().getJungleDoubleDropsEnabled()) {
Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
}
return;
default:
return;
}
}
}

View File

@@ -141,15 +141,11 @@ public class WoodcuttingManager extends SkillManager {
Misc.dropItems(blockState.getLocation(), block.getDrops());
}
else {
//TODO Remove this workaround when casting to Tree works again
if (blockState.getData() instanceof Tree) {
Tree tree = (Tree) blockState.getData();
tree.setDirection(BlockFace.UP);
}
Tree tree = (Tree) blockState.getData();
tree.setDirection(BlockFace.UP);
switch (material) {
case LOG:
case LOG_2:
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
@@ -158,7 +154,6 @@ public class WoodcuttingManager extends SkillManager {
break;
case LEAVES:
case LEAVES_2:
Misc.dropItems(blockState.getLocation(), block.getDrops());
break;

View File

@@ -113,9 +113,7 @@ public final class BlockUtils {
switch (blockState.getType()) {
case BROWN_MUSHROOM:
case CACTUS:
case DOUBLE_PLANT:
case MELON_BLOCK:
case LONG_GRASS:
case PUMPKIN:
case RED_MUSHROOM:
case RED_ROSE:
@@ -153,13 +151,10 @@ public final class BlockUtils {
switch (blockState.getType()) {
case ENDER_STONE:
case GLOWSTONE:
case HARD_CLAY:
case MOSSY_COBBLESTONE:
case NETHERRACK:
case OBSIDIAN:
case PACKED_ICE:
case SANDSTONE:
case STAINED_CLAY:
case STONE:
return true;
@@ -201,7 +196,6 @@ public final class BlockUtils {
public static boolean isLog(BlockState blockState) {
switch (blockState.getType()) {
case LOG:
case LOG_2:
case HUGE_MUSHROOM_1:
case HUGE_MUSHROOM_2:
return true;
@@ -220,7 +214,6 @@ public final class BlockUtils {
public static boolean isLeaves(BlockState blockState) {
switch (blockState.getType()) {
case LEAVES:
case LEAVES_2:
return true;
default:
@@ -283,7 +276,7 @@ public final class BlockUtils {
* Determine if a given block can be made into Mycelium
*
* @param blockState The {@link BlockState} of the block to check
* @return true if the block can be made into Mycelium, false otherwise
* @return true if the block can be made in Mycelium, false otherwise
*/
public static boolean canMakeShroomy(BlockState blockState) {
switch (blockState.getType()) {

View File

@@ -10,10 +10,8 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.EnumSet;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import org.bukkit.ChatColor;
@@ -22,13 +20,11 @@ import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.Sound;
import org.bukkit.Statistic;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerStatisticIncrementEvent;
import org.bukkit.inventory.meta.FireworkMeta;
import com.gmail.nossr50.mcMMO;
@@ -71,45 +67,8 @@ public final class HolidayManager {
}
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 DIVE_ONE_CM:
return FakeSkillType.DIVING;
case PIG_ONE_CM:
return FakeSkillType.PIGGY;
default:
return FakeSkillType.UNKNOWN;
}
}
}
public final Set<Statistic> movementStatistics = EnumSet.of(
Statistic.WALK_ONE_CM, Statistic.SWIM_ONE_CM, Statistic.FALL_ONE_CM,
Statistic.CLIMB_ONE_CM, Statistic.FLY_ONE_CM, Statistic.DIVE_ONE_CM,
Statistic.PIG_ONE_CM);
static {
List<Color> colors = new ArrayList<Color>();
List<ChatColor> chatColors = new ArrayList<ChatColor>();
@@ -342,40 +301,8 @@ public final class HolidayManager {
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) {
int levelTotal = Misc.getRandom().nextInt(1 + UserManager.getPlayer(player).getSkillLevel(SkillType.MINING)) + 1;
int levelTotal = Misc.getRandom().nextInt(UserManager.getPlayer(player).getSkillLevel(SkillType.MINING)) + 1;
player.playSound(player.getLocation(), Sound.LEVEL_UP, Misc.LEVELUP_VOLUME, Misc.LEVELUP_PITCH);
player.sendMessage(ChatColor.YELLOW + StringUtils.getCapitalized(fakeSkillType.toString()) + " skill increased by 1. Total (" + levelTotal + ")");
ParticleEffectUtils.fireworkParticleShower(player, ALL_COLORS.get(Misc.getRandom().nextInt(ALL_COLORS.size())));

View File

@@ -1,14 +1,12 @@
package com.gmail.nossr50.util;
import org.bukkit.ChatColor;
import org.bukkit.CoalType;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.inventory.FurnaceRecipe;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Coal;
import org.bukkit.material.Dye;
import com.gmail.nossr50.mcMMO;
@@ -588,8 +586,6 @@ public final class ItemUtils {
case PUMPKIN_SEEDS:
case WATER_LILY:
case VINE:
case LONG_GRASS:
case DOUBLE_PLANT:
return true;
case INK_SACK:
@@ -618,6 +614,7 @@ public final class ItemUtils {
case PORK:
case GRILLED_PORK:
case WOOL:
case RED_ROSE: // Not sure we should include this, as it will also trigger from herbalism
case IRON_INGOT:
case SNOW_BALL:
case BLAZE_ROD:
@@ -630,17 +627,12 @@ public final class ItemUtils {
case ARROW:
case SLIME_BALL:
case NETHER_STAR:
case COAL: // Not sure we should include this, as it will also trigger when mining
case ROTTEN_FLESH:
case GOLD_NUGGET:
case EGG:
return true;
case COAL: // Not sure we should include this, as it will also trigger when mining
return (((Coal) item.getData()).getType() == CoalType.COAL);
case RED_ROSE: // Not sure we should include this, as it will also trigger from herbalism
return (item.getData().getData() == 0x0);
default:
return false;
}
@@ -655,9 +647,7 @@ public final class ItemUtils {
public static boolean isWoodcuttingDrop(ItemStack item) {
switch (item.getType()) {
case LOG:
case LOG_2:
case LEAVES:
case LEAVES_2:
case SAPLING:
case APPLE:
return true;

View File

@@ -1,7 +1,6 @@
package com.gmail.nossr50.util;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
import org.bukkit.entity.EntityType;
import com.gmail.nossr50.datatypes.party.PartyFeature;
@@ -31,10 +30,6 @@ public class StringUtils {
return createPrettyEnumString(ability.toString());
}
public static String getPrettyTreeSpeciesString(TreeSpecies species) {
return createPrettyEnumString(species.toString());
}
public static String getPrettySecondaryAbilityString(SecondaryAbility secondaryAbility) {
switch (secondaryAbility) {
case HERBALISM_DOUBLE_DROPS:

View File

@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
@@ -39,21 +40,21 @@ public class ScoreboardManager {
static final String POWER_LEVEL = LocaleLoader.getString("Scoreboard.Misc.PowerLevel");
static final String LABEL_POWER_LEVEL = POWER_LEVEL;
static final String LABEL_LEVEL = LocaleLoader.getString("Scoreboard.Misc.Level");
static final String LABEL_CURRENT_XP = LocaleLoader.getString("Scoreboard.Misc.CurrentXP");
static final String LABEL_REMAINING_XP = LocaleLoader.getString("Scoreboard.Misc.RemainingXP");
static final String LABEL_ABILITY_COOLDOWN = LocaleLoader.getString("Scoreboard.Misc.Cooldown");
static final String LABEL_OVERALL = LocaleLoader.getString("Scoreboard.Misc.Overall");
static final OfflinePlayer LABEL_POWER_LEVEL = getOfflinePlayer(POWER_LEVEL);
static final OfflinePlayer LABEL_LEVEL = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Level"));
static final OfflinePlayer LABEL_CURRENT_XP = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.CurrentXP"));
static final OfflinePlayer LABEL_REMAINING_XP = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.RemainingXP"));
static final OfflinePlayer LABEL_ABILITY_COOLDOWN = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Cooldown"));
static final OfflinePlayer LABEL_OVERALL = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Overall"));
static final Map<SkillType, String> skillLabels;
static final Map<AbilityType, String> abilityLabelsColored;
static final Map<AbilityType, String> abilityLabelsSkill;
static final Map<SkillType, OfflinePlayer> skillLabels;
static final Map<AbilityType, OfflinePlayer> abilityLabelsColored;
static final Map<AbilityType, OfflinePlayer> abilityLabelsSkill;
static {
ImmutableMap.Builder<SkillType, String> skillLabelBuilder = ImmutableMap.builder();
ImmutableMap.Builder<AbilityType, String> abilityLabelBuilder = ImmutableMap.builder();
ImmutableMap.Builder<AbilityType, String> abilityLabelSkillBuilder = ImmutableMap.builder();
ImmutableMap.Builder<SkillType, OfflinePlayer> skillLabelBuilder = ImmutableMap.builder();
ImmutableMap.Builder<AbilityType, OfflinePlayer> abilityLabelBuilder = ImmutableMap.builder();
ImmutableMap.Builder<AbilityType, OfflinePlayer> abilityLabelSkillBuilder = ImmutableMap.builder();
if (Config.getInstance().getScoreboardRainbows()) {
// Everything but black, gray, gold
@@ -77,38 +78,36 @@ public class ScoreboardManager {
int i = 0;
for (SkillType type : SkillType.values()) {
// Include child skills
skillLabelBuilder.put(type, getShortenedName(colors.get(i) + type.getName(), false));
skillLabelBuilder.put(type, getOfflinePlayer(colors.get(i) + type.getName()));
if (type.getAbility() != null) {
abilityLabelBuilder.put(type.getAbility(), getShortenedName(colors.get(i) + type.getAbility().getName()));
abilityLabelBuilder.put(type.getAbility(), getOfflinePlayer(colors.get(i) + type.getAbility().getName()));
if (type == SkillType.MINING) {
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getShortenedName(colors.get(i) + AbilityType.BLAST_MINING.getName()));
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getOfflinePlayer(colors.get(i) + AbilityType.BLAST_MINING.getName()));
}
}
if (++i == colors.size()) {
i = 0;
}
if (++i == colors.size()) i = 0;
}
}
else {
for (SkillType type : SkillType.values()) {
// Include child skills
skillLabelBuilder.put(type, getShortenedName(ChatColor.GREEN + type.getName()));
skillLabelBuilder.put(type, getOfflinePlayer(ChatColor.GREEN + type.getName()));
if (type.getAbility() != null) {
abilityLabelBuilder.put(type.getAbility(), getShortenedName(ChatColor.AQUA + type.getAbility().getName()));
abilityLabelBuilder.put(type.getAbility(), getOfflinePlayerDots(ChatColor.AQUA + type.getAbility().getName()));
if (type == SkillType.MINING) {
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getShortenedName(ChatColor.AQUA + AbilityType.BLAST_MINING.getName()));
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getOfflinePlayerDots(ChatColor.AQUA + AbilityType.BLAST_MINING.getName()));
}
}
}
}
for (AbilityType type : AbilityType.values()) {
abilityLabelSkillBuilder.put(type, getShortenedName((type == AbilityType.BLAST_MINING ? ChatColor.BLUE : ChatColor.AQUA) + type.getName()));
abilityLabelSkillBuilder.put(type, getOfflinePlayerDots((type == AbilityType.BLAST_MINING ? ChatColor.BLUE : ChatColor.AQUA) + type.getName()));
}
skillLabels = skillLabelBuilder.build();
@@ -118,6 +117,22 @@ public class ScoreboardManager {
private static List<String> dirtyPowerLevels = new ArrayList<String>();
private static OfflinePlayer getOfflinePlayer(String name) {
return getOfflinePlayer(name, false);
}
private static OfflinePlayer getOfflinePlayerDots(String name) {
return getOfflinePlayer(name, true);
}
private static OfflinePlayer getOfflinePlayer(String name, boolean useDots) {
if (name.length() > 16) {
name = useDots ? name.substring(0, 14) + ".." : name.substring(0, 16);
}
return mcMMO.p.getServer().getOfflinePlayer(name);
}
public enum SidebarType {
NONE,
SKILL_BOARD,
@@ -127,18 +142,6 @@ public class ScoreboardManager {
TOP_BOARD;
}
private static String getShortenedName(String name) {
return getShortenedName(name, true);
}
private static String getShortenedName(String name, boolean useDots) {
if (name.length() > 16) {
name = useDots ? name.substring(0, 14) + ".." : name.substring(0, 16);
}
return name;
}
// **** Listener call-ins **** //
// Called by PlayerJoinEvent listener
@@ -335,7 +338,7 @@ public class ScoreboardManager {
Player player = mcMMOPlayer.getPlayer();
int power = mcMMOPlayer.getPowerLevel();
mainObjective.getScore(playerName).setScore(power);
mainObjective.getScore(player).setScore(power);
for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) {
wrapper.updatePowerLevel(player, power);
@@ -348,7 +351,7 @@ public class ScoreboardManager {
/**
* Gets or creates the power level objective on the main scoreboard.
* <p/>
* <p>
* If power levels are disabled, the objective is deleted and null is
* returned.
*

View File

@@ -28,6 +28,7 @@ import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType;
import org.apache.commons.lang.Validate;
public class ScoreboardWrapper {
// Initialization variables
public final String playerName;
private final Scoreboard scoreboard;
@@ -58,7 +59,7 @@ public class ScoreboardWrapper {
powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME);
for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers()) {
powerObjective.getScore(mcMMOPlayer.getProfile().getPlayerName()).setScore(mcMMOPlayer.getPowerLevel());
powerObjective.getScore(mcMMOPlayer.getPlayer()).setScore(mcMMOPlayer.getPowerLevel());
}
}
}
@@ -68,7 +69,6 @@ public class ScoreboardWrapper {
}
public BukkitTask updateTask = null;
private class ScoreboardQuickUpdate extends BukkitRunnable {
@Override
public void run() {
@@ -78,7 +78,6 @@ public class ScoreboardWrapper {
}
public BukkitTask revertTask = null;
private class ScoreboardChangeTask extends BukkitRunnable {
@Override
public void run() {
@@ -88,7 +87,6 @@ public class ScoreboardWrapper {
}
public BukkitTask cooldownTask = null;
private class ScoreboardCooldownTask extends BukkitRunnable {
@Override
public void run() {
@@ -123,8 +121,7 @@ public class ScoreboardWrapper {
try {
cooldownTask.cancel();
}
catch (Throwable ignored) {
}
catch (Throwable ignored) {}
cooldownTask = null;
}
@@ -277,7 +274,7 @@ public class ScoreboardWrapper {
targetProfile = null;
leaderboardPage = -1;
loadObjective(ScoreboardManager.skillLabels.get(skill));
loadObjective(ScoreboardManager.skillLabels.get(skill).getName());
}
public void setTypeSelfStats() {
@@ -358,7 +355,7 @@ public class ScoreboardWrapper {
int endPosition = page * 15;
int startPosition = endPosition - 14;
loadObjective(String.format("%s (%2d - %2d)", ScoreboardManager.skillLabels.get(skill), startPosition, endPosition));
loadObjective(String.format("%s (%2d - %2d)", ScoreboardManager.skillLabels.get(skill).getName(), startPosition, endPosition));
}
// Setup for after a board type change
@@ -384,8 +381,7 @@ public class ScoreboardWrapper {
try {
updateTask.cancel();
}
catch (Throwable ignored) {
} // catch NullPointerException and IllegalStateException and any Error; don't care
catch (Throwable ignored) {} // catch NullPointerException and IllegalStateException and any Error; don't care
updateTask = null;
@@ -403,123 +399,123 @@ public class ScoreboardWrapper {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
switch (sidebarType) {
case NONE:
break;
case NONE:
break;
case SKILL_BOARD:
Validate.notNull(targetSkill);
case SKILL_BOARD:
Validate.notNull(targetSkill);
if (!targetSkill.isChildSkill()) {
int currentXP = mcMMOPlayer.getSkillXpLevel(targetSkill);
if (!targetSkill.isChildSkill()) {
int currentXP = mcMMOPlayer.getSkillXpLevel(targetSkill);
sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP);
sidebarObjective.getScore(ScoreboardManager.LABEL_REMAINING_XP).setScore(mcMMOPlayer.getXpToLevel(targetSkill) - currentXP);
sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP);
sidebarObjective.getScore(ScoreboardManager.LABEL_REMAINING_XP).setScore(mcMMOPlayer.getXpToLevel(targetSkill) - currentXP);
}
else {
for (SkillType parentSkill : FamilyTree.getParents(targetSkill)) {
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(parentSkill)).setScore(mcMMOPlayer.getSkillLevel(parentSkill));
}
}
sidebarObjective.getScore(ScoreboardManager.LABEL_LEVEL).setScore(mcMMOPlayer.getSkillLevel(targetSkill));
if (targetSkill.getAbility() != null) {
boolean stopUpdating;
if (targetSkill == SkillType.MINING) {
// Special-Case: Mining has two abilities, both with cooldowns
Score cooldownSB = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.SUPER_BREAKER));
Score cooldownBM = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.BLAST_MINING));
int secondsSB = Math.max(mcMMOPlayer.calculateTimeRemaining(AbilityType.SUPER_BREAKER), 0);
int secondsBM = Math.max(mcMMOPlayer.calculateTimeRemaining(AbilityType.BLAST_MINING), 0);
cooldownSB.setScore(secondsSB);
cooldownBM.setScore(secondsBM);
stopUpdating = (secondsSB == 0 && secondsBM == 0);
}
else {
for (SkillType parentSkill : FamilyTree.getParents(targetSkill)) {
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(parentSkill)).setScore(mcMMOPlayer.getSkillLevel(parentSkill));
}
}
sidebarObjective.getScore(ScoreboardManager.LABEL_LEVEL).setScore(mcMMOPlayer.getSkillLevel(targetSkill));
if (targetSkill.getAbility() != null) {
boolean stopUpdating;
if (targetSkill == SkillType.MINING) {
// Special-Case: Mining has two abilities, both with cooldowns
Score cooldownSB = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.SUPER_BREAKER));
Score cooldownBM = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.BLAST_MINING));
int secondsSB = Math.max(mcMMOPlayer.calculateTimeRemaining(AbilityType.SUPER_BREAKER), 0);
int secondsBM = Math.max(mcMMOPlayer.calculateTimeRemaining(AbilityType.BLAST_MINING), 0);
cooldownSB.setScore(secondsSB);
cooldownBM.setScore(secondsBM);
stopUpdating = (secondsSB == 0 && secondsBM == 0);
}
else {
AbilityType ability = targetSkill.getAbility();
Score cooldown = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(ability));
int seconds = Math.max(mcMMOPlayer.calculateTimeRemaining(ability), 0);
cooldown.setScore(seconds);
stopUpdating = seconds == 0;
}
if (stopUpdating) {
stopCooldownUpdating();
}
else {
startCooldownUpdating();
}
}
break;
case COOLDOWNS_BOARD:
boolean anyCooldownsActive = false;
for (AbilityType ability : AbilityType.values()) {
AbilityType ability = targetSkill.getAbility();
Score cooldown = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(ability));
int seconds = Math.max(mcMMOPlayer.calculateTimeRemaining(ability), 0);
if (seconds != 0) {
anyCooldownsActive = true;
}
cooldown.setScore(seconds);
sidebarObjective.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
stopUpdating = seconds == 0;
}
if (anyCooldownsActive) {
startCooldownUpdating();
}
else {
if (stopUpdating) {
stopCooldownUpdating();
}
break;
case STATS_BOARD:
// Select the profile to read from
PlayerProfile newProfile;
if (targetProfile != null) {
newProfile = targetProfile; // offline
}
else if (targetPlayer == null) {
newProfile = mcMMOPlayer.getProfile(); // self
}
else {
newProfile = UserManager.getPlayer(targetPlayer).getProfile(); // online
startCooldownUpdating();
}
}
break;
case COOLDOWNS_BOARD:
boolean anyCooldownsActive = false;
for (AbilityType ability : AbilityType.values()) {
int seconds = Math.max(mcMMOPlayer.calculateTimeRemaining(ability), 0);
if (seconds != 0) {
anyCooldownsActive = true;
}
// Calculate power level here
int powerLevel = 0;
for (SkillType skill : SkillType.NON_CHILD_SKILLS) { // Don't include child skills, makes the list too long
int level = newProfile.getSkillLevel(skill);
sidebarObjective.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
}
powerLevel += level;
if (anyCooldownsActive) {
startCooldownUpdating();
}
else {
stopCooldownUpdating();
}
break;
// TODO: Verify that this is what we want - calculated in power level but not displayed
if (!skill.getPermissions(player)) {
continue;
}
case STATS_BOARD:
// Select the profile to read from
PlayerProfile newProfile;
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(level);
if (targetProfile != null) {
newProfile = targetProfile; // offline
}
else if (targetPlayer == null) {
newProfile = mcMMOPlayer.getProfile(); // self
}
else {
newProfile = UserManager.getPlayer(targetPlayer).getProfile(); // online
}
// Calculate power level here
int powerLevel = 0;
for (SkillType skill : SkillType.NON_CHILD_SKILLS) { // Don't include child skills, makes the list too long
int level = newProfile.getSkillLevel(skill);
powerLevel += level;
// TODO: Verify that this is what we want - calculated in power level but not displayed
if (!skill.getPermissions(player)) {
continue;
}
sidebarObjective.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(powerLevel);
break;
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(level);
}
case RANK_BOARD:
case TOP_BOARD:
sidebarObjective.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(powerLevel);
break;
case RANK_BOARD:
case TOP_BOARD:
/*
* @see #acceptRankData(Map<SkillType, Integer> rank)
* @see #acceptLeaderboardData(List<PlayerStat> stats)
*/
break;
break;
default:
break;
default:
break;
}
}
@@ -554,11 +550,11 @@ public class ScoreboardWrapper {
name = ChatColor.GOLD + "--You--";
}
sidebarObjective.getScore(name).setScore(stat.statVal);
sidebarObjective.getScore(mcMMO.p.getServer().getOfflinePlayer(name)).setScore(stat.statVal);
}
}
public void updatePowerLevel(Player player, int newPowerLevel) {
powerObjective.getScore(player.getName()).setScore(newPowerLevel);
powerObjective.getScore(player).setScore(newPowerLevel);
}
}

View File

@@ -16,7 +16,6 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.projectiles.ProjectileSource;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
@@ -264,10 +263,10 @@ public final class CombatUtils {
}
else if (entityType == EntityType.ARROW) {
Arrow arrow = (Arrow) damager;
ProjectileSource projectileSource = arrow.getShooter();
LivingEntity shooter = arrow.getShooter();
if (projectileSource != null && projectileSource instanceof Player && SkillType.ARCHERY.shouldProcess(target)) {
Player player = (Player) projectileSource;
if (shooter != null && shooter instanceof Player && SkillType.ARCHERY.shouldProcess(target)) {
Player player = (Player) shooter;
if (!Misc.isNPCEntity(player) && SkillType.ARCHERY.getPermissions(player)) {
processArcheryCombat(target, player, event, arrow);

View File

@@ -294,7 +294,6 @@ Skills:
Fishing:
Level_Cap: 0
Drops_Enabled: true
Override_Vanilla_Treasures: true
# Always catch fish, even when treasure is found
Extra_Fish: false
Herbalism:
@@ -395,12 +394,10 @@ Double_Drops:
Sandstone: true
Stone: true
Woodcutting:
Acacia: true
Oak: true
Birch: true
Dark_Oak: true
Generic: true
Spruce: true
Jungle: true
Redwood: true
#
# Settings for commands

View File

@@ -80,22 +80,9 @@ Experience:
# FeatherFall_Multiplier: Multiply Acrobatics XP by this value when wearing boots with the Feather Fall enchant
FeatherFall_Multiplier: 2.0
Alchemy:
# Alchemy potion stages are based on the number of ingredients added
# Potion_Stage_1 represents a base potion
# Potion_Stage_2 represents a base potion with one ingredient
# Potion_Stage_3 represents a base potion with one ingredient and one amplifier
# Potion_Stage_4 represents a base potion with one ingredient and two amplifiers
# Potion_Stage_5 represents a base potion with one ingredient where the amplifiers are swapped
Potion_Stage_1: 15
Potion_Stage_2: 30
Potion_Stage_3: 60
Potion_Stage_4: 120
Potion_Stage_5: 0
Potion: 120
Fishing:
Raw_Fish: 800
Raw_Salmon: 800
Clownfish: 800
Pufferfish: 800
Base: 800
Shake: 50
Excavation:
Clay: 40
@@ -108,46 +95,27 @@ Experience:
Snow_Block: 40
Soul_Sand: 40
Woodcutting:
Acacia: 90
Oak: 70
Spruce: 80
Birch: 90
Dark_Oak: 90
Generic: 70
Jungle: 100
Redwood: 80
Huge_Mushroom_Red: 70
Huge_Mushroom_Brown: 70
Herbalism:
Allium: 300
Azure_Bluet: 150
Blue_Orchid: 150
Brown_Mushroom: 150
Cactus: 30
Carrot: 50
Cocoa: 30
Crops: 50
Dead_Bush: 30
Lilac: 50
Melon_Block: 20
Nether_Warts: 50
Orange_Tulip: 150
Oxeye_Daisy: 150
Peony: 50
Pink_Tulip: 150
Poppy: 100
Potato: 50
Pumpkin: 20
Red_Mushroom: 150
Red_Tulip: 150
Rose_Bush: 50
Small_Fern: 10
Small_Grass: 10
Red_Rose: 100
Sugar_Cane_Block: 30
Sunflower: 50
Tall_Grass: 50
Tall_Fern: 50
Vine: 10
Water_Lily: 100
White_Tulip: 150
Yellow_Flower: 100
Mining:
Coal_Ore: 100
@@ -156,17 +124,14 @@ Experience:
Ender_Stone: 150
Glowstone: 30
Gold_Ore: 350
Hard_Clay: 30
Iron_Ore: 250
Lapis_Ore: 400
Mossy_Cobblestone: 30
Netherrack: 30
Obsidian: 150
Packed_Ice: 50
Quartz_Ore: 100
Redstone_Ore: 150
Sandstone: 30
Stained_Clay: 50
Stone: 30
Repair:
Base: 1000.0

View File

@@ -95,6 +95,7 @@ Fishing.Effect.10=Ryba\u0159en\u00ed v ledu
Fishing.Effect.11=Umo\u017e\u0148uje v\u00e1m ryba\u0159it v ledov\u00fdch prost\u0159ed\u00edch
Fishing.Chance.Raining=[[BLUE]] De\u0161\u0165ov\u00fd bonus
Fishing.Listener=Rybareni:
Fishing.Ability.TH.ItemFound=[[GRAY]]Nasel si poklad!
Fishing.Ability.TH.MagicFound=[[GRAY]]C\u00edt\u00edte dotek magie s t\u00edmto \u00falovkem...
Fishing.SkillName=RYBARENI
Fishing.Skillup=[[YELLOW]]Dovednost v rybareni byla navysena o {0}. Celkem ({1})

View File

@@ -87,6 +87,7 @@ Fishing.Effect.6=Fisherman\'s Diet
Fishing.Effect.7=Improves hunger restored from fished foods
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.Listener=Fishing:
Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.SkillName=FISHING
Fishing.Skillup=[[YELLOW]]Fishing skill increased by {0}. Total ({1})

View File

@@ -87,6 +87,7 @@ Fishing.Effect.6=Fiskers Diet
Fishing.Effect.7=Forbedrer Sult genoprettet af Fisked mad
Fishing.Chance.Raining=[[BLUE]] Regn Bonus
Fishing.Listener=Fiskeri:
Fishing.Ability.TH.ItemFound=[[GRAY]Du har fundet en skat!
Fishing.Ability.TH.MagicFound=[[GRAY]]Du f\u00f8ler et strejf a magi med denne fangst...
Fishing.SkillName=FISKER
Fishing.Skillup=[[YELLOW]]Fisker evne for\u00f8get med {0}. Total ({1})

View File

@@ -87,6 +87,7 @@ Fishing.Effect.6=Fischer-Mahlzeit
Fishing.Effect.7=Verbessert Effizienz von geangelter Nahrung
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.Listener=Angeln:
Fishing.Ability.TH.ItemFound=[[AQUA]]Du hast einen Schatz gefunden!
Fishing.Ability.TH.MagicFound=[[AQUA]]Dich ber\u00fchrt ein leichter Zauber bei diesem Fang...
Fishing.SkillName=ANGELN
Fishing.Skillup=[[YELLOW]]Angel Skill um {0} gestiegen. Gesamt ({1})

View File

@@ -137,6 +137,7 @@ Fishing.Effect.10=Ice Fishing
Fishing.Effect.11=Allows you to fish in icy biomes
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.Listener=Fishing:
Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.Ability.TH.Boom=[[GRAY]]BOOM TIME!!!
Fishing.Ability.TH.Poison=[[GRAY]]Something doesn't smell quite right...

View File

@@ -96,6 +96,7 @@ Fishing.Effect.10=Pesca de hielo
Fishing.Effect.11=Te permite pescar en biomas de hielo
Fishing.Chance.Raining=[[BLUE]] Lluvia de Bonus
Fishing.Listener=Pescador:
Fishing.Ability.TH.ItemFound=[[GRAY]]\u00a1Tesoro encontrado!
Fishing.Ability.TH.MagicFound=[[GRAY]]Sientes un toque de magia con esta pesca...
Fishing.SkillName=PESCADOR
Fishing.Skillup=[[YELLOW]]Habilidad de Pescador incrementada en {0}. Total ({1})

View File

@@ -2,6 +2,7 @@ Acrobatics.Listener=Akrobaatika:
Acrobatics.SkillName=AKROBAATIKA
Acrobatics.Skillup=[[YELLOW]]Akrobaatika oskus kasvanud {0} v\u00f5rra. Kokku ({1})
Archery.Skillup=[[YELLOW]]Vibunduse oskus kasvanud {0} v\u00f5rra. Kokku ({1})
Fishing.Ability.TH.ItemFound=[[GRAY]]Varandus leitud!
Mining.Ability.Lower=[[GRAY]]**TE LANGETASITE OMA KIRKA**
Mining.Ability.Ready=[[GREEN]]**TE PANITE OMA KIRKA VALMIS**
Mining.Listener=Kaevandamine:

View File

@@ -36,6 +36,7 @@ Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**TEHO PORA HAJOITUS AKTIVOITU**
Excavation.Skillup=[[YELLOW]]Kaivuu taito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1})
Fishing.Effect.0=Aarteenmets\u00e4st\u00e4j\u00e4 (Passiivinen)
Fishing.Listener=Kalastus:
Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.SkillName=KALASTUS
Fishing.Skillup=[[YELLOW]]Kalastustaito nousi {0} tasolla. Kokonaism\u00e4\u00e4r\u00e4 ({1})

View File

@@ -87,6 +87,7 @@ Fishing.Effect.6=R\u00e9gime de fermier
Fishing.Effect.7=Am\u00e9liore la nutrition des produits de la ferme
Fishing.Chance.Raining=[[BLUE]] Bonus de pluie
Fishing.Listener=P\u00eache :
Fishing.Ability.TH.ItemFound=[[GRAY]]Tr\u00e9sor d\u00e9couvert !
Fishing.Ability.TH.MagicFound=[[GRAY]]Vous ressentez quelque chose de magique dans cette prise...
Fishing.SkillName=P\u00caCHE
Fishing.Skillup=[[YELLOW]]Le talent p\u00eache augmente de {0}. Total ({1})

View File

@@ -25,6 +25,7 @@ Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00
Excavation.Skillup=[[YELLOW]]\u00c1s\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
Fishing.Effect.10=J\u00e9g Horg\u00e1szat
Fishing.Listener=Horg\u00e1szat:
Fishing.Ability.TH.ItemFound=[[GRAY]]Kincs megtal\u00e1lva!
Fishing.SkillName=HORG\u00c1SZAT
Herbalism.Ability.Lower=[[GRAY]]**LETETTED A KAP\u00c1DAT**
Herbalism.Ability.Ready=[[GREEN]]**EL\u0150K\u00c9SZ\u00cdTETTED A KAP\u00c1DAT**

View File

@@ -98,6 +98,7 @@ Fishing.Effect.10=\uc5bc\uc74c \ub09a\uc2dc
Fishing.Effect.11=\uc5bc\uc74c\uc774 \ub36e\ud600\uc788\ub294 \ud658\uacbd\uc5d0\uc11c \ub09a\uc2dc \uac00\ub2a5
Fishing.Chance.Raining=[[BLUE]] \ube44 \ubcf4\ub108\uc2a4
Fishing.Listener=\ub09a\uc2dc(FISHING):
Fishing.Ability.TH.ItemFound=[[GRAY]]\ubcf4\ubb3c \ubc1c\uacac!
Fishing.Ability.TH.MagicFound=[[GRAY]]\uc774 \uc785\uc9c8\uc5d0\uc11c \ub9c8\ubc95\uc774 \ub290\uaef4\uc9d1\ub2c8\ub2e4...
Fishing.Ability.TH.Boom=[[GRAY]]\ud3ed\ubc1c \uc2dc\uac04!!!
Fishing.Ability.TH.Poison=[[GRAY]]\ubb54\uac00 \uaf64 \uad1c\ucc2e\uc740 \ub0c4\uc0c8\uac00 \ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4...

View File

@@ -76,6 +76,7 @@ Fishing.Effect.10=Ijs Vissen
Fishing.Effect.11=Stelt je in staat om te vissen in de ijzige biomen
Fishing.Chance.Raining=[[BLUE]] Regen Bonus
Fishing.Listener=Vissen:
Fishing.Ability.TH.ItemFound=[[GRAY]]Schat gevonden!
Fishing.Ability.TH.MagicFound=[[GRAY]]Jij voelt een vleugje magie met deze vangst...
Fishing.SkillName=VISSEN
Herbalism.Ability.FD=[[RED]]Boeren Dieet: [[YELLOW]]Rank {0}

View File

@@ -94,6 +94,7 @@ Fishing.Effect.10=Lodowe lowienie ryb
Fishing.Effect.11=Pozwala na lowienie ryb w zimowych biomach
Fishing.Chance.Raining=[[BLUE]] Bonus od Deszczu
Fishing.Listener=Rybactwo
Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
Fishing.Ability.TH.MagicFound=[[GRAY]]Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii...
Fishing.SkillName=RYBACTWO
Fishing.Skillup=[[YELLOW]]Umiej\u0119tno\u015b\u0107 \u0142owienia wzros\u0142a o {0}. Razem ({1})

View File

@@ -30,6 +30,7 @@ Excavation.Listener=Escavacao:
Excavation.SkillName=Escava\u00e7\u00e3o
Excavation.Skillup=[[YELLOW]]Habilidade de Escavacao aumentada em {0}. Total ({1})
Fishing.Listener=Pescaria:
Fishing.Ability.TH.ItemFound=[[GRAY]]Tesouro encontrado!
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.SkillName=PESCARIA
Fishing.Skillup=[[YELLOW]]Habilidade em Pescaria aumentada em {0}. Total ({1})

View File

@@ -98,6 +98,7 @@ Fishing.Effect.10=\u041f\u043e\u0434\u043b\u0435\u0434\u043d\u0430\u044f \u0420\
Fishing.Effect.11=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0440\u044b\u0431\u0430\u0447\u0438\u0442\u044c \u0432 \u0441\u043d\u0435\u0436\u043d\u044b\u0445 \u0431\u0438\u043e\u043c\u0430\u0445
Fishing.Chance.Raining=[[BLUE]] \u0411\u043e\u043d\u0443\u0441 \u0414\u043e\u0436\u0434\u044f
Fishing.Listener=\u0420\u044b\u0431\u043e\u043b\u043e\u0432\u0441\u0442\u0432\u043e:
Fishing.Ability.TH.ItemFound=[[GRAY]]Treasure found!
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.Ability.TH.Boom=[[GRAY]]\u0412\u0420\u0415\u041c\u042f \u0412\u0417\u0420\u042b\u0412\u0410\u0422\u042c!!!
Fishing.Ability.TH.Poison=[[GRAY]]\u0427\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a...

View File

@@ -25,6 +25,7 @@ Excavation.Listener=Gr\u00e4vning:
Excavation.SkillName=Gr\u00e4vning
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA BORR KROSSAREN AKTIVERAD**
Excavation.Skillup=[[YELLOW]]Gr\u00e4vningsf\u00e4rdigheten har \u00f6kat med {0}. Totalt ({1})
Fishing.Ability.TH.ItemFound=[[GRAY]]Skatt hittad!
Fishing.Ability.TH.MagicFound=[[GRAY]] Du f\u00e5r en k\u00e4nsla av magi med denna f\u00e5ngst....
Herbalism.Ability.GTh=[[GREEN]]**GR\u00d6NA FINGRAR**
Herbalism.Ability.Ready=[[GREEN]]**DU H\u00d6JER DIN SKYFFEL**

View File

@@ -95,6 +95,7 @@ Fishing.Effect.10=Ice Fishing
Fishing.Effect.11=\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e34\u0e43\u0e2b\u0e49\u0e15\u0e01\u0e1b\u0e25\u0e32\u0e43\u0e19\u0e19\u0e49\u0e33\u0e41\u0e02\u0e47\u0e07
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.Listener=\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing:
Fishing.Ability.TH.ItemFound=[[GRAY]]\u0e44\u0e14\u0e49\u0e1e\u0e1a\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34!
Fishing.Ability.TH.MagicFound=[[GRAY]]\u0e04\u0e38\u0e13\u0e23\u0e39\u0e49\u0e2a\u0e36\u0e01\u0e44\u0e14\u0e49\u0e16\u0e36\u0e07\u0e2a\u0e31\u0e21\u0e1c\u0e31\u0e2a\u0e02\u0e2d\u0e07\u0e40\u0e27\u0e17\u0e21\u0e19\u0e15\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e08\u0e31\u0e1a\u0e2a\u0e34\u0e48\u0e07\u0e19\u0e35\u0e49 ...
Fishing.SkillName=FISHING
Fishing.Skillup=[[YELLOW]]\u0e17\u0e31\u0e01\u0e29\u0e30 Fishing \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e36\u0e49\u0e19 {0}. \u0e21\u0e35\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 ({1})

View File

@@ -10,6 +10,7 @@ Axes.Effect.2=Kritik Vuruslar
Axes.SkillName=BALTALAR
Excavation.Ability.Lower=[[GRAY]]**K\u00dcREGINI INDIRIYORSUN**
Excavation.SkillName=KAZMA
Fishing.Ability.TH.ItemFound=[[GRAY]]Hazine bulundu!
Fishing.SkillName=BALIK TUTMA
Herbalism.Ability.Lower=[[GRAY]]**\u00c7APANI INDIRIYORSUN**
Herbalism.Ability.Ready=[[GREEN]]**\u00c7APANI HAZIRLIYORSUN**

View File

@@ -98,6 +98,7 @@ Fishing.Effect.10=\u51b0\u9493
Fishing.Effect.11=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c
Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u5956\u52b1
Fishing.Listener=\u9493\u9c7c(Fishing):
Fishing.Ability.TH.ItemFound=[[GRAY]]\u53d1\u73b0\u5b9d\u7269\u4e86\uff01
Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8...
Fishing.Ability.TH.Boom=[[GRAY]]\u7e41\u8363\u65f6\u671f!!!
Fishing.Ability.TH.Poison=[[GRAY]]\u4ec0\u4e48\u4e1c\u897f,\u95fb\u8d77\u6765\u597d\u81ed\u554a...

View File

@@ -98,6 +98,7 @@ Fishing.Effect.10=\u51b0\u91e3
Fishing.Effect.11=\u5141\u8a31\u4f60\u5728\u51b0\u5929\u96ea\u5730\u88e1\u91e3\u9b5a
Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u734e\u52f5
Fishing.Listener=\u91e3\u9b5a:
Fishing.Ability.TH.ItemFound=[[GRAY]]\u767c\u73fe\u5bf6\u7269\u4e86\uff01
Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u53d7\u5230\u9b54\u529b\u7684\u6ce2\u52d5...
Fishing.Ability.TH.Boom=[[GRAY]]\u6536\u7a6b\u6642\u9593!!!
Fishing.Ability.TH.Poison=[[GRAY]]\u4ec0\u9ebc\u6771\u897f,\u805e\u8d77\u4f86\u597d\u81ed\u554a...

View File

@@ -652,6 +652,16 @@ permissions:
mcmmo.bypass.fishingtraps:
default: false
description: Allows user to bypass finding traps when Fishing
mcmmo.bypass.inspect.distance:
default: false
description: Allows user to bypass Inspect's distance requirements
children:
mcmmo.commands.inspect.far: true
mcmmo.bypass.inspect.offline:
default: false
description: Allows user to bypass Inspect's offline player requirements
children:
mcmmo.commands.inspect.offline: true
mcmmo.chat.*:
default: false
description: Implies all mcmmo.chat permissions. (Warning, contains adminchat)
@@ -739,6 +749,11 @@ permissions:
mcmmo.commands.skillreset.all: true
mcmmo.commands.vampirism.all: true
mcmmo.commands.xprate.all: true
mcmmo.commands.ability:
default: false
description: Allows access to the mcability command
children:
mcmmo.commands.mcability: true
mcmmo.commands.acrobatics:
description: Allows access to the acrobatics command
mcmmo.commands.addlevels:
@@ -807,6 +822,11 @@ permissions:
description: Allows access to the mcability command
mcmmo.commands.mcability.others:
description: Allows access to the mcability command for other players
mcmmo.commands.mcc:
default: false
description: Allows access to the mcmmo help command
children:
mcmmo.commands.mcmmo.help: true
mcmmo.commands.mcconvert.*:
default: false
description: Allows access to the mcconvert commands
@@ -936,6 +956,11 @@ permissions:
description: Allows access to the mmoedit command
mcmmo.commands.mmoedit.others:
description: Allows access to the mmoedit command for other players
mcmmo.commands.mmoupdate:
default: false
description: Allows access to the mcconvert database command
children:
mcmmo.commands.mcconvert.database: true
mcmmo.commands.mmoshowdb:
description: Allows access to the mmoshowdb command
mcmmo.commands.mobhealth:
@@ -1221,7 +1246,7 @@ permissions:
mcmmo.chat.adminchat: true
mcmmo.commands.defaultsop: true
mcmmo.item.all: true
mcmmo.tools.all: true
mcmmo.tools.updatecheck: true
mcmmo.item.*:
default: false
description: Implies all mcmmo.item permissions
@@ -1991,7 +2016,163 @@ permissions:
default: false
description: Implies all mcmmo.tools permissions.
children:
mcmmo.tools.mcgod: true
mcmmo.tools.mcrefresh: true
mcmmo.tools.mcremove: true
mcmmo.tools.mmoedit: true
mcmmo.tools.updatecheck: true
mcmmo.tools.mcgod:
default: false
description: Allows access to mcgod command
children:
mcmmo.commands.mcgod: true
mcmmo.tools.mcrefresh:
default: false
description: Allows access to mcrefresh command
children:
mcmmo.commands.mcrefresh: true
mcmmo.commands.mcrefresh.others: true
mcmmo.tools.mcremove:
default: false
decription: Allows access to mcremove and mcpurge command
children:
mcmmo.commands.mcremove: true
mcmmo.tools.mmoedit:
default: false
description: Allows access to mmoedit command
children:
mcmmo.commands.addlevels: true
mcmmo.commands.addlevels.others: true
mcmmo.commands.addxp: true
mcmmo.commands.addxp.others: true
mcmmo.commands.mcpurge: true
mcmmo.commands.mmoedit: true
mcmmo.commands.mmoedit.others: true
mcmmo.tools.updatecheck:
default: false
description: Notifies admins if there is a new version of mcMMO available
mcmmo.ability.fishing.shakemob:
default: false
description: deprecated
children:
mcmmo.ability.fishing.shake: true
mcmmo.ability.axes.impact:
default: false
description: deprecated
children:
mcmmo.ability.axes.armorimpact: true
mcmmo.ability.taming.fastfoodservice:
default: false
description: deprecated
children:
mcmmo.ability.taming.fastfood: true
mcmmo.ability.archery.trackarrows:
default: false
description: deprecated
children:
mcmmo.ability.archery.retrieve: true
mcmmo.ability.repair.repairbonus:
default: false
description: deprecated
children:
mcmmo.ability.repair.superrepair: true
mcmmo.ability.swords.counterattack:
default: false
description: deprecated
children:
mcmmo.ability.swords.counter: true
mcmmo.ability.archery.bonusdamage:
default: false
description: deprecated
children:
mcmmo.ability.archery.skillshot: true
mcmmo.ability.excavation.treasures:
default: false
description: deprecated
children:
mcmmo.ability.excavation.treasurehunter: true
mcmmo.ability.fishing.treasures:
default: false
description: deprecated
children:
mcmmo.ability.fishing.treasurehunter: true
mcmmo.ability.fishing.magic:
default: false
description: deprecated
children:
mcmmo.ability.fishing.magichunter: true
mcmmo.ability.unarmed.bonusdamage:
default: false
description: deprecated
children:
mcmmo.ability.unarmed.ironarm: true
mcmmo.ability.axes.bonusdamage:
default: false
description: deprecated
children:
mcmmo.ability.axes.axemastery: true
mcmmo.ability.smelting.doubledrops:
default: false
description: deprecated
children:
mcmmo.ability.smelting.secondsmelt: true
mcmmo.ability.taming.callofthewild_renamepets:
default: false
description: deprecated
children:
mcmmo.ability.taming.callofthewild.renamepets: true
mcmmo.ability.blastmining.*:
default: false
description: deprecated
children:
mcmmo.ability.mining.blastmining.*: true
mcmmo.ability.blastmining.all:
default: false
description: deprecated
children:
mcmmo.ability.mining.blastmining.all: true
mcmmo.ability.blastmining.biggerbombs:
default: false
description: deprecated
children:
mcmmo.ability.mining.blastmining.biggerbombs: true
mcmmo.ability.blastmining.demolitionsexpertise:
default: false
description: deprecated
children:
mcmmo.ability.mining.blastmining.demolitionsexpertise: true
mcmmo.ability.blastmining.detonate:
default: false
description: deprecated
children:
mcmmo.ability.mining.blastmining.detonate: true
mcmmo.ability.herbalism.greenthumbblocks:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.blocks.all: true
mcmmo.ability.herbalism.greenthumbcarrots:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.plants.carrot: true
mcmmo.ability.herbalism.greenthumbcocoa:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.plants.cocoa: true
mcmmo.ability.herbalism.greenthumbnetherwart:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.plants.netherwarts: true
mcmmo.ability.herbalism.greenthumbpotatoes:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.plants.potato: true
mcmmo.ability.herbalism.greenthumbwheat:
default: false
description: deprecated
children:
mcmmo.ability.herbalism.greenthumb.plants.crops: true

View File

@@ -446,7 +446,7 @@ Excavation:
XP: 3000
Drop_Chance: 0.05
Drop_Level: 750
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
Drops_From: [Dirt, Grass, Sand, Gravel, Clay, Mycelium, Soul_Sand]
SULPHUR:
Amount: 1
XP: 30
@@ -488,13 +488,13 @@ Excavation:
XP: 80
Drop_Chance: 0.5
Drop_Level: 500
Drops_From: [Dirt, Podzol, Grass, Mycelium]
Drops_From: [Dirt, Grass, Mycelium]
BROWN_MUSHROOM:
Amount: 1
XP: 80
Drop_Chance: 0.5
Drop_Level: 500
Drops_From: [Dirt, Podzol, Grass, Mycelium]
Drops_From: [Dirt, Grass, Mycelium]
EGG:
Amount: 1
XP: 100
@@ -506,7 +506,7 @@ Excavation:
XP: 80
Drop_Chance: 0.5
Drop_Level: 650
Drops_From: [Sand, Red_Sand]
Drops_From: [Sand]
WATCH:
Amount: 1
XP: 100
@@ -530,43 +530,43 @@ Excavation:
XP: 80
Drop_Chance: 5.0
Drop_Level: 25
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Mycelium]
Drops_From: [Dirt, Grass, Sand, Mycelium]
GOLD_RECORD:
Amount: 1
XP: 3000
Drop_Chance: 0.05
Drop_Level: 250
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
Drops_From: [Dirt, Grass, Sand, Gravel, Clay, Mycelium, Soul_Sand]
GREEN_RECORD:
Amount: 1
XP: 3000
Drop_Chance: 0.05
Drop_Level: 250
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
Drops_From: [Dirt, Grass, Sand, Gravel, Clay, Mycelium, Soul_Sand]
DIAMOND:
Amount: 1
XP: 1000
Drop_Chance: 0.13
Drop_Level: 350
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
Drops_From: [Dirt, Grass, Sand, Gravel, Clay, Mycelium, Soul_Sand]
INK_SACK_BROWN:
Amount: 1
XP: 100
Drop_Chance: 1.33
Drop_Level: 350
Drops_From: [Dirt, Podzol, Grass, Mycelium]
Drops_From: [Dirt, Grass, Mycelium]
QUARTZ:
Amount: 1
XP: 100
Drop_Chance: 0.5
Drop_Level: 850
Drops_From: [Dirt, Podzol, Sand, Red_Sand, Gravel, Mycelium, Soul_Sand]
Drops_From: [Dirt, Sand, Gravel, Mycelium, Soul_Sand]
NAME_TAG:
Amount: 1
XP: 3000
Drop_Chance: 0.05
Drop_Level: 250
Drops_From: [Dirt, Podzol, Grass, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
Drops_From: [Dirt, Grass, Sand, Gravel, Clay, Mycelium, Soul_Sand]
#
# Settings for Hylian Luck
###