Skip to content

Commit

Permalink
add ItemUpdateEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
MrXiaoM committed Aug 2, 2024
1 parent c9b3ce0 commit 2d51848
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 43 deletions.
60 changes: 60 additions & 0 deletions src/main/java/think/rpgitems/event/ItemUpdateEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package think.rpgitems.event;

import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import think.rpgitems.item.RPGItem;

import java.util.List;

public class ItemUpdateEvent extends Event {
private static final HandlerList handlers = new HandlerList();

public @NotNull HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Nullable
public final Player player;
@NotNull
public final RPGItem rpg;
@NotNull
public final ItemStack item;
/**
* if true, updateItem() method only update item material and lore. Modify other value is not available.
*/
public final boolean isLoreAndMaterialOnly;
@Getter
@Setter
private Material material;
@Setter
@Getter
@Nullable
private Integer customModelData;
@Getter
@Setter
private List<ItemFlag> itemFlags;
public ItemUpdateEvent(@NotNull RPGItem rpg, @Nullable Player player, @NotNull ItemStack item, boolean isLoreAndMaterialOnly, Material material, @Nullable Integer customModelData, List<ItemFlag> itemFlags) {
this.rpg = rpg;
this.player = player;
this.item = item;
this.isLoreAndMaterialOnly = isLoreAndMaterialOnly;
this.material = material;
this.customModelData = customModelData;
this.itemFlags = itemFlags;
}

public void addItemFlags(ItemFlag... flags) {
itemFlags.addAll(Lists.newArrayList(flags));
}
}
84 changes: 41 additions & 43 deletions src/main/java/think/rpgitems/item/RPGItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import think.rpgitems.commands.AdminCommands;
import think.rpgitems.data.Context;
import think.rpgitems.data.FactorModifier;
import think.rpgitems.event.ItemUpdateEvent;
import think.rpgitems.event.LoreUpdateEvent;
import think.rpgitems.power.*;
import think.rpgitems.power.cond.SlotCondition;
Expand Down Expand Up @@ -786,59 +787,60 @@ public void save(ConfigurationSection s) {
}
}


@Deprecated
public void updateItem(ItemStack item) {
updateItem(null, item, false);
}

@Deprecated
public void updateItem(ItemStack item, boolean loreOnly) {
updateItem(null, item, loreOnly);
}

public void updateItem(@Nullable Player player, ItemStack item) {
updateItem(player, item, false);
}

public void updateItem(@Nullable Player player, ItemStack item, boolean loreOnly) {
if (item == null) return;
List<String> oldLore = item.getItemMeta() == null || item.getItemMeta().getLore() == null ? new ArrayList<>() : new ArrayList<>(item.getItemMeta().getLore());
List<String> reservedLore = this.filterLores(item);
private Material getMaterial() {
if (RPGItems.protocolLibAvailable() && plugin.cfg.useProtocolLib && plugin.cfg.plAutoReplaceArmorMaterial) {
boolean n = RPGItems.isNetheriteAvailable();
switch (getItem()) {
case LEATHER_HELMET:
case IRON_HELMET:
case GOLDEN_HELMET:
case DIAMOND_HELMET:
item.setType(n ? NETHERITE_HELMET : DIAMOND_HELMET);
break;
return n ? NETHERITE_HELMET : DIAMOND_HELMET;
case LEATHER_CHESTPLATE:
case IRON_CHESTPLATE:
case GOLDEN_CHESTPLATE:
case DIAMOND_CHESTPLATE:
item.setType(n ? NETHERITE_CHESTPLATE : DIAMOND_CHESTPLATE);
break;
return n ? NETHERITE_CHESTPLATE : DIAMOND_CHESTPLATE;
case LEATHER_LEGGINGS:
case IRON_LEGGINGS:
case GOLDEN_LEGGINGS:
case DIAMOND_LEGGINGS:
item.setType(n ? NETHERITE_LEGGINGS : DIAMOND_LEGGINGS);
break;
return n ? NETHERITE_LEGGINGS : DIAMOND_LEGGINGS;
case LEATHER_BOOTS:
case IRON_BOOTS:
case GOLDEN_BOOTS:
case DIAMOND_BOOTS:
item.setType(n ? NETHERITE_BOOTS : DIAMOND_BOOTS);
break;
default:
item.setType(getItem());
break;
return n ? NETHERITE_BOOTS : DIAMOND_BOOTS;
}
} else {
item.setType(getItem());
}
return getItem();
}

@Deprecated
public void updateItem(ItemStack item) {
updateItem(null, item, false);
}

@Deprecated
public void updateItem(ItemStack item, boolean loreOnly) {
updateItem(null, item, loreOnly);
}

public void updateItem(@Nullable Player player, ItemStack item) {
updateItem(player, item, false);
}

public void updateItem(@Nullable Player player, ItemStack item, boolean loreOnly) {
if (item == null) return;
List<String> oldLore = item.getItemMeta() == null || item.getItemMeta().getLore() == null ? new ArrayList<>() : new ArrayList<>(item.getItemMeta().getLore());
List<String> reservedLore = this.filterLores(item);

Material material = getMaterial();
Integer cmd = getCustomModelData() == -1 ? null : getCustomModelData();
ItemUpdateEvent itemUpdateEvent = new ItemUpdateEvent(this, player, item, loreOnly, material, cmd, getItemFlags());
Bukkit.getPluginManager().callEvent(itemUpdateEvent);
item.setType(itemUpdateEvent.getMaterial());

ItemMeta meta = item.getItemMeta();
List<String> lore = new ArrayList<>(getLore());

Expand Down Expand Up @@ -869,10 +871,10 @@ public void updateItem(@Nullable Player player, ItemStack item, boolean loreOnly
lore.add("mcMMO Ability Tool");

lore.addAll(reservedLore);
LoreUpdateEvent event = new LoreUpdateEvent(this, player, item, oldLore, lore);
Bukkit.getPluginManager().callEvent(event);
item = event.item;
meta.setLore(event.newLore);
LoreUpdateEvent loreUpdateEvent = new LoreUpdateEvent(this, player, item, oldLore, lore);
Bukkit.getPluginManager().callEvent(loreUpdateEvent);
item = loreUpdateEvent.item;
meta.setLore(loreUpdateEvent.newLore);

//quality prefix
String qualityPrefix = plugin.cfg.qualityPrefixes.get(getQuality());
Expand Down Expand Up @@ -915,12 +917,8 @@ public void updateItem(@Nullable Player player, ItemStack item, boolean loreOnly
meta.setUnbreakable(isCustomItemModel() || hasMarker(Unbreakable.class));
meta.removeItemFlags(meta.getItemFlags().toArray(new ItemFlag[0]));

if (getCustomModelData() != -1) {
meta.setCustomModelData(customModelData);
}else{
meta.setCustomModelData(null);
}
for (ItemFlag flag : getItemFlags()) {
meta.setCustomModelData(itemUpdateEvent.getCustomModelData());
for (ItemFlag flag : itemUpdateEvent.getItemFlags()) {
meta.addItemFlags(flag);
}
if (getEnchantMode() == EnchantMode.DISALLOW) {
Expand All @@ -946,7 +944,7 @@ public void updateItem(@Nullable Player player, ItemStack item, boolean loreOnly
ItemTagUtils.setString(item, NBT_ITEM_UUID, uuid.toString());
}
}
LoreUpdateEvent.Post post = new LoreUpdateEvent.Post(event, this, item);
LoreUpdateEvent.Post post = new LoreUpdateEvent.Post(loreUpdateEvent, this, item);
Bukkit.getPluginManager().callEvent(post);
} catch (NoSuchFieldException | IllegalAccessException e) {
StringWriter sw = new StringWriter();
Expand Down

0 comments on commit 2d51848

Please sign in to comment.