aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server
diff options
context:
space:
mode:
authorOwen <[email protected]>2022-03-11 11:37:08 -0500
committerGitHub <[email protected]>2022-03-11 17:37:08 +0100
commit1790528a6104c7c801e02a6f6d2ec0dda70e2af9 (patch)
tree65c570a01577ca43003d3af8d224d2954962a46a /patches/server
parentd714682f8fbcf87edada17b513cf76f499c9b355 (diff)
downloadPaper-1790528a6104c7c801e02a6f6d2ec0dda70e2af9.tar.gz
Paper-1790528a6104c7c801e02a6f6d2ec0dda70e2af9.zip
More projectile API (#5731)
Diffstat (limited to 'patches/server')
-rw-r--r--patches/server/0881-More-Projectile-API.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/patches/server/0881-More-Projectile-API.patch b/patches/server/0881-More-Projectile-API.patch
new file mode 100644
index 0000000000..3a0c2d24c1
--- /dev/null
+++ b/patches/server/0881-More-Projectile-API.patch
@@ -0,0 +1,169 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <[email protected]>
+Date: Tue, 22 Jun 2021 23:41:11 -0400
+Subject: [PATCH] More Projectile API
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
+index be86114eac3975b82ca74d4d6ed3f0402a642e8a..a28178f2c2d4dda6481a58c73bada95aa95e6764 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
+@@ -14,24 +14,26 @@ import org.bukkit.inventory.meta.FireworkMeta;
+ public class CraftFirework extends CraftProjectile implements Firework {
+
+ private final Random random = new Random();
+- private final CraftItemStack item;
++ //private CraftItemStack item; // Paper - Remove usage, not accurate representation of current item.
+
+ public CraftFirework(CraftServer server, FireworkRocketEntity entity) {
+ super(server, entity);
+
+- ItemStack item = this.getHandle().getEntityData().get(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM);
+-
+- if (item.isEmpty()) {
+- item = new ItemStack(Items.FIREWORK_ROCKET);
+- this.getHandle().getEntityData().set(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM, item);
+- }
+-
+- this.item = CraftItemStack.asCraftMirror(item);
+-
+- // Ensure the item is a firework...
+- if (this.item.getType() != Material.FIREWORK_ROCKET) {
+- this.item.setType(Material.FIREWORK_ROCKET);
+- }
++// Paper Start - Expose firework item directly
++// ItemStack item = this.getHandle().getEntityData().get(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM);
++//
++// if (item.isEmpty()) {
++// item = new ItemStack(Items.FIREWORK_ROCKET);
++// this.getHandle().getEntityData().set(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM, item);
++// }
++//
++// this.item = CraftItemStack.asCraftMirror(item);
++//
++// // Ensure the item is a firework...
++// if (this.item.getType() != Material.FIREWORK_ROCKET) {
++// this.item.setType(Material.FIREWORK_ROCKET);
++// }
++ // Paper End - Expose firework item directly
+ }
+
+ @Override
+@@ -51,13 +53,13 @@ public class CraftFirework extends CraftProjectile implements Firework {
+
+ @Override
+ public FireworkMeta getFireworkMeta() {
+- return (FireworkMeta) this.item.getItemMeta();
++ return (FireworkMeta) CraftItemStack.getItemMeta(this.getHandle().getEntityData().get(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM), Material.FIREWORK_ROCKET); // Paper - Expose firework item directly
+ }
+
+ @Override
+ public void setFireworkMeta(FireworkMeta meta) {
+- this.item.setItemMeta(meta);
+
++ applyFireworkEffect(meta); // Paper - Expose firework item directly
+ // Copied from EntityFireworks constructor, update firework lifetime/power
+ this.getHandle().lifetime = 10 * (1 + meta.getPower()) + this.random.nextInt(6) + this.random.nextInt(7);
+
+@@ -91,4 +93,43 @@ public class CraftFirework extends CraftProjectile implements Firework {
+ return boostedEntity != null ? (org.bukkit.entity.LivingEntity) boostedEntity.getBukkitEntity() : null;
+ }
+ // Paper end
++ // Paper start - Expose firework item directly + manually setting flight
++ @Override
++ public org.bukkit.inventory.ItemStack getItem() {
++ return CraftItemStack.asBukkitCopy(this.getHandle().getItem());
++ }
++
++ @Override
++ public void setItem(org.bukkit.inventory.ItemStack itemStack) {
++ FireworkMeta meta = getFireworkMeta();
++ var nmsItem = itemStack == null ? ItemStack.EMPTY : CraftItemStack.asNMSCopy(itemStack);
++ this.getHandle().getEntityData().set(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM, nmsItem);
++
++ applyFireworkEffect(meta);
++ }
++
++ @Override
++ public int getTicksFlown() {
++ return this.getHandle().life;
++ }
++
++ @Override
++ public void setTicksFlown(int ticks) {
++ this.getHandle().life = ticks;
++ }
++
++ @Override
++ public int getTicksToDetonate() {
++ return this.getHandle().lifetime;
++ }
++
++ @Override
++ public void setTicksToDetonate(int ticks) {
++ this.getHandle().lifetime = ticks;
++ }
++
++ void applyFireworkEffect(FireworkMeta meta) {
++ CraftItemStack.applyMetaToItem(this.getHandle().getEntityData().get(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM), meta);
++ }
++ // Paper end - Expose firework item directly + manually setting flight
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
+index b08739dd1ffd041f0885af6c1f57dca9027763b6..aa3afdf320852e83bb530fff5616a61e33dbc30c 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
+@@ -39,11 +39,25 @@ public class CraftThrownPotion extends CraftProjectile implements ThrownPotion {
+ Validate.notNull(item, "ItemStack cannot be null.");
+
+ // The ItemStack must be a potion.
+- Validate.isTrue(item.getType() == Material.LINGERING_POTION || item.getType() == Material.SPLASH_POTION, "ItemStack must be a lingering or splash potion. This item stack was " + item.getType() + ".");
++ //Validate.isTrue(item.getType() == Material.LINGERING_POTION || item.getType() == Material.SPLASH_POTION, "ItemStack must be a lingering or splash potion. This item stack was " + item.getType() + "."); // Paper - Projectile API
++ var meta = getPotionMeta(); // Paper - Projectile API
+
+ this.getHandle().setItem(CraftItemStack.asNMSCopy(item));
++ setPotionMeta(meta); // Paper - Projectile API
+ }
+
++ // Paper start - Projectile API
++ @Override
++ public org.bukkit.inventory.meta.PotionMeta getPotionMeta() {
++ return (org.bukkit.inventory.meta.PotionMeta) CraftItemStack.getItemMeta(this.getHandle().getItemRaw(), Material.SPLASH_POTION);
++ }
++
++ @Override
++ public void setPotionMeta(org.bukkit.inventory.meta.PotionMeta meta) {
++ CraftItemStack.applyMetaToItem(this.getHandle().getItemRaw(), meta);
++ this.getHandle().setItem(this.getHandle().getItemRaw()); // Reset item
++ }
++ // Paper end
+ @Override
+ public net.minecraft.world.entity.projectile.ThrownPotion getHandle() {
+ return (net.minecraft.world.entity.projectile.ThrownPotion) entity;
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+index 14da2997b5fff4434b1fe8d5a1b3109dde143740..226d9ac01c601fc8954a88bea93a521cdce79eda 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+@@ -274,12 +274,20 @@ public final class CraftItemStack extends ItemStack {
+ public ItemMeta getItemMeta() {
+ return CraftItemStack.getItemMeta(this.handle);
+ }
++ // Paper start
++ public static void applyMetaToItem(net.minecraft.world.item.ItemStack itemStack, ItemMeta meta) {
++ ((org.bukkit.craftbukkit.inventory.CraftMetaItem) meta).applyToItem(itemStack.getOrCreateTag());
++ }
+
+ public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item) {
++ return getItemMeta(item, CraftItemStack.getType(item));
++ }
++ public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item, Material material) {
++ // Paper end
+ if (!CraftItemStack.hasItemMeta(item)) {
+- return CraftItemFactory.instance().getItemMeta(CraftItemStack.getType(item));
++ return CraftItemFactory.instance().getItemMeta(material); // Paper
+ }
+- switch (CraftItemStack.getType(item)) {
++ switch (material) { // Paper
+ case WRITTEN_BOOK:
+ return new CraftMetaBookSigned(item.getTag());
+ case WRITABLE_BOOK: