1
0
mirror of https://github.com/Zrips/Jobs.git synced 2024-11-25 20:16:13 +01:00

Initial support for built in placeholders for PlaceHolderAPI

Couple base placeholders
This commit is contained in:
Zrips 2018-12-25 12:52:38 +02:00
parent 3ea901d5c4
commit edb943be11
10 changed files with 759 additions and 68 deletions

13
pom.xml
View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>Jobs</groupId>
<artifactId>jobs</artifactId>
<version>4.9.4</version>
<version>4.9.5</version>
<name>Jobs</name>
<url>http://maven.apache.org</url>
<properties>
@ -105,6 +105,12 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.0.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<!-- WorldGuard & WorldEdit -->
@ -132,6 +138,11 @@
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<!-- PlaceholderAPI -->
<repository>
<id>placeholderapi</id>
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories>
<!-- Builds Plugin -->
<build>

View File

@ -662,7 +662,7 @@ public class ItemManager {
BLACK_CARPET(171, 15, 6056, "Black Carpet"),
BLACK_CONCRETE(251, 15, 13338, "Black Concrete", "CONCRETE"),
BLACK_CONCRETE_POWDER(252, 15, 16150, "Black Concrete Powder", "CONCRETE_POWDER"),
BLACK_DYE(351, -1, 26753, "Black Dye"),
BLACK_DYE(-1, -1, 26753, "Black Dye"),
BLACK_GLAZED_TERRACOTTA(250, 0, 29678, "Black Glazed Terracotta"),
BLACK_SHULKER_BOX(234, 0, 24076, "Black Shulker Box"),
BLACK_STAINED_GLASS(95, 15, 13941, "Black Stained Glass"),
@ -678,7 +678,7 @@ public class ItemManager {
BLUE_CARPET(171, 11, 13292, "Blue Carpet"),
BLUE_CONCRETE(251, 11, 18756, "Blue Concrete"),
BLUE_CONCRETE_POWDER(252, 11, 17773, "Blue Concrete Powder"),
BLUE_DYE(351, -1, 12344, "Blue Dye"),
BLUE_DYE(-1, -1, 12344, "Blue Dye"),
BLUE_GLAZED_TERRACOTTA(246, 0, 23823, "Blue Glazed Terracotta"),
BLUE_ICE(-1, -1, 22449, "Blue Ice"),
BLUE_ORCHID(38, 1, 13432, "Blue Orchid"),
@ -710,7 +710,7 @@ public class ItemManager {
BROWN_CARPET(171, 12, 23352, "Brown Carpet"),
BROWN_CONCRETE(251, 12, 19006, "Brown Concrete"),
BROWN_CONCRETE_POWDER(252, 12, 21485, "Brown Concrete Powder"),
BROWN_DYE(351, -1, 4237, "Brown Dye"),
BROWN_DYE(-1, -1, 4237, "Brown Dye"),
BROWN_GLAZED_TERRACOTTA(247, 0, 5655, "Brown Glazed Terracotta"),
BROWN_MUSHROOM(39, 0, 9665, "Brown Mushroom"),
BROWN_MUSHROOM_BLOCK(99, 0, 6291, "Brown Mushroom Block", "HUGE_MUSHROOM_1"),
@ -1492,7 +1492,7 @@ public class ItemManager {
WHITE_CARPET(171, 0, 15117, "White Carpet"),
WHITE_CONCRETE(251, 0, 6281, "White Concrete"),
WHITE_CONCRETE_POWDER(252, 0, 10363, "White Concrete Powder"),
WHITE_DYE(351, -1, 5276, "White Dye"),
WHITE_DYE(-1, -1, 5276, "White Dye"),
WHITE_GLAZED_TERRACOTTA(235, 0, 11326, "White Glazed Terracotta"),
WHITE_SHULKER_BOX(219, 0, 31750, "White Shulker Box"),
WHITE_STAINED_GLASS(95, 0, 31190, "White Stained Glass"),

View File

@ -49,6 +49,8 @@ import com.gamingmesh.jobs.MyPet.MyPetManager;
import com.gamingmesh.jobs.MythicMobs.MythicMobInterface;
import com.gamingmesh.jobs.MythicMobs.MythicMobs2;
import com.gamingmesh.jobs.MythicMobs.MythicMobs4;
import com.gamingmesh.jobs.Placeholders.Placeholder;
import com.gamingmesh.jobs.Placeholders.PlaceholderAPIHook;
import com.gamingmesh.jobs.Signs.SignUtil;
import com.gamingmesh.jobs.WorldGuard.WorldGuardManager;
import com.gamingmesh.jobs.api.JobsExpGainEvent;
@ -190,6 +192,23 @@ public class Jobs extends JavaPlugin {
return myPetManager;
}
private Placeholder Placeholder;
private boolean PlaceholderAPIEnabled = false;
public Placeholder getPlaceholderAPIManager() {
if (Placeholder == null)
Placeholder = new Placeholder(this);
return Placeholder;
}
private boolean setupPlaceHolderAPI() {
if (!getServer().getPluginManager().isPluginEnabled("PlaceholderAPI"))
return false;
if ((new PlaceholderAPIHook(this)).hook())
Bukkit.getConsoleSender().sendMessage("[Jobs] PlaceholderAPI hooked.");
return true;
}
public static WorldGuardManager getWorldGuardManager() {
return worldGuardManager;
}
@ -765,6 +784,16 @@ public class Jobs extends JavaPlugin {
e.printStackTrace();
return;
}
try {
if (setupPlaceHolderAPI()) {
consoleMsg("PlaceholderAPI was found - Enabling capabilities.");
PlaceholderAPIEnabled = true;
} else {
consoleMsg("PlaceholderAPI nope");
}
} catch (Exception e) {
e.printStackTrace();
}
try {
@ -1330,4 +1359,8 @@ public class Jobs extends JavaPlugin {
if (pageCount != 0)
rm.show(sender);
}
public boolean isPlaceholderAPIEnabled() {
return PlaceholderAPIEnabled;
}
}

View File

@ -0,0 +1,125 @@
package com.gamingmesh.jobs.Placeholders;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatFilterRule {
public enum ChatFilterBlockType {
All(0), Others(1), None(2);
private int id;
ChatFilterBlockType(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
private String replaceWith;
private ChatFilterBlockType blockType;
private String ruleName;
private List<Pattern> pattern = new ArrayList<Pattern>();
private String messageToStaff;
private List<String> commands = new ArrayList<String>();
private String group;
public ChatFilterRule(String ruleName, String group, List<String> list, String replaceWith, ChatFilterBlockType blockType, String messageToStaff, List<String> commands) {
this.group = group;
this.ruleName = ruleName;
this.commands = commands;
setPattern(list);
this.messageToStaff = messageToStaff;
this.replaceWith = replaceWith;
this.blockType = blockType;
}
public ChatFilterRule(String ruleName, List<String> list) {
this.ruleName = ruleName;
setPattern(list);
this.blockType = ChatFilterBlockType.None;
}
public ChatFilterRule() {
}
public List<Pattern> getPattern() {
return pattern;
}
public ChatFilterRule setPattern(String list) {
setPattern(Arrays.asList(list));
return this;
}
public void setPattern(List<String> list) {
pattern.clear();
for (String one : list) {
pattern.add(Pattern.compile(one));
}
}
public String getReplaceWith() {
return replaceWith;
}
public void setReplaceWith(String replaceWith) {
this.replaceWith = replaceWith;
}
public ChatFilterBlockType getBlockType() {
return blockType;
}
public void setBlockType(ChatFilterBlockType blockType) {
this.blockType = blockType;
}
public String getRuleName() {
return ruleName;
}
public void setRuleName(String ruleName) {
this.ruleName = ruleName;
}
public Matcher getMatcher(String msg) {
Matcher matcher = null;
for (Pattern one : pattern) {
if (one.matcher(msg).find()) {
matcher = one.matcher(msg);
break;
}
}
return matcher;
}
public String getMessageToStaff() {
return messageToStaff;
}
public void setMessageToStaff(String messageToStaff) {
this.messageToStaff = messageToStaff;
}
public List<String> getCommands() {
return commands;
}
public void setCommands(List<String> commands) {
this.commands = commands;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
}

View File

@ -0,0 +1,490 @@
package com.gamingmesh.jobs.Placeholders;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.entity.Player;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.container.CurrencyType;
import com.gamingmesh.jobs.container.Job;
import com.gamingmesh.jobs.container.JobProgression;
import com.gamingmesh.jobs.container.JobsPlayer;
public class Placeholder {
private Jobs plugin;
Pattern placeholderPatern = Pattern.compile("(%)([^\"^%]*)(%)");
public Placeholder(Jobs plugin) {
this.plugin = plugin;
}
static String pref = "jobsr";
private static ChatFilterRule numericalRule = new ChatFilterRule().setPattern("(\\$\\d)");
public enum JobsPlaceHolders {
user_id,
user_bstandcount,
user_maxbstandcount,
user_furncount,
user_maxfurncount,
user_doneq,
user_totallevels,
user_displayhonorific,
user_joinedjobcount,
maxjobs,
name_$1("number/name"),
shortname_$1("number/name"),
chatcolor_$1("number/name"),
description_$1("number/name"),
maxdailyq_$1("number/name"),
maxlvl_$1("number/name"),
maxviplvl_$1("number/name"),
totalplayers_$1("number/name"),
maxslots_$1("number/name"),
user_boost_$1_$2("jobname/number", "money/exp/points"),
user_isin_$1("jobname/number"),
user_canjoin_$1("jobname/number");
private String[] vars;
private List<Integer> groups = new ArrayList<Integer>();
private ChatFilterRule rule = null;
private boolean hidden = false;
JobsPlaceHolders() {
}
JobsPlaceHolders(String... vars) {
Matcher matcher = numericalRule.getMatcher(this.toString());
if (matcher != null) {
rule = new ChatFilterRule();
List<String> ls = new ArrayList<String>();
ls.add("(%" + pref + "_)" + this.toString().replaceAll("\\$\\d", "([^\"^%]*)") + "(%)");
// For MVdWPlaceholderAPI
// ls.add("(\\{" + pref + this.toString().replaceAll("\\$\\d", "([^\"^%]*)" + "(\\})"));
rule.setPattern(ls);
while (matcher.find()) {
try {
int id = Integer.parseInt(matcher.group(1).substring(1));
groups.add(id);
} catch (Exception e) {
e.printStackTrace();
}
}
}
this.vars = vars;
this.hidden = false;
}
public static JobsPlaceHolders getByName(String name) {
String original = name;
// name = name.replace("_", "");
for (JobsPlaceHolders one : JobsPlaceHolders.values()) {
if (one.isComplex())
continue;
// String n = one.name().replace("_", "");
if (one.name().equalsIgnoreCase(name)) {
return one;
}
}
name = pref + name;
for (JobsPlaceHolders one : JobsPlaceHolders.values()) {
if (one.isComplex())
continue;
String n = one.name();
if (n.equalsIgnoreCase(name)) {
return one;
}
}
name = "%" + pref + "_" + original + "%";
for (JobsPlaceHolders one : JobsPlaceHolders.values()) {
if (!one.isComplex())
continue;
if (!one.getComplexRegexMatchers(name).isEmpty()) {
return one;
}
}
// For MVdWPlaceholderAPI
// if (Jobs.getInstance().isMVdWPlaceholderAPIEnabled() && original.startsWith(pref+"_")) {
// String t = "{" + original + "}";
// for (JobsPlaceHolders one : JobsPlaceHolders.values()) {
// if (!one.isComplex())
// continue;
// if (!one.getComplexRegexMatchers(t).isEmpty()) {
// return one;
// }
// }
// }
return null;
}
public static JobsPlaceHolders getByNameExact(String name) {
name = name.toLowerCase();
for (JobsPlaceHolders one : JobsPlaceHolders.values()) {
if (one.isComplex()) {
if (!one.getComplexRegexMatchers("%" + name + "%").isEmpty()) {
return one;
}
} else {
String n = one.name();
if (n.equals(name))
return one;
}
}
return null;
}
public String getFull() {
if (this.isComplex()) {
String name = this.name();
int i = 0;
for (String one : this.name().split("_")) {
if (!one.startsWith("$"))
continue;
if (vars.length >= i - 1)
name = name.replace(one, "[" + vars[i] + "]");
i++;
}
return "%" + name + "%";
}
return "%" + this.name() + "%";
}
public String getMVdW() {
if (this.isComplex()) {
String name = this.name();
int i = 0;
for (String one : this.name().split("_")) {
if (!one.startsWith("$"))
continue;
if (vars.length >= i - 1)
name = name.replace(one, "*");
i++;
}
return name;
}
return this.name();
}
public List<String> getComplexRegexMatchers(String text) {
List<String> lsInLs = new ArrayList<String>();
if (!this.isComplex())
return lsInLs;
Matcher matcher = this.getRule().getMatcher(text);
if (matcher == null)
return lsInLs;
while (matcher.find()) {
lsInLs.add(matcher.group());
}
return lsInLs;
}
public List<String> getComplexValues(String text) {
List<String> lsInLs = new ArrayList<String>();
if (!this.isComplex() || text == null)
return lsInLs;
Matcher matcher = this.getRule().getMatcher(text);
if (matcher == null)
return lsInLs;
while (matcher.find()) {
try {
for (Integer oneG : groups) {
lsInLs.add(matcher.group(oneG + 1));
}
} catch (Exception e) {
}
break;
}
return lsInLs;
}
public boolean isComplex() {
return rule != null;
}
public ChatFilterRule getRule() {
return rule;
}
public void setRule(ChatFilterRule rule) {
this.rule = rule;
}
public boolean isHidden() {
return hidden;
}
}
public List<String> updatePlaceHolders(Player player, List<String> messages) {
List<String> ms = new ArrayList<String>(messages);
for (int i = 0, l = messages.size(); i < l; ++i) {
ms.set(i, updatePlaceHolders(player, messages.get(i)));
}
return ms;
}
public enum JobsPlaceholderType {
Jobs, PAPI, MVdW;
}
public JobsPlaceholderType getPlaceHolderType(Player player, String placeholder) {
if (placeholder == null)
return null;
if (placeholder.contains("%")) {
if (!placeholder.equals(translateOwnPlaceHolder(player, placeholder)))
return JobsPlaceholderType.Jobs;
}
if (plugin.isPlaceholderAPIEnabled()) {
try {
if (placeholder.contains("%"))
if (!placeholder.equals(me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, placeholder)))
return JobsPlaceholderType.PAPI;
} catch (Exception e) {
}
}
// For MVdWPlaceholderAPI
// if (plugin.isMVdWPlaceholderAPIEnabled()) {
// if (placeholder.contains("{"))
// if (!placeholder.equals(be.maximvdw.placeholderapi.PlaceholderAPI.replacePlaceholders(player, placeholder)))
// return CMIPlaceholderType.MVdW;
// }
return null;
}
public String updatePlaceHolders(Player player, String message) {
if (message == null)
return null;
if (message.contains("%"))
message = translateOwnPlaceHolder(player, message);
if (plugin.isPlaceholderAPIEnabled()) {
try {
if (message.contains("%"))
message = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, message);
} catch (Exception e) {
}
}
// For MVdWPlaceholderAPI
// if (plugin.isMVdWPlaceholderAPIEnabled()) {
// if (message.contains("{"))
// message = be.maximvdw.placeholderapi.PlaceholderAPI.replacePlaceholders(player, message);
// }
return message;
}
private String translateOwnPlaceHolder(Player player, String message) {
if (message == null)
return null;
if (message.contains("%")) {
Matcher match = placeholderPatern.matcher(message);
while (match.find()) {
try {
String cmd = match.group(2);
if (!message.contains("%"))
break;
JobsPlaceHolders place = JobsPlaceHolders.getByNameExact(cmd);
if (place == null)
continue;
String group = match.group();
String with = this.getValue(player, place, group);
if (with == null)
with = "";
if (with.startsWith("$"))
with = "\\" + with;
message = message.replaceFirst(group, with);
} catch (Exception e) {
// e.printStackTrace();
}
}
}
return message;
}
public String getValue(Player player, JobsPlaceHolders placeHolder) {
return getValue(player, placeHolder, null);
}
public String getValue(Player player, JobsPlaceHolders placeHolder, String value) {
return getValue(player != null ? player.getUniqueId() : null, placeHolder, value);
}
private static JobProgression getProgFromValue(JobsPlayer user, String value) {
JobProgression j = null;
try {
int id = Integer.parseInt(value);
if (id > 0)
j = user.getJobProgression().get(id - 1);
} catch (Exception e) {
Job job = Jobs.getJob(value);
if (job != null)
j = user.getJobProgression(job);
}
return j;
}
private static Job getJobFromValue(String value) {
Job j = null;
try {
int id = Integer.parseInt(value);
if (id > 0)
j = Jobs.getJobs().get(id - 1);
} catch (Exception e) {
j = Jobs.getJob(value);
}
return j;
}
private static String simplifyDouble(double value) {
return String.valueOf((int) (value * 100) / 100D);
}
public String getValue(UUID uuid, JobsPlaceHolders placeHolder, String value) {
JobsPlayer user = Jobs.getPlayerManager().getJobsPlayer(uuid);
if (placeHolder == null)
return null;
// Placeholders by JobsPLayer object
if (user != null) {
switch (placeHolder) {
case user_id:
return String.valueOf(user.getUserId());
case user_bstandcount:
return String.valueOf(user.getBrewingStandCount());
case user_maxbstandcount:
return String.valueOf(user.getMaxBrewingStandsAllowed());
case user_furncount:
return String.valueOf(user.getFurnaceCount());
case user_maxfurncount:
return String.valueOf(user.getMaxFurnacesAllowed());
case user_doneq:
return String.valueOf(user.getDoneQuests());
case user_totallevels:
return String.valueOf(user.getTotalLevels());
case user_displayhonorific:
return String.valueOf(user.getDisplayHonorific());
case user_joinedjobcount:
return String.valueOf(user.getJobProgression().size());
case user_boost_$1_$2:
List<String> values = placeHolder.getComplexValues(value);
if (values.size() < 2)
return "";
JobProgression j = getProgFromValue(user, values.get(0));
if (j == null)
return "";
return simplifyDouble(user.getBoost(j.getJob().getName(), CurrencyType.getByName(values.get(1))));
case user_isin_$1:
values = placeHolder.getComplexValues(value);
if (values.isEmpty())
return "";
Job job = getJobFromValue(values.get(0));
if (job == null)
return "";
return convert(user.isInJob(job));
default:
break;
}
}
// Placeholders by player object
if (user != null && user.isOnline()) {
Player player = user.getPlayer();
if (player != null) {
List<String> values;
switch (placeHolder) {
case user_canjoin_$1:
values = placeHolder.getComplexValues(value);
if (values.isEmpty())
return "";
Job job = getJobFromValue(values.get(0));
if (job == null)
return "";
if (!Jobs.getCommandManager().hasJobPermission(player, job)) {
return convert(false);
}
if (user.isInJob(job)) {
return convert(false);
}
if (job.getMaxSlots() != null && Jobs.getUsedSlots(job) >= job.getMaxSlots()) {
return convert(false);
}
int confMaxJobs = Jobs.getGCManager().getMaxJobs();
short PlayerMaxJobs = (short) user.getJobProgression().size();
if (confMaxJobs > 0 && PlayerMaxJobs >= confMaxJobs && !Jobs.getPlayerManager().getJobsLimit(user, PlayerMaxJobs)) {
return convert(false);
}
return convert(true);
default:
break;
}
}
}
List<String> values = new ArrayList<String>();
if (placeHolder.isComplex()) {
values = placeHolder.getComplexValues(value);
if (values.isEmpty())
return "";
Job j = getJobFromValue(values.get(0));
// Global placeholders by jobname
switch (placeHolder) {
case name_$1:
return j == null ? "" : j.getName();
case shortname_$1:
return j == null ? "" : j.getShortName();
case chatcolor_$1:
return j == null ? "" : j.getChatColor().toString();
case description_$1:
return j == null ? "" : j.getDescription();
case maxdailyq_$1:
return j == null ? "" : String.valueOf(j.getMaxDailyQuests());
case maxlvl_$1:
return j == null ? "" : String.valueOf(j.getMaxLevel());
case maxviplvl_$1:
return j == null ? "" : String.valueOf(j.getVipMaxLevel());
case totalplayers_$1:
return j == null ? "" : String.valueOf(j.getTotalPlayers());
case maxslots_$1:
return j == null ? "" : String.valueOf(j.getMaxSlots());
default:
break;
}
}
// Global placeholders
switch (placeHolder) {
case maxjobs:
return String.valueOf(Jobs.getGCManager().getMaxJobs());
}
return null;
}
private String convert(boolean state) {
return state ? Jobs.getLanguage().getMessage("general.info.true") : Jobs.getLanguage().getMessage("general.info.false");
}
}

View File

@ -0,0 +1,28 @@
package com.gamingmesh.jobs.Placeholders;
import org.bukkit.entity.Player;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.Placeholders.Placeholder.JobsPlaceHolders;
import me.clip.placeholderapi.external.EZPlaceholderHook;
public class PlaceholderAPIHook extends EZPlaceholderHook {
private Jobs plugin;
public PlaceholderAPIHook(Jobs plugin) {
super(plugin, Placeholder.pref);
this.plugin = plugin;
}
@Override
public String onPlaceholderRequest(Player player, String identifier) {
JobsPlaceHolders placeHolder = JobsPlaceHolders.getByName(identifier);
if (placeHolder == null) {
return null;
}
return plugin.getPlaceholderAPIManager().getValue(player, placeHolder, "%" + Placeholder.pref + "_" + identifier + "%");
}
}

View File

@ -2,79 +2,79 @@ package com.gamingmesh.jobs.Signs;
public class Sign {
private int Category = 0;
private String World = null;
private double x = 0.01;
private double y = 0.01;
private double z = 0.01;
private int Number = 0;
private String JobName = null;
private boolean special = false;
private int Category = 0;
private String World = null;
private double x = 0.01;
private double y = 0.01;
private double z = 0.01;
private int Number = 0;
private String JobName = null;
private boolean special = false;
public Sign() {
}
public Sign() {
}
public void setSpecial(boolean special) {
this.special = special;
}
public void setSpecial(boolean special) {
this.special = special;
}
public boolean isSpecial() {
return special;
}
public boolean isSpecial() {
return special;
}
public void setJobName(String JobName) {
this.JobName = JobName;
}
public void setJobName(String JobName) {
this.JobName = JobName;
}
public String GetJobName() {
return JobName;
}
public String GetJobName() {
return JobName;
}
public void setCategory(int Category) {
this.Category = Category;
}
public void setCategory(int Category) {
this.Category = Category;
}
public int GetCategory() {
return Category;
}
public int GetCategory() {
return Category;
}
public void setWorld(String World) {
this.World = World;
}
public void setWorld(String World) {
this.World = World;
}
public String GetWorld() {
return World;
}
public String GetWorld() {
return World;
}
public void setX(double x) {
this.x = x;
}
public void setX(double x) {
this.x = x;
}
public double GetX() {
return x;
}
public double GetX() {
return x;
}
public void setY(double y) {
this.y = y;
}
public void setY(double y) {
this.y = y;
}
public double GetY() {
return y;
}
public double GetY() {
return y;
}
public void setZ(double z) {
this.z = z;
}
public void setZ(double z) {
this.z = z;
}
public double GetZ() {
return z;
}
public double GetZ() {
return z;
}
public void setNumber(int Number) {
this.Number = Number;
}
public void setNumber(int Number) {
this.Number = Number;
}
public int GetNumber() {
return Number;
}
public int GetNumber() {
return Number;
}
}

View File

@ -135,6 +135,8 @@ public class LanguageManager {
c.get("general.info.time.mins", "&e%mins% &6min ");
c.get("general.info.time.secs", "&e%secs% &6sec ");
c.get("general.info.invalidPage", "&cInvalid page");
c.get("general.info.true", "&2True");
c.get("general.info.false", "&cFalse");
c.get("general.admin.error", "&cThere was an error in the command.");
c.get("general.admin.success", "&eYour command has been performed.");
c.get("general.error.noHelpPage", "&cThere is no help page by this number!");

View File

@ -201,6 +201,8 @@ public class JobsPlayer {
double Boost = 0D;
if (!this.isOnline())
return Boost;
if (type == null)
return Boost;
long time = System.currentTimeMillis();

View File

@ -5,7 +5,7 @@ version: 4.9.4
api-version: 1.13
website: https://www.spigotmc.org/resources/4216/
author: phrstbrn
softdepend: [Vault, MythicMobs, McMMO, WorldGuard, MyPet]
softdepend: [Vault, MythicMobs, McMMO, WorldGuard, MyPet, PlaceholderAPI]
commands:
jobs:
description: Jobs