9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-25 18:09:25 +00:00

Began rewriting many elements in kotlin

This commit is contained in:
Auxilor
2021-09-29 12:21:24 +01:00
parent 8f2a7bfbdb
commit 2b36619a8d
30 changed files with 527 additions and 717 deletions

View File

@@ -73,9 +73,7 @@ public class ReforgesPlugin extends EcoPlugin {
protected void handleReload() {
for (Effect effect : Effects.values()) {
HandlerList.unregisterAll(effect);
this.getScheduler().run(() -> {
this.getEventManager().registerListener(effect);
});
this.getScheduler().run(() -> this.getEventManager().registerListener(effect));
}
}
@@ -83,7 +81,7 @@ public class ReforgesPlugin extends EcoPlugin {
protected List<Listener> loadListeners() {
return Arrays.asList(
new DiscoverRecipeListener(this),
new AntiPlaceListener(this),
new AntiPlaceListener(),
new WatcherTriggers(this)
);
}
@@ -103,6 +101,6 @@ public class ReforgesPlugin extends EcoPlugin {
@Override
public String getMinimumEcoVersion() {
return "6.7.0";
return "6.8.0";
}
}

View File

@@ -56,7 +56,7 @@ public class CommandGive extends Subcommand {
public static void reload() {
STONE_NAMES.clear();
STONE_NAMES.addAll(Reforges.values().stream()
.filter(Reforge::isRequiresStone)
.filter(Reforge::getRequiresStone)
.map(Reforge::getId)
.collect(Collectors.toList()));
}

View File

@@ -1,99 +0,0 @@
package com.willfp.reforges.display;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.display.Display;
import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.display.DisplayPriority;
import com.willfp.eco.core.fast.FastItemStack;
import com.willfp.eco.util.SkullUtils;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ReforgesDisplay extends DisplayModule {
/**
* Create weapons display.
*
* @param plugin Instance of Reforges.
*/
public ReforgesDisplay(@NotNull final EcoPlugin plugin) {
super(plugin, DisplayPriority.HIGHEST);
}
@Override
public void display(@NotNull final ItemStack itemStack,
@NotNull final Object... args) {
ReforgeTarget target = ReforgeTarget.getForItem(itemStack);
if (target == null && itemStack.getType() != Material.PLAYER_HEAD) {
return;
}
ItemMeta meta = itemStack.getItemMeta();
FastItemStack fastItemStack = FastItemStack.wrap(itemStack);
assert meta != null;
List<String> lore = fastItemStack.getLore();
assert lore != null;
Reforge reforge = ReforgeUtils.getReforge(meta);
Reforge stone = ReforgeUtils.getReforgeStone(meta);
if (reforge == null && stone == null && target != null) {
if (this.getPlugin().getConfigYml().getBool("reforge.show-reforgable")) {
List<String> addLore = new ArrayList<>();
for (String string : this.getPlugin().getConfigYml().getStrings("reforge.reforgable-suffix")) {
addLore.add(Display.PREFIX + string);
}
lore.addAll(addLore);
}
}
if (stone != null) {
meta.setDisplayName(this.getPlugin().getConfigYml().getString("reforge.stone.name").replace("%reforge%", stone.getName()));
SkullUtils.setSkullTexture((SkullMeta) meta, stone.getConfig().getString("stone-config.texture"));
itemStack.setItemMeta(meta);
List<String> stoneLore = new ArrayList<>();
for (String string : this.getPlugin().getConfigYml().getStrings("reforge.stone.lore")) {
stoneLore.add(Display.PREFIX + string.replace("%reforge%", stone.getName()));
}
lore.addAll(0, stoneLore);
}
if (reforge != null) {
if (this.getPlugin().getConfigYml().getBool("reforge.display-in-lore")) {
List<String> addLore = new ArrayList<>();
addLore.add(" ");
addLore.add(reforge.getName());
List<String> description = new ArrayList<>(Arrays.asList(WordUtils.wrap(
reforge.getDescription(),
this.getPlugin().getConfigYml().getInt("reforge.line-wrap"),
"\n",
false
).split("\\r?\\n")));
description.replaceAll(s -> this.getPlugin().getLangYml().getString("description-color") + s.replace("%description%", reforge.getDescription()));
description.replaceAll(s -> s.replace("§r", this.getPlugin().getLangYml().getString("description-color")));
addLore.addAll(description);
addLore.replaceAll(s -> Display.PREFIX + s);
lore.addAll(addLore);
}
}
itemStack.setItemMeta(meta);
fastItemStack.setLore(lore);
}
}

View File

@@ -1,64 +0,0 @@
package com.willfp.reforges.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.reforges.util.Watcher;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.event.Listener;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public abstract class Effect implements Listener, Watcher {
/**
* Instance of Reforges.
*/
@Getter(AccessLevel.PROTECTED)
private final ReforgesPlugin plugin = ReforgesPlugin.getInstance();
/**
* The name of the effect.
*/
@Getter
private final String name;
/**
* The effect uuid.
*/
@Getter
private final UUID uuid;
/**
* Create a new effect.
*
* @param name The effect name.
*/
protected Effect(@NotNull final String name) {
this.name = name;
this.uuid = UUID.nameUUIDFromBytes(name.getBytes());
Effects.addNewEffect(this);
}
/**
* Handle reforge application.
*
* @param meta The meta.
* @param config The config.
*/
public void handleApplication(@NotNull final ItemMeta meta,
@NotNull final JSONConfig config) {
// Override when needed
}
/**
* Handle reforge removal.
*
* @param meta The meta.
*/
public void handleRemoval(@NotNull final ItemMeta meta) {
// Override when needed
}
}

View File

@@ -1,28 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.effects.Effect;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.jetbrains.annotations.NotNull;
public class EffectCritMultiplier extends Effect {
/**
* Create a new effect.
*/
public EffectCritMultiplier() {
super("crit_multiplier");
}
@Override
public void onAnyDamage(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
if (attacker.getVelocity().getY() > 0) {
return;
}
event.setDamage(event.getDamage() * config.getDouble("multiplier"));
}
}

View File

@@ -1,24 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.effects.Effect;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.jetbrains.annotations.NotNull;
public class EffectDamageMultiplier extends Effect {
/**
* Create a new effect.
*/
public EffectDamageMultiplier() {
super("damage_multiplier");
}
@Override
public void onAnyDamage(@NotNull final LivingEntity attacker,
@NotNull final LivingEntity victim,
@NotNull final EntityDamageByEntityEvent event,
@NotNull final JSONConfig config) {
event.setDamage(event.getDamage() * config.getDouble("multiplier"));
}
}

View File

@@ -1,23 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.effects.Effect;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.NotNull;
public class EffectIncomingDamageMultiplier extends Effect {
/**
* Create a new effect.
*/
public EffectIncomingDamageMultiplier() {
super("incoming_damage_multiplier");
}
@Override
public void onDamageWearingArmor(@NotNull final LivingEntity victim,
@NotNull final EntityDamageEvent event,
@NotNull final JSONConfig config) {
event.setDamage(event.getDamage() * config.getDouble("multiplier"));
}
}

View File

@@ -1,44 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.effects.Effect;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
public class EffectKnockbackMultiplier extends Effect {
/**
* Create a new effect.
*/
public EffectKnockbackMultiplier() {
super("knockback_multiplier");
}
@Override
public void handleApplication(@NotNull final ItemMeta meta,
@NotNull final JSONConfig config) {
meta.addAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
new AttributeModifier(
this.getUuid(),
this.getName(),
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
);
}
@Override
public void handleRemoval(@NotNull final ItemMeta meta) {
meta.removeAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
new AttributeModifier(
this.getUuid(),
this.getName(),
0,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
);
}
}

View File

@@ -1,26 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.vault.EconomyHandler;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockBreakEvent;
import org.jetbrains.annotations.NotNull;
public class EffectRewardBlockBreak extends Effect {
/**
* Create a new effect.
*/
public EffectRewardBlockBreak() {
super("reward_kill");
}
@Override
public void onBlockBreak(@NotNull final Player player,
@NotNull final Block block,
@NotNull final BlockBreakEvent event,
@NotNull final JSONConfig config) {
EconomyHandler.getInstance().depositPlayer(player, config.getDouble("amount"));
}
}

View File

@@ -1,30 +0,0 @@
package com.willfp.reforges.effects.effects;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.events.EntityDeathByEntityEvent;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.vault.EconomyHandler;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class EffectRewardKill extends Effect {
/**
* Create a new effect.
*/
public EffectRewardKill() {
super("reward_kill");
}
@Override
public void onKill(@NotNull final LivingEntity killer,
@NotNull final LivingEntity victim,
@NotNull final EntityDeathByEntityEvent event,
@NotNull final JSONConfig config) {
if (!(killer instanceof Player player)) {
return;
}
EconomyHandler.getInstance().depositPlayer(player, config.getDouble("amount"));
}
}

View File

@@ -1,200 +0,0 @@
package com.willfp.reforges.reforges;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.display.Display;
import com.willfp.eco.core.items.CustomItem;
import com.willfp.eco.core.items.builder.SkullBuilder;
import com.willfp.eco.core.recipe.Recipes;
import com.willfp.reforges.ReforgesPlugin;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.effects.Effects;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import lombok.AccessLevel;
import lombok.Getter;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class Reforge {
/**
* Instance of Reforges for reforges to be able to access.
*/
@Getter(AccessLevel.PROTECTED)
private final EcoPlugin plugin = ReforgesPlugin.getInstance();
/**
* The key to store reforges in meta.
*/
@Getter
private final String id;
/**
* The reforges config.
*/
@Getter
private final JSONConfig config;
/**
* The effects.
*/
@Getter
private final Map<Effect, JSONConfig> effects;
/**
* The display name.
*/
@Getter
private final String name;
/**
* The display name.
*/
@Getter
private final String description;
/**
* If a reforge stone is required.
*/
@Getter
private boolean requiresStone;
/**
* The reforge stone.
*/
@Getter
private ItemStack stone;
/**
* The reforge target.
*/
@Getter
private final Set<ReforgeTarget> targets;
/**
* Create a new Reforge.
*
* @param config The config.
* @param plugin Instance of reforges.
*/
protected Reforge(@NotNull final JSONConfig config,
@NotNull final ReforgesPlugin plugin) {
this.config = config;
this.id = config.getString("id");
this.name = config.getString("name");
this.description = config.getString("description");
this.targets = new HashSet<>();
for (String targetName : config.getStrings("targets")) {
this.targets.add(ReforgeTarget.getByName(targetName));
}
this.effects = new HashMap<>();
for (JSONConfig effectConfig : config.getSubsections("effects")) {
Effect effect = Effects.getByName(effectConfig.getString("id"));
if (effect != null) {
effects.put(effect, effectConfig);
}
}
handleStone(config.getSubsection("stone"), plugin);
}
private void handleStone(@NotNull final JSONConfig config,
@NotNull final ReforgesPlugin plugin) {
this.requiresStone = config.getBool("enabled");
if (requiresStone) {
List<String> stoneLore = new ArrayList<>();
for (String string : this.getPlugin().getConfigYml().getStrings("reforge.stone.lore")) {
stoneLore.add(Display.PREFIX + string.replace("%reforge%", this.getName()));
}
stone = new SkullBuilder()
.setSkullTexture(config.getString("texture"))
.setDisplayName(this.getPlugin().getConfigYml().getString("stone.name").replace("%reforge%", this.getName()))
.addLoreLines(stoneLore)
.build();
} else {
stone = new SkullBuilder()
.build();
}
ReforgeUtils.setReforgeStone(stone, this);
new CustomItem(
plugin.getNamespacedKeyFactory().create("stone_" + this.getId()),
test -> Objects.equals(ReforgeUtils.getReforgeStone(test), this),
stone
).register();
if (config.getBool("craftable")) {
Recipes.createAndRegisterRecipe(
plugin,
"stone_" + this.getId(),
stone,
config.getStrings("recipe", false)
);
}
}
public final void handleApplication(@NotNull final ItemStack itemStack) {
handleRemoval(itemStack);
itemStack.setItemMeta(this.handleApplication(Objects.requireNonNull(itemStack.getItemMeta())));
}
public final ItemMeta handleApplication(@NotNull final ItemMeta meta) {
for (Map.Entry<Effect, JSONConfig> entry : this.getEffects().entrySet()) {
entry.getKey().handleApplication(meta, entry.getValue());
}
return meta;
}
public final void handleRemoval(@NotNull final ItemStack itemStack) {
itemStack.setItemMeta(this.handleRemoval(Objects.requireNonNull(itemStack.getItemMeta())));
}
public final ItemMeta handleRemoval(@NotNull final ItemMeta meta) {
for (Map.Entry<Effect, JSONConfig> entry : this.getEffects().entrySet()) {
entry.getKey().handleApplication(meta, entry.getValue());
}
return meta;
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Reforge reforge)) {
return false;
}
return this.getId().equals(reforge.getId());
}
@Override
public int hashCode() {
return Objects.hash(this.getId());
}
@Override
public String toString() {
return "Reforge{"
+ this.getId()
+ "}";
}
}

View File

@@ -4,7 +4,6 @@ import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.slot.Slot;
import com.willfp.reforges.reforges.Reforge;
import com.willfp.reforges.reforges.meta.ReforgeTarget;
import com.willfp.reforges.vault.EconomyHandler;
import org.bukkit.Sound;

View File

@@ -1,39 +0,0 @@
package com.willfp.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.reforges.reforges.util.ReforgeUtils;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ShapedRecipe;
import org.jetbrains.annotations.NotNull;
public class AntiPlaceListener extends PluginDependent<EcoPlugin> implements Listener {
/**
* Register listener.
*
* @param plugin Talismans.
*/
public AntiPlaceListener(@NotNull final EcoPlugin plugin) {
super(plugin);
}
/**
* Prevent block place.
*
* @param event The event.
*/
@EventHandler
public void onBlockPlace(@NotNull final BlockPlaceEvent event) {
if (ReforgeUtils.getReforgeStone(event.getItemInHand()) != null) {
event.setCancelled(true);
event.setBuild(false);
}
}
}

View File

@@ -1,47 +0,0 @@
package com.willfp.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ShapedRecipe;
import org.jetbrains.annotations.NotNull;
public class DiscoverRecipeListener extends PluginDependent<EcoPlugin> implements Listener {
/**
* Register listener.
*
* @param plugin Talismans.
*/
public DiscoverRecipeListener(@NotNull final EcoPlugin plugin) {
super(plugin);
}
/**
* Unlock all recipes on player join.
*
* @param event The event to listen for.
*/
@EventHandler
public void onJoin(@NotNull final PlayerJoinEvent event) {
Player player = event.getPlayer();
if (this.getPlugin().getConfigYml().getBool("discover-recipes")) {
Bukkit.getServer().recipeIterator().forEachRemaining(recipe -> {
if (recipe instanceof ShapedRecipe) {
NamespacedKey key = ((ShapedRecipe) recipe).getKey();
if (key.getNamespace().equals("reforges")) {
if (!key.getKey().contains("displayed")) {
player.discoverRecipe(key);
}
}
}
});
}
}
}

View File

@@ -0,0 +1,92 @@
package com.willfp.reforges.display
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.display.DisplayPriority
import com.willfp.eco.core.fast.FastItemStack
import com.willfp.eco.util.SkullUtils
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.apache.commons.lang.WordUtils
import org.bukkit.Material
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta
class ReforgesDisplay(plugin: EcoPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) {
override fun display(
itemStack: ItemStack,
vararg args: Any
) {
val target = ReforgeTarget.getForItem(itemStack)
if (target == null && itemStack.type != Material.PLAYER_HEAD) {
return
}
val meta = itemStack.itemMeta ?: return
val fastItemStack = FastItemStack.wrap(itemStack)
val lore = fastItemStack.lore
val reforge = ReforgeUtils.getReforge(meta)
val stone = ReforgeUtils.getReforgeStone(meta)
if (reforge == null && stone == null && target != null) {
if (plugin.configYml.getBool("reforge.show-reforgable")) {
val addLore: MutableList<String> = ArrayList()
for (string in plugin.configYml.getStrings("reforge.reforgable-suffix")) {
addLore.add(Display.PREFIX + string)
}
lore.addAll(addLore)
}
}
if (stone != null) {
meta.setDisplayName(plugin.configYml.getString("reforge.stone.name").replace("%reforge%", stone.name))
SkullUtils.setSkullTexture(
meta as SkullMeta,
SkullUtils.getSkullTexture(stone.stone.itemMeta as SkullMeta) ?: return
)
itemStack.itemMeta = meta
val stoneLore = plugin.configYml.getStrings("reforge.stone.lore").map {
"${Display.PREFIX}${it.replace("%reforge%", stone.name)}"
}.toList()
lore.addAll(0, stoneLore)
}
if (reforge != null) {
if (plugin.configYml.getBool("reforge.display-in-lore")) {
val addLore: MutableList<String> = ArrayList()
addLore.add(" ")
addLore.add(reforge.name)
val description = mutableListOf(
*WordUtils.wrap(
reforge.description,
plugin.configYml.getInt("reforge.line-wrap"),
"\n",
false
).split("\\r?\\n").toTypedArray()
)
description.replaceAll { s: String ->
plugin.langYml.getString("description-color") + s.replace(
"%description%",
reforge.description
)
}
description.replaceAll { s: String ->
s.replace(
"§r",
plugin.langYml.getString("description-color")
)
}
addLore.addAll(description)
addLore.replaceAll { "${Display.PREFIX}$it" }
lore.addAll(addLore)
}
}
itemStack.itemMeta = meta
fastItemStack.lore = lore
}
}

View File

@@ -0,0 +1,5 @@
package com.willfp.reforges.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
data class ConfiguredEffect(val effect: Effect, val config: JSONConfig)

View File

@@ -0,0 +1,46 @@
package com.willfp.reforges.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.util.Watcher
import org.bukkit.event.Listener
import org.bukkit.inventory.meta.ItemMeta
import java.util.*
abstract class Effect(
val id: String
) : Listener, Watcher {
protected val plugin: ReforgesPlugin = ReforgesPlugin.getInstance()
val uuid: UUID = UUID.nameUUIDFromBytes(id.encodeToByteArray())
init {
register()
}
private fun register() {
Effects.addNewEffect(this)
}
/**
* Handle reforge application.
*
* @param meta The meta.
* @param config The config.
*/
open fun handleApplication(
meta: ItemMeta,
config: JSONConfig
) {
// Override when needed
}
/**
* Handle reforge removal.
*
* @param meta The meta.
*/
open fun handleRemoval(meta: ItemMeta) {
// Override when needed
}
}

View File

@@ -0,0 +1,20 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageByEntityEvent
class EffectCritMultiplier : Effect("crit_multiplier") {
override fun onAnyDamage(
attacker: LivingEntity,
victim: LivingEntity,
event: EntityDamageByEntityEvent,
config: JSONConfig
) {
if (attacker.velocity.y > 0) {
return
}
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -0,0 +1,17 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageByEntityEvent
class EffectDamageMultiplier : Effect("damage_multiplier") {
override fun onAnyDamage(
attacker: LivingEntity,
victim: LivingEntity,
event: EntityDamageByEntityEvent,
config: JSONConfig
) {
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -0,0 +1,16 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.entity.LivingEntity
import org.bukkit.event.entity.EntityDamageEvent
class EffectIncomingDamageMultiplier : Effect("incoming_damage_multiplier") {
override fun onDamageWearingArmor(
victim: LivingEntity,
event: EntityDamageEvent,
config: JSONConfig
) {
event.damage *= config.getDouble("multiplier")
}
}

View File

@@ -0,0 +1,36 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import org.bukkit.attribute.Attribute
import org.bukkit.attribute.AttributeModifier
import org.bukkit.inventory.meta.ItemMeta
class EffectKnockbackMultiplier : Effect("knockback_multiplier") {
override fun handleApplication(
meta: ItemMeta,
config: JSONConfig
) {
meta.addAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
AttributeModifier(
this.uuid,
this.id,
config.getDouble("multiplier") - 1,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
}
override fun handleRemoval(meta: ItemMeta) {
meta.removeAttributeModifier(
Attribute.GENERIC_ATTACK_KNOCKBACK,
AttributeModifier(
this.uuid,
this.id,
0.0,
AttributeModifier.Operation.MULTIPLY_SCALAR_1
)
)
}
}

View File

@@ -0,0 +1,19 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.vault.EconomyHandler
import org.bukkit.block.Block
import org.bukkit.entity.Player
import org.bukkit.event.block.BlockBreakEvent
class EffectRewardBlockBreak : Effect("reward_kill") {
override fun onBlockBreak(
player: Player,
block: Block,
event: BlockBreakEvent,
config: JSONConfig
) {
EconomyHandler.getInstance().depositPlayer(player, config.getDouble("amount"))
}
}

View File

@@ -0,0 +1,23 @@
package com.willfp.reforges.effects.effects
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.core.events.EntityDeathByEntityEvent
import com.willfp.reforges.effects.Effect
import com.willfp.reforges.vault.EconomyHandler
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
class EffectRewardKill : Effect("reward_kill") {
override fun onKill(
killer: LivingEntity,
victim: LivingEntity,
event: EntityDeathByEntityEvent,
config: JSONConfig
) {
if (killer !is Player) {
return
}
EconomyHandler.getInstance().depositPlayer(killer, config.getDouble("amount"))
}
}

View File

@@ -0,0 +1,106 @@
package com.willfp.reforges.reforges
import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.builder.SkullBuilder
import com.willfp.eco.core.recipe.Recipes
import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.effects.ConfiguredEffect
import com.willfp.reforges.effects.Effects
import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import java.util.*
class Reforge(
private val config: JSONConfig,
private val plugin: ReforgesPlugin
) {
val id = config.getString("id")
val name = config.getString("name")
val description = config.getString("description")
val targets = config.getStrings("targets").map { ReforgeTarget.getByName(it) }.toSet()
val effects = config.getSubsections("effects").map {
val effect = Effects.getByName(it.getString("id")) ?: return@map null
ConfiguredEffect(effect, it)
}.filterNotNull().toSet()
val requiresStone = config.getBool("stone.enabled")
val stone: ItemStack = SkullBuilder().apply {
if (config.has("stone.texture")) {
setSkullTexture(config.getString("texture"))
}
setDisplayName(plugin.configYml.getString("stone.name").replace("%reforge%", name))
addLoreLines(
plugin.configYml.getStrings("stone.lore").map { "${Display.PREFIX}${it.replace("%reforge%", name)}" })
}.build()
init {
ReforgeUtils.setReforgeStone(stone, this)
CustomItem(
plugin.namespacedKeyFactory.create("stone_" + this.id),
{ test -> ReforgeUtils.getReforgeStone(test) == this },
stone
).register()
if (config.getBool("craftable")) {
Recipes.createAndRegisterRecipe(
plugin,
"stone_" + this.id,
stone,
config.getStrings("recipe", false)
)
}
}
fun handleApplication(itemStack: ItemStack) {
handleRemoval(itemStack)
itemStack.itemMeta = this.handleApplication(itemStack.itemMeta!!)
}
fun handleApplication(meta: ItemMeta): ItemMeta {
for ((effect, config) in this.effects) {
effect.handleApplication(meta, config)
}
return meta
}
fun handleRemoval(itemStack: ItemStack) {
itemStack.itemMeta = this.handleRemoval(itemStack.itemMeta!!)
}
fun handleRemoval(meta: ItemMeta): ItemMeta {
for ((effect, _) in this.effects) {
effect.handleRemoval(meta)
}
return meta
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other !is Reforge) {
return false
}
return other.id == this.id
}
override fun hashCode(): Int {
return Objects.hash(id)
}
override fun toString(): String {
return "Reforge{$id}"
}
}

View File

@@ -9,7 +9,6 @@ import com.willfp.eco.core.integrations.antigrief.AntigriefManager;
import com.willfp.eco.core.integrations.mcmmo.McmmoManager;
import com.willfp.eco.util.ArrowUtils;
import com.willfp.eco.util.NumberUtils;
import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.reforges.Reforge;
import org.bukkit.block.Block;
import org.bukkit.entity.AbstractArrow;
@@ -44,96 +43,11 @@ public class WatcherTriggers extends PluginDependent<EcoPlugin> implements Liste
super(plugin);
}
/**
* Called when a player breaks a block.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onBlockBreak(@NotNull final BlockBreakEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
Player player = event.getPlayer();
Block block = event.getBlock();
if (!AntigriefManager.canBreakBlock(player, block)) {
return;
}
ItemStack itemStack = player.getInventory().getItemInMainHand();
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
return;
}
for (Map.Entry<Effect, JSONConfig> entry : reforge.getEffects().entrySet()) {
if (NumberUtils.randFloat(0, 100) > (entry.getValue().has("chance") ? entry.getValue().getDouble("chance") : 100)) {
continue;
}
entry.getKey().onBlockBreak(player, block, event, entry.getValue());
}
}
/**
* Called when an entity shoots another entity with an arrow.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onArrowDamage(@NotNull final EntityDamageByEntityEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getDamager() instanceof Arrow arrow)) {
return;
}
if (!(event.getEntity() instanceof LivingEntity victim)) {
return;
}
if (arrow.getShooter() == null) {
return;
}
if (!(arrow.getShooter() instanceof LivingEntity attacker)) {
return;
}
if (attacker instanceof Player && !AntigriefManager.canInjure((Player) attacker, victim)) {
return;
}
if (event.isCancelled()) {
return;
}
ItemStack bow = ArrowUtils.getBow(arrow);
if (bow == null) {
return;
}
Reforge reforge = ReforgeUtils.getReforge(bow);
if (reforge == null) {
return;
}
for (Map.Entry<Effect, JSONConfig> entry : reforge.getEffects().entrySet()) {
if (NumberUtils.randFloat(0, 100) > (entry.getValue().has("chance") ? entry.getValue().getDouble("chance") : 100)) {
continue;
}
entry.getKey().onArrowDamage(attacker, victim, arrow, event, entry.getValue());
entry.getKey().onAnyDamage(attacker, victim, event, entry.getValue());
}
}
/**
* Called when an entity damages another entity with a trident throw.

View File

@@ -0,0 +1,84 @@
package com.willfp.reforges.reforges.util
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.integrations.antigrief.AntigriefManager
import com.willfp.eco.core.integrations.mcmmo.McmmoManager
import com.willfp.eco.util.ArrowUtils
import com.willfp.eco.util.NumberUtils
import org.bukkit.entity.Arrow
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.entity.EntityDamageByEntityEvent
class WatcherTriggers(
private val plugin: EcoPlugin
) : Listener {
@EventHandler(ignoreCancelled = true)
fun onBlockBreak(event: BlockBreakEvent) {
if (McmmoManager.isFake(event)) {
return
}
val player = event.player
val block = event.block
if (!AntigriefManager.canBreakBlock(player, block)) {
return
}
val itemStack = player.inventory.itemInMainHand
val reforge = ReforgeUtils.getReforge(itemStack) ?: return
for ((key, value) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > value.getDoubleOrNull("chance") ?: 100.0) {
continue
}
key.onBlockBreak(player, block, event, value)
}
}
@EventHandler(ignoreCancelled = true)
fun onArrowDamage(event: EntityDamageByEntityEvent) {
if (McmmoManager.isFake(event)) {
return
}
val arrow = event.damager
val victim = event.entity
if (arrow !is Arrow) {
return
}
if (victim !is LivingEntity) {
return
}
val shooter = arrow.shooter
if (shooter !is LivingEntity) {
return
}
if (shooter is Player && !AntigriefManager.canInjure(shooter, victim)) {
return
}
if (event.isCancelled) {
return
}
val bow = ArrowUtils.getBow(arrow) ?: return
val reforge = ReforgeUtils.getReforge(bow) ?: return
for ((effect, config) in reforge.effects) {
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)
}
}
}

View File

@@ -0,0 +1,16 @@
package com.willfp.reforges.util
import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.BlockPlaceEvent
class AntiPlaceListener : Listener {
@EventHandler
fun onBlockPlace(event: BlockPlaceEvent) {
if (ReforgeUtils.getReforgeStone(event.itemInHand) != null) {
event.isCancelled = true
event.setBuild(false)
}
}
}

View File

@@ -0,0 +1,30 @@
package com.willfp.reforges.util
import com.willfp.eco.core.EcoPlugin
import org.bukkit.Bukkit
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.inventory.Recipe
import org.bukkit.inventory.ShapedRecipe
class DiscoverRecipeListener(
private val plugin: EcoPlugin
) : Listener {
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
val player = event.player
if (plugin.configYml.getBool("discover-recipes")) {
Bukkit.getServer().recipeIterator().forEachRemaining { recipe: Recipe ->
if (recipe is ShapedRecipe) {
val key = recipe.key
if (key.namespace == "reforges") {
if (!key.key.contains("displayed")) {
player.discoverRecipe(key)
}
}
}
}
}
}
}

View File

@@ -10,6 +10,8 @@ depend:
- ProtocolLib
softdepend:
- Vault
libraries:
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'
commands:
reforges: