Leashable API

This commit is contained in:
Lulu13022002 2024-06-22 21:17:54 +02:00
parent d72defffba
commit 52acc18e4f
4 changed files with 72 additions and 31 deletions

View file

@ -0,0 +1,50 @@
package io.papermc.paper.entity;
import com.google.common.base.Preconditions;
import net.minecraft.world.entity.Leashable;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.entity.Entity;
public interface PaperLeashable extends io.papermc.paper.entity.Leashable {
Leashable getHandle();
@Override
default boolean isLeashed() {
return this.getHandle().getLeashHolder() != null;
}
@Override
default Entity getLeashHolder() throws IllegalStateException {
Preconditions.checkState(this.isLeashed(), "Entity not leashed");
return this.getHandle().getLeashHolder().getBukkitEntity();
}
private boolean unleash() {
if (!this.isLeashed()) {
return false;
}
this.getHandle().removeLeash();
return true;
}
@Override
default boolean setLeashHolder(Entity holder) {
if (this.getHandle() instanceof net.minecraft.world.entity.Entity entity && entity.generation) {
return false;
}
if (holder == null) {
return this.unleash();
}
if (holder.isDead()) {
return false;
}
this.unleash();
this.getHandle().setLeashedTo(((CraftEntity) holder).getHandle(), true);
return true;
}
}

View file

@ -8,7 +8,7 @@ import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Entity;
public abstract class CraftBoat extends CraftVehicle implements Boat {
public abstract class CraftBoat extends CraftVehicle implements Boat, io.papermc.paper.entity.PaperLeashable { // Paper - Leashable API
public CraftBoat(CraftServer server, AbstractBoat entity) {
super(server, entity);

View file

@ -784,43 +784,17 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
@Override
public boolean isLeashed() {
if (!(this.getHandle() instanceof Mob)) {
return false;
}
return ((Mob) this.getHandle()).getLeashHolder() != null;
return false; // Paper - implement in CraftMob & PaperLeashable
}
@Override
public Entity getLeashHolder() throws IllegalStateException {
Preconditions.checkState(this.isLeashed(), "Entity not leashed");
return ((Mob) this.getHandle()).getLeashHolder().getBukkitEntity();
}
private boolean unleash() {
if (!this.isLeashed()) {
return false;
}
((Mob) this.getHandle()).removeLeash();
return true;
throw new IllegalStateException("Entity not leashed"); // Paper - implement in CraftMob & PaperLeashable
}
@Override
public boolean setLeashHolder(Entity holder) {
if (this.getHandle().generation || (this.getHandle() instanceof WitherBoss) || !(this.getHandle() instanceof Mob)) {
return false;
}
if (holder == null) {
return this.unleash();
}
if (holder.isDead()) {
return false;
}
this.unleash();
((Mob) this.getHandle()).setLeashedTo(((CraftEntity) holder).getHandle(), true);
return true;
return false; // Paper - implement in CraftMob & PaperLeashable
}
@Override

View file

@ -11,7 +11,7 @@ import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.bukkit.loot.LootTable;
public abstract class CraftMob extends CraftLivingEntity implements Mob {
public abstract class CraftMob extends CraftLivingEntity implements Mob, io.papermc.paper.entity.PaperLeashable { // Paper - Leashable API
public CraftMob(CraftServer server, net.minecraft.world.entity.Mob entity) {
super(server, entity);
paperPathfinder = new com.destroystokyo.paper.entity.PaperPathfinder(entity); // Paper - Mob Pathfinding API
@ -175,4 +175,21 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob {
return getHandle().getExperienceReward((net.minecraft.server.level.ServerLevel) this.getHandle().level(), null);
}
// Paper end
// Paper start - Leashable API
@Override
public boolean isLeashed() {
return io.papermc.paper.entity.PaperLeashable.super.isLeashed();
}
@Override
public org.bukkit.entity.Entity getLeashHolder() throws IllegalStateException {
return io.papermc.paper.entity.PaperLeashable.super.getLeashHolder();
}
@Override
public boolean setLeashHolder(final org.bukkit.entity.Entity holder) {
return io.papermc.paper.entity.PaperLeashable.super.setLeashHolder(holder);
}
// Paper end - Leashable API
}