diff --git a/pom.xml b/pom.xml
index c3db89c1..c295e36e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -140,7 +140,7 @@
io.lumine
MythicLib-dist
- 1.3-R28-SNAPSHOT
+ 1.3-SNAPSHOT
provided
diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java
index 5742b8e4..149868f3 100644
--- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java
+++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java
@@ -156,7 +156,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
int j = 0;
while (j < boundSkills.size())
try {
- boundSkills.set(j, getProfess().getSkill(boundSkills.get(j).getSkill()));
+ boundSkills.set(j, Objects.requireNonNull(getProfess().getSkill(boundSkills.get(j).getSkill())));
} catch (Exception ignored) {
} finally {
j++;
@@ -555,7 +555,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
if (event.isCancelled())
return;
- experience += event.getExperience();
+ experience = Math.max(0, experience + event.getExperience());
// Calculate the player's next level
int oldLevel = level, needed;
@@ -843,6 +843,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
}
public void setBoundSkill(int slot, ClassSkill skill) {
+ Validate.notNull(skill, "Skill cannot be null");
if (boundSkills.size() < 6)
boundSkills.add(skill);
else
diff --git a/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java b/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java
index d63ed98e..93ad5430 100644
--- a/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java
+++ b/src/main/java/net/Indyuce/mmocore/api/player/social/FriendRequest.java
@@ -6,32 +6,23 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import org.bukkit.Sound;
public class FriendRequest extends Request {
- private final PlayerData target;
+ public FriendRequest(PlayerData creator, PlayerData target) {
+ super(creator, target);
+ }
- public FriendRequest(PlayerData creator, PlayerData target) {
- super(creator);
+ @Override
+ public void whenDenied() {
+ getTarget().getPlayer().playSound(getTarget().getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
+ }
- this.target = target;
- }
-
- public PlayerData getTarget() {
- return target;
- }
-
- public void deny() {
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- if(!target.isOnline()) return;
- target.getPlayer().playSound(target.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
- }
-
- public void accept() {
- getCreator().setLastActivity(PlayerActivity.FRIEND_REQUEST, 0);
- getCreator().addFriend(target.getUniqueId());
- target.addFriend(getCreator().getUniqueId());
- if(target.isOnline() && getCreator().isOnline()) {
- MMOCore.plugin.configManager.getSimpleMessage("now-friends", "player", target.getPlayer().getName()).send(getCreator().getPlayer());
- MMOCore.plugin.configManager.getSimpleMessage("now-friends", "player", getCreator().getPlayer().getName()).send(target.getPlayer());
- }
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- }
+ @Override
+ public void whenAccepted() {
+ getCreator().setLastActivity(PlayerActivity.FRIEND_REQUEST, 0);
+ getCreator().addFriend(getTarget().getUniqueId());
+ getTarget().addFriend(getCreator().getUniqueId());
+ if (getCreator().isOnline()) {
+ MMOCore.plugin.configManager.getSimpleMessage("now-friends", "player", getTarget().getPlayer().getName()).send(getCreator().getPlayer());
+ MMOCore.plugin.configManager.getSimpleMessage("now-friends", "player", getCreator().getPlayer().getName()).send(getTarget().getPlayer());
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/Indyuce/mmocore/api/player/social/Request.java b/src/main/java/net/Indyuce/mmocore/api/player/social/Request.java
index 54cd1bd7..50d4e0ee 100644
--- a/src/main/java/net/Indyuce/mmocore/api/player/social/Request.java
+++ b/src/main/java/net/Indyuce/mmocore/api/player/social/Request.java
@@ -1,31 +1,55 @@
package net.Indyuce.mmocore.api.player.social;
+import net.Indyuce.mmocore.MMOCore;
+import net.Indyuce.mmocore.api.player.PlayerData;
+import org.apache.commons.lang.Validate;
+
import java.util.UUID;
-import net.Indyuce.mmocore.api.player.PlayerData;
-
public abstract class Request {
- private final UUID uuid = UUID.randomUUID();
- private final long date = System.currentTimeMillis();
- private final PlayerData creator;
+ private final UUID uuid = UUID.randomUUID();
+ private final long date = System.currentTimeMillis();
+ private final PlayerData creator, target;
- public Request(PlayerData creator) {
- this.creator = creator;
- }
+ /**
+ * Any request time out is by default 2 minutes.
+ */
+ private static final long TIME_OUT = 1000 * 60 * 2;
- public PlayerData getCreator() {
- return creator;
- }
+ public Request(PlayerData creator, PlayerData target) {
+ this.creator = creator;
+ this.target = target;
+ }
- public UUID getUniqueId() {
- return uuid;
- }
+ public PlayerData getCreator() {
+ return creator;
+ }
- public boolean isTimedOut() {
- return date + 1000 * 60 * 2 < System.currentTimeMillis();
- }
+ public PlayerData getTarget() {
+ return target;
+ }
- public abstract void accept();
+ public UUID getUniqueId() {
+ return uuid;
+ }
- public abstract void deny();
+ public boolean isTimedOut() {
+ return date + TIME_OUT < System.currentTimeMillis();
+ }
+
+ public void accept() {
+ Validate.isTrue(target.isOnline(), "Target must be online");
+ whenAccepted();
+ MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
+ }
+
+ public abstract void whenAccepted();
+
+ public void deny() {
+ Validate.isTrue(target.isOnline(), "Target must be online");
+ whenDenied();
+ MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
+ }
+
+ public abstract void whenDenied();
}
diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java
index 9c3f0db7..523c21dc 100644
--- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java
+++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java
@@ -1,21 +1,21 @@
package net.Indyuce.mmocore.command.rpg.admin;
-import java.util.function.BiConsumer;
-
+import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode;
+import io.lumine.mythic.lib.commands.mmolib.api.Parameter;
+import net.Indyuce.mmocore.MMOCore;
+import net.Indyuce.mmocore.api.player.PlayerData;
+import net.Indyuce.mmocore.command.CommandVerbose;
+import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot;
+import net.Indyuce.mmocore.experience.EXPSource;
+import net.Indyuce.mmocore.experience.PlayerProfessions;
+import net.Indyuce.mmocore.experience.Profession;
+import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import net.Indyuce.mmocore.MMOCore;
-import net.Indyuce.mmocore.experience.EXPSource;
-import net.Indyuce.mmocore.experience.PlayerProfessions;
-import net.Indyuce.mmocore.experience.Profession;
-import net.Indyuce.mmocore.api.player.PlayerData;
-import net.Indyuce.mmocore.command.CommandVerbose;
-import net.Indyuce.mmocore.command.MMOCoreCommandTreeRoot;
-import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode;
-import io.lumine.mythic.lib.commands.mmolib.api.Parameter;
+import java.util.function.BiConsumer;
public class ExperienceCommandTreeNode extends CommandTreeNode {
public ExperienceCommandTreeNode(CommandTreeNode parent) {
@@ -24,6 +24,8 @@ public class ExperienceCommandTreeNode extends CommandTreeNode {
addChild(new ActionCommandTreeNode(this, "set", PlayerData::setExperience, PlayerProfessions::setExperience));
addChild(new ActionCommandTreeNode(this, "give", (data, value) -> data.giveExperience(value, EXPSource.COMMAND), (professions, profession,
value) -> professions.giveExperience(profession, value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation())));
+ addChild(new ActionCommandTreeNode(this, "take", (data, value) -> data.giveExperience(-value, EXPSource.COMMAND), (professions, profession,
+ value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation())));
}
public static class ActionCommandTreeNode extends CommandTreeNode {
@@ -56,6 +58,7 @@ public class ExperienceCommandTreeNode extends CommandTreeNode {
int amount;
try {
amount = Integer.parseInt(args[5]);
+ Validate.isTrue(amount > 0);
} catch (NumberFormatException exception) {
sender.sendMessage(ChatColor.RED + args[5] + " is not a valid number.");
return CommandResult.FAILURE;
diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java
index f683e022..4dd79cb9 100644
--- a/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java
+++ b/src/main/java/net/Indyuce/mmocore/command/rpg/debug/StatModifiersCommandTreeNode.java
@@ -43,7 +43,7 @@ public class StatModifiersCommandTreeNode extends CommandTreeNode {
StatInstance instance = data.getStats().getInstance(stat);
sender.sendMessage("Stat Modifiers (" + instance.getKeys().size() + "):");
for (String key : instance.getKeys()) {
- StatModifier mod = instance.getAttribute(key);
+ StatModifier mod = instance.getModifier(key);
sender.sendMessage("- " + key + ": " + mod.getValue() + " " + mod.getType().name());
}
diff --git a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java
index 4d1287fd..4bcfb903 100644
--- a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java
+++ b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java
@@ -177,7 +177,7 @@ public class PlayerProfessions {
if (event.isCancelled())
return;
- exp.put(profession.getId(), exp.containsKey(profession.getId()) ? exp.get(profession.getId()) + event.getExperience() : event.getExperience());
+ exp.put(profession.getId(), Math.max(0, exp.getOrDefault(profession.getId(), 0) + event.getExperience()));
int needed, exp, level, oldLevel = getLevel(profession);
/*
diff --git a/src/main/java/net/Indyuce/mmocore/guild/provided/GuildInvite.java b/src/main/java/net/Indyuce/mmocore/guild/provided/GuildInvite.java
index 3db014dc..7e908639 100644
--- a/src/main/java/net/Indyuce/mmocore/guild/provided/GuildInvite.java
+++ b/src/main/java/net/Indyuce/mmocore/guild/provided/GuildInvite.java
@@ -1,50 +1,44 @@
package net.Indyuce.mmocore.guild.provided;
-import org.bukkit.Bukkit;
-
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.manager.InventoryManager;
+import org.bukkit.Bukkit;
public class GuildInvite extends Request {
- private final PlayerData target;
- private final Guild guild;
+ private final Guild guild;
- public GuildInvite(Guild guild, PlayerData creator, PlayerData target) {
- super(creator);
+ public GuildInvite(Guild guild, PlayerData creator, PlayerData target) {
+ super(creator, target);
- this.guild = guild;
- this.target = target;
- }
+ this.guild = guild;
+ }
- public Guild getGuild() {
- return guild;
- }
+ public Guild getGuild() {
+ return guild;
+ }
- public PlayerData getPlayer() {
- return target;
- }
+ @Override
+ public void whenDenied() {
+ // Nothing
+ }
- public void deny() {
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- }
+ @Override
+ public void whenAccepted() {
+ guild.removeLastInvite(getCreator().getPlayer());
+ guild.getMembers().forEach(member -> {
+ if (Bukkit.getPlayer(member) != null) {
+ MMOCore.plugin.configManager.getSimpleMessage("guild-joined-other", "player",
+ getTarget().getPlayer().getName()).send(Bukkit.getPlayer(member));
- public void accept() {
- guild.removeLastInvite(getCreator().getPlayer());
- guild.getMembers().forEach(member -> {
- if(Bukkit.getPlayer(member) != null) {
- MMOCore.plugin.configManager.getSimpleMessage("guild-joined-other", "player",
- target.getPlayer().getName()).send(Bukkit.getPlayer(member));
+ MMOCore.plugin.configManager.getSimpleMessage("guild-joined", "owner",
+ Bukkit.getPlayer(guild.getOwner()).getName()).send(getTarget().getPlayer());
+ }
+ }
+ );
- MMOCore.plugin.configManager.getSimpleMessage("guild-joined", "owner",
- Bukkit.getPlayer(guild.getOwner()).getName()).send(target.getPlayer());
- }}
-
- );
-
- guild.addMember(target.getUniqueId());
- InventoryManager.GUILD_VIEW.newInventory(target).open();
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- }
+ guild.addMember(getTarget().getUniqueId());
+ InventoryManager.GUILD_VIEW.newInventory(getTarget()).open();
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java b/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java
index 915ba02f..aa882b0e 100644
--- a/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java
+++ b/src/main/java/net/Indyuce/mmocore/manager/social/RequestManager.java
@@ -1,47 +1,41 @@
package net.Indyuce.mmocore.manager.social;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.UUID;
-
-import org.bukkit.Bukkit;
-
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.social.Request;
+import org.bukkit.Bukkit;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
public class RequestManager {
- private final Set requests = new HashSet<>();
+ private final Map requests = new HashMap<>();
- /*
- * flush friend requests every 5 minutes so there is no memory overleak
- */
- public RequestManager() {
- Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5);
- }
+ /**
+ * Flushes friend requests every 5 minutes so there is no memory overleak
+ */
+ public RequestManager() {
+ Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5);
+ }
- public Request getRequest(UUID uuid) {
- for (Request request : requests)
- if (request.getUniqueId().equals(uuid))
- return request;
- return null;
- }
+ public Request getRequest(UUID uuid) {
+ return requests.get(uuid);
+ }
- public void registerRequest(Request request) {
- requests.add(request);
- }
+ public void registerRequest(Request request) {
+ requests.put(request.getUniqueId(), request);
+ }
- public void unregisterRequest(UUID uuid) {
- for (Iterator iterator = requests.iterator(); iterator.hasNext();) {
- Request next = iterator.next();
- if (next.getUniqueId().equals(uuid)) {
- iterator.remove();
- break;
- }
- }
- }
+ public void unregisterRequest(UUID uuid) {
+ requests.remove(uuid);
+ }
- public void flushRequests() {
- requests.removeIf(Request::isTimedOut);
- }
+ private void flushRequests() {
+ for (Iterator iterator = requests.values().iterator(); iterator.hasNext(); ) {
+ Request next = iterator.next();
+ if (next.isTimedOut())
+ iterator.remove();
+ }
+ }
}
diff --git a/src/main/java/net/Indyuce/mmocore/party/provided/Party.java b/src/main/java/net/Indyuce/mmocore/party/provided/Party.java
index 1550d17c..659906f1 100644
--- a/src/main/java/net/Indyuce/mmocore/party/provided/Party.java
+++ b/src/main/java/net/Indyuce/mmocore/party/provided/Party.java
@@ -145,9 +145,8 @@ public class Party implements AbstractParty {
public void sendInvite(PlayerData inviter, PlayerData target) {
invites.put(target.getUniqueId(), System.currentTimeMillis());
Request request = new PartyInvite(this, inviter, target);
- if (inviter.isOnline() && target.isOnline())
- new ConfigMessage("party-invite").addPlaceholders("player", inviter.getPlayer().getName(), "uuid", request.getUniqueId().toString())
- .sendAsJSon(target.getPlayer());
+ new ConfigMessage("party-invite").addPlaceholders("player", inviter.getPlayer().getName(), "uuid", request.getUniqueId().toString())
+ .sendAsJSon(target.getPlayer());
MMOCore.plugin.requestManager.registerRequest(request);
}
diff --git a/src/main/java/net/Indyuce/mmocore/party/provided/PartyInvite.java b/src/main/java/net/Indyuce/mmocore/party/provided/PartyInvite.java
index 41e89dd6..40d13a4c 100644
--- a/src/main/java/net/Indyuce/mmocore/party/provided/PartyInvite.java
+++ b/src/main/java/net/Indyuce/mmocore/party/provided/PartyInvite.java
@@ -6,43 +6,38 @@ import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.manager.InventoryManager;
public class PartyInvite extends Request {
- private final PlayerData target;
- private final Party party;
+ private final Party party;
- public PartyInvite(Party party, PlayerData creator, PlayerData target) {
- super(creator);
+ public PartyInvite(Party party, PlayerData creator, PlayerData target) {
+ super(creator, target);
- this.party = party;
- this.target = target;
- }
+ this.party = party;
+ }
- public Party getParty() {
- return party;
- }
+ public Party getParty() {
+ return party;
+ }
- public PlayerData getPlayer() {
- return target;
- }
+ @Override
+ public void whenDenied() {
+ // Nothing
+ }
- public void deny() {
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- }
-
- public void accept() {
- if(party.getMembers().size() >= Math.max(2, MMOCore.plugin.getConfig().getInt("party.max-players", 8))) {
- MMOCore.plugin.configManager.getSimpleMessage("party-is-full").send(target.getPlayer());
- return;
- }
- if(getCreator().isOnline())
- party.removeLastInvite(getCreator().getPlayer());
- party.getMembers().forEach(member -> {
- if(member.isOnline() && target.isOnline())
- MMOCore.plugin.configManager.getSimpleMessage("party-joined-other", "player", target.getPlayer().getName()).send(member.getPlayer());
- });
- if(party.getOwner().isOnline() && target.isOnline())
- MMOCore.plugin.configManager.getSimpleMessage("party-joined", "owner", party.getOwner().getPlayer().getName()).send(target.getPlayer());
- party.addMember(target);
- InventoryManager.PARTY_VIEW.newInventory(target).open();
- MMOCore.plugin.requestManager.unregisterRequest(getUniqueId());
- }
+ @Override
+ public void whenAccepted() {
+ if (party.getMembers().size() >= Math.max(2, MMOCore.plugin.getConfig().getInt("party.max-players", 8))) {
+ MMOCore.plugin.configManager.getSimpleMessage("party-is-full").send(getTarget().getPlayer());
+ return;
+ }
+ if (getCreator().isOnline())
+ party.removeLastInvite(getCreator().getPlayer());
+ party.getMembers().forEach(member -> {
+ if (member.isOnline())
+ MMOCore.plugin.configManager.getSimpleMessage("party-joined-other", "player", getTarget().getPlayer().getName()).send(member.getPlayer());
+ });
+ if (party.getOwner().isOnline())
+ MMOCore.plugin.configManager.getSimpleMessage("party-joined", "owner", party.getOwner().getPlayer().getName()).send(getTarget().getPlayer());
+ party.addMember(getTarget());
+ InventoryManager.PARTY_VIEW.newInventory(getTarget()).open();
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java b/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java
index 8d0e48bc..7c21e8d8 100644
--- a/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java
+++ b/src/main/java/net/Indyuce/mmocore/skill/RegisteredSkill.java
@@ -90,4 +90,17 @@ public class RegisteredSkill {
public double getModifier(String modifier, int level) {
return defaultModifiers.get(modifier).calculate(level);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ RegisteredSkill that = (RegisteredSkill) o;
+ return handler.equals(that.handler) && triggerType.equals(that.triggerType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(handler, triggerType);
+ }
}