修复了部分情况下伐木任务寻路异常的问题
修复了伐木任务可能存在的不能完整砍伐的问题 修复了指南针的异常,改用床用来寻找玩家出生点
This commit is contained in:
@@ -165,10 +165,10 @@ dependencies {
|
|||||||
// http://www.gradle.org/docs/current/userguide/dependency_management.html
|
// http://www.gradle.org/docs/current/userguide/dependency_management.html
|
||||||
|
|
||||||
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
|
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
|
||||||
compileOnly fg.deobf("curse.maven:touhou-little-maid-355044:6440955")
|
compileOnly fg.deobf("curse.maven:touhou-little-maid-355044:6596061")
|
||||||
compileOnly fg.deobf("curse.maven:playerrevive-266890:6048921")
|
compileOnly fg.deobf("curse.maven:playerrevive-266890:6048921")
|
||||||
compileOnly fg.deobf("curse.maven:creativecore-257814:6383884")
|
compileOnly fg.deobf("curse.maven:creativecore-257814:6383884")
|
||||||
runtimeOnly fg.deobf("curse.maven:touhou-little-maid-355044:6440955")
|
runtimeOnly fg.deobf("curse.maven:touhou-little-maid-355044:6596061")
|
||||||
runtimeOnly fg.deobf("curse.maven:maid-storage-manager-1210244:6455832")
|
runtimeOnly fg.deobf("curse.maven:maid-storage-manager-1210244:6455832")
|
||||||
runtimeOnly fg.deobf("curse.maven:playerrevive-266890:6048921")
|
runtimeOnly fg.deobf("curse.maven:playerrevive-266890:6048921")
|
||||||
runtimeOnly fg.deobf("curse.maven:creativecore-257814:6383884")
|
runtimeOnly fg.deobf("curse.maven:creativecore-257814:6383884")
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ mod_name=maid useful task
|
|||||||
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
|
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
|
||||||
mod_license=MIT
|
mod_license=MIT
|
||||||
# The mod version. See https://semver.org/
|
# The mod version. See https://semver.org/
|
||||||
mod_version=1.3.3
|
mod_version=1.3.4
|
||||||
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
|
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
|
||||||
# This should match the base package used for the mod sources.
|
# This should match the base package used for the mod sources.
|
||||||
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
|
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||||
|
|||||||
@@ -45,9 +45,11 @@ public class BlockUpScheduleBehavior extends Behavior<EntityMaid> {
|
|||||||
if (context.getStatus() == BlockUpContext.STATUS.DOWN) {
|
if (context.getStatus() == BlockUpContext.STATUS.DOWN) {
|
||||||
MemoryUtil.setTarget(maid, context.getTargetPos(), 0.5f);
|
MemoryUtil.setTarget(maid, context.getTargetPos(), 0.5f);
|
||||||
MemoryUtil.setCurrent(maid, CurrentWork.BLOCKUP_DOWN);
|
MemoryUtil.setCurrent(maid, CurrentWork.BLOCKUP_DOWN);
|
||||||
} else {
|
} else if (maid.canPathReach(context.getStartPos())) {
|
||||||
MemoryUtil.setTarget(maid, context.getStartPos(), 0.5f);
|
MemoryUtil.setTarget(maid, context.getStartPos(), 0.5f);
|
||||||
MemoryUtil.setCurrent(maid, CurrentWork.BLOCKUP_UP);
|
MemoryUtil.setCurrent(maid, CurrentWork.BLOCKUP_UP);
|
||||||
|
} else {
|
||||||
|
context.clearStartTarget();
|
||||||
}
|
}
|
||||||
} else if (!context.isOnLine(maid.blockPosition()) || context.getStartPos().equals(context.getTargetPos())) {
|
} else if (!context.isOnLine(maid.blockPosition()) || context.getStartPos().equals(context.getTargetPos())) {
|
||||||
context.clearStartTarget();
|
context.clearStartTarget();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import studio.fantasyit.maid_useful_task.memory.CurrentWork;
|
|||||||
import studio.fantasyit.maid_useful_task.task.IMaidBlockDestroyTask;
|
import studio.fantasyit.maid_useful_task.task.IMaidBlockDestroyTask;
|
||||||
import studio.fantasyit.maid_useful_task.util.Conditions;
|
import studio.fantasyit.maid_useful_task.util.Conditions;
|
||||||
import studio.fantasyit.maid_useful_task.util.MemoryUtil;
|
import studio.fantasyit.maid_useful_task.util.MemoryUtil;
|
||||||
|
import studio.fantasyit.maid_useful_task.util.PosUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -57,6 +58,7 @@ public class DestoryBlockMoveBehavior extends MaidCenterMoveToBlockTask {
|
|||||||
for (int dy = 0; dy < task.reachDistance(); dy = dy <= 0 ? 1 - dy : -dy) {
|
for (int dy = 0; dy < task.reachDistance(); dy = dy <= 0 ? 1 - dy : -dy) {
|
||||||
for (int dz = 0; dz < task.reachDistance(); dz = dz <= 0 ? 1 - dz : -dz) {
|
for (int dz = 0; dz < task.reachDistance(); dz = dz <= 0 ? 1 - dz : -dz) {
|
||||||
BlockPos pos = mb.offset(dx, dy, dz);
|
BlockPos pos = mb.offset(dx, dy, dz);
|
||||||
|
if (!PosUtils.isSafePos(serverLevel, pos)) continue;
|
||||||
if (!Conditions.isGlobalValidTarget(entityMaid, pos, targetPos)) continue;
|
if (!Conditions.isGlobalValidTarget(entityMaid, pos, targetPos)) continue;
|
||||||
if (pos.distSqr(targetPos) > task.reachDistance() * task.reachDistance()) continue;
|
if (pos.distSqr(targetPos) > task.reachDistance() * task.reachDistance()) continue;
|
||||||
if (entityMaid.isWithinRestriction(pos) && pathfindingBFS.canPathReach(pos)) {
|
if (entityMaid.isWithinRestriction(pos) && pathfindingBFS.canPathReach(pos)) {
|
||||||
@@ -78,7 +80,7 @@ public class DestoryBlockMoveBehavior extends MaidCenterMoveToBlockTask {
|
|||||||
@Override
|
@Override
|
||||||
protected @NotNull MaidPathFindingBFS getOrCreateArrivalMap(@NotNull ServerLevel worldIn, @NotNull EntityMaid maid) {
|
protected @NotNull MaidPathFindingBFS getOrCreateArrivalMap(@NotNull ServerLevel worldIn, @NotNull EntityMaid maid) {
|
||||||
if (this.pathfindingBFS == null)
|
if (this.pathfindingBFS == null)
|
||||||
if(maid.hasRestriction())
|
if (maid.hasRestriction())
|
||||||
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14, (int) maid.getRestrictRadius());
|
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14, (int) maid.getRestrictRadius());
|
||||||
else
|
else
|
||||||
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14);
|
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14);
|
||||||
|
|||||||
@@ -62,8 +62,9 @@ public interface IMaidBlockDestroyTask {
|
|||||||
for (int dz : dv) {
|
for (int dz : dv) {
|
||||||
if (dx == 0 && dy == 0 && dz == 0) continue;
|
if (dx == 0 && dy == 0 && dz == 0) continue;
|
||||||
BlockPos target = pos.offset(dx, dy, dz);
|
BlockPos target = pos.offset(dx, dy, dz);
|
||||||
if (Math.abs(target.getX() - standPos.getX()) > maxDXZ || Math.abs(target.getZ() - standPos.getZ()) > maxDXZ)
|
// if (Math.abs(target.getX() - standPos.getX()) > maxDXZ || Math.abs(target.getZ() - standPos.getZ()) > maxDXZ)
|
||||||
continue;
|
// continue;
|
||||||
|
//上代码不明所以,删除待查
|
||||||
if (target.distSqr(standPos) > reachDistance() * reachDistance()) continue;
|
if (target.distSqr(standPos) > reachDistance() * reachDistance()) continue;
|
||||||
if (marked.contains(target)) continue;
|
if (marked.contains(target)) continue;
|
||||||
if (!shouldDestroyBlock(maid, target)) continue;
|
if (!shouldDestroyBlock(maid, target)) continue;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ public interface IMaidBlockUpTask {
|
|||||||
while (!level.getBlockState(ground).canBeReplaced()) ground.move(0, 1, 0);
|
while (!level.getBlockState(ground).canBeReplaced()) ground.move(0, 1, 0);
|
||||||
if (notAvailable.isVis(ground)) continue;
|
if (notAvailable.isVis(ground)) continue;
|
||||||
//地面基本判断
|
//地面基本判断
|
||||||
|
if (!PosUtils.isSafePos(level, ground)) continue;
|
||||||
if (!PosUtils.isFourSideAir(level, ground.immutable())) continue;
|
if (!PosUtils.isFourSideAir(level, ground.immutable())) continue;
|
||||||
if (!pathFindingBFS.canPathReach(ground)) continue;
|
if (!pathFindingBFS.canPathReach(ground)) continue;
|
||||||
boolean valid = true;
|
boolean valid = true;
|
||||||
|
|||||||
@@ -4,14 +4,18 @@ import com.github.tartaricacid.touhoulittlemaid.api.task.IMaidTask;
|
|||||||
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
|
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.GlobalPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
|
import net.minecraft.tags.ItemTags;
|
||||||
import net.minecraft.tags.StructureTags;
|
import net.minecraft.tags.StructureTags;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl;
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl;
|
||||||
|
import net.minecraft.world.item.CompassItem;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.item.MapItem;
|
import net.minecraft.world.item.MapItem;
|
||||||
@@ -83,11 +87,36 @@ public class MaidLocateTask implements IMaidTask, IMaidFindTargetTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (maid.getMainHandItem().is(Items.COMPASS)) {
|
} else if (maid.getMainHandItem().is(Items.COMPASS)) {
|
||||||
|
target = MemoryUtil.getCommonBlockCache(maid);
|
||||||
|
if (target == null) {
|
||||||
|
GlobalPos globalPos;
|
||||||
|
if (CompassItem.isLodestoneCompass(itemStack)) {
|
||||||
|
globalPos = CompassItem.getLodestonePosition(itemStack.getOrCreateTag());
|
||||||
|
} else {
|
||||||
|
globalPos = CompassItem.getSpawnPosition(level);
|
||||||
|
}
|
||||||
|
if (globalPos != null && level.dimension().equals(globalPos.dimension())) {
|
||||||
|
MemoryUtil.setCommonBlockCache(maid, globalPos.pos());
|
||||||
|
target = globalPos.pos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (maid.getMainHandItem().is(ItemTags.BEDS)) {
|
||||||
target = MemoryUtil.getCommonBlockCache(maid);
|
target = MemoryUtil.getCommonBlockCache(maid);
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
LivingEntity owner = maid.getOwner();
|
LivingEntity owner = maid.getOwner();
|
||||||
if (owner != null) {
|
if (owner instanceof ServerPlayer player) {
|
||||||
target = owner.getSleepingPos().orElse(maid.level().getSharedSpawnPos());
|
if (player.getRespawnDimension().equals(level.dimension())) {
|
||||||
|
target = player.getRespawnPosition();
|
||||||
|
if (target == null) {
|
||||||
|
GlobalPos globalRespawn = CompassItem.getSpawnPosition(level);
|
||||||
|
if (globalRespawn != null && level.dimension().equals(globalRespawn.dimension())) {
|
||||||
|
target = globalRespawn.pos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (target == null) {
|
||||||
|
MemoryUtil.setCommonBlockCache(maid, target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (maid.getMainHandItem().is(Items.FILLED_MAP)) {
|
} else if (maid.getMainHandItem().is(Items.FILLED_MAP)) {
|
||||||
@@ -130,3 +159,4 @@ public class MaidLocateTask implements IMaidTask, IMaidFindTargetTask {
|
|||||||
MemoryUtil.clearCommonBlockCache(maid);
|
MemoryUtil.clearCommonBlockCache(maid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
public class Conditions {
|
public class Conditions {
|
||||||
public static boolean hasReachedValidTargetOrReset(EntityMaid maid) {
|
public static boolean hasReachedValidTargetOrReset(EntityMaid maid) {
|
||||||
return hasReachedValidTargetOrReset(maid, 2);
|
return hasReachedValidTargetOrReset(maid, 2.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasReachedValidTargetOrReset(EntityMaid maid, float closeEnough) {
|
public static boolean hasReachedValidTargetOrReset(EntityMaid maid, float closeEnough) {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package studio.fantasyit.maid_useful_task.util;
|
|||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||||
|
|
||||||
public class PosUtils {
|
public class PosUtils {
|
||||||
public static boolean isFourSideAir(BlockGetter level, BlockPos pos) {
|
public static boolean isFourSideAir(BlockGetter level, BlockPos pos) {
|
||||||
@@ -11,4 +13,17 @@ public class PosUtils {
|
|||||||
level.getBlockState(pos.east()).isAir() &&
|
level.getBlockState(pos.east()).isAir() &&
|
||||||
level.getBlockState(pos.west()).isAir();
|
level.getBlockState(pos.west()).isAir();
|
||||||
}
|
}
|
||||||
|
static protected boolean isEmptyBlockPos(Level level, BlockPos pos) {
|
||||||
|
return level.getBlockState(pos).isAir() || level.getBlockState(pos).getCollisionShape(
|
||||||
|
level,
|
||||||
|
pos,
|
||||||
|
CollisionContext.empty()
|
||||||
|
).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
static public boolean isSafePos(Level level, BlockPos pos) {
|
||||||
|
return isEmptyBlockPos(level, pos)
|
||||||
|
&& isEmptyBlockPos(level, pos.above())
|
||||||
|
&& !isEmptyBlockPos(level, pos.below());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user