兼容到V1.3.7

This commit is contained in:
xypp
2025-08-12 03:12:22 +08:00
parent ea3a57d70d
commit b2db97e8f6
12 changed files with 225 additions and 177 deletions

View File

@@ -133,9 +133,9 @@ repositories {
// If you have mod jar dependencies in ./libs, you can declare them as a repository like so.
// See https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:flat_dir_resolver
// flatDir {
// dir 'libs'
// }
flatDir {
dir 'libs'
}
maven {
url "https://cursemaven.com"
}
@@ -165,12 +165,14 @@ dependencies {
// http://www.gradle.org/docs/current/userguide/dependency_management.html
annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
compileOnly fg.deobf("curse.maven:touhou-little-maid-355044:6596061")
// compileOnly fg.deobf("curse.maven:touhou-little-maid-355044:6596061")
// runtimeOnly fg.deobf("curse.maven:touhou-little-maid-355044:6596061")
compileOnly fg.deobf("libs:touhoulittlemaid-${minecraft_version}-release:1.3.7")
runtimeOnly fg.deobf("libs:touhoulittlemaid-${minecraft_version}-release:1.3.7")
compileOnly fg.deobf("curse.maven:playerrevive-266890:6048921")
compileOnly fg.deobf("curse.maven:creativecore-257814:6383884")
compileOnly fg.deobf("curse.maven:natures-compass-252848:4712189")
compileOnly fg.deobf("curse.maven:explorers-compass-491794:4712194")
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:playerrevive-266890:6048921")
runtimeOnly fg.deobf("curse.maven:creativecore-257814:6383884")

View File

@@ -5,6 +5,7 @@ import com.github.tartaricacid.touhoulittlemaid.api.LittleMaidExtension;
import com.github.tartaricacid.touhoulittlemaid.api.entity.ai.IExtraMaidBrain;
import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.ExtraMaidBrainManager;
import com.github.tartaricacid.touhoulittlemaid.entity.data.TaskDataRegister;
import com.github.tartaricacid.touhoulittlemaid.entity.item.control.BroomControlManager;
import com.github.tartaricacid.touhoulittlemaid.entity.task.TaskManager;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import studio.fantasyit.maid_useful_task.compat.PlayerRevive;
@@ -15,6 +16,7 @@ import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry;
import studio.fantasyit.maid_useful_task.task.MaidLocateTask;
import studio.fantasyit.maid_useful_task.task.MaidRevivePlayerTask;
import studio.fantasyit.maid_useful_task.task.MaidTreeTask;
import studio.fantasyit.maid_useful_task.vehicle.broom.BroomController;
import java.util.List;
@@ -60,4 +62,9 @@ public class UsefulTaskExtension implements ILittleMaid {
MaidReviveConfig.KEY = register.register(new MaidReviveConfig()),
MaidReviveConfig.Data::getDefault);
}
@Override
public void registerBroomControl(BroomControlManager register) {
register.register(BroomController::new);
}
}

View File

@@ -81,9 +81,9 @@ public class DestoryBlockMoveBehavior extends MaidCenterMoveToBlockTask {
protected @NotNull MaidPathFindingBFS getOrCreateArrivalMap(@NotNull ServerLevel worldIn, @NotNull EntityMaid maid) {
if (this.pathfindingBFS == null)
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, (int) maid.getRestrictRadius(), 7);
else
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14);
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 7, 7);
return this.pathfindingBFS;
}

View File

@@ -89,9 +89,9 @@ public class PlaceBlockMoveBehavior extends MaidCenterMoveToBlockTask {
protected @NotNull MaidPathFindingBFS getOrCreateArrivalMap(@NotNull ServerLevel worldIn, @NotNull EntityMaid maid) {
if (this.pathfindingBFS == null)
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, (int) maid.getRestrictRadius(), 7);
else
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 14);
this.pathfindingBFS = new MaidPathFindingBFS(maid.getNavigation().getNodeEvaluator(), worldIn, maid, 7, 7);
return this.pathfindingBFS;
}

View File

@@ -1,103 +0,0 @@
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<? extends LivingEntity> 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 = "TAIL"))
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;
}
}

View File

@@ -3,8 +3,11 @@ 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$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);
}

View File

@@ -1,12 +1,11 @@
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 studio.fantasyit.maid_useful_task.vehicle.broom.VehicleBroom;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,60 +0,0 @@
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();
}
}

View File

@@ -0,0 +1,52 @@
package studio.fantasyit.maid_useful_task.vehicle.broom;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import net.minecraft.nbt.CompoundTag;
import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class BroomControlParamStore {
public record BroomControlParam(float xRot, float yRot, float vertical, float forward,
MaidVehicleControlType type) {
public static BroomControlParam fromNbt(CompoundTag tag) {
return new BroomControlParam(
tag.getFloat("xRot"),
tag.getFloat("yRot"),
tag.getFloat("vertical"),
tag.getFloat("forward"),
MaidVehicleControlType.valueOf(tag.getString("type"))
);
}
public CompoundTag toNbt() {
CompoundTag tag = new CompoundTag();
tag.putFloat("xRot", xRot);
tag.putFloat("yRot", yRot);
tag.putFloat("vertical", vertical);
tag.putFloat("forward", forward);
tag.putString("type", type.name());
return tag;
}
}
private static final BroomControlParam NONE = new BroomControlParam(0, 0, 0, 0, MaidVehicleControlType.NONE);
private static final Map<UUID, BroomControlParam> store = new HashMap<>();
public static void setControlParam(EntityMaid maid, BroomControlParam param) {
store.put(maid.getUUID(), param);
}
public static BroomControlParam getControlParam(EntityMaid maid) {
if (!store.containsKey(maid.getUUID()))
return NONE;
return store.get(maid.getUUID());
}
public static void removeControlParam(EntityMaid maid) {
store.remove(maid.getUUID());
}
}

View File

@@ -0,0 +1,70 @@
package studio.fantasyit.maid_useful_task.vehicle.broom;
import com.github.tartaricacid.touhoulittlemaid.api.entity.IBroomControl;
import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBroom;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType;
public class BroomController implements IBroomControl {
private final EntityBroom broom;
public BroomController(EntityBroom broom) {
this.broom = broom;
}
@Override
public int getPriority() {
return 10;
}
@Override
public boolean inControl(Player player, EntityMaid entityMaid) {
return BroomControlParamStore.getControlParam(entityMaid).type() != MaidVehicleControlType.NONE;
}
@Override
public void travel(Player player, EntityMaid entityMaid) {
BroomControlParamStore.BroomControlParam param = BroomControlParamStore.getControlParam(entityMaid);
float forward = 0;
float strafe = 0;
float vertical = param.vertical();
if (param.type() == MaidVehicleControlType.FULL) {
forward = param.forward() / 15.0f;
} else {
boolean keyForward = player.zza > 0;
boolean keyBack = player.zza < 0;
boolean keyLeft = player.xxa > 0;
boolean keyRight = player.xxa < 0;
if (keyForward || keyBack || keyLeft || keyRight) {
strafe = keyLeft ? 0.2f : (keyRight ? -0.2f : 0);
forward = keyForward ? 0.375f : (keyBack ? -0.2f : 0);
} else {
vertical = 0;
}
}
//来自PlayerBroomControl
double playerSpeed = player.getAttributeValue(Attributes.MOVEMENT_SPEED);
double speed = Math.max(playerSpeed - 0.1, 0) * 2.5 + 0.1;
Vec3 targetMotion = new Vec3(strafe, vertical, forward).scale(speed * 20);
targetMotion = targetMotion.yRot((float) (-broom.getYRot() * Math.PI / 180.0));
// 插值到目标速度,而不是直接累加
Vec3 currentMotion = broom.getDeltaMovement();
Vec3 newMotion = currentMotion.lerp(targetMotion, 0.25f);
broom.setDeltaMovement(newMotion);
}
@Override
public void tickRot(Player player, EntityMaid entityMaid) {
BroomControlParamStore.BroomControlParam param = BroomControlParamStore.getControlParam(entityMaid);
broom.yRotO = broom.yBodyRot = broom.yHeadRot = broom.getYRot();
broom.setRot(param.yRot(), param.xRot());
}
}

View File

@@ -0,0 +1,79 @@
package studio.fantasyit.maid_useful_task.vehicle.broom;
import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBroom;
import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import org.jetbrains.annotations.Nullable;
import studio.fantasyit.maid_useful_task.util.RotUtil;
import studio.fantasyit.maid_useful_task.vehicle.AbstractMaidControllableVehicle;
import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleControlType;
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) {
BroomControlParamStore.removeControlParam(maid);
return;
}
double xzDistance = maid.distanceToSqr(target.getX(), maid.getY(), target.getZ());
double finalXRot = vehicle.getXRot();
double finalYRot = vehicle.getYRot();
double finalVertical = 0;
double finalForward;
if (vehicle.isInWater()) {
finalXRot = 0;
finalVertical = 0.1;
} else if (xzDistance < Math.pow(maid.getY() - maid.level().getSeaLevel(), 2)) {
finalXRot = 0;
if (maid.getY() - maid.level().getSeaLevel() < 50 || vehicle.onGround()) {
finalXRot = 5;
finalVertical = -0.2;
} else {
finalXRot = 50;
finalVertical = -0.35;
}
} else if (maid.getY() < 100) {
finalXRot = -50;
finalVertical = 0.2;
} else if (maid.getY() > 160) {
finalXRot = 0;
finalVertical = -0.1;
} else {
finalXRot = 0;
finalVertical = 0.05;
}
finalYRot = RotUtil.getYRot(maid.position(), target.getCenter());
finalForward = type == MaidVehicleControlType.FULL ? 3.0 : 0;
if (xzDistance < 5 * 5)
finalForward = 0;
BroomControlParamStore.setControlParam(maid, new BroomControlParamStore.BroomControlParam((float) finalXRot, (float) finalYRot, (float) finalVertical, (float) finalForward, type));
}
}
@Override
public void maidStopControlVehicle(EntityMaid maid) {
BroomControlParamStore.removeControlParam(maid);
}
@Override
public void syncVehicleParameter(EntityMaid maid, CompoundTag tag) {
BroomControlParamStore.BroomControlParam broomControlParam = BroomControlParamStore.BroomControlParam.fromNbt(tag);
BroomControlParamStore.setControlParam(maid, broomControlParam);
}
@Override
public @Nullable CompoundTag getSyncVehicleParameter(EntityMaid maid) {
return BroomControlParamStore.getControlParam(maid).toNbt();
}
}

View File

@@ -8,8 +8,7 @@
"FollowMaidMixin",
"MaidCheckPickupItem",
"MaidMoveControlMixin",
"MaidRunOneMixin",
"VehicleBroomMixin"
"MaidRunOneMixin"
],
"client": [
],