mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2026-02-18 17:53:00 +01:00
Compare commits
19 Commits
b-1.7.10
...
dev-charge
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58c1fcc64a | ||
|
|
eda18bc990 | ||
|
|
a2c395db36 | ||
|
|
522b085499 | ||
|
|
3ea845cfd9 | ||
|
|
93013b2db1 | ||
|
|
d5a2dea06b | ||
|
|
d188224c06 | ||
|
|
3422c5d3eb | ||
|
|
ebeebbde72 | ||
|
|
e71eff852c | ||
|
|
bfff5682b5 | ||
|
|
429a7d926a | ||
|
|
262e711bcc | ||
|
|
b44b1cc859 | ||
|
|
75dfec1236 | ||
|
|
8c2f3cff8f | ||
|
|
32336b712b | ||
|
|
cfc51e9b96 |
@@ -7,7 +7,15 @@ Key:
|
||||
! Change
|
||||
- Removal
|
||||
|
||||
Version 1.5.01-dev
|
||||
Version 1.5.02-dev
|
||||
+ Added new active ability "Charge" to Taming!
|
||||
+ Added option to config.yml for Chimaera Wings to stop using bed spawn points
|
||||
= Fixed bug where no Mining XP was granted when Flux Mining was successful
|
||||
= Fixed bug where MobHealthbarTypes were not saved between server restarts
|
||||
! Changed Flux Mining mechanics. In order to use the ability, you need to infuse a pickaxe with furnace powers first.
|
||||
! Scoreboard tips are only shown a couple of times to the player, instead of once per login session
|
||||
|
||||
Version 1.5.01
|
||||
+ Added new child skill; Salvage
|
||||
+ Added UUID support!
|
||||
+ Added SQL connection pooling and async loading!
|
||||
@@ -56,6 +64,7 @@ Version 1.5.01-dev
|
||||
! Changed Alchemy XP distribution. XP is granted based on the stage of the potion.
|
||||
! Changed behavior of the Blast Mining ability "Demolition Expert"; now only decreases damage for the ability user
|
||||
! Updated for new getOnlinePlayers() behavior
|
||||
! Updated for new blocks and entities
|
||||
! Changed McMMOPlayerDeathPenaltyEvent to get fired after hardcore penalty calculations, use McMMOPlayerPreDeathPenaltyEvent for old behavior
|
||||
! Moved Refresh_Chunks setting from hidden.yml to config.yml
|
||||
- Removed salvage ability from Repair, salvage has it's own (child) skill now
|
||||
|
||||
@@ -10,11 +10,10 @@ The goal of mcMMO is to take core Minecraft game mechanics and expand them into
|
||||
## About the Team
|
||||
|
||||
mcMMO is currently developed by a team of individuals from all over the world.
|
||||
### Glorious Leader
|
||||
[]
|
||||
(https://github.com/gmcferrin)
|
||||
|
||||
### Developers
|
||||
[]
|
||||
(https://github.com/gmcferrin)
|
||||
[]
|
||||
(https://github.com/bm01)
|
||||
[]
|
||||
@@ -48,4 +47,4 @@ Required Libraries:
|
||||
* EMetrics
|
||||
* Bukkit
|
||||
|
||||
http://dev.bukkit.org/server-mods/mcmmo for more up to date information.
|
||||
http://www.spigotmc.org/resources/mcmmo.2445/ for more up to date information.
|
||||
|
||||
22
pom.xml
22
pom.xml
@@ -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.5.02-SNAPSHOT</version>
|
||||
<name>mcMMO</name>
|
||||
<url>https://github.com/mcMMO-Dev/mcMMO</url>
|
||||
<issueManagement>
|
||||
@@ -120,12 +120,8 @@
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>bukkit-repo</id>
|
||||
<url>http://repo.bukkit.org/content/groups/public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>md_5-releases</id>
|
||||
<url>http://repo.md-5.net/content/repositories/releases/</url>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>Plugin MetricsExtension</id>
|
||||
@@ -136,7 +132,7 @@
|
||||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>1.7.10-R0.1-SNAPSHOT</version>
|
||||
<version>1.8-R0.1-SNAPSHOT</version>
|
||||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
@@ -160,19 +156,15 @@
|
||||
</dependencies>
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>md_5-releases</id>
|
||||
<url>http://repo.md-5.net/content/repositories/releases/</url>
|
||||
<id>drtshock-releases</id>
|
||||
<url>https://ci.drtshock.net/plugin/repository/everything/com/gmail/nossr50/mcMMO/</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>md_5-snapshots</id>
|
||||
<url>http://repo.md-5.net/content/repositories/snapshots/</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<ciManagement>
|
||||
<system>Jenkins</system>
|
||||
<url>http://ci.ecocitycraft.com/job/mcMMO</url>
|
||||
<url>https://ci.drtshock.net/job/mcmmo/</url>
|
||||
</ciManagement>
|
||||
</project>
|
||||
|
||||
@@ -18,6 +18,7 @@ public class TamingCommand extends SkillCommand {
|
||||
private String goreChance;
|
||||
private String goreChanceLucky;
|
||||
|
||||
private boolean canCharge;
|
||||
private boolean canBeastLore;
|
||||
private boolean canGore;
|
||||
private boolean canSharpenedClaws;
|
||||
@@ -43,6 +44,7 @@ public class TamingCommand extends SkillCommand {
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canCharge = Permissions.charge(player);
|
||||
canBeastLore = Permissions.secondaryAbilityEnabled(player, SecondaryAbility.BEAST_LORE);
|
||||
canCallWild = Permissions.callOfTheWild(player, EntityType.HORSE) || Permissions.callOfTheWild(player, EntityType.WOLF) || Permissions.callOfTheWild(player, EntityType.OCELOT);
|
||||
canEnvironmentallyAware = Permissions.secondaryAbilityEnabled(player, SecondaryAbility.ENVIROMENTALLY_AWARE);
|
||||
@@ -58,6 +60,10 @@ public class TamingCommand extends SkillCommand {
|
||||
protected List<String> effectsDisplay() {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canCharge) {
|
||||
messages.add(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Taming.Effect.20"), LocaleLoader.getString("Taming.Effect.21")));
|
||||
}
|
||||
|
||||
if (canBeastLore) {
|
||||
messages.add(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Taming.Effect.0"), LocaleLoader.getString("Taming.Effect.1")));
|
||||
}
|
||||
|
||||
@@ -280,6 +280,7 @@ public class Config extends AutoUpdateConfigLoader {
|
||||
/* Scoreboards */
|
||||
public boolean getPowerLevelTagsEnabled() { return config.getBoolean("Scoreboard.Power_Level_Tags", false); }
|
||||
public boolean getAllowKeepBoard() { return config.getBoolean("Scoreboard.Allow_Keep", true); }
|
||||
public int getTipsAmount() { return config.getInt("Scoreboard.Tips_Amount", 5); }
|
||||
public boolean getShowStatsAfterLogin() { return config.getBoolean("Scoreboard.Show_Stats_After_Login", false); }
|
||||
public boolean getScoreboardRainbows() { return config.getBoolean("Scoreboard.Rainbows", false); }
|
||||
public boolean getShowAbilityNames() { return config.getBoolean("Scoreboard.Ability_Names", true); }
|
||||
@@ -372,16 +373,21 @@ public class Config extends AutoUpdateConfigLoader {
|
||||
public Material getChimaeraItem() { return Material.matchMaterial(config.getString("Items.Chimaera_Wing.Item_Name", "Feather")); }
|
||||
public boolean getChimaeraEnabled() { return config.getBoolean("Items.Chimaera_Wing.Enabled", true); }
|
||||
public boolean getChimaeraPreventUseUnderground() { return config.getBoolean("Items.Chimaera_Wing.Prevent_Use_Underground", true); }
|
||||
public boolean getChimaeraUseBedSpawn() { return config.getBoolean("Items.Chimaera_Wing.Use_Bed_Spawn", true); }
|
||||
public int getChimaeraCooldown() { return config.getInt("Items.Chimaera_Wing.Cooldown", 240); }
|
||||
public int getChimaeraWarmup() { return config.getInt("Items.Chimaera_Wing.Warmup", 5); }
|
||||
public int getChimaeraRecentlyHurtCooldown() { return config.getInt("Items.Chimaera_Wing.RecentlyHurt_Cooldown", 60); }
|
||||
public boolean getChimaeraSoundEnabled() { return config.getBoolean("Items.Chimaera_Wing.Sound_Enabled", true); }
|
||||
|
||||
public boolean getFluxPickaxeEnabled() { return config.getBoolean("Items.Flux_Pickaxe.Enabled", true); }
|
||||
public boolean getFluxPickaxeSoundEnabled() { return config.getBoolean("Items.Flux_Pickaxe.Sound_Enabled", true); }
|
||||
|
||||
/* Particles */
|
||||
public boolean getAbilityActivationEffectEnabled() { return config.getBoolean("Particles.Ability_Activation", true); }
|
||||
public boolean getAbilityDeactivationEffectEnabled() { return config.getBoolean("Particles.Ability_Deactivation", true); }
|
||||
public boolean getDodgeEffectEnabled() { return config.getBoolean("Particles.Dodge", true); }
|
||||
public boolean getBleedEffectEnabled() { return config.getBoolean("Particles.Bleed", true); }
|
||||
public boolean getDodgeEffectEnabled() { return config.getBoolean("Particles.Dodge", true); }
|
||||
public boolean getFluxEffectEnabled() { return config.getBoolean("Particles.Flux", true); }
|
||||
public boolean getGreaterImpactEffectEnabled() { return config.getBoolean("Particles.Greater_Impact", true); }
|
||||
public boolean getCallOfTheWildEffectEnabled() { return config.getBoolean("Particles.Call_of_the_Wild", true); }
|
||||
public boolean getLevelUpEffectsEnabled() { return config.getBoolean("Particles.LevelUp_Enabled", true); }
|
||||
|
||||
@@ -198,6 +198,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
|
||||
public double getCombatXP(EntityType entity) { return config.getDouble("Experience.Combat.Multiplier." + StringUtils.getPrettyEntityTypeString(entity).replace(" ", "_")); }
|
||||
public double getAnimalsXP() { return config.getDouble("Experience.Combat.Multiplier.Animals", 1.0); }
|
||||
public double getWitherSkeletonXP() { return config.getDouble("Experience.Combat.Multiplier.Wither_Skeleton", 4.0); }
|
||||
public double getElderGuardianXP() { return config.getDouble("Experience.Combat.Multiplier.Elder_Guardian", 4.0); }
|
||||
|
||||
/* Materials */
|
||||
public int getXp(SkillType skill, Material material) { return config.getInt("Experience." + StringUtils.getCapitalized(skill.toString()) + "." + StringUtils.getPrettyItemString(material).replace(" ", "_")); }
|
||||
@@ -368,4 +369,5 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
|
||||
public int getWoodcuttingTreeXP(TreeSpecies species) { return config.getInt("Experience.Woodcutting." + StringUtils.getPrettyTreeSpeciesString(species).replace(" ", "_")); }
|
||||
public int getWoodcuttingXPHugeBrownMushroom() { return config.getInt("Experience.Woodcutting.Huge_Mushroom_Brown", 70); }
|
||||
public int getWoodcuttingXPHugeRedMushroom() { return config.getInt("Experience.Woodcutting.Huge_Mushroom_Red", 70); }
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -117,11 +118,14 @@ public class PotionConfig extends ConfigLoader {
|
||||
short dataValue = Short.parseShort(potion_section.getName());
|
||||
|
||||
String name = potion_section.getString("Name");
|
||||
if (name != null) {
|
||||
name = ChatColor.translateAlternateColorCodes('&', name);
|
||||
}
|
||||
|
||||
List<String> lore = new ArrayList<String>();
|
||||
if (potion_section.contains("Lore")) {
|
||||
for (String line : potion_section.getStringList("Lore")) {
|
||||
lore.add(line);
|
||||
lore.add(ChatColor.translateAlternateColorCodes('&', line));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.DyeColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
@@ -56,6 +57,7 @@ public class TreasureConfig extends ConfigLoader {
|
||||
public List<ShakeTreasure> shakeFromMushroomCow = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromPig = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromPigZombie = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromPlayer = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromSheep = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromSkeleton = new ArrayList<ShakeTreasure>();
|
||||
public List<ShakeTreasure> shakeFromSlime = new ArrayList<ShakeTreasure>();
|
||||
@@ -174,6 +176,11 @@ public class TreasureConfig extends ConfigLoader {
|
||||
else if (materialName.contains("INK_SACK")) {
|
||||
material = Material.INK_SACK;
|
||||
}
|
||||
else if (materialName.contains("INVENTORY")) {
|
||||
// Use magic material BED_BLOCK to know that we're grabbing something from the inventory and not a normal treasure
|
||||
shakeFromPlayer.add(new ShakeTreasure(new ItemStack(Material.BED_BLOCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel()));
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
material = Material.matchMaterial(materialName);
|
||||
}
|
||||
@@ -236,6 +243,22 @@ public class TreasureConfig extends ConfigLoader {
|
||||
|
||||
try {
|
||||
item = new Potion(PotionType.valueOf(potionType.toUpperCase().trim())).toItemStack(amount);
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Custom_Name")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getString(type + "." + treasureName + ".Custom_Name")));
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Lore")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
List<String> lore = new ArrayList<String>();
|
||||
for (String s : config.getStringList(type + "." + treasureName + ".Lore")) {
|
||||
lore.add(ChatColor.translateAlternateColorCodes('&', s));
|
||||
}
|
||||
itemMeta.setLore(lore);
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
reason.add("Invalid Potion_Type: " + potionType);
|
||||
@@ -249,6 +272,22 @@ public class TreasureConfig extends ConfigLoader {
|
||||
dye.setColor(DyeColor.valueOf(color.toUpperCase().trim()));
|
||||
|
||||
item = dye.toItemStack(amount);
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Custom_Name")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getString(type + "." + treasureName + ".Custom_Name")));
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Lore")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
List<String> lore = new ArrayList<String>();
|
||||
for (String s : config.getStringList(type + "." + treasureName + ".Lore")) {
|
||||
lore.add(ChatColor.translateAlternateColorCodes('&', s));
|
||||
}
|
||||
itemMeta.setLore(lore);
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
reason.add("Invalid Dye_Color: " + color);
|
||||
@@ -259,13 +298,17 @@ public class TreasureConfig extends ConfigLoader {
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Custom_Name")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
itemMeta.setDisplayName(config.getString(type + "." + treasureName + ".Custom_Name"));
|
||||
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getString(type + "." + treasureName + ".Custom_Name")));
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
|
||||
if (config.contains(type + "." + treasureName + ".Lore")) {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
itemMeta.setLore(config.getStringList(type + "." + treasureName + ".Lore"));
|
||||
List<String> lore = new ArrayList<String>();
|
||||
for (String s : config.getStringList(type + "." + treasureName + ".Lore")) {
|
||||
lore.add(ChatColor.translateAlternateColorCodes('&', s));
|
||||
}
|
||||
itemMeta.setLore(lore);
|
||||
item.setItemMeta(itemMeta);
|
||||
}
|
||||
}
|
||||
@@ -316,6 +359,9 @@ public class TreasureConfig extends ConfigLoader {
|
||||
else if (type.equals("Shake.PIG_ZOMBIE")) {
|
||||
shakeFromPigZombie.add(shakeTreasure);
|
||||
}
|
||||
else if (type.equals("Shake.PLAYER")) {
|
||||
shakeFromPlayer.add(shakeTreasure);
|
||||
}
|
||||
else if (type.equals("Shake.SHEEP")) {
|
||||
shakeFromSheep.add(shakeTreasure);
|
||||
}
|
||||
@@ -435,6 +481,11 @@ public class TreasureConfig extends ConfigLoader {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getInventoryStealEnabled() { return config.contains("Shake.PLAYER.INVENTORY"); }
|
||||
public boolean getInventoryStealStacks() { return config.getBoolean("Shake.PLAYER.INVENTORY.Whole_Stacks"); }
|
||||
public double getInventoryStealDropChance() { return config.getDouble("Shake.PLAYER.INVENTORY.Drop_Chance"); }
|
||||
public int getInventoryStealDropLevel() { return config.getInt("Shake.PLAYER.INVENTORY.Drop_Level"); }
|
||||
|
||||
public double getItemDropRate(int tier, Rarity rarity) { return config.getDouble("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString()); }
|
||||
public double getEnchantmentDropRate(int tier, Rarity rarity) { return config.getDouble("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity.toString()); }
|
||||
}
|
||||
|
||||
@@ -300,7 +300,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
writer.append(profile.getSkillXpLevel(SkillType.SWORDS)).append(":");
|
||||
writer.append(profile.getSkillXpLevel(SkillType.AXES)).append(":");
|
||||
writer.append(profile.getSkillXpLevel(SkillType.ACROBATICS)).append(":");
|
||||
writer.append(":");
|
||||
writer.append((int) profile.getAbilityDATS(AbilityType.CHARGE)).append(":");
|
||||
writer.append(profile.getSkillLevel(SkillType.TAMING)).append(":");
|
||||
writer.append(profile.getSkillXpLevel(SkillType.TAMING)).append(":");
|
||||
writer.append((int) profile.getAbilityDATS(AbilityType.BERSERK)).append(":");
|
||||
@@ -320,6 +320,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
writer.append(profile.getSkillLevel(SkillType.ALCHEMY)).append(":");
|
||||
writer.append(profile.getSkillXpLevel(SkillType.ALCHEMY)).append(":");
|
||||
writer.append(uuid.toString()).append(":");
|
||||
writer.append(profile.getScoreboardTipsShown()).append(":");
|
||||
writer.append("\r\n");
|
||||
}
|
||||
}
|
||||
@@ -407,7 +408,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
out.append("0:"); // SwordsXp
|
||||
out.append("0:"); // AxesXp
|
||||
out.append("0:"); // AcrobaticsXp
|
||||
out.append(":");
|
||||
out.append("0:"); // DATS
|
||||
out.append("0:"); // Taming
|
||||
out.append("0:"); // TamingXp
|
||||
out.append("0:"); // DATS
|
||||
@@ -426,7 +427,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
out.append("0:"); // Alchemy
|
||||
out.append("0:"); // AlchemyXp
|
||||
out.append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID
|
||||
|
||||
out.append("0:"); // Scoreboard tips shown
|
||||
// Add more in the same format as the line above
|
||||
|
||||
out.newLine();
|
||||
@@ -888,6 +889,15 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
}
|
||||
}
|
||||
|
||||
if (character[23].isEmpty()) {
|
||||
// Addition of "Charge" Taming ability
|
||||
// Version 1.5.02
|
||||
line = line.replace(character[23], "0:");
|
||||
if (oldVersion == null) {
|
||||
oldVersion = "1.5.02";
|
||||
}
|
||||
}
|
||||
|
||||
// If they're valid, rewrite them to the file.
|
||||
if (character.length == 42) {
|
||||
writer.append(line).append("\r\n");
|
||||
@@ -952,6 +962,14 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
oldVersion = "1.5.01";
|
||||
}
|
||||
}
|
||||
if (character.length <= 42) {
|
||||
// Addition of scoreboard tips auto disable
|
||||
// Version 1.5.02
|
||||
newLine.append("0").append(":");
|
||||
if (oldVersion == null) {
|
||||
oldVersion = "1.5.02";
|
||||
}
|
||||
}
|
||||
|
||||
// Remove any blanks that shouldn't be there, and validate the other fields
|
||||
String[] newCharacter = newLine.toString().split(":");
|
||||
@@ -1087,6 +1105,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
Map<SkillType, Float> skillsXp = new EnumMap<SkillType, Float>(SkillType.class); // Skill & XP
|
||||
Map<AbilityType, Integer> skillsDATS = new EnumMap<AbilityType, Integer>(AbilityType.class); // Ability & Cooldown
|
||||
MobHealthbarType mobHealthbarType;
|
||||
int scoreboardTipsShown;
|
||||
|
||||
// TODO on updates, put new values in a try{} ?
|
||||
|
||||
@@ -1104,7 +1123,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
skillsXp.put(SkillType.FISHING, (float) Integer.valueOf(character[35]));
|
||||
skillsXp.put(SkillType.ALCHEMY, (float) Integer.valueOf(character[40]));
|
||||
|
||||
// Taming - Unused
|
||||
skillsDATS.put(AbilityType.CHARGE, Integer.valueOf(character[23]));
|
||||
skillsDATS.put(AbilityType.SUPER_BREAKER, Integer.valueOf(character[32]));
|
||||
// Repair - Unused
|
||||
skillsDATS.put(AbilityType.TREE_FELLER, Integer.valueOf(character[28]));
|
||||
@@ -1131,8 +1150,14 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
|
||||
catch (Exception e) {
|
||||
uuid = null;
|
||||
}
|
||||
try {
|
||||
scoreboardTipsShown = Integer.valueOf(character[41]);
|
||||
}
|
||||
catch (Exception e) {
|
||||
scoreboardTipsShown = 0;
|
||||
}
|
||||
|
||||
return new PlayerProfile(character[0], uuid, skills, skillsXp, skillsDATS, mobHealthbarType);
|
||||
return new PlayerProfile(character[0], uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown);
|
||||
}
|
||||
|
||||
private Map<SkillType, Integer> getSkillMapFromLine(String[] character) {
|
||||
|
||||
@@ -14,8 +14,6 @@ import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.apache.tomcat.jdbc.pool.DataSource;
|
||||
import org.apache.tomcat.jdbc.pool.PoolProperties;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
@@ -30,6 +28,9 @@ import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
|
||||
import org.apache.tomcat.jdbc.pool.DataSource;
|
||||
import org.apache.tomcat.jdbc.pool.PoolProperties;
|
||||
|
||||
public final class SQLDatabaseManager implements DatabaseManager {
|
||||
private static final String ALL_QUERY_VERSION = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy";
|
||||
private String tablePrefix = Config.getInstance().getMySQLTablePrefix();
|
||||
@@ -314,24 +315,26 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
statement.close();
|
||||
|
||||
statement = connection.prepareStatement("UPDATE " + tablePrefix + "cooldowns SET "
|
||||
+ " mining = ?, woodcutting = ?, unarmed = ?"
|
||||
+ " taming = ?, mining = ?, woodcutting = ?, unarmed = ?"
|
||||
+ ", herbalism = ?, excavation = ?, swords = ?"
|
||||
+ ", axes = ?, blast_mining = ? WHERE user_id = ?");
|
||||
statement.setLong(1, profile.getAbilityDATS(AbilityType.SUPER_BREAKER));
|
||||
statement.setLong(2, profile.getAbilityDATS(AbilityType.TREE_FELLER));
|
||||
statement.setLong(3, profile.getAbilityDATS(AbilityType.BERSERK));
|
||||
statement.setLong(4, profile.getAbilityDATS(AbilityType.GREEN_TERRA));
|
||||
statement.setLong(5, profile.getAbilityDATS(AbilityType.GIGA_DRILL_BREAKER));
|
||||
statement.setLong(6, profile.getAbilityDATS(AbilityType.SERRATED_STRIKES));
|
||||
statement.setLong(7, profile.getAbilityDATS(AbilityType.SKULL_SPLITTER));
|
||||
statement.setLong(8, profile.getAbilityDATS(AbilityType.BLAST_MINING));
|
||||
statement.setInt(9, id);
|
||||
statement.setLong(1, profile.getAbilityDATS(AbilityType.CHARGE));
|
||||
statement.setLong(2, profile.getAbilityDATS(AbilityType.SUPER_BREAKER));
|
||||
statement.setLong(3, profile.getAbilityDATS(AbilityType.TREE_FELLER));
|
||||
statement.setLong(4, profile.getAbilityDATS(AbilityType.BERSERK));
|
||||
statement.setLong(5, profile.getAbilityDATS(AbilityType.GREEN_TERRA));
|
||||
statement.setLong(6, profile.getAbilityDATS(AbilityType.GIGA_DRILL_BREAKER));
|
||||
statement.setLong(7, profile.getAbilityDATS(AbilityType.SERRATED_STRIKES));
|
||||
statement.setLong(8, profile.getAbilityDATS(AbilityType.SKULL_SPLITTER));
|
||||
statement.setLong(9, profile.getAbilityDATS(AbilityType.BLAST_MINING));
|
||||
statement.setInt(10, id);
|
||||
success = (statement.executeUpdate() != 0);
|
||||
statement.close();
|
||||
|
||||
statement = connection.prepareStatement("UPDATE " + tablePrefix + "huds SET mobhealthbar = ? WHERE user_id = ?");
|
||||
statement = connection.prepareStatement("UPDATE " + tablePrefix + "huds SET mobhealthbar = ?, scoreboardtips = ? WHERE user_id = ?");
|
||||
statement.setString(1, profile.getMobHealthbarType() == null ? Config.getInstance().getMobHealthbarDefault().name() : profile.getMobHealthbarType().name());
|
||||
statement.setInt(2, id);
|
||||
statement.setInt(2, profile.getScoreboardTipsShown());
|
||||
statement.setInt(3, id);
|
||||
success = (statement.executeUpdate() != 0);
|
||||
statement.close();
|
||||
}
|
||||
@@ -640,7 +643,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
+ "s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, s.alchemy, "
|
||||
+ "e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, e.alchemy, "
|
||||
+ "c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, "
|
||||
+ "h.mobhealthbar, u.uuid "
|
||||
+ "h.mobhealthbar, h.scoreboardtips, u.uuid "
|
||||
+ "FROM " + tablePrefix + "users u "
|
||||
+ "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) "
|
||||
+ "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) "
|
||||
@@ -729,7 +732,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
+ "s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, s.alchemy, "
|
||||
+ "e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, e.alchemy, "
|
||||
+ "c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, "
|
||||
+ "h.mobhealthbar, u.uuid "
|
||||
+ "h.mobhealthbar, h.scoreboardtips, u.uuid "
|
||||
+ "FROM " + tablePrefix + "users u "
|
||||
+ "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) "
|
||||
+ "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) "
|
||||
@@ -930,7 +933,6 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
* Checks that the database structure is present and correct
|
||||
*/
|
||||
private void checkStructure() {
|
||||
|
||||
PreparedStatement statement = null;
|
||||
Statement createStatement = null;
|
||||
ResultSet resultSet = null;
|
||||
@@ -965,6 +967,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
createStatement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "huds` ("
|
||||
+ "`user_id` int(10) unsigned NOT NULL,"
|
||||
+ "`mobhealthbar` varchar(50) NOT NULL DEFAULT '" + Config.getInstance().getMobHealthbarDefault() + "',"
|
||||
+ "`scoreboardtips` int(10) NOT NULL DEFAULT '0',"
|
||||
+ "PRIMARY KEY (`user_id`)) "
|
||||
+ "DEFAULT CHARSET=latin1;");
|
||||
createStatement.close();
|
||||
@@ -1165,6 +1168,10 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
checkUpgradeAddUUIDs(statement);
|
||||
return;
|
||||
|
||||
case ADD_SCOREBOARD_TIPS:
|
||||
checkUpgradeAddScoreboardTips(statement);
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -1206,9 +1213,10 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
statement.execute();
|
||||
statement.close();
|
||||
|
||||
statement = connection.prepareStatement("INSERT IGNORE INTO " + tablePrefix + "huds (user_id, mobhealthbar) VALUES (?, ?)");
|
||||
statement = connection.prepareStatement("INSERT IGNORE INTO " + tablePrefix + "huds (user_id, mobhealthbar, scoreboardtips) VALUES (?, ?, ?)");
|
||||
statement.setInt(1, id);
|
||||
statement.setString(2, Config.getInstance().getMobHealthbarDefault().name());
|
||||
statement.setInt(3, 0);
|
||||
statement.execute();
|
||||
statement.close();
|
||||
}
|
||||
@@ -1233,6 +1241,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
Map<AbilityType, Integer> skillsDATS = new EnumMap<AbilityType, Integer>(AbilityType.class); // Ability & Cooldown
|
||||
MobHealthbarType mobHealthbarType;
|
||||
UUID uuid;
|
||||
int scoreboardTipsShown;
|
||||
|
||||
final int OFFSET_SKILLS = 0; // TODO update these numbers when the query
|
||||
// changes (a new skill is added)
|
||||
@@ -1268,7 +1277,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
skillsXp.put(SkillType.FISHING, result.getFloat(OFFSET_XP + 12));
|
||||
skillsXp.put(SkillType.ALCHEMY, result.getFloat(OFFSET_XP + 13));
|
||||
|
||||
// Taming - Unused - result.getInt(OFFSET_DATS + 1)
|
||||
skillsDATS.put(AbilityType.CHARGE, result.getInt(OFFSET_DATS + 1));
|
||||
skillsDATS.put(AbilityType.SUPER_BREAKER, result.getInt(OFFSET_DATS + 2));
|
||||
// Repair - Unused - result.getInt(OFFSET_DATS + 3)
|
||||
skillsDATS.put(AbilityType.TREE_FELLER, result.getInt(OFFSET_DATS + 4));
|
||||
@@ -1282,12 +1291,19 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
skillsDATS.put(AbilityType.BLAST_MINING, result.getInt(OFFSET_DATS + 12));
|
||||
|
||||
try {
|
||||
mobHealthbarType = MobHealthbarType.valueOf(result.getString(OFFSET_OTHER + 2));
|
||||
mobHealthbarType = MobHealthbarType.valueOf(result.getString(OFFSET_OTHER + 1));
|
||||
}
|
||||
catch (Exception e) {
|
||||
mobHealthbarType = Config.getInstance().getMobHealthbarDefault();
|
||||
}
|
||||
|
||||
try {
|
||||
scoreboardTipsShown = result.getInt(OFFSET_OTHER + 2);
|
||||
}
|
||||
catch (Exception e) {
|
||||
scoreboardTipsShown = 0;
|
||||
}
|
||||
|
||||
try {
|
||||
uuid = UUID.fromString(result.getString(OFFSET_OTHER + 3));
|
||||
}
|
||||
@@ -1295,7 +1311,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
uuid = null;
|
||||
}
|
||||
|
||||
return new PlayerProfile(playerName, uuid, skills, skillsXp, skillsDATS, mobHealthbarType);
|
||||
return new PlayerProfile(playerName, uuid, skills, skillsXp, skillsDATS, mobHealthbarType, scoreboardTipsShown);
|
||||
}
|
||||
|
||||
private void printErrors(SQLException ex) {
|
||||
@@ -1352,6 +1368,16 @@ public final class SQLDatabaseManager implements DatabaseManager {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkUpgradeAddScoreboardTips(final Statement statement) throws SQLException {
|
||||
try {
|
||||
statement.executeQuery("SELECT `scoreboardtips` FROM `" + tablePrefix + "huds` LIMIT 1");
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for scoreboard tips...");
|
||||
statement.executeUpdate("ALTER TABLE `" + tablePrefix + "huds` ADD `scoreboardtips` int(10) NOT NULL DEFAULT '0' ;");
|
||||
}
|
||||
}
|
||||
|
||||
private void checkUpgradeAddSQLIndexes(final Statement statement) throws SQLException {
|
||||
ResultSet resultSet = null;
|
||||
|
||||
|
||||
@@ -9,5 +9,6 @@ public enum UpgradeType {
|
||||
DROP_SPOUT,
|
||||
ADD_ALCHEMY,
|
||||
ADD_UUIDS,
|
||||
ADD_UUIDS_PARTY;
|
||||
ADD_UUIDS_PARTY,
|
||||
ADD_SCOREBOARD_TIPS;
|
||||
}
|
||||
|
||||
@@ -5,12 +5,11 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.gmail.nossr50.runnables.skills.BleedTimerTask;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
@@ -31,6 +30,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
|
||||
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;
|
||||
@@ -46,6 +46,7 @@ import com.gmail.nossr50.skills.repair.RepairManager;
|
||||
import com.gmail.nossr50.skills.salvage.SalvageManager;
|
||||
import com.gmail.nossr50.skills.smelting.SmeltingManager;
|
||||
import com.gmail.nossr50.skills.swords.SwordsManager;
|
||||
import com.gmail.nossr50.skills.taming.Taming;
|
||||
import com.gmail.nossr50.skills.taming.TamingManager;
|
||||
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
|
||||
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
|
||||
@@ -53,6 +54,8 @@ import com.gmail.nossr50.util.EventUtils;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.StringUtils;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
|
||||
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
|
||||
import com.gmail.nossr50.util.skills.PerksUtils;
|
||||
import com.gmail.nossr50.util.skills.SkillUtils;
|
||||
@@ -739,6 +742,21 @@ public class McMMOPlayer {
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity livingEntity = null;
|
||||
|
||||
if (ability == AbilityType.CHARGE) {
|
||||
livingEntity = this.getTamingManager().getTarget(20);
|
||||
|
||||
if (!this.getTamingManager().isEntityTypeNearby(EntityType.WOLF, Taming.wolfCommandRange, true)) {
|
||||
player.sendMessage(LocaleLoader.getString("Taming.Skills.Charge.NoneNearby"));
|
||||
return;
|
||||
}
|
||||
else if (livingEntity == null) {
|
||||
player.sendMessage(LocaleLoader.getString("Taming.Skills.Charge.NoTarget"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (EventUtils.callPlayerAbilityActivateEvent(player, skill).isCancelled()) {
|
||||
return;
|
||||
}
|
||||
@@ -762,6 +780,10 @@ public class McMMOPlayer {
|
||||
SkillUtils.handleAbilitySpeedIncrease(player);
|
||||
}
|
||||
|
||||
if (ability == AbilityType.CHARGE) {
|
||||
this.getTamingManager().handleCharge(livingEntity);
|
||||
}
|
||||
|
||||
new AbilityDisableTask(this, ability).runTaskLater(mcMMO.p, ticks * Misc.TICK_CONVERSION_FACTOR);
|
||||
}
|
||||
|
||||
@@ -803,6 +825,11 @@ public class McMMOPlayer {
|
||||
}
|
||||
}
|
||||
|
||||
if (ability == AbilityType.CHARGE && !this.getTamingManager().isEntityTypeNearby(EntityType.WOLF, Taming.wolfCommandRange, true)) {
|
||||
player.sendMessage(LocaleLoader.getString("Taming.Skills.Charge.NoneNearby"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Config.getInstance().getAbilityMessagesEnabled()) {
|
||||
player.sendMessage(tool.getRaiseTool());
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ public class PlayerProfile {
|
||||
|
||||
/* HUDs */
|
||||
private MobHealthbarType mobHealthbarType;
|
||||
private int scoreboardTipsShown;
|
||||
|
||||
/* Skill Data */
|
||||
private final Map<SkillType, Integer> skills = new HashMap<SkillType, Integer>(); // Skill & Level
|
||||
@@ -48,6 +49,7 @@ public class PlayerProfile {
|
||||
this.playerName = playerName;
|
||||
|
||||
mobHealthbarType = Config.getInstance().getMobHealthbarDefault();
|
||||
scoreboardTipsShown = 0;
|
||||
|
||||
for (AbilityType abilityType : AbilityType.values()) {
|
||||
abilityDATS.put(abilityType, 0);
|
||||
@@ -70,10 +72,11 @@ public class PlayerProfile {
|
||||
this.loaded = isLoaded;
|
||||
}
|
||||
|
||||
public PlayerProfile(String playerName, UUID uuid, Map<SkillType, Integer> levelData, Map<SkillType, Float> xpData, Map<AbilityType, Integer> cooldownData, MobHealthbarType mobHealthbarType) {
|
||||
public PlayerProfile(String playerName, UUID uuid, Map<SkillType, Integer> levelData, Map<SkillType, Float> xpData, Map<AbilityType, Integer> cooldownData, MobHealthbarType mobHealthbarType, int scoreboardTipsShown) {
|
||||
this.playerName = playerName;
|
||||
this.uuid = uuid;
|
||||
this.mobHealthbarType = mobHealthbarType;
|
||||
this.scoreboardTipsShown = scoreboardTipsShown;
|
||||
|
||||
skills.putAll(levelData);
|
||||
skillsXp.putAll(xpData);
|
||||
@@ -92,7 +95,7 @@ public class PlayerProfile {
|
||||
}
|
||||
|
||||
// TODO should this part be synchronized?
|
||||
PlayerProfile profileCopy = new PlayerProfile(playerName, uuid, ImmutableMap.copyOf(skills), ImmutableMap.copyOf(skillsXp), ImmutableMap.copyOf(abilityDATS), mobHealthbarType);
|
||||
PlayerProfile profileCopy = new PlayerProfile(playerName, uuid, ImmutableMap.copyOf(skills), ImmutableMap.copyOf(skillsXp), ImmutableMap.copyOf(abilityDATS), mobHealthbarType, scoreboardTipsShown);
|
||||
changed = !mcMMO.getDatabaseManager().saveUser(profileCopy);
|
||||
|
||||
if (changed) {
|
||||
@@ -127,9 +130,25 @@ public class PlayerProfile {
|
||||
}
|
||||
|
||||
public void setMobHealthbarType(MobHealthbarType mobHealthbarType) {
|
||||
changed = true;
|
||||
|
||||
this.mobHealthbarType = mobHealthbarType;
|
||||
}
|
||||
|
||||
public int getScoreboardTipsShown() {
|
||||
return scoreboardTipsShown;
|
||||
}
|
||||
|
||||
public void setScoreboardTipsShown(int scoreboardTipsShown) {
|
||||
changed = true;
|
||||
|
||||
this.scoreboardTipsShown = scoreboardTipsShown;
|
||||
}
|
||||
|
||||
public void increaseTipsShown() {
|
||||
setScoreboardTipsShown(getScoreboardTipsShown() + 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Cooldowns
|
||||
*/
|
||||
|
||||
@@ -60,6 +60,13 @@ public enum AbilityType {
|
||||
"Swords.Skills.SS.Refresh",
|
||||
"Swords.Skills.SS.Other.Off"),
|
||||
|
||||
CHARGE(
|
||||
"Taming.Skills.Charge.On",
|
||||
"Taming.Skills.Charge.Off",
|
||||
"Taming.Skills.Charge.Other.On",
|
||||
"Taming.Skills.Charge.Refresh",
|
||||
"Taming.Skills.Charge.Other.Off"),
|
||||
|
||||
/**
|
||||
* Has cooldown - but has to share a skill with Super Breaker, so needs special treatment
|
||||
*/
|
||||
@@ -152,6 +159,9 @@ public enum AbilityType {
|
||||
case BLAST_MINING:
|
||||
return Permissions.remoteDetonation(player);
|
||||
|
||||
case CHARGE:
|
||||
return Permissions.charge(player);
|
||||
|
||||
case GIGA_DRILL_BREAKER:
|
||||
return Permissions.gigaDrillBreaker(player);
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public enum SkillType {
|
||||
SALVAGE(SalvageManager.class, Color.ORANGE, ImmutableList.of(SecondaryAbility.ADVANCED_SALVAGE, SecondaryAbility.ARCANE_SALVAGE)),
|
||||
SMELTING(SmeltingManager.class, Color.YELLOW, ImmutableList.of(SecondaryAbility.FLUX_MINING, SecondaryAbility.FUEL_EFFICIENCY, SecondaryAbility.SECOND_SMELT)),
|
||||
SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), AbilityType.SERRATED_STRIKES, ToolType.SWORD, ImmutableList.of(SecondaryAbility.BLEED, SecondaryAbility.COUNTER)),
|
||||
TAMING(TamingManager.class, Color.PURPLE, ImmutableList.of(SecondaryAbility.BEAST_LORE, SecondaryAbility.CALL_OF_THE_WILD, SecondaryAbility.ENVIROMENTALLY_AWARE, SecondaryAbility.FAST_FOOD, SecondaryAbility.GORE, SecondaryAbility.HOLY_HOUND, SecondaryAbility.SHARPENED_CLAWS, SecondaryAbility.SHOCK_PROOF, SecondaryAbility.THICK_FUR, SecondaryAbility.PUMMEL)),
|
||||
TAMING(TamingManager.class, Color.PURPLE, AbilityType.CHARGE, ToolType.BONE, ImmutableList.of(SecondaryAbility.BEAST_LORE, SecondaryAbility.CALL_OF_THE_WILD, SecondaryAbility.ENVIROMENTALLY_AWARE, SecondaryAbility.FAST_FOOD, SecondaryAbility.GORE, SecondaryAbility.HOLY_HOUND, SecondaryAbility.SHARPENED_CLAWS, SecondaryAbility.SHOCK_PROOF, SecondaryAbility.THICK_FUR, SecondaryAbility.PUMMEL)),
|
||||
UNARMED(UnarmedManager.class, Color.BLACK, AbilityType.BERSERK, ToolType.FISTS, ImmutableList.of(SecondaryAbility.BLOCK_CRACKER, SecondaryAbility.DEFLECT, SecondaryAbility.DISARM, SecondaryAbility.IRON_ARM, SecondaryAbility.IRON_GRIP)),
|
||||
WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, AbilityType.TREE_FELLER, ToolType.AXE, ImmutableList.of(SecondaryAbility.LEAF_BLOWER, SecondaryAbility.WOODCUTTING_DOUBLE_DROPS));
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.gmail.nossr50.util.ItemUtils;
|
||||
|
||||
public enum ToolType {
|
||||
AXE(LocaleLoader.getString("Axes.Ability.Lower"), LocaleLoader.getString("Axes.Ability.Ready")),
|
||||
BONE(LocaleLoader.getString("Taming.Ability.Lower"), LocaleLoader.getString("Taming.Ability.Ready")),
|
||||
FISTS(LocaleLoader.getString("Unarmed.Ability.Lower"), LocaleLoader.getString("Unarmed.Ability.Ready")),
|
||||
HOE(LocaleLoader.getString("Herbalism.Ability.Lower"), LocaleLoader.getString("Herbalism.Ability.Ready")),
|
||||
PICKAXE(LocaleLoader.getString("Mining.Ability.Lower"), LocaleLoader.getString("Mining.Ability.Ready")),
|
||||
@@ -41,6 +42,9 @@ public enum ToolType {
|
||||
case AXE:
|
||||
return ItemUtils.isAxe(itemStack);
|
||||
|
||||
case BONE:
|
||||
return itemStack.getType() == Material.BONE;
|
||||
|
||||
case FISTS:
|
||||
return itemStack.getType() == Material.AIR;
|
||||
|
||||
|
||||
@@ -260,7 +260,7 @@ public class BlockListener implements Listener {
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ItemUtils.isPickaxe(heldItem) && !heldItem.containsEnchantment(Enchantment.SILK_TOUCH)) {
|
||||
else if (ItemUtils.isFluxPickaxe(heldItem) && !heldItem.containsEnchantment(Enchantment.SILK_TOUCH)) {
|
||||
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
|
||||
|
||||
if (smeltingManager.canUseFluxMining(blockState)) {
|
||||
|
||||
@@ -39,6 +39,7 @@ import com.gmail.nossr50.datatypes.party.Party;
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.datatypes.skills.AbilityType;
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.datatypes.skills.ToolType;
|
||||
import com.gmail.nossr50.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.party.ShareHandler;
|
||||
import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
|
||||
@@ -522,10 +523,10 @@ public class PlayerListener implements Listener {
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
ItemStack heldItem = player.getItemInHand();
|
||||
Block block = event.getClickedBlock();
|
||||
|
||||
switch (event.getAction()) {
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
Block block = event.getClickedBlock();
|
||||
BlockState blockState = block.getState();
|
||||
|
||||
/* ACTIVATION & ITEM CHECKS */
|
||||
@@ -576,6 +577,7 @@ public class PlayerListener implements Listener {
|
||||
mcMMOPlayer.processAbilityActivation(SkillType.SWORDS);
|
||||
mcMMOPlayer.processAbilityActivation(SkillType.UNARMED);
|
||||
mcMMOPlayer.processAbilityActivation(SkillType.WOODCUTTING);
|
||||
mcMMOPlayer.processAbilityActivation(SkillType.TAMING);
|
||||
}
|
||||
|
||||
/* ITEM CHECKS */
|
||||
@@ -590,6 +592,12 @@ public class PlayerListener implements Listener {
|
||||
break;
|
||||
|
||||
case LEFT_CLICK_AIR:
|
||||
if (mcMMOPlayer.getToolPreparationMode(ToolType.BONE) && ToolType.BONE.inHand(heldItem)) {
|
||||
mcMMOPlayer.checkAbilityActivation(SkillType.TAMING);
|
||||
}
|
||||
|
||||
// Fallthrough
|
||||
|
||||
case LEFT_CLICK_BLOCK:
|
||||
|
||||
if (!player.isSneaking()) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
@@ -51,6 +52,7 @@ import com.gmail.nossr50.skills.repair.repairables.SimpleRepairableManager;
|
||||
import com.gmail.nossr50.skills.salvage.salvageables.Salvageable;
|
||||
import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager;
|
||||
import com.gmail.nossr50.skills.salvage.salvageables.SimpleSalvageableManager;
|
||||
import com.gmail.nossr50.skills.smelting.SmeltingManager;
|
||||
import com.gmail.nossr50.util.ChimaeraWing;
|
||||
import com.gmail.nossr50.util.HolidayManager;
|
||||
import com.gmail.nossr50.util.LogFilter;
|
||||
@@ -455,6 +457,14 @@ public class mcMMO extends JavaPlugin {
|
||||
if (Config.getInstance().getChimaeraEnabled()) {
|
||||
getServer().addRecipe(ChimaeraWing.getChimaeraWingRecipe());
|
||||
}
|
||||
|
||||
if (Config.getInstance().getFluxPickaxeEnabled()) {
|
||||
getServer().addRecipe(SmeltingManager.getFluxPickaxeRecipe(Material.DIAMOND_PICKAXE));
|
||||
getServer().addRecipe(SmeltingManager.getFluxPickaxeRecipe(Material.GOLD_PICKAXE));
|
||||
getServer().addRecipe(SmeltingManager.getFluxPickaxeRecipe(Material.IRON_PICKAXE));
|
||||
getServer().addRecipe(SmeltingManager.getFluxPickaxeRecipe(Material.STONE_PICKAXE));
|
||||
getServer().addRecipe(SmeltingManager.getFluxPickaxeRecipe(Material.WOOD_PICKAXE));
|
||||
}
|
||||
}
|
||||
|
||||
private void scheduleTasks() {
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.gmail.nossr50.runnables.skills;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
@@ -11,20 +11,20 @@ import com.gmail.nossr50.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
|
||||
public class KrakenAttackTask extends BukkitRunnable {
|
||||
private Creature kraken;
|
||||
private LivingEntity kraken;
|
||||
private Player player;
|
||||
private Location location;
|
||||
private final boolean GLOBAL_EFFECTS = AdvancedConfig.getInstance().getKrakenGlobalEffectsEnabled();
|
||||
private final String DEFEAT_MESSAGE = AdvancedConfig.getInstance().getPlayerDefeatMessage();
|
||||
private final String ESCAPE_MESSAGE = AdvancedConfig.getInstance().getPlayerEscapeMessage();
|
||||
|
||||
public KrakenAttackTask(Creature kraken, Player player) {
|
||||
this.kraken = kraken;
|
||||
public KrakenAttackTask(LivingEntity kraken2, Player player) {
|
||||
this.kraken = kraken2;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public KrakenAttackTask(Creature kraken, Player player, Location location) {
|
||||
this.kraken = kraken;
|
||||
public KrakenAttackTask(LivingEntity kraken2, Player player, Location location) {
|
||||
this.kraken = kraken2;
|
||||
this.player = player;
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
@@ -110,6 +110,9 @@ public final class Fishing {
|
||||
case PIG_ZOMBIE:
|
||||
return TreasureConfig.getInstance().shakeFromPigZombie;
|
||||
|
||||
case PLAYER:
|
||||
return TreasureConfig.getInstance().shakeFromPlayer;
|
||||
|
||||
case SHEEP:
|
||||
return TreasureConfig.getInstance().shakeFromSheep;
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Fish;
|
||||
@@ -29,6 +28,8 @@ import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.entity.ThrownPotion;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.bukkit.material.Wool;
|
||||
import org.bukkit.potion.Potion;
|
||||
import org.bukkit.potion.PotionType;
|
||||
@@ -135,7 +136,7 @@ public class FishingManager extends SkillManager {
|
||||
player.setItemInHand(null);
|
||||
}
|
||||
|
||||
Creature kraken = (Creature) world.spawnEntity(player.getEyeLocation(), (Misc.getRandom().nextInt(100) == 0 ? EntityType.CHICKEN : EntityType.SQUID));
|
||||
LivingEntity kraken = (LivingEntity) world.spawnEntity(player.getEyeLocation(), (Misc.getRandom().nextInt(100) == 0 ? EntityType.CHICKEN : EntityType.SQUID));
|
||||
kraken.setCustomName(AdvancedConfig.getInstance().getKrakenName());
|
||||
|
||||
if (!kraken.isValid()) {
|
||||
@@ -394,6 +395,45 @@ public class FishingManager extends SkillManager {
|
||||
|
||||
// Extra processing depending on the mob and drop type
|
||||
switch (target.getType()) {
|
||||
case PLAYER:
|
||||
Player targetPlayer = (Player) target;
|
||||
|
||||
switch (drop.getType()) {
|
||||
case SKULL_ITEM:
|
||||
drop.setDurability((short) 3);
|
||||
SkullMeta skullMeta = (SkullMeta) drop.getItemMeta();
|
||||
skullMeta.setOwner(targetPlayer.getName());
|
||||
drop.setItemMeta(skullMeta);
|
||||
break;
|
||||
|
||||
case BED_BLOCK:
|
||||
if (TreasureConfig.getInstance().getInventoryStealEnabled()) {
|
||||
PlayerInventory inventory = targetPlayer.getInventory();
|
||||
int length = inventory.getContents().length;
|
||||
int slot = Misc.getRandom().nextInt(length);
|
||||
drop = inventory.getItem(slot);
|
||||
|
||||
if (drop == null) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (TreasureConfig.getInstance().getInventoryStealStacks()) {
|
||||
inventory.setItem(slot, null);
|
||||
}
|
||||
else {
|
||||
inventory.setItem(slot, (drop.getAmount() > 1) ? new ItemStack(drop.getType(), drop.getAmount() - 1) : null);
|
||||
drop.setAmount(1);
|
||||
}
|
||||
|
||||
targetPlayer.updateInventory();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SHEEP:
|
||||
Sheep sheep = (Sheep) target;
|
||||
|
||||
@@ -437,7 +477,7 @@ public class FishingManager extends SkillManager {
|
||||
}
|
||||
|
||||
Misc.dropItem(target.getLocation(), drop);
|
||||
CombatUtils.dealDamage(target, Math.max(target.getMaxHealth() / 4, 1)); // Make it so you can shake a mob no more than 4 times.
|
||||
CombatUtils.dealDamage(target, Math.max(target.getMaxHealth() / 4, 1), getPlayer()); // Make it so you can shake a mob no more than 4 times.
|
||||
applyXpGain(ExperienceConfig.getInstance().getFishingShakeXP(), XPGainReason.PVE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ public class Mining {
|
||||
*
|
||||
* @param blockState The {@link BlockState} to check ability activation for
|
||||
*/
|
||||
protected static int getBlockXp(BlockState blockState) {
|
||||
public static int getBlockXp(BlockState blockState) {
|
||||
Material blockType = blockState.getType();
|
||||
int xp = ExperienceConfig.getInstance().getXp(SkillType.MINING, blockType != Material.GLOWING_REDSTONE_ORE ? blockType : Material.REDSTONE_ORE);
|
||||
|
||||
|
||||
@@ -1,12 +1,20 @@
|
||||
package com.gmail.nossr50.skills.smelting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.FurnaceBurnEvent;
|
||||
import org.bukkit.inventory.FurnaceRecipe;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.gmail.nossr50.config.Config;
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
@@ -14,10 +22,12 @@ import com.gmail.nossr50.datatypes.skills.XPGainReason;
|
||||
import com.gmail.nossr50.events.skills.secondaryabilities.SecondaryAbilityWeightedActivationCheckEvent;
|
||||
import com.gmail.nossr50.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.skills.SkillManager;
|
||||
import com.gmail.nossr50.skills.mining.Mining;
|
||||
import com.gmail.nossr50.skills.smelting.Smelting.Tier;
|
||||
import com.gmail.nossr50.util.BlockUtils;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
|
||||
import com.gmail.nossr50.util.skills.SkillUtils;
|
||||
|
||||
public class SmeltingManager extends SkillManager {
|
||||
@@ -64,16 +74,46 @@ public class SmeltingManager extends SkillManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We need to distribute Mining XP here, because the block break event gets cancelled
|
||||
applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE);
|
||||
|
||||
SkillUtils.handleDurabilityChange(getPlayer().getItemInHand(), Config.getInstance().getAbilityToolDamage());
|
||||
|
||||
Misc.dropItems(blockState.getLocation(), item, isSecondSmeltSuccessful() ? 2 : 1);
|
||||
|
||||
blockState.setType(Material.AIR);
|
||||
player.sendMessage(LocaleLoader.getString("Smelting.FluxMining.Success"));
|
||||
|
||||
if (Config.getInstance().getFluxPickaxeSoundEnabled()) {
|
||||
player.playSound(blockState.getLocation(), Sound.FIZZ, Misc.FIZZ_VOLUME, Misc.getFizzPitch());
|
||||
}
|
||||
|
||||
ParticleEffectUtils.playFluxEffect(blockState.getLocation());
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static ItemStack getFluxPickaxe(Material material, int amount) {
|
||||
ItemStack itemStack = new ItemStack(material, amount);
|
||||
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setDisplayName(ChatColor.GOLD + LocaleLoader.getString("Item.FluxPickaxe.Name"));
|
||||
|
||||
List<String> itemLore = new ArrayList<String>();
|
||||
itemLore.add("mcMMO Item");
|
||||
itemLore.add(LocaleLoader.getString("Item.FluxPickaxe.Lore.1"));
|
||||
itemLore.add(LocaleLoader.getString("Item.FluxPickaxe.Lore.2", Smelting.fluxMiningUnlockLevel));
|
||||
itemMeta.setLore(itemLore);
|
||||
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
public static FurnaceRecipe getFluxPickaxeRecipe(Material material) {
|
||||
return new FurnaceRecipe(getFluxPickaxe(material, 1), material);
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases burn time for furnace fuel.
|
||||
*
|
||||
|
||||
@@ -83,7 +83,7 @@ public class SwordsManager extends SkillManager {
|
||||
}
|
||||
|
||||
if (SkillUtils.activationSuccessful(SecondaryAbility.COUNTER, getPlayer(), getSkillLevel(), activationChance)) {
|
||||
CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier);
|
||||
CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier, getPlayer());
|
||||
|
||||
getPlayer().sendMessage(LocaleLoader.getString("Swords.Combat.Countered"));
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ public class Taming {
|
||||
public static int thickFurUnlockLevel = AdvancedConfig.getInstance().getThickFurUnlock();
|
||||
public static double thickFurModifier = AdvancedConfig.getInstance().getThickFurModifier();
|
||||
|
||||
public static double wolfCommandRange = 10.0;
|
||||
|
||||
public static int wolfXp = ExperienceConfig.getInstance().getTamingXPWolf();
|
||||
public static int ocelotXp = ExperienceConfig.getInstance().getTamingXPOcelot();
|
||||
public static int horseXp = ExperienceConfig.getInstance().getTamingXPHorse();
|
||||
|
||||
@@ -15,6 +15,8 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.entity.Wolf;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.gmail.nossr50.config.AdvancedConfig;
|
||||
@@ -208,6 +210,81 @@ public class TamingManager extends SkillManager {
|
||||
owner.sendMessage(LocaleLoader.getString("Taming.Listener.Wolf"));
|
||||
}
|
||||
|
||||
public void handleCharge(LivingEntity livingEntity) {
|
||||
attackTarget(livingEntity, true);
|
||||
}
|
||||
|
||||
public LivingEntity getTarget(double range) {
|
||||
Player player = getPlayer();
|
||||
LivingEntity target = null;
|
||||
|
||||
for (Entity entity : player.getNearbyEntities(range, range, range)) {
|
||||
if (!(entity instanceof LivingEntity) || entity.getType() == EntityType.WOLF || entity.getType() == EntityType.CREEPER || entity.equals(player)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!player.hasLineOfSight(entity)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
target = (LivingEntity) entity;
|
||||
break;
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make nearby wolves owned by the player attack the target
|
||||
*
|
||||
* @param target The LivingEntity to attack
|
||||
*
|
||||
* @return true if the attack was successful, false otherwise
|
||||
*/
|
||||
public boolean attackTarget(LivingEntity target, boolean charge) {
|
||||
boolean success = false;
|
||||
|
||||
for (Entity entity : getNearbyEntities(EntityType.WOLF, Taming.wolfCommandRange, true)) {
|
||||
Wolf wolf = (Wolf) entity;
|
||||
|
||||
if (charge) {
|
||||
charge(wolf);
|
||||
}
|
||||
|
||||
wolf.setTarget(target);
|
||||
success = true;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
public boolean attackTarget(LivingEntity target) {
|
||||
return attackTarget(target, false);
|
||||
}
|
||||
|
||||
public void charge(Wolf wolf) {
|
||||
int duration = 0;
|
||||
int amplifier = 0;
|
||||
|
||||
if (wolf.hasPotionEffect(PotionEffectType.SPEED)) {
|
||||
for (PotionEffect effect : wolf.getActivePotionEffects()) {
|
||||
if (effect.getType() != PotionEffectType.SPEED) {
|
||||
continue;
|
||||
}
|
||||
|
||||
duration = effect.getDuration();
|
||||
amplifier = effect.getAmplifier();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int ticks = 20 * 5;
|
||||
|
||||
PotionEffect abilityBuff = new PotionEffect(PotionEffectType.SPEED, duration + ticks, amplifier + 3);
|
||||
wolf.addPotionEffect(abilityBuff, true);
|
||||
ParticleEffectUtils.playSmokeEffect(wolf);
|
||||
}
|
||||
|
||||
public void pummel(LivingEntity target, Wolf wolf) {
|
||||
double chance = 10 / activationChance;
|
||||
SecondaryAbilityWeightedActivationCheckEvent event = new SecondaryAbilityWeightedActivationCheckEvent(getPlayer(), SecondaryAbility.PUMMEL, chance);
|
||||
@@ -228,25 +305,6 @@ public class TamingManager extends SkillManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void attackTarget(LivingEntity target) {
|
||||
double range = 5;
|
||||
Player player = getPlayer();
|
||||
|
||||
for (Entity entity : player.getNearbyEntities(range, range, range)) {
|
||||
if (entity.getType() != EntityType.WOLF) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Wolf wolf = (Wolf) entity;
|
||||
|
||||
if (!wolf.isTamed() || (wolf.getOwner() != player) || wolf.isSitting()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
wolf.setTarget(target);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the Call of the Wild ability.
|
||||
*
|
||||
@@ -265,7 +323,8 @@ public class TamingManager extends SkillManager {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!rangeCheck(type)) {
|
||||
if (isEntityTypeNearby(type)) {
|
||||
player.sendMessage(Taming.getCallOfTheWildFailureMessage(type));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -277,6 +336,7 @@ public class TamingManager extends SkillManager {
|
||||
return;
|
||||
}
|
||||
|
||||
location = Misc.getLocationOffset(location, 1);
|
||||
LivingEntity entity = (LivingEntity) player.getWorld().spawnEntity(location, type);
|
||||
|
||||
FakeEntityTameEvent event = new FakeEntityTameEvent(entity, player);
|
||||
@@ -335,22 +395,41 @@ public class TamingManager extends SkillManager {
|
||||
player.playSound(location, Sound.FIREWORK_LARGE_BLAST2, 1F, 0.5F);
|
||||
}
|
||||
|
||||
private boolean rangeCheck(EntityType type) {
|
||||
double range = Config.getInstance().getTamingCOTWRange();
|
||||
public List<Entity> getNearbyEntities(EntityType type, double range, boolean wolfReady) {
|
||||
List<Entity> nearbyEntities = new ArrayList<Entity>();
|
||||
Player player = getPlayer();
|
||||
|
||||
if (range == 0) {
|
||||
return true;
|
||||
return nearbyEntities;
|
||||
}
|
||||
|
||||
for (Entity entity : player.getNearbyEntities(range, range, range)) {
|
||||
if (entity.getType() == type) {
|
||||
player.sendMessage(Taming.getCallOfTheWildFailureMessage(type));
|
||||
return false;
|
||||
EntityType entityType = entity.getType();
|
||||
|
||||
if (entityType != type) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entityType == EntityType.WOLF && wolfReady) {
|
||||
Wolf wolf = (Wolf) entity;
|
||||
|
||||
if (!wolf.isTamed() || (wolf.getOwner() != player) || wolf.isSitting()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
nearbyEntities.add(entity);
|
||||
}
|
||||
|
||||
return true;
|
||||
return nearbyEntities;
|
||||
}
|
||||
|
||||
public boolean isEntityTypeNearby(EntityType type) {
|
||||
return isEntityTypeNearby(type, Config.getInstance().getTamingCOTWRange(), false);
|
||||
}
|
||||
|
||||
public boolean isEntityTypeNearby(EntityType type, double range, boolean wolfReady) {
|
||||
return !getNearbyEntities(type, range, wolfReady).isEmpty();
|
||||
}
|
||||
|
||||
private boolean summonAmountCheck(EntityType entityType) {
|
||||
|
||||
@@ -4,18 +4,13 @@ import java.util.UUID;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.AnimalTamer;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.gmail.nossr50.config.Config;
|
||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.skills.CombatUtils;
|
||||
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
|
||||
|
||||
@@ -23,18 +18,11 @@ public class TrackedTamingEntity extends BukkitRunnable {
|
||||
private LivingEntity livingEntity;
|
||||
private UUID id;
|
||||
private int length;
|
||||
private Player owner;
|
||||
|
||||
protected TrackedTamingEntity(LivingEntity livingEntity) {
|
||||
this.livingEntity = livingEntity;
|
||||
this.id = livingEntity.getUniqueId();
|
||||
|
||||
AnimalTamer tamer = ((Tameable)livingEntity).getOwner();
|
||||
|
||||
if (tamer != null && tamer instanceof Player) {
|
||||
this.owner = (Player) tamer;
|
||||
}
|
||||
|
||||
int tamingCOTWLength = Config.getInstance().getTamingCOTWLength(livingEntity.getType());
|
||||
|
||||
if (tamingCOTWLength > 0) {
|
||||
@@ -52,14 +40,7 @@ public class TrackedTamingEntity extends BukkitRunnable {
|
||||
CombatUtils.dealDamage(livingEntity, livingEntity.getMaxHealth(), DamageCause.SUICIDE, livingEntity);
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(owner)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(owner);
|
||||
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
|
||||
|
||||
tamingManager.removeFromTracker(this);
|
||||
TamingManager.removeFromTracker(this);
|
||||
this.cancel();
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.bukkit.material.SmoothBrick;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.gmail.nossr50.skills.repair.Repair;
|
||||
import com.gmail.nossr50.skills.salvage.Salvage;
|
||||
import com.gmail.nossr50.util.temp.DualSupport;
|
||||
|
||||
public final class BlockUtils {
|
||||
private BlockUtils() {}
|
||||
@@ -63,10 +64,11 @@ public final class BlockUtils {
|
||||
case DROPPER:
|
||||
case HOPPER:
|
||||
case TRAPPED_CHEST:
|
||||
case IRON_DOOR:
|
||||
return false;
|
||||
|
||||
default:
|
||||
return !isMcMMOAnvil(blockState) && !mcMMO.getModManager().isCustomAbilityBlock(blockState);
|
||||
return DualSupport.canActivateAbilities(blockState) && !isMcMMOAnvil(blockState) && !mcMMO.getModManager().isCustomAbilityBlock(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,7 +166,7 @@ public final class BlockUtils {
|
||||
return true;
|
||||
|
||||
default:
|
||||
return isOre(blockState) || mcMMO.getModManager().isCustomMiningBlock(blockState);
|
||||
return DualSupport.affectedBySuperBreaker(blockState) || isOre(blockState) || mcMMO.getModManager().isCustomMiningBlock(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ public final class ChimaeraWing {
|
||||
public static void chimaeraExecuteTeleport() {
|
||||
Player player = mcMMOPlayer.getPlayer();
|
||||
|
||||
if (player.getBedSpawnLocation() != null) {
|
||||
if (Config.getInstance().getChimaeraUseBedSpawn() && player.getBedSpawnLocation() != null) {
|
||||
player.teleport(player.getBedSpawnLocation());
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -694,4 +694,13 @@ public final class ItemUtils {
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
return itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + LocaleLoader.getString("Item.ChimaeraWing.Name"));
|
||||
}
|
||||
|
||||
public static boolean isFluxPickaxe(ItemStack item) {
|
||||
if (!isMcMMOItem(item)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta itemMeta = item.getItemMeta();
|
||||
return itemMeta.hasDisplayName() && itemMeta.getDisplayName().equals(ChatColor.GOLD + LocaleLoader.getString("Item.FluxPickaxe.Name"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ public final class MaterialUtils {
|
||||
case REDSTONE_ORE:
|
||||
case EMERALD_ORE:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return mcMMO.getModManager().isCustomOre(data);
|
||||
}
|
||||
|
||||
@@ -144,6 +144,23 @@ public final class Misc {
|
||||
return "UnknownMods";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a random location near the specified location
|
||||
*/
|
||||
public static Location getLocationOffset(Location location, double strength) {
|
||||
double blockX = location.getBlockX();
|
||||
double blockZ = location.getBlockZ();
|
||||
|
||||
double distance;
|
||||
distance = strength * random.nextDouble();
|
||||
blockX = (random.nextBoolean()) ? blockX + (distance) : blockX - (distance);
|
||||
|
||||
distance = strength * random.nextDouble();
|
||||
blockZ = (random.nextBoolean()) ? blockZ + (distance) : blockZ - (distance);
|
||||
|
||||
return new Location(location.getWorld(), blockX, location.getY(), blockZ);
|
||||
}
|
||||
|
||||
public static Random getRandom() {
|
||||
return random;
|
||||
}
|
||||
|
||||
@@ -182,6 +182,7 @@ public final class Permissions {
|
||||
public static boolean serratedStrikes(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.swords.serratedstrikes"); }
|
||||
|
||||
/* TAMING */
|
||||
public static boolean charge(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.taming.charge"); }
|
||||
public static boolean callOfTheWild(Permissible permissible, EntityType type) { return permissible.hasPermission("mcmmo.ability.taming.callofthewild." + type.toString().toLowerCase()); }
|
||||
public static boolean renamePets(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.taming.callofthewild.renamepets"); }
|
||||
|
||||
|
||||
@@ -199,6 +199,13 @@ public class ScoreboardWrapper {
|
||||
|
||||
// TODO is there any way to do the time that looks acceptable?
|
||||
// player.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Timer", StringUtils.capitalize(sidebarType.toString().toLowerCase()), ticks / 20F));
|
||||
|
||||
PlayerProfile profile = UserManager.getPlayer(player).getProfile();
|
||||
|
||||
if (profile.getScoreboardTipsShown() >= Config.getInstance().getTipsAmount()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tippedKeep) {
|
||||
tippedKeep = true;
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Tip.Keep"));
|
||||
@@ -206,6 +213,7 @@ public class ScoreboardWrapper {
|
||||
else if (!tippedClear) {
|
||||
tippedClear = true;
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Tip.Clear"));
|
||||
profile.increaseTipsShown();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.bukkit.entity.Animals;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Guardian;
|
||||
import org.bukkit.entity.IronGolem;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -47,7 +48,7 @@ import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.MobHealthbarUtils;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
|
||||
import com.gmail.nossr50.util.temp.CompatableGuardianXP;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
public final class CombatUtils {
|
||||
@@ -484,6 +485,7 @@ public final class CombatUtils {
|
||||
case WITCH:
|
||||
case WITHER:
|
||||
case ZOMBIE:
|
||||
case ENDERMITE:
|
||||
baseXP = ExperienceConfig.getInstance().getCombatXP(type);
|
||||
break;
|
||||
|
||||
@@ -505,6 +507,18 @@ public final class CombatUtils {
|
||||
break;
|
||||
|
||||
default:
|
||||
if (type.name().equals("RABBIT")) {
|
||||
baseXP = ExperienceConfig.getInstance().getAnimalsXP();
|
||||
break;
|
||||
}
|
||||
if (type.name().equals("ENDERMITE")) {
|
||||
baseXP = ExperienceConfig.getInstance().getCombatXP(type);
|
||||
break;
|
||||
}
|
||||
if (type.name().equals("GUARDIAN")) {
|
||||
baseXP = CompatableGuardianXP.get(target);
|
||||
break;
|
||||
}
|
||||
baseXP = 1.0;
|
||||
mcMMO.getModManager().addCustomEntity(target);
|
||||
break;
|
||||
|
||||
@@ -37,6 +37,14 @@ public final class ParticleEffectUtils {
|
||||
playSmokeEffect(player);
|
||||
}
|
||||
|
||||
public static void playFluxEffect(Location location) {
|
||||
if (!Config.getInstance().getFluxEffectEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
location.getWorld().playEffect(location, Effect.MOBSPAWNER_FLAMES, 1);
|
||||
}
|
||||
|
||||
public static void playSmokeEffect(LivingEntity livingEntity) {
|
||||
Location location = livingEntity.getEyeLocation();
|
||||
World world = livingEntity.getWorld();
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.gmail.nossr50.util.temp;
|
||||
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Guardian;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
|
||||
public class CompatableGuardianXP {
|
||||
public static double get(Entity target) {
|
||||
if (((Guardian) target).isElder()) {
|
||||
return ExperienceConfig.getInstance().getElderGuardianXP();
|
||||
} else {
|
||||
return ExperienceConfig.getInstance().getCombatXP(EntityType.GUARDIAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
19
src/main/java/com/gmail/nossr50/util/temp/DualSupport.java
Normal file
19
src/main/java/com/gmail/nossr50/util/temp/DualSupport.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package com.gmail.nossr50.util.temp;
|
||||
|
||||
import org.bukkit.block.BlockState;
|
||||
|
||||
public class DualSupport {
|
||||
|
||||
public static boolean canActivateAbilities(BlockState blockState) {
|
||||
String mat = blockState.getType().name();
|
||||
return !mat.equals("IRON_TRAPDOOR") && !mat.equals("ACACIA_DOOR") && !mat.equals("SPRUCE_DOOR") && !mat.equals("BIRCH_DOOR")
|
||||
&& !mat.equals("JUNGLE_DOOR") && !mat.equals("DARK_OAK_DOOR") && !mat.equals("ACACIA_FENCE") && !mat.equals("DARK_OAK_FENCE")
|
||||
&& !mat.equals("BIRCH_FENCE") && !mat.equals("JUNGLE_FENCE") && !mat.equals("ARMOR_STAND");
|
||||
}
|
||||
|
||||
public static boolean affectedBySuperBreaker(BlockState blockState) {
|
||||
String mat = blockState.getType().name();
|
||||
return mat.equals("PRISMARINE") || mat.equals("RED_SANDSTONE");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -45,6 +45,10 @@ Scoreboard:
|
||||
# Show the /mcstats scoreboard automatically after logging in
|
||||
Show_Stats_After_Login: false
|
||||
|
||||
# Show scoreboard tips 5 times. Tips are only displayed once for every login session.
|
||||
# Set to 0 to never show these tips.
|
||||
Tips_Amount: 5
|
||||
|
||||
# Add some more color on the board :-)
|
||||
Rainbows: false
|
||||
|
||||
@@ -207,10 +211,15 @@ Items:
|
||||
Warmup: 5
|
||||
RecentlyHurt_Cooldown: 60
|
||||
Prevent_Use_Underground: true
|
||||
# Attempt to use the bed spawn, if one is available
|
||||
Use_Bed_Spawn: true
|
||||
Use_Cost: 1
|
||||
Recipe_Cost: 5
|
||||
Item_Name: FEATHER
|
||||
Sound_Enabled: true
|
||||
Flux_Pickaxe:
|
||||
Enabled: true
|
||||
Sound_Enabled: true
|
||||
|
||||
#
|
||||
# Settings for Parties
|
||||
@@ -258,6 +267,7 @@ Abilities:
|
||||
Cooldowns:
|
||||
Berserk: 240
|
||||
Blast_Mining: 60
|
||||
Charge: 240
|
||||
Giga_Drill_Breaker: 240
|
||||
Green_Terra: 240
|
||||
Serrated_Strikes: 240
|
||||
@@ -267,6 +277,7 @@ Abilities:
|
||||
Max_Seconds:
|
||||
Berserk: 0
|
||||
Blast_Mining: 0
|
||||
Charge: 0
|
||||
Giga_Drill_Breaker: 0
|
||||
Green_Terra: 0
|
||||
Serrated_Strikes: 0
|
||||
@@ -479,8 +490,9 @@ Particles:
|
||||
LargeFireworks: true
|
||||
|
||||
# Use particle effect when these abilities trigger
|
||||
Dodge: true
|
||||
Bleed: true
|
||||
Dodge: true
|
||||
Flux: true
|
||||
Greater_Impact: true
|
||||
Call_of_the_Wild: true
|
||||
|
||||
|
||||
@@ -196,6 +196,8 @@ Experience:
|
||||
Sandstone: 30
|
||||
Stained_Clay: 50
|
||||
Stone: 30
|
||||
Red_Sandstone: 100
|
||||
Prismarine: 70
|
||||
Repair:
|
||||
Base: 1000.0
|
||||
Wood: 0.6
|
||||
@@ -241,3 +243,6 @@ Experience:
|
||||
Witch: 0.0
|
||||
Iron_Golem: 2.0
|
||||
Wither_Skeleton: 4.0
|
||||
Endermite: 2.0
|
||||
Guardian: 3.0
|
||||
Elder_Guardian: 4.0
|
||||
|
||||
@@ -333,6 +333,8 @@ Taming.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (SHOCK PROOF)
|
||||
Taming.Ability.Locked.3=LOCKED UNTIL {0}+ SKILL (SHARPENED CLAWS)
|
||||
Taming.Ability.Locked.4=LOCKED UNTIL {0}+ SKILL (FAST FOOD SERVICE)
|
||||
Taming.Ability.Locked.5=LOCKED UNTIL {0}+ SKILL (HOLY HOUND)
|
||||
Taming.Ability.Lower=[[GRAY]]**YOUR WOLVES STAND DOWN**
|
||||
Taming.Ability.Ready=[[GREEN]]**YOU READY YOUR WOLVES**
|
||||
Taming.Combat.Chance.Gore=[[RED]]Gore Chance: [[YELLOW]]{0}
|
||||
Taming.Effect.0=Beast Lore
|
||||
Taming.Effect.1=Bone-whacking inspects wolves & ocelots
|
||||
@@ -353,9 +355,18 @@ Taming.Effect.6=Environmentally Aware
|
||||
Taming.Effect.7=Cactus/Lava Phobia, Fall DMG Immune
|
||||
Taming.Effect.8=Thick Fur
|
||||
Taming.Effect.9=DMG Reduction, Fire Resistance
|
||||
Taming.Effect.20=Charge (ABILITY)
|
||||
Taming.Effect.21=Target Enemy, Wolf Speed++
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]Your wolf scurries back to you...
|
||||
Taming.Listener=Taming:
|
||||
Taming.SkillName=TAMING
|
||||
Taming.Skills.Charge.Off=[[RED]]**Charge has worn off**
|
||||
Taming.Skills.Charge.On=[[GREEN]]**CHARGE ACTIVATED**
|
||||
Taming.Skills.Charge.Other.Off=[[RED]]Charge[[GREEN]] has worn off for [[YELLOW]]{0}
|
||||
Taming.Skills.Charge.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Charge!
|
||||
Taming.Skills.Charge.Refresh=[[GREEN]]Your [[YELLOW]]Charge [[GREEN]]ability is refreshed!
|
||||
Taming.Skills.Charge.NoneNearby=[[RED]]**NO AVAILABLE WOLVES NEARBY**
|
||||
Taming.Skills.Charge.NoTarget=[[RED]]**NO TARGET FOUND**
|
||||
Taming.Skillup=[[YELLOW]]Taming skill increased by {0}. Total ({1})
|
||||
Taming.Summon.Complete=[[GREEN]]Summoning complete
|
||||
Taming.Summon.Lifespan=[[YELLOW]] (Lifespan: {0}s)
|
||||
@@ -835,6 +846,9 @@ Item.ChimaeraWing.Name=Chimaera Wing
|
||||
Item.ChimaeraWing.Lore=[[GRAY]]Teleports you to your bed.
|
||||
Item.Generic.Wait=[[RED]]You need to wait before you can use this again! [[YELLOW]]({0}s)
|
||||
Item.Injured.Wait=You were injured recently and must wait to use this. [[YELLOW]]({0}s)
|
||||
Item.FluxPickaxe.Name=Flux Pickaxe
|
||||
Item.FluxPickaxe.Lore.1=[[GRAY]]Has a chance of instantly smelting ores.
|
||||
Item.FluxPickaxe.Lore.2=[[GRAY]]Requires Smelting level {0}+
|
||||
|
||||
#TELEPORTATION
|
||||
Teleport.Commencing=[[GRAY]]Commencing teleport in [[GOLD]]({0}) [[GRAY]]seconds, please stand still...
|
||||
@@ -908,7 +922,6 @@ Smelting.Effect.4=Vanilla XP Boost
|
||||
Smelting.Effect.5=Increase vanilla XP gained while smelting
|
||||
Smelting.Effect.6=Flux Mining
|
||||
Smelting.Effect.7=Chance for ores to be instantly smelted while mining
|
||||
Smelting.FluxMining.Success=[[GREEN]]That ore smelted itself!
|
||||
Smelting.Listener=Smelting:
|
||||
Smelting.SkillName=SMELTING
|
||||
|
||||
|
||||
@@ -536,6 +536,7 @@ permissions:
|
||||
mcmmo.ability.taming.sharpenedclaws: true
|
||||
mcmmo.ability.taming.shockproof: true
|
||||
mcmmo.ability.taming.thickfur: true
|
||||
mcmmo.ability.taming.charge: true
|
||||
mcmmo.ability.taming.pummel: true
|
||||
mcmmo.ability.taming.beastlore:
|
||||
description: Allows access to the Beast Lore ability
|
||||
@@ -578,6 +579,8 @@ permissions:
|
||||
description: Allows access to the Shock Proof ability
|
||||
mcmmo.ability.taming.thickfur:
|
||||
description: Allows access to the Thick Fur ability
|
||||
mcmmo.ability.taming.charge:
|
||||
description: Allows access to the Charge ability
|
||||
mcmmo.ability.taming.pummel:
|
||||
description: Allows access to the Pummel ability
|
||||
mcmmo.ability.unarmed.*:
|
||||
|
||||
@@ -793,6 +793,16 @@ Shake:
|
||||
XP: 0
|
||||
Drop_Chance: 50.0
|
||||
Drop_Level: 0
|
||||
PLAYER:
|
||||
SKULL_ITEM:
|
||||
Amount: 1
|
||||
XP: 0
|
||||
Drop_Chance: 0.0
|
||||
Drop_Level: 0
|
||||
INVENTORY:
|
||||
Whole_Stacks: false
|
||||
Drop_Chance: 0.0
|
||||
Drop_Level: 0
|
||||
SHEEP:
|
||||
WOOL:
|
||||
Amount: 3
|
||||
|
||||
Reference in New Issue
Block a user