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); + } }