mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 15:49:00 +01:00
245 lines
12 KiB
Diff
245 lines
12 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -0,0 +0,0 @@ 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() {
|
|
@@ -0,0 +0,0 @@ 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) {
|
|
@@ -0,0 +0,0 @@ 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);
|
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
@@ -0,0 +0,0 @@ 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);
|
|
@@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
this.applyEffectsFromBlocks();
|
|
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;
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ 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);
|
|
@@ -0,0 +0,0 @@ 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/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
private double flyingZ = 0.95;
|
|
public Double maxSpeed;
|
|
// CraftBukkit end
|
|
+ public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
|
|
|
protected AbstractMinecart(EntityType<?> type, Level world) {
|
|
super(type, world);
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
|
|
this.flipped = nbt.getBoolean("FlippedRotation");
|
|
this.firstTick = nbt.getBoolean("HasTicked");
|
|
+ // 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
|
|
}
|
|
|
|
@Override
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
|
|
|
nbt.putBoolean("FlippedRotation", this.flipped);
|
|
nbt.putBoolean("HasTicked", this.firstTick);
|
|
+
|
|
+ // 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
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/NewMinecartBehavior.java b/src/main/java/net/minecraft/world/entity/vehicle/NewMinecartBehavior.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/NewMinecartBehavior.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/NewMinecartBehavior.java
|
|
@@ -0,0 +0,0 @@ public class NewMinecartBehavior extends MinecartBehavior {
|
|
|
|
@Override
|
|
public double getSlowdownFactor() {
|
|
+ if (this.minecart.frictionState == net.kyori.adventure.util.TriState.FALSE) return 1; // Paper
|
|
return this.minecart.isVehicle() || !this.minecart.slowWhenEmpty ? 0.997D : 0.975D; // CraftBukkit - add !this.slowWhenEmpty
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java b/src/main/java/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java
|
|
@@ -0,0 +0,0 @@ public class OldMinecartBehavior extends MinecartBehavior {
|
|
|
|
@Override
|
|
public double getSlowdownFactor() {
|
|
+ if (this.minecart.frictionState == net.kyori.adventure.util.TriState.FALSE) return 1; // Paper
|
|
return this.minecart.isVehicle() || !this.minecart.slowWhenEmpty ? 0.997D : 0.96D; // CraftBukkit - add !this.slowWhenEmpty
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
|
@@ -0,0 +0,0 @@ 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 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 {
|
|
nmsStack.hurtAndBreak(amount, this.getHandle(), slot, true);
|
|
}
|
|
// 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
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
|
|
@@ -0,0 +0,0 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart {
|
|
public int getDisplayBlockOffset() {
|
|
return this.getHandle().getDisplayOffset();
|
|
}
|
|
+
|
|
+ // 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
|
|
}
|