1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00
This commit is contained in:
TheBusyBiscuit 2019-09-06 00:10:50 +02:00
commit fd77bb6a00
9 changed files with 188 additions and 39 deletions

View File

@ -1,6 +1,8 @@
package me.mrCookieSlime.Slimefun.Lists;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
@ -536,6 +538,7 @@ public final class SlimefunItems {
public static final ItemStack RUNE_ENDER;
public static final ItemStack RUNE_RAINBOW;
public static final ItemStack RUNE_LIGHTNING;
public static final ItemStack RUNE_SOULBOUND;
static {
ItemStack itemB = new ItemStack(Material.FIREWORK_STAR);
@ -568,7 +571,7 @@ public final class SlimefunItems {
ItemStack itemE = new ItemStack(Material.FIREWORK_STAR);
FireworkEffectMeta imE = (FireworkEffectMeta) itemE.getItemMeta();
imE.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.ORANGE).build());
imE.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.fromRGB(112, 47, 7)).build());
imE.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&c&lEarth&8&l]"));
itemE.setItemMeta(imE);
RUNE_EARTH = itemE;
@ -582,17 +585,33 @@ public final class SlimefunItems {
ItemStack itemR = new ItemStack(Material.FIREWORK_STAR);
FireworkEffectMeta imR = (FireworkEffectMeta) itemR.getItemMeta();
imR.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.PURPLE).build());
imR.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.FUCHSIA).build());
imR.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&d&lRainbow&8&l]"));
itemR.setItemMeta(imR);
RUNE_RAINBOW = itemR;
ItemStack itemL = new ItemStack(Material.FIREWORK_STAR);
FireworkEffectMeta imL = (FireworkEffectMeta) itemL.getItemMeta();
imL.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.YELLOW).build());
imL.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.fromRGB(255, 255, 95)).build());
imL.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&e&lLightning&8&l]"));
itemL.setItemMeta(imL);
RUNE_LIGHTNING = itemL;
ItemStack itemS = new ItemStack(Material.FIREWORK_STAR);
FireworkEffectMeta imS = (FireworkEffectMeta) itemS.getItemMeta();
imS.setEffect(FireworkEffect.builder().with(Type.BURST).withColor(Color.fromRGB(47, 0, 117)).build());
imS.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&7Ancient Rune &8&l[&5&lSoulbound&8&l]"));
List<String> lore = new ArrayList<>();
lore.add(ChatColor.YELLOW + "Drop this rune onto a dropped item to");
lore.add(ChatColor.DARK_PURPLE + "bind " + ChatColor.YELLOW + "that item to your soul.");
lore.add(" ");
lore.add(ChatColor.YELLOW + "It is advised that you only use this rune");
lore.add(ChatColor.YELLOW + "on " + ChatColor.GOLD + "important " + ChatColor.YELLOW + "items.");
lore.add(" ");
lore.add(ChatColor.YELLOW + "Items bound to your soul won't drop on death.");
imS.setLore(lore);
itemS.setItemMeta(imS);
RUNE_SOULBOUND = itemS;
}
/* Electricity */

View File

@ -0,0 +1,96 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemDropHandler;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class SoulboundRune extends SimpleSlimefunItem<ItemDropHandler> {
public SoulboundRune(Category category, ItemStack item, String id, RecipeType type, ItemStack[] recipe) {
super(category, item, id, type, recipe);
}
@Override
public ItemDropHandler getItemHandler() {
return (e, p, i) -> {
ItemStack item = i.getItemStack();
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.RUNE_SOULBOUND, true)) {
if (!Slimefun.hasUnlocked(p, SlimefunItems.RUNE_SOULBOUND, true)) return true;
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
// Being sure the entity is still valid and not picked up or whatsoever.
if (!i.isValid()) return;
Location l = i.getLocation();
Collection<Entity> entites = l.getWorld().getNearbyEntities(l, 1.5, 1.5, 1.5,
entity -> entity instanceof Item && !SlimefunManager.isItemSoulbound(((Item) entity).getItemStack()) &&
!SlimefunManager.isItemSimiliar(((Item) entity).getItemStack(), SlimefunItems.RUNE_SOULBOUND, true)
);
if (entites.isEmpty()) return;
Entity entity = entites.stream().findFirst().get();
ItemStack ench = ((Item) entity).getItemStack();
Item ent = (Item) entity;
if (ench.getAmount() == 1) {
e.setCancelled(true);
ItemMeta enchMeta = ench.getItemMeta();
List<String> lore;
if (enchMeta.hasLore()) lore = enchMeta.getLore();
else lore = new ArrayList<>();
// This lightning is just an effect, it deals no damage.
l.getWorld().strikeLightningEffect(l);
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
// Being sure entities are still valid and not picked up or whatsoever.
if (i.isValid() && ent.isValid()) {
l.getWorld().createExplosion(l, 0.0F);
l.getWorld().playSound(l, Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1F);
lore.add(ChatColor.GRAY + "Soulbound");
enchMeta.setLore(lore);
ench.setItemMeta(enchMeta);
ent.remove();
i.remove();
l.getWorld().dropItemNaturally(l, ench);
Messages.local.sendTranslation(p, "messages.soulbound-rune.success", true);
}
}, 10L);
} else {
Messages.local.sendTranslation(p, "messages.soulbound-rune.fail", true);
}
}, 20L);
return true;
}
return false;
};
}
}

View File

@ -0,0 +1,15 @@
package me.mrCookieSlime.Slimefun.Objects.handlers;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerDropItemEvent;
@FunctionalInterface
public interface ItemDropHandler extends ItemHandler {
boolean onItemDrop(PlayerDropItemEvent e, Player p, Item item);
default String toCodename() {
return "ItemDropHandler";
}
}

View File

@ -56,6 +56,8 @@ public final class Messages {
local.setDefault("messages.talisman.knight", "&a&oYour Talisman gave you 5 Seconds of Regeneration");
local.setDefault("messages.talisman.whirlwind", "&a&oYour Talisman reflected the Projectile");
local.setDefault("messages.talisman.wizard", "&a&oYour Talisman has given you a better Fortune Level but maybe also lowered some other Enchantment Levels");
local.setDefault("messages.soulbound-rune.fail", "&cYou can only bind one item to your soul at a time.");
local.setDefault("messages.soulbound-rune.success", "&aYou have successfully bound this item to your soul! You will keep it when you die.");
local.setDefault("messages.broken-leg", "&c&oSeems like you broke your Leg, maybe a Splint could help?");
local.setDefault("messages.fixed-leg", "&a&oThe Splint helps. It feels better now.");
local.setDefault("messages.start-bleeding", "&c&oYou started to bleed. Maybe a Bandage could help?");

View File

@ -243,5 +243,6 @@ public final class ResearchSetup {
Slimefun.registerResearch(new Research(243, "A Dry Day", 15), SlimefunItems.AUTO_DRIER);
Slimefun.registerResearch(new Research(244, "Diet Cookie", 3), SlimefunItems.DIET_COOKIE);
Slimefun.registerResearch(new Research(245, "Storm Staff", 30), SlimefunItems.STAFF_STORM);
Slimefun.registerResearch(new Research(246, "Soulbound Rune", 60), SlimefunItems.RUNE_SOULBOUND);
}
}

View File

@ -4,15 +4,23 @@ import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect;
import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants;
import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
public final class SlimefunManager {
@ -119,19 +127,39 @@ public final class SlimefunManager {
private static boolean equalsLore(List<String> lore, List<String> lore2) {
StringBuilder string1 = new StringBuilder();
StringBuilder string2 = new StringBuilder();
String colors = ChatColor.YELLOW.toString() + ChatColor.YELLOW.toString() + ChatColor.GRAY.toString();
for (String string: lore) {
if (!string.startsWith(ChatColor.translateAlternateColorCodes('&', "&e&e&7"))) {
string1.append("-NEW LINE-" + string);
}
if (!string.equals(ChatColor.GRAY + "Soulbound") && !string.startsWith(colors)) string1.append("-NEW LINE-").append(string);
}
for (String string: lore2) {
if (!string.startsWith(ChatColor.translateAlternateColorCodes('&', "&e&e&7"))) {
string2.append("-NEW LINE-" + string);
}
if (!string.equals(ChatColor.GRAY + "Soulbound") && !string.startsWith(colors)) string2.append("-NEW LINE-").append(string);
}
return string1.toString().equals(string2.toString());
}
public static boolean isItemSoulbound(ItemStack item) {
if (item == null || item.getType() == Material.AIR) return false;
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) return true;
else {
ItemStack strippedItem = item.clone();
for (Enchantment enchantment : item.getEnchantments().keySet()) {
strippedItem.removeEnchantment(enchantment);
}
if (SlimefunPlugin.getHooks().isEmeraldEnchantsInstalled()) {
for (ItemEnchantment enchantment : EmeraldEnchants.getInstance().getRegistry().getEnchantments(item)){
EmeraldEnchants.getInstance().getRegistry().applyEnchantment(strippedItem, enchantment.getEnchantment(), 0);
}
}
if (SlimefunItem.getByItem(strippedItem) instanceof SoulboundItem) return true;
else if (item.hasItemMeta()) {
ItemMeta im = item.getItemMeta();
return (im.hasLore() && im.getLore().contains(ChatColor.GRAY + "Soulbound"));
}
return false;
}
}
}

View File

@ -99,6 +99,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfTheSeeker;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfVeinMining;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SeismicAxe;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SmeltersPickaxe;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SoulboundRune;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.StormStaff;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.SwordOfBeheading;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.TelepositionScroll;
@ -2788,6 +2789,10 @@ public final class SlimefunSetup {
new ItemStack[] {new ItemStack(Material.RED_DYE), SlimefunItems.MAGIC_LUMP_3, new ItemStack(Material.CYAN_DYE), new ItemStack(Material.WHITE_WOOL), SlimefunItems.RUNE_ENDER, new ItemStack(Material.WHITE_WOOL), new ItemStack(Material.YELLOW_DYE), SlimefunItems.ENDER_LUMP_3, new ItemStack(Material.MAGENTA_DYE)})
.register(true);
new SoulboundRune(Categories.LUMPS_AND_MAGIC, SlimefunItems.RUNE_SOULBOUND, "ANCIENT_RUNE_SOULBOUND", RecipeType.ANCIENT_ALTAR,
new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.MAGIC_LUMP_3})
.register(true);
new InfernalBonemeal(Categories.MAGIC, SlimefunItems.INFERNAL_BONEMEAL, "INFERNAL_BONEMEAL", RecipeType.ANCIENT_ALTAR,
new ItemStack[] {new ItemStack(Material.NETHER_WART), SlimefunItems.RUNE_EARTH, 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))
.register(true);

View File

@ -5,7 +5,6 @@ import java.util.Date;
import java.util.Iterator;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -15,12 +14,9 @@ import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants;
import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
@ -46,7 +42,7 @@ public class DamageListener implements Listener {
for (int slot = 0; slot < p.getInventory().getSize(); slot++) {
ItemStack item = p.getInventory().getItem(slot);
if (isSoulbound(item)) {
if (SlimefunManager.isItemSoulbound(item)) {
Soul.storeItem(p.getUniqueId(), slot, item);
}
}
@ -54,7 +50,7 @@ public class DamageListener implements Listener {
Iterator<ItemStack> drops = e.getDrops().iterator();
while (drops.hasNext()) {
ItemStack item = drops.next();
if (isSoulbound(item)) drops.remove();
if (SlimefunManager.isItemSoulbound(item)) drops.remove();
}
}
@ -79,13 +75,6 @@ public class DamageListener implements Listener {
}
}
private boolean isSoulbound(ItemStack item) {
if (item == null || item.getType() == null || item.getType() == Material.AIR) return false;
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) return true;
else if (SlimefunItem.getByItem(removeEnchantments(item)) instanceof SoulboundItem) return true;
else return false;
}
@EventHandler
public void onArrowHit(EntityDamageEvent e) {
if (e.getEntity() instanceof Player && e.getCause() == DamageCause.FALL && SlimefunPlugin.getUtilities().damage.contains(e.getEntity().getUniqueId())) {
@ -98,19 +87,4 @@ public class DamageListener implements Listener {
public void onRespawn(PlayerRespawnEvent e) {
Soul.retrieveItems(e.getPlayer());
}
private ItemStack removeEnchantments(ItemStack itemStack) {
ItemStack strippedItem = itemStack.clone();
for (Enchantment enchantment : itemStack.getEnchantments().keySet()) {
strippedItem.removeEnchantment(enchantment);
}
if (SlimefunPlugin.getHooks().isEmeraldEnchantsInstalled()) {
for(ItemEnchantment enchantment : EmeraldEnchants.getInstance().getRegistry().getEnchantments(itemStack)){
EmeraldEnchants.getInstance().getRegistry().applyEnchantment(strippedItem, enchantment.getEnchantment(), 0);
}
}
return strippedItem;
}
}

View File

@ -26,6 +26,7 @@ import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.inventory.BrewerInventory;
@ -47,6 +48,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.MultiTool;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemDropHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.Messages;
@ -440,4 +442,11 @@ public class ItemListener implements Listener {
if (inventory instanceof BrewerInventory && inventory.getHolder() instanceof BrewingStand && e.getRawSlot() < inventory.getSize()) e.setCancelled(SlimefunItem.getByItem(e.getCursor()) != null);
}
@EventHandler
public void onItemDrop(PlayerDropItemEvent e) {
for (ItemHandler handler : SlimefunItem.getHandlers("ItemDropHandler")) {
if (((ItemDropHandler) handler).onItemDrop(e, e.getPlayer(), e.getItemDrop())) return;
}
}
}