9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-21 07:59:26 +00:00

Compare commits

...

61 Commits
3.0.0 ... 3.7.0

Author SHA1 Message Date
Auxilor
d45546bd1d Reworked getting a reforge for an item 2021-10-31 11:00:25 +00:00
Auxilor
5bf4dee034 Updated to 3.7.0 2021-10-31 10:55:23 +00:00
Auxilor
6c7059c49d Added EffectActivateEvent javadoc 2021-10-31 10:55:00 +00:00
Auxilor
fcbdd7d0c0 Merge remote-tracking branch 'origin/master' 2021-10-31 10:52:28 +00:00
Will FP
1633150c78 Merge pull request #6
Implemented EffectActivateEvent (enhancing external API usage a lot)
2021-10-31 10:52:23 +00:00
Auxilor
ca62afab10 Updated to 3.6.1 2021-10-31 10:51:48 +00:00
Auxilor
98d37d5262 Changed ReforgeTarget#getForItem 2021-10-31 10:51:34 +00:00
_OfTeN_
f603d76968 Fixed EffectActivateEvent 2021-10-29 12:57:58 +03:00
_OfTeN_
69cd2d161f Implemented EffectActivateEvent (enhancing external API usage a lot) 2021-10-29 12:03:10 +03:00
_OfTeN_
12bb19514e Merge remote-tracking branch 'origin/master' 2021-10-29 12:02:27 +03:00
_OfTeN_
14bf332145 Implemented EffectActivateEvent (enhancing external API usage a lot) 2021-10-29 12:02:18 +03:00
Auxilor
301e04e45b Updated to 3.6.0 2021-10-27 19:03:11 +01:00
Auxilor
42aa948d0b Minor internal changes 2021-10-27 19:02:53 +01:00
Will FP
dfdac65526 Merge pull request #5
UltimateSkills integration (2 effects) and PlayerPoints integration
2021-10-27 18:59:38 +01:00
_OfTeN_
99e34bc1ec Merge remote-tracking branch 'origin/master' 2021-10-27 19:27:09 +03:00
_OfTeN_
89dbbd8b64 Readded playerpoints config option 2021-10-27 19:27:00 +03:00
_OfTeN_
769b9612b2 Merge remote-tracking branch 'origin/master' 2021-10-27 19:25:17 +03:00
_OfTeN_
845c9d8013 Added UltimateSkills integration (2 effects) 2021-10-27 19:24:44 +03:00
0ft3n
bebbfcb0d8 Merge branch 'Auxilor:master' into master 2021-10-27 16:22:04 +03:00
_OfTeN_
cd08af8b3f Added PlayerPoints integration and "reforge.use-player-points: true/false" for people to use it 2021-10-27 15:35:05 +03:00
Auxilor
e4a6a9fe39 Updated to 3.5.6 2021-10-26 15:42:49 +01:00
Auxilor
60e93b2544 Merge remote-tracking branch 'origin/master' 2021-10-26 15:42:19 +01:00
Auxilor
8b331bd369 Updated to 3.5.5 2021-10-26 15:42:14 +01:00
Auxilor
174d2c89d5 Updated to 3.5.4 2021-10-26 15:41:58 +01:00
Auxilor
7a211da7fd Fixed insufficient exp withdrawing money while failing 2021-10-26 15:41:49 +01:00
Auxilor
e06885df90 Updated to 3.5.5 2021-10-25 10:54:49 +01:00
Auxilor
a212cebe0d Fixed kotlin update bug 2021-10-25 10:54:41 +01:00
Auxilor
8d8ad52563 Updated to 3.5.4 2021-10-25 10:35:09 +01:00
Auxilor
e529fd44fc Moved commands to kotlin 2021-10-25 10:34:57 +01:00
Auxilor
8c6240219d Updated to 3.5.3 2021-10-18 12:52:11 +01:00
Auxilor
f9931c37a2 Un-moved watcher to kt 2021-10-18 12:52:01 +01:00
Auxilor
a9be4aa66f Updated to 3.5.2 2021-10-17 11:39:35 +01:00
Auxilor
f0a6b85dd8 Internal changes 2021-10-17 11:39:21 +01:00
Auxilor
9796254f6a Rename .java to .kt 2021-10-17 11:39:21 +01:00
Auxilor
48b5a32615 Updated to 3.5.1 2021-10-15 09:42:01 +01:00
Auxilor
1f7866eba4 Fixed reward_kill after much pain 2021-10-15 09:41:32 +01:00
Auxilor
a2de449d39 Added extra safety checks 2021-10-14 13:01:36 +01:00
Auxilor
bfd29af3a8 Updated to 3.6.0 2021-10-14 12:38:53 +01:00
Auxilor
e721a0aa2c Fixed stone bug 2021-10-14 12:38:34 +01:00
Auxilor
d172160f97 Lots of under-the-hood work 2021-10-14 12:36:34 +01:00
Auxilor
7d6eba866f Recoded Reforge GUI 2021-10-14 10:52:07 +01:00
Auxilor
48a761df8c Updated to 3.4.0 2021-10-13 10:56:39 +01:00
Auxilor
8d8d6dd247 Added option to set stone cost 2021-10-13 10:56:31 +01:00
Auxilor
83762773e9 Fixed stone bug 2021-10-13 10:49:25 +01:00
Will FP
c5f47ac51d Update README.md 2021-10-12 20:12:25 +01:00
Auxilor
387eaff23d Updated to 3.3.2 2021-10-11 12:02:11 +01:00
Auxilor
3cefe5c095 Merge remote-tracking branch 'origin/master' 2021-10-11 12:02:02 +01:00
Auxilor
af6b981815 Updated to 3.3.1 2021-10-11 12:00:26 +01:00
Auxilor
9b77fa2d21 Fixed reforge name duplication 2021-10-11 12:00:15 +01:00
Auxilor
a40c0b86df Updated to 3.3.1 2021-10-08 19:15:48 +01:00
Auxilor
c9d26c47fa Fixed crafting not working 2021-10-08 19:15:31 +01:00
_OfTeN_
174bd85dc2 Added PlayerPoints integration and "reforge.use-player-points: true/false" for people to use it 2021-10-06 22:34:37 +03:00
Auxilor
86eb5ff216 Updated to 3.3.0 + Cleaned AureliumSkills integration 2021-10-06 15:32:53 +01:00
Will FP
d8d9aba84e Merge pull request #4
Added "add_aureliumskills_stat" effect for AureliumSkills integration
2021-10-06 15:29:52 +01:00
_OfTeN_
85adbf6838 Added "add_aureliumskills_stat" effect for AureliumSkills integration 2021-10-06 16:26:43 +03:00
Auxilor
6b2e7ea0e9 Fixed several bugs 2021-10-05 11:31:46 +01:00
Auxilor
c4cb75eb50 Fixed conditions 2021-10-05 10:56:51 +01:00
Auxilor
3990d918fd Updated to 3.2.0 2021-10-05 10:03:20 +01:00
Auxilor
19cf2e21f1 Added talismans integration 2021-10-05 10:03:11 +01:00
Auxilor
3c7581d859 Updated to 3.1.0 2021-10-05 09:39:33 +01:00
Auxilor
bee0e7e91c Added EcoSkills integration 2021-10-05 09:39:26 +01:00
48 changed files with 1024 additions and 647 deletions

View File

@@ -1,6 +1,6 @@
<h1 align="center">
<br>
<img src="https://i.imgur.com/LoZExNf.png" alt="Reforges logo" width="256">
<img src="https://i.imgur.com/co0zeyJ.png" alt="Reforges logo" width="256">
<br>
</h1>

View File

@@ -30,6 +30,7 @@ allprojects {
maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://papermc.io/repo/repository/maven-public/' }
maven { url 'https://repo.rosewooddev.io/repository/public/' }
}
jar {
@@ -37,6 +38,7 @@ allprojects {
}
dependencies {
compileOnly 'org.black_ixx:playerpoints:3.0.0'
compileOnly 'com.willfp:eco:6.9.0'
compileOnly 'org.jetbrains:annotations:19.0.0'

View File

@@ -2,8 +2,14 @@ group 'com.willfp'
version rootProject.version
dependencies {
compileOnly fileTree(dir: '../../lib', include: ['*.jar'])
compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
compileOnly 'com.willfp:EcoSkills:1.4.0'
compileOnly 'com.willfp:Talismans:4.6.0'
compileOnly 'com.github.Archy-X:AureliumSkills:Beta1.2.4'
compileOnly 'org.black_ixx:playerpoints:3.0.0'
compileOnly fileTree(dir: '../../lib', include: ['*.jar'])
}
build.dependsOn publishToMavenLocal

View File

@@ -3,14 +3,21 @@ package com.willfp.reforges;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.integrations.IntegrationLoader;
import com.willfp.eco.core.items.Items;
import com.willfp.reforges.commands.CommandReforge;
import com.willfp.reforges.commands.CommandReforges;
import com.willfp.reforges.config.ReforgesJson;
import com.willfp.reforges.config.TargetYml;
import com.willfp.reforges.display.ReforgesDisplay;
import com.willfp.reforges.effects.ConfiguredEffect;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.effects.Effects;
import com.willfp.reforges.integrations.aureliumskills.AureliumSkillsIntegration;
import com.willfp.reforges.integrations.ecoskills.EcoSkillsIntegration;
import com.willfp.reforges.integrations.talismans.TalismansIntegration;
import com.willfp.reforges.integrations.ultimateskills.UltimateSkillsIntegration;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import com.willfp.reforges.reforges.util.ReforgeArgParser;
import com.willfp.reforges.reforges.util.ReforgeEnableListeners;
@@ -62,6 +69,17 @@ public class ReforgesPlugin extends EcoPlugin {
Items.registerArgParser(new ReforgeArgParser());
}
@Override
protected void handleDisable() {
for (Player player : Bukkit.getOnlinePlayers()) {
for (Reforge value : Reforges.values()) {
for (ConfiguredEffect effect : value.getEffects()) {
effect.getEffect().handleDisabling(player);
}
}
}
}
@Override
protected void handleAfterLoad() {
EconomyHandler.setEnabled(EconomyHandler.init());
@@ -108,6 +126,17 @@ public class ReforgesPlugin extends EcoPlugin {
return new ReforgesDisplay(this);
}
@Override
protected List<IntegrationLoader> loadIntegrationLoaders() {
return Arrays.asList(
new IntegrationLoader("UltimateSkills", UltimateSkillsIntegration::load),
new IntegrationLoader("EcoSkills", EcoSkillsIntegration::load),
new IntegrationLoader("Talismans", TalismansIntegration::registerProvider),
new IntegrationLoader("PlayerPoints", () -> EconomyHandler.setUsePlayerPoints(true)),
new IntegrationLoader("AureliumSkills", AureliumSkillsIntegration::load)
);
}
@Override
public String getMinimumEcoVersion() {
return "6.9.0";

View File

@@ -1,151 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import com.willfp.eco.core.command.impl.Subcommand;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class CommandGive extends Subcommand {
/**
* The cached names.
*/
private static final List<String> STONE_NAMES = new ArrayList<>();
/**
* The cached numbers.
*/
private static final List<String> NUMBERS = Arrays.asList(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
);
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandGive(@NotNull final EcoPlugin plugin) {
super(plugin, "give", "reforges.command.give", false);
}
/**
* Called on reload.
*/
@ConfigUpdater
public static void reload() {
STONE_NAMES.clear();
STONE_NAMES.addAll(Reforges.values().stream()
.filter(Reforge::getRequiresStone)
.map(Reforge::getId)
.collect(Collectors.toList()));
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
if (args.isEmpty()) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player"));
return;
}
if (args.size() == 1) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-stone"));
return;
}
int amount = 1;
if (args.size() > 2) {
try {
amount = Integer.parseInt(args.get(2));
} catch (NumberFormatException ignored) {
// do nothing
}
}
String recieverName = args.get(0);
Player reciever = Bukkit.getPlayer(recieverName);
if (reciever == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player"));
return;
}
String key = args.get(1);
Reforge reforge = Reforges.getByKey(key);
if (reforge == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-stone"));
return;
}
String message = this.getPlugin().getLangYml().getMessage("give-success");
message = message.replace("%reforge%", reforge.getName()).replace("%recipient%", reciever.getName());
sender.sendMessage(message);
ItemStack itemStack = reforge.getStone();
itemStack.setAmount(amount);
reciever.getInventory().addItem(itemStack);
};
}
@Override
public TabCompleteHandler getTabCompleter() {
return (sender, args) -> {
List<String> completions = new ArrayList<>();
if (args.isEmpty()) {
// Currently, this case is not ever reached
return STONE_NAMES;
}
if (args.size() == 1) {
StringUtil.copyPartialMatches(args.get(0), Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()), completions);
return completions;
}
if (args.size() == 2) {
StringUtil.copyPartialMatches(args.get(1), STONE_NAMES, completions);
Collections.sort(completions);
return completions;
}
if (args.size() == 3) {
StringUtil.copyPartialMatches(args.get(2), NUMBERS, completions);
completions.sort((s1, s2) -> {
int t1 = Integer.parseInt(s1);
int t2 = Integer.parseInt(s2);
return t1 - t2;
});
return completions;
}
return new ArrayList<>(0);
};
}
}

View File

@@ -1,67 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.reforges.gui.ReforgeGUI;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CommandOpen extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandOpen(@NotNull final EcoPlugin plugin) {
super(plugin, "open", "reforges.command.open", false);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
if (args.isEmpty()) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player"));
return;
}
Player player = Bukkit.getPlayer(args.get(0));
if (player == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player"));
return;
}
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.open-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.open-sound.pitch")
);
ReforgeGUI.getMenu().open(player);
};
}
@Override
public TabCompleteHandler getTabCompleter() {
return (sender, args) -> {
List<String> completions = new ArrayList<>();
if (args.size() == 1) {
StringUtil.copyPartialMatches(args.get(0), Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()), completions);
return completions;
}
return new ArrayList<>(0);
};
}
}

View File

@@ -1,36 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.reforges.gui.ReforgeGUI;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class CommandReforge extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReforge(@NotNull final EcoPlugin plugin) {
super(plugin, "reforge", "reforges.command.reforge", true);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
Player player = (Player) sender;
player.playSound(
player.getLocation(),
Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.open-sound.id").toUpperCase()),
1f,
(float) this.getPlugin().getConfigYml().getDouble("gui.open-sound.pitch")
);
ReforgeGUI.getMenu().open(player);
};
}
}

View File

@@ -1,29 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.PluginCommand;
import org.jetbrains.annotations.NotNull;
public class CommandReforges extends PluginCommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReforges(@NotNull final EcoPlugin plugin) {
super(plugin, "reforges", "reforges.command.reforges", false);
this.addSubcommand(new CommandReload(plugin))
.addSubcommand(new CommandGive(plugin))
.addSubcommand(new CommandOpen(plugin));
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-command"));
};
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.commands;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.impl.Subcommand;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommandReload extends Subcommand {
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandReload(@NotNull final EcoPlugin plugin) {
super(plugin, "reload", "reforges.command.reload", false);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
this.getPlugin().reload();
sender.sendMessage(this.getPlugin().getLangYml().getMessage("reloaded"));
};
}
}

View File

@@ -5,6 +5,7 @@ import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.Watcher;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
@@ -56,6 +57,16 @@ public abstract class Effect implements Listener, Watcher {
return UUID.nameUUIDFromBytes((this.id + index + Arrays.hashCode(extra)).getBytes());
}
/**
* Generate a NamespacedKey with a specified index.
*
* @param index The index.
* @return The NamespacedKey.
*/
protected NamespacedKey getNamespacedKey(final int index) {
return this.getPlugin().getNamespacedKeyFactory().create(this.id + "_" + index);
}
/**
* Handle application of a reforge containing this effect.
*

View File

@@ -0,0 +1,106 @@
package com.willfp.reforges.events;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.reforges.Reforge;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;
public class EffectActivateEvent extends PlayerEvent implements Cancellable {
/**
* The reforge.
*/
private final Reforge reforge;
/**
* The effect that activated.
*/
private final Effect effect;
/**
* If the event is cancelled.
*/
private boolean cancelled;
/**
* Bukkit parity.
*/
private static final HandlerList HANDLERS = new HandlerList();
/**
* Create new EffectActivateEvent.
*
* @param who The player.
* @param reforge The reforge.
* @param effect The effect.
*/
public EffectActivateEvent(@NotNull final Player who,
@NotNull final Reforge reforge,
@NotNull final Effect effect) {
super(who);
this.reforge = reforge;
this.effect = effect;
this.cancelled = false;
}
/**
* Get if the effect activation is cancelled.
*
* @return If cancelled.
*/
@Override
public boolean isCancelled() {
return this.cancelled;
}
/**
* Set if the event is cancelled.
*
* @param cancel If cancelled.
*/
@Override
public void setCancelled(final boolean cancel) {
this.cancelled = cancel;
}
/**
* Bukkit parity.
*
* @return The handlers.
*/
@Override
public @NotNull HandlerList getHandlers() {
return HANDLERS;
}
/**
* Get the reforge associated with the event.
*
* @return The reforge.
*/
@NotNull
public Reforge getReforge() {
return this.reforge;
}
/**
* Get the effect associated with the event.
*
* @return The effect.
*/
@NotNull
public Effect getEffect() {
return this.effect;
}
/**
* Bukkit parity.
*
* @return The handler list.
*/
public static HandlerList getHandlerList() {
return HANDLERS;
}
}

View File

@@ -1,202 +0,0 @@
package com.willfp.reforges.gui;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.eco.core.drops.DropQueue;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.slot.FillerMask;
import com.willfp.eco.core.gui.slot.MaskMaterials;
import com.willfp.eco.core.gui.slot.Slot;
import com.willfp.eco.core.items.builder.ItemStackBuilder;
import com.willfp.eco.util.NumberUtils;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.ReforgeHandler;
import com.willfp.reforges.reforges.util.ReforgeStatus;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import lombok.Getter;
import lombok.experimental.UtilityClass;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@SuppressWarnings("deprecation")
@UtilityClass
public class ReforgeGUI {
/**
* The reforge GUI.
*/
@Getter
private static Menu menu;
/**
* Update the GUI.
*
* @param plugin The plugin.
*/
@ConfigUpdater
public static void update(@NotNull final EcoPlugin plugin) {
ReforgeHandler handler = new ReforgeHandler(plugin);
Slot activatorSlot = Slot.builder(new ItemStack(Material.ANVIL))
.setModifier((player, menu, previous) -> {
ItemMeta meta = previous.getItemMeta();
if (meta == null) {
return;
}
ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player));
double cost = plugin.getConfigYml().getDouble("reforge.cost");
if (status == ReforgeStatus.ALLOW) {
ItemStack item = menu.getCaptiveItems(player).get(0);
int reforges = ReforgeUtils.getReforges(item);
cost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges);
}
int xpcost = plugin.getConfigYml().getInt("reforge.xp-cost");
if (status == ReforgeStatus.ALLOW) {
ItemStack item = menu.getCaptiveItems(player).get(0);
int reforges = ReforgeUtils.getReforges(item);
xpcost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges);
}
switch (status) {
case INVALID_ITEM -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.invalid-item.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.invalid-item.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.invalid-item.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
case ALLOW -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.allow.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.allow.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
case ALLOW_STONE -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow-stone.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.allow-stone.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.allow-stone.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost))
.replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)).getName()));
}
meta.setLore(lore);
}
default -> {
previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.no-item.material").toUpperCase())));
meta.setDisplayName(plugin.getConfigYml().getString("gui.no-item.name"));
List<String> lore = new ArrayList<>();
for (String string : plugin.getConfigYml().getStrings("gui.no-item.lore")) {
lore.add(string.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpcost)));
}
meta.setLore(lore);
}
}
previous.setItemMeta(meta);
})
.onLeftClick(handler::handleReforgeClick)
.build();
String[] maskPattern = plugin.getConfigYml().getStrings("gui.mask.pattern", false).toArray(new String[0]);
Material[] maskMaterials = plugin.getConfigYml()
.getStrings("gui.mask.materials", false)
.stream()
.map(string -> Material.getMaterial(string.toUpperCase()))
.filter(Objects::nonNull)
.toArray(Material[]::new);
Material allowMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.allow-material", false).toUpperCase());
Material denyMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.deny-material", false).toUpperCase());
assert allowMaterial != null;
assert denyMaterial != null;
Material closeMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.close.material", false).toUpperCase());
assert closeMaterial != null;
menu = Menu.builder(plugin.getConfigYml().getInt("gui.rows"))
.setTitle(plugin.getLangYml().getString("menu.title"))
.setMask(
new FillerMask(
new MaskMaterials(
maskMaterials
),
maskPattern
)
)
.modfiy(builder -> {
Slot slot = Slot.builder(
new ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
).setModifier((player, menu, previous) -> {
ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player));
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
previous.setType(allowMaterial);
} else {
previous.setType(denyMaterial);
}
}).build();
List<String> allowedPattern = plugin.getConfigYml().getStrings("gui.show-allowed.pattern");
for (int i = 1; i <= allowedPattern.size(); i++) {
String row = allowedPattern.get(i - 1);
for (int j = 1; j <= 9; j++) {
if (row.charAt(j - 1) != '0') {
builder.setSlot(i, j, slot);
}
}
}
})
.setSlot(plugin.getConfigYml().getInt("gui.item-slot.row"),
plugin.getConfigYml().getInt("gui.item-slot.column"),
Slot.builder()
.setCaptive()
.build()
)
.setSlot(plugin.getConfigYml().getInt("gui.stone-slot.row"),
plugin.getConfigYml().getInt("gui.stone-slot.column"),
Slot.builder()
.setCaptive()
.build()
)
.setSlot(2, 5, activatorSlot)
.setSlot(plugin.getConfigYml().getInt("gui.close.location.row"),
plugin.getConfigYml().getInt("gui.close.location.column"),
Slot.builder(
new ItemStackBuilder(closeMaterial)
.setDisplayName(plugin.getLangYml().getString("menu.close"))
.build()
).onLeftClick((event, slot, menu) -> {
event.getWhoClicked().closeInventory();
}).build()
).onClose((event, menu) -> {
new DropQueue((Player) event.getPlayer())
.addItems(menu.getCaptiveItems((Player) event.getPlayer()))
.setLocation(event.getPlayer().getEyeLocation())
.push();
})
.build();
}
static {
update(ReforgesPlugin.getInstance());
}
}

View File

@@ -60,7 +60,7 @@ public class Reforges {
}
for (JSONConfig config : plugin.getReforgesJson().getSubsections("reforges")) {
addNewReforge(new Reforge(config, plugin));
new Reforge(config, plugin);
}
}

View File

@@ -8,14 +8,14 @@ import com.willfp.reforges.ReforgesPlugin;
import lombok.Getter;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
public class ReforgeTarget {
/**
@@ -98,13 +98,11 @@ public class ReforgeTarget {
* @param item The item.
* @return The target.
*/
@Nullable
public static ReforgeTarget getForItem(@NotNull final ItemStack item) {
Optional<ReforgeTarget> matching = REGISTERED.values().stream()
public static List<ReforgeTarget> getForItem(@NotNull final ItemStack item) {
return REGISTERED.values().stream()
.filter(target -> !target.getName().equalsIgnoreCase("all"))
.filter(target -> target.matches(item))
.findFirst();
return matching.orElse(null);
.collect(Collectors.toList());
}
/**

View File

@@ -1,49 +0,0 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.items.args.LookupArgParser;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.Reforges;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.function.Predicate;
public class ReforgeArgParser implements LookupArgParser {
@Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) {
Reforge reforge = null;
for (String arg : args) {
String[] split = arg.split(":");
if (split.length == 1 || !split[0].equalsIgnoreCase("reforge")) {
continue;
}
Reforge match = Reforges.getByKey(split[1].toLowerCase());
if (match == null) {
continue;
}
reforge = match;
break;
}
if (reforge == null) {
return null;
}
ReforgeUtils.setReforge(meta, reforge);
Reforge finalReforge = reforge;
return test -> {
ItemMeta testMeta = test.getItemMeta();
if (testMeta == null) {
return false;
}
return finalReforge.equals(ReforgeUtils.getReforge(testMeta));
};
}
}

View File

@@ -13,6 +13,8 @@ import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class ReforgeHandler extends PluginDependent<EcoPlugin> {
/**
* Pass an {@link EcoPlugin} in order to interface with it.
@@ -32,8 +34,7 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return;
}
ReforgeTarget target = ReforgeTarget.getForItem(toReforge);
assert target != null;
List<ReforgeTarget> target = ReforgeTarget.getForItem(toReforge);
Reforge reforge = null;
boolean usedStone = false;
@@ -56,12 +57,16 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return;
}
double cost = 0;
if (EconomyHandler.isEnabled()) {
double cost = this.getPlugin().getConfigYml().getDouble("reforge.cost");
cost = this.getPlugin().getConfigYml().getDouble("reforge.cost");
int reforges = ReforgeUtils.getReforges(toReforge);
cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges);
if (!EconomyHandler.getInstance().has(player, cost)) {
if (reforge.getRequiresStone() && reforge.getStonePrice() != -1) {
cost = reforge.getStonePrice();
}
if (!EconomyHandler.has(player, cost)) {
player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money"));
player.playSound(
@@ -73,9 +78,6 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return;
}
EconomyHandler.getInstance().withdrawPlayer(player, cost);
}
int xpCost = this.getPlugin().getConfigYml().getInt("reforge.xp-cost");
@@ -94,6 +96,10 @@ public class ReforgeHandler extends PluginDependent<EcoPlugin> {
return;
}
if (EconomyHandler.isEnabled()) {
EconomyHandler.getInstance().withdrawPlayer(player, cost);
}
player.setLevel(player.getLevel() - xpCost);
player.sendMessage(this.getPlugin().getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName()));

View File

@@ -2,6 +2,7 @@ package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.conditions.ConfiguredCondition;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import org.bukkit.entity.Player;
@@ -174,12 +175,34 @@ public class ReforgeLookup {
}
for (Reforge reforge : added) {
reforge.handleActivation(player);
boolean areConditionsMet = true;
for (ConfiguredCondition condition : reforge.getConditions()) {
if (!condition.getCondition().isConditionMet(player, condition.getConfig())) {
areConditionsMet = false;
break;
}
}
if (areConditionsMet) {
reforge.handleActivation(player);
}
}
for (Reforge reforge : removed) {
reforge.handleDeactivation(player);
}
for (Reforge reforge : after) {
boolean areConditionsMet = true;
for (ConfiguredCondition condition : reforge.getConditions()) {
if (!condition.getCondition().isConditionMet(player, condition.getConfig())) {
areConditionsMet = false;
break;
}
}
if (!areConditionsMet) {
reforge.handleDeactivation(player);
}
}
});
}

View File

@@ -16,6 +16,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -44,14 +45,16 @@ public class ReforgeUtils {
/**
* Get a random reforge for a target.
*
* @param target The target.
* @param targets The targets.
*/
public static Reforge getRandomReforge(@NotNull final ReforgeTarget target) {
public static Reforge getRandomReforge(@NotNull final Collection<ReforgeTarget> targets) {
List<Reforge> applicable = new ArrayList<>();
for (Reforge reforge : Reforges.values()) {
if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) {
applicable.add(reforge);
for (ReforgeTarget target : targets) {
if (reforge.getTargets().contains(target) && !reforge.getRequiresStone()) {
applicable.add(reforge);
}
}
}
@@ -64,36 +67,38 @@ public class ReforgeUtils {
return applicable.get(0);
}
public static ReforgeStatus getStatus(@NotNull final List<ItemStack> captive) {
public static MetadatedReforgeStatus getStatus(@NotNull final List<ItemStack> captive) {
ItemStack toReforge = captive.isEmpty() ? null : captive.get(0);
ItemStack stone = captive.size() == 2 ? captive.get(1) : null;
ReforgeStatus status = null;
ReforgeTarget target = null;
List<ReforgeTarget> target = new ArrayList<>();
if (toReforge == null || toReforge.getType() == Material.AIR) {
status = ReforgeStatus.NO_ITEM;
} else {
target = ReforgeTarget.getForItem(toReforge);
if (target == null) {
target.addAll(ReforgeTarget.getForItem(toReforge));
if (target.isEmpty()) {
status = ReforgeStatus.INVALID_ITEM;
}
}
if (target != null) {
if (!target.isEmpty()) {
status = ReforgeStatus.ALLOW;
}
double cost = 0;
if (status == ReforgeStatus.ALLOW) {
Reforge reforgeStone = getReforgeStone(stone);
if (reforgeStone != null && reforgeStone.getTargets().stream()
.anyMatch(reforgeTarget -> reforgeTarget.getItems().stream()
.anyMatch(item -> item.matches(toReforge)))) {
cost = reforgeStone.getStonePrice();
status = ReforgeStatus.ALLOW_STONE;
}
}
return status;
return new MetadatedReforgeStatus(status, cost);
}
/**

View File

@@ -1,11 +1,16 @@
package com.willfp.reforges.vault;
import com.willfp.reforges.ReforgesPlugin;
import lombok.Setter;
import lombok.experimental.UtilityClass;
import net.milkbowl.vault.economy.Economy;
import org.black_ixx.playerpoints.PlayerPoints;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import java.util.concurrent.ExecutionException;
@UtilityClass
public final class EconomyHandler {
/**
@@ -13,6 +18,9 @@ public final class EconomyHandler {
*/
private static Economy instance = null;
@Setter
private static boolean usePlayerPoints = false;
@Setter
private static boolean enabled = false;
@@ -34,6 +42,24 @@ public final class EconomyHandler {
return EconomyHandler.instance;
}
/**
* Get if a player has a specified amount.
*
* @param player The player.
* @param amount The amount.
* @return If a player has the amount.
*/
public static boolean has(Player player, double amount) {
if (usePlayerPoints && ReforgesPlugin.getInstance().getConfigYml().getBool("reforge.use-player-points")) {
try {
return PlayerPoints.getInstance().getAPI().lookAsync(player.getUniqueId()).get() >= amount;
} catch (ExecutionException | InterruptedException e) {
return false;
}
}
return getInstance().has(player, amount);
}
public static boolean isEnabled() {
return EconomyHandler.enabled;
}

View File

@@ -0,0 +1,95 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.TabCompleteHandler
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.reforges.reforges.Reforges
import org.bukkit.Bukkit
import org.bukkit.util.StringUtil
class CommandGive(
plugin: EcoPlugin
) : Subcommand(plugin, "give", "reforges.command.give", false) {
private val numbers = listOf(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
)
override fun getHandler(): CommandHandler {
return CommandHandler { sender, args ->
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return@CommandHandler
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-stone"))
return@CommandHandler
}
val amount = if (args.size > 2) args[2].toIntOrNull() ?: 1 else 1
val recieverName = args[0]
val reciever = Bukkit.getPlayer(recieverName)
if (reciever == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return@CommandHandler
}
val key = args[1]
val reforge = Reforges.getByKey(key)
if (reforge == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-stone"))
return@CommandHandler
}
var message = plugin.langYml.getMessage("give-success")
message = message.replace("%reforge%", reforge.name).replace("%recipient%", reciever.name)
sender.sendMessage(message)
val itemStack = reforge.stone
itemStack.amount = amount
reciever.inventory.addItem(itemStack)
}
}
override fun getTabCompleter(): TabCompleteHandler {
return TabCompleteHandler { _, args ->
val completions = mutableListOf<String>()
if (args.isEmpty()) {
// Currently, this case is not ever reached
return@TabCompleteHandler Reforges.values().filter { it.requiresStone }.map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
return@TabCompleteHandler completions
}
if (args.size == 2) {
StringUtil.copyPartialMatches(
args[1],
Reforges.values().filter { it.requiresStone }.map { it.id },
completions
)
completions.sort()
return@TabCompleteHandler completions
}
if (args.size == 3) {
StringUtil.copyPartialMatches(args[2], numbers, completions)
completions.sortWith { s1, s2 ->
val t1 = s1.toInt()
val t2 = s2.toInt()
t1 - t2
}
return@TabCompleteHandler completions
}
emptyList()
}
}
}

View File

@@ -0,0 +1,50 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.TabCompleteHandler
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import org.bukkit.Bukkit
import org.bukkit.Sound
import org.bukkit.util.StringUtil
class CommandOpen(
plugin: EcoPlugin
) : PluginCommand(plugin, "open", "reforges.command.open", false) {
override fun getHandler(): CommandHandler {
return CommandHandler { sender, args ->
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return@CommandHandler
}
val player = Bukkit.getPlayer(args[0])
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return@CommandHandler
}
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
menu.open(player)
}
}
override fun getTabCompleter(): TabCompleteHandler {
return TabCompleteHandler { _, args ->
val completions = mutableListOf<String>()
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
return@TabCompleteHandler completions
}
emptyList()
}
}
}

View File

@@ -0,0 +1,25 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.reforges.gui.ReforgeGUI.menu
import org.bukkit.Sound
import org.bukkit.entity.Player
class CommandReforge(
plugin: EcoPlugin
) : PluginCommand(plugin, "reforge", "reforges.command.reforge", true) {
override fun getHandler(): CommandHandler {
return CommandHandler { player, _ ->
player as Player
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.open-sound.id").uppercase()),
1f,
plugin.configYml.getDouble("gui.open-sound.pitch").toFloat()
)
menu.open(player)
}
}
}

View File

@@ -0,0 +1,21 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.impl.PluginCommand
class CommandReforges(plugin: EcoPlugin) : PluginCommand(plugin, "reforges", "reforges.command.reforges", false) {
override fun getHandler(): CommandHandler {
return CommandHandler { sender, _ ->
sender.sendMessage(
plugin.langYml.getMessage("invalid-command")
)
}
}
init {
addSubcommand(CommandReload(plugin))
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandOpen(plugin))
}
}

View File

@@ -0,0 +1,14 @@
package com.willfp.reforges.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.impl.Subcommand
class CommandReload(plugin: EcoPlugin) : Subcommand(plugin, "reload", "reforges.command.reload", false) {
override fun getHandler(): CommandHandler {
return CommandHandler { sender, _ ->
plugin.reload()
sender.sendMessage(plugin.langYml.getMessage("reloaded"))
}
}
}

View File

@@ -13,17 +13,26 @@ import com.willfp.reforges.reforges.util.ReforgeUtils
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.TextReplacementConfig
import net.kyori.adventure.text.format.TextDecoration
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
import org.bukkit.Material
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta
import org.bukkit.persistence.PersistentDataType
@Suppress("DEPRECATION")
class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) {
/**
* Deprecated
*/
@Deprecated("Use PDC components!")
private val replacement = TextReplacementConfig.builder()
.match("§w(.+)§w")
.replacement("")
.build()
private val originalComponentKey = plugin.namespacedKeyFactory.create("real_name")
private val serializer = GsonComponentSerializer.gson()
override fun display(
itemStack: ItemStack,
vararg args: Any
@@ -56,10 +65,12 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
if (stone != null) {
meta.setDisplayName(plugin.configYml.getString("reforge.stone.name").replace("%reforge%", stone.name))
SkullUtils.setSkullTexture(
meta as SkullMeta,
stone.config.getString("stone.texture")
)
if (stone.config.has("stone.texture") && stone.config.getString("stone.texture").isNotEmpty()) {
SkullUtils.setSkullTexture(
meta as SkullMeta,
stone.config.getString("stone.texture")
)
}
itemStack.itemMeta = meta
val stoneLore = plugin.configYml.getStrings("reforge.stone.lore").map {
"${Display.PREFIX}${it.replace("%reforge%", stone.name)}"
@@ -76,12 +87,13 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
lore.addAll(addLore)
}
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName =
(if (meta.hasDisplayName()) meta.displayName()!! else Component.translatable(itemStack))
.replaceText(
replacement
)
val newName = StringUtils.toComponent("§w${reforge.name} §w")
val displayName = (meta.displayName() ?: Component.translatable(itemStack)).replaceText(replacement)
meta.persistentDataContainer.set(
originalComponentKey,
PersistentDataType.STRING,
serializer.serialize(displayName)
)
val newName = StringUtils.toComponent("${reforge.name} ")
.decoration(TextDecoration.ITALIC, false).append(displayName)
meta.displayName(newName)
}
@@ -96,12 +108,10 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
val meta = itemStack.itemMeta ?: return
if (plugin.configYml.getBool("reforge.display-in-name") && Prerequisite.HAS_PAPER.isMet) {
val displayName = meta.displayName() ?: return
meta.displayName(
displayName.replaceText(
replacement
)
)
val originalName =
meta.persistentDataContainer.get(originalComponentKey, PersistentDataType.STRING) ?: return
meta.persistentDataContainer.remove(originalComponentKey)
meta.displayName(serializer.deserialize(originalName).replaceText(replacement))
}
itemStack.itemMeta = meta

View File

@@ -10,9 +10,11 @@ import org.bukkit.entity.Player
class EffectAttackSpeedMultiplier : Effect("attack_speed_multiplier") {
override fun handleEnable(player: Player, config: JSONConfig) {
val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_SPEED) ?: return
val uuid = this.getUUID(player.getEffectAmount(this))
attribute.removeModifier(AttributeModifier(uuid, this.id, 0.0, AttributeModifier.Operation.MULTIPLY_SCALAR_1))
attribute.addModifier(
AttributeModifier(
this.getUUID(player.getEffectAmount(this)),
uuid,
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1

View File

@@ -13,9 +13,11 @@ class EffectKnockbackMultiplier : Effect("knockback_multiplier") {
config: JSONConfig
) {
val attribute = player.getAttribute(Attribute.GENERIC_ATTACK_KNOCKBACK) ?: return
val uuid = this.getUUID(player.getEffectAmount(this))
attribute.removeModifier(AttributeModifier(uuid, this.id, 0.0, AttributeModifier.Operation.MULTIPLY_SCALAR_1))
attribute.addModifier(
AttributeModifier(
this.getUUID(player.getEffectAmount(this)),
uuid,
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1

View File

@@ -13,9 +13,11 @@ class EffectMovementSpeedMultiplier : Effect("movement_speed_multiplier") {
config: JSONConfig
) {
val attribute = player.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED) ?: return
val uuid = this.getUUID(player.getEffectAmount(this))
attribute.removeModifier(AttributeModifier(uuid, this.id, 0.0, AttributeModifier.Operation.MULTIPLY_SCALAR_1))
attribute.addModifier(
AttributeModifier(
this.getUUID(player.getEffectAmount(this)),
uuid,
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1

View File

@@ -7,7 +7,7 @@ import org.bukkit.block.Block
import org.bukkit.entity.Player
import org.bukkit.event.block.BlockBreakEvent
class EffectRewardBlockBreak : Effect("reward_kill") {
class EffectRewardBlockBreak : Effect("reward_block_break") {
override fun onBlockBreak(
player: Player,
block: Block,

View File

@@ -8,12 +8,10 @@ import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
class EffectRewardKill : Effect("reward_kill") {
override fun onKill(
killer: Player,
victim: LivingEntity,
event: EntityDeathByEntityEvent,
config: JSONConfig
) {
override fun onKill(killer: Player,
victim: LivingEntity,
event: EntityDeathByEntityEvent,
config: JSONConfig) {
if (EconomyHandler.isEnabled()) {
EconomyHandler.getInstance().depositPlayer(killer, config.getDouble("amount"))
}

View File

@@ -0,0 +1,190 @@
package com.willfp.reforges.gui
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.FillerMask
import com.willfp.eco.core.gui.slot.MaskMaterials
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.util.ReforgeHandler
import com.willfp.reforges.reforges.util.ReforgeStatus
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import kotlin.math.pow
@Suppress("DEPRECATION")
object ReforgeGUI {
@JvmStatic
lateinit var menu: Menu
init {
update(ReforgesPlugin.getInstance())
}
@JvmStatic
@ConfigUpdater
fun update(plugin: EcoPlugin) {
val handler = ReforgeHandler(plugin)
val activatorSlot = Slot.builder(
ItemStack(Material.ANVIL)
).apply {
setModifier { player, menu, previous ->
val meta = previous.itemMeta ?: return@setModifier
val (status, specialCost) = ReforgeUtils.getStatus(menu.getCaptiveItems(player))
val cost: Double = when {
status == ReforgeStatus.ALLOW || (status == ReforgeStatus.ALLOW_STONE && specialCost < 0) -> {
val amountOfReforges = ReforgeUtils.getReforges(menu.getCaptiveItems(player)[0])
plugin.configYml.getDouble("reforge.cost") *
plugin.configYml.getDouble("reforge.cost-exponent").pow(amountOfReforges)
}
status == ReforgeStatus.ALLOW_STONE -> {
specialCost
}
else -> 0.0 // Never used, but at least kotlin can shut up
}
var xpCost = plugin.configYml.getInt("reforge.xp-cost")
if (status == ReforgeStatus.ALLOW) {
val item = menu.getCaptiveItems(player)[0]
val reforges = ReforgeUtils.getReforges(item)
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
}
when (status) {
ReforgeStatus.INVALID_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.invalid-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getString("gui.invalid-item.name"))
meta.lore = plugin.configYml.getStrings("gui.invalid-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getString("gui.allow.name"))
meta.lore = plugin.configYml.getStrings("gui.allow.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
ReforgeStatus.ALLOW_STONE -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.allow-stone.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getString("gui.allow-stone.name"))
meta.lore = plugin.configYml.getStrings("gui.allow-stone.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
.replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player)[1]).name)
}
}
ReforgeStatus.NO_ITEM -> {
previous.type = Material.getMaterial(
plugin.configYml.getString("gui.no-item.material").uppercase()
)!!
meta.setDisplayName(plugin.configYml.getString("gui.no-item.name"))
meta.lore = plugin.configYml.getStrings("gui.no-item.lore").map {
it.replace("%cost%", NumberUtils.format(cost))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
}
}
}
previous.itemMeta = meta
}
onLeftClick(handler::handleReforgeClick)
}.build()
val maskPattern = plugin.configYml.getStrings("gui.mask.pattern", false).toTypedArray()
val maskMaterials = plugin.configYml.getStrings("gui.mask.materials", false)
.mapNotNull { Material.getMaterial(it.uppercase()) }
.toTypedArray()
val allowMaterial =
Material.getMaterial(plugin.configYml.getString("gui.show-allowed.allow-material", false).uppercase())!!
val denyMaterial =
Material.getMaterial(plugin.configYml.getString("gui.show-allowed.deny-material", false).uppercase())!!
val closeMaterial =
Material.getMaterial(plugin.configYml.getString("gui.close.material", false).toUpperCase())!!
menu = Menu.builder(plugin.configYml.getInt("gui.rows")).apply {
setTitle(plugin.langYml.getString("menu.title"))
setMask(FillerMask(MaskMaterials(*maskMaterials), *maskPattern))
modfiy { builder ->
val slot = Slot.builder(
ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
).apply {
setModifier { player, menu, previous ->
val status = ReforgeUtils.getStatus(
menu.getCaptiveItems(player)
).status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
previous.type = allowMaterial
} else {
previous.type = denyMaterial
}
}
}.build()
val allowedPattern = plugin.configYml.getStrings("gui.show-allowed.pattern")
for (i in 1..allowedPattern.size) {
val row = allowedPattern[i - 1]
for (j in 1..9) {
if (row[j - 1] != '0') {
builder.setSlot(i, j, slot)
}
}
}
}
setSlot(
plugin.configYml.getInt("gui.item-slot.row"),
plugin.configYml.getInt("gui.item-slot.column"),
Slot.builder().setCaptive().build()
)
setSlot(
plugin.configYml.getInt("gui.stone-slot.row"),
plugin.configYml.getInt("gui.stone-slot.column"),
Slot.builder().setCaptive().build()
)
setSlot(
plugin.configYml.getInt("gui.activator-slot.row"),
plugin.configYml.getInt("gui.activator-slot.column"),
activatorSlot
)
setSlot(
plugin.configYml.getInt("gui.close.location.row"),
plugin.configYml.getInt("gui.close.location.column"),
Slot.builder(
ItemStackBuilder(closeMaterial)
.setDisplayName(plugin.langYml.getString("menu.close"))
.build()
).onLeftClick { event, _, _ ->
event.whoClicked.closeInventory()
}.build()
)
onClose { event, menu ->
DropQueue(event.player as Player)
.addItems(menu.getCaptiveItems(event.player as Player))
.setLocation(event.player.eyeLocation)
.push()
}
}.build()
}
}

View File

@@ -0,0 +1,17 @@
package com.willfp.reforges.integrations.aureliumskills
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.effects.Effect
object AureliumSkillsIntegration : Integration {
private lateinit var ADD_STAT: Effect
@JvmStatic
fun load() {
ADD_STAT = EffectAddStat()
}
override fun getPluginName(): String {
return "AureliumSkills"
}
}

View File

@@ -0,0 +1,29 @@
package com.willfp.reforges.integrations.aureliumskills
import com.archyx.aureliumskills.api.AureliumAPI
import com.archyx.aureliumskills.stats.Stats
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.effects.getEffectAmount
import org.bukkit.entity.Player
class EffectAddStat : Effect("add_stat") {
override fun handleEnable(
player: Player,
config: JSONConfig
) {
AureliumAPI.addStatModifier(
player,
this.getNamespacedKey(player.getEffectAmount(this)).key,
Stats.valueOf(config.getString("stat", false)),
config.getDouble("amount")
)
}
override fun handleDisable(player: Player) {
AureliumAPI.removeStatModifier(
player,
this.getNamespacedKey(player.getEffectAmount(this)).key,
)
}
}

View File

@@ -0,0 +1,17 @@
package com.willfp.reforges.integrations.ecoskills
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.effects.Effect
object EcoSkillsIntegration : Integration {
private lateinit var ADD_STAT: Effect
@JvmStatic
fun load() {
ADD_STAT = EffectAddStat()
}
override fun getPluginName(): String {
return "EcoSkills"
}
}

View File

@@ -0,0 +1,39 @@
package com.willfp.reforges.integrations.ecoskills
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.ecoskills.api.EcoSkillsAPI
import com.willfp.ecoskills.api.modifier.PlayerStatModifier
import com.willfp.ecoskills.stats.Stats
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.effects.getEffectAmount
import org.bukkit.Bukkit
import org.bukkit.entity.Player
class EffectAddStat : Effect("add_stat") {
private val api = EcoSkillsAPI.getInstance()
override fun handleEnable(
player: Player,
config: JSONConfig
) {
api.addStatModifier(
player,
PlayerStatModifier(
this.getNamespacedKey(player.getEffectAmount(this)),
Stats.getByID(config.getString("stat", false)) ?: Stats.WISDOM,
config.getInt("amount")
)
)
}
override fun handleDisable(player: Player) {
api.removeStatModifier(
player,
PlayerStatModifier(
this.getNamespacedKey(player.getEffectAmount(this)),
Stats.STRENGTH,
0
)
)
}
}

View File

@@ -0,0 +1,25 @@
package com.willfp.reforges.integrations.talismans
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeLookup
import com.willfp.talismans.talismans.util.TalismanChecks
import org.bukkit.inventory.ItemStack
object TalismansIntegration : Integration {
@JvmStatic
fun registerProvider() {
ReforgeLookup.registerProvider { player ->
val provided = mutableMapOf<ItemStack, ReforgeTarget.Slot>()
for (itemStack in TalismanChecks.getTalismanItemsOnPlayer(player, true)) {
provided[itemStack] = ReforgeTarget.Slot.ANY
}
provided
}
}
override fun getPluginName(): String {
return "Talismans"
}
}

View File

@@ -0,0 +1,38 @@
package com.willfp.reforges.integrations.ultimateskills
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.effects.Effect
import mc.ultimatecore.skills.HyperSkills
import mc.ultimatecore.skills.objects.abilities.Ability
import org.bukkit.entity.Player
import org.bukkit.persistence.PersistentDataType
class EffectAddAbility : Effect("add_ultimateskills_ability") {
override fun handleEnable(
player: Player,
config: JSONConfig
) {
HyperSkills.getInstance().api.addAbility(
player.uniqueId,
Ability.valueOf(config.getString("ability", false)),
config.getDouble("amount")
)
player.persistentDataContainer.set(
ReforgesPlugin.getInstance().namespacedKeyFactory.create("addAbility"), PersistentDataType.STRING,
NumberUtils.format(config.getDouble("amount")) + "::" + config.getString("ability", false)
)
}
override fun handleDisable(player: Player) {
player.persistentDataContainer.get(ReforgesPlugin.getInstance().namespacedKeyFactory.create("addAbility"), PersistentDataType.STRING)
?.let {
HyperSkills.getInstance().api.removeAbility(
player.uniqueId,
Ability.valueOf(it.split("::")[1]),
it.split("::")[0].toDouble()
)
}
}
}

View File

@@ -0,0 +1,37 @@
package com.willfp.reforges.integrations.ultimateskills
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.effects.Effect
import mc.ultimatecore.skills.HyperSkills
import mc.ultimatecore.skills.objects.perks.Perk
import org.bukkit.entity.Player
import org.bukkit.persistence.PersistentDataType
class EffectAddPerk : Effect("add_ultimateskills_perk") {
override fun handleEnable(
player: Player,
config: JSONConfig
) {
HyperSkills.getInstance().api.addPerk(
player.uniqueId,
Perk.valueOf(config.getString("perk", false)),
config.getDouble("amount")
)
player.persistentDataContainer.set(ReforgesPlugin.getInstance().namespacedKeyFactory.create("addPerk"), PersistentDataType.STRING,
NumberUtils.format(config.getDouble("amount")) + "::" + config.getString("perk", false)
)
}
override fun handleDisable(player: Player) {
player.persistentDataContainer.get(ReforgesPlugin.getInstance().namespacedKeyFactory.create("addPerk"), PersistentDataType.STRING)
?.let {
HyperSkills.getInstance().api.removePerk(
player.uniqueId,
Perk.valueOf(it.split("::")[1]),
it.split("::")[0].toDouble()
)
}
}
}

View File

@@ -0,0 +1,19 @@
package com.willfp.reforges.integrations.ultimateskills
import com.willfp.eco.core.integrations.Integration
import com.willfp.reforges.effects.Effect
object UltimateSkillsIntegration : Integration {
private lateinit var ADD_PERK: Effect
private lateinit var ADD_ABILITY: Effect
@JvmStatic
fun load() {
ADD_PERK = EffectAddPerk()
ADD_ABILITY = EffectAddAbility()
}
override fun getPluginName(): String {
return "UltimateSkills"
}
}

View File

@@ -44,27 +44,33 @@ class Reforge(
val stone: ItemStack = SkullBuilder().apply {
if (config.getBool("stone.enabled")) {
setSkullTexture(config.getString("stone.texture"))
setDisplayName(plugin.configYml.getString("stone.name").replace("%reforge%", name))
setDisplayName(plugin.configYml.getString("reforge.stone.name").replace("%reforge%", name))
addLoreLines(
plugin.configYml.getStrings("stone.lore").map { "${Display.PREFIX}${it.replace("%reforge%", name)}" })
}
}.build()
val stonePrice = config.getIntOrNull("stone.price") ?: -1
init {
Reforges.addNewReforge(this)
ReforgeUtils.setReforgeStone(stone, this)
Display.display(stone)
CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> ReforgeUtils.getReforgeStone(test) == this },
stone
).register()
if (config.getBool("craftable")) {
if (config.getBool("stone.craftable") && config.getBool("stone.enabled")) {
Recipes.createAndRegisterRecipe(
plugin,
"stone_" + this.id,
stone,
config.getStrings("recipe", false)
config.getStrings("stone.recipe", false)
)
}
}

View File

@@ -0,0 +1,3 @@
package com.willfp.reforges.reforges.util
data class MetadatedReforgeStatus(val status: ReforgeStatus, val cost: Double)

View File

@@ -0,0 +1,36 @@
package com.willfp.reforges.reforges.util
import com.willfp.eco.core.items.args.LookupArgParser
import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.Reforges
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import java.util.function.Predicate
class ReforgeArgParser : LookupArgParser {
override fun parseArguments(
args: Array<String>,
meta: ItemMeta
): Predicate<ItemStack>? {
var reforge: Reforge? = null
for (arg in args) {
val split = arg.split(":").toTypedArray()
if (split.size == 1 || !split[0].equals("reforge", ignoreCase = true)) {
continue
}
val match = Reforges.getByKey(split[1].lowercase()) ?: continue
reforge = match
break
}
reforge ?: return null
ReforgeUtils.setReforge(meta, reforge)
return Predicate { test ->
val testMeta = test.itemMeta ?: return@Predicate false
reforge == ReforgeUtils.getReforge(testMeta)
}
}
}

View File

@@ -6,6 +6,7 @@ import com.willfp.eco.core.events.PlayerJumpEvent
import com.willfp.eco.core.integrations.antigrief.AntigriefManager
import com.willfp.eco.core.integrations.mcmmo.McmmoManager
import com.willfp.eco.util.NumberUtils
import com.willfp.reforges.events.EffectActivateEvent
import org.bukkit.entity.*
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
@@ -33,10 +34,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(player)) {
for ((key, value) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > value.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (value.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
key.onBlockBreak(player, block, event, value)
val aEvent = EffectActivateEvent(player, reforge, key)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
key.onBlockBreak(player, block, event, value)
}
}
}
}
@@ -74,11 +79,15 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(shooter)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onArrowDamage(shooter, victim, arrow, event, config)
effect.onAnyDamage(shooter, victim, event, config)
val aEvent = EffectActivateEvent(shooter, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onArrowDamage(shooter, victim, arrow, event, config)
effect.onAnyDamage(shooter, victim, event, config)
}
}
}
}
@@ -121,11 +130,15 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(shooter) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onTridentDamage(shooter, victim, trident, event, config)
effect.onAnyDamage(shooter, victim, event, config)
val aEvent = EffectActivateEvent(shooter, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onTridentDamage(shooter, victim, trident, event, config)
effect.onAnyDamage(shooter, victim, event, config)
}
}
}
}
@@ -139,10 +152,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(player)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onJump(player, event, config)
val aEvent = EffectActivateEvent(player, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onJump(player, event, config)
}
}
}
}
@@ -179,11 +196,15 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(attacker)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onMeleeAttack(attacker, victim, event, config)
effect.onAnyDamage(attacker, victim, event, config)
val aEvent = EffectActivateEvent(attacker, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onMeleeAttack(attacker, victim, event, config)
effect.onAnyDamage(attacker, victim, event, config)
}
}
}
}
@@ -219,10 +240,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(killer) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onKill(killer, victim, event, config)
val aEvent = EffectActivateEvent(killer, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
(effect as Watcher).onKill(killer, victim, event, config)
}
}
}
}
@@ -241,10 +266,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(shooter)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onProjectileLaunch(shooter, event.entity, event, config)
val aEvent = EffectActivateEvent(shooter, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onProjectileLaunch(shooter, event.entity, event, config)
}
}
}
}
@@ -267,10 +296,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(victim)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onFallDamage(victim, event, config)
val aEvent = EffectActivateEvent(victim, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onFallDamage(victim, event, config)
}
}
}
}
@@ -294,10 +327,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(shooter) union add) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onProjectileHit(shooter, event, config)
val aEvent = EffectActivateEvent(shooter, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onProjectileHit(shooter, event, config)
}
}
}
}
@@ -312,10 +349,14 @@ class WatcherTriggers(
val reforge = ReforgeUtils.getReforge(item) ?: return
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onDurabilityDamage(event, config)
val aEvent = EffectActivateEvent(event.player, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onDurabilityDamage(event, config)
}
}
}
@@ -333,10 +374,14 @@ class WatcherTriggers(
for (reforge in ReforgeLookup.provideReforges(victim)) {
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
if (NumberUtils.randFloat(0.0, 100.0) > (config.getDoubleOrNull("chance") ?: 100.0)) {
continue
}
effect.onDamageWearingArmor(victim, event, config)
val aEvent = EffectActivateEvent(victim, reforge, effect)
this.plugin.server.pluginManager.callEvent(aEvent)
if (!aEvent.isCancelled) {
effect.onDamageWearingArmor(victim, event, config)
}
}
}
}

View File

@@ -43,6 +43,10 @@ gui:
- "100000001"
- "100000001"
activator-slot:
row: 2
column: 5
stone-slot:
row: 4
column: 7
@@ -119,6 +123,7 @@ gui:
reforge:
cost: 7500
xp-cost: 0 # In levels
use-player-points: false
cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost

View File

@@ -10,6 +10,10 @@ depend:
- ProtocolLib
softdepend:
- Vault
- EcoSkills
- Talismans
- AureliumSkills
- PlayerPoints
libraries:
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'

View File

@@ -1,2 +1,2 @@
version = 3.0.0
version = 3.7.0
plugin-name = Reforges

BIN
lib/UltimateHelper.jar Normal file

Binary file not shown.

BIN
lib/UltimateSkills.jar Normal file

Binary file not shown.