diff --git a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java index a99f47ee9..cf57fffe9 100644 --- a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -1,18 +1,40 @@ package com.gmail.nossr50.util; -import com.google.common.collect.ImmutableSet; import org.bukkit.metadata.FixedMetadataValue; import org.jetbrains.annotations.NotNull; -import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * Stores our constants related to metadata */ public class MetadataConstants { - /* Metadata Values - * Take great care if you ever modify the value of these keys - */ + public static final @NotNull Set MOB_METADATA_KEYS = Set.of( + MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB, + MetadataConstants.METADATA_KEY_EGG_MOB, + MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB, + MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB, + MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB, + MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB, + MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN, + MetadataConstants.METADATA_KEY_CUSTOM_NAME, + MetadataConstants.METADATA_KEY_RUPTURE, + MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE, + MetadataConstants.METADATA_KEY_OLD_NAME_KEY, + MetadataConstants.METADATA_KEY_DODGE_TRACKER + ); + + public static final @NotNull List ARROW_METADATA_KEYS = List.of( + MetadataConstants.METADATA_KEY_INF_ARROW, + MetadataConstants.METADATA_KEY_BOW_FORCE, + MetadataConstants.METADATA_KEY_ARROW_DISTANCE, + MetadataConstants.METADATA_KEY_SPAWNED_ARROW, + MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW, + MetadataConstants.METADATA_KEY_BOUNCE_COUNT, + MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE + ); + public static final @NotNull String METADATA_KEY_REPLANT = "mcMMO: Recently Replanted"; public static final @NotNull String METADATA_KEY_CROSSBOW_PROJECTILE = "mcMMO: Crossbow Projectile"; public static final @NotNull String METADATA_KEY_SPAWNED_ARROW = "mcMMO: Spawned Arrow"; @@ -23,10 +45,8 @@ public class MetadataConstants { public static final @NotNull String METADATA_KEY_DODGE_TRACKER = "mcMMO: Dodge Tracker"; public static final @NotNull String METADATA_KEY_CUSTOM_DAMAGE = "mcMMO: Custom Damage"; public static final @NotNull String METADATA_KEY_TRAVELING_BLOCK = "mcMMO: Traveling Block"; - public static final @NotNull String METADATA_KEY_PISTON_TRACKING = "mcMMO: Piston Tracking"; public static final @NotNull String METADATA_KEY_TRACKED_TNT = "mcMMO: Tracked TNT"; public static final @NotNull String METADATA_KEY_NAME_VISIBILITY = "mcMMO: Name Visibility"; - public static final @NotNull String METADATA_KEY_TRACKED_ITEM = "mcMMO: Tracked Item"; public static final @NotNull String METADATA_KEY_INF_ARROW = "mcMMO: Infinite Arrow"; public static final @NotNull String METADATA_KEY_TRACKED_ARROW = "mcMMO: Tracked Arrow"; public static final @NotNull String METADATA_KEY_BOW_FORCE = "mcMMO: Bow Force"; @@ -50,28 +70,6 @@ public class MetadataConstants { public static final @NotNull String METADATA_KEY_CUSTOM_NAME = "mcmmo_custom_name"; public static final @NotNull String METADATA_KEY_OLD_NAME_KEY = "mcmmo_old_name"; public static final @NotNull String METADATA_KEY_RUPTURE = "mcmmo_rupture"; - public static final byte SIMPLE_FLAG_VALUE = (byte) 0x1; - - public static final @NotNull ImmutableSet MOB_METADATA_KEYS; - public static FixedMetadataValue MCMMO_METADATA_VALUE; - - static { - HashSet temp = new HashSet<>(); - temp.add(MetadataConstants.METADATA_KEY_MOB_SPAWNER_MOB); - temp.add(MetadataConstants.METADATA_KEY_EGG_MOB); - temp.add(MetadataConstants.METADATA_KEY_NETHER_PORTAL_MOB); - temp.add(MetadataConstants.METADATA_KEY_COTW_SUMMONED_MOB); - temp.add(MetadataConstants.METADATA_KEY_PLAYER_BRED_MOB); - temp.add(MetadataConstants.METADATA_KEY_PLAYER_TAMED_MOB); - temp.add(MetadataConstants.METADATA_KEY_EXPLOITED_ENDERMEN); - temp.add(MetadataConstants.METADATA_KEY_CUSTOM_NAME); - temp.add(MetadataConstants.METADATA_KEY_RUPTURE); - temp.add(MetadataConstants.METADATA_KEY_EXPLOSION_FROM_RUPTURE); - temp.add(MetadataConstants.METADATA_KEY_OLD_NAME_KEY); - temp.add(MetadataConstants.METADATA_KEY_DODGE_TRACKER); - - MOB_METADATA_KEYS = ImmutableSet.copyOf(temp); - } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java b/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java index ae2fe7161..697bb2054 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java @@ -5,13 +5,16 @@ import com.gmail.nossr50.util.MetadataConstants; import org.bukkit.block.BlockFace; import org.bukkit.entity.Arrow; import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import static com.gmail.nossr50.util.MetadataConstants.ARROW_METADATA_KEYS; import static com.gmail.nossr50.util.MetadataConstants.MCMMO_METADATA_VALUE; public class ProjectileUtils { + public static Vector getNormal(BlockFace blockFace) { return switch (blockFace) { case UP -> new Vector(0, 1, 0); @@ -30,65 +33,32 @@ public class ProjectileUtils { * @param arrow projectile */ public static void cleanupProjectileMetadata(@NotNull Arrow arrow) { - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_BOUNCE_COUNT)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_BOUNCE_COUNT, mcMMO.p); - } - - if (arrow.hasMetadata(MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE)) { - arrow.removeMetadata(MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE, mcMMO.p); - } + ARROW_METADATA_KEYS.stream() + .filter(arrow::hasMetadata) + .forEach(key -> arrow.removeMetadata(key, mcMMO.p)); } - public static void copyArrowMetadata(@NotNull Plugin pluginRef, @NotNull Arrow arrowToCopy, @NotNull Arrow newArrow) { - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, - arrowToCopy.getMetadata(MetadataConstants.METADATA_KEY_INF_ARROW).get(0)); - } - - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, - new FixedMetadataValue(pluginRef, - arrowToCopy.getMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE).get(0).asDouble())); - } - - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, - arrowToCopy.getMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE).get(0)); - } - - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW, - arrowToCopy.getMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW).get(0)); - } - - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW, - arrowToCopy.getMetadata(MetadataConstants.METADATA_KEY_MULTI_SHOT_ARROW).get(0)); - } - - if (arrowToCopy.hasMetadata(MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE)) { - newArrow.setMetadata(MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE, MCMMO_METADATA_VALUE); - } + /** + * Copies metadata from one arrow to another. + * + * @param pluginRef mcMMO plugin reference. + * @param sourceArrow The arrow from which metadata is copied. + * @param targetArrow The arrow to which metadata is copied. + */ + public static void copyArrowMetadata(@NotNull Plugin pluginRef, @NotNull Arrow sourceArrow, + @NotNull Arrow targetArrow) { + ARROW_METADATA_KEYS.stream() + .filter(sourceArrow::hasMetadata) + .forEach(key -> { + final MetadataValue metadataValue = sourceArrow.getMetadata(key).get(0); + if (key.equals(MetadataConstants.METADATA_KEY_BOW_FORCE)) { + targetArrow.setMetadata(key, new FixedMetadataValue(pluginRef, metadataValue.asDouble())); + } else if (key.equals(MetadataConstants.METADATA_KEY_CROSSBOW_PROJECTILE)) { + targetArrow.setMetadata(key, MCMMO_METADATA_VALUE); + } else { + targetArrow.setMetadata(key, metadataValue); + } + }); } public static boolean isCrossbowProjectile(@NotNull Arrow arrow) {