Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable

This commit is contained in:
nossr50 2019-06-26 21:55:41 -07:00
commit b069480244
50 changed files with 1771 additions and 1301 deletions

View File

@ -194,6 +194,131 @@ Version 2.2.0
Added API method to grab the level cap of a skill by its PrimarySkillType ENUM definition
Added API method to check if a skill was being level capped
Added 'UndefinedSkillBehaviour' for trying to use a method that has no behaviour defined for the provided skill
Version 2.1.91
mcMMO is now more compatible with plugins that spawn arrows in unexpected ways, this fixes some NPE in mcMMO when using certain plugins
Version 2.1.90
Salvaged items now travel much slower towards the player
Books from salvage will now travel towards the player
Salvaged items travelling towards you will now have their speed adjusted based on distance
Common Materials found when mining have had their XP gains reduced and rare materials have had their XP gains increased
Diamond Ore has had its XP increased from 750 to 2400
Gold Ore has had its XP increased from 350 to 1300
Iron Ore has had its XP increased from 250 to 900
Lapis Ore has had its XP increased from 400 to 800
Nether Quartz Ore has had its XP increased from 100 to 300
Redstone Ore has had its XP increased from 150 to 600
Blue_Ice has had its default XP value reduced to 15
Packed_Ice has had its default XP value reduced to 15
Netherrack has had its default XP value reduced to 15
Coal Ore has had its XP increased from 100 to 400
Stone has had its XP decreased from 30 to 15
Granite has had its XP decreased from 30 to 15
Andesite has had its XP decreased from 30 to 15
Diorite has had its XP decreased from 30 to 15
End Stone has had its XP decreased from 30 to 15
Glow Stone has had its XP decreased from 30 to 15
End Bricks has had its XP decreased from 200 to 50
NOTES:
You can either apply the default XP changes manually to experience.yml or delete it to generate a new file
Sorry about salvaged items traveling too quickly, in testing on my LAN server with ideal conditions they always entered my inventory and never shot past me so the high speed of the items was not an apparent issue.
I've tested the new changes to how they travel towards you pretty thoroughly, they never go fast enough to go past you and they adjust their speed based on distance to you with some speed limitations.
In testing the new tweaks work well whether the salvage anvil is above, below, or at the same height as you.
I'll be tweaking XP values across all skills more carefully in the upcoming content patch due after 2.2. Some tweaks to XP gains will be applied for 2.2.
Version 2.1.89
Many changes were made to this version that affect default values in the config, read the notes carefully if you wish to apply these changes. They are optional.
mcMMO is compatible with the new 1.14.3, in addition to this it is still compatible with 1.14.2, 1.14.1, 1.14, and 1.13.2. This did not require any changes to be made to mcMMO, but I thought I'd add this to the notes for those wondering.
RetroMode is the default level scaling mode again
The default level for players has been changed back to 0 from 1 (you can change it back to 1 by editing 'Skills.General.StartingLevel' in advanced.yml) if you wish to apply this change read the notes
Super Abilities now scale in length up to level 100/1000 instead of 50/500 by default (you can edit this in advanced.yml under 'Skills.General.Ability.Length.xxx')
Early Game Boost now only applies when leveling from level 0 to level 1
Removed the config setting 'MaxLevelMultiplier' from experience.yml as it is no longer used.
When finding a treasure via Excavation players have a 1-8% chance to have a small amount vanilla experience orbs to be found alongside the treasure, the chance and number of orbs are based on the players Archaeology rank
Tweaked the locale string 'Excavation.SubSkill.Archaeology.Description'
Added locale string 'Excavation.SubSkill.Archaeology.Stat'
Added locale string 'Excavation.SubSkill.Archaeology.Stat.Extra'
Tweaked the locale string 'Fishing.SubSkill.MasterAngler.Stat'
The interval at which you can gain Acrobatics XP from fall damage has been reduced to 3 seconds from 10 seconds, this will be configurable in 2.2.
When using WorldGuard (WG) with mcMMO, mcMMO now examines WG more carefully to determine if it is a compatible version or not, see the notes. Keep in mind WG is optional and not needed to run mcMMO.
Fixed a bug that could result in Tree Feller failing to remove parts of a tree in snowy biomes. (This fix won't apply retroactively to old trees, see the notes)
Updated Japanese locale (thanks snake)
Tree Feller and other Super Abilities will damage tools with the Enchantment named 'Durability/Unbreaking' again, this does not apply to the NBT tag named Ubreakable (Unbreakable NBT tag is safe from damage however, try not to confuse them as they share similar names)
Added new setting 'ExploitFix.TreeFellerReducedXP' to experience.yml
Tree Feller will no longer give full XP for each block destroyed and instead give diminishing returns on XP for each block removed. You can turn this off by setting 'ExploitFix.TreeFellerReducedXP' in experience.yml to false
Many skills which used to unlock at level 5/50 now unlock at level 1 instead
Arrow Retrieval now unlocks at level 1 in both Standard and RetroMode
Skill Shot now unlocks at level 1 in both Standard and RetroMode
Dodge now unlocks at level 1 in both Standard and RetroMode
Critical Strikes now unlocks at level 1 in both Standard and RetroMode
Armor Impact now unlocks at level 1 in both Standard and RetroMode
Beast Lore now unlocks at level 1 in both Standard and RetroMode
Call Of The Wild now unlocks at level 1 in both Standard and RetroMode
Scrap Collector now unlocks at level 1 in both Standard and RetroMode
Treasure Hunter now unlocks at level 1 in both Standard and RetroMode
Rupture now unlocks at level 1 in both Standard and RetroMode
Iron Arm Style now unlocks at level 1 in both Standard and RetroMode
Harvest Lumber now unlocks at level 1 in both Standard and RetroMode
Archaeology now unlocks at level 1 in both Standard and RetroMode
Repair Mastery now unlocks at level 1 in both Standard and RetroMode
Double Drops (Herbalism and Mining) now have ranks and unlock at level 1 in both Standard and RetroMode
Concoctions rank 2 now unlocks at Level 1 for both Standard and RetroMode
Serrated Strikes now unlocks at levels 5/50 instead of 10/100
Berserk now unlocks at levels 5/50 instead of 10/100
NOTES:
I'm looking into adding 1.12.2 support sooner than expected.
Editing your config files is not required for this patch (and never will be), however I would highly recommend it. Read the notes below this line carefully.
If you want to update to this patch easily and you don't mind default config values, delete skillranks.yml, advanced.yml, and experience.yml before starting your server with 2.1.89 of mcMMO applied.
Many skills now unlock at level 1 and the default starting level is back to 0. It is recommended you change this number from 1 to 0 manually by editing 'Skills.General.StartingLevel' in advanced.yml or deleting advanced.yml and generating a new file when 2.1.89 starts.
It is recommended you make the manual edits to skillranks.yml to apply this change or delete skillranks.yml and a new one will be generated once you start 2.1.89.
Early Game Boost was used to help players get to level 5 quickly by boosting their XP until they got there, this caused some confusion as they appeared to be 'learning a skill' for multiple levels, on RetroMode this lasted until level 50.
I have changed Early Game Boost to only last from level 0-1 on both RetroMode and Standard, and now important skills are unlocked at level 1.
I was going to wait until 2.2 was done to deploy this change, but 2.2 is some time away and the previous system was causing some confusion.
Early Game Boost gives players extra XP for skills that are level 0, you can turn this system off by setting 'EarlyGameBoost.Enabled' in experience.yml to false
Early Game Boost will show 'Learning a new skill...' if XP bars are enabled
https://mcmmo.org/wiki/World_guard - A list of WG flags supported by mcMMO.
It is not necessary to have WG installed, but if you do have WG installed mcMMO hooks into it to provide some additional features.
Previously mcMMO used to determine if WG was compatible just by checking to see if it was version 7 of WG, however version 7 of WG is not guaranteed to be compatible as necessary classes that mcMMO hooks into were added during its development and some users are still running early dev versions of WG7.
In order to decrease the chance of error, mcMMO now uses reflection when checking to see if WG is compatible in addition to checking its version number, if its not compatible mcMMO will print a message and refrain from hooking into WG.
WG is an optional dependency for mcMMO, and unfortunately before this change if mcMMO thought you were running a compatible version of WG and it turned out you weren't then mcMMO would not function correctly.
Archaeology does something now, it will be tweaked again in the future. Previously rank 1 of Archaeology was required to find treasures but that was all it did, now each rank of Archaeology also adds a small chance to find experience orbs when a player finds treasure.
In a prior patch I removed damage on tools if they had Unbreakable NBT or Unbreaking Enchantment, at the time I made this change I did not realize they were different things and just shared the same name, this patch fixes this mistake. My intention was to prevent damage on tools with the NBT unbreakable tag which makes an item never suffer from durability loss.
mcMMO reduces damage to tools from super abilities if they have the "Durability/Unbreaking" enchantment already, this behaviour has been in mcMMO for a long time.
Tree Feller will now give reduced XP per block destroyed by Tree Feller and will never go below 1 XP per block, you can turn this off with 'ExploitFix.TreeFellerReducedXP' in experience.yml
There was a bug fixed in this patch that prevents an issue where Tree Feller was not removing all blocks left behind, unfortunately this will only affect new trees made in the world. The only trees that suffered from this bug were ones in snowy areas that had snow form on them.
RetroMode and Standard mode will be getting renamed in 2.2, probably to something like 1000-scale and 100-scale respectively.
Retro Mode was accidental genius is the short reason for the change to make it the default level scaling for mcMMO again.
Standard Mode is not going anywhere, it is just opt-in now instead of the default.
If you delete config.yml you will need to turn RetroMode off to use Standard mode as mcMMO doesn't keep track of what level scaling you are using outside of that.
Version 2.1.88
mcMMO is now more compatible with a plugin named Project Korra
mcMMO will no longer process combat triggers for damage at or below 0
Version 2.1.87
(Level caps are not on by default in mcMMO, this is something you can turn on)
Players who reach either the power level cap or skill level cap will now be informed that they have done so
XP Bars will no longer be sent to players who have reached the power level or skill level cap respectively
Level up messages will no longer be sent to players who have reached the power level or skill level cap respectively
Fixed a bug where mcMMO would send level up notifications to a player if the custom level up event from mcMMO was cancelled
New locale strings 'LevelCap.PowerLevel' & 'LevelCap.Skill'
Version 2.1.86
Players will no longer be told they got a perfect result when salvaging if they are below max skill level
Salvage results will now travel towards the player instead of moving in a random direction

View File

@ -228,7 +228,7 @@
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-core</artifactId>
<version>7.0.0-SNAPSHOT</version>
<version>7.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>

View File

@ -744,7 +744,7 @@ public final class ExperienceAPI {
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getLevelCap(String skillType) {
return mcMMO.getPlayerLevelingSettings().getLevelCap(getSkillType(skillType));
return mcMMO.getPlayerLevelingSettings().getSkillLevelCap(getSkillType(skillType));
}
/**
@ -757,7 +757,7 @@ public final class ExperienceAPI {
* @throws InvalidSkillException if the given skill is not valid
*/
public static int getLevelCap(PrimarySkillType skillType) {
return mcMMO.getPlayerLevelingSettings().getLevelCap(skillType);
return mcMMO.getPlayerLevelingSettings().getSkillLevelCap(skillType);
}
/**
@ -767,7 +767,7 @@ public final class ExperienceAPI {
* @return true if the skill has a level cap
*/
public static boolean isSkillLevelCapped(PrimarySkillType skillType) {
return mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(skillType);
return mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(skillType);
}
/**
@ -778,7 +778,7 @@ public final class ExperienceAPI {
* @return the overall power level cap
*/
public static int getPowerLevelCap() {
return mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevel().getLevelCap();
return mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevelSettings().getLevelCap();
}
/**

View File

@ -0,0 +1,13 @@
package com.gmail.nossr50.commands.admin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
public class PlayerDebug implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return false;
}
}

View File

@ -30,7 +30,7 @@ public class AddlevelsCommand extends ExperienceCommand {
return;
}
EventUtils.handleLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND);
EventUtils.tryLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND);
}
@Override

View File

@ -36,7 +36,7 @@ public class MmoeditCommand extends ExperienceCommand {
return;
}
EventUtils.handleLevelChangeEventEdit(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel);
EventUtils.tryLevelEditEvent(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel);
}
@Override

View File

@ -131,7 +131,7 @@ public class SkillresetCommand implements TabExecutor {
return;
}
EventUtils.handleLevelChangeEvent(player, skill, levelsRemoved, xpRemoved, false, XPGainReason.COMMAND);
EventUtils.tryLevelChangeEvent(player, skill, levelsRemoved, xpRemoved, false, XPGainReason.COMMAND);
}
protected boolean permissionsCheckSelf(CommandSender sender) {

View File

@ -48,9 +48,9 @@ public class McstatsCommand implements TabExecutor {
CommandUtils.printCombatSkills(player);
CommandUtils.printMiscSkills(player);
int powerLevelCap = mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevel().getLevelCap();
int powerLevelCap = mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevelSettings().getLevelCap();
if (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevel().isLevelCapEnabled()) {
if (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevelSettings().isLevelCapEnabled()) {
player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap));
} else {
player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", UserManager.getPlayer(player).getPowerLevel()));

View File

@ -3,8 +3,10 @@ package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.excavation.ExcavationManager;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.TextComponentFactory;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
@ -43,6 +45,8 @@ public class ExcavationCommand extends SkillCommand {
protected List<String> statsDisplay(Player player, double skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<>();
ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager();
if (canGigaDrill) {
messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
@ -50,6 +54,14 @@ public class ExcavationCommand extends SkillCommand {
//messages.add(LocaleLoader.getString("Excavation.Effect.Length", gigaDrillBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
}
if(canUseSubskill(player, SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
messages.add(getStatMessage(false, false, SubSkillType.EXCAVATION_ARCHAEOLOGY,
percent.format(excavationManager.getArchaelogyExperienceOrbChance() / 100.0D)));
messages.add(getStatMessage(true, false, SubSkillType.EXCAVATION_ARCHAEOLOGY,
String.valueOf(excavationManager.getExperienceOrbsReward())));
}
return messages;
}

View File

@ -71,7 +71,7 @@ public class MiningCommand extends SkillCommand {
canBiggerBombs = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BIGGER_BOMBS) && Permissions.biggerBombs(player);
canBlast = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BLAST_MINING) && Permissions.remoteDetonation(player);
canDemoExpert = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_DEMOLITIONS_EXPERTISE) && Permissions.demolitionsExpertise(player);
canDoubleDrop = Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS);
canDoubleDrop = canUseSubskill(player, SubSkillType.MINING_DOUBLE_DROPS);
canSuperBreaker = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_SUPER_BREAKER) && Permissions.superBreaker(player);
}

View File

@ -9,7 +9,7 @@ public class ConfigSectionExploitAcrobatics {
private static final int ACROBATIC_LOCATION_LIMIT_DEFAULT = 50;
private static final boolean PREVENT_ACROBATICS_ABUSE_DEFAULT = true;
private static final int TELEPORT_COOLDOWN_DEFAULT = 30;
private static final int ROLL_XP_GAIN_CD_DEFAULT = 10;
private static final int ROLL_XP_GAIN_CD_DEFAULT = 3;
@Setting(value = "Player-Fall-Location-Tracking",
comment = "The amount of locations to keep track of for player falls." +

View File

@ -3,6 +3,7 @@ package com.gmail.nossr50.config.hocon.experience;
import com.gmail.nossr50.datatypes.experience.CustomXPPerk;
import com.gmail.nossr50.datatypes.experience.SpecialXPKey;
import com.gmail.nossr50.datatypes.skills.ItemMaterialCategory;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import ninja.leaping.configurate.objectmapping.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -184,6 +185,10 @@ public class ConfigExperience {
return getConfigExperienceSkills().getExcavationExperienceMap();
}
public boolean isReduceTreeFellerXP() {
return getExperienceWoodcutting().isReduceTreeFellerXP();
}
public HashMap<String, Integer> getFishingXPMap() {
return getConfigExperienceSkills().getFishingXPMap();
}
@ -196,6 +201,12 @@ public class ConfigExperience {
return configExperienceSkills;
}
public double getSkillGlobalMultiplier(PrimarySkillType primarySkillType) {
return configExperienceSkillMultiplier.getSkillGlobalMultiplier(primarySkillType);
}
public double getGlobalXPMultiplier() {
return globalXPMultiplier;
}

View File

@ -45,6 +45,10 @@ public class ConfigExperienceSkills {
@Setting(value = "Z-Combat", comment = "XP Settings for Combat")
private ConfigExperienceCombat experienceCombat = new ConfigExperienceCombat();
public boolean isReduceTreeFellerXP() {
return experienceWoodcutting.isReduceTreeFellerXP();
}
/*
* BOILER PLATE GETTERS
*/

View File

@ -9,6 +9,7 @@ import java.util.HashMap;
public class ConfigExperienceWoodcutting {
private static final HashMap<String, Integer> WOODCUTTING_EXPERIENCE_DEFAULT;
public static final boolean REDUCE_TREE_FELLER_XP_DEFAULT = true;
static {
WOODCUTTING_EXPERIENCE_DEFAULT = new HashMap<>();
@ -46,10 +47,19 @@ public class ConfigExperienceWoodcutting {
WOODCUTTING_EXPERIENCE_DEFAULT.put("minecraft:mushroom_stem", 80);
}
@Setting(value = "Reduce-Tree-Feller-XP", comment = "If set to true players will receive diminishing returns on XP from tree feller." +
"\nIf set to false, players will get the full XP from every block destroyed by tree feller." +
"\nDefault value: "+REDUCE_TREE_FELLER_XP_DEFAULT)
private boolean reduceTreeFellerXP = REDUCE_TREE_FELLER_XP_DEFAULT;
@Setting(value = "Woodcutting-Experience")
private HashMap<String, Integer> woodcuttingExperienceMap = WOODCUTTING_EXPERIENCE_DEFAULT;
public HashMap<String, Integer> getWoodcuttingExperienceMap() {
return woodcuttingExperienceMap;
}
public boolean isReduceTreeFellerXP() {
return reduceTreeFellerXP;
}
}

View File

@ -134,6 +134,18 @@ public class ConfigLeveling {
return configSectionLevelCaps;
}
public ConfigSectionSkillLevelCap getPowerLevelSettings() {
return configSectionLevelCaps.getPowerLevelSettings();
}
public boolean getReducePlayerSkillsAboveCap() {
return configSectionLevelCaps.getReducePlayerSkillsAboveCap();
}
public ConfigSectionSkillLevelCaps getConfigSectionSkillLevelCaps() {
return configSectionLevelCaps.getConfigSectionSkillLevelCaps();
}
public ConfigSectionLevelingGeneral getConfigSectionLevelingGeneral() {
return configSectionLevelingGeneral;
}
@ -194,11 +206,19 @@ public class ConfigLeveling {
return configExperienceFormula.getLinearMultiplier();
}
public boolean isPowerLevelCapEnabled() {
return configSectionLevelCaps.isPowerLevelCapEnabled();
}
public int getPowerLevelCap() {
return configSectionLevelCaps.getPowerLevelCap();
}
/*
* HELPER METHODS
*/
public int getLevelCap(PrimarySkillType primarySkillType) {
public int getSkillLevelCap(PrimarySkillType primarySkillType) {
switch (primarySkillType) {
case ACROBATICS:
return configSectionLevelCaps.getConfigSectionSkillLevelCaps().getAcrobatics().getLevelCap();
@ -236,7 +256,7 @@ public class ConfigLeveling {
}
}
public boolean isLevelCapEnabled(PrimarySkillType primarySkillType) {
public boolean isSkillLevelCapEnabled(PrimarySkillType primarySkillType) {
switch (primarySkillType) {
case ACROBATICS:
return configSectionLevelCaps.getConfigSectionSkillLevelCaps().getAcrobatics().isLevelCapEnabled();

View File

@ -29,10 +29,18 @@ public class ConfigSectionLevelCaps {
* GETTER BOILERPLATE
*/
public ConfigSectionSkillLevelCap getPowerLevel() {
public ConfigSectionSkillLevelCap getPowerLevelSettings() {
return powerLevel;
}
public boolean isPowerLevelCapEnabled() {
return powerLevel.isLevelCapEnabled();
}
public int getPowerLevelCap() {
return powerLevel.getLevelCap();
}
public boolean getReducePlayerSkillsAboveCap() {
return truncateSkillsAboveCap;
}

View File

@ -899,8 +899,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
continue;
}
//Level Cap
if (mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(skill)) {
int cap = mcMMO.getPlayerLevelingSettings().getLevelCap(skill);
if (mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(skill)) {
int cap = mcMMO.getPlayerLevelingSettings().getSkillLevelCap(skill);
if (Integer.valueOf(character[index]) > cap) {
mcMMO.p.getLogger().warning("Truncating " + skill.getName() + " to configured max level for player " + character[USERNAME]);
character[index] = cap + "";

View File

@ -891,11 +891,11 @@ public final class SQLDatabaseManager implements DatabaseManager {
//Level Cap Stuff
if (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getReducePlayerSkillsAboveCap()) {
for (PrimarySkillType skill : PrimarySkillType.NON_CHILD_SKILLS) {
if (!mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(skill))
if (!mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(skill))
continue;
//Shrink skills above the cap
int cap = mcMMO.getPlayerLevelingSettings().getLevelCap(skill);
int cap = mcMMO.getPlayerLevelingSettings().getSkillLevelCap(skill);
statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `" + skill.name().toLowerCase() + "` = " + cap + " WHERE `" + skill.name().toLowerCase() + "` > " + cap);
statement.executeUpdate();
tryClose(statement);

View File

@ -165,7 +165,15 @@ public class McMMOPlayer {
experienceBarManager.hideExperienceBar(primarySkillType);
}*/
public void processPostXpEvent(XPGainReason xpGainReason, PrimarySkillType primarySkillType, Plugin plugin, XPGainSource xpGainSource) {
public void processPostXpEvent(PrimarySkillType primarySkillType, Plugin plugin, XPGainSource xpGainSource)
{
//Check if they've reached the power level cap just now
if(hasReachedPowerLevelCap()) {
mcMMO.getNotificationManager().sendPlayerInformationChatOnly(player, "LevelCap.PowerLevel", String.valueOf(mcMMO.getConfigManager().getConfigLeveling().getPowerLevelCap()));
} else if(hasReachedLevelCap(primarySkillType)) {
mcMMO.getNotificationManager().sendPlayerInformationChatOnly(player, "LevelCap.Skill", String.valueOf(mcMMO.getConfigManager().getConfigLeveling().getSkillLevelCap(primarySkillType)), primarySkillType.getName());
}
//Updates from Party sources
if (xpGainSource == XPGainSource.PARTY_MEMBERS && !mcMMO.getConfigManager().getConfigLeveling().isPartyExperienceTriggerXpBarDisplay())
return;
@ -474,6 +482,31 @@ public class McMMOPlayer {
return powerLevel;
}
/**
* Whether or not a player is level capped
* If they are at the power level cap, this will return true, otherwise it checks their skill level
* @param primarySkillType
* @return
*/
public boolean hasReachedLevelCap(PrimarySkillType primarySkillType) {
if(hasReachedPowerLevelCap())
return true;
if(getSkillLevel(primarySkillType) >= mcMMO.getConfigManager().getConfigLeveling().getSkillLevelCap(primarySkillType))
return true;
return false;
}
/**
* Whether or not a player is power level capped
* Compares their power level total to the current set limit
* @return true if they have reached the power level cap
*/
public boolean hasReachedPowerLevelCap() {
return this.getPowerLevel() >= mcMMO.getConfigManager().getConfigLeveling().getPowerLevelCap();
}
/**
* Begins an experience gain. The amount will be affected by skill modifiers, global rate, perks, and may be shared with the party
*
@ -564,8 +597,11 @@ public class McMMOPlayer {
* @param primarySkillType The skill to check
*/
private void checkXp(PrimarySkillType primarySkillType, XPGainReason xpGainReason, XPGainSource xpGainSource) {
if(hasReachedLevelCap(primarySkillType))
return;
if (getSkillXpLevelRaw(primarySkillType) < getXpToLevel(primarySkillType)) {
processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
processPostXpEvent(primarySkillType, mcMMO.p, xpGainSource);
return;
}
@ -573,7 +609,7 @@ public class McMMOPlayer {
double xpRemoved = 0;
while (getSkillXpLevelRaw(primarySkillType) >= getXpToLevel(primarySkillType)) {
if (mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(primarySkillType)
if (mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(primarySkillType)
&& hasReachedLevelCap(primarySkillType)) {
setSkillXpLevel(primarySkillType, 0);
break;
@ -583,8 +619,7 @@ public class McMMOPlayer {
levelsGained++;
}
if (!EventUtils.handleLevelChangeEvent(player, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) {
processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
if (EventUtils.tryLevelChangeEvent(player, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) {
return;
}
@ -597,7 +632,7 @@ public class McMMOPlayer {
mcMMO.getNotificationManager().sendPlayerLevelUpNotification(this, primarySkillType, levelsGained, profile.getSkillLevel(primarySkillType));
//UPDATE XP BARS
processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
processPostXpEvent(primarySkillType, mcMMO.p, xpGainSource);
}
/*
@ -770,8 +805,8 @@ public class McMMOPlayer {
*/
private double modifyXpGain(PrimarySkillType primarySkillType, double xp) {
if (((primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType))
&& mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(primarySkillType))
|| (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevel().getLevelCap() <= getPowerLevel())) {
&& mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(primarySkillType))
|| (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevelSettings().getLevelCap() <= getPowerLevel())) {
return 0;
}
@ -921,11 +956,6 @@ public class McMMOPlayer {
return (int) (((deactivatedTimestamp + (PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
}
private boolean hasReachedLevelCap(PrimarySkillType skill) {
return (skill.getMaxLevel() < getSkillLevel(skill) + 1)
|| (mcMMO.getPlayerLevelingSettings().getConfigSectionLevelCaps().getPowerLevel().getLevelCap() < getPowerLevel() + 1);
}
/*
* These functions are wrapped from PlayerProfile so that we don't always have to store it alongside the McMMOPlayer object.
*/

View File

@ -419,7 +419,7 @@ public class PlayerProfile {
int sum = 0;
for (PrimarySkillType parent : parents) {
if (mcMMO.getPlayerLevelingSettings().isLevelCapEnabled(parent))
if (mcMMO.getPlayerLevelingSettings().isSkillLevelCapEnabled(parent))
sum += Math.min(getSkillLevel(parent), parent.getMaxLevel());
else
sum += getSkillLevel(parent);

View File

@ -179,7 +179,7 @@ public enum PrimarySkillType {
* @return the max level of this skill
*/
public int getMaxLevel() {
return mcMMO.getPlayerLevelingSettings().getLevelCap(this);
return mcMMO.getPlayerLevelingSettings().getSkillLevelCap(this);
}
/*public boolean getDoubleDropsDisabled() {

View File

@ -41,7 +41,7 @@ public enum SubSkillType {
FISHING_SHAKE(1),
/* Herbalism */
HERBALISM_DOUBLE_DROPS,
HERBALISM_DOUBLE_DROPS(1),
HERBALISM_FARMERS_DIET(5),
HERBALISM_GREEN_TERRA(1),
HERBALISM_GREEN_THUMB(4),
@ -52,7 +52,7 @@ public enum SubSkillType {
MINING_BIGGER_BOMBS(1),
MINING_BLAST_MINING(8),
MINING_DEMOLITIONS_EXPERTISE(1),
MINING_DOUBLE_DROPS,
MINING_DOUBLE_DROPS(1),
MINING_SUPER_BREAKER(1),
/* Repair */

View File

@ -170,9 +170,14 @@ public class BlockListener implements Listener {
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
Block newBlock = event.getNewState().getBlock();
Material material = newBlock.getType();
if (mcMMO.getConfigManager().getConfigExploitPrevention().getConfigSectionExploitSkills().isPreventCobblestoneStoneGeneratorXP()) {
if (event.getNewState().getType() != Material.OBSIDIAN && BlockUtils.shouldBeWatched(event.getNewState())) {
mcMMO.getPlaceStore().setTrue(event.getNewState());
if (material != Material.OBSIDIAN
&& BlockUtils.shouldBeWatched(material)
&& mcMMO.getDynamicSettingsManager().getExperienceManager().hasMiningXp(material)) { //Hacky fix to prevent trees growing from being marked as unnatural
mcMMO.getPlaceStore().setTrue(newBlock);
}
}
}
@ -275,7 +280,7 @@ public class BlockListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getPlayer()))
return;
}
@ -284,7 +289,6 @@ public class BlockListener implements Listener {
}
BlockState blockState = event.getBlock().getState();
Location location = blockState.getLocation();
if (!BlockUtils.shouldBeWatched(blockState)) {
return;
@ -370,7 +374,7 @@ public class BlockListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getPlayer()))
return;
}
@ -439,7 +443,7 @@ public class BlockListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getPlayer()))
return;
}
@ -509,7 +513,7 @@ public class BlockListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getPlayer()))
return;
}
@ -582,12 +586,12 @@ public class BlockListener implements Listener {
}
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (WorldGuardManager.getInstance().hasMainFlag(player))
if (plugin.getWorldGuardManager().hasMainFlag(player))
player.sendMessage("[mcMMO DEBUG] World Guard main flag is permitted for this player in this region");
else
player.sendMessage("[mcMMO DEBUG] World Guard main flag is DENIED for this player in this region");
if (WorldGuardManager.getInstance().hasXPFlag(player))
if (plugin.getWorldGuardManager().hasXPFlag(player))
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is permitted for this player in this region");
else
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region");

View File

@ -88,7 +88,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
}
@ -121,20 +121,17 @@ public class EntityListener implements Listener {
if(event.getEntity().getShooter() instanceof Player)
{
Player player = (Player) event.getEntity().getShooter();
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
Projectile projectile = event.getEntity();//Hacky stuff for 1.13/1.14 compat
Projectile projectile = event.getEntity();
String itemKey = player.getInventory().getItemInMainHand().getType().getKey().toString();
if(!itemKey.equalsIgnoreCase("minecraft:bow") && !itemKey.equalsIgnoreCase("minecraft:crossbow"))
if(!(projectile instanceof Arrow))
return;
projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY, new FixedMetadataValue(plugin, 1.0));
@ -293,7 +290,7 @@ public class EntityListener implements Listener {
{
if(attacker instanceof Player) {
if(!WorldGuardManager.getInstance().hasMainFlag((Player) attacker))
if(!plugin.getWorldGuardManager().hasMainFlag((Player) attacker))
return;
} else if(attacker instanceof Projectile) {
@ -301,7 +298,7 @@ public class EntityListener implements Listener {
Projectile projectile = (Projectile) attacker;
if(projectile.getShooter() instanceof Player) {
if(!WorldGuardManager.getInstance().hasMainFlag((Player) projectile.getShooter()))
if(!plugin.getWorldGuardManager().hasMainFlag((Player) projectile.getShooter()))
return;
}
@ -398,6 +395,19 @@ public class EntityListener implements Listener {
}
}
/*
* This was put here to solve a plugin conflict with a mod called Project Korra
* Project Korra sends out a damage event with exactly 0 damage
* mcMMO does some calculations for the damage in an event and it ends up dividing by zero,
* as a result of the modifiers for the event being 0 and the damage set for this event being 0.
*
* Surprising this kind of thing
*
*/
if(damage <= 0) {
return;
}
CombatUtils.processCombatAttack(event, attacker, target);
CombatUtils.handleHealthbars(attacker, target, event.getFinalDamage(), plugin);
@ -452,7 +462,7 @@ public class EntityListener implements Listener {
Player player = (Player) event.getEntity();
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
}
@ -530,7 +540,7 @@ public class EntityListener implements Listener {
Player player = (Player) owner;
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
}
@ -724,7 +734,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -762,7 +772,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -825,7 +835,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -926,7 +936,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -972,7 +982,7 @@ public class EntityListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}

View File

@ -102,7 +102,7 @@ public class InventoryListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -135,7 +135,7 @@ public class InventoryListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -167,7 +167,7 @@ public class InventoryListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -234,7 +234,7 @@ public class InventoryListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -352,7 +352,7 @@ public class InventoryListener implements Listener {
//
// /* WORLD GUARD MAIN FLAG CHECK */
// if (WorldGuardUtils.isWorldGuardLoaded()) {
// if (!WorldGuardManager.getInstance().hasMainFlag(player))
// if (!plugin.getWorldGuardManager().hasMainFlag(player))
// return;
// }
//
@ -456,7 +456,7 @@ public class InventoryListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}

View File

@ -76,7 +76,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -115,7 +115,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getEntity()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getEntity()))
return;
}
@ -160,7 +160,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(killedPlayer))
if (!plugin.getWorldGuardManager().hasMainFlag(killedPlayer))
return;
}
@ -224,7 +224,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
if (!plugin.getWorldGuardManager().hasMainFlag(event.getPlayer()))
return;
}
@ -256,7 +256,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -331,7 +331,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -424,7 +424,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -576,7 +576,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}
@ -689,7 +689,7 @@ public class PlayerListener implements Listener {
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(player))
if (!plugin.getWorldGuardManager().hasMainFlag(player))
return;
}

View File

@ -73,7 +73,7 @@ public class SelfListener implements Listener {
event.getXpGainReason() == XPGainReason.SHARED_PVE ||
event.getXpGainReason() == XPGainReason.SHARED_PVP) {
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasXPFlag(player)) {
if (!plugin.getWorldGuardManager().hasXPFlag(player)) {
event.setRawXpGained(0);
event.setCancelled(true);
}

View File

@ -39,6 +39,7 @@ import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.gmail.nossr50.worldguard.WorldGuardManager;
import com.gmail.nossr50.worldguard.WorldGuardUtils;
import net.shatteredlands.shatt.backup.ZipLibrary;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
@ -67,6 +68,7 @@ public class mcMMO extends JavaPlugin {
private static NotificationManager notificationManager;
private static CommandRegistrationManager commandRegistrationManager;
private static NBTManager nbtManager;
private static WorldGuardManager worldGuardManager;
/* File Paths */
private static String mainDirectory;
@ -196,9 +198,13 @@ public class mcMMO extends JavaPlugin {
}
@Override
public void onLoad() {
if (getServer().getPluginManager().getPlugin("WorldGuard") != null)
WorldGuardManager.getInstance().registerFlags();
public void onLoad()
{
worldGuardManager = new WorldGuardManager();
if(getServer().getPluginManager().getPlugin("WorldGuard") != null) {
worldGuardManager.registerFlags();
}
}
/**
@ -610,4 +616,8 @@ public class mcMMO extends JavaPlugin {
public static NotificationManager getNotificationManager() {
return notificationManager;
}
public WorldGuardManager getWorldGuardManager() {
return worldGuardManager;
}
}

View File

@ -53,6 +53,10 @@ public class ArcheryManager extends SkillManager {
* @param damager The {@link Entity} who shot the arrow
*/
public double distanceXpBonusMultiplier(LivingEntity target, Entity damager) {
//Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires
if(!damager.hasMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY))
return damager.getLocation().distance(target.getLocation());
Location firedLocation = (Location) damager.getMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY).get(0).value();
Location targetLocation = target.getLocation();

View File

@ -10,9 +10,12 @@ import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import org.bukkit.Location;
import org.bukkit.block.BlockState;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Player;
import java.util.List;
@ -40,6 +43,13 @@ public class ExcavationManager extends SkillManager {
for (ExcavationTreasure treasure : treasures) {
if (skillLevel >= treasure.getDropLevel()
&& RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), PrimarySkillType.EXCAVATION, treasure.getDropChance())) {
//Spawn Vanilla XP orbs if a dice roll succeeds
if(RandomChanceUtil.rollDice(getArchaelogyExperienceOrbChance(), 100)) {
ExperienceOrb experienceOrb = (ExperienceOrb) getPlayer().getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB);
experienceOrb.setExperience(getExperienceOrbsReward());
}
xp += treasure.getXp();
Misc.dropItem(location, treasure.getDrop());
}
@ -50,7 +60,20 @@ public class ExcavationManager extends SkillManager {
applyXpGain(xp, XPGainReason.PVE);
}
public void printExcavationDebug(Player player, BlockState blockState) {
public int getExperienceOrbsReward() {
return 1 * getArchaeologyRank();
}
public double getArchaelogyExperienceOrbChance() {
return getArchaeologyRank() * 2;
}
public int getArchaeologyRank() {
return RankUtils.getRank(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY);
}
public void printExcavationDebug(Player player, BlockState blockState)
{
if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
List<ExcavationTreasure> treasures = Excavation.getTreasures(blockState);

View File

@ -72,6 +72,10 @@ public class MiningManager extends SkillManager {
return getSkillLevel() >= BlastMining.getBiggerBombsUnlockLevel() && Permissions.biggerBombs(getPlayer());
}
public boolean canDoubleDrop() {
return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS);
}
/**
* Process double drops & XP gain for Mining.
*
@ -82,16 +86,11 @@ public class MiningManager extends SkillManager {
applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE);
if (!Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS)) {
return;
}
if (mcMMOPlayer.getAbilityMode(skill.getSuperAbility())) {
SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.getConfigManager().getConfigSuperAbilities().getSuperAbilityLimits().getToolDurabilityDamage());
}
//if ((mcMMO.getModManager().isCustomMiningBlock(blockState) && !mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) || !MainConfig.getInstance().getDoubleDropsEnabled(skill, material)) {
if (!mcMMO.getDynamicSettingsManager().getBonusDropManager().isBonusDropWhitelisted(blockState.getType()))
if (!canDoubleDrop() || !mcMMO.getDynamicSettingsManager().getBonusDropManager().isBonusDropWhitelisted(blockState.getType()))
return;
boolean silkTouch = player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH);

View File

@ -136,17 +136,28 @@ public class SalvageManager extends SkillManager {
return;
}
Location anvilLoc = location.clone();
Location playerLoc = player.getLocation().clone();
double distance = anvilLoc.distance(playerLoc);
double speedLimit = .6;
double minSpeed = .3;
//Clamp the speed and vary it by distance
double vectorSpeed = Math.min(speedLimit, Math.max(minSpeed, distance * .2));
//Add a very small amount of height
anvilLoc.add(0, .1, 0);
if (enchantBook != null) {
Misc.dropItem(location, enchantBook);
Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), enchantBook, vectorSpeed);
}
Misc.spawnItemTowardsLocation(location, player.getLocation().add(0, 0.25, 0), salvageResults);
Misc.spawnItemTowardsLocation(anvilLoc.clone(), playerLoc.clone(), salvageResults, vectorSpeed);
// BWONG BWONG BWONG - CLUNK!
if (mcMMO.getConfigManager().getConfigSalvage().getGeneral().isAnvilUseSounds()) {
SoundManager.sendSound(player, player.getLocation(), SoundType.ITEM_BREAK);
//player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1.0F, 1.0F);
}
mcMMO.getNotificationManager().sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Salvage.Skills.Success");

View File

@ -7,7 +7,6 @@ import com.gmail.nossr50.util.skills.SkillUtils;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
@ -29,23 +28,44 @@ public final class Woodcutting {
protected static boolean treeFellerReachedThreshold = false;
private Woodcutting() {
}
/**
* Retrieves the experience reward from a log
*
* @param blockState Log being broken
* @param experienceGainMethod How the log is being broken
* @param blockState Log being broken
* @return Amount of experience
*/
protected static int getExperienceFromLog(BlockState blockState, ExperienceGainMethod experienceGainMethod) {
/*if (mcMMO.getModManager().isCustomLog(blockState)) {
return mcMMO.getModManager().getBlock(blockState).getXpGain();
}*/
protected static int getExperienceFromLog(BlockState blockState) {
return mcMMO.getDynamicSettingsManager().getExperienceManager().getWoodcuttingXp(blockState.getType());
}
/**
* Retrieves the experience reward from logging via Tree Feller
* Experience is reduced per log processed so far
* Experience is only reduced if the config option to reduce Tree Feller XP is set
* Experience per log will not fall below 1 unless the experience for that log is set to 0 in the config
*
* @param blockState Log being broken
* @param woodCount how many logs have given out XP for this tree feller so far
* @return Amount of experience
*/
protected static int processTreeFellerXPGains(BlockState blockState, int woodCount) {
int rawXP = mcMMO.getDynamicSettingsManager().getExperienceManager().getWoodcuttingXp(blockState.getType());
if(rawXP <= 0)
return 0;
if(mcMMO.getConfigManager().getConfigExperience().getExperienceWoodcutting().isReduceTreeFellerXP()) {
int reducedXP = 1 + (woodCount * 5);
rawXP = Math.max(1, rawXP - reducedXP);
return rawXP;
} else {
return mcMMO.getDynamicSettingsManager().getExperienceManager().getWoodcuttingXp(blockState.getType());
}
}
/**
* Checks for double drops
*
@ -136,9 +156,8 @@ public final class Woodcutting {
* @return True if the tool can sustain the durability loss
*/
protected static boolean handleDurabilityLoss(Set<BlockState> treeFellerBlocks, ItemStack inHand) {
if((inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null && inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1)
|| (inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable())) {
//Treat the NBT tag for unbreakable and the durability enchant differently
if(inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable()) {
return true;
}

View File

@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.woodcutting.Woodcutting.ExperienceGainMethod;
import com.gmail.nossr50.util.*;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import com.gmail.nossr50.util.skills.CombatUtils;
@ -52,7 +51,7 @@ public class WoodcuttingManager extends SkillManager {
* @param blockState Block being broken
*/
public void woodcuttingBlockCheck(BlockState blockState) {
int xp = Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.DEFAULT);
int xp = Woodcutting.getExperienceFromLog(blockState);
switch (blockState.getType()) {
case BROWN_MUSHROOM_BLOCK:
@ -114,6 +113,7 @@ public class WoodcuttingManager extends SkillManager {
private void dropBlocks(Set<BlockState> treeFellerBlocks) {
Player player = getPlayer();
int xp = 0;
int processedLogCount = 0;
for (BlockState blockState : treeFellerBlocks) {
Block block = blockState.getBlock();
@ -124,30 +124,16 @@ public class WoodcuttingManager extends SkillManager {
Material material = blockState.getType();
//TODO: Update this to drop the correct items/blocks via NMS
if (material == Material.BROWN_MUSHROOM_BLOCK || material == Material.RED_MUSHROOM_BLOCK) {
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
xp += Woodcutting.processTreeFellerXPGains(blockState, processedLogCount);
Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
}
/*else if (mcMMO.getModManager().isCustomLog(blockState)) {
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
CustomBlock customBlock = mcMMO.getModManager().getBlock(blockState);
xp = customBlock.getXpGain();
Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
}
else if (mcMMO.getModManager().isCustomLeaf(blockState)) {
Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
}*/
else {
} else {
if (BlockUtils.isLog(blockState)) {
if (canGetDoubleDrops()) {
Woodcutting.checkForDoubleDrop(blockState);
}
xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
xp += Woodcutting.processTreeFellerXPGains(blockState, processedLogCount);
Misc.dropItems(Misc.getBlockCenter(blockState), block.getDrops());
}
if (BlockUtils.isLeaves(blockState)) {
@ -157,6 +143,7 @@ public class WoodcuttingManager extends SkillManager {
blockState.setType(Material.AIR);
blockState.update(true);
processedLogCount+=1;
}
applyXpGain(xp, XPGainReason.PVE);

View File

@ -207,7 +207,7 @@ public class EventUtils {
}
public static boolean handleLevelChangeEvent(Player player, PrimarySkillType skill, int levelsChanged, double xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) {
public static boolean tryLevelChangeEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) {
McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
mcMMO.p.getServer().getPluginManager().callEvent(event);
@ -220,10 +220,10 @@ public class EventUtils {
profile.addXp(skill, xpRemoved);
}
return !isCancelled;
return isCancelled;
}
public static void handleLevelChangeEventEdit(Player player, PrimarySkillType skill, int levelsChanged, double xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) {
public static boolean tryLevelEditEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) {
McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
mcMMO.p.getServer().getPluginManager().callEvent(event);
@ -236,6 +236,7 @@ public class EventUtils {
profile.addXp(skill, xpRemoved);
}
return isCancelled;
}
/**

View File

@ -119,40 +119,58 @@ public final class Misc {
/**
* Drop items at a given location.
*
* @param location The location to drop the items at
* @param fromLocation The location to drop the items at
* @param is The items to drop
* @param speed the speed that the item should travel
* @param quantity The amount of items to drop
*/
public static void spawnItemsTowardsLocation(Location location, Location targetLocation, ItemStack is, int quantity) {
public static void spawnItemsTowardsLocation(Location fromLocation, Location toLocation, ItemStack is, int quantity, double speed) {
for (int i = 0; i < quantity; i++) {
spawnItemTowardsLocation(location, targetLocation, is);
spawnItemTowardsLocation(fromLocation, toLocation, is, speed);
}
}
/**
* Drop an item at a given location.
* This method is fairly expensive as it creates clones of everything passed to itself since they are mutable objects
*
* @param spawnLocation The location to drop the item at
* @param itemStack The item to drop
* @param fromLocation The location to drop the item at
* @param toLocation The location the item will travel towards
* @param itemToSpawn The item to spawn
* @param speed the speed that the item should travel
* @return Dropped Item entity or null if invalid or cancelled
*/
public static Item spawnItemTowardsLocation(Location spawnLocation, Location targetLocation, ItemStack itemStack) {
if (itemStack.getType() == Material.AIR) {
public static Item spawnItemTowardsLocation(Location fromLocation, Location toLocation, ItemStack itemToSpawn, double speed) {
if (itemToSpawn.getType() == Material.AIR) {
return null;
}
//Work with fresh copies of everything
ItemStack clonedItem = itemToSpawn.clone();
Location spawnLocation = fromLocation.clone();
Location targetLocation = toLocation.clone();
// We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event.
McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(spawnLocation, itemStack);
McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(spawnLocation, clonedItem);
mcMMO.p.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
//Something cancelled the event so back out
if (event.isCancelled() || event.getItemStack() == null) {
return null;
}
Item item = spawnLocation.getWorld().dropItem(spawnLocation, itemStack);
Vector vector = targetLocation.toVector().subtract(spawnLocation.toVector()).normalize();
item.setVelocity(vector);
return item;
//Use the item from the event
Item spawnedItem = spawnLocation.getWorld().dropItem(spawnLocation, clonedItem);
Vector vecFrom = spawnLocation.clone().toVector().clone();
Vector vecTo = targetLocation.clone().toVector().clone();
//Vector which is pointing towards out target location
Vector direction = vecTo.subtract(vecFrom).normalize();
//Modify the speed of the vector
direction = direction.multiply(speed);
spawnedItem.setVelocity(direction);
return spawnedItem;
}
public static void profileCleanup(String playerName) {

View File

@ -64,7 +64,7 @@ public class FormulaManager {
public int[] calculateNewLevel(PrimarySkillType primarySkillType, int experience) {
int newLevel = 0;
int remainder = 0;
int maxLevel = mcMMO.getConfigManager().getConfigLeveling().getLevelCap(primarySkillType);
int maxLevel = mcMMO.getConfigManager().getConfigLeveling().getSkillLevelCap(primarySkillType);
while (experience > 0 && newLevel < maxLevel) {
int experienceToNextLevel = getXPtoNextLevel(newLevel, currentFormula);

View File

@ -8,17 +8,13 @@ import com.gmail.nossr50.util.Permissions;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
public class PlayerLevelUtils {
private HashMap<PrimarySkillType, Integer> earlyGameBoostCutoffs;
private HashSet<CustomXPPerk> customXpPerkNodes;
public PlayerLevelUtils() {
registerCustomPerkPermissions();
earlyGameBoostCutoffs = new HashMap<>();
calculateEarlyGameBoostCutoffs();
applyConfigPerks();
}
@ -38,29 +34,14 @@ public class PlayerLevelUtils {
}
/**
* Get the the final level at which players will still receive an early game XP boost
* Note: This doesn't mean early game boosts are enabled on the server, as that is a config toggle
*
* Check if a player is currently qualifying for the early game boosted XP
* Will return false only if a player is above the boost level cutoff, it does not check config settings to see if the early game boost is on
* @param mcMMOPlayer target player
* @param primarySkillType target skill
* @return this skills maximum early game boost level
* @return if the player would qualify for the XP boost if its enabled
*/
public int getEarlyGameCutoff(PrimarySkillType primarySkillType) {
return earlyGameBoostCutoffs.get(primarySkillType);
}
private void calculateEarlyGameBoostCutoffs() {
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
int levelCap = mcMMO.getConfigManager().getConfigLeveling().getLevelCap(primarySkillType);
int cap;
if (levelCap == Integer.MAX_VALUE || levelCap <= 0) {
cap = mcMMO.isRetroModeEnabled() ? 50 : 5;
} else {
cap = (int) (levelCap * mcMMO.getConfigManager().getConfigLeveling().getEarlyGameBoostMultiplier());
}
earlyGameBoostCutoffs.put(primarySkillType, cap);
}
public static boolean qualifiesForEarlyGameBoost(McMMOPlayer mcMMOPlayer, PrimarySkillType primarySkillType) {
return mcMMOPlayer.getSkillLevel(primarySkillType) < 1;
}
/**
@ -131,15 +112,4 @@ public class PlayerLevelUtils {
return 1.0;
}
/**
* Check if a player is currently qualifying for the early game boosted XP
* Will return false only if a player is above the boost level cutoff, it does not check config settings to see if the early game boost is on
* @param mcMMOPlayer target player
* @param primarySkillType target skill
* @return if the player would qualify for the XP boost if its enabled
*/
public static boolean qualifiesForEarlyGameBoost(McMMOPlayer mcMMOPlayer, PrimarySkillType primarySkillType) {
return mcMMOPlayer.getSkillLevel(primarySkillType) < mcMMO.getPlayerLevelUtils().getEarlyGameCutoff(primarySkillType);
}
}

View File

@ -225,9 +225,13 @@ public final class CombatUtils {
}
double distanceMultiplier = archeryManager.distanceXpBonusMultiplier(target, arrow);
double forceMultiplier = 1.0; //Hacky Fix - some plugins spawn arrows and assign them to players after the ProjectileLaunchEvent fires
if(arrow.hasMetadata(MetadataConstants.BOW_FORCE_METAKEY))
forceMultiplier = arrow.getMetadata(MetadataConstants.BOW_FORCE_METAKEY).get(0).asDouble();
applyScaledModifiers(initialDamage, finalDamage, event);
startGainXp(mcMMOPlayer, target, PrimarySkillType.ARCHERY, arrow.getMetadata(MetadataConstants.BOW_FORCE_METAKEY).get(0).asDouble() * distanceMultiplier);
startGainXp(mcMMOPlayer, target, PrimarySkillType.ARCHERY, forceMultiplier * distanceMultiplier);
}
/**

View File

@ -399,7 +399,7 @@ public class RankUtils {
}
//Default to the max level for the skill if any errors were encountered incorrect
return mcMMO.getConfigManager().getConfigLeveling().getLevelCap(subSkillType.getParentSkill());
return mcMMO.getConfigManager().getConfigLeveling().getSkillLevelCap(subSkillType.getParentSkill());
}
public static boolean isPlayerMaxRankInSubSkill(Player player, SubSkillType subSkillType) {

View File

@ -253,8 +253,7 @@ public class SkillUtils {
* @param maxDamageModifier the amount to adjust the max damage by
*/
public static void handleDurabilityChange(ItemStack itemStack, double durabilityModifier, double maxDamageModifier) {
if((itemStack.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null && itemStack.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1)
|| (itemStack.getItemMeta() != null && itemStack.getItemMeta().isUnbreakable())) {
if(itemStack.getItemMeta() != null && itemStack.getItemMeta().isUnbreakable()) {
return;
}

View File

@ -6,7 +6,6 @@ import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.registry.FlagConflictException;
import com.sk89q.worldguard.protection.flags.registry.FlagRegistry;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import com.sk89q.worldguard.protection.regions.RegionQuery;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -14,31 +13,18 @@ import org.bukkit.plugin.Plugin;
import static org.bukkit.Bukkit.getServer;
public class WorldGuardManager {
private static WorldGuardManager instance;
private WorldGuardPlugin worldGuardPluginRef;
public WorldGuardManager() {
}
public static WorldGuardManager getInstance() {
if (instance == null)
instance = new WorldGuardManager();
return instance;
}
public boolean hasMainFlag(Player player) {
if (player == null)
public boolean hasMainFlag(Player player)
{
if(player == null)
return false;
BukkitPlayer localPlayer = BukkitAdapter.adapt(player);
com.sk89q.worldedit.util.Location loc = localPlayer.getLocation();
//WorldGuardPlugin worldGuard = getWorldGuard();
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
//ApplicableRegionSet set = query.getApplicableRegions(loc);
@ -53,8 +39,7 @@ public class WorldGuardManager {
com.sk89q.worldedit.util.Location loc = localPlayer.getLocation();
//WorldGuardPlugin worldGuard = getWorldGuard();
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
//ApplicableRegionSet set = query.getApplicableRegions(loc);
@ -70,8 +55,7 @@ public class WorldGuardManager {
com.sk89q.worldedit.util.Location loc = localPlayer.getLocation();
//WorldGuardPlugin worldGuard = getWorldGuard();
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
//ApplicableRegionSet set = query.getApplicableRegions(loc);
@ -90,15 +74,12 @@ public class WorldGuardManager {
return worldGuardPluginRef;
}
public void registerFlags() {
if (getWorldGuard() == null)
return;
public void registerFlags()
{
FlagRegistry registry = WorldGuard.getInstance().getFlagRegistry();
try {
// register our flag with the registry
/*registry.register(WorldGuardFlags.MCMMO_ENABLE_WG_FLAG);
registry.register(WorldGuardFlags.MCMMO_XP_WG_FLAG);*/
registry.register(WorldGuardFlags.MCMMO_ENABLE_WG_FLAG);
registry.register(WorldGuardFlags.MCMMO_XP_WG_FLAG);
registry.register(WorldGuardFlags.MCMMO_HARDCORE_WG_FLAG);
@ -113,5 +94,4 @@ public class WorldGuardManager {
}
}
}

View File

@ -4,53 +4,122 @@ import com.gmail.nossr50.mcMMO;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import static org.bukkit.Bukkit.getServer;
public class WorldGuardUtils {
private static WorldGuardPlugin worldGuardPluginRef;
private static boolean isLoaded = false;
private static boolean hasWarned = false;
private static boolean detectedIncompatibleWG = false;
private static final ArrayList<String> WGClassList;
public static boolean isWorldGuardLoaded() {
WorldGuardPlugin plugin = getWorldGuard();
static {
/*
These are the classes mcMMO tries to hook into for WG support, if any of them are missing it is safe to consider WG is not compatible
com.sk89q.worldedit.bukkit.BukkitAdapter
com.sk89q.worldedit.bukkit.BukkitPlayer
com.sk89q.worldguard.WorldGuard
com.sk89q.worldguard.bukkit.WorldGuardPlugin
com.sk89q.worldguard.protection.flags.registry.FlagConflictException
com.sk89q.worldguard.protection.flags.registry.FlagRegistry
com.sk89q.worldguard.protection.regions.RegionContainer
com.sk89q.worldguard.protection.regions.RegionQuery
*/
try {
// WorldGuard may not be loaded
if (plugin == null) {
return false; // Maybe you want throw an exception instead
}
} catch (Exception e) {
e.printStackTrace();
//Silently Fail
//mcMMO.p.getLogger().severe("Failed to detect worldguard.");
WGClassList = new ArrayList<>();
WGClassList.add("com.sk89q.worldedit.bukkit.BukkitAdapter");
WGClassList.add("com.sk89q.worldedit.bukkit.BukkitPlayer");
WGClassList.add("com.sk89q.worldguard.WorldGuard");
WGClassList.add("com.sk89q.worldguard.bukkit.WorldGuardPlugin");
WGClassList.add("com.sk89q.worldguard.protection.flags.registry.FlagConflictException");
WGClassList.add("com.sk89q.worldguard.protection.flags.registry.FlagRegistry");
WGClassList.add("com.sk89q.worldguard.protection.regions.RegionContainer");
WGClassList.add("com.sk89q.worldguard.protection.regions.RegionQuery");
}
public static boolean isWorldGuardLoaded()
{
if(detectedIncompatibleWG)
return false;
worldGuardPluginRef = getWorldGuard();
return isLoaded;
}
/**
* Gets the instance of the WG plugin if its compatible
* Results are cached
* @return the instance of WG plugin, null if its not compatible or isn't present
*/
private static WorldGuardPlugin getWorldGuard()
{
//WG plugin reference is already cached so just return it
if(isLoaded)
return worldGuardPluginRef;
//Grab WG if it exists
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if(plugin == null) {
//WG is not present
detectedIncompatibleWG = true;
mcMMO.p.getLogger().info("WorldGuard was not detected.");
} else {
//Check that its actually of class WorldGuardPlugin
if(plugin instanceof WorldGuardPlugin)
{
if(isCompatibleVersion(plugin))
{
worldGuardPluginRef = (WorldGuardPlugin) plugin;
isLoaded = true;
}
} else {
//Plugin is not of the expected type
markWGIncompatible();
}
}
return true;
return worldGuardPluginRef;
}
private static WorldGuardPlugin getWorldGuard() {
if (isLoaded)
return worldGuardPluginRef;
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if (plugin instanceof WorldGuardPlugin) {
if (plugin.getDescription().getVersion().startsWith("7")) {
worldGuardPluginRef = (WorldGuardPlugin) plugin;
if (worldGuardPluginRef != null)
isLoaded = true;
} else {
if (!hasWarned) {
mcMMO.p.getLogger().severe("mcMMO only supports WorldGuard version 7! Make sure you have WG 7! This warning will not appear again.");
hasWarned = true;
/**
* Checks to make sure the version of WG installed is compatible
* Does this by checking for necessary WG classes via Reflection
* This does not guarantee compatibility, but it should help reduce the chance that mcMMO tries to hook into WG and its not compatible
* @return true if the version of WG appears to be compatible
*/
private static boolean isCompatibleVersion(Plugin plugin) {
//Check that the version of WG is at least version 7.xx
if(!plugin.getDescription().getVersion().startsWith("7")) {
markWGIncompatible();
} else {
//Use Reflection to check for a class not present in all versions of WG7
for(String classString : WGClassList) {
try {
Class<?> checkForClass = Class.forName(classString);
detectedIncompatibleWG = false; //In case this was set to true previously
} catch (ClassNotFoundException e) {
mcMMO.p.getLogger().severe("Missing WorldGuard class - "+classString);
markWGIncompatible();
return false;
}
}
}
return worldGuardPluginRef;
return true;
}
/**
* Mark WG as being incompatible to avoid unnecessary operations
*/
private static void markWGIncompatible() {
mcMMO.p.getLogger().severe("You are using a version of WG that is not compatible with mcMMO, " +
"WG features for mcMMO will be disabled. mcMMO requires you to be using a new version of WG7 " +
"in order for it to use WG features. Not all versions of WG7 are compatible.");
mcMMO.p.getLogger().severe("mcMMO will continue to function normally, but if you wish to use WG support you must use a compatible version.");
detectedIncompatibleWG = true;
}
}

View File

@ -74,13 +74,14 @@ Feedback:
SendCopyOfMessageToChat: true
Skills:
General:
StartingLevel: 0
Ability:
Length:
Standard:
CapLevel: 50
CapLevel: 100
IncreaseLevel: 5
RetroMode:
CapLevel: 500
CapLevel: 1000
IncreaseLevel: 50
EnchantBuff: 5
# IncreaseLevel: This setting will determine when the length of every ability gets longer with 1 second

View File

@ -11,7 +11,7 @@ General:
# Everything in your config related to skill level requirements, skill level bonuses, etc will be multiplied by 10 when this mode is on
# This change is purely cosmetic, it retains the old feel of mcMMO where you could level up thousands of times
RetroMode:
Enabled: false
Enabled: true
Locale: en_US
AprilFoolsEvent: true
MOTD_Enabled: true

View File

@ -23,8 +23,6 @@
# The bar is one solid piece
EarlyGameBoost:
Enabled: true
#Used to determine the cap of the max boot, with default level cap it will be 5 on standard, and 50 on retro
MaxLevelMultiplier: 0.05
ExploitFix:
UnsafeEnchantments: false
# Prevent many exploits related to fishing
@ -32,6 +30,7 @@ ExploitFix:
EndermanEndermiteFarms: true
Acrobatics: true
LavaStoneAndCobbleFarming: true
TreeFellerReducedXP: true
Experience_Bars:
# Turn this to false if you wanna disable XP bars
Enable: true
@ -354,24 +353,24 @@ Experience_Values:
Bubble_Coral_Block: 70
Fire_Coral_Block: 90
Horn_Coral_Block: 125
Coal_Ore: 100
Diamond_Ore: 750
Coal_Ore: 400
Diamond_Ore: 2400
Emerald_Ore: 1000
End_Bricks: 200
End_Bricks: 50
Nether_Brick: 50
End_Stone: 30
Glowstone: 30
Gold_Ore: 350
End_Stone: 15
Glowstone: 15
Gold_Ore: 1300
Terracotta: 30
Iron_Ore: 250
Lapis_Ore: 400
Iron_Ore: 900
Lapis_Ore: 800
Mossy_Cobblestone: 30
Netherrack: 30
Netherrack: 15
Obsidian: 150
Packed_Ice: 50
Blue_Ice: 100
Nether_Quartz_Ore: 100
Redstone_Ore: 150
Packed_Ice: 15
Blue_Ice: 15
Nether_Quartz_Ore: 300
Redstone_Ore: 600
Sandstone: 30
Black_Terracotta: 50
Blue_Terracotta: 50
@ -389,10 +388,10 @@ Experience_Values:
Red_Terracotta: 50
White_Terracotta: 50
Yellow_Terracotta: 50
Stone: 30
Granite: 30
Andesite: 30
Diorite: 30
Stone: 15
Granite: 15
Andesite: 15
Diorite: 15
Stone_Bricks: 50
Cracked_Stone_Bricks: 50
Mossy_Stone_Bricks: 50

File diff suppressed because it is too large Load Diff

View File

@ -210,7 +210,9 @@ Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breaker
Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed
Excavation.SubSkill.GigaDrillBreaker.Stat=Giga Drill Breaker Duration
Excavation.SubSkill.Archaeology.Name=Archaeology
Excavation.SubSkill.Archaeology.Description=Unearth the secrets of the land!
Excavation.SubSkill.Archaeology.Description=Unearth the secrets of the land! High skill levels increase your odds of finding experience orbs when you find treasure!
Excavation.SubSkill.Archaeology.Stat=Archaelogy Experience Orb Chance
Excavation.SubSkill.Archaeology.Stat.Extra=Archaeoloy Experience Orb Amount
Excavation.Listener=Excavation:
Excavation.SkillName=EXCAVATION
Excavation.Skills.GigaDrillBreaker.Off=**Giga Drill Breaker has worn off**
@ -243,7 +245,7 @@ Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished
Fishing.SubSkill.FishermansDiet.Stat=Fisherman's Diet:[[GREEN]] Rank {0}
Fishing.SubSkill.MasterAngler.Name=Master Angler
Fishing.SubSkill.MasterAngler.Description=Improves chance of getting a bite while fishing
Fishing.SubSkill.MasterAngler.Stat=Added Bite Chance at your current location: [[GREEN]]+[[YELLOW]]{0}
Fishing.SubSkill.MasterAngler.Stat=Added Bite Chance at your current location: [[GREEN]]+{0}
Fishing.SubSkill.IceFishing.Name=Ice Fishing
Fishing.SubSkill.IceFishing.Description=Allows you to fish in icy biomes
Fishing.SubSkill.IceFishing.Stat=Ice Fishing
@ -1094,4 +1096,8 @@ Reminder.Squelched=[[GRAY]]Reminder: You are currently not receiving notificatio
#Misc
Commands.Reload.Start=mcMMO is reloading... this may take a moment
Commands.Reload.Finished=mcMMO has finished reloading!
#Locale
Locale.Reloaded=[[GREEN]]Locale reloaded!
#Player Leveling Stuff
LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the power level cap of [[RED]]{0}[[YELLOW]]. You will cease to level in skills from this point on.
LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[YELLOW]]You have reached the level cap of [[RED]]{0}[[YELLOW]] for [[GOLD]]{1}[[YELLOW]]. You will cease to level in this skill from this point on.

View File

@ -364,8 +364,6 @@ Repair.Arcane.Perfect=[[GREEN]]\u3042\u306a\u305f\u306f\u3053\u306e\u30a2\u30a4\
Salvage.Pretty.Name=\u30b5\u30eb\u30d9\u30fc\u30b8
Salvage.SubSkill.UnderstandingTheArt.Name=\u82b8\u8853\u3092\u7406\u89e3\u3059\u308b\u3002
Salvage.SubSkill.UnderstandingTheArt.Description=\u3042\u306a\u305f\u306f\u305f\u3060\u3042\u306a\u305f\u306e\u96a3\u4eba\u306e\u30b4\u30df\u3092\u6398\u308a\u4e0b\u3052\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u3042\u306a\u305f\u306f\u74b0\u5883\u306e\u4e16\u8a71\u3092\u3057\u3066\u3044\u307e\u3059\u3002\n\u30b5\u30eb\u30d9\u30fc\u30b8\u306e\u69d8\u3005\u306a\u7279\u6027\u3092\u5f15\u304d\u51fa\u3059\u3002
Salvage.SubSkill.AdvancedSalvage.Name=\u9ad8\u5ea6\u306a\u30b5\u30eb\u30d9\u30fc\u30b8
Salvage.SubSkill.AdvancedSalvage.Description=\u8010\u4e45\u5024\u306e\u6e1b\u3063\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3059\u308b\u3002
Salvage.SubSkill.ScrapCollector.Name=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc
Salvage.SubSkill.ScrapCollector.Description=\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u3088\u308b\u30a2\u30a4\u30c6\u30e0\u304b\u3089\u306e\u7d20\u6750\u56de\u53ce\u3001\u5b8c\u74a7\u306a\u30b5\u30eb\u30d9\u30fc\u30b8\u306f\u30b9\u30ad\u30eb\u3068\u904b\u306b\u4f9d\u5b58\u3057\u307e\u3059\u3002
Salvage.SubSkill.ScrapCollector.Stat=\u30b9\u30af\u30e9\u30c3\u30d7\u30b3\u30ec\u30af\u30bf\u30fc: [[GREEN]]\u6700\u5927[[YELLOW]]{0}\u500b[[GREEN]]\u306e\u30a2\u30a4\u30c6\u30e0\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3002\u904b\u304c\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002
@ -386,6 +384,10 @@ Salvage.Skills.ArcaneSuccess=[[GREEN]]\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306b
Salvage.Listener.Anvil=[[DARK_RED]]\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u30a2\u30f3\u30d3\u30eb\u3092\u8a2d\u7f6e\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u3092\u30c4\u30fc\u30eb\u3068\u9632\u5177\u306e\u30b5\u30eb\u30d9\u30fc\u30b8\u306b\u4f7f\u3063\u3066\u304f\u3060\u3055\u3044\u3002
Salvage.Listener=\u30b5\u30eb\u30d9\u30fc\u30b8:
Salvage.SkillName=\u30b5\u30eb\u30d9\u30fc\u30b8
Salvage.Skills.Lottery.Normal=[[YELLOW]]{1}[[GOLD]]\u304b\u3089[[DARK_AQUA]]{0}[[GOLD]]\u306e\u7d20\u6750\u3092\u56de\u53ce\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002
Salvage.Skills.Lottery.Perfect=[[GREEN]][[BOLD]]\u30d1\u30fc\u30d5\u30a7\u30af\u30c8\uff01[[RESET]][[GOLD]] \u3042\u306a\u305f\u306f [[DARK_AQUA]]{1}[[GOLD]]\u3092\u30b5\u30eb\u30d9\u30fc\u30b8\u3057\u3001[[DARK_AQUA]]{0}[[GOLD]]\u500b\u306e\u7d20\u6750\u3092\u56de\u53ce\u3057\u307e\u3057\u305f\u3002
Salvage.Skills.Lottery.Untrained=[[GRAY]]\u3042\u306a\u305f\u306f\u30b5\u30eb\u30d9\u30fc\u30b8\u3092\u6b63\u3057\u304f\u8a13\u7df4\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002 [[GREEN]]{1}[[GRAY]]\u304b\u3089[[RED]]{0}[[GRAY]]\u500b\u306e\u7d20\u6750\u3057\u304b\u56de\u53ce\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
#Anvil (Shared between SALVAGE and REPAIR)
Anvil.Unbreakable=\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306f\u58ca\u308c\u307e\u305b\u3093\uff01
@ -659,6 +661,18 @@ Commands.Event.XP=[[DARK_AQUA]]XP\u30ec\u30fc\u30c8\u306f\u73fe\u5728[[GOLD]]{0}
Commands.xprate.started.0=[[GOLD]]mcMMO\u306eXP\u30a4\u30d9\u30f3\u30c8\u304c\u958b\u59cb\u3055\u308c\u307e\u3057\u305f\uff01
Commands.xprate.started.1=[[GOLD]]mcMMO\u306eXP\u30ec\u30fc\u30c8\u306f3\u500d\u306b\u306a\u308a\u307e\u3057\u305f\uff01
# Admin Notifications
Server.ConsoleName=[[YELLOW]][Server]
Notifications.Admin.XPRate.Start.Self=[[GRAY]]\u3042\u306a\u305f\u306f[[GOLD]]{0}x[[GRAY]]\u306b\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002
Notifications.Admin.XPRate.End.Self=[[GRAY]]XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002
Notifications.Admin.XPRate.End.Others={0}[[GRAY]]\u306fXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f
Notifications.Admin.XPRate.Start.Others={0}[[GRAY]]\u304c{1}x\u3067\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u958b\u59cb\u307e\u305f\u306f\u5909\u66f4\u3057\u307e\u3057\u305f
Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]\u7ba1\u7406\u8005[[GOLD]]) [[GRAY]]{0}
Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0}
# Event
XPRate.Event=[[GOLD]]mcMMO\u306f\u73fe\u5728XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u4e2d\u3067\u3059\uff01XP\u30ec\u30fc\u30c8\u306f{0}x\u3067\u3059\uff01
#GUIDES
Guides.Available=[[GRAY]]\u5229\u7528\u53ef\u80fd\u306a{0}\u306e\u30ac\u30a4\u30c9 - \/{1} ? [\u30da\u30fc\u30b8]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u30ac\u30a4\u30c9[[GOLD]]=-
@ -762,20 +776,42 @@ Guides.Woodcutting.Section.1=[[DARK_AQUA]]How does Tree Feller work?\n[[YELLOW]]
Guides.Woodcutting.Section.2=[[DARK_AQUA]]How does Leaf Blower work?\n[[YELLOW]]Leaf Blower is a passive ability that will cause leaf\n[[YELLOW]]blocks to break instantly when hit with an axe. By default,\n[[YELLOW]]this ability unlocks at level 100.
Guides.Woodcutting.Section.3=[[DARK_AQUA]]How do Double Drops work?\n[[YELLOW]]This passive ability gives you a chance to obtain an extra\n[[YELLOW]]block for every log you chop.
#INSPECT
Inspect.Offline= [[RED]]\u3042\u306a\u305f\u306f\u30aa\u30d5\u30e9\u30a4\u30f3\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u8abf\u3079\u308b\u6a29\u9650\u3092\u6301\u3063\u3066\u3044\u307e\u305b\u3093\uff01
Inspect.OfflineStats=\u30aa\u30d5\u30e9\u30a4\u30f3\u30d7\u30ec\u30fc\u30e4\u30fc\u306emcMMO\u7d71\u8a08[[YELLOW]]{0}
Inspect.Stats=[[YELLOW]]{0}[[GREEN]]\u306emcMMO\u7d71\u8a08
Inspect.TooFar=\u305d\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u8abf\u3079\u308b\u306b\u306f\u9060\u3059\u304e\u307e\u3059\uff01
#ITEMS
Item.ChimaeraWing.Fail=[[RED]]**\u30ad\u30e1\u30e9\u306e\u7ffc \u5931\u6557\uff01**
Item.ChimaeraWing.Pass=**\u30ad\u30e1\u30e9\u306e\u7ffc**
Item.ChimaeraWing.Name=\u30ad\u30e1\u30e9\u306e\u7ffc
Item.ChimaeraWing.Lore=[[GRAY]]\u3042\u306a\u305f\u3092\u30d9\u30c3\u30c9\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002
#TELEPORTATION
Teleport.Commencing=[[GOLD]]({0})[[GREY]]\u79d2\u3067\u30c6\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u3066\u307e\u3059\u3002\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
Teleport.Cancelled=[[DARK_RED]]\u30c6\u30ec\u30dd\u30fc\u30c8\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002
#SKILLS
Skills.Child=[[GOLD]](\u5b50\u30b9\u30ad\u30eb)
Skills.Disarmed=[[DARK_RED]]\u3042\u306a\u305f\u306f\u6b66\u88c5\u89e3\u9664\u3055\u308c\u307e\u3057\u305f\uff01
Skills.Header=-----[] [[GREEN]]{0}[[RED]] []-----
Skills.NeedMore=[[DARK_RED]]\u3082\u3063\u3068[[GRAY]]{0}[[DARK_RED]]\u304c\u5fc5\u8981\u3067\u3059
Skills.NeedMore.Extra=[[DARK_RED]]\u3082\u3063\u3068[[GRAY]]{0}{1}[[DARK_RED]]\u304c\u5fc5\u8981\u3067\u3059
Skills.Parents= PARENTS
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.ChildStats={0}[[GREEN]]{1}
Skills.TooTired=\u305d\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u518d\u3073\u4f7f\u3046\u306e\u306b\u306f\u98fd\u304d\u904e\u304e\u3066\u3044\u307e\u3059\u3002 [[YELLOW]]({0}\u79d2)
Skills.Cancelled=[[GOLD]]{0} [[RED]]\u30ad\u30e3\u30f3\u30bb\u30eb\uff01
Skills.ConfirmOrCancel=[[GREEN]]\u3082\u3046\u4e00\u5ea6\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066[[GOLD]]{0}[[GREEN]]\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \u30ad\u30e3\u30f3\u30bb\u30eb\u3059\u308b\u306b\u306f\u5de6\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002
Skills.AbilityGateRequirementFail=[[GRAY]]\u3053\u306e\u30a2\u30d3\u30ea\u30c6\u30a3\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f[[YELLOW]]{0}[[GRAY]]\u30ec\u30d9\u30eb\u306e[[DARK_AQUA]]{1}[[GRAY]]\u304c\u5fc5\u8981\u3067\u3059\u3002
#STATISTICS
Stats.Header.Combat=[[GOLD]]-=\u30b3\u30f3\u30d0\u30c3\u30c8\u30b9\u30ad\u30eb=-
Stats.Header.Gathering=[[GOLD]]-=\u53ce\u96c6\u30b9\u30ad\u30eb=-
Stats.Header.Misc=[[GOLD]]-=\u305d\u306e\u4ed6\u306e\u30b9\u30ad\u30eb=-
Stats.Own.Stats=[[GREEN]][mcMMO] \u7d71\u8a08
#PERKS
Perks.XP.Name=\u7d4c\u9a13
Perks.XP.Desc=\u7279\u5b9a\u306e\u30b9\u30ad\u30eb\u306e\u30d6\u30fc\u30b9\u30c8XP\u3092\u53d7\u3051\u53d6\u308b\u3002
@ -783,6 +819,15 @@ Perks.Lucky.Name=\u30e9\u30c3\u30af
Perks.Lucky.Desc={0}\u306e\u30b9\u30ad\u30eb\u3068\u80fd\u529b\u306b\u300133.3\uff05\u306e\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8\u306e\u78ba\u7387\u3092\u4e0e\u3048\u307e\u3059\u3002
Perks.Lucky.Desc.Login=\u7279\u5b9a\u306e\u30b9\u30ad\u30eb\u3084\u80fd\u529b\u306b33.3\uff05\u306e\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8\u306e\u78ba\u7387\u3092\u4e0e\u3048\u308b\u3002
#MOTD
MOTD.Donate=[[DARK_AQUA]]\u5bc4\u4ed8\u60c5\u5831:
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u6709\u52b9: [[DARK_RED]]{0}
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30b9\u30ad\u30eb\u30c7\u30b9\u30da\u30ca\u30eb\u30c6\u30a3: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u5438\u8840\u7d71\u8a08: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[[GOLD]][mcMMO \u30d1\u30fc\u30af]
MOTD.Version=[[GOLD]][mcMMO] \u5b9f\u884c\u4e2d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u30a6\u30a7\u30d6\u30b5\u30a4\u30c8
#SMELTING
Smelting.SubSkill.UnderstandingTheArt.Name=\u82b8\u8853\u3092\u7406\u89e3\u3059\u308b
Smelting.SubSkill.UnderstandingTheArt.Description=\u6d1e\u7a9f\u306e\u4e2d\u3067\u88fd\u932c\u306b\u6642\u9593\u3092\u304b\u3051\u904e\u304e\u3066\u3044\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\n\u88fd\u932c\u306e\u3055\u307e\u3056\u307e\u306a\u7279\u6027\u3092\u5f37\u5316\u3057\u307e\u3059\u3002
@ -803,17 +848,38 @@ Smelting.SubSkill.FluxMining.Stat=\u30d5\u30e9\u30c3\u30af\u30b9\u30de\u30a4\u30
Smelting.Listener=\u7cbe\u932c:
Smelting.SkillName=\u7cbe\u932c
# Admin Notifications
Server.ConsoleName=[[YELLOW]][Server]
Notifications.Admin.XPRate.Start.Self=[[GRAY]]\u3042\u306a\u305f\u306f[[GOLD]]{0}x[[GRAY]]\u306b\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002
Notifications.Admin.XPRate.End.Self=[[GRAY]]XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002
Notifications.Admin.XPRate.End.Others={0}[[GRAY]]\u306fXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u7d42\u4e86\u3057\u307e\u3057\u305f
Notifications.Admin.XPRate.Start.Others={0}[[GRAY]]\u304c{1}x\u3067\u30b0\u30ed\u30fc\u30d0\u30ebXP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u3092\u958b\u59cb\u307e\u305f\u306f\u5909\u66f4\u3057\u307e\u3057\u305f
Notifications.Admin.Format.Others=[[GOLD]]([[GREEN]]mcMMO [[DARK_AQUA]]\u7ba1\u7406\u8005[[GOLD]]) [[GRAY]]{0}
Notifications.Admin.Format.Self=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GRAY]]{0}
# Event
XPRate.Event=[[GOLD]]mcMMO\u306f\u73fe\u5728XP\u30ec\u30fc\u30c8\u30a4\u30d9\u30f3\u30c8\u4e2d\u3067\u3059\uff01XP\u30ec\u30fc\u30c8\u306f{0}x\u3067\u3059\uff01
#COMMAND DESCRIPTIONS
Commands.Description.addlevels=\u30e6\u30fc\u30b6\u30fc\u306bmcMMO\u30ec\u30d9\u30eb\u3092\u8ffd\u52a0\u3059\u308b
Commands.Description.adminchat=mcMMO\u7ba1\u7406\u8005\u30c1\u30e3\u30c3\u30c8\u306e\u30aa\u30f3\/\u30aa\u30d5\u306e\u5207\u308a\u66ff\u3048\u3001\u307e\u305f\u306f\u7ba1\u7406\u8005\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u9001\u4fe1
Commands.Description.addxp=\u30e6\u30fc\u30b6\u30fc\u306bmcMMO XP\u3092\u8ffd\u52a0\u3059\u308b
Commands.Description.hardcore=mcMMO\u30cf\u30fc\u30c9\u30b3\u30a2\u306e\u30d1\u30fc\u30bb\u30f3\u30c6\u30fc\u30b8\u3092\u5909\u66f4\u3059\u308b\u304b\u3001\u30cf\u30fc\u30c9\u30b3\u30a2\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.inspect=\u4ed6\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u8a73\u7d30\u306amcMMO\u60c5\u5831\u3092\u898b\u308b
Commands.Description.mcability=\u53f3\u30af\u30ea\u30c3\u30af\u3067mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u6709\u52b9\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.mccooldown=mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u3092\u3059\u3079\u3066\u898b\u308b
Commands.Description.mcchatspy=mcMMO\u30d1\u30fc\u30c6\u30a3\u30fc\u30c1\u30e3\u30c3\u30c8\u306e\u30b9\u30d1\u30a4\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.mcgod=mcMMO\u306e\u30b4\u30c3\u30c9\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.mchud=mcMMO HUD\u30b9\u30bf\u30a4\u30eb\u3092\u5909\u66f4\u3059\u308b
Commands.Description.mcmmo=mcMMO\u306e\u7c21\u5358\u306a\u8aac\u660e\u3092\u8868\u793a\u3059\u308b
Commands.Description.mcnotify=mcMMO\u30a2\u30d3\u30ea\u30c6\u30a3\u306e\u30c1\u30e3\u30c3\u30c8\u8868\u793a\u901a\u77e5\u306b\u3064\u3044\u3066\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.mcpurge=mcMMO\u30ec\u30d9\u30eb\u306e\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u304a\u3088\u3073{0}\u30f6\u6708\u4ee5\u4e0a\u63a5\u7d9a\u3057\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u3092mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u3002
Commands.Description.mcrank=\u30d7\u30ec\u30a4\u30e4\u30fc\u306emcMMO\u30e9\u30f3\u30ad\u30f3\u30b0\u3092\u8868\u793a\u3059\u308b
Commands.Description.mcrefresh=mcMMO\u306e\u3059\u3079\u3066\u306e\u30af\u30fc\u30eb\u30c0\u30a6\u30f3\u3092\u66f4\u65b0\u3059\u308b
Commands.Description.mcremove=mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3059\u308b
Commands.Description.mcscoreboard=mcMMO\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9\u3092\u7ba1\u7406\u3059\u308b
Commands.Description.mcstats=mcMMO\u30ec\u30d9\u30eb\u3068XP\u3092\u8868\u793a
Commands.Description.mctop=mcMMO\u30ea\u30fc\u30c0\u30fc\u30dc\u30fc\u30c9\u3092\u8868\u793a
Commands.Description.mmoedit=\u30e6\u30fc\u30b6\u30fc\u306emcMMO\u30ec\u30d9\u30eb\u3092\u7de8\u96c6
Commands.Description.mmoupdate=mcMMO\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53e4\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u79fb\u884c\u3057\u307e\u3059\u3002
Commands.Description.mcconvert=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u7a2e\u985e\u307e\u305f\u306f\u7d4c\u9a13\u5024\u5f0f\u306e\u7a2e\u985e\u3092\u5909\u63db\u3059\u308b
Commands.Description.mmoshowdb=\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30bf\u30a4\u30d7\u306e\u540d\u524d\u3092\u8868\u793a\u3057\u307e\u3059\uff08\u5f8c\u3067\/mmoupdate\u3067\u4f7f\u7528\u3059\u308b\u305f\u3081\uff09
Commands.Description.party=\u3055\u307e\u3056\u307e\u306amcMMO\u30d1\u30fc\u30c6\u30a3\u306e\u8a2d\u5b9a\u3092\u7ba1\u7406\u3059\u308b
Commands.Description.partychat=mcMMO\u30d1\u30fc\u30c6\u30a3\u30c1\u30e3\u30c3\u30c8\u306e\u30aa\u30f3\/\u30aa\u30d5\u3092\u5207\u308a\u66ff\u3048\u305f\u308a\u3001\u30d1\u30fc\u30c6\u30a3\u30c1\u30e3\u30c3\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\u3057\u305f\u308a\u3057\u307e\u3059
Commands.Description.ptp=mcMMO\u30d1\u30fc\u30c6\u30a3\u30fc\u30e1\u30f3\u30d0\u30fc\u306b\u30c6\u30ec\u30dd\u30fc\u30c8\u3059\u308b
Commands.Description.Skill={0}\u306e\u8a73\u7d30\u306amcMMO\u30b9\u30ad\u30eb\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059
Commands.Description.skillreset=\u30e6\u30fc\u30b6\u30fc\u306emcMMO\u30ec\u30d9\u30eb\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b
Commands.Description.vampirism=mcMMO\u306e\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u306e\u5272\u5408\u3092\u5909\u66f4\u3059\u308b\u304b\u3001\u307e\u305f\u306f\u30f4\u30a1\u30f3\u30d1\u30a4\u30a2\u30e2\u30fc\u30c9\u306e\u30aa\u30f3\/\u30aa\u30d5\u306b\u5207\u308a\u66ff\u3048\u307e\u3059
Commands.Description.xplock=mcMMO XP\u30d0\u30fc\u3092\u7279\u5b9a\u306emcMMO\u30b9\u30ad\u30eb\u306b\u56fa\u5b9a\u3059\u308b
Commands.Description.xprate=mcMMO XP\u306e\u30ec\u30fc\u30c8\u3092\u5909\u66f4\u3059\u308b\u304b\u3001mcMMO XP\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u958b\u59cb\u3059\u308b
#UPDATE CHECKER
UpdateChecker.Outdated=\u3042\u306a\u305f\u306f\u53e4\u3044mcMMO\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\uff01
@ -839,8 +905,16 @@ Profile.Loading.Success=[[GREEN]]\u3042\u306a\u305f\u306emcMMO\u30d7\u30ed\u30d5
Profile.Loading.FailurePlayer=[[RED]]mcMMO\u306e\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059\u3002[[GREEN]]{0}[[RED]]\u56de\u8aad\u307f\u8fbc\u307f\u3092\u8a66\u3057\u307e\u3057\u305f\u3002[[LIGHT_GRAY]] \u3053\u306e\u554f\u984c\u306b\u3064\u3044\u3066\u30b5\u30fc\u30d0\u30fc\u7ba1\u7406\u8005\u306b\u9023\u7d61\u3057\u3066\u304f\u3060\u3055\u3044\u3002mcMMO\u306f\u3042\u306a\u305f\u304c\u5207\u65ad\u3059\u308b\u307e\u3067\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u3092\u7e70\u308a\u8fd4\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u304c\u8aad\u307f\u8fbc\u307e\u308c\u3066\u3044\u306a\u3044\u9593XP\u3092\u7372\u5f97\u3067\u304d\u306a\u3044\u304b\u3001\u30b9\u30ad\u30eb\u3092\u4f7f\u3046\u3053\u3068\u304c\u51fa\u6765\u307e\u305b\u3093\u3002
Profile.Loading.FailureNotice=[[DARK_RED]][A][[RED]] mcMMO\u306f[[YELLOW]]{0}[[RED]]\u306e\u30d7\u30ec\u30fc\u30e4\u30fc\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002 [[LIGHT_PURPLE]]\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u307e\u3067\u306e\u8a66\u884c\u56de\u6570\u306f{1}\u56de\u3067\u3059\u3002
#Holiday
Holiday.AprilFools.Levelup=[[GOLD]]{0}\u306f\u30ec\u30d9\u30eb[[GREEN]]{1}[[GOLD]]\u306b\u306a\u308a\u307e\u3057\u305f\u3002
Holiday.Anniversary=[[BLUE]]{0}\u5468\u5e74\u8a18\u5ff5\uff01\n[[BLUE]]nossr50\u306e\u5168\u3066\u306e\u4ed5\u4e8b\u3068\u5168\u3066\u306e\u958b\u767a\u3092\u8a18\u5ff5\u3057\u3066\uff01
#Reminder Messages
Reminder.Squelched=[[GRAY]]\u30ea\u30de\u30a4\u30f3\u30c0\u30fc: \u3042\u306a\u305f\u306f\u73fe\u5728mcMMO\u304b\u3089\u901a\u77e5\u3092\u53d7\u3051\u53d6\u3063\u3066\u3044\u307e\u305b\u3093\u3002\u901a\u77e5\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u306f\/mcnotify\u30b3\u30de\u30f3\u30c9\u3092\u3082\u3046\u4e00\u5ea6\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u306f\u81ea\u52d5\u5316\u3055\u308c\u305f1\u6642\u9593\u3054\u3068\u306e\u901a\u77e5\u3067\u3059\u3002
#Locale
Locale.Reloaded=[[GREEN]]\u30ed\u30b1\u30fc\u30eb \u30ea\u30ed\u30fc\u30c9\uff01
#Player Leveling Stuff
LevelCap.PowerLevel=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[RED]]{0}[[YELLOW]]\u306e\u30d1\u30ef\u30fc\u30ec\u30d9\u30eb\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7\u306b\u9054\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u4ee5\u964d\u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30a2\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002
LevelCap.Skill=[[GOLD]]([[GREEN]]mcMMO[[GOLD]]) [[GOLD]]{1}[[YELLOW]]\u306e\u30ec\u30d9\u30eb\u30ad\u30e3\u30c3\u30d7[[RED]]{0}[[YELLOW]]\u306b\u9054\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u4ee5\u964d\u30b9\u30ad\u30eb\u306e\u30ec\u30d9\u30eb\u30a2\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002

View File

@ -14,7 +14,7 @@ Alchemy:
Concoctions:
Standard:
Rank_1: 0
Rank_2: 25
Rank_2: 1
Rank_3: 35
Rank_4: 50
Rank_5: 65
@ -23,7 +23,7 @@ Alchemy:
Rank_8: 100
RetroMode:
Rank_1: 0
Rank_2: 250
Rank_2: 1
Rank_3: 350
Rank_4: 500
Rank_5: 650
@ -56,12 +56,12 @@ Archery:
Rank_10: 1000
ArrowRetrieval:
Standard:
Rank_1: 2
Rank_1: 1
RetroMode:
Rank_1: 20
Rank_1: 1
SkillShot:
Standard:
Rank_1: 5
Rank_1: 1
Rank_2: 10
Rank_3: 15
Rank_4: 20
@ -82,7 +82,7 @@ Archery:
Rank_19: 95
Rank_20: 100
RetroMode:
Rank_1: 50
Rank_1: 1
Rank_2: 100
Rank_3: 150
Rank_4: 200
@ -105,9 +105,9 @@ Archery:
Acrobatics:
Dodge:
Standard:
Rank_1: 2
Rank_1: 1
RetroMode:
Rank_1: 20
Rank_1: 1
Axes:
AxesLimitBreak:
Standard:
@ -139,9 +139,9 @@ Axes:
Rank_1: 50
CriticalStrikes:
Standard:
Rank_1: 2
Rank_1: 1
RetroMode:
Rank_1: 20
Rank_1: 1
GreaterImpact:
Standard:
Rank_1: 25
@ -149,7 +149,7 @@ Axes:
Rank_1: 250
ArmorImpact:
Standard:
Rank_1: 5
Rank_1: 1
Rank_2: 10
Rank_3: 15
Rank_4: 20
@ -170,7 +170,7 @@ Axes:
Rank_19: 95
Rank_20: 100
RetroMode:
Rank_1: 50
Rank_1: 1
Rank_2: 100
Rank_3: 150
Rank_4: 200
@ -204,9 +204,9 @@ Axes:
Taming:
BeastLore:
Standard:
Rank_1: 2
Rank_1: 1
RetroMode:
Rank_1: 20
Rank_1: 1
Gore:
Standard:
Rank_1: 15
@ -214,9 +214,9 @@ Taming:
Rank_1: 150
CallOfTheWild:
Standard:
Rank_1: 5
Rank_1: 1
RetroMode:
Rank_1: 50
Rank_1: 1
Pummel:
Standard:
Rank_1: 20
@ -284,7 +284,7 @@ Smelting:
Salvage:
ScrapCollector:
Standard:
Rank_1: 2
Rank_1: 1
Rank_2: 10
Rank_3: 15
Rank_4: 20
@ -293,7 +293,7 @@ Salvage:
Rank_7: 35
Rank_8: 40
RetroMode:
Rank_1: 20
Rank_1: 1
Rank_2: 100
Rank_3: 150
Rank_4: 200
@ -321,6 +321,11 @@ Salvage:
Rank_7: 850
Rank_8: 1000
Mining:
DoubleDrops:
Standard:
Rank_1: 1
RetroMode:
Rank_1: 1
SuperBreaker:
Standard:
Rank_1: 5
@ -358,6 +363,11 @@ Mining:
Rank_7: 850
Rank_8: 1000
Herbalism:
DoubleDrops:
Standard:
Rank_1: 1
RetroMode:
Rank_1: 1
GreenTerra:
Standard:
Rank_1: 5
@ -423,7 +433,7 @@ Fishing:
Rank_5: 1000
TreasureHunter:
Standard:
Rank_1: 10
Rank_1: 1
Rank_2: 25
Rank_3: 35
Rank_4: 50
@ -432,7 +442,7 @@ Fishing:
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_1: 1
Rank_2: 250
Rank_3: 350
Rank_4: 500
@ -487,20 +497,20 @@ Swords:
Rank_1: 200
Rupture:
Standard:
Rank_1: 5
Rank_1: 1
Rank_2: 15
Rank_3: 75
Rank_4: 90
RetroMode:
Rank_1: 50
Rank_1: 1
Rank_2: 150
Rank_3: 750
Rank_4: 900
SerratedStrikes:
Standard:
Rank_1: 10
Rank_1: 5
RetroMode:
Rank_1: 100
Rank_1: 50
Unarmed:
UnarmedLimitBreak:
Standard:
@ -527,9 +537,9 @@ Unarmed:
Rank_10: 1000
Berserk:
Standard:
Rank_1: 10
Rank_1: 5
RetroMode:
Rank_1: 100
Rank_1: 50
ArrowDeflect:
Standard:
Rank_1: 20
@ -547,13 +557,13 @@ Unarmed:
Rank_1: 600
IronArmStyle:
Standard:
Rank_1: 2
Rank_1: 1
Rank_2: 25
Rank_3: 50
Rank_4: 75
Rank_5: 100
RetroMode:
Rank_1: 20
Rank_1: 1
Rank_2: 250
Rank_3: 500
Rank_4: 750
@ -604,7 +614,7 @@ Woodcutting:
Standard:
Rank_1: 1
RetroMode:
Rank_1: 10
Rank_1: 1
LeafBlower:
Standard:
Rank_1: 15
@ -622,7 +632,7 @@ Excavation:
Rank_1: 50
Archaeology:
Standard:
Rank_1: 5
Rank_1: 1
Rank_2: 25
Rank_3: 35
Rank_4: 50
@ -631,7 +641,7 @@ Excavation:
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 50
Rank_1: 1
Rank_2: 250
Rank_3: 350
Rank_4: 500
@ -642,9 +652,9 @@ Excavation:
Repair:
RepairMastery:
Standard:
Rank_1: 20
Rank_1: 1
RetroMode:
Rank_1: 200
Rank_1: 1
SuperRepair:
Standard:
Rank_1: 40