diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java index 4ce2fbe2a..2926a4f98 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/projectile/BukkitProjectileManager.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.bukkit.entity.projectile; import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; -import com.destroystokyo.paper.event.player.PlayerReadyArrowEvent; import io.papermc.paper.event.player.PlayerStopUsingItemEvent; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; @@ -10,14 +9,15 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.scheduler.impl.FoliaTask; import net.momirealms.craftengine.bukkit.util.ParticleUtils; -import net.momirealms.craftengine.core.entity.projectile.CustomProjectile; import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; +import net.momirealms.craftengine.core.entity.projectile.ProjectileType; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; @@ -26,6 +26,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.world.EntitiesLoadEvent; import org.bukkit.inventory.ItemStack; @@ -123,10 +124,9 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { } @EventHandler - public void onPlayerInteract(PlayerItemConsumeEvent event) { - String type = getType(event.getItem()); - if (type == null) return; - if (type.equals("bow") || type.equals("trident")) { + public void onPlayerConsume(PlayerItemConsumeEvent event) { + ProjectileType type = getCustomProjectileType(event.getItem()); + if (type == ProjectileType.TRIDENT) { event.setCancelled(true); } } @@ -134,23 +134,21 @@ public class BukkitProjectileManager implements Listener, ProjectileManager { @EventHandler public void onPlayerStopUsingItem(PlayerStopUsingItemEvent event) { ItemStack item = event.getItem(); - String type = getType(item); + ProjectileType type = getCustomProjectileType(item); if (type == null) return; int ticksHeldFor = event.getTicksHeldFor(); Player player = event.getPlayer(); - if (type.equals("trident")) { + if (type == ProjectileType.TRIDENT) { if (ticksHeldFor < 10) return; Object nmsItemStack = FastNMS.INSTANCE.field$CraftItemStack$handle(item); Object nmsServerLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(player.getWorld()); Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(player); TridentRelease.releaseUsing(nmsItemStack, nmsServerLevel, nmsEntity); - } else if (type.equals("bow")) { - if (ticksHeldFor < 3) return; } } @Nullable - private String getType(ItemStack item) { + private ProjectileType getCustomProjectileType(ItemStack item) { Item wrapped = BukkitItemManager.instance().wrap(item); Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) return null; diff --git a/common-files/src/main/resources/resources/default/configuration/items.yml b/common-files/src/main/resources/resources/default/configuration/items.yml index 029af08c9..e7cc052ca 100644 --- a/common-files/src/main/resources/resources/default/configuration/items.yml +++ b/common-files/src/main/resources/resources/default/configuration/items.yml @@ -192,6 +192,8 @@ items#topaz_gears: data: item-name: <#FF8C00> tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 300 model: type: minecraft:select property: minecraft:display_context @@ -222,50 +224,15 @@ items#topaz_gears: - path: minecraft:item/custom/topaz_trident_throwing predicate: throwing: 1 - $$1.21.2~1.21.3#topaz_trident: - default:topaz_trident: - material: honey_bottle - custom-model-data: 1000 - settings: - projectile: - item: default:topaz_trident - translation: 0,0,0 - rotation: 1,1,1,1 - display-transform: NONE - scale: 0.5 - type: trident - throwing-item-in-hand: default:topaz_trident_throwing_in_hand - tags: - - default:topaz_tools - data: - item-name: <#FF8C00> - tooltip-style: minecraft:topaz - components: - minecraft:max_stack_size: 1 - minecraft:consumable: - animation: spear - has_consume_particles: false - consume_seconds: 128000 - minecraft:food: - nutrition: 0 - saturation: 0.0 - can_always_eat: true - model: - type: minecraft:model - path: minecraft:item/custom/topaz_trident_in_hand - default:topaz_trident_throwing_in_hand: - material: honey_bottle - custom-model-data: 1001 - model: - type: minecraft:model - path: minecraft:item/custom/topaz_trident_throwing - $$1.20.1~1.21.1#topaz_trident: + $$1.20.1~1.21.3#topaz_trident: default:topaz_trident: material: trident client-bound-material: bow custom-model-data: 1001 data: item-name: <#FF8C00> + components: + minecraft:max_damage: 300 settings: projectile: item: default:topaz_trident diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java index b2eebf6c1..b8fdd6628 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileMeta.java @@ -2,8 +2,15 @@ package net.momirealms.craftengine.core.entity.projectile; import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; -public record ProjectileMeta(Key item, ItemDisplayContext displayType, Vector3f scale, Vector3f translation, Quaternionf rotation, double range, String type) { +public record ProjectileMeta(Key item, + ItemDisplayContext displayType, + Vector3f scale, + Vector3f translation, + Quaternionf rotation, + double range, + @Nullable ProjectileType type) { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileType.java b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileType.java new file mode 100644 index 000000000..0c0e1d5ed --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/projectile/ProjectileType.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.core.entity.projectile; + +public enum ProjectileType { + TRIDENT +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index bb4f1d20c..629f0422b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; +import net.momirealms.craftengine.core.entity.projectile.ProjectileType; import net.momirealms.craftengine.core.item.modifier.EquippableModifier; import net.momirealms.craftengine.core.item.modifier.FoodModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; @@ -326,7 +327,7 @@ public class ItemSettings { Vector3f translation = MiscUtils.getAsVector3f(args.getOrDefault("translation", "0"), "translation"); Vector3f scale = MiscUtils.getAsVector3f(args.getOrDefault("scale", "1"), "scale"); Quaternionf rotation = MiscUtils.getAsQuaternionf(ResourceConfigUtils.get(args, "rotation-left", "rotation"), "rotation-left"); - String type = args.getOrDefault("type", "none").toString(); + ProjectileType type = Optional.ofNullable(args.get("type")).map(String::valueOf).map(it -> ProjectileType.valueOf(it.toUpperCase(Locale.ENGLISH))).orElse(null); double range = ResourceConfigUtils.getAsDouble(args.getOrDefault("range", 1), "range"); return settings -> settings.projectileMeta(new ProjectileMeta(customTridentItemId, displayType, scale, translation, rotation, range, type)); }));