SuperLeadRope/src/main/java/top/r3944realms/superleadrope/api/SuperLeadRopeApi.java
3944Realms 2c7a56de94 版本更新到0.0.0.8
将玩家拴绳应力逻辑放入到客户端
2025-12-04 19:14:32 +08:00

220 lines
6.7 KiB
Java

/*
* Super Lead rope mod
* Copyright (C) 2025 R3944Realms
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR 阿 PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package top.r3944realms.superleadrope.api;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashData;
import top.r3944realms.superleadrope.api.type.capabilty.ILeashState;
import top.r3944realms.superleadrope.api.type.util.ILeashHelper;
import top.r3944realms.superleadrope.api.workspace.Services;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Predicate;
/**
* The type Super lead rope api.
*/
@SuppressWarnings("unused")
public class SuperLeadRopeApi {
/**
* The constant LOGGER.
*/
public static final Logger LOGGER = LoggerFactory.getLogger(SuperLeadRopeApi.class);
/**
* The constant MOD_ID.
*/
public static String MOD_ID = "superleadrope";
/**
* Gets leash helper.
*
* @return the leash helper
*/
public static ILeashHelper getLeashHelper() {
return Services.WORK_SPACE.getLeashHelper();
}
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param pPos the p pos
* @param filter the filter
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Level pLevel, Vec3 pPos, Predicate<Entity> filter) {
return leashableInArea(pLevel, pPos, filter, 1024D);
}
/**
* Leashable in area list.
*
* @param entity the entity
* @param filter the filter
* @param fetchDistance the fetch distance
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(@NotNull Entity entity, Predicate<Entity> filter, double fetchDistance) {
return leashableInArea(entity.level(), entity.getBoundingBox().getCenter(), filter, fetchDistance);
}
/**
* Leashable in area list.
*
* @param pLevel the p level
* @param pPos the p pos
* @param filter the filter
* @param fetchDistance the fetch distance
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(@NotNull Level pLevel, Vec3 pPos, Predicate<Entity> filter, double fetchDistance) {
return Services.WORK_SPACE.leashableInArea(pLevel, pPos, filter, fetchDistance);
}
/**
* Leashable in area list.
*
* @param entity the entity
* @param filter the filter
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Entity entity, Predicate<Entity> filter) {
return leashableInArea(entity, filter, 1024D);
}
/**
* Leashable in area list.
*
* @param holder the holder
* @return the list
*/
public static @NotNull List<Entity> leashableInArea(Entity holder) {
return leashableInArea(holder, i -> isLeashHolder(i, holder), 1024D);
}
/**
* Leashable in area list.
*
* @param <T> the type parameter
* @param holder the holder
* @param clazz the clazz
* @param box the box
* @param filter the filter
* @return the list
*/
public static <T extends Entity> @NotNull List<T> leashableInArea(Entity holder, Class<T> clazz, AABB box, Predicate<T> filter) {
return Services.WORK_SPACE.leashableInArea(holder.level(), clazz, i -> isLeashHolder(i, holder), box);
}
/**
* Is super lead knot boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean isSuperLeadKnot(Entity entity) {
return Services.WORK_SPACE.isSuperLeadKnot(entity);
}
/**
* Gets super lead knot pos.
*
* @param entity the entity
* @return the super lead knot pos
*/
public static BlockPos getSuperLeadKnotPos(Entity entity) {
return Services.WORK_SPACE.getSuperLeadPos(entity);
}
/**
* Is leashable boolean.
*
* @param entity the entity
* @return the boolean
*/
public static boolean isLeashable(Entity entity) {
return Services.WORK_SPACE.isLeashable(entity);
}
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pTestHolder the p test holder
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, Entity pTestHolder) {
return Services.WORK_SPACE.isSuperLeadKnot(pTestHolder) ?
isLeashHolder(pEntity, Services.WORK_SPACE.getSuperLeadPos(pTestHolder)) :
isLeashHolder(pEntity, pTestHolder.getUUID());
}
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pHolderUUID the p holder uuid
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, UUID pHolderUUID) {
return Services.WORK_SPACE.getLeashData(pEntity)
.map(leashData -> leashData.isLeashedBy(pHolderUUID))
.orElse(false);
}
/**
* Is leash holder boolean.
*
* @param pEntity the p entity
* @param pKnotPos the p knot pos
* @return the boolean
*/
public static boolean isLeashHolder(@NotNull Entity pEntity, BlockPos pKnotPos) {
return Services.WORK_SPACE.getLeashData(pEntity)
.map(leashData -> leashData.isLeashedBy(pKnotPos))
.orElse(false);
}
/**
* Gets leash state.
*
* @param pEntity the p entity
* @return the leash state
*/
public static Optional<ILeashState> getLeashState(Entity pEntity) {
return Services.WORK_SPACE.getLeashState(pEntity);
}
/**
* Gets leash data.
*
* @param pEntity the p entity
* @return the leash data
*/
public static Optional<ILeashData> getLeashData(Entity pEntity) {
return Services.WORK_SPACE.getLeashData(pEntity);
}
}