mirror of
https://github.com/BX-Team/DivineMC.git
synced 2025-12-19 14:59:25 +00:00
74 lines
4.7 KiB
Diff
74 lines
4.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com>
|
|
Date: Mon, 3 Mar 2025 01:27:13 +0300
|
|
Subject: [PATCH] Add EntityLoadsProjectileEvent
|
|
|
|
|
|
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
|
index e44c871e86711b343cf8016241e9c8a997c85fe2..03e8147e8315da36914cbbe477a556b72c97fd26 100644
|
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -4498,6 +4498,22 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
return ItemStack.EMPTY;
|
|
}
|
|
|
|
+ // DivineMC start - Add EntityLoadsProjectileEvent
|
|
+ public ItemStack getProjectile(ItemStack weapon, ItemStack projectile, Predicate<ItemStack> projectileValidator) {
|
|
+ var event = new org.bxteam.divinemc.event.entity.EntityLoadsProjectileEvent(
|
|
+ getBukkitLivingEntity(),
|
|
+ weapon.asBukkitMirror(),
|
|
+ projectile.asBukkitMirror(),
|
|
+ bukkitItem -> projectileValidator.test(CraftItemStack.asNMSCopy(bukkitItem))
|
|
+ );
|
|
+ event.callEvent();
|
|
+ var item = event.getProjectile();
|
|
+ if (item.isEmpty()) return ItemStack.EMPTY;
|
|
+
|
|
+ return item instanceof CraftItemStack craftItem && craftItem.handle != null ? craftItem.handle : CraftItemStack.asNMSCopy(item);
|
|
+ }
|
|
+ // DivineMC end - Add EntityLoadsProjectileEvent
|
|
+
|
|
public static byte entityEventForEquipmentBreak(EquipmentSlot slot) {
|
|
return switch (slot) {
|
|
case MAINHAND -> 47;
|
|
diff --git a/net/minecraft/world/entity/monster/Monster.java b/net/minecraft/world/entity/monster/Monster.java
|
|
index c1ebb74b0d4a8e2eb8880ccaf20f0f9bc1940094..8d08fca5d0e234dfc10abb8538483d89789ac617 100644
|
|
--- a/net/minecraft/world/entity/monster/Monster.java
|
|
+++ b/net/minecraft/world/entity/monster/Monster.java
|
|
@@ -147,7 +147,7 @@ public abstract class Monster extends PathfinderMob implements Enemy {
|
|
if (shootable.getItem() instanceof ProjectileWeaponItem) {
|
|
Predicate<ItemStack> supportedHeldProjectiles = ((ProjectileWeaponItem)shootable.getItem()).getSupportedHeldProjectiles();
|
|
ItemStack heldProjectile = ProjectileWeaponItem.getHeldProjectile(this, supportedHeldProjectiles);
|
|
- return heldProjectile.isEmpty() ? new ItemStack(Items.ARROW) : heldProjectile;
|
|
+ return getProjectile(shootable, heldProjectile.isEmpty() ? new ItemStack(Items.ARROW) : heldProjectile, supportedHeldProjectiles); // DivineMC - Add EntityLoadsProjectileEvent
|
|
} else {
|
|
return ItemStack.EMPTY;
|
|
}
|
|
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
|
index 3572874d755bd0ceff8811634adf99b8c9fabfb1..27eae556fb3f83a729a7f7859347bedd7cfe7257 100644
|
|
--- a/net/minecraft/world/entity/player/Player.java
|
|
+++ b/net/minecraft/world/entity/player/Player.java
|
|
@@ -2311,19 +2311,19 @@ public abstract class Player extends LivingEntity {
|
|
Predicate<ItemStack> supportedHeldProjectiles = ((ProjectileWeaponItem)shootable.getItem()).getSupportedHeldProjectiles().and(item -> this.tryReadyArrow(shootable, item, anyEventCancelled)); // Paper - PlayerReadyArrowEvent
|
|
ItemStack heldProjectile = ProjectileWeaponItem.getHeldProjectile(this, supportedHeldProjectiles);
|
|
if (!heldProjectile.isEmpty()) {
|
|
- return heldProjectile;
|
|
+ return getProjectile(shootable, heldProjectile, supportedHeldProjectiles); // DivineMC - Add EntityLoadsProjectileEvent
|
|
} else {
|
|
supportedHeldProjectiles = ((ProjectileWeaponItem)shootable.getItem()).getAllSupportedProjectiles().and(item -> this.tryReadyArrow(shootable, item, anyEventCancelled)); // Paper - PlayerReadyArrowEvent
|
|
|
|
for (int i = 0; i < this.inventory.getContainerSize(); i++) {
|
|
ItemStack item = this.inventory.getItem(i);
|
|
if (supportedHeldProjectiles.test(item)) {
|
|
- return item;
|
|
+ return getProjectile(shootable, item, supportedHeldProjectiles); // DivineMC - Add EntityLoadsProjectileEvent
|
|
}
|
|
}
|
|
|
|
if (anyEventCancelled.booleanValue() && !this.abilities.instabuild && this instanceof final ServerPlayer player) this.resyncUsingItem(player); // Paper - resync if no item matched the Predicate
|
|
- return this.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY;
|
|
+ return getProjectile(shootable, this.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY, supportedHeldProjectiles); // DivineMC - Add EntityLoadsProjectileEvent
|
|
}
|
|
}
|
|
}
|