master
loganb1max 2019-06-28 16:48:08 +07:00
parent e6961b3c0e
commit 356a75634b
15 changed files with 550 additions and 22 deletions

@ -19,16 +19,19 @@ repositories {
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
maven { url 'https://oss.sonatype.org/content/groups/public/' }
maven { url 'https://jitpack.io' }
maven { url 'https://ci.ender.zone/plugin/repository/everything/' }
maven { url 'https://papermc.io/repo/repository/maven-public/' }
}
dependencies {
compileOnly(files('libs/paper-server-1.8.8-R0.1.jar'))
compile('org.projectlombok:lombok:1.16.20')
annotationProcessor ('org.projectlombok:lombok:1.16.20')
compileOnly ('com.github.MilkBowl:VaultAPI:1.7') {
annotationProcessor('org.projectlombok:lombok:1.16.20')
compileOnly('com.github.MilkBowl:VaultAPI:1.7') {
exclude group: 'org.bukkit'
exclude group: 'org.spigot'
}
compileOnly('net.ess3:EssentialsX:2.17.0')
}
clean {

@ -1,5 +1,6 @@
package me.loganb1max.minionsplus;
import com.earth2me.essentials.Essentials;
import lombok.Getter;
import me.loganb1max.minionsplus.command.MinionCommand;
import me.loganb1max.minionsplus.manager.LinkingManager;
@ -15,6 +16,7 @@ public class MinionsPlus extends JavaPlugin {
@Getter private static MinionsPlus instance;
@Getter private static Economy econ;
@Getter private static Essentials essentials;
@Getter private MinionManager minionManager;
@Getter private LinkingManager linkingManager;
private MinionCommand minionCommand;
@ -24,6 +26,7 @@ public class MinionsPlus extends JavaPlugin {
instance = this;
saveDefaultConfig();
setupEconomy();
essentials = getPlugin(Essentials.class);
this.minionManager = new MinionManager(this);
this.linkingManager = new LinkingManager(this);
this.minionCommand = new MinionCommand();

@ -3,9 +3,7 @@ package me.loganb1max.minionsplus.command;
import com.google.common.collect.ImmutableList;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.model.minions.FarmerMinion;
import me.loganb1max.minionsplus.model.minions.FisherMinion;
import me.loganb1max.minionsplus.model.minions.MinerMinion;
import me.loganb1max.minionsplus.model.minions.*;
import me.loganb1max.minionsplus.util.ItemUtil;
import me.loganb1max.minionsplus.util.Text;
import org.bukkit.Bukkit;
@ -67,6 +65,18 @@ public class MinionCommand implements CommandExecutor, TabCompleter {
case "fisher":
minion = new FisherMinion(target.getUniqueId(), target.getName());
break;
case "seller":
minion = new SellerMinion(target.getUniqueId(), target.getName());
break;
case "butcher":
minion = new ButcherMinion(target.getUniqueId(), target.getName());
break;
case "collector":
minion = new CollectorMinion(target.getUniqueId(), target.getName());
break;
case "breeder":
minion = new BreederMinion(target.getUniqueId(), target.getName());
break;
}
if (minion == null) {
@ -100,7 +110,11 @@ public class MinionCommand implements CommandExecutor, TabCompleter {
toReturn = ImmutableList.of(
"miner",
"farmer",
"fisher"
"fisher",
"seller",
"butcher",
"collector",
"breeder"
);
break;
}

@ -5,19 +5,24 @@ import lombok.Getter;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.menu.MinionMenu;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.model.minions.ButcherMinion;
import me.loganb1max.minionsplus.model.minions.MinerMinion;
import me.loganb1max.minionsplus.util.ItemUtil;
import me.loganb1max.minionsplus.util.Text;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerArmorStandManipulateEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitTask;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@ -25,15 +30,14 @@ import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.*;
public class MinionManager implements Listener {
private final MinionsPlus plugin;
private final BukkitTask animationTask;
private final BukkitTask tickTask;
@Getter private final Map<LivingEntity, ButcherMinion> butcherKillMap = new HashMap<>();
@Getter private Set<Minion> minions = new HashSet<>();
@ -132,4 +136,20 @@ public class MinionManager implements Listener {
ItemUtil.consumeItem(e.getPlayer().getInventory(), 1, e.getItem());
}
@EventHandler
public void onLivingEntityDeath(final EntityDeathEvent e) {
if (!this.butcherKillMap.containsKey(e.getEntity())) return;
final ButcherMinion minion = this.butcherKillMap.remove(e.getEntity());
final List<ItemStack> drops = e.getDrops();
minion.getLinkedBlocks().stream().filter(b -> b.getState() instanceof InventoryHolder).forEachOrdered(b -> {
InventoryHolder inv = (InventoryHolder) b.getState();
final Collection<ItemStack> remaining = inv.getInventory().addItem(drops.toArray(new ItemStack[] {})).values();
drops.clear();
drops.addAll(remaining);
});
if (!drops.isEmpty()) {
drops.forEach(item -> minion.getLocation().getWorld().dropItemNaturally(minion.getLocation(), item));
}
}
}

@ -7,9 +7,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.minions.FarmerMinion;
import me.loganb1max.minionsplus.model.minions.FisherMinion;
import me.loganb1max.minionsplus.model.minions.MinerMinion;
import me.loganb1max.minionsplus.model.minions.*;
import me.loganb1max.minionsplus.util.*;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -20,7 +18,6 @@ import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.text.DecimalFormat;
import java.util.*;
@ -238,6 +235,18 @@ public abstract class Minion {
case "Fisher":
toReturn = new FisherMinion(owner, ownerName, location, energy, level, linkedBlocks);
break;
case "Seller":
toReturn = new SellerMinion(owner, ownerName, location, energy, level, linkedBlocks);
break;
case "Butcher":
toReturn = new ButcherMinion(owner, ownerName, location, energy, level, linkedBlocks);
break;
case "Collector":
toReturn = new CollectorMinion(owner, ownerName, location, energy, level, linkedBlocks);
break;
case "Breeder":
toReturn = new BreederMinion(owner, ownerName, location, energy, level, linkedBlocks);
break;
}
return toReturn;
}
@ -265,6 +274,18 @@ public abstract class Minion {
case "Fisher":
toReturn = new FisherMinion(owner, ownerName, location, energy, level, new HashSet<>());
break;
case "Seller":
toReturn = new SellerMinion(owner, ownerName, location, energy, level, new HashSet<>());
break;
case "Butcher":
toReturn = new ButcherMinion(owner, ownerName, location, energy, level, new HashSet<>());
break;
case "Collector":
toReturn = new CollectorMinion(owner, ownerName, location, energy, level, new HashSet<>());
break;
case "Breeder":
toReturn = new BreederMinion(owner, ownerName, location, energy, level, new HashSet<>());
break;
}
return toReturn;
}

@ -0,0 +1,64 @@
package me.loganb1max.minionsplus.model.minions;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.util.Replacer;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
import java.text.DecimalFormat;
import java.util.Set;
import java.util.UUID;
public class BreederMinion extends Minion {
public BreederMinion(final UUID owner, final String ownerName) {
super(
MinionsPlus.getInstance().getConfig().getConfigurationSection("Breeder"),
owner,
ownerName
);
}
public BreederMinion(final UUID owner, final String ownerName, final Location location, final double energy, final int level, final Set<Block> linkedBlocks) {
this(owner, ownerName);
setLocation(location);
setEnergy(energy);
setLevel(level);
setLinkedBlocks(linkedBlocks);
findStand();
}
public int getRadius(final int level) {
return getSection().getInt("Levels." + level + ".Radius", 1);
}
@Override
public void tick() {
if (getEnergy() < getEnergyPerUse(getLevel())) return;
final int radius = getRadius(getLevel());
boolean useEnergy = false;
for (Entity e : getStand().getNearbyEntities(radius, radius, radius)) {
if (!(e instanceof Animals)) continue;
final Animals a = (Animals) e;
if (!a.canBreed()) return;
if (!a.isAdult()) return;
a.setBreed(false);
final Animals a2 = (Animals) getLocation().getWorld().spawnEntity(a.getLocation(), a.getType());
a2.setBaby();
useEnergy = true;
}
if (useEnergy) consumeEnergy(getEnergyPerUse(getLevel()));
}
@Override
public Replacer getReplacer() {
final DecimalFormat format = new DecimalFormat("#.#");
return Replacer.create()
.add("%level%", String.valueOf(getLevel()))
.add("%energy%", format.format(getEnergy()))
.add("%owner%", getOwnerName())
.add("%radius%", String.valueOf(getRadius(getLevel())));
}
}

@ -0,0 +1,63 @@
package me.loganb1max.minionsplus.model.minions;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.util.Replacer;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.text.DecimalFormat;
import java.util.*;
public class ButcherMinion extends Minion {
public ButcherMinion(final UUID owner, final String ownerName) {
super(
MinionsPlus.getInstance().getConfig().getConfigurationSection("Butcher"),
owner,
ownerName
);
}
public ButcherMinion(final UUID owner, final String ownerName, final Location location, final double energy, final int level, final Set<Block> linkedBlocks) {
this(owner, ownerName);
setLocation(location);
setEnergy(energy);
setLevel(level);
setLinkedBlocks(linkedBlocks);
findStand();
}
public int getRadius(final int level) {
return getSection().getInt("Levels." + level + ".Radius", 1);
}
@Override
public void tick() {
if (getEnergy() < getEnergyPerUse(getLevel())) return;
final int radius = getRadius(getLevel());
boolean useEnergy = false;
for (Entity e : getStand().getNearbyEntities(radius, radius, radius)) {
if (!(e instanceof LivingEntity)) continue;
if (e instanceof Player) continue;
LivingEntity le = (LivingEntity) e;
MinionsPlus.getInstance().getMinionManager().getButcherKillMap().put(le, this);
le.damage(Integer.MAX_VALUE);
useEnergy = true;
}
if (useEnergy) consumeEnergy(getEnergyPerUse(getLevel()));
}
@Override
public Replacer getReplacer() {
final DecimalFormat format = new DecimalFormat("#.#");
return Replacer.create()
.add("%level%", String.valueOf(getLevel()))
.add("%energy%", format.format(getEnergy()))
.add("%owner%", getOwnerName())
.add("%radius%", String.valueOf(getRadius(getLevel())));
}
}

@ -0,0 +1,78 @@
package me.loganb1max.minionsplus.model.minions;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.util.Replacer;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import java.text.DecimalFormat;
import java.util.*;
public class CollectorMinion extends Minion {
public CollectorMinion(final UUID owner, final String ownerName) {
super(
MinionsPlus.getInstance().getConfig().getConfigurationSection("Collector"),
owner,
ownerName
);
}
public CollectorMinion(final UUID owner, final String ownerName, final Location location, final double energy, final int level, final Set<Block> linkedBlocks) {
this(owner, ownerName);
setLocation(location);
setEnergy(energy);
setLevel(level);
setLinkedBlocks(linkedBlocks);
findStand();
}
public int getRadius(final int level) {
return getSection().getInt("Levels." + level + ".Radius", 1);
}
@Override
public void tick() {
if (getEnergy() < getEnergyPerUse(getLevel())) return;
final int radius = getRadius(getLevel());
boolean useEnergy = false;
for (Entity e : getStand().getNearbyEntities(radius, radius, radius)) {
if (!(e instanceof Item)) continue;
if (e.hasMetadata("minionignore")) continue;
final Item item = (Item) e;
final List<ItemStack> drops = new ArrayList<>();
drops.add(item.getItemStack());
item.remove();
getLinkedBlocks().stream().filter(b -> b.getState() instanceof InventoryHolder).forEachOrdered(b -> {
InventoryHolder inv = (InventoryHolder) b.getState();
final Collection<ItemStack> remaining = inv.getInventory().addItem(drops.toArray(new ItemStack[] {})).values();
drops.clear();
drops.addAll(remaining);
});
if (!drops.isEmpty()) {
drops.forEach(i -> {
Item it = getLocation().getWorld().dropItemNaturally(getLocation(), i);
it.setMetadata("minionignore", new FixedMetadataValue(MinionsPlus.getInstance(), true));
});
}
useEnergy = true;
}
if (useEnergy) consumeEnergy(getEnergyPerUse(getLevel()));
}
@Override
public Replacer getReplacer() {
final DecimalFormat format = new DecimalFormat("#.#");
return Replacer.create()
.add("%level%", String.valueOf(getLevel()))
.add("%energy%", format.format(getEnergy()))
.add("%owner%", getOwnerName())
.add("%radius%", String.valueOf(getRadius(getLevel())));
}
}

@ -4,15 +4,12 @@ import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.util.ItemBuilder;
import me.loganb1max.minionsplus.util.Replacer;
import org.bukkit.CropState;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Crops;
import java.text.DecimalFormat;
import java.util.*;

@ -9,7 +9,6 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

@ -9,7 +9,6 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import java.text.DecimalFormat;
import java.util.*;

@ -0,0 +1,75 @@
package me.loganb1max.minionsplus.model.minions;
import me.loganb1max.minionsplus.MinionsPlus;
import me.loganb1max.minionsplus.model.Minion;
import me.loganb1max.minionsplus.util.Replacer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Chest;
import org.bukkit.inventory.ItemStack;
import java.text.DecimalFormat;
import java.util.Set;
import java.util.UUID;
public class SellerMinion extends Minion {
public SellerMinion(final UUID owner, final String ownerName) {
super(
MinionsPlus.getInstance().getConfig().getConfigurationSection("Seller"),
owner,
ownerName
);
}
public SellerMinion(final UUID owner, final String ownerName, final Location location, final double energy, final int level, final Set<Block> linkedBlocks) {
this(owner, ownerName);
setLocation(location);
setEnergy(energy);
setLevel(level);
setLinkedBlocks(linkedBlocks);
findStand();
}
public int getRadius(final int level) {
return getSection().getInt("Levels." + level + ".Radius", 1);
}
@Override
public void tick() {
if (getEnergy() < getEnergyPerUse(getLevel())) return;
final int radius = getRadius(getLevel());
boolean sold = false;
for (int y = getLocation().getBlockY() - radius; y < getLocation().getBlockY() + radius; y++) {
for (int x = getLocation().getBlockX() - radius; x < getLocation().getBlockX() + radius; x++) {
for (int z = getLocation().getBlockZ() - radius; z < getLocation().getBlockZ() + radius; z++) {
final Block b = getLocation().getWorld().getBlockAt(x, y, z);
if (b.getType() != Material.CHEST && b.getType() != Material.TRAPPED_CHEST) continue;
final Chest chest = (Chest) b.getState();
for (int i = 0; i < chest.getInventory().getSize(); i++) {
final ItemStack item = chest.getInventory().getItem(i);
if (item == null || item.getType() == Material.AIR) continue;
double sellPrice = MinionsPlus.getEssentials().getWorth().getPrice(MinionsPlus.getEssentials(), item).doubleValue();
if (sellPrice <= 0) continue;
MinionsPlus.getEcon().depositPlayer(Bukkit.getOfflinePlayer(getOwner()), sellPrice * item.getAmount());
chest.getInventory().setItem(i, new ItemStack(Material.AIR));
sold = true;
}
}
}
}
if (sold) consumeEnergy(getEnergyPerUse(getLevel()));
}
@Override
public Replacer getReplacer() {
final DecimalFormat format = new DecimalFormat("#.#");
return Replacer.create()
.add("%level%", String.valueOf(getLevel()))
.add("%energy%", format.format(getEnergy()))
.add("%owner%", getOwnerName())
.add("%radius%", String.valueOf(getRadius(getLevel())));
}
}

@ -20,14 +20,14 @@ public class Replacer {
public String replace(String string) {
for (Map.Entry<String, String> entry : this.replaceMap.entrySet()) {
string = string.replaceAll(entry.getKey(), entry.getValue());
string = string.replace(entry.getKey(), entry.getValue());
}
return string;
}
public List<String> replace(List<String> strings) {
for (Map.Entry<String, String> entry : this.replaceMap.entrySet()) {
strings = strings.stream().map(s -> s.replaceAll(entry.getKey(), entry.getValue())).collect(Collectors.toList());
strings = strings.stream().map(s -> s.replace(entry.getKey(), entry.getValue())).collect(Collectors.toList());
}
return strings;
}

@ -166,4 +166,196 @@ Fisher:
Price: 1000.0
EnergyPerAction: 0.3
Radius: 5
ChancePerBlockPerSecond: 50.0
ChancePerBlockPerSecond: 50.0
Seller:
Name: "Seller Minion"
Item:
Material: SKULL_ITEM
Durability: 3
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2EwN2EyODg5ZjJiOGJiZmNjYWIyNjI2YTUxMmI0ZjA0OTAwOGQ2ZDFjY2ZhYmNmYzI0ZTQ4ZjNmNjIyNDM1MSJ9fX0=
DisplayName: "&6Seller Minion"
Lore:
- ""
- "&7Level: %level%"
- "&7Energy: %energy%"
- "&7Owner: %owner%"
Equipment:
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2EwN2EyODg5ZjJiOGJiZmNjYWIyNjI2YTUxMmI0ZjA0OTAwOGQ2ZDFjY2ZhYmNmYzI0ZTQ4ZjNmNjIyNDM1MSJ9fX0=
Chestplate:
Material: LEATHER_CHESTPLATE
Durability: 0
Color:
Red: 255
Green: 255
Blue: 255
Leggings:
Material: LEATHER_LEGGINGS
Durability: 0
Color:
Red: 255
Green: 255
Blue: 255
Boots:
Material: LEATHER_BOOTS
Durability: 0
Color:
Red: 255
Green: 255
Blue: 255
RightHand:
Material: BOOK
Durability: 0
Levels:
'1':
Price: 0.0
EnergyPerAction: 0.5
Radius: 3
'2':
Price: 1000.0
EnergyPerAction: 0.3
Radius: 5
Butcher:
Name: "Butcher Minion"
Item:
Material: SKULL_ITEM
Durability: 3
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWNkN2E5ODMxYTcwOTBmOWQ2ZGRhMzVhYmQ2YmZmYmJiZDM0YTZkM2Q5N2VmMTFkOGE2YjFhOTQ2Y2MyNmY1ZiJ9fX0====
DisplayName: "&6Butcher Minion"
Lore:
- ""
- "&7Level: %level%"
- "&7Energy: %energy%"
- "&7Owner: %owner%"
Equipment:
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWNkN2E5ODMxYTcwOTBmOWQ2ZGRhMzVhYmQ2YmZmYmJiZDM0YTZkM2Q5N2VmMTFkOGE2YjFhOTQ2Y2MyNmY1ZiJ9fX0====
Chestplate:
Material: LEATHER_CHESTPLATE
Durability: 0
Color:
Red: 255
Green: 0
Blue: 0
Leggings:
Material: LEATHER_LEGGINGS
Durability: 0
Color:
Red: 255
Green: 0
Blue: 0
Boots:
Material: LEATHER_BOOTS
Durability: 0
Color:
Red: 255
Green: 0
Blue: 0
RightHand:
Material: DIAMOND_SWORD
Durability: 0
Levels:
'1':
Price: 0.0
EnergyPerAction: 0.5
Radius: 3
'2':
Price: 1000.0
EnergyPerAction: 0.3
Radius: 5
Collector:
Name: "Collector Minion"
Item:
Material: SKULL_ITEM
Durability: 3
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhkYTE0NjI1NzU0Nzc5NWMzYTk1NGRiNzgxZTBkMGM0ZDBhZjAyN2YwZDE1MWQzOWE0OWUxYmJkMjFjZmM4OCJ9fX0===
DisplayName: "&6Collector Minion"
Lore:
- ""
- "&7Level: %level%"
- "&7Energy: %energy%"
- "&7Owner: %owner%"
Equipment:
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhkYTE0NjI1NzU0Nzc5NWMzYTk1NGRiNzgxZTBkMGM0ZDBhZjAyN2YwZDE1MWQzOWE0OWUxYmJkMjFjZmM4OCJ9fX0===
Chestplate:
Material: LEATHER_CHESTPLATE
Durability: 0
Color:
Red: 0
Green: 255
Blue: 0
Leggings:
Material: LEATHER_LEGGINGS
Durability: 0
Color:
Red: 0
Green: 255
Blue: 0
Boots:
Material: LEATHER_BOOTS
Durability: 0
Color:
Red: 0
Green: 255
Blue: 0
RightHand:
Material: DIAMOND_SWORD
Durability: 0
Levels:
'1':
Price: 0.0
EnergyPerAction: 0.5
Radius: 3
'2':
Price: 1000.0
EnergyPerAction: 0.3
Radius: 5
Breeder:
Name: "Breeder Minion"
Item:
Material: SKULL_ITEM
Durability: 3
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmNiYzEzNmY1YWRjZmJiYTdlMjVmMzE4MjE3Y2VkMzFhNTI0YzVjMjE4NWJmNWE2ZjNlYmE3YmViNWQ4YTcwNiJ9fX0====
DisplayName: "&6Breeder Minion"
Lore:
- ""
- "&7Level: %level%"
- "&7Energy: %energy%"
- "&7Owner: %owner%"
Equipment:
Skull: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmNiYzEzNmY1YWRjZmJiYTdlMjVmMzE4MjE3Y2VkMzFhNTI0YzVjMjE4NWJmNWE2ZjNlYmE3YmViNWQ4YTcwNiJ9fX0====
Chestplate:
Material: LEATHER_CHESTPLATE
Durability: 0
Color:
Red: 0
Green: 255
Blue: 255
Leggings:
Material: LEATHER_LEGGINGS
Durability: 0
Color:
Red: 0
Green: 255
Blue: 255
Boots:
Material: LEATHER_BOOTS
Durability: 0
Color:
Red: 0
Green: 255
Blue: 255
RightHand:
Material: WHEAT
Durability: 0
Levels:
'1':
Price: 0.0
EnergyPerAction: 0.5
Radius: 3
'2':
Price: 1000.0
EnergyPerAction: 0.3
Radius: 5

@ -4,7 +4,7 @@ version: 1.0-SNAPSHOT
description: Minions Plugin for Skyblock Servers
author: loganb1max
load: POSTWORLD
depend: [Vault]
depend: [Vault, Essentials]
commands:
minions:
aliases: [minion]