mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-26 12:36:07 +01:00
bab31b6f55
The Enchantment damage increase API added previously used the EntityCategory enum as a parameter. These values are now however determined by tags instead of the categories themselves. Deprecated the outdated api method, create a new overload that takes EntityType instead and implement deprecated method by guessing an entity type from the builtin registry based on the category passed. This method allows a) the tags to still be modified and the legacy method still respecting such. b) potential cursed implementations of enchantments of plugins to not break that override the getDamageBonus method on Enchantment.
158 lines
7.8 KiB
Diff
158 lines
7.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Noah van der Aa <ndvdaa@gmail.com>
|
|
Date: Wed, 15 Sep 2021 20:44:22 +0200
|
|
Subject: [PATCH] Friction API
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index fdd0cf40b4e0df7d1987889c635fd90cd63727b6..6ac6848fe27336a96a813c84d7d797cc9bc4c297 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -273,6 +273,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
public boolean bukkitPickUpLoot;
|
|
public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper
|
|
public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event
|
|
+ public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
|
|
|
@Override
|
|
public float getBukkitYaw() {
|
|
@@ -738,7 +739,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
|
|
public boolean shouldDiscardFriction() {
|
|
- return this.discardFriction;
|
|
+ return !this.frictionState.toBooleanOrElse(!this.discardFriction); // Paper - Friction API
|
|
}
|
|
|
|
public void setDiscardFriction(boolean noDrag) {
|
|
@@ -799,6 +800,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
|
|
@Override
|
|
public void addAdditionalSaveData(CompoundTag nbt) {
|
|
+ // Paper start - Friction API
|
|
+ if (this.frictionState != net.kyori.adventure.util.TriState.NOT_SET) {
|
|
+ nbt.putString("Paper.FrictionState", this.frictionState.toString());
|
|
+ }
|
|
+ // Paper end - Friction API
|
|
nbt.putFloat("Health", this.getHealth());
|
|
nbt.putShort("HurtTime", (short) this.hurtTime);
|
|
nbt.putInt("HurtByTimestamp", this.lastHurtByMobTimestamp);
|
|
@@ -842,6 +848,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
this.internalSetAbsorptionAmount(absorptionAmount);
|
|
// Paper end - Check for NaN
|
|
+ // Paper start - Friction API
|
|
+ if (nbt.contains("Paper.FrictionState")) {
|
|
+ String fs = nbt.getString("Paper.FrictionState");
|
|
+ try {
|
|
+ frictionState = net.kyori.adventure.util.TriState.valueOf(fs);
|
|
+ } catch (Exception ignored) {
|
|
+ LOGGER.error("Unknown friction state " + fs + " for " + this);
|
|
+ }
|
|
+ }
|
|
+ // Paper end - Friction API
|
|
if (nbt.contains("Attributes", 9) && this.level() != null && !this.level().isClientSide) {
|
|
this.getAttributes().load(nbt.getList("Attributes", 10));
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
index b392fda26982517cbc2c04156897184275ce69e5..8fd3845c4965843be9c37498760d93f1ebdff541 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
@@ -62,6 +62,7 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit
|
|
public boolean canMobPickup = true; // Paper - Item#canEntityPickup
|
|
private int despawnRate = -1; // Paper - Alternative item-despawn-rate
|
|
+ public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
|
|
|
public ItemEntity(EntityType<? extends ItemEntity> type, Level world) {
|
|
super(type, world);
|
|
@@ -185,7 +186,11 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
this.move(MoverType.SELF, this.getDeltaMovement());
|
|
float f = 0.98F;
|
|
|
|
- if (this.onGround()) {
|
|
+ // Paper start - Friction API
|
|
+ if (frictionState == net.kyori.adventure.util.TriState.FALSE) {
|
|
+ f = 1F;
|
|
+ } else if (this.onGround()) {
|
|
+ // Paper end - Friction API
|
|
f = this.level().getBlockState(this.getBlockPosBelowThatAffectsMyMovement()).getBlock().getFriction() * 0.98F;
|
|
}
|
|
|
|
@@ -394,6 +399,11 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
|
|
@Override
|
|
public void addAdditionalSaveData(CompoundTag nbt) {
|
|
+ // Paper start - Friction API
|
|
+ if (this.frictionState != net.kyori.adventure.util.TriState.NOT_SET) {
|
|
+ nbt.putString("Paper.FrictionState", this.frictionState.toString());
|
|
+ }
|
|
+ // Paper end - Friction API
|
|
nbt.putShort("Health", (short) this.health);
|
|
nbt.putShort("Age", (short) this.age);
|
|
nbt.putShort("PickupDelay", (short) this.pickupDelay);
|
|
@@ -436,6 +446,17 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
this.setItem(ItemStack.EMPTY);
|
|
}
|
|
|
|
+ // Paper start - Friction API
|
|
+ if (nbt.contains("Paper.FrictionState")) {
|
|
+ String fs = nbt.getString("Paper.FrictionState");
|
|
+ try {
|
|
+ frictionState = net.kyori.adventure.util.TriState.valueOf(fs);
|
|
+ } catch (Exception ignored) {
|
|
+ com.mojang.logging.LogUtils.getLogger().error("Unknown friction state " + fs + " for " + this);
|
|
+ }
|
|
+ }
|
|
+ // Paper end - Friction API
|
|
+
|
|
if (this.getItem().isEmpty()) {
|
|
this.discard(null); // CraftBukkit - add Bukkit remove cause
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
index 1a291dd8a287db30e71dcb315599fc4b038764c4..30d62ee4d5cd2ddacb8783b5bbbf475d592b3e02 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
@@ -99,6 +99,18 @@ public class CraftItem extends CraftEntity implements Item {
|
|
this.getHandle().age = willAge ? 0 : NO_AGE_TIME;
|
|
}
|
|
|
|
+ @org.jetbrains.annotations.NotNull
|
|
+ @Override
|
|
+ public net.kyori.adventure.util.TriState getFrictionState() {
|
|
+ return this.getHandle().frictionState;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setFrictionState(@org.jetbrains.annotations.NotNull net.kyori.adventure.util.TriState state) {
|
|
+ java.util.Objects.requireNonNull(state, "state may not be null");
|
|
+ this.getHandle().frictionState = state;
|
|
+ }
|
|
+
|
|
@Override
|
|
public int getHealth() {
|
|
return this.getHandle().health;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
index 5fe3e5b9f52dc1d2b9b4adb7ccaaa2bbf591af9c..e87a52f5dbb8cd984fd2203d912ac3f1ff9d68aa 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -1140,4 +1140,18 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|
nmsStack.hurtAndBreak(amount, this.getHandle(), slot);
|
|
}
|
|
// Paper end - ItemStack damage API
|
|
+
|
|
+ // Paper start - friction API
|
|
+ @org.jetbrains.annotations.NotNull
|
|
+ @Override
|
|
+ public net.kyori.adventure.util.TriState getFrictionState() {
|
|
+ return this.getHandle().frictionState;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setFrictionState(@org.jetbrains.annotations.NotNull net.kyori.adventure.util.TriState state) {
|
|
+ java.util.Objects.requireNonNull(state, "state may not be null");
|
|
+ this.getHandle().frictionState = state;
|
|
+ }
|
|
+ // Paper end - friction API
|
|
}
|