/******************************************************************************* * Copyright 2014 Tobias Welther * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tobiyas.racesandclasses.playermanagement.leveling.manager; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.api.ExperienceAPI; import com.gmail.nossr50.datatypes.skills.SkillType; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.saving.PlayerSavingData; public class McMMOLevelManager extends AbstractPlayerLevelingSystem { /** * The String to calc the McMMO Level. */ private final String calcString; /** * Sets up the Plugin. */ public McMMOLevelManager(RaCPlayer player, PlayerSavingData data) { super(player, data); calcString = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().getConfig_mapExpPerLevelCalculationString(); } @Override public int getCurrentLevel() { if(!isMcMMOPresent()) return 1; return calcCurrentLevel(); } @Override public int getCurrentExpOfLevel() { if(!isMcMMOPresent()) return 1; return 0; } @Override public void setCurrentLevel(int level) { //not supported by Skill API } @Override public void setCurrentExpOfLevel(int currentExpOfLevel) { //not supported by Skill API } @Override public boolean addExp(int exp) { return false; } @Override public boolean removeExp(int exp) { return false; } @Override public void checkLevelChanged() { //nothing to do. } @Override public boolean canRemove(int toRemove) { return false; } /** * Checks if the mcMMO Plugin is present. * * @return true if is present, false if not. */ private boolean isMcMMOPresent(){ try{ mcMMO mcMMO = getMCMMO(); if(mcMMO == null) return false; return mcMMO.isEnabled(); }catch(Throwable exp){ return false; } } /** * Returns the Skill API class. * * @return the Skill API class or Null. */ private mcMMO getMCMMO(){ try{ return (mcMMO) Bukkit.getPluginManager().getPlugin("mcMMO"); }catch(Throwable exp){ return null; } } /** * Checks if the McMMO String works. * * @param generatorString * @return */ public static boolean verifyGeneratorStringWorks(String generatorString){ try{ generatorString = generatorString.toLowerCase(); ScriptEngineManager mgr = null; ScriptEngine engine = null; try{ mgr = new ScriptEngineManager(); engine = mgr.getEngineByName("JavaScript"); }catch(Throwable exp){ RacesAndClasses.getPlugin().logStackTrace("Could no load JavaScript Engine! You can't use mcmmo skills.", exp); return false; } generatorString = generatorString.replace("{powerlevel}", String.valueOf(42)); for(SkillType type : SkillType.values()){ generatorString = generatorString.replace("{" + type.name().toLowerCase() + "}", String.valueOf(42)); generatorString = generatorString.replace("{" + type.getName().toLowerCase() + "}", String.valueOf(42)); generatorString = generatorString.replace(type.name().toLowerCase(), String.valueOf(42)); generatorString = generatorString.replace(type.getName().toLowerCase(), String.valueOf(42)); } String parsedValue = (String) engine.eval(generatorString).toString(); double doubleValue = Double.parseDouble(parsedValue); Integer intValue = (int) doubleValue; return intValue != null; }catch(Throwable exp){ RacesAndClasses.getPlugin().logStackTrace("Could not compile your MCMMO Level String. Please fix it!", exp); return false; } } /** * This calcs the current level of the Player passed. * * @param playerName to parse * * @return the level of the Player or 1 if something gone wrong. */ private int calcCurrentLevel(){ String generatorString = this.calcString.toLowerCase(); try{ ScriptEngineManager mgr = null; ScriptEngine engine = null; try{ mgr = new ScriptEngineManager(); engine = mgr.getEngineByName("JavaScript"); }catch(Throwable exp){ return 1; } Player pl = getPlayer().getPlayer(); int powerLevel = ExperienceAPI.getPowerLevel(pl); generatorString = generatorString.replace("{powerlevel}", String.valueOf(powerLevel)); for(SkillType type : SkillType.values()){ int skillLevel = ExperienceAPI.getLevel(pl, type.name()); generatorString = generatorString.replace("{" + type.getName().toLowerCase() + "}", String.valueOf(skillLevel)); generatorString = generatorString.replace("{" + type.name().toLowerCase() + "}", String.valueOf(skillLevel)); generatorString = generatorString.replace(type.getName().toLowerCase(), String.valueOf(skillLevel)); generatorString = generatorString.replace(type.name().toLowerCase(), String.valueOf(skillLevel)); } String parsedValue = (String) engine.eval(generatorString).toString(); double doubleValue = Double.parseDouble(parsedValue); Integer intValue = (int) doubleValue; return intValue; }catch(Throwable exp){ return 1; } } @Override public void addLevel(int value) { } @Override public void removeLevel(int value) { } @Override public int getMaxEXPToNextLevel() { return 1; } }