9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-20 15:39:30 +00:00

Finished triggers migration and lots of internal changes

This commit is contained in:
Auxilor
2021-09-29 19:31:32 +01:00
parent dd4c49e2d3
commit a2b929b1cc
13 changed files with 136 additions and 424 deletions

View File

@@ -29,6 +29,7 @@ allprojects {
mavenCentral() mavenCentral()
maven { url 'https://jitpack.io' } maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://papermc.io/repo/repository/maven-public/' }
maven { url 'https://repo.codemc.org/repository/nms/' } maven { url 'https://repo.codemc.org/repository/nms/' }
} }

View File

@@ -1,11 +0,0 @@
group 'com.willfp'
version rootProject.version
repositories {
maven { url 'https://papermc.io/repo/repository/maven-public/' }
}
dependencies {
compileOnly project(":eco-core:core-plugin")
compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT'
}

View File

@@ -1,10 +0,0 @@
package com.willfp.reforges.paper;
import com.willfp.reforges.ReforgesPlugin;
public class PaperLoader {
static {
ReforgesPlugin plugin = ReforgesPlugin.getInstance();
plugin.setPaperHandler(new EcoPaperHandler(plugin));
}
}

View File

@@ -1,19 +0,0 @@
package com.willfp.reforges.paper
import com.willfp.reforges.ReforgesPlugin
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
import org.bukkit.inventory.ItemStack
class EcoPaperHandler(
private val plugin: ReforgesPlugin
) : PaperHandler {
private val serializer = LegacyComponentSerializer.builder()
.hexColors()
.useUnusualXRepeatedCharacterHexFormat()
.character('§')
.build()
override fun getDisplayName(itemStack: ItemStack): String {
return serializer.serialize(itemStack.displayName())
}
}

View File

@@ -2,6 +2,6 @@ group 'com.willfp'
version rootProject.version version rootProject.version
dependencies { dependencies {
compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.github.MilkBowl:VaultAPI:1.7' compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.reforges; package com.willfp.reforges;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.Prerequisite;
import com.willfp.eco.core.command.impl.PluginCommand; import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.display.DisplayModule; import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.items.Items; import com.willfp.eco.core.items.Items;
@@ -12,7 +11,6 @@ import com.willfp.reforges.config.TargetYml;
import com.willfp.reforges.display.ReforgesDisplay; import com.willfp.reforges.display.ReforgesDisplay;
import com.willfp.reforges.effects.Effect; import com.willfp.reforges.effects.Effect;
import com.willfp.reforges.effects.Effects; import com.willfp.reforges.effects.Effects;
import com.willfp.reforges.paper.PaperHandler;
import com.willfp.reforges.reforges.Reforges; import com.willfp.reforges.reforges.Reforges;
import com.willfp.reforges.reforges.util.ReforgeArgParser; import com.willfp.reforges.reforges.util.ReforgeArgParser;
import com.willfp.reforges.reforges.util.WatcherTriggers; import com.willfp.reforges.reforges.util.WatcherTriggers;
@@ -20,7 +18,6 @@ import com.willfp.reforges.util.AntiPlaceListener;
import com.willfp.reforges.util.DiscoverRecipeListener; import com.willfp.reforges.util.DiscoverRecipeListener;
import com.willfp.reforges.vault.EconomyHandler; import com.willfp.reforges.vault.EconomyHandler;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -47,13 +44,6 @@ public class ReforgesPlugin extends EcoPlugin {
@Getter @Getter
private final ReforgesJson reforgesJson; private final ReforgesJson reforgesJson;
/**
* Paper handler.
*/
@Getter
@Setter
private PaperHandler paperHandler;
/** /**
* Internal constructor called by bukkit on plugin load. * Internal constructor called by bukkit on plugin load.
*/ */
@@ -62,17 +52,6 @@ public class ReforgesPlugin extends EcoPlugin {
this.targetYml = new TargetYml(this); this.targetYml = new TargetYml(this);
this.reforgesJson = new ReforgesJson(this); this.reforgesJson = new ReforgesJson(this);
instance = this; instance = this;
/*
I still use the spigot api for most things and don't want to suppress deprecation warnings
every 2 seconds, so I'm moving all paper related things off to their own module.
*/
if (Prerequisite.HAS_PAPER.isMet()) {
try {
Class.forName("com.willfp.reforges.paper.PaperLoader");
} catch (ClassNotFoundException ignored) {
}
}
} }
@Override @Override

View File

@@ -11,7 +11,6 @@ import org.bukkit.entity.Trident;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
@@ -112,21 +111,6 @@ public interface Watcher {
// Empty default as effects only override required watchers. // Empty default as effects only override required watchers.
} }
/**
* Called when an entity shoots a bow.
*
* @param shooter The entity that shot the bow.
* @param arrow The arrow that was shot.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onBowShoot(@NotNull final LivingEntity shooter,
@NotNull final Arrow arrow,
@NotNull final EntityShootBowEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/** /**
* Called when an entity shoots a projectile. * Called when an entity shoots a projectile.
* *
@@ -156,15 +140,15 @@ public interface Watcher {
} }
/** /**
* Called when an arrow hits a block or entity. * Called when a projectile hits a block or entity.
* *
* @param shooter The entity that shot the arrow. * @param shooter The entity that shot the arrow.
* @param event The event that called this watcher. * @param event The event that called this watcher.
* @param config The effect config. * @param config The effect config.
*/ */
default void onArrowHit(@NotNull final LivingEntity shooter, default void onProjectileHit(@NotNull final LivingEntity shooter,
@NotNull final ProjectileHitEvent event, @NotNull final ProjectileHitEvent event,
@NotNull final JSONConfig config) { @NotNull final JSONConfig config) {
// Empty default as effects only override required watchers. // Empty default as effects only override required watchers.
} }
@@ -183,19 +167,6 @@ public interface Watcher {
// Empty default as effects only override required watchers. // Empty default as effects only override required watchers.
} }
/**
* Called when a trident hits a block or entity.
*
* @param shooter The entity that threw the trident.
* @param event The event that called this watcher.
* @param config The effect config.
*/
default void onTridentHit(@NotNull final LivingEntity shooter,
@NotNull final ProjectileHitEvent event,
@NotNull final JSONConfig config) {
// Empty default as effects only override required watchers.
}
/** /**
* Called when an entity takes damage wearing armor. * Called when an entity takes damage wearing armor.
* *

View File

@@ -1,11 +1,13 @@
package com.willfp.reforges.display package com.willfp.reforges.display
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayModule import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.display.DisplayPriority import com.willfp.eco.core.display.DisplayPriority
import com.willfp.eco.core.fast.FastItemStack import com.willfp.eco.core.fast.FastItemStack
import com.willfp.eco.util.SkullUtils import com.willfp.eco.util.SkullUtils
import com.willfp.reforges.ReforgesPlugin import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.paper.toBukkit
import com.willfp.reforges.reforges.meta.ReforgeTarget import com.willfp.reforges.reforges.meta.ReforgeTarget
import com.willfp.reforges.reforges.util.ReforgeUtils import com.willfp.reforges.reforges.util.ReforgeUtils
import org.bukkit.ChatColor import org.bukkit.ChatColor
@@ -14,6 +16,7 @@ import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta import org.bukkit.inventory.meta.SkullMeta
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
@Suppress("DEPRECATION")
class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) { class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST) {
override fun display( override fun display(
itemStack: ItemStack, itemStack: ItemStack,
@@ -67,14 +70,16 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
lore.addAll(addLore) lore.addAll(addLore)
} }
if (plugin.configYml.getBool("reforge.display-in-name")) { if (plugin.configYml.getBool("reforge.display-in-name")) {
val displayName = plugin.paperHandler.getDisplayName(itemStack) if (Prerequisite.HAS_PAPER.isMet) {
val newName = "${reforge.name} ${ChatColor.RESET}${displayName}" val displayName = itemStack.displayName().toBukkit()
meta.setDisplayName(newName) val newName = "${reforge.name} ${ChatColor.RESET}${displayName}"
meta.persistentDataContainer.set( meta.setDisplayName(newName)
plugin.namespacedKeyFactory.create("shadowed_name"), meta.persistentDataContainer.set(
PersistentDataType.STRING, plugin.namespacedKeyFactory.create("shadowed_name"),
displayName PersistentDataType.STRING,
) displayName
)
}
} }
} }
itemStack.itemMeta = meta itemStack.itemMeta = meta
@@ -86,7 +91,6 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
return return
} }
val target = ReforgeTarget.getForItem(itemStack) val target = ReforgeTarget.getForItem(itemStack)
if (target == null && itemStack.type != Material.PLAYER_HEAD) { if (target == null && itemStack.type != Material.PLAYER_HEAD) {

View File

@@ -0,0 +1,18 @@
package com.willfp.reforges.paper
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
private val serializer = LegacyComponentSerializer.builder()
.hexColors()
.useUnusualXRepeatedCharacterHexFormat()
.character('§')
.build()
fun String.toComponent(): Component {
return serializer.deserialize(this)
}
fun Component.toBukkit(): String {
return serializer.serialize(this)
}

View File

@@ -1,7 +0,0 @@
package com.willfp.reforges.paper
import org.bukkit.inventory.ItemStack
interface PaperHandler {
fun getDisplayName(itemStack: ItemStack): String
}

View File

@@ -1,303 +0,0 @@
package com.willfp.reforges.reforges.util;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.events.EntityDeathByEntityEvent;
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.ArrowUtils;
import com.willfp.eco.util.NumberUtils;
import com.willfp.reforges.reforges.Reforge;
import org.bukkit.block.Block;
import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Trident;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class WatcherTriggers extends PluginDependent<EcoPlugin> implements Listener {
/**
* Create new listener for watcher events.
*
* @param plugin The plugin to link the events to.
*/
public WatcherTriggers(@NotNull final EcoPlugin plugin) {
super(plugin);
}
/**
* Called when an entity launches a projectile.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onProjectileLaunch(@NotNull final ProjectileLaunchEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getEntity() instanceof AbstractArrow)) {
return;
}
if (!(event.getEntity().getShooter() instanceof Player)) {
return;
}
LivingEntity shooter = (LivingEntity) event.getEntity().getShooter();
Projectile projectile = event.getEntity();
if (shooter.getEquipment() == null) {
return;
}
ItemStack item = shooter.getEquipment().getItemInMainHand();
if (projectile instanceof Trident trident) {
item = trident.getItem();
}
Reforge reforge = ReforgeUtils.getReforge(item);
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().onProjectileLaunch(shooter, projectile, event, entry.getValue());
}
}
/**
* Called when an entity takes fall damage.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onFallDamage(@NotNull final EntityDamageEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!event.getCause().equals(EntityDamageEvent.DamageCause.FALL)) {
return;
}
if (!(event.getEntity() instanceof LivingEntity victim)) {
return;
}
EntityEquipment entityEquipment = victim.getEquipment();
if (entityEquipment == null) {
return;
}
for (ItemStack itemStack : entityEquipment.getArmorContents()) {
if (itemStack == null) {
continue;
}
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
continue;
}
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().onFallDamage(victim, event, entry.getValue());
}
}
}
/**
* Called when an arrow hits a block or entity.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onArrowHit(@NotNull final ProjectileHitEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getEntity().getShooter() instanceof LivingEntity shooter)) {
return;
}
if (!(event.getEntity() instanceof Arrow arrow)) {
return;
}
if (event.getEntity().getShooter() == null) {
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().onArrowHit(shooter, event, entry.getValue());
}
}
/**
* Called when a trident hits a block or entity.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onTridentHit(@NotNull final ProjectileHitEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getEntity().getShooter() instanceof LivingEntity shooter)) {
return;
}
if (event.getEntity().getShooter() == null) {
return;
}
if (!(event.getEntity() instanceof Trident trident)) {
return;
}
ItemStack item = trident.getItem();
Reforge reforge = ReforgeUtils.getReforge(item);
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().onTridentHit(shooter, event, entry.getValue());
}
}
/**
* Called when an entity takes damage wearing armor.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onDamageWearingArmor(@NotNull final EntityDamageEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getEntity() instanceof LivingEntity victim)) {
return;
}
EntityEquipment entityEquipment = victim.getEquipment();
if (entityEquipment == null) {
return;
}
for (ItemStack itemStack : entityEquipment.getArmorContents()) {
if (itemStack == null) {
continue;
}
Reforge reforge = ReforgeUtils.getReforge(itemStack);
if (reforge == null) {
continue;
}
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().onDamageWearingArmor(victim, event, entry.getValue());
}
}
}
/**
* Called when an entity throws a trident.
*
* @param event The event to listen for.
*/
@EventHandler(ignoreCancelled = true)
public void onTridentLaunch(@NotNull final ProjectileLaunchEvent event) {
if (McmmoManager.isFake(event)) {
return;
}
if (!(event.getEntity() instanceof Trident trident)) {
return;
}
if (!(event.getEntity().getShooter() instanceof LivingEntity)) {
return;
}
LivingEntity shooter = (LivingEntity) trident.getShooter();
ItemStack item = trident.getItem();
if (shooter == null) {
return;
}
Reforge reforge = ReforgeUtils.getReforge(item);
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().onTridentLaunch(shooter, trident, event, entry.getValue());
}
}
}

View File

@@ -13,7 +13,8 @@ import org.bukkit.event.Listener
import org.bukkit.event.block.BlockBreakEvent import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.entity.EntityDamageEvent import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.entity.EntityShootBowEvent import org.bukkit.event.entity.ProjectileHitEvent
import org.bukkit.event.entity.ProjectileLaunchEvent
class WatcherTriggers( class WatcherTriggers(
private val plugin: EcoPlugin private val plugin: EcoPlugin
@@ -228,28 +229,117 @@ class WatcherTriggers(
} }
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
fun onBowShoot(event: EntityShootBowEvent) { fun onProjectileLaunch(event: ProjectileLaunchEvent) {
if (McmmoManager.isFake(event)) { if (McmmoManager.isFake(event)) {
return return
} }
if (event.projectile.type != EntityType.ARROW) {
val shooter = event.entity.shooter
if (shooter !is LivingEntity) {
return return
} }
val shooter = event.entity val equipment = shooter.equipment ?: return
val arrow = event.projectile as Arrow var item = equipment.itemInMainHand
val bow = ArrowUtils.getBow(arrow) ?: return if (event.entity is Trident) {
item = (event.entity as Trident).item
}
val reforge = ReforgeUtils.getReforge(bow) ?: return val reforge = ReforgeUtils.getReforge(item) ?: return
for ((effect, config) in reforge.effects) { 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 continue
} }
effect.onBowShoot(shooter, arrow, event, config) effect.onProjectileLaunch(shooter, event.entity, event, config)
} }
} }
@EventHandler(ignoreCancelled = true)
fun onFallDamage(event: EntityDamageEvent) {
if (McmmoManager.isFake(event)) {
return
}
if (event.cause != EntityDamageEvent.DamageCause.FALL) {
return
}
val victim = event.entity
if (victim !is LivingEntity) {
return
}
val equipment = victim.equipment ?: return
for (itemStack in equipment.armorContents) {
val reforge = ReforgeUtils.getReforge(itemStack) ?: continue
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onFallDamage(victim, event, config)
}
}
}
@EventHandler(ignoreCancelled = true)
fun onProjectileHit(event: ProjectileHitEvent) {
if (McmmoManager.isFake(event)) {
return
}
val projectile = event.entity
val shooter = projectile.shooter
if (shooter !is LivingEntity) {
return
}
val item = when (projectile) {
is Arrow -> ArrowUtils.getBow(projectile)
is Trident -> projectile.item
else -> null
} ?: return
val reforge = ReforgeUtils.getReforge(item) ?: return
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onProjectileHit(shooter, event, config)
}
}
@EventHandler(ignoreCancelled = true)
fun onDamageWearingArmor(event: EntityDamageEvent) {
if (McmmoManager.isFake(event)) {
return
}
val victim = event.entity
if (victim !is LivingEntity) {
return
}
val equipment = victim.equipment ?: return
for (itemStack in equipment.armorContents) {
val reforge = ReforgeUtils.getReforge(itemStack) ?: continue
for ((effect, config) in reforge.effects) {
if (NumberUtils.randFloat(0.0, 100.0) > config.getDoubleOrNull("chance") ?: 100.0) {
continue
}
effect.onDamageWearingArmor(victim, event, config)
}
}
}
} }

View File

@@ -2,5 +2,4 @@ rootProject.name = 'Reforges'
// Core // Core
include ':eco-core' include ':eco-core'
include ':eco-core:core-plugin' include ':eco-core:core-plugin'
include ':eco-core:core-paper'