From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Noah van der Aa <ndvdaa@gmail.com>
Date: Wed, 15 Sep 2021 20:40:51 +0200
Subject: [PATCH] Friction API


diff --git a/src/main/java/io/papermc/paper/entity/Frictional.java b/src/main/java/io/papermc/paper/entity/Frictional.java
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
--- /dev/null
+++ b/src/main/java/io/papermc/paper/entity/Frictional.java
@@ -0,0 +0,0 @@
+package io.papermc.paper.entity;
+
+import net.kyori.adventure.util.TriState;
+import org.bukkit.entity.Entity;
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * Represents an {@link Entity} that can experience friction with the air and ground.
+ */
+@NullMarked
+public interface Frictional {
+
+    /**
+     * Gets the friction state of this entity.
+     * When set to {@link TriState#TRUE}, the entity will always experience friction.
+     * When set to {@link TriState#FALSE}, the entity will never experience friction.
+     * When set to {@link TriState#NOT_SET}, the entity will fall back to Minecraft's default behaviour.
+     *
+     * @return the entity's friction state
+     */
+    TriState getFrictionState();
+
+    /**
+     * Sets the friction state of this entity.
+     * When set to {@link TriState#TRUE}, the entity will always experience friction.
+     * When set to {@link TriState#FALSE}, the entity will never experience friction.
+     * When set to {@link TriState#NOT_SET}, the entity will fall back to Minecraft's default behaviour.
+     * <p>
+     * Please note that changing this value will do nothing for a player.
+     *
+     * @param state the new friction state to set for the entity
+     */
+    void setFrictionState(TriState state);
+
+}
diff --git a/src/main/java/org/bukkit/entity/Item.java b/src/main/java/org/bukkit/entity/Item.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/Item.java
+++ b/src/main/java/org/bukkit/entity/Item.java
@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Represents a dropped item.
  */
-public interface Item extends Entity {
+public interface Item extends Entity, io.papermc.paper.entity.Frictional { // Paper
 
     /**
      * Gets the item stack associated with this item drop.
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Represents a living entity, such as a monster or player
  */
-public interface LivingEntity extends Attributable, Damageable, ProjectileSource {
+public interface LivingEntity extends Attributable, Damageable, ProjectileSource, io.papermc.paper.entity.Frictional { // Paper
 
     /**
      * Gets the height of the living entity's eyes above its Location.
