Merge remote-tracking branch 'origin/master'

This commit is contained in:
Indyuce 2021-10-03 12:08:50 +02:00
commit 90dc0bfa9c
19 changed files with 1061 additions and 1029 deletions

View File

@ -132,7 +132,7 @@
<dependency>
<groupId>net.Indyuce</groupId>
<artifactId>MMOCore</artifactId>
<version>1.8.0</version>
<version>1.8.1</version>
<scope>provided</scope>
</dependency>
@ -227,13 +227,6 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.Zrips.CMI</groupId>
<artifactId>CMI</artifactId>
<version>8.6.5.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.herocraftonline</groupId>
<artifactId>heroes</artifactId>

View File

@ -18,14 +18,23 @@ import net.Indyuce.mmoitems.api.util.MMOItemReforger;
import net.Indyuce.mmoitems.api.util.NumericStatFormula;
import net.Indyuce.mmoitems.api.util.message.FFPMMOItems;
import net.Indyuce.mmoitems.command.MMOItemsCommandTreeRoot;
import net.Indyuce.mmoitems.comp.*;
import net.Indyuce.mmoitems.comp.MMOItemsMetrics;
import net.Indyuce.mmoitems.comp.MMOItemsRewardTypes;
import net.Indyuce.mmoitems.comp.McMMONonRPGHook;
import net.Indyuce.mmoitems.comp.PhatLootsHook;
import net.Indyuce.mmoitems.comp.RealDualWieldHook;
import net.Indyuce.mmoitems.comp.WorldEditSupport;
import net.Indyuce.mmoitems.comp.denizen.DenizenHook;
import net.Indyuce.mmoitems.comp.eco.VaultSupport;
import net.Indyuce.mmoitems.comp.enchants.CrazyEnchantsStat;
import net.Indyuce.mmoitems.comp.enchants.EnchantPlugin;
import net.Indyuce.mmoitems.comp.enchants.MythicEnchantsSupport;
import net.Indyuce.mmoitems.comp.enchants.advanced_enchants.AdvancedEnchantmentsHook;
import net.Indyuce.mmoitems.comp.inventory.*;
import net.Indyuce.mmoitems.comp.inventory.DefaultPlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.OrnamentPlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.PlayerInventory;
import net.Indyuce.mmoitems.comp.inventory.PlayerInventoryHandler;
import net.Indyuce.mmoitems.comp.inventory.RPGInventoryHook;
import net.Indyuce.mmoitems.comp.itemglow.ItemGlowListener;
import net.Indyuce.mmoitems.comp.itemglow.NoGlowListener;
import net.Indyuce.mmoitems.comp.mmocore.MMOCoreMMOLoader;
@ -42,12 +51,39 @@ import net.Indyuce.mmoitems.comp.rpg.RPGHandler;
import net.Indyuce.mmoitems.gui.PluginInventory;
import net.Indyuce.mmoitems.gui.edition.recipe.RecipeBrowserGUI;
import net.Indyuce.mmoitems.gui.listener.GuiListener;
import net.Indyuce.mmoitems.listener.*;
import net.Indyuce.mmoitems.manager.*;
import net.Indyuce.mmoitems.listener.CraftingListener;
import net.Indyuce.mmoitems.listener.CustomBlockListener;
import net.Indyuce.mmoitems.listener.CustomSoundListener;
import net.Indyuce.mmoitems.listener.DisableInteractions;
import net.Indyuce.mmoitems.listener.DurabilityListener;
import net.Indyuce.mmoitems.listener.ElementListener;
import net.Indyuce.mmoitems.listener.EquipListener;
import net.Indyuce.mmoitems.listener.ItemListener;
import net.Indyuce.mmoitems.listener.ItemUse;
import net.Indyuce.mmoitems.listener.PlayerListener;
import net.Indyuce.mmoitems.manager.AbilityManager;
import net.Indyuce.mmoitems.manager.BlockManager;
import net.Indyuce.mmoitems.manager.ConfigManager;
import net.Indyuce.mmoitems.manager.CraftingManager;
import net.Indyuce.mmoitems.manager.DropTableManager;
import net.Indyuce.mmoitems.manager.EntityManager;
import net.Indyuce.mmoitems.manager.ItemManager;
import net.Indyuce.mmoitems.manager.LayoutManager;
import net.Indyuce.mmoitems.manager.LoreFormatManager;
import net.Indyuce.mmoitems.manager.PluginUpdateManager;
import net.Indyuce.mmoitems.manager.RecipeManager;
import net.Indyuce.mmoitems.manager.SetManager;
import net.Indyuce.mmoitems.manager.StatManager;
import net.Indyuce.mmoitems.manager.TemplateManager;
import net.Indyuce.mmoitems.manager.TierManager;
import net.Indyuce.mmoitems.manager.TypeManager;
import net.Indyuce.mmoitems.manager.UpgradeManager;
import net.Indyuce.mmoitems.manager.WorldGenManager;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
@ -79,7 +115,7 @@ public class MMOItems extends LuminePlugin {
private final ItemManager itemManager = new ItemManager();
private final PlayerInventoryHandler inventory = new PlayerInventoryHandler();
private final List<StringInputParser> stringInputParsers = new ArrayList<>();
private final List<EnchantPlugin> enchantPlugins = new ArrayList<>();
private final List<EnchantPlugin<? extends Enchantment>> enchantPlugins = new ArrayList<>();
private DropTableManager dropTableManager;
private WorldGenManager worldGenManager;
@ -99,8 +135,7 @@ public class MMOItems extends LuminePlugin {
public void load() {
plugin = this;
if (getServer().getPluginManager().getPlugin("WorldEdit") != null)
try {
if (getServer().getPluginManager().getPlugin("WorldEdit") != null) try {
new WorldEditSupport();
getLogger().log(Level.INFO, "Hooked onto WorldEdit");
} catch (Exception exception) {
@ -117,8 +152,7 @@ public class MMOItems extends LuminePlugin {
typeManager.reload();
templateManager.preloadTemplates();
if (Bukkit.getPluginManager().getPlugin("MMOCore") != null)
new MMOCoreMMOLoader();
if (Bukkit.getPluginManager().getPlugin("MMOCore") != null) new MMOCoreMMOLoader();
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null)
//statManager.register(McMMOHook.MCMMO_SUPER_TOOL);
@ -129,18 +163,11 @@ public class MMOItems extends LuminePlugin {
statManager.register(AdvancedEnchantmentsHook.DISABLE_ADVANCED_ENCHANTMENTS);
}
if (Bukkit.getPluginManager().getPlugin("MythicEnchants") != null)
enchantPlugins.add(new MythicEnchantsSupport());
if (Bukkit.getPluginManager().getPlugin("Depenizen") != null) {
new DenizenHook();
getLogger().log(Level.INFO, "Hooked onto Denizen");
}
if (Bukkit.getPluginManager().getPlugin("MythicEnchants") != null) enchantPlugins.add(new MythicEnchantsSupport());
}
@Override
public void enable() {
new SpigotPlugin(39267, this).checkForUpdate();
new MMOItemsMetrics();
@ -158,8 +185,7 @@ public class MMOItems extends LuminePlugin {
// registering here so the stats will load with the templates
if (Bukkit.getPluginManager().getPlugin("MythicMobs") != null) {
new MythicMobsLoader();
if (getConfig().getBoolean("lootsplosion.enabled"))
Bukkit.getPluginManager().registerEvents(new LootsplosionListener(), this);
if (getConfig().getBoolean("lootsplosion.enabled")) Bukkit.getPluginManager().registerEvents(new LootsplosionListener(), this);
getLogger().log(Level.INFO, "Hooked onto MythicMobs");
}
@ -185,8 +211,7 @@ public class MMOItems extends LuminePlugin {
blockManager = new BlockManager();
equipListener = new EquipListener();
if (Bukkit.getPluginManager().getPlugin("Vault") != null)
vaultSupport = new VaultSupport();
if (Bukkit.getPluginManager().getPlugin("Vault") != null) vaultSupport = new VaultSupport();
getLogger().log(Level.INFO, "Loading crafting stations, please wait..");
layoutManager.reload();
@ -225,8 +250,7 @@ public class MMOItems extends LuminePlugin {
}, 100, getConfig().getInt("inventory-update-delay"));
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null)
Bukkit.getPluginManager().registerEvents(new McMMONonRPGHook(), this);
if (Bukkit.getPluginManager().getPlugin("mcMMO") != null) Bukkit.getPluginManager().registerEvents(new McMMONonRPGHook(), this);
/*
* Registers Player Inventories. Each of these add locations of items to search for
@ -237,8 +261,7 @@ public class MMOItems extends LuminePlugin {
getInventory().register(new RPGInventoryHook());
getLogger().log(Level.INFO, "Hooked onto RPGInventory");
}
if (MMOItems.plugin.getConfig().getBoolean("iterate-whole-inventory"))
getInventory().register(new OrnamentPlayerInventory());
if (MMOItems.plugin.getConfig().getBoolean("iterate-whole-inventory")) getInventory().register(new OrnamentPlayerInventory());
if (Bukkit.getPluginManager().getPlugin("CrazyEnchantments") != null) {
getStats().register(new CrazyEnchantsStat());
@ -259,8 +282,7 @@ public class MMOItems extends LuminePlugin {
if (Bukkit.getPluginManager().getPlugin("GlowAPI") != null && Bukkit.getPluginManager().getPlugin("PacketListenerApi") != null) {
Bukkit.getPluginManager().registerEvents(new ItemGlowListener(), this);
getLogger().log(Level.INFO, "Hooked onto GlowAPI (Item Glow)");
} else
Bukkit.getPluginManager().registerEvents(new NoGlowListener(), this);
} else Bukkit.getPluginManager().registerEvents(new NoGlowListener(), this);
}
if (Bukkit.getPluginManager().getPlugin("RealDualWield") != null) {
@ -282,6 +304,11 @@ public class MMOItems extends LuminePlugin {
}).runTaskLater(this, 1L);
}
/*if (Bukkit.getPluginManager().getPlugin("Denizen") != null) {
new DenizenHook();
getLogger().log(Level.INFO, "Hooked onto Denizen");
}*/
// compatibility with /reload
Bukkit.getScheduler().runTask(this, () -> Bukkit.getOnlinePlayers().forEach(PlayerData::load));
@ -297,8 +324,7 @@ public class MMOItems extends LuminePlugin {
}
recipeManager.load(book, amounts);
if (amounts)
Bukkit.getPluginManager().registerEvents(new CraftingListener(), this);
if (amounts) Bukkit.getPluginManager().registerEvents(new CraftingListener(), this);
// amount and bukkit recipes
getLogger().log(Level.INFO, "Loading recipes, please wait...");
@ -369,12 +395,10 @@ public class MMOItems extends LuminePlugin {
Validate.notNull(handler, "RPGHandler cannot be null");
// unregister events from current rpgPlugin instance
if (rpgPlugin != null && rpgPlugin instanceof Listener && isEnabled())
HandlerList.unregisterAll((Listener) rpgPlugin);
if (rpgPlugin != null && rpgPlugin instanceof Listener && isEnabled()) HandlerList.unregisterAll((Listener) rpgPlugin);
rpgPlugin = handler;
if (handler instanceof Listener && isEnabled())
Bukkit.getPluginManager().registerEvents((Listener) handler, this);
if (handler instanceof Listener && isEnabled()) Bukkit.getPluginManager().registerEvents((Listener) handler, this);
}
public PluginUpdateManager getUpdates() {
@ -509,7 +533,7 @@ public class MMOItems extends LuminePlugin {
return vaultSupport != null && vaultSupport.getPermissions() != null;
}
public List<EnchantPlugin> getEnchantPlugins() {
public List<EnchantPlugin<? extends Enchantment>> getEnchantPlugins() {
return enchantPlugins;
}
@ -533,8 +557,7 @@ public class MMOItems extends LuminePlugin {
* For example, required level, is that vanilla XP levels, MMOCore levels, McMMO Leves or what?
*/
public void findRpgPlugin() {
if (rpgPlugin != null)
return;
if (rpgPlugin != null) return;
String preferred = plugin.getConfig().getString("preferred-rpg-provider", null);
if (preferred != null) {
@ -597,8 +620,7 @@ public class MMOItems extends LuminePlugin {
// Valid template?
MMOItemTemplate found = getTemplates().getTemplate(type, id);
if (found == null)
return null;
if (found == null) return null;
// Build if found
return found.newBuilder(player).build();
@ -617,8 +639,7 @@ public class MMOItems extends LuminePlugin {
// Valid MMOItem?
MMOItem m = getMMOItem(type, id, player);
if (m == null)
return null;
if (m == null) return null;
// Build if found
return m.newBuilder().build();
@ -637,8 +658,7 @@ public class MMOItems extends LuminePlugin {
// Valid template?
MMOItemTemplate found = getTemplates().getTemplate(type, id);
if (found == null)
return null;
if (found == null) return null;
// Build if found
return found.newBuilder(itemLevel, itemTier).build();
@ -657,8 +677,7 @@ public class MMOItems extends LuminePlugin {
// Valid MMOItem?
MMOItem m = getMMOItem(type, id, itemLevel, itemTier);
if (m == null)
return null;
if (m == null) return null;
// Build if found
return m.newBuilder().build();

View File

@ -139,7 +139,12 @@ public abstract class Ability<T extends AbilityMetadata> implements CooldownObje
/**
* Performing a right click while sneaking
*/
SHIFT_RIGHT_CLICK;
SHIFT_RIGHT_CLICK,
/**
* When player Sneaks
*/
SNEAK;
private final boolean message;

View File

@ -3,6 +3,7 @@ package net.Indyuce.mmoitems.api;
import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.api.util.ui.SilentNumbers;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.item.util.identify.UnidentifiedItem;
import net.Indyuce.mmoitems.manager.TypeManager;
@ -46,7 +47,7 @@ public class Type {
public static final Type ORNAMENT = new Type(TypeSet.EXTRA, "ORNAMENT", false, EquipmentSlot.ANY);
// extra
public static final Type ARMOR = new Type(TypeSet.EXTRA, "ARMOR", false, EquipmentSlot.ARMOR);
public static final Type ARMOR = new Type(TypeSet.EXTRA, "ARMOR", false, EquipmentSlot.ARMOR, true);
public static final Type TOOL = new Type(TypeSet.EXTRA, "TOOL", false, EquipmentSlot.MAIN_HAND);
public static final Type CONSUMABLE = new Type(TypeSet.EXTRA, "CONSUMABLE", false, EquipmentSlot.MAIN_HAND);
public static final Type MISCELLANEOUS = new Type(TypeSet.EXTRA, "MISCELLANEOUS", false, EquipmentSlot.MAIN_HAND);
@ -59,6 +60,12 @@ public class Type {
private String name;
private final TypeSet set;
public boolean isFourGUIMode() {
return fourGUIMode;
}
private final boolean fourGUIMode;
/**
* Used for item type restrictions for gem stones to easily check if the
* item is a weapon.
@ -89,10 +96,13 @@ public class Type {
private final List<ItemStat> available = new ArrayList<>();
public Type(TypeSet set, String id, boolean weapon, EquipmentSlot equipType) {
this(set, id, weapon, equipType, false);
}
public Type(TypeSet set, String id, boolean weapon, EquipmentSlot equipType, boolean fourGUI) {
this.set = set;
this.id = id.toUpperCase().replace("-", "_").replace(" ", "_");
this.equipType = equipType;
this.fourGUIMode = fourGUI;
this.weapon = weapon;
}
@ -103,6 +113,7 @@ public class Type {
set = parent.set;
weapon = parent.weapon;
equipType = parent.equipType;
this.fourGUIMode = config.getBoolean("AlternateGUIMode", parent.fourGUIMode);
}
public void load(ConfigurationSection config) {

View File

@ -27,16 +27,16 @@ public class PlaceholderCondition extends Condition {
switch (comparator) {
case "<":
return Double.valueOf(placeholders) < Double.valueOf(compareTo);
case "<=":
case "<+":
return Double.valueOf(placeholders) <= Double.valueOf(compareTo);
case ">":
return Double.valueOf(placeholders) > Double.valueOf(compareTo);
case ">=":
case ">+":
return Double.valueOf(placeholders) >= Double.valueOf(compareTo);
case "==":
case "=":
case "++":
case "+":
return Double.valueOf(placeholders) == Double.valueOf(compareTo);
case "!=":
case "!+":
return Double.valueOf(placeholders) != Double.valueOf(compareTo);
case "equals":
return placeholders.equals(compareTo);

View File

@ -69,6 +69,9 @@ public class GemStone extends UseItem {
// Check for success rate
double successRate = getNBTItem().getStat(ItemStats.SUCCESS_RATE.getId());
if (successRate == 0.0)
successRate = 100;
// Call the Bukkit event
ApplyGemStoneEvent called = new ApplyGemStoneEvent(playerData, mmoitem, targetMMO,
RANDOM.nextDouble() > successRate / 100 ? ResultType.FAILURE : ResultType.SUCCESS);

View File

@ -34,7 +34,7 @@ public class ItemSkin extends UseItem {
return new ApplyResult(ResultType.NONE);
if (MMOItems.plugin.getConfig().getBoolean("locked-skins") && target.getBoolean("MMOITEMS_HAS_SKIN")) {
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 2);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
Message.SKIN_REJECTED.format(ChatColor.RED, "#item#", MMOUtils.getDisplayName(target.getItem()))
.send(player);
return new ApplyResult(ResultType.NONE);

View File

@ -369,7 +369,7 @@ public class MMOItemReforger {
*
* @param options Additional options to pass onto the modules.
*
* @return If reforged successfully ~ <code>true</code> unless cancelled.
* @return If reforged successfully. Basically <code>true</code>, unless cancelled.
*/
public boolean reforge(@NotNull ReforgeOptions options) {
//RFG//MMOItems.log("§8Reforge §4RFG§7 Reforging " + SilentNumbers.getItemName(getStack()));

View File

@ -79,6 +79,7 @@ public class ReloadCommandTreeNode extends CommandTreeNode {
sender.sendMessage(MMOItems.plugin.getPrefix() + "- " + ChatColor.RED
+ (MMOItems.plugin.getRecipes().getLoadedLegacyRecipes().size()
+ MMOItems.plugin.getRecipes().getLegacyCustomRecipes().size()
+ MMOItems.plugin.getRecipes().getBooklessRecipes().size()
+ MMOItems.plugin.getRecipes().getCustomRecipes().size())
+ ChatColor.GRAY + " Recipes");
}

View File

@ -1,74 +0,0 @@
package net.Indyuce.mmoitems.comp.denizen;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.MapTag;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import com.denizenscript.denizencore.tags.TagManager;
import com.denizenscript.depenizen.bukkit.Bridge;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.Type;
/**
* Basic integration with Denizen
*/
public class DenizenBridge extends Bridge {
@Override
public void init() {
/*
* This registers sub tags in the custom coded denizen tags
*/
/* ObjectFetcher.registerWithObjectFetcher(MMOItemTag.class, MMOItemTag.tagProcessor);*/
ObjectFetcher.registerWithObjectFetcher(MMOItemTemplateTag.class, MMOItemTemplateTag.tagProcessor);
/*
* Implement some properties to the already existing ItemTag
*/
PropertyParser.registerProperty(MMOItemsItemProperty.class, ItemTag.class);
/*
* This implements a way to retrieve an MMOItem as itemStack.
*
* Usage:
* <mmoitem_template[type=TYPE;id=ID_HERE]>
*/
TagManager.registerTagHandler("mmoitem_template", attribute -> {
if (!attribute.hasContext(1)) {
attribute.echoError("Please provide an item type and ID.");
return null;
}
MapTag map = attribute.contextAsType(1, MapTag.class);
if (map == null) {
attribute.echoError("Invalid MapTag input");
return null;
}
ObjectTag type = map.getObject("type");
ObjectTag id = map.getObject("id");
if (type == null || id == null) {
attribute.echoError("Invalid MapTag input - missing 'type' or 'id'");
return null;
}
String typeName = type.toString().replace("-", "_").toUpperCase();
Type parsedType = MMOItems.plugin.getTypes().get(typeName);
if (parsedType == null) {
attribute.echoError("Invalid type - cannot find type with name '" + typeName + "'");
return null;
}
// Format ID and return item
String formattedId = id.toString().replace("-", "_").toUpperCase();
if (!MMOItems.plugin.getTemplates().hasTemplate(parsedType, formattedId)) {
attribute.echoError("Invalid template ID - cannot find template with name '" + formattedId + "'");
return null;
}
return new MMOItemTemplateTag(parsedType, formattedId);
});
}
}

View File

@ -1,18 +1,72 @@
package net.Indyuce.mmoitems.comp.denizen;
import com.denizenscript.depenizen.bukkit.Depenizen;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.MapTag;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import com.denizenscript.denizencore.tags.TagManager;
import net.Indyuce.mmoitems.MMOItems;
import org.bukkit.Bukkit;
import net.Indyuce.mmoitems.api.Type;
public class DenizenHook {
/**
* Putting this here so that the Depenizen import does not
* appear in the main MMOItems class which would cause an issue
* for all servers without Denizen
*/
public DenizenHook() {
Depenizen depenizen = (Depenizen) Bukkit.getPluginManager().getPlugin("Depenizen");
depenizen.registerBridge(MMOItems.plugin.getName(), () -> new DenizenBridge());
/*
* This registers sub tags in the custom coded denizen tags
*/
/* ObjectFetcher.registerWithObjectFetcher(MMOItemTag.class, MMOItemTag.tagProcessor);*/
ObjectFetcher.registerWithObjectFetcher(MMOItemTemplateTag.class, MMOItemTemplateTag.tagProcessor);
/*
* Implement some properties to the already existing ItemTag
*/
PropertyParser.registerProperty(MMOItemsItemProperty.class, ItemTag.class);
/*
* This implements a way to retrieve an MMOItem as itemStack.
*
* Usage:
* <mmoitem_template[type=TYPE;id=ID_HERE]>
*/
TagManager.registerTagHandler("mmoitem_template", attribute -> {
if (!attribute.hasContext(1)) {
attribute.echoError("Please provide an item type and ID.");
return null;
}
MapTag map = attribute.contextAsType(1, MapTag.class);
if (map == null) {
attribute.echoError("Invalid MapTag input");
return null;
}
ObjectTag type = map.getObject("type");
ObjectTag id = map.getObject("id");
if (type == null || id == null) {
attribute.echoError("Invalid MapTag input - missing 'type' or 'id'");
return null;
}
String typeName = type.toString().replace("-", "_").toUpperCase();
Type parsedType = MMOItems.plugin.getTypes().get(typeName);
if (parsedType == null) {
attribute.echoError("Invalid type - cannot find type with name '" + typeName + "'");
return null;
}
// Format ID and return item
String formattedId = id.toString().replace("-", "_").toUpperCase();
if (!MMOItems.plugin.getTemplates().hasTemplate(parsedType, formattedId)) {
attribute.echoError("Invalid template ID - cannot find template with name '" + formattedId + "'");
return null;
}
return new MMOItemTemplateTag(parsedType, formattedId);
});
}
}

View File

@ -13,7 +13,6 @@ import net.Indyuce.mmoitems.api.ItemTier;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate;
import net.Indyuce.mmoitems.api.player.PlayerData;
import org.bukkit.inventory.ItemStack;
import java.util.Random;
@ -78,8 +77,7 @@ public class MMOItemTemplateTag extends SimpleTag {
* MMOItemTag of the generated item.
*/
tagProcessor.registerTag("generate", (attribute, object) -> {
if (!attribute.hasContext(1))
return new ItemTag(object.getTemplate().newBuilder().build().newBuilder().build());
if (!attribute.hasContext(1)) return new ItemTag(object.getTemplate().newBuilder().build().newBuilder().build());
MapTag map = attribute.contextAsType(1, MapTag.class);
if (map == null) {
@ -96,31 +94,29 @@ public class MMOItemTemplateTag extends SimpleTag {
// Specified level
ObjectTag levelTag = map.getObject("level");
int level = -1;
if (levelTag != null)
try {
level = Integer.valueOf(levelTag.toString());
if (levelTag != null) try {
level = Integer.parseInt(levelTag.toString());
} catch (IllegalArgumentException exception) {
attribute.echoError("Bad level input: " + levelTag.toString() + " is not a valid integer");
attribute.echoError("Bad level input: " + levelTag + " is not a valid integer");
return null;
}
// Match level
ObjectTag matchLevelTag = map.getObject("match-level");
boolean matchLevel = matchLevelTag != null && Boolean.valueOf(matchLevelTag.toString());
boolean matchLevel = matchLevelTag != null && Boolean.parseBoolean(matchLevelTag.toString());
// Item tier param
ObjectTag tierTag = map.getObject("tier");
ItemTier tier = null;
if (tierTag != null)
try {
if (tierTag != null) try {
tier = MMOItems.plugin.getTiers().getOrThrow(tierTag.toString().toUpperCase().replace("-", "_"));
} catch (IllegalArgumentException exception) {
attribute.echoError(exception.getMessage());
}
// Find item level
int itemLevel = level >= 0 ? level : (matchLevel && playerTag != null ?
MMOItems.plugin.getTemplates().rollLevel(PlayerData.get(((PlayerTag) playerTag).getPlayerEntity()).getRPG().getLevel()) : 1 + random.nextInt(100));
int itemLevel = level >= 0 ? level : (matchLevel && playerTag != null ? MMOItems.plugin.getTemplates()
.rollLevel(PlayerData.get(((PlayerTag) playerTag).getPlayerEntity()).getRPG().getLevel()) : 1 + random.nextInt(100));
// Find item tier
ItemTier itemTier = tier != null ? tier : MMOItems.plugin.getTemplates().rollTier();
@ -131,8 +127,7 @@ public class MMOItemTemplateTag extends SimpleTag {
}
public static MMOItemTemplateTag valueOf(String string, TagContext context) {
if (string == null)
return null;
if (string == null) return null;
try {
String[] split = string.substring("mmoitem_template@".length()).split("\\.");

View File

@ -23,7 +23,7 @@ public class MythicMobsAbility extends Ability<MythicMobsAbilityMetadata> {
private final Skill skill;
public MythicMobsAbility(String id, FileConfiguration config) {
super(id, config.getString("name"), CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
super(id, config.getString("name"), CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK, CastingMode.SNEAK);
String skillName = config.getString("mythicmobs-skill-id");
Validate.notNull(skillName, "Could not find MM skill name");

View File

@ -24,6 +24,7 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@ -38,6 +39,8 @@ public class ItemBrowser extends PluginInventory {
private boolean deleteMode;
private static final int[] slots = { 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34 };
//private static final int[] slotsAlt = { 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43 };
private static final int[] slotsAlt = { 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34 };
public ItemBrowser(Player player) {
this(player, null);
@ -49,10 +52,13 @@ public class ItemBrowser extends PluginInventory {
this.type = type;
}
int[] getUsedSlots(@Nullable Type forType) { return forType == null ? slots : forType.isFourGUIMode() ? slotsAlt : slots; }
@Override
public Inventory getInventory() {
int min = (page - 1) * slots.length;
int max = page * slots.length;
int[] usedSlots = getUsedSlots(type);
int min = (page - 1) * usedSlots.length;
int max = page * usedSlots.length;
int n = 0;
/*
@ -125,7 +131,7 @@ public class ItemBrowser extends PluginInventory {
ItemStack item = template.newBuilder(playerData.getRPG()).build().newBuilder().build();
if (item == null || item.getType() == Material.AIR) {
cached.put(template.getId(), error);
inv.setItem(slots[n++], error);
inv.setItem(usedSlots[n++], error);
continue;
}
NBTItem nbtItem = NBTItem.get(item);
@ -148,7 +154,7 @@ public class ItemBrowser extends PluginInventory {
cached.put(template.getId(), nbtItem.toItem());
inv.setItem(slots[n++], cached.get(template.getId()));
inv.setItem(usedSlots[n++], cached.get(template.getId()));
}
ItemStack noItem = VersionMaterial.GRAY_STAINED_GLASS_PANE.toItem();
@ -192,8 +198,8 @@ public class ItemBrowser extends PluginInventory {
inv.setItem(45, downloadPack);
}
while (n < slots.length)
inv.setItem(slots[n++], noItem);
while (n < usedSlots.length)
inv.setItem(usedSlots[n++], noItem);
if (!deleteMode)
inv.setItem(51, create);
inv.setItem(47, delete);

View File

@ -63,6 +63,11 @@ public class RMGRR_Shapeless implements RecipeRegistry {
// Add
ProvidedUIFilter p = RecipeMakerGUI.readIngredientFrom(str, ffp);
// Not air right
if (p.isAir()) { continue; }
// Ok snooze
nonAirFound = true;
poofs.add(new MythicRecipeIngredient(p));
}

View File

@ -9,6 +9,7 @@ import io.lumine.mythic.lib.api.crafting.recipes.ShapelessRecipe;
import io.lumine.mythic.lib.api.crafting.uimanager.ProvidedUIFilter;
import io.lumine.mythic.lib.api.util.Ref;
import io.lumine.mythic.lib.api.util.ui.FriendlyFeedbackProvider;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.crafting.recipe.CustomSmithingRecipe;
import net.Indyuce.mmoitems.api.crafting.recipe.SmithingCombinationType;
import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate;
@ -86,8 +87,8 @@ public class RMGRR_Smithing implements RecipeRegistry {
// Read the options and output
int outputAmount = recipeSection.getInt(RBA_AmountOutput.AMOUNT_INGREDIENTS, 1);
boolean dropGems = recipeSection.getBoolean(RBA_DropGems.SMITH_GEMS, false);
SmithingCombinationType upgradeEffect = readSCT(recipeSection.getString(RBA_SmithingEnchantments.SMITH_ENCHANTS));
SmithingCombinationType enchantEffect = readSCT(recipeSection.getString(RBA_SmithingUpgrades.SMITH_UPGRADES));
SmithingCombinationType enchantEffect = readSCT(recipeSection.getString(RBA_SmithingEnchantments.SMITH_ENCHANTS));
SmithingCombinationType upgradeEffect = readSCT(recipeSection.getString(RBA_SmithingUpgrades.SMITH_UPGRADES));
// Build Output
CustomSmithingRecipe outputRecipe = new CustomSmithingRecipe(template, dropGems, enchantEffect, upgradeEffect, outputAmount);

View File

@ -277,8 +277,11 @@ public class ItemUse implements Listener {
return;
NBTItem item = NBTItem.get(event.getBow());
if (!item.hasType())
return;
Type type = Type.get(item.getType());
PlayerData playerData = PlayerData.get((Player) event.getEntity());
if (type != null) {
Weapon weapon = new Weapon(playerData, item);

View File

@ -60,6 +60,12 @@ public class PlayerListener implements Listener {
PlayerData.get(player).castAbilities(damager, CastingMode.WHEN_HIT);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void castWhenSneakAbilities(PlayerToggleSneakEvent event) {
Player player = event.getPlayer();
PlayerData.get(player).castAbilities(null, CastingMode.SNEAK);
}
@EventHandler(priority = EventPriority.LOW)
public void castClickAbilities(PlayerInteractEvent event) {
if (event.getAction() == Action.PHYSICAL)
@ -148,6 +154,9 @@ public class PlayerListener implements Listener {
return;
NBTItem nbtItem = MythicLib.plugin.getVersion().getWrapper().getNBTItem(item.getItem());
if (!nbtItem.hasType())
return;
Type type = Type.get(nbtItem.getType());
PlayerData playerData = PlayerData.get((Player) event.getEntity().getShooter());

View File

@ -214,6 +214,7 @@ public class RecipeManager implements Reloadable {
return legacyCraftingRecipes;
}
public HashMap<NamespacedKey, MythicRecipeBlueprint> getCustomRecipes() { return customRecipes; }
public ArrayList<MythicRecipeBlueprint> getBooklessRecipes() { return booklessRecipes; }
@Nullable
ArrayList<NamespacedKey> generatedNKs;