mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-27 11:27:35 +01:00
Add Mob Goal API
This commit is contained in:
parent
cb3bc4f15f
commit
ef291e36d1
@ -0,0 +1,63 @@
|
|||||||
|
package com.destroystokyo.paper.entity.ai;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import org.bukkit.entity.Mob;
|
||||||
|
import org.jspecify.annotations.NullMarked;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an AI goal of an entity
|
||||||
|
*/
|
||||||
|
@NullMarked
|
||||||
|
public interface Goal<T extends Mob> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this goal should be activated
|
||||||
|
*
|
||||||
|
* @return if this goal should be activated
|
||||||
|
*/
|
||||||
|
boolean shouldActivate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this goal should stay active, defaults to {@link Goal#shouldActivate()}
|
||||||
|
*
|
||||||
|
* @return if this goal should stay active
|
||||||
|
*/
|
||||||
|
default boolean shouldStayActive() {
|
||||||
|
return this.shouldActivate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when this goal gets activated
|
||||||
|
*/
|
||||||
|
default void start() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when this goal gets stopped
|
||||||
|
*/
|
||||||
|
default void stop() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called each tick the goal is activated
|
||||||
|
*/
|
||||||
|
default void tick() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A unique key that identifies this type of goal. Plugins should use their own namespace, not the minecraft
|
||||||
|
* namespace. Additionally, this key also specifies to what mobs this goal can be applied to
|
||||||
|
*
|
||||||
|
* @return the goal key
|
||||||
|
*/
|
||||||
|
GoalKey<T> getKey();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all applicable flags for this goal.<br>
|
||||||
|
* <p>
|
||||||
|
* This method is only called on construction.
|
||||||
|
*
|
||||||
|
* @return the subtypes.
|
||||||
|
*/
|
||||||
|
EnumSet<GoalType> getTypes();
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package com.destroystokyo.paper.entity.ai;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
import java.util.StringJoiner;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.entity.Mob;
|
||||||
|
import org.jspecify.annotations.NullMarked;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to identify a Goal. Consists of a {@link NamespacedKey} and the type of mob the goal can be applied to
|
||||||
|
*
|
||||||
|
* @param <T> the type of mob the goal can be applied to
|
||||||
|
*/
|
||||||
|
@NullMarked
|
||||||
|
public final class GoalKey<T extends Mob> {
|
||||||
|
|
||||||
|
private final Class<T> entityClass;
|
||||||
|
private final NamespacedKey namespacedKey;
|
||||||
|
|
||||||
|
private GoalKey(Class<T> entityClass, NamespacedKey namespacedKey) {
|
||||||
|
this.entityClass = entityClass;
|
||||||
|
this.namespacedKey = namespacedKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<T> getEntityClass() {
|
||||||
|
return this.entityClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamespacedKey getNamespacedKey() {
|
||||||
|
return this.namespacedKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(@Nullable Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || this.getClass() != o.getClass()) return false;
|
||||||
|
GoalKey<?> goalKey = (GoalKey<?>) o;
|
||||||
|
return Objects.equal(this.entityClass, goalKey.entityClass) &&
|
||||||
|
Objects.equal(this.namespacedKey, goalKey.namespacedKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(this.entityClass, this.namespacedKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return new StringJoiner(", ", GoalKey.class.getSimpleName() + "[", "]")
|
||||||
|
.add("entityClass=" + this.entityClass)
|
||||||
|
.add("namespacedKey=" + this.namespacedKey)
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <A extends Mob> GoalKey<A> of(Class<A> entityClass, NamespacedKey namespacedKey) {
|
||||||
|
return new GoalKey<>(entityClass, namespacedKey);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.destroystokyo.paper.entity.ai;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the subtype of a goal. Used by minecraft to disable certain types of goals if needed.
|
||||||
|
*/
|
||||||
|
public enum GoalType {
|
||||||
|
|
||||||
|
MOVE,
|
||||||
|
LOOK,
|
||||||
|
JUMP,
|
||||||
|
TARGET,
|
||||||
|
/**
|
||||||
|
* Used to map vanilla goals, that are a behavior goal but don't have a type set...
|
||||||
|
*/
|
||||||
|
UNKNOWN_BEHAVIOR,
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.destroystokyo.paper.entity.ai;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import org.bukkit.entity.Mob;
|
||||||
|
import org.jspecify.annotations.NullMarked;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a part of the "brain" of a mob. It tracks all tasks (running or not), allows adding and removing goals
|
||||||
|
*/
|
||||||
|
@NullMarked
|
||||||
|
public interface MobGoals {
|
||||||
|
|
||||||
|
<T extends Mob> void addGoal(T mob, int priority, Goal<T> goal);
|
||||||
|
|
||||||
|
<T extends Mob> void removeGoal(T mob, Goal<T> goal);
|
||||||
|
|
||||||
|
<T extends Mob> void removeAllGoals(T mob);
|
||||||
|
|
||||||
|
<T extends Mob> void removeAllGoals(T mob, GoalType type);
|
||||||
|
|
||||||
|
<T extends Mob> void removeGoal(T mob, GoalKey<T> key);
|
||||||
|
|
||||||
|
<T extends Mob> boolean hasGoal(T mob, GoalKey<T> key);
|
||||||
|
|
||||||
|
<T extends Mob> @Nullable Goal<T> getGoal(T mob, GoalKey<T> key);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getGoals(T mob, GoalKey<T> key);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getAllGoals(T mob);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getAllGoals(T mob, GoalType type);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getAllGoalsWithout(T mob, GoalType type);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getRunningGoals(T mob);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getRunningGoals(T mob, GoalType type);
|
||||||
|
|
||||||
|
<T extends Mob> Collection<Goal<T>> getRunningGoalsWithout(T mob, GoalType type);
|
||||||
|
}
|
@ -2584,6 +2584,16 @@ public final class Bukkit {
|
|||||||
public static boolean isStopping() {
|
public static boolean isStopping() {
|
||||||
return server.isStopping();
|
return server.isStopping();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link com.destroystokyo.paper.entity.ai.MobGoals} manager
|
||||||
|
*
|
||||||
|
* @return the mob goals manager
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static com.destroystokyo.paper.entity.ai.MobGoals getMobGoals() {
|
||||||
|
return server.getMobGoals();
|
||||||
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@ -2250,5 +2250,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
|||||||
* @return true if server is in the process of being shutdown
|
* @return true if server is in the process of being shutdown
|
||||||
*/
|
*/
|
||||||
boolean isStopping();
|
boolean isStopping();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link com.destroystokyo.paper.entity.ai.MobGoals} manager
|
||||||
|
*
|
||||||
|
* @return the mob goals manager
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
com.destroystokyo.paper.entity.ai.MobGoals getMobGoals();
|
||||||
// Paper end
|
// Paper end
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user