mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-03 23:07:40 +01:00
efb91589dc
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: e2160a18 Make MapCursor#type not depends on deprecated values CraftBukkit Changes: 6ce172642 SPIGOT-7761: Ender pearl does not damage or spawn endermites f5a63f734 SPIGOT-7759: Chunk not there when requested in ChunkUnloadEvent 28287259c Remove unused import eb9a7dde0 SPIGOT-7757: Cannot set item in Stonecutter Inventory f8be9d752 Move deserialized removed unhandled tags to dedicated removedTags a7e576186 Fix potential mutability issue with CraftMetaItem copy constructor 995885452 SPIGOT-7741: Vanilla ItemComponent in commands can't remove components 9ef69aa0b PR-1284: Move ItemType <-> ItemMeta linking to a centralized place 3e82eafbe PR-1420: Fix DirectEntity and CausingEntity Damager for Creepers ignited by Player c23daa71f SPIGOT-7751: Fix crash caused by arrows from trial spawners Make MapCursor#type not depends on deprecated values SPIGOT-7761: Ender pearl does not damage or spawn endermites
770 lines
39 KiB
Diff
770 lines
39 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|
Date: Tue, 22 Jun 2021 23:41:11 -0400
|
|
Subject: [PATCH] More Projectile API
|
|
|
|
== AT ==
|
|
public net.minecraft.world.entity.projectile.FishingHook timeUntilLured
|
|
public net.minecraft.world.entity.projectile.FishingHook fishAngle
|
|
public net.minecraft.world.entity.projectile.ShulkerBullet targetDeltaX
|
|
public net.minecraft.world.entity.projectile.ShulkerBullet targetDeltaY
|
|
public net.minecraft.world.entity.projectile.ShulkerBullet targetDeltaZ
|
|
public net.minecraft.world.entity.projectile.ShulkerBullet currentMoveDirection
|
|
public net.minecraft.world.entity.projectile.ShulkerBullet flightSteps
|
|
public net.minecraft.world.entity.projectile.AbstractArrow soundEvent
|
|
public net/minecraft/world/entity/projectile/AbstractArrow setPickupItemStack(Lnet/minecraft/world/item/ItemStack;)V
|
|
public net.minecraft.world.entity.projectile.ThrownTrident dealtDamage
|
|
public net.minecraft.world.entity.projectile.Arrow NO_EFFECT_COLOR
|
|
public net.minecraft.world.entity.projectile.Projectile hasBeenShot
|
|
public net.minecraft.world.entity.projectile.Projectile leftOwner
|
|
public net.minecraft.world.entity.projectile.Projectile preOnHit(Lnet/minecraft/world/phys/HitResult;)V
|
|
public net.minecraft.world.entity.projectile.Projectile canHitEntity(Lnet/minecraft/world/entity/Entity;)Z
|
|
public net.minecraft.world.entity.projectile.FireworkRocketEntity getDefaultItem()Lnet/minecraft/world/item/ItemStack;
|
|
|
|
Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>
|
|
Co-authored-by: SoSeDiK <mrsosedik@gmail.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java
|
|
@@ -0,0 +0,0 @@ public class FishingHook extends Projectile {
|
|
}
|
|
} else {
|
|
// CraftBukkit start - logic to modify fishing wait time
|
|
- this.timeUntilLured = Mth.nextInt(this.random, this.minWaitTime, this.maxWaitTime);
|
|
- this.timeUntilLured -= (this.applyLure) ? (this.lureSpeed >= this.maxWaitTime ? this.timeUntilLured - 1 : this.lureSpeed ) : 0; // Paper - Fix Lure infinite loop
|
|
+ this.resetTimeUntilLured(); // Paper - more projectile api - extract time until lured reset logic
|
|
// CraftBukkit end
|
|
}
|
|
}
|
|
|
|
}
|
|
+ // Paper start - more projectile api - extract time until lured reset logic
|
|
+ public void resetTimeUntilLured() {
|
|
+ this.timeUntilLured = Mth.nextInt(this.random, this.minWaitTime, this.maxWaitTime);
|
|
+ this.timeUntilLured -= (this.applyLure) ? (this.lureSpeed >= this.maxWaitTime ? this.timeUntilLured - 1 : this.lureSpeed ) : 0; // Paper - Fix Lure infinite loop
|
|
+ }
|
|
+ // Paper end - more projectile api - extract time until lured reset logic
|
|
|
|
public boolean calculateOpenWater(BlockPos pos) {
|
|
FishingHook.OpenWaterType entityfishinghook_waterposition = FishingHook.OpenWaterType.INVALID;
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
|
|
@@ -0,0 +0,0 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
|
}
|
|
|
|
// CraftBukkit start - call projectile hit event
|
|
- protected ProjectileDeflection preHitTargetOrDeflectSelf(HitResult movingobjectposition) {
|
|
+ public ProjectileDeflection preHitTargetOrDeflectSelf(HitResult movingobjectposition) { // Paper - protected -> public
|
|
org.bukkit.event.entity.ProjectileHitEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition);
|
|
this.hitCancelled = event != null && event.isCancelled();
|
|
if (movingobjectposition.getType() == HitResult.Type.BLOCK || !this.hitCancelled) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
|
|
@@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie
|
|
@Override
|
|
protected void onHit(HitResult hitResult) {
|
|
super.onHit(hitResult);
|
|
+ // Paper start - More projectile API
|
|
+ this.splash(hitResult);
|
|
+ }
|
|
+ public void splash(@Nullable HitResult hitResult) {
|
|
+ // Paper end - More projectile API
|
|
if (!this.level().isClientSide) {
|
|
ItemStack itemstack = this.getItem();
|
|
PotionContents potioncontents = (PotionContents) itemstack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY);
|
|
@@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie
|
|
if (this.isLingering()) {
|
|
showParticles = this.makeAreaOfEffectCloud(potioncontents, hitResult); // CraftBukkit - Pass MovingObjectPosition // Paper
|
|
} else {
|
|
- showParticles = this.applySplash(potioncontents.getAllEffects(), hitResult.getType() == HitResult.Type.ENTITY ? ((EntityHitResult) hitResult).getEntity() : null, hitResult); // CraftBukkit - Pass MovingObjectPosition // Paper
|
|
+ showParticles = this.applySplash(potioncontents.getAllEffects(), hitResult != null && hitResult.getType() == HitResult.Type.ENTITY ? ((EntityHitResult) hitResult).getEntity() : null, hitResult); // CraftBukkit - Pass MovingObjectPosition // Paper - More projectile API
|
|
}
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie
|
|
|
|
}
|
|
|
|
- private boolean applySplash(Iterable<MobEffectInstance> iterable, @Nullable Entity entity, HitResult position) { // CraftBukkit - Pass MovingObjectPosition // Paper - Fix potions splash events
|
|
+ private boolean applySplash(Iterable<MobEffectInstance> iterable, @Nullable Entity entity, @Nullable HitResult position) { // CraftBukkit - Pass MovingObjectPosition // Paper - Fix potions splash events & More projectile API
|
|
AABB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D);
|
|
List<net.minecraft.world.entity.LivingEntity> list = this.level().getEntitiesOfClass(net.minecraft.world.entity.LivingEntity.class, axisalignedbb);
|
|
Map<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>(); // CraftBukkit
|
|
@@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie
|
|
|
|
}
|
|
|
|
- private boolean makeAreaOfEffectCloud(PotionContents potioncontents, HitResult position) { // CraftBukkit - Pass MovingObjectPosition
|
|
+ private boolean makeAreaOfEffectCloud(PotionContents potioncontents, @Nullable HitResult position) { // CraftBukkit - Pass MovingObjectPosition // Paper - More projectile API
|
|
AreaEffectCloud entityareaeffectcloud = new AreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ());
|
|
Entity entity = this.getOwner();
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti
|
|
@Override
|
|
public void setBounce(boolean doesBounce) {}
|
|
|
|
+ // Paper start - More projectile API
|
|
+ @Override
|
|
+ public boolean hasLeftShooter() {
|
|
+ return this.getHandle().leftOwner;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setHasLeftShooter(boolean leftShooter) {
|
|
+ this.getHandle().leftOwner = leftShooter;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean hasBeenShot() {
|
|
+ return this.getHandle().hasBeenShot;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setHasBeenShot(boolean beenShot) {
|
|
+ this.getHandle().hasBeenShot = beenShot;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean canHitEntity(org.bukkit.entity.Entity entity) {
|
|
+ return this.getHandle().canHitEntity(((CraftEntity) entity).getHandle());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void hitEntity(org.bukkit.entity.Entity entity) {
|
|
+ this.getHandle().preHitTargetOrDeflectSelf(new net.minecraft.world.phys.EntityHitResult(((CraftEntity) entity).getHandle()));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void hitEntity(org.bukkit.entity.Entity entity, org.bukkit.util.Vector vector) {
|
|
+ this.getHandle().preHitTargetOrDeflectSelf(new net.minecraft.world.phys.EntityHitResult(((CraftEntity) entity).getHandle(), new net.minecraft.world.phys.Vec3(vector.getX(), vector.getY(), vector.getZ())));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public net.minecraft.world.entity.projectile.Projectile getHandle() {
|
|
+ return (net.minecraft.world.entity.projectile.Projectile) entity;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public final org.bukkit.projectiles.ProjectileSource getShooter() {
|
|
+ return this.getHandle().projectileSource;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public final void setShooter(org.bukkit.projectiles.ProjectileSource shooter) {
|
|
+ if (shooter instanceof CraftEntity craftEntity) {
|
|
+ this.getHandle().setOwner(craftEntity.getHandle());
|
|
+ } else {
|
|
+ this.getHandle().setOwner(null);
|
|
+ }
|
|
+ this.getHandle().projectileSource = shooter;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public java.util.UUID getOwnerUniqueId() {
|
|
+ return this.getHandle().ownerUUID;
|
|
+ }
|
|
+ // Paper end - More projectile API
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java
|
|
@@ -0,0 +0,0 @@ public class CraftAbstractArrow extends AbstractProjectile implements AbstractAr
|
|
this.getHandle().setCritArrow(critical);
|
|
}
|
|
|
|
- @Override
|
|
- public ProjectileSource getShooter() {
|
|
- return this.getHandle().projectileSource;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setShooter(ProjectileSource shooter) {
|
|
- if (shooter instanceof Entity) {
|
|
- this.getHandle().setOwner(((CraftEntity) shooter).getHandle());
|
|
- } else {
|
|
- this.getHandle().setOwner(null);
|
|
- }
|
|
- this.getHandle().projectileSource = shooter;
|
|
- }
|
|
+ // Paper - moved to AbstractProjectile
|
|
|
|
@Override
|
|
public boolean isInBlock() {
|
|
@@ -0,0 +0,0 @@ public class CraftAbstractArrow extends AbstractProjectile implements AbstractAr
|
|
public String toString() {
|
|
return "CraftArrow";
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public CraftItemStack getItemStack() {
|
|
+ return CraftItemStack.asCraftMirror(this.getHandle().getPickupItem());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setItemStack(final ItemStack stack) {
|
|
+ Preconditions.checkArgument(stack != null, "ItemStack cannot be null");
|
|
+ this.getHandle().setPickupItemStack(CraftItemStack.asNMSCopy(stack));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setLifetimeTicks(int ticks) {
|
|
+ this.getHandle().life = ticks;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int getLifetimeTicks() {
|
|
+ return this.getHandle().life;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public org.bukkit.Sound getHitSound() {
|
|
+ return org.bukkit.craftbukkit.CraftSound.minecraftToBukkit(this.getHandle().soundEvent);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setHitSound(org.bukkit.Sound sound) {
|
|
+ this.getHandle().setSoundEvent(org.bukkit.craftbukkit.CraftSound.bukkitToMinecraft(sound));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
|
|
@@ -0,0 +0,0 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud
|
|
|
|
@Override
|
|
public Color getColor() {
|
|
- return Color.fromRGB(this.getHandle().potionContents.getColor());
|
|
+ return Color.fromRGB(this.getHandle().potionContents.getColor() & 0x00FFFFFF); // Paper - skip alpha channel
|
|
}
|
|
|
|
@Override
|
|
@@ -0,0 +0,0 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud
|
|
this.removeCustomEffect(effect.getType());
|
|
}
|
|
this.getHandle().addEffect(CraftPotionUtil.fromBukkit(effect));
|
|
- this.getHandle().updateColor();
|
|
+ // this.getHandle().updateColor(); // Paper - already done above
|
|
return true;
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud
|
|
public void clearCustomEffects() {
|
|
PotionContents old = this.getHandle().potionContents;
|
|
this.getHandle().setPotionContents(new PotionContents(old.potion(), old.customColor(), List.of()));
|
|
- this.getHandle().updateColor();
|
|
+ // this.getHandle().updateColor(); // Paper - already done above
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
|
|
@@ -0,0 +0,0 @@ public class CraftArrow extends CraftAbstractArrow implements Arrow {
|
|
this.removeCustomEffect(effect.getType());
|
|
}
|
|
this.getHandle().addEffect(CraftPotionUtil.fromBukkit(effect));
|
|
- this.getHandle().updateColor();
|
|
+ // this.getHandle().updateColor(); // Paper - already done above
|
|
return true;
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ public class CraftArrow extends CraftAbstractArrow implements Arrow {
|
|
public void clearCustomEffects() {
|
|
PotionContents old = this.getHandle().getPotionContents();
|
|
this.getHandle().setPotionContents(new PotionContents(old.potion(), old.customColor(), List.of()));
|
|
- this.getHandle().updateColor();
|
|
+ // this.getHandle().updateColor(); // Paper - already done above
|
|
}
|
|
|
|
@Override
|
|
@@ -0,0 +0,0 @@ public class CraftArrow extends CraftAbstractArrow implements Arrow {
|
|
|
|
@Override
|
|
public void setColor(Color color) {
|
|
- int colorRGB = (color == null) ? -1 : color.asRGB();
|
|
+ int colorRGB = (color == null) ? net.minecraft.world.entity.projectile.Arrow.NO_EFFECT_COLOR : color.asARGB(); // Paper
|
|
PotionContents old = this.getHandle().getPotionContents();
|
|
this.getHandle().setPotionContents(new PotionContents(old.potion(), Optional.of(colorRGB), old.customEffects()));
|
|
}
|
|
|
|
@Override
|
|
public Color getColor() {
|
|
- if (this.getHandle().getColor() <= -1) {
|
|
+ int color = this.getHandle().getColor(); // Paper
|
|
+ if (color == net.minecraft.world.entity.projectile.Arrow.NO_EFFECT_COLOR) { // Paper
|
|
return null;
|
|
}
|
|
- return Color.fromRGB(this.getHandle().getColor());
|
|
+ return Color.fromARGB(color); // Paper
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
|
|
@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
|
|
BlockPos pos = BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z());
|
|
return new FallingBlockEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), spawnData.world().getBlockState(pos)); // Paper - create falling block entities correctly
|
|
}));
|
|
- register(new EntityTypeData<>(EntityType.FIREWORK_ROCKET, Firework.class, CraftFirework::new, spawnData -> new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), net.minecraft.world.item.ItemStack.EMPTY)));
|
|
+ register(new EntityTypeData<>(EntityType.FIREWORK_ROCKET, Firework.class, CraftFirework::new, spawnData -> new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), FireworkRocketEntity.getDefaultItem()))); // Paper - pass correct default to rocket for data storage
|
|
register(new EntityTypeData<>(EntityType.EVOKER_FANGS, EvokerFangs.class, CraftEvokerFangs::new, spawnData -> new net.minecraft.world.entity.projectile.EvokerFangs(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), (float) Math.toRadians(spawnData.yaw()), 0, null)));
|
|
register(new EntityTypeData<>(EntityType.COMMAND_BLOCK_MINECART, CommandMinecart.class, CraftMinecartCommand::new, spawnData -> new MinecartCommandBlock(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
|
|
register(new EntityTypeData<>(EntityType.MINECART, RideableMinecart.class, CraftMinecartRideable::new, spawnData -> new Minecart(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java
|
|
@@ -0,0 +0,0 @@ public class CraftFireball extends AbstractProjectile implements Fireball {
|
|
this.getHandle().bukkitYield = yield;
|
|
}
|
|
|
|
- @Override
|
|
- public ProjectileSource getShooter() {
|
|
- return this.getHandle().projectileSource;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setShooter(ProjectileSource shooter) {
|
|
- if (shooter instanceof CraftLivingEntity) {
|
|
- this.getHandle().setOwner(((CraftLivingEntity) shooter).getHandle());
|
|
- } else {
|
|
- this.getHandle().setOwner(null);
|
|
- }
|
|
- this.getHandle().projectileSource = shooter;
|
|
- }
|
|
+ // Paper - moved to AbstractProjectile
|
|
|
|
@Override
|
|
public Vector getDirection() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
|
|
@@ -0,0 +0,0 @@ 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
|
|
@@ -0,0 +0,0 @@ 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), org.bukkit.inventory.ItemType.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);
|
|
@@ -0,0 +0,0 @@ public class CraftFirework extends CraftProjectile implements Firework {
|
|
return getHandle().spawningEntity;
|
|
}
|
|
// 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();
|
|
+ ItemStack nmsItem = itemStack == null ? FireworkRocketEntity.getDefaultItem() : 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) {
|
|
+ ItemStack item = this.getHandle().getItem();
|
|
+ CraftItemStack.applyMetaToItem(item, meta);
|
|
+
|
|
+ this.getHandle().getEntityData().set(FireworkRocketEntity.DATA_ID_FIREWORKS_ITEM, item);
|
|
+ }
|
|
+ // Paper end - Expose firework item directly + manually setting flight
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
|
|
@@ -0,0 +0,0 @@ public class CraftFishHook extends CraftProjectile implements FishHook {
|
|
public HookState getState() {
|
|
return HookState.values()[this.getHandle().currentState.ordinal()];
|
|
}
|
|
+ // Paper start - More FishHook API
|
|
+ @Override
|
|
+ public int getWaitTime() {
|
|
+ return this.getHandle().timeUntilLured;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setWaitTime(int ticks) {
|
|
+ this.getHandle().timeUntilLured = ticks;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int getTimeUntilBite() {
|
|
+ return this.getHandle().timeUntilHooked;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setTimeUntilBite(final int ticks) {
|
|
+ com.google.common.base.Preconditions.checkArgument(ticks >= 1, "Cannot set time until bite to less than 1 (%s<1)", ticks);
|
|
+ final FishingHook hook = this.getHandle();
|
|
+
|
|
+ // Reset the fish angle hook only when this call "enters" the fish into the lure stage.
|
|
+ final boolean alreadyInLuringPhase = hook.timeUntilHooked > 0 && hook.timeUntilLured <= 0;
|
|
+ if (!alreadyInLuringPhase) {
|
|
+ hook.fishAngle = net.minecraft.util.Mth.nextFloat(hook.random, hook.minLureAngle, hook.maxLureAngle);
|
|
+ hook.timeUntilLured = 0;
|
|
+ }
|
|
+
|
|
+ hook.timeUntilHooked = ticks;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void resetFishingState() {
|
|
+ final FishingHook hook = this.getHandle();
|
|
+ hook.resetTimeUntilLured();
|
|
+ hook.timeUntilHooked = 0; // Reset time until hooked, will be repopulated once lured time is ticked down.
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|
} else if (Firework.class.isAssignableFrom(projectile)) {
|
|
Location location = this.getEyeLocation();
|
|
|
|
- launch = new FireworkRocketEntity(world, net.minecraft.world.item.ItemStack.EMPTY, this.getHandle());
|
|
+ launch = new FireworkRocketEntity(world, FireworkRocketEntity.getDefaultItem(), this.getHandle()); // Paper - pass correct default to rocket for data storage
|
|
launch.moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java
|
|
@@ -0,0 +0,0 @@ public class CraftLlamaSpit extends AbstractProjectile implements LlamaSpit {
|
|
return "CraftLlamaSpit";
|
|
}
|
|
|
|
- @Override
|
|
- public ProjectileSource getShooter() {
|
|
- return (this.getHandle().getOwner() != null) ? (ProjectileSource) this.getHandle().getOwner().getBukkitEntity() : null;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setShooter(ProjectileSource source) {
|
|
- this.getHandle().setOwner((source != null) ? ((CraftLivingEntity) source).getHandle() : null);
|
|
- }
|
|
+ // Paper - moved to AbstractProjectile
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
|
|
@@ -0,0 +0,0 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj
|
|
super(server, entity);
|
|
}
|
|
|
|
- @Override
|
|
- public ProjectileSource getShooter() {
|
|
- return this.getHandle().projectileSource;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setShooter(ProjectileSource shooter) {
|
|
- if (shooter instanceof CraftLivingEntity) {
|
|
- this.getHandle().setOwner((LivingEntity) ((CraftLivingEntity) shooter).entity);
|
|
- } else {
|
|
- this.getHandle().setOwner(null);
|
|
- }
|
|
- this.getHandle().projectileSource = shooter;
|
|
- }
|
|
+ // Paper - moved to AbstractProjectile
|
|
|
|
@Override
|
|
public net.minecraft.world.entity.projectile.Projectile getHandle() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java
|
|
@@ -0,0 +0,0 @@ public class CraftShulkerBullet extends AbstractProjectile implements ShulkerBul
|
|
super(server, entity);
|
|
}
|
|
|
|
- @Override
|
|
- public ProjectileSource getShooter() {
|
|
- return this.getHandle().projectileSource;
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void setShooter(ProjectileSource shooter) {
|
|
- if (shooter instanceof Entity) {
|
|
- this.getHandle().setOwner(((CraftEntity) shooter).getHandle());
|
|
- } else {
|
|
- this.getHandle().setOwner(null);
|
|
- }
|
|
- this.getHandle().projectileSource = shooter;
|
|
- }
|
|
+ // Paper - moved to AbstractProjectile
|
|
|
|
@Override
|
|
public org.bukkit.entity.Entity getTarget() {
|
|
@@ -0,0 +0,0 @@ public class CraftShulkerBullet extends AbstractProjectile implements ShulkerBul
|
|
this.getHandle().setTarget(target == null ? null : ((CraftEntity) target).getHandle());
|
|
}
|
|
|
|
+ @Override
|
|
+ public org.bukkit.util.Vector getTargetDelta() {
|
|
+ net.minecraft.world.entity.projectile.ShulkerBullet bullet = this.getHandle();
|
|
+ return new org.bukkit.util.Vector(bullet.targetDeltaX, bullet.targetDeltaY, bullet.targetDeltaZ);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setTargetDelta(org.bukkit.util.Vector vector) {
|
|
+ net.minecraft.world.entity.projectile.ShulkerBullet bullet = this.getHandle();
|
|
+ bullet.targetDeltaX = vector.getX();
|
|
+ bullet.targetDeltaY = vector.getY();
|
|
+ bullet.targetDeltaZ = vector.getZ();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public org.bukkit.block.BlockFace getCurrentMovementDirection() {
|
|
+ return org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(this.getHandle().currentMoveDirection);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setCurrentMovementDirection(org.bukkit.block.BlockFace movementDirection) {
|
|
+ this.getHandle().currentMoveDirection = org.bukkit.craftbukkit.block.CraftBlock.blockFaceToNotch(movementDirection);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int getFlightSteps() {
|
|
+ return this.getHandle().flightSteps;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setFlightSteps(int steps) {
|
|
+ this.getHandle().flightSteps = steps;
|
|
+ }
|
|
+
|
|
@Override
|
|
public String toString() {
|
|
return "CraftShulkerBullet";
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java
|
|
@@ -0,0 +0,0 @@ public class CraftThrownPotion extends CraftThrowableProjectile implements Throw
|
|
@Override
|
|
public void setItem(ItemStack item) {
|
|
Preconditions.checkArgument(item != null, "ItemStack cannot be null");
|
|
- Preconditions.checkArgument(item.getType() == Material.LINGERING_POTION || item.getType() == Material.SPLASH_POTION, "ItemStack material must be Material.LINGERING_POTION or Material.SPLASH_POTION but was Material.%s", item.getType());
|
|
+ // Preconditions.checkArgument(item.getType() == Material.LINGERING_POTION || item.getType() == Material.SPLASH_POTION, "ItemStack material must be Material.LINGERING_POTION or Material.SPLASH_POTION but was Material.%s", item.getType()); // Paper - Projectile API
|
|
+ org.bukkit.inventory.meta.PotionMeta meta = (item.getType() == Material.LINGERING_POTION || item.getType() == Material.SPLASH_POTION) ? null : this.getPotionMeta(); // Paper - Projectile API
|
|
|
|
this.getHandle().setItem(CraftItemStack.asNMSCopy(item));
|
|
+ if (meta != null) this.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().getItem(), org.bukkit.inventory.ItemType.SPLASH_POTION);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setPotionMeta(org.bukkit.inventory.meta.PotionMeta meta) {
|
|
+ net.minecraft.world.item.ItemStack item = this.getHandle().getItem();
|
|
+ CraftItemStack.applyMetaToItem(item, meta);
|
|
+ this.getHandle().setItem(item); // Reset item
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void splash() {
|
|
+ this.getHandle().splash(null);
|
|
+ }
|
|
+ // Paper end
|
|
@Override
|
|
public net.minecraft.world.entity.projectile.ThrownPotion getHandle() {
|
|
return (net.minecraft.world.entity.projectile.ThrownPotion) this.entity;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
|
|
@@ -0,0 +0,0 @@ public class CraftTrident extends CraftAbstractArrow implements Trident {
|
|
com.google.common.base.Preconditions.checkArgument(loyaltyLevel >= 0 && loyaltyLevel <= 127, "The loyalty level has to be between 0 and 127");
|
|
this.getHandle().setLoyalty((byte) loyaltyLevel);
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public boolean hasDealtDamage() {
|
|
+ return this.getHandle().dealtDamage;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setHasDealtDamage(boolean hasDealtDamage) {
|
|
+ this.getHandle().dealtDamage = hasDealtDamage;
|
|
+ }
|
|
// Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -0,0 +0,0 @@ public class CraftEventFactory {
|
|
/**
|
|
* PotionSplashEvent
|
|
*/
|
|
- public static PotionSplashEvent callPotionSplashEvent(net.minecraft.world.entity.projectile.ThrownPotion potion, HitResult position, Map<LivingEntity, Double> affectedEntities) {
|
|
+ public static PotionSplashEvent callPotionSplashEvent(net.minecraft.world.entity.projectile.ThrownPotion potion, @Nullable HitResult position, Map<LivingEntity, Double> affectedEntities) { // Paper - nullable hitResult
|
|
ThrownPotion thrownPotion = (ThrownPotion) potion.getBukkitEntity();
|
|
|
|
Block hitBlock = null;
|
|
BlockFace hitFace = null;
|
|
- if (position.getType() == HitResult.Type.BLOCK) {
|
|
+ if (position != null && position.getType() == HitResult.Type.BLOCK) { // Paper - nullable hitResult
|
|
BlockHitResult positionBlock = (BlockHitResult) position;
|
|
hitBlock = CraftBlock.at(potion.level(), positionBlock.getBlockPos());
|
|
hitFace = CraftBlock.notchToBlockFace(positionBlock.getDirection());
|
|
}
|
|
|
|
org.bukkit.entity.Entity hitEntity = null;
|
|
- if (position.getType() == HitResult.Type.ENTITY) {
|
|
+ if (position != null && position.getType() == HitResult.Type.ENTITY) { // Paper - nullable hitResult
|
|
hitEntity = ((EntityHitResult) position).getEntity().getBukkitEntity();
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ public class CraftEventFactory {
|
|
return event;
|
|
}
|
|
|
|
- public static LingeringPotionSplashEvent callLingeringPotionSplashEvent(net.minecraft.world.entity.projectile.ThrownPotion potion, HitResult position, net.minecraft.world.entity.AreaEffectCloud cloud) {
|
|
+ public static LingeringPotionSplashEvent callLingeringPotionSplashEvent(net.minecraft.world.entity.projectile.ThrownPotion potion, @Nullable HitResult position, net.minecraft.world.entity.AreaEffectCloud cloud) { // Paper - nullable hitResult
|
|
ThrownPotion thrownPotion = (ThrownPotion) potion.getBukkitEntity();
|
|
AreaEffectCloud effectCloud = (AreaEffectCloud) cloud.getBukkitEntity();
|
|
|
|
Block hitBlock = null;
|
|
BlockFace hitFace = null;
|
|
- if (position.getType() == HitResult.Type.BLOCK) {
|
|
+ if (position != null && position.getType() == HitResult.Type.BLOCK) { // Paper
|
|
BlockHitResult positionBlock = (BlockHitResult) position;
|
|
hitBlock = CraftBlock.at(potion.level(), positionBlock.getBlockPos());
|
|
hitFace = CraftBlock.notchToBlockFace(positionBlock.getDirection());
|
|
}
|
|
|
|
org.bukkit.entity.Entity hitEntity = null;
|
|
- if (position.getType() == HitResult.Type.ENTITY) {
|
|
+ if (position != null && position.getType() == HitResult.Type.ENTITY) { // Paper
|
|
hitEntity = ((EntityHitResult) position).getEntity().getBukkitEntity();
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
|
@@ -0,0 +0,0 @@ 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 itemMeta) {
|
|
+ final CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator();
|
|
+ ((CraftMetaItem) itemMeta).applyToItem(tag);
|
|
+ itemStack.applyComponents(tag.build());
|
|
+ }
|
|
|
|
public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item) {
|
|
+ return getItemMeta(item, null);
|
|
+ }
|
|
+ public static ItemMeta getItemMeta(net.minecraft.world.item.ItemStack item, org.bukkit.inventory.ItemType metaForType) {
|
|
+ // Paper end
|
|
if (!CraftItemStack.hasItemMeta(item)) {
|
|
return CraftItemFactory.instance().getItemMeta(CraftItemStack.getType(item));
|
|
}
|
|
|
|
+ if (metaForType != null) { return ((CraftItemType<?>) metaForType).getItemMeta(item); } // Paper
|
|
return ((CraftItemType<?>) CraftItemType.minecraftToBukkitNew(item.getItem())).getItemMeta(item);
|
|
}
|
|
|