diff --git a/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java b/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java index 679fa73..0e97579 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java @@ -29,6 +29,7 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import org.slf4j.Logger; import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; // The value here should match an entry in the META-INF/mods.toml file @Mod(MaidUsefulTask.MODID) @@ -41,5 +42,6 @@ public class MaidUsefulTask { public MaidUsefulTask() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); MemoryModuleRegistry.register(modEventBus); + MaidVehicleManager.register(); } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java b/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java index 1873fbd..9e9c0c8 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java @@ -3,13 +3,11 @@ package studio.fantasyit.maid_useful_task; import com.github.tartaricacid.touhoulittlemaid.api.ILittleMaid; import com.github.tartaricacid.touhoulittlemaid.api.LittleMaidExtension; import com.github.tartaricacid.touhoulittlemaid.api.entity.ai.IExtraMaidBrain; -import com.github.tartaricacid.touhoulittlemaid.client.animation.HardcodedAnimationManger; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.ExtraMaidBrainManager; import com.github.tartaricacid.touhoulittlemaid.entity.task.TaskManager; import net.minecraft.world.entity.ai.memory.MemoryModuleType; -import studio.fantasyit.maid_useful_task.animation.FlyAnimation; import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; -import studio.fantasyit.maid_useful_task.task.MaidEndEyeTask; +import studio.fantasyit.maid_useful_task.task.MaidLocateTask; import studio.fantasyit.maid_useful_task.task.MaidTreeTask; import java.util.List; @@ -20,7 +18,7 @@ public class UsefulTaskExtension implements ILittleMaid { public void addMaidTask(TaskManager manager) { ILittleMaid.super.addMaidTask(manager); manager.add(new MaidTreeTask()); - manager.add(new MaidEndEyeTask()); + manager.add(new MaidLocateTask()); } @Override @@ -34,14 +32,11 @@ public class UsefulTaskExtension implements ILittleMaid { MemoryModuleRegistry.BLOCK_UP_TARGET.get(), MemoryModuleRegistry.BLOCK_VALIDATION.get(), MemoryModuleRegistry.CURRENT_WORK.get(), - MemoryModuleRegistry.COMMON_BLOCK_CACHE.get() + MemoryModuleRegistry.COMMON_BLOCK_CACHE.get(), + MemoryModuleRegistry.IS_ALLOW_HANDLE_VEHICLE.get(), + MemoryModuleRegistry.LOCATE_ITEM.get() ); } }); } - - @Override - public void addHardcodeAnimation(HardcodedAnimationManger manger) { - manger.addMaidAnimation(new FlyAnimation()); - } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/animation/FlyAnimation.java b/src/main/java/studio/fantasyit/maid_useful_task/animation/FlyAnimation.java deleted file mode 100644 index f786cef..0000000 --- a/src/main/java/studio/fantasyit/maid_useful_task/animation/FlyAnimation.java +++ /dev/null @@ -1,32 +0,0 @@ -package studio.fantasyit.maid_useful_task.animation; - -import com.github.tartaricacid.touhoulittlemaid.api.animation.ICustomAnimation; -import com.github.tartaricacid.touhoulittlemaid.api.animation.IModelRenderer; -import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; -import com.github.tartaricacid.touhoulittlemaid.geckolib3.geo.animated.AnimatedGeoModel; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.world.entity.Mob; - -import java.util.HashMap; - -public class FlyAnimation implements ICustomAnimation { - @Override - public void setupRotations(Mob entity, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks) { - ICustomAnimation.super.setupRotations(entity, poseStack, ageInTicks, rotationYaw, partialTicks); - } - - @Override - public void setRotationAngles(Mob entity, HashMap models, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { - ICustomAnimation.super.setRotationAngles(entity, models, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); - } - - @Override - public void setupGeckoRotations(Mob entity, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks) { - ICustomAnimation.super.setupGeckoRotations(entity, poseStack, ageInTicks, rotationYaw, partialTicks); - } - - @Override - public void setGeckoRotationAngles(Mob entity, AnimatedGeoModel model, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { - ICustomAnimation.super.setGeckoRotationAngles(entity, model, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); - } -} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpDestroyBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpDestroyBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpDestroyBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpDestroyBehavior.java index 0a5c28e..cb9c05b 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpDestroyBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpDestroyBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import net.minecraft.core.BlockPos; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpPlaceBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpPlaceBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpPlaceBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpPlaceBehavior.java index e0fdf7d..9b3a0dc 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpPlaceBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpPlaceBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import net.minecraft.core.BlockPos; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpScheduleBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpScheduleBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpScheduleBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpScheduleBehavior.java index 9ce3bbc..a6693cf 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/BlockUpScheduleBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/BlockUpScheduleBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockBehavior.java index 36eb6a5..17eadb4 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockMoveBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockMoveBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockMoveBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockMoveBehavior.java index 3921732..6bc03ff 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/DestoryBlockMoveBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/DestoryBlockMoveBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.entity.passive.MaidPathFindingBFS; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeMoveBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetMoveBehavior.java similarity index 62% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeMoveBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetMoveBehavior.java index 44c2520..b2dc075 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeMoveBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetMoveBehavior.java @@ -1,5 +1,6 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBroom; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; import com.google.common.collect.ImmutableMap; @@ -10,47 +11,50 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.behavior.Behavior; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.item.Items; import net.minecraft.world.phys.Vec3; +import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; +import studio.fantasyit.maid_useful_task.task.IMaidFindTargetTask; import studio.fantasyit.maid_useful_task.util.MemoryUtil; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; -public class EnderEyeMoveBehavior extends Behavior { +public class FindTargetMoveBehavior extends Behavior { - public EnderEyeMoveBehavior() { - super(ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT, InitEntities.TARGET_POS.get(), MemoryStatus.VALUE_ABSENT)); + public FindTargetMoveBehavior() { + super(ImmutableMap.of( + MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT, + InitEntities.TARGET_POS.get(), MemoryStatus.VALUE_ABSENT + )); } @Override protected boolean checkExtraStartConditions(ServerLevel p_22538_, EntityMaid maid) { - if (!maid.getMainHandItem().is(Items.ENDER_EYE)) return false; + IMaidFindTargetTask task = (IMaidFindTargetTask) maid.getTask(); + if (task.findTarget(p_22538_, maid) == null) return false; if (maid.hasRestriction()) return false; LivingEntity owner = maid.getOwner(); - return (owner != null && maid.distanceTo(owner) < 5); + return (owner != null && maid.distanceTo(owner) < task.minReScheduleDistance()); } @Override protected void start(ServerLevel serverlevel, EntityMaid maid, long p_22542_) { - BlockPos target = MemoryUtil.getCommonBlockCache(maid); + IMaidFindTargetTask task = (IMaidFindTargetTask) maid.getTask(); LivingEntity owner = maid.getOwner(); if (owner == null) return; - if (target == null) { - BlockPos blockpos = serverlevel.findNearestMapStructure(StructureTags.EYE_OF_ENDER_LOCATED, maid.blockPosition(), 100, false); - if (blockpos != null) { - MemoryUtil.setCommonBlockCache(maid, blockpos); - target = blockpos; - } - } + BlockPos target = task.findTarget(serverlevel, maid); if (target != null) { if (maid.distanceToSqr(target.getCenter()) < 9) { maid.getJumpControl().jump(); + return; } - BlockPos finalTarget = target; BlockPos ownerPos = owner.blockPosition(); BlockPos maidPos = maid.blockPosition(); - if (finalTarget.distSqr(ownerPos) > 10 * 10) { + if (finalTarget.distSqr(ownerPos) > task.maxOutDistance() * task.maxOutDistance()) { Vec3 dVec = target.getCenter().subtract(owner.position()); - dVec = dVec.normalize().scale(7); + dVec = dVec.normalize().scale(task.maxOutDistance() - (double) (task.maxOutDistance() - task.minReScheduleDistance()) / 2); BlockPos fTarget = maidPos.offset((int) dVec.x, (int) dVec.y, (int) dVec.z); for (int x = 0; x < 3; x = x <= 0 ? 1 - x : -x) { @@ -59,13 +63,13 @@ public class EnderEyeMoveBehavior extends Behavior { while (!serverlevel.getBlockState(fTarget.offset(x, y, z)).isAir()) y++; while (!serverlevel.getBlockState(fTarget.offset(x, y, z)).isAir()) y--; - if (fTarget.offset(x, y, z).distSqr(ownerPos) < 10 * 10) { + if (fTarget.offset(x, y, z).distSqr(ownerPos) < task.maxOutDistance() * task.maxOutDistance()) { finalTarget = fTarget.offset(x, y, z); } } } } - if (finalTarget.distSqr(maidPos) < 10 * 10) { + if (finalTarget.distSqr(maidPos) < task.maxOutDistance() * task.maxOutDistance()) { double distanceToOwner = maidPos.distSqr(ownerPos); double speed = 0.4; if (distanceToOwner < 4 * 4) { diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeWaitBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetWaitBehavior.java similarity index 52% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeWaitBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetWaitBehavior.java index 0f2fe5c..0ad6dfa 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/EnderEyeWaitBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/FindTargetWaitBehavior.java @@ -1,39 +1,42 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; import com.google.common.collect.ImmutableMap; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; -import net.minecraft.tags.StructureTags; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.behavior.Behavior; -import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.memory.MemoryStatus; import net.minecraft.world.item.Items; -import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import studio.fantasyit.maid_useful_task.task.IMaidFindTargetTask; import studio.fantasyit.maid_useful_task.util.Conditions; import studio.fantasyit.maid_useful_task.util.MemoryUtil; -public class EnderEyeWaitBehavior extends Behavior { +public class FindTargetWaitBehavior extends Behavior { - public EnderEyeWaitBehavior() { + public FindTargetWaitBehavior() { super(ImmutableMap.of(InitEntities.TARGET_POS.get(), MemoryStatus.VALUE_PRESENT)); } @Override - protected boolean checkExtraStartConditions(ServerLevel p_22538_, EntityMaid maid) { - if (!maid.getMainHandItem().is(Items.ENDER_EYE)) return false; + protected boolean checkExtraStartConditions(ServerLevel serverLevel, EntityMaid maid) { + IMaidFindTargetTask task = (IMaidFindTargetTask) maid.getTask(); + if (task.findTarget(serverLevel, maid) == null) return true; if (maid.hasRestriction()) return false; LivingEntity owner = maid.getOwner(); - if (owner != null && maid.distanceTo(owner) > 6) { + if (owner != null && maid.distanceTo(owner) > task.maxOutDistance()) { return true; } return Conditions.hasReachedValidTargetOrReset(maid, 4); } @Override - protected void start(ServerLevel serverlevel, EntityMaid maid, long p_22542_) { + protected void start(@NotNull ServerLevel serverLevel, EntityMaid maid, long p_22542_) { + IMaidFindTargetTask task = (IMaidFindTargetTask) maid.getTask(); + if (task.findTarget(serverLevel, maid) == null) { + task.clearCache(maid); + } MemoryUtil.clearTarget(maid); } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/MaidCenterMoveToBlockTask.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/MaidCenterMoveToBlockTask.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/MaidCenterMoveToBlockTask.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/MaidCenterMoveToBlockTask.java index 06e8dc9..df7922f 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/MaidCenterMoveToBlockTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/MaidCenterMoveToBlockTask.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidCheckRateTask; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockBehavior.java similarity index 97% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockBehavior.java index 15bdd0a..60915ce 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockMoveBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockMoveBehavior.java similarity index 98% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockMoveBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockMoveBehavior.java index a73ee67..4b519e6 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/PlaceBlockMoveBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/PlaceBlockMoveBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.entity.passive.MaidPathFindingBFS; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/behavior/UpdateValidationMemoryBehavior.java b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/UpdateValidationMemoryBehavior.java similarity index 94% rename from src/main/java/studio/fantasyit/maid_useful_task/behavior/UpdateValidationMemoryBehavior.java rename to src/main/java/studio/fantasyit/maid_useful_task/behavior/common/UpdateValidationMemoryBehavior.java index da5c2f3..4872ff4 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/behavior/UpdateValidationMemoryBehavior.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/behavior/common/UpdateValidationMemoryBehavior.java @@ -1,4 +1,4 @@ -package studio.fantasyit.maid_useful_task.behavior; +package studio.fantasyit.maid_useful_task.behavior.common; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidCheckRateTask; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/client/KeyEvents.java b/src/main/java/studio/fantasyit/maid_useful_task/client/KeyEvents.java new file mode 100644 index 0000000..6d17547 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/client/KeyEvents.java @@ -0,0 +1,38 @@ +package studio.fantasyit.maid_useful_task.client; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; +import studio.fantasyit.maid_useful_task.network.MaidAllowHandleVehicle; +import studio.fantasyit.maid_useful_task.network.Network; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; + +import static studio.fantasyit.maid_useful_task.client.KeyMapping.KEY_SWITCH_VEHICLE_CONTROL; + +@Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) +public class KeyEvents { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void keyInput(InputEvent.Key event) { + while (KEY_SWITCH_VEHICLE_CONTROL.get().consumeClick()) { + Player player = Minecraft.getInstance().player; + if (!player.isPassenger()) return; + EntityMaid maid = player + .getVehicle() + .getPassengers() + .stream() + .filter(entity -> entity instanceof EntityMaid) + .map(entity -> (EntityMaid) entity) + .findAny() + .orElse(null); + if (maid == null) return; + Network.INSTANCE.sendToServer(new MaidAllowHandleVehicle(maid)); + } + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/client/KeyMapping.java b/src/main/java/studio/fantasyit/maid_useful_task/client/KeyMapping.java new file mode 100644 index 0000000..19517c4 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/client/KeyMapping.java @@ -0,0 +1,26 @@ +package studio.fantasyit.maid_useful_task.client; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.lwjgl.glfw.GLFW; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; + +@Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public class KeyMapping { + + public static final Lazy KEY_SWITCH_VEHICLE_CONTROL = Lazy.of(() -> new net.minecraft.client.KeyMapping( + "key.maid_useful_tasks.switch_vehicle_control", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_V, + "key.maid_useful_tasks.categories.main" + )); + + @SubscribeEvent + public static void registerKeyMappings(final RegisterKeyMappingsEvent event) { + event.register(KEY_SWITCH_VEHICLE_CONTROL.get()); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/event/MaidTickEvent.java b/src/main/java/studio/fantasyit/maid_useful_task/event/MaidTickEvent.java new file mode 100644 index 0000000..03d6226 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/event/MaidTickEvent.java @@ -0,0 +1,20 @@ +package studio.fantasyit.maid_useful_task.event; + +import net.minecraft.server.level.ServerLevel; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; +import studio.fantasyit.maid_useful_task.task.IMaidVehicleControlTask; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; + +@Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class MaidTickEvent { + @SubscribeEvent + public static void onTick(com.github.tartaricacid.touhoulittlemaid.api.event.MaidTickEvent event) { + if (event.getMaid().level() instanceof ServerLevel sl) + if (event.getMaid().getTask() instanceof IMaidVehicleControlTask imvc && event.getMaid().getVehicle() != null) { + imvc.tick(sl, event.getMaid()); + MaidVehicleManager.syncVehicleParameter(event.getMaid()); + } + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/mixin/FollowMaidMixin.java b/src/main/java/studio/fantasyit/maid_useful_task/mixin/FollowMaidMixin.java index 0e87597..241aafd 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/mixin/FollowMaidMixin.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/mixin/FollowMaidMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import studio.fantasyit.maid_useful_task.task.MaidEndEyeTask; +import studio.fantasyit.maid_useful_task.task.MaidLocateTask; @Mixin(MaidFollowOwnerTask.class) abstract public class FollowMaidMixin { @@ -23,7 +23,7 @@ abstract public class FollowMaidMixin { @Inject(method = "Lcom/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerTask;checkExtraStartConditions(Lnet/minecraft/server/level/ServerLevel;Lcom/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid;)Z", at = @At("HEAD"),remap = false, cancellable = true) public void checkExtraStartConditions(ServerLevel level, EntityMaid maid, CallbackInfoReturnable cir) { - if (maid.getTask().getUid().equals(MaidEndEyeTask.UID)) { + if (maid.getTask().getUid().equals(MaidLocateTask.UID)) { LivingEntity owner = maid.getOwner(); if (owner != null && maid.distanceTo(owner) < 6) { cir.setReturnValue(false); @@ -33,7 +33,7 @@ abstract public class FollowMaidMixin { @ModifyVariable(method = "start(Lnet/minecraft/server/level/ServerLevel;Lcom/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid;J)V", at = @At(value = "STORE"),remap = false) public int start(int startDistance, @Local(argsOnly = true) EntityMaid maid) { - if (maid.getTask().getUid().equals(MaidEndEyeTask.UID)) { + if (maid.getTask().getUid().equals(MaidLocateTask.UID)) { return 10; } return startDistance; @@ -41,7 +41,7 @@ abstract public class FollowMaidMixin { @ModifyArg(method = "start(Lnet/minecraft/server/level/ServerLevel;Lcom/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid;J)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ai/behavior/BehaviorUtils;setWalkAndLookTargetMemories(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;FI)V")) public int maid_useful_task$stop_distance(int stopDistance, @Local(argsOnly = true) EntityMaid maid) { - if (maid.getTask().getUid().equals(MaidEndEyeTask.UID)) { + if (maid.getTask().getUid().equals(MaidLocateTask.UID)) { return 10; } return stopDistance; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/mixin/VehicleBroomMixin.java b/src/main/java/studio/fantasyit/maid_useful_task/mixin/VehicleBroomMixin.java new file mode 100644 index 0000000..eb5cf41 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/mixin/VehicleBroomMixin.java @@ -0,0 +1,103 @@ +package studio.fantasyit.maid_useful_task.mixin; + +import com.github.tartaricacid.touhoulittlemaid.entity.item.AbstractEntityFromItem; +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBroom; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import studio.fantasyit.maid_useful_task.vehicle.IVirtualControl; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; + +@Mixin(EntityBroom.class) +abstract public class VehicleBroomMixin extends AbstractEntityFromItem implements IVirtualControl { + public VehicleBroomMixin(EntityType type, Level worldIn) { + super(type, worldIn); + } + + @Unique + public MaidVehicleControlType maid_useful_tasks$vc_type = MaidVehicleControlType.NONE; + @Unique + public float maid_useful_tasks$vc_xRot; + @Unique + public float maid_useful_tasks$vc_yRot; + @Unique + public float maid_useful_tasks$vc_speed; + + @Override + public void maid_useful_tasks$setControlParam(float xRot, float yRot, float speed, MaidVehicleControlType type) { + this.maid_useful_tasks$vc_xRot = xRot; + this.maid_useful_tasks$vc_yRot = yRot; + this.maid_useful_tasks$vc_speed = speed; + this.maid_useful_tasks$vc_type = type; + } + + @Override + public CompoundTag maid_useful_tasks$getControlParam() { + CompoundTag result = new CompoundTag(); + result.putFloat("xRot", maid_useful_tasks$vc_xRot); + result.putFloat("yRot", maid_useful_tasks$vc_yRot); + result.putFloat("speed", maid_useful_tasks$vc_speed); + result.putString("type", maid_useful_tasks$vc_type.name()); + return result; + } + + @Override + public void maid_useful_tasks$setControlParam(CompoundTag target) { + if (target.contains("type")) { + this.maid_useful_tasks$vc_type = MaidVehicleControlType.valueOf(target.getString("type")); + } + if (target.contains("xRot")) { + this.maid_useful_tasks$vc_xRot = target.getFloat("xRot"); + } + if (target.contains("yRot")) { + this.maid_useful_tasks$vc_yRot = target.getFloat("yRot"); + } + if (target.contains("speed")) { + this.maid_useful_tasks$vc_speed = target.getFloat("speed"); + } + } + + @Override + public void maid_useful_tasks$stopControl() { + this.maid_useful_tasks$vc_type = MaidVehicleControlType.NONE; + } + + @Inject(method = "tickRidden", at = @At(value = "INVOKE", target = "Lcom/github/tartaricacid/touhoulittlemaid/entity/item/AbstractEntityFromItem;tickRidden(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/phys/Vec3;)V")) + public void maid_useful_tasks$tickRidden(CallbackInfo ci) { + if (maid_useful_tasks$vc_type == MaidVehicleControlType.NONE) { + return; + } + this.setRot(maid_useful_tasks$vc_yRot, maid_useful_tasks$vc_xRot); + } + + @ModifyVariable(method = "travel", at = @At(value = "STORE"), name = "strafe") + float maid_useful_tasks$travel_s(float strafe) { + if (maid_useful_tasks$vc_type != MaidVehicleControlType.FULL) { + return strafe; + } + return 0; + } + + @ModifyVariable(method = "travel", at = @At(value = "STORE"), name = "vertical") + float maid_useful_tasks$travel_v(float vertical) { + if (maid_useful_tasks$vc_type != MaidVehicleControlType.FULL) { + return vertical; + } + return -(maid_useful_tasks$vc_xRot - 10.0F) / 22.5F; + } + + @ModifyVariable(method = "travel", at = @At(value = "STORE"), name = "forward") + float maid_useful_tasks$travel_f(float forward) { + if (maid_useful_tasks$vc_type != MaidVehicleControlType.FULL) { + return forward; + } + return maid_useful_tasks$vc_speed; + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/network/MaidAllowHandleVehicle.java b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidAllowHandleVehicle.java new file mode 100644 index 0000000..dc64e1e --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidAllowHandleVehicle.java @@ -0,0 +1,46 @@ +package studio.fantasyit.maid_useful_task.network; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.Nullable; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; + +import java.util.function.Supplier; + +public class MaidAllowHandleVehicle { + final int maidId; + + public MaidAllowHandleVehicle(EntityMaid maid) { + this.maidId = maid.getId(); + } + + public MaidAllowHandleVehicle(FriendlyByteBuf buffer) { + maidId = buffer.readInt(); + } + + public void toBytes(FriendlyByteBuf buffer) { + buffer.writeInt(maidId); + } + + public static void handle(MaidAllowHandleVehicle msg, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + ServerPlayer sender = context.getSender(); + Entity entity = sender.level().getEntity(msg.maidId); + if (entity instanceof EntityMaid maid) { + MaidVehicleControlType[] values = MaidVehicleControlType.values(); + MaidVehicleControlType allowMode = values[(MemoryUtil.getAllowHandleVehicle(maid).ordinal() + 1) % values.length]; + MemoryUtil.setAllowHandleVehicle(maid, allowMode); + Component component = switch (allowMode) { + case NONE -> Component.translatable("maid_useful_task.allow_handle_vehicle.none"); + case ROT_ONLY -> Component.translatable("maid_useful_task.allow_handle_vehicle.rot_only"); + case FULL -> Component.translatable("maid_useful_task.allow_handle_vehicle.full"); + }; + sender.sendSystemMessage(component); + } + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java new file mode 100644 index 0000000..7da824d --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java @@ -0,0 +1,30 @@ +package studio.fantasyit.maid_useful_task.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class MaidConfigurePacket { + public String name; + public String value; + + public MaidConfigurePacket(String name, String value) { + this.name = name; + this.value = value; + } + + public MaidConfigurePacket(FriendlyByteBuf buffer) { + this.name = buffer.readUtf(); + this.value = buffer.readUtf(); + } + + public void toBytes(FriendlyByteBuf buffer) { + buffer.writeUtf(name); + buffer.writeUtf(value); + } + + public static void handle(MaidConfigurePacket msg, Supplier context) { + + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/network/MaidSyncVehiclePacket.java b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidSyncVehiclePacket.java new file mode 100644 index 0000000..c46773e --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidSyncVehiclePacket.java @@ -0,0 +1,44 @@ +package studio.fantasyit.maid_useful_task.network; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.network.NetworkEvent; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; + +import java.util.function.Supplier; + +public class MaidSyncVehiclePacket { + final CompoundTag tag; + final int maidId; + + public MaidSyncVehiclePacket(int maidId, CompoundTag tag) { + this.maidId = maidId; + this.tag = tag; + } + + public MaidSyncVehiclePacket(FriendlyByteBuf buffer) { + this.maidId = buffer.readInt(); + this.tag = buffer.readNbt(); + } + + public void toBytes(FriendlyByteBuf buffer) { + buffer.writeInt(maidId); + buffer.writeNbt(tag); + } + + public static void handle(MaidSyncVehiclePacket msg, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + Entity entity = Network.getLocalPlayer().level().getEntity(msg.maidId); + if (entity instanceof EntityMaid maid) { + MaidVehicleManager.getControllableVehicle(maid).ifPresent(vehicle -> { + vehicle.syncVehicleParameter(maid, msg.tag); + }); + } + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/network/Network.java b/src/main/java/studio/fantasyit/maid_useful_task/network/Network.java new file mode 100644 index 0000000..2b30859 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/network/Network.java @@ -0,0 +1,76 @@ +package studio.fantasyit.maid_useful_task.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLDedicatedServerSetupEvent; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; + +public class Network { + private static final String PROTOCOL_VERSION = "1"; + public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( + new ResourceLocation(MaidUsefulTask.MODID, "mut_packets"), + () -> PROTOCOL_VERSION, + (v) -> true, + (v) -> true + ); + + private static void registerMessage() { + Network.INSTANCE.registerMessage(0, + MaidConfigurePacket.class, + MaidConfigurePacket::toBytes, + MaidConfigurePacket::new, + (msg, context) -> { + context.get().enqueueWork(() -> MaidConfigurePacket.handle(msg, context)); + context.get().setPacketHandled(true); + } + ); + Network.INSTANCE.registerMessage(1, + MaidAllowHandleVehicle.class, + MaidAllowHandleVehicle::toBytes, + MaidAllowHandleVehicle::new, + (msg, context) -> { + context.get().enqueueWork(() -> MaidAllowHandleVehicle.handle(msg, context)); + context.get().setPacketHandled(true); + } + ); + Network.INSTANCE.registerMessage(2, + MaidSyncVehiclePacket.class, + MaidSyncVehiclePacket::toBytes, + MaidSyncVehiclePacket::new, + (msg, context) -> { + context.get().enqueueWork(() -> MaidSyncVehiclePacket.handle(msg, context)); + context.get().setPacketHandled(true); + } + ); + } + + @OnlyIn(Dist.CLIENT) + public static Player getLocalPlayer() { + return Minecraft.getInstance().player; + } + + @Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.DEDICATED_SERVER) + public static class Server { + @SubscribeEvent + public static void FMLClientSetupEvent(FMLDedicatedServerSetupEvent event) { + registerMessage(); + } + } + + @Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) + public static class Client { + @SubscribeEvent + public static void FMLClientSetupEvent(FMLClientSetupEvent event) { + registerMessage(); + } + + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/registry/MemoryModuleRegistry.java b/src/main/java/studio/fantasyit/maid_useful_task/registry/MemoryModuleRegistry.java index d5d4071..b009691 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/registry/MemoryModuleRegistry.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/registry/MemoryModuleRegistry.java @@ -3,12 +3,14 @@ package studio.fantasyit.maid_useful_task.registry; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import studio.fantasyit.maid_useful_task.MaidUsefulTask; import studio.fantasyit.maid_useful_task.memory.*; import studio.fantasyit.maid_useful_task.util.WrappedMaidFakePlayer; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; import java.util.Optional; @@ -25,8 +27,9 @@ public class MemoryModuleRegistry { = REGISTER.register("block_validation", () -> new MemoryModuleType<>(Optional.of(BlockValidationMemory.CODEC))); public static final RegistryObject> COMMON_BLOCK_CACHE = REGISTER.register("common_block_cache", () -> new MemoryModuleType<>(Optional.empty())); + public static final RegistryObject> LOCATE_ITEM = REGISTER.register("locate_item", () -> new MemoryModuleType<>(Optional.empty())); public static final RegistryObject> CURRENT_WORK = REGISTER.register("current_work", () -> new MemoryModuleType<>(Optional.empty())); - + public static final RegistryObject> IS_ALLOW_HANDLE_VEHICLE = REGISTER.register("is_allow_handle_vehicle", () -> new MemoryModuleType<>(Optional.empty())); public static void register(IEventBus eventBus) { REGISTER.register(eventBus); } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockDestroyTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockDestroyTask.java index 467b8f2..0d16adc 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockDestroyTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockDestroyTask.java @@ -3,21 +3,14 @@ package studio.fantasyit.maid_useful_task.task; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.ai.behavior.BehaviorControl; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.BaseFireBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import studio.fantasyit.maid_useful_task.behavior.DestoryBlockBehavior; -import studio.fantasyit.maid_useful_task.behavior.DestoryBlockMoveBehavior; +import studio.fantasyit.maid_useful_task.behavior.common.DestoryBlockBehavior; +import studio.fantasyit.maid_useful_task.behavior.common.DestoryBlockMoveBehavior; import studio.fantasyit.maid_useful_task.util.MaidUtils; import studio.fantasyit.maid_useful_task.util.WrappedMaidFakePlayer; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockPlaceTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockPlaceTask.java index 262d768..b20e0f1 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockPlaceTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidBlockPlaceTask.java @@ -3,19 +3,12 @@ package studio.fantasyit.maid_useful_task.task; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.ai.behavior.BehaviorControl; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; -import studio.fantasyit.maid_useful_task.behavior.DestoryBlockBehavior; -import studio.fantasyit.maid_useful_task.behavior.DestoryBlockMoveBehavior; +import studio.fantasyit.maid_useful_task.behavior.common.DestoryBlockBehavior; +import studio.fantasyit.maid_useful_task.behavior.common.DestoryBlockMoveBehavior; import studio.fantasyit.maid_useful_task.util.MaidUtils; -import studio.fantasyit.maid_useful_task.util.WrappedMaidFakePlayer; import java.util.List; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidFindTargetTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidFindTargetTask.java new file mode 100644 index 0000000..8a9408f --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidFindTargetTask.java @@ -0,0 +1,24 @@ +package studio.fantasyit.maid_useful_task.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; + +public interface IMaidFindTargetTask extends IMaidVehicleControlTask { + @Nullable BlockPos findTarget(ServerLevel level, EntityMaid maid); + + void clearCache(EntityMaid maid); + + default int maxOutDistance() { + return 10; + } + + default int minReScheduleDistance() { + return 3; + } + + default int moveDistance() { + return 10; + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidVehicleControlTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidVehicleControlTask.java new file mode 100644 index 0000000..24527d2 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/IMaidVehicleControlTask.java @@ -0,0 +1,25 @@ +package studio.fantasyit.maid_useful_task.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; + +public interface IMaidVehicleControlTask { + BlockPos findTarget(ServerLevel level, EntityMaid maid); + + default void tick(ServerLevel level, EntityMaid maid) { + MaidVehicleControlType allowHandleVehicle = MemoryUtil.getAllowHandleVehicle(maid); + BlockPos targetPos = findTarget(level, maid); + MaidVehicleManager.getControllableVehicle(maid).ifPresent(vehicle -> { + if (targetPos == null) { + vehicle.maidStopControlVehicle(maid); + } else { + vehicle.maidControlVehicle(maid, allowHandleVehicle, targetPos); + } + }); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidEndEyeTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidEndEyeTask.java deleted file mode 100644 index 0fb3916..0000000 --- a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidEndEyeTask.java +++ /dev/null @@ -1,50 +0,0 @@ -package studio.fantasyit.maid_useful_task.task; - -import com.github.tartaricacid.touhoulittlemaid.api.task.IMaidTask; -import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; -import com.mojang.datafixers.util.Pair; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.ai.behavior.BehaviorControl; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import org.jetbrains.annotations.Nullable; -import studio.fantasyit.maid_useful_task.MaidUsefulTask; -import studio.fantasyit.maid_useful_task.behavior.EnderEyeMoveBehavior; -import studio.fantasyit.maid_useful_task.behavior.EnderEyeWaitBehavior; - -import java.util.ArrayList; -import java.util.List; - -public class MaidEndEyeTask implements IMaidTask { - public static final ResourceLocation UID = new ResourceLocation(MaidUsefulTask.MODID, "end_eye"); - - @Override - public ResourceLocation getUid() { - return UID; - } - - @Override - public ItemStack getIcon() { - return Items.ENDER_EYE.getDefaultInstance(); - } - - @Nullable - @Override - public SoundEvent getAmbientSound(EntityMaid entityMaid) { - return null; - } - - @Override - public List>> createBrainTasks(EntityMaid entityMaid) { - List> > list = new ArrayList<>(); - list.add(Pair.of(1, new EnderEyeMoveBehavior())); - list.add(Pair.of(2, new EnderEyeWaitBehavior())); - return list; - } - - @Override - public boolean enableLookAndRandomWalk(EntityMaid maid) { - return false; - } -} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidLocateTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidLocateTask.java new file mode 100644 index 0000000..0da5ad2 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidLocateTask.java @@ -0,0 +1,92 @@ +package studio.fantasyit.maid_useful_task.task; + +import com.github.tartaricacid.touhoulittlemaid.api.task.IMaidTask; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.StructureTags; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; +import studio.fantasyit.maid_useful_task.behavior.common.FindTargetMoveBehavior; +import studio.fantasyit.maid_useful_task.behavior.common.FindTargetWaitBehavior; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; + +import java.util.ArrayList; +import java.util.List; + +public class MaidLocateTask implements IMaidTask, IMaidFindTargetTask { + public static final ResourceLocation UID = new ResourceLocation(MaidUsefulTask.MODID, "locate"); + + @Override + public ResourceLocation getUid() { + return UID; + } + + @Override + public ItemStack getIcon() { + return Items.ENDER_EYE.getDefaultInstance(); + } + + @Nullable + @Override + public SoundEvent getAmbientSound(EntityMaid entityMaid) { + return null; + } + + @Override + public List>> createBrainTasks(EntityMaid entityMaid) { + List>> list = new ArrayList<>(); + list.add(Pair.of(1, new FindTargetMoveBehavior())); + list.add(Pair.of(2, new FindTargetWaitBehavior())); + return list; + } + + @Override + public boolean enableLookAndRandomWalk(EntityMaid maid) { + return false; + } + + @Override + public @Nullable BlockPos findTarget(ServerLevel level, EntityMaid maid) { + BlockPos target = null; + ItemStack itemStack = maid.getMainHandItem(); + ItemStack last = MemoryUtil.getLocateItem(maid); + if (!last.isEmpty() && !itemStack.isEmpty() && ItemStack.isSameItem(last, itemStack)) { + MemoryUtil.setLocateItem(maid, itemStack); + MemoryUtil.clearCommonBlockCache(maid); + } + if (maid.getMainHandItem().is(Items.ENDER_EYE)) { + target = MemoryUtil.getCommonBlockCache(maid); + if (target == null) { + BlockPos blockpos = level.findNearestMapStructure(StructureTags.EYE_OF_ENDER_LOCATED, maid.blockPosition(), 100, false); + if (blockpos != null) { + MemoryUtil.setCommonBlockCache(maid, blockpos); + target = blockpos; + } + } + } else if (maid.getMainHandItem().is(Items.COMPASS)) { + target = MemoryUtil.getCommonBlockCache(maid); + if (target == null) { + LivingEntity owner = maid.getOwner(); + if (owner != null) { + target = owner.getSleepingPos().orElse(maid.level().getSharedSpawnPos()); + } + } + } else { + MemoryUtil.clearCommonBlockCache(maid); + } + return target; + } + + @Override + public void clearCache(EntityMaid maid) { + MemoryUtil.clearCommonBlockCache(maid); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java index 73368ae..f5864aa 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java @@ -19,7 +19,7 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import studio.fantasyit.maid_useful_task.MaidUsefulTask; -import studio.fantasyit.maid_useful_task.behavior.*; +import studio.fantasyit.maid_useful_task.behavior.common.*; import studio.fantasyit.maid_useful_task.memory.BlockValidationMemory; import studio.fantasyit.maid_useful_task.util.MaidUtils; import studio.fantasyit.maid_useful_task.util.MemoryUtil; diff --git a/src/main/java/studio/fantasyit/maid_useful_task/util/MemoryUtil.java b/src/main/java/studio/fantasyit/maid_useful_task/util/MemoryUtil.java index 21a2df5..2c1d7c4 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/util/MemoryUtil.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/util/MemoryUtil.java @@ -9,9 +9,11 @@ import net.minecraft.world.entity.ai.behavior.BehaviorUtils; import net.minecraft.world.entity.ai.behavior.BlockPosTracker; import net.minecraft.world.entity.ai.behavior.PositionTracker; import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import studio.fantasyit.maid_useful_task.memory.*; import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; +import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType; import java.util.List; import java.util.Optional; @@ -21,6 +23,7 @@ public class MemoryUtil { Optional memory = maid.getBrain().getMemory(MemoryModuleRegistry.DESTROY_TARGET.get()); return memory.orElse(null); } + public static void setDestroyTargetMemory(EntityMaid maid, List blockPosSet) { maid.getBrain().setMemory(MemoryModuleRegistry.DESTROY_TARGET.get(), new BlockTargetMemory(blockPosSet)); } @@ -43,9 +46,11 @@ public class MemoryUtil { Optional memory = maid.getBrain().getMemory(MemoryModuleRegistry.PLACE_TARGET.get()); return memory.orElse(null); } + public static void setPlaceTarget(EntityMaid maid, BlockPos blockPos) { maid.getBrain().setMemory(MemoryModuleRegistry.PLACE_TARGET.get(), blockPos); } + public static void clearPlaceTarget(EntityMaid maid) { maid.getBrain().eraseMemory(MemoryModuleRegistry.PLACE_TARGET.get()); } @@ -54,37 +59,59 @@ public class MemoryUtil { maid.getBrain().setMemory(MemoryModuleType.LOOK_TARGET, new BlockPosTracker(pos)); } - public static BlockUpContext getBlockUpContext(EntityMaid maid){ + public static BlockUpContext getBlockUpContext(EntityMaid maid) { Brain brain = maid.getBrain(); - if(!brain.hasMemoryValue(MemoryModuleRegistry.BLOCK_UP_TARGET.get())){ + if (!brain.hasMemoryValue(MemoryModuleRegistry.BLOCK_UP_TARGET.get())) { brain.setMemory(MemoryModuleRegistry.BLOCK_UP_TARGET.get(), new BlockUpContext()); } return brain.getMemory(MemoryModuleRegistry.BLOCK_UP_TARGET.get()).get(); } - public static BlockValidationMemory getBlockValidationMemory(EntityMaid maid){ + + public static BlockValidationMemory getBlockValidationMemory(EntityMaid maid) { Brain brain = maid.getBrain(); - if(!brain.hasMemoryValue(MemoryModuleRegistry.BLOCK_VALIDATION.get())){ + if (!brain.hasMemoryValue(MemoryModuleRegistry.BLOCK_VALIDATION.get())) { brain.setMemory(MemoryModuleRegistry.BLOCK_VALIDATION.get(), new BlockValidationMemory()); } return brain.getMemory(MemoryModuleRegistry.BLOCK_VALIDATION.get()).get(); } - public static void setTarget(EntityMaid maid, BlockPos targetPos,float speed) { + public static void setTarget(EntityMaid maid, BlockPos targetPos, float speed) { maid.getBrain().setMemory(InitEntities.TARGET_POS.get(), new BlockPosTracker(targetPos)); BehaviorUtils.setWalkAndLookTargetMemories(maid, targetPos, speed, 0); } - public static CurrentWork getCurrent(EntityMaid maid){ + public static CurrentWork getCurrent(EntityMaid maid) { return maid.getBrain().getMemory(MemoryModuleRegistry.CURRENT_WORK.get()).orElse(CurrentWork.IDLE); } - public static void setCurrent(EntityMaid maid, CurrentWork currentWork){ + + public static void setCurrent(EntityMaid maid, CurrentWork currentWork) { maid.getBrain().setMemory(MemoryModuleRegistry.CURRENT_WORK.get(), currentWork); } - public static void setCommonBlockCache(EntityMaid maid, BlockPos pos){ + public static void setCommonBlockCache(EntityMaid maid, BlockPos pos) { maid.getBrain().setMemory(MemoryModuleRegistry.COMMON_BLOCK_CACHE.get(), pos); } - public static BlockPos getCommonBlockCache(EntityMaid maid){ + + public static BlockPos getCommonBlockCache(EntityMaid maid) { return maid.getBrain().getMemory(MemoryModuleRegistry.COMMON_BLOCK_CACHE.get()).orElse(null); } + + public static void setAllowHandleVehicle(EntityMaid maid, MaidVehicleControlType allow) { + maid.getBrain().setMemory(MemoryModuleRegistry.IS_ALLOW_HANDLE_VEHICLE.get(), allow); + } + + public static MaidVehicleControlType getAllowHandleVehicle(EntityMaid maid) { + return maid.getBrain().getMemory(MemoryModuleRegistry.IS_ALLOW_HANDLE_VEHICLE.get()).orElse(MaidVehicleControlType.NONE); + } + + public static void clearCommonBlockCache(EntityMaid maid) { + maid.getBrain().eraseMemory(MemoryModuleRegistry.COMMON_BLOCK_CACHE.get()); + } + + public static void setLocateItem(EntityMaid maid, ItemStack item) { + maid.getBrain().setMemory(MemoryModuleRegistry.LOCATE_ITEM.get(), item); + } + public static ItemStack getLocateItem(EntityMaid maid) { + return maid.getBrain().getMemory(MemoryModuleRegistry.LOCATE_ITEM.get()).orElse(ItemStack.EMPTY); + } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/util/RotUtil.java b/src/main/java/studio/fantasyit/maid_useful_task/util/RotUtil.java new file mode 100644 index 0000000..18cb61a --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/util/RotUtil.java @@ -0,0 +1,26 @@ +package studio.fantasyit.maid_useful_task.util; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Unique; + +import java.util.function.Supplier; + +public class RotUtil { + public static float getXRot(Vec3 from, Vec3 to) { + double d0 = to.x() - from.x(); + double d1 = to.y() - from.y(); + double d2 = to.z() - from.z(); + double d3 = Math.sqrt(d0 * d0 + d2 * d2); + return Mth.wrapDegrees((float) (-(Mth.atan2(d1, d3) * (double) (180F / (float) Math.PI)))); + } + + public static float getYRot(Vec3 from, Vec3 to) { + double d0 = to.x() - from.x(); + double d1 = to.y() - from.y(); + double d2 = to.z() - from.z(); + double d3 = Math.sqrt(d0 * d0 + d2 * d2); + return Mth.wrapDegrees((float) (-(Mth.atan2(d0, d2) * (double) (180F / (float) Math.PI)))); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/vehicle/AbstractMaidControllableVehicle.java b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/AbstractMaidControllableVehicle.java new file mode 100644 index 0000000..66d5ae8 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/AbstractMaidControllableVehicle.java @@ -0,0 +1,26 @@ +package studio.fantasyit.maid_useful_task.vehicle; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; + +abstract public class AbstractMaidControllableVehicle { + abstract public boolean isMaidOnThisVehicle(EntityMaid maid); + + abstract public void maidStopControlVehicle(EntityMaid maid); + + abstract public void maidControlVehicle(EntityMaid maid, MaidVehicleControlType type, BlockPos target); + + public void syncVehicleParameter(EntityMaid maid, CompoundTag tag){ + if(maid.getVehicle() instanceof IVirtualControl vehicle){ + vehicle.maid_useful_tasks$setControlParam(tag); + } + } + public @Nullable CompoundTag getSyncVehicleParameter(EntityMaid maid) { + if (maid.getVehicle() instanceof IVirtualControl vehicle) { + return vehicle.maid_useful_tasks$getControlParam(); + } + return null; + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/vehicle/IVirtualControl.java b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/IVirtualControl.java new file mode 100644 index 0000000..7602a30 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/IVirtualControl.java @@ -0,0 +1,10 @@ +package studio.fantasyit.maid_useful_task.vehicle; + +import net.minecraft.nbt.CompoundTag; + +public interface IVirtualControl { + void maid_useful_tasks$setControlParam(float xRot, float yRot, float speed,MaidVehicleControlType type); + void maid_useful_tasks$stopControl(); + CompoundTag maid_useful_tasks$getControlParam(); + void maid_useful_tasks$setControlParam(CompoundTag target); +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleControlType.java b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleControlType.java new file mode 100644 index 0000000..a5ed7a9 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleControlType.java @@ -0,0 +1,7 @@ +package studio.fantasyit.maid_useful_task.vehicle; + +public enum MaidVehicleControlType { + NONE, + ROT_ONLY, + FULL +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleManager.java b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleManager.java new file mode 100644 index 0000000..910b849 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/MaidVehicleManager.java @@ -0,0 +1,44 @@ +package studio.fantasyit.maid_useful_task.vehicle; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.network.PacketDistributor; +import studio.fantasyit.maid_useful_task.network.MaidSyncVehiclePacket; +import studio.fantasyit.maid_useful_task.network.Network; +import studio.fantasyit.maid_useful_task.util.MemoryUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class MaidVehicleManager { + public static List controllableVehicles = new ArrayList<>(); + + public static void register() { + controllableVehicles.add(new VehicleBroom()); + } + + public static void addControllableVehicle(AbstractMaidControllableVehicle vehicle) { + controllableVehicles.add(vehicle); + } + + public static Optional getControllableVehicle(EntityMaid maid) { + for (AbstractMaidControllableVehicle vehicle : controllableVehicles) { + if (vehicle.isMaidOnThisVehicle(maid)) return Optional.of(vehicle); + } + return Optional.empty(); + } + + public static void syncVehicleParameter(EntityMaid maid) { + getControllableVehicle(maid).ifPresent(vehicle -> { + CompoundTag syncVehicleParameter = vehicle.getSyncVehicleParameter(maid); + if (syncVehicleParameter != null) { + Network.INSTANCE.send( + PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> maid), + new MaidSyncVehiclePacket(maid.getId(), syncVehicleParameter) + ); + } + }); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/vehicle/VehicleBroom.java b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/VehicleBroom.java new file mode 100644 index 0000000..cdb8770 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/vehicle/VehicleBroom.java @@ -0,0 +1,60 @@ +package studio.fantasyit.maid_useful_task.vehicle; + +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBroom; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Rotations; +import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; +import studio.fantasyit.maid_useful_task.util.RotUtil; + +public class VehicleBroom extends AbstractMaidControllableVehicle { + @Override + public boolean isMaidOnThisVehicle(EntityMaid maid) { + return maid.getVehicle() instanceof EntityBroom; + } + + @Override + public void maidControlVehicle(EntityMaid maid, MaidVehicleControlType type, BlockPos target) { + if (maid.level().isClientSide) return; + if (maid.getVehicle() instanceof EntityBroom vehicle) { + if (type == MaidVehicleControlType.NONE) { + ((IVirtualControl) vehicle).maid_useful_tasks$setControlParam(0, 0, 0, type); + return; + } + double xzDistance = maid.distanceToSqr(target.getX(), maid.getY(), target.getZ()); + double finalXRot = vehicle.getXRot(); + double finalYRot = vehicle.getYRot(); + double finalSpeed = 0; + if (vehicle.isInWater()) { + finalXRot = -10; + } else if (xzDistance < Math.pow(maid.getY() - maid.level().getSeaLevel(), 2)) { + if (maid.getY() - maid.level().getSeaLevel() < 50 || vehicle.onGround()) + finalXRot = 15; + else + finalXRot = 60; + } else if (maid.getY() < 100) { + finalXRot = -50; + } else if (maid.getY() > 160) { + finalXRot = 15; + } else { + finalXRot = 0; + } + + finalYRot = RotUtil.getYRot(maid.position(), target.getCenter()); + + finalSpeed = type == MaidVehicleControlType.FULL ? 3.0 : 0; + if (xzDistance < 5 * 5 && (vehicle.onGround() || vehicle.isInWater())) + finalSpeed = 0; + + ((IVirtualControl) vehicle).maid_useful_tasks$setControlParam((float) finalXRot, (float) finalYRot, (float) finalSpeed, type); + } + } + + @Override + public void maidStopControlVehicle(EntityMaid maid) { + EntityBroom vehicle = (EntityBroom) maid.getVehicle(); + if (vehicle instanceof IVirtualControl ivc) + ivc.maid_useful_tasks$stopControl(); + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index a1ddef1..e0846fb 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,2 +1,3 @@ public net.minecraft.world.level.BlockGetter m_151361_(Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Ljava/lang/Object;Ljava/util/function/BiFunction;Ljava/util/function/Function;)Ljava/lang/Object; -public-f net.minecraft.world.entity.player.Player f_36093_ \ No newline at end of file +public-f net.minecraft.world.entity.player.Player f_36093_ +public net.minecraft.world.entity.Entity m_19915_(FF)V \ No newline at end of file diff --git a/src/main/resources/assets/maid_useful_task/lang/en_us.json b/src/main/resources/assets/maid_useful_task/lang/en_us.json index a594f1a..8a9abd3 100644 --- a/src/main/resources/assets/maid_useful_task/lang/en_us.json +++ b/src/main/resources/assets/maid_useful_task/lang/en_us.json @@ -1,3 +1,11 @@ { - "task.maid_useful_task.maid_tree": "Logging" + "task.maid_useful_task.maid_tree": "Logging", + "task.maid_useful_task.maid_tree.description": "The maid will cut down the logs around her and plant saplings.", + "task.maid_useful_task.locate": "Locate", + "task.maid_useful_task.locate.description": "The maid can locate the some structure or your home with specific items.", + "key.maid_useful_tasks.switch_vehicle_control": "Switch Vehicle Control Mode", + "maid_useful_task.allow_handle_vehicle.none": "Not allowing maid control vehicle", + "maid_useful_task.allow_handle_vehicle.rot_only": "Allow maid control rotation only", + "maid_useful_task.allow_handle_vehicle.full": "Allow maid control vehicle", + "key.maid_useful_tasks.categories.main": "Maid Useful Tasks" } \ No newline at end of file diff --git a/src/main/resources/assets/maid_useful_task/lang/zh_cn.json b/src/main/resources/assets/maid_useful_task/lang/zh_cn.json index 60a746a..a34115f 100644 --- a/src/main/resources/assets/maid_useful_task/lang/zh_cn.json +++ b/src/main/resources/assets/maid_useful_task/lang/zh_cn.json @@ -1,3 +1,11 @@ { - "task.maid_useful_task.maid_tree": "伐木" + "key.maid_useful_tasks.categories.main": "女仆实用任务", + "key.maid_useful_tasks.switch_vehicle_control": "切换载具控制模式", + "maid_useful_task.allow_handle_vehicle.full": "允许女仆控制载具", + "maid_useful_task.allow_handle_vehicle.none": "不允许女仆控制载具", + "maid_useful_task.allow_handle_vehicle.rot_only": "只允许女仆控制旋转", + "task.maid_useful_task.locate": "定位", + "task.maid_useful_task.locate.description": "女仆会根据手持物品定位指定的结构或你的出生点", + "task.maid_useful_task.maid_tree": "伐木", + "task.maid_useful_task.maid_tree.description": "女仆会砍伐身边的原木并种下树苗" } \ No newline at end of file diff --git a/src/main/resources/maid_useful_task.mixins.json b/src/main/resources/maid_useful_task.mixins.json index 9977e89..fa14687 100644 --- a/src/main/resources/maid_useful_task.mixins.json +++ b/src/main/resources/maid_useful_task.mixins.json @@ -8,7 +8,8 @@ "FollowMaidMixin", "MaidCheckPickupItem", "MaidMoveControlMixin", - "MaidRunOneMixin" + "MaidRunOneMixin", + "VehicleBroomMixin" ], "client": [ ],