mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 11:45:51 +00:00
Added Enchantment Rune.
Added Enchantment Rune that applies a random enchantment on items. Works similar to Soulbound Rune.
This commit is contained in:
parent
573068283a
commit
07224cc7d5
@ -327,6 +327,7 @@ public final class SlimefunItems {
|
||||
public static final SlimefunItemStack ENDER_LUMP_2 = new SlimefunItemStack("ENDER_LUMP_2", Material.GOLD_NUGGET, "&5Ender Lump &7- &eII", "", "&c&oTier: II");
|
||||
public static final SlimefunItemStack ENDER_LUMP_3 = new SlimefunItemStack("ENDER_LUMP_3", Material.GOLD_NUGGET, "&5Ender Lump &7- &eIII", "", "&c&oTier: III");
|
||||
public static final SlimefunItemStack MAGICAL_BOOK_COVER = new SlimefunItemStack("MAGICAL_BOOK_COVER", Material.PAPER, "&6Magical Book Cover", "", "&a&oUsed for various Magic Books");
|
||||
public static final SlimefunItemStack MAGICAL_GLASS = new SlimefunItemStack("MAGICAL_GLASS", Material.GLASS_PANE, "&6Magical Glass", "", "&a&oUsed for various Magical Gadgets");
|
||||
public static final SlimefunItemStack MAGIC_PILLS = new SlimefunItemStack("MAGIC_PILLS", Material.NETHER_WART, "&cMagic Pills", "", "&a&oUsed to cure zombie villagers instantly");
|
||||
public static final SlimefunItemStack BASIC_CIRCUIT_BOARD = new SlimefunItemStack("BASIC_CIRCUIT_BOARD", Material.ACTIVATOR_RAIL, "&bBasic Circuit Board");
|
||||
public static final SlimefunItemStack ADVANCED_CIRCUIT_BOARD = new SlimefunItemStack("ADVANCED_CIRCUIT_BOARD", Material.POWERED_RAIL, "&bAdvanced Circuit Board");
|
||||
@ -599,6 +600,7 @@ public final class SlimefunItems {
|
||||
public static final SlimefunItemStack RAINBOW_RUNE = new SlimefunItemStack("ANCIENT_RUNE_RAINBOW", new ColoredFireworkStar(Color.FUCHSIA, "&7Ancient Rune &8&l[&d&lRainbow&8&l]"));
|
||||
public static final SlimefunItemStack LIGHTNING_RUNE = new SlimefunItemStack("ANCIENT_RUNE_LIGHTNING", new ColoredFireworkStar(Color.fromRGB(255, 255, 95), "&7Ancient Rune &8&l[&e&lLightning&8&l]"));
|
||||
public static final SlimefunItemStack SOULBOUND_RUNE = new SlimefunItemStack("ANCIENT_RUNE_SOULBOUND", new ColoredFireworkStar(Color.fromRGB(47, 0, 117), "&7Ancient Rune &8&l[&5&lSoulbound&8&l]", "&eDrop this rune onto a dropped item to", "&5bind ðat item to your soul.", " ", "&eIt is advised that you only use this rune", "&eon &6important &eitems.", " ", "&eItems bound to your soul won't drop on death."));
|
||||
public static final SlimefunItemStack ENCHANTMENT_RUNE = new SlimefunItemStack("ANCIENT_RUNE_ENCHANTMENT", new ColoredFireworkStar(Color.fromRGB(255, 217, 25), "&7Ancient Rune &8&l[&6&lEnchantment&8&l]", "&eDrop this rune onto a dropped item to", "&6enchant ðat item with a random enchantment."));
|
||||
|
||||
/* Electricity */
|
||||
public static final SlimefunItemStack SOLAR_GENERATOR = new SlimefunItemStack("SOLAR_GENERATOR", Material.DAYLIGHT_DETECTOR, "&bSolar Generator", "", LoreBuilder.machine(MachineTier.BASIC, MachineType.GENERATOR), LoreBuilder.powerBuffer(0), LoreBuilder.powerPerSecond(4));
|
||||
|
@ -0,0 +1,171 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.items.magical;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Item;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemDropHandler;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||
|
||||
/**
|
||||
* This {@link SlimefunItem} allows you to enchant any enchantable {@link ItemStack} with a random
|
||||
* {@link Enchantment}. It is also one of the very few utilisations of {@link ItemDropHandler}.
|
||||
*
|
||||
* @author Linox
|
||||
*
|
||||
* @see ItemDropHandler
|
||||
* @see Enchantment
|
||||
*
|
||||
*/
|
||||
public class EnchantmentRune extends SimpleSlimefunItem<ItemDropHandler> {
|
||||
|
||||
private static final double RANGE = 1.5;
|
||||
|
||||
private static final Enchantment[] helmEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.OXYGEN, Enchantment.WATER_WORKER, Enchantment.THORNS, Enchantment.PROTECTION_PROJECTILE, Enchantment.PROTECTION_FIRE, Enchantment.PROTECTION_ENVIRONMENTAL, Enchantment.PROTECTION_EXPLOSIONS};
|
||||
private static final Enchantment[] chestLeggingsEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.THORNS, Enchantment.PROTECTION_PROJECTILE, Enchantment.PROTECTION_FIRE, Enchantment.PROTECTION_ENVIRONMENTAL, Enchantment.PROTECTION_EXPLOSIONS};
|
||||
private static final Enchantment[] bootsEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.FROST_WALKER, Enchantment.PROTECTION_FALL, Enchantment.DEPTH_STRIDER, Enchantment.THORNS, Enchantment.PROTECTION_PROJECTILE, Enchantment.PROTECTION_FIRE, Enchantment.PROTECTION_ENVIRONMENTAL, Enchantment.PROTECTION_EXPLOSIONS};
|
||||
|
||||
private static final Enchantment[] swordEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.FIRE_ASPECT, Enchantment.LOOT_BONUS_MOBS, Enchantment.KNOCKBACK, Enchantment.SWEEPING_EDGE, Enchantment.DAMAGE_ALL, Enchantment.DAMAGE_ARTHROPODS, Enchantment.DAMAGE_UNDEAD};
|
||||
private static final Enchantment[] tridentEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.IMPALING, Enchantment.CHANNELING, Enchantment.LOYALTY, Enchantment.RIPTIDE};
|
||||
private static Enchantment[] crossbowEnch;
|
||||
private static final Enchantment[] bowEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.ARROW_DAMAGE, Enchantment.ARROW_FIRE, Enchantment.ARROW_INFINITE, Enchantment.ARROW_KNOCKBACK};
|
||||
|
||||
private static final Enchantment[] axeEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.DIG_SPEED, Enchantment.LOOT_BONUS_BLOCKS, Enchantment.SILK_TOUCH, Enchantment.DAMAGE_ALL, Enchantment.DAMAGE_UNDEAD, Enchantment.DAMAGE_ARTHROPODS};
|
||||
private static final Enchantment[] toolEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.DIG_SPEED, Enchantment.LOOT_BONUS_BLOCKS, Enchantment.SILK_TOUCH};
|
||||
private static final Enchantment[] shearEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.DIG_SPEED};
|
||||
private static final Enchantment[] fishRodEnch = {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.LURE, Enchantment.LUCK};
|
||||
private static final Enchantment[] otherItemsEnch = {Enchantment.MENDING, Enchantment.DURABILITY};
|
||||
|
||||
public EnchantmentRune(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preRegister() {
|
||||
if (SlimefunPlugin.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_14)) {
|
||||
crossbowEnch = new Enchantment[] {Enchantment.MENDING, Enchantment.DURABILITY, Enchantment.MULTISHOT, Enchantment.QUICK_CHARGE, Enchantment.PIERCING};
|
||||
} else {
|
||||
crossbowEnch = null;
|
||||
}
|
||||
super.preRegister();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemDropHandler getItemHandler() {
|
||||
return (e, p, item) -> {
|
||||
if (isItem(item.getItemStack())) {
|
||||
|
||||
if (!Slimefun.hasUnlocked(p, SlimefunItems.ENCHANTMENT_RUNE, true)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Slimefun.runSync(() -> activate(p, e, item), 20L);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
private void activate(Player p, PlayerDropItemEvent e, Item item) {
|
||||
// Being sure the entity is still valid and not picked up or whatsoever.
|
||||
if (!item.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Location l = item.getLocation();
|
||||
Collection<Entity> entites = l.getWorld().getNearbyEntities(l, RANGE, RANGE, RANGE, this::findCompatibleItem);
|
||||
Optional<Entity> optional = entites.stream().findFirst();
|
||||
|
||||
if (optional.isPresent()) {
|
||||
Item entity = (Item) optional.get();
|
||||
ItemStack target = entity.getItemStack();
|
||||
|
||||
Enchantment[] enchArr = findEnchArr(target.getType());
|
||||
if (enchArr.length == 0) return;
|
||||
int enchIndex = ThreadLocalRandom.current().nextInt(enchArr.length);
|
||||
Enchantment ench = enchArr[enchIndex];
|
||||
|
||||
int level = 1;
|
||||
if (ench.getMaxLevel() != 1) level = ThreadLocalRandom.current().nextInt(ench.getMaxLevel() + 1);
|
||||
|
||||
target.addEnchantment(ench, level);
|
||||
|
||||
if (target.getAmount() == 1) {
|
||||
e.setCancelled(true);
|
||||
|
||||
// This lightning is just an effect, it deals no damage.
|
||||
l.getWorld().strikeLightningEffect(l);
|
||||
|
||||
Slimefun.runSync(() -> {
|
||||
// Being sure entities are still valid and not picked up or whatsoever.
|
||||
if (item.isValid() && entity.isValid() && target.getAmount() == 1) {
|
||||
|
||||
l.getWorld().createExplosion(l, 0);
|
||||
l.getWorld().playSound(l, Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1);
|
||||
|
||||
entity.remove();
|
||||
item.remove();
|
||||
l.getWorld().dropItemNaturally(l, target);
|
||||
|
||||
SlimefunPlugin.getLocal().sendMessage(p, "messages.enchantment-rune.success", true);
|
||||
}
|
||||
}, 10L);
|
||||
}
|
||||
else {
|
||||
SlimefunPlugin.getLocal().sendMessage(p, "messages.enchantment-rune.fail", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Enchantment[] findEnchArr(Material type) {
|
||||
Enchantment[] enchArr = null;
|
||||
|
||||
if (type.name().endsWith("_HELMET")) enchArr = helmEnch;
|
||||
if (type.name().endsWith("_CHESTPLATE") || type.name().endsWith("_LEGGINGS")) enchArr = chestLeggingsEnch;
|
||||
if (type.name().endsWith("_BOOTS")) enchArr = bootsEnch;
|
||||
if (type.name().endsWith("_SWORD")) enchArr = swordEnch;
|
||||
if (type.name().endsWith("_AXE")) enchArr = axeEnch;
|
||||
if (type.name().endsWith("_PICKAXE") || type.name().endsWith("_SHOVEL") || type.name().endsWith("_HOE")) enchArr = toolEnch;
|
||||
|
||||
if (type == Material.TRIDENT) enchArr = tridentEnch;
|
||||
if (type == Material.BOW) enchArr = bowEnch;
|
||||
if (type == Material.SHEARS) enchArr = shearEnch;
|
||||
if (type == Material.FISHING_ROD) enchArr = fishRodEnch;
|
||||
if (crossbowEnch != null && type.name().equals("CROSSBOW")) enchArr = crossbowEnch;
|
||||
|
||||
if (type == Material.SHIELD || type == Material.ELYTRA || type == Material.CARROT_ON_A_STICK || type == Material.FLINT_AND_STEEL) enchArr = otherItemsEnch;
|
||||
|
||||
if (enchArr == null) enchArr = new Enchantment[0];
|
||||
return enchArr;
|
||||
}
|
||||
|
||||
private boolean findCompatibleItem(Entity n) {
|
||||
if (n instanceof Item) {
|
||||
Item item = (Item) n;
|
||||
|
||||
return !isItem(item.getItemStack());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -266,6 +266,8 @@ public final class ResearchSetup {
|
||||
register("industrial_miner", 95, "Industrial Mining", 28, SlimefunItems.INDUSTRIAL_MINER);
|
||||
register("advanced_industrial_miner", 98, "Better Mining", 36, SlimefunItems.ADVANCED_INDUSTRIAL_MINER);
|
||||
register("magic_pills", 257, "De-Zombification", 22, SlimefunItems.MAGIC_PILLS);
|
||||
register("enchantment_rune", 258, "Ancient Enchanting", 24, SlimefunItems.ENCHANTMENT_RUNE);
|
||||
register("magical_glass", 259, "Magical See-Through", 5, SlimefunItems.MAGICAL_GLASS);
|
||||
}
|
||||
|
||||
private static void register(String key, int id, String name, int defaultCost, ItemStack... items) {
|
||||
|
@ -3,6 +3,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.setup;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.items.magical.EnchantmentRune;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@ -372,6 +373,10 @@ public final class SlimefunItemSetup {
|
||||
new ItemStack[] {null, SlimefunItems.MAGIC_LUMP_2, null, SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.BOOK), SlimefunItems.MAGIC_LUMP_2, null, SlimefunItems.MAGIC_LUMP_2, null})
|
||||
.register(plugin);
|
||||
|
||||
new SlimefunItem(categories.magicalResources, SlimefunItems.MAGICAL_GLASS, RecipeType.MAGIC_WORKBENCH,
|
||||
new ItemStack[] {SlimefunItems.MAGIC_LUMP_2, SlimefunItems.GOLD_DUST, SlimefunItems.MAGIC_LUMP_2, SlimefunItems.FILLED_FLASK_OF_KNOWLEDGE, new ItemStack(Material.GLASS_PANE), SlimefunItems.FILLED_FLASK_OF_KNOWLEDGE, SlimefunItems.MAGIC_LUMP_2, SlimefunItems.FILLED_FLASK_OF_KNOWLEDGE, SlimefunItems.MAGIC_LUMP_2})
|
||||
.register(plugin);
|
||||
|
||||
new BasicCircuitBoard(categories.technicalComponents, SlimefunItems.BASIC_CIRCUIT_BOARD, RecipeType.MOB_DROP,
|
||||
new ItemStack[] {null, null, null, null, new CustomItem(SlimefunUtils.getCustomHead("89091d79ea0f59ef7ef94d7bba6e5f17f2f7d4572c44f90f76c4819a714"), "&aIron Golem"), null, null, null, null})
|
||||
.register(plugin);
|
||||
@ -2456,6 +2461,10 @@ public final class SlimefunItemSetup {
|
||||
new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ENDER_LUMP_3, SlimefunItems.ENDER_RUNE, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.MAGIC_LUMP_3})
|
||||
.register(plugin);
|
||||
|
||||
new EnchantmentRune(categories.magicalResources, SlimefunItems.ENCHANTMENT_RUNE, RecipeType.ANCIENT_ALTAR,
|
||||
new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, SlimefunItems.MAGICAL_GLASS, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.MAGICAL_GLASS, SlimefunItems.LIGHTNING_RUNE, SlimefunItems.MAGICAL_GLASS, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.MAGICAL_GLASS, SlimefunItems.MAGIC_LUMP_3})
|
||||
.register(plugin);
|
||||
|
||||
new InfernalBonemeal(categories.magicalGadgets, SlimefunItems.INFERNAL_BONEMEAL, RecipeType.ANCIENT_ALTAR,
|
||||
new ItemStack[] {new ItemStack(Material.NETHER_WART), SlimefunItems.EARTH_RUNE, new ItemStack(Material.NETHER_WART), SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.BONE_MEAL), SlimefunItems.MAGIC_LUMP_2, new ItemStack(Material.NETHER_WART), new ItemStack(Material.BLAZE_POWDER), new ItemStack(Material.NETHER_WART)},
|
||||
new CustomItem(SlimefunItems.INFERNAL_BONEMEAL, 8))
|
||||
|
@ -130,6 +130,10 @@ messages:
|
||||
fail: '&cYou can only bind one item to your soul at a time.'
|
||||
success: '&aYou have successfully bound this item to your soul! You will keep it when you die.'
|
||||
|
||||
enchantment-rune:
|
||||
fail: '&cYou cannot enchant this item.'
|
||||
success: '&aYou have successfully applied a random applicable enchantment to this item.'
|
||||
|
||||
research:
|
||||
start: '&7The Ancient Spirits whisper mysterious words into your ear!'
|
||||
progress: '&7You start to wonder about &b%research% &e(%progress%)'
|
||||
|
@ -234,3 +234,5 @@ slimefun:
|
||||
industrial_miner: Industrial Mining
|
||||
advanced_industrial_miner: Better Mining
|
||||
magic_pills: De-Zombification
|
||||
enchantment_rune: Ancient Enchanting
|
||||
magical_glass: Magical See-Through
|
Loading…
Reference in New Issue
Block a user