#1150: Add Sniffer API and handle EntityItemDropEvent

By: Doc <nachito94@msn.com>
This commit is contained in:
CraftBukkit/Spigot
2023-03-20 19:03:53 +11:00
parent 3d6c128ff1
commit c7648eb04e
2 changed files with 130 additions and 2 deletions

View File

@@ -1,5 +1,11 @@
package org.bukkit.craftbukkit.entity;
import com.google.common.base.Preconditions;
import java.util.Collection;
import java.util.stream.Collectors;
import net.minecraft.core.BlockPosition;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import org.bukkit.Location;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Sniffer;
@@ -24,4 +30,75 @@ public class CraftSniffer extends CraftAnimals implements Sniffer {
public EntityType getType() {
return EntityType.SNIFFER;
}
@Override
public Collection<Location> getExploredLocations() {
return this.getHandle().getExploredPositions().map(blockPosition -> new Location(this.getLocation().getWorld(), blockPosition.getX(), blockPosition.getY(), blockPosition.getZ())).collect(Collectors.toList());
}
@Override
public void removeExploredLocation(Location location) {
Preconditions.checkArgument(location != null, "location cannot be null");
if (location.getWorld() != getWorld()) {
return;
}
BlockPosition blockPosition = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ());
this.getHandle().getBrain().setMemory(MemoryModuleType.SNIFFER_EXPLORED_POSITIONS, this.getHandle().getExploredPositions().filter(blockPositionExplored -> !blockPositionExplored.equals(blockPosition)).collect(Collectors.toList()));
}
@Override
public void addExploredLocation(Location location) {
Preconditions.checkArgument(location != null, "location cannot be null");
if (location.getWorld() != getWorld()) {
return;
}
this.getHandle().storeExploredPosition(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()));
}
@Override
public Sniffer.State getState() {
return this.stateToBukkit(this.getHandle().getState());
}
@Override
public void setState(Sniffer.State state) {
Preconditions.checkArgument(state != null, "state cannot be null");
this.getHandle().transitionTo(this.stateToNMS(state));
}
@Override
public Location findPossibleDigLocation() {
return this.getHandle().calculateDigPosition().map(blockPosition -> new Location(this.getLocation().getWorld(), blockPosition.getX(), blockPosition.getY(), blockPosition.getZ())).orElse(null);
}
@Override
public boolean canDig() {
return this.getHandle().canDig();
}
private net.minecraft.world.entity.animal.sniffer.Sniffer.a stateToNMS(Sniffer.State state) {
return switch (state) {
case IDLING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.IDLING;
case FEELING_HAPPY -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.FEELING_HAPPY;
case SCENTING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SCENTING;
case SNIFFING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SNIFFING;
case SEARCHING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SEARCHING;
case DIGGING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.DIGGING;
case RISING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.RISING;
};
}
private Sniffer.State stateToBukkit(net.minecraft.world.entity.animal.sniffer.Sniffer.a state) {
return switch (state) {
case IDLING -> Sniffer.State.IDLING;
case FEELING_HAPPY -> Sniffer.State.FEELING_HAPPY;
case SCENTING -> Sniffer.State.SCENTING;
case SNIFFING -> Sniffer.State.SNIFFING;
case SEARCHING -> Sniffer.State.SEARCHING;
case DIGGING -> Sniffer.State.DIGGING;
case RISING -> Sniffer.State.RISING;
};
}
}