9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09:27 +00:00

修正三叉戟

This commit is contained in:
XiaoMoMi
2025-06-21 19:48:54 +08:00
parent c86fdf9a39
commit d4665da307
5 changed files with 29 additions and 51 deletions

View File

@@ -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<ItemStack> wrapped = BukkitItemManager.instance().wrap(item);
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isEmpty()) return null;

View File

@@ -192,6 +192,8 @@ items#topaz_gears:
data:
item-name: <!i><#FF8C00><i18n:item.topaz_trident>
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: <!i><#FF8C00><i18n:item.topaz_trident>
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: <!i><#FF8C00><i18n:item.topaz_trident>
components:
minecraft:max_damage: 300
settings:
projectile:
item: default:topaz_trident

View File

@@ -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) {
}

View File

@@ -0,0 +1,5 @@
package net.momirealms.craftengine.core.entity.projectile;
public enum ProjectileType {
TRIDENT
}

View File

@@ -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));
}));