diff --git a/src/generated/resources/data/touhou_little_maid/tags/item/maid_tamed_item.json b/src/generated/resources/data/touhou_little_maid/tags/item/maid_tamed_item.json new file mode 100644 index 000000000..ab845ff5f --- /dev/null +++ b/src/generated/resources/data/touhou_little_maid/tags/item/maid_tamed_item.json @@ -0,0 +1,45 @@ +{ + "values": [ + "minecraft:cake", + { + "id": "#forge:cakes", + "required": false + }, + { + "id": "#c:cakes", + "required": false + }, + { + "id": "#jmc:cakes", + "required": false + }, + { + "id": "kawaiidishes:cheese_cake", + "required": false + }, + { + "id": "kawaiidishes:honey_cheese_cake", + "required": false + }, + { + "id": "kawaiidishes:chocolate_cheese_cake", + "required": false + }, + { + "id": "kawaiidishes:piece_of_cake", + "required": false + }, + { + "id": "kawaiidishes:piece_of_cheesecake", + "required": false + }, + { + "id": "kawaiidishes:piece_of_chocolate_cheesecake", + "required": false + }, + { + "id": "kawaiidishes:piece_of_honey_cheesecake", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/ILittleMaid.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/ILittleMaid.java index 43eb4d3ce..a778aead7 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/ILittleMaid.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/ILittleMaid.java @@ -1,6 +1,7 @@ package com.github.tartaricacid.touhoulittlemaid.api; import com.github.tartaricacid.touhoulittlemaid.block.multiblock.MultiBlockManager; +import com.github.tartaricacid.touhoulittlemaid.client.animation.HardcodedAnimationManger; import com.github.tartaricacid.touhoulittlemaid.client.overlay.MaidTipsOverlay; import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.EntityMaidRenderer; import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.GeckoEntityMaidRenderer; @@ -103,4 +104,11 @@ default void addAdditionMaidLayer(EntityMaidRenderer renderer, EntityRendererPro @OnlyIn(Dist.CLIENT) default void addAdditionGeckoMaidLayer(GeckoEntityMaidRenderer renderer, EntityRendererProvider.Context context) { } + + /** + * 添加硬编码的动画 + */ + @OnlyIn(Dist.CLIENT) + default void addHardcodeAnimation(HardcodedAnimationManger manger) { + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/ICustomAnimation.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/ICustomAnimation.java new file mode 100644 index 000000000..06605ebce --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/ICustomAnimation.java @@ -0,0 +1,85 @@ +package com.github.tartaricacid.touhoulittlemaid.api.animation; + +import com.github.tartaricacid.touhoulittlemaid.client.model.bedrock.BedrockPart; +import com.github.tartaricacid.touhoulittlemaid.geckolib3.geo.animated.AnimatedGeoModel; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.LivingEntity; + +import javax.annotation.Nullable; +import java.util.HashMap; + +public interface ICustomAnimation { + /** + * 一个工具类,用来获取指定名称的 BedrockPart + * + * @param models 所有的骨骼 + * @param partName 指定名称的骨骼 + * @return 如果找不到,那么返回 null + */ + @Nullable + static BedrockPart getPartOrNull(HashMap models, String partName) { + IModelRenderer renderer = models.get(partName); + if (renderer == null) { + return null; + } + return renderer.getModelRenderer(); + } + + /** + * 旧版模型 + * 原版里,全局的旋转是单独独立出来一个方法,比后面的动画部分要早执行 + * + * @param entity 实体 + * @param poseStack 矩阵,就是改变它来控制全局旋转 + * @param ageInTicks 实体的 tick 时间,从 0 开始一直增大 + * @param rotationYaw 实体的整体的 Y Rot,单位为角度 + * @param partialTicks 插值 + */ + default void setupRotations(T entity, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks) { + } + + /** + * GeckoLib 版模型 + * 原版里,全局的旋转是单独独立出来一个方法,比后面的动画部分要早执行 + * + * @param entity 实体 + * @param poseStack 矩阵,就是改变它来控制全局旋转 + * @param ageInTicks 实体的 tick 时间,从 0 开始一直增大 + * @param rotationYaw 实体的整体的 Y Rot,单位为角度 + * @param partialTicks 插值 + */ + default void setupGeckoRotations(T entity, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks) { + } + + /** + * 需要添加的动画(旧版模型) + * + * @param entity 实体 + * @param models 所有的骨骼 + * @param limbSwing 实体行走的里程,可以理解为汽车的里程表 + * @param limbSwingAmount 实体行走的速度,可以理解为汽车的速度表 + * @param ageInTicks 实体的 tick 时间,从 0 开始一直增大 + * @param netHeadYaw 实体的头部 Y Rot,单位为角度 + * @param headPitch 实体的头部 X Rot,单位为角度 + */ + default void setRotationAngles(T entity, HashMap models, + float limbSwing, float limbSwingAmount, float ageInTicks, + float netHeadYaw, float headPitch) { + } + + /** + * 需要添加的动画(GeckoLib 版模型) + * + * @param entity 实体 + * @param model 所有的骨骼 + * @param limbSwing 实体行走的里程,可以理解为汽车的里程表 + * @param limbSwingAmount 实体行走的速度,可以理解为汽车的速度表 + * @param ageInTicks 实体的 tick 时间,从 0 开始一直增大 + * @param netHeadYaw 实体的头部 Y Rot,单位为角度 + * @param headPitch 实体的头部 X Rot,单位为角度 + */ + default void setGeckoRotationAngles(T entity, AnimatedGeoModel model, + float limbSwing, float limbSwingAmount, float ageInTicks, + float netHeadYaw, float headPitch) { + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/IModelRenderer.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/IModelRenderer.java index 35987d845..230fa19cc 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/IModelRenderer.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation/IModelRenderer.java @@ -1,6 +1,15 @@ package com.github.tartaricacid.touhoulittlemaid.api.animation; +import com.github.tartaricacid.touhoulittlemaid.client.model.bedrock.BedrockPart; + public interface IModelRenderer { + /** + * Get ModelRenderer's BedrockPart + * + * @return BedrockPart + */ + BedrockPart getModelRenderer(); + /** * Get ModelRenderer's x rotate angle * diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/entity/IMaid.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/entity/IMaid.java index 01f699e90..286da3e5c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/entity/IMaid.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/entity/IMaid.java @@ -160,6 +160,10 @@ default boolean hasFishingHook() { return false; } + default boolean onClimbable() { + return false; + } + // 下方为 Deprecated 方法,仅用于适配旧版本模型,无需 Override @Deprecated diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/mixin/IPlayerMixin.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/mixin/IPlayerMixin.java new file mode 100644 index 000000000..a647de284 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/mixin/IPlayerMixin.java @@ -0,0 +1,5 @@ +package com.github.tartaricacid.touhoulittlemaid.api.mixin; + +public interface IPlayerMixin { + boolean tlmInRemoveVehicleCooldown(); +} \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IAttackTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IAttackTask.java index 50e0a41c5..e1ac271ac 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IAttackTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IAttackTask.java @@ -72,6 +72,29 @@ default boolean canAttack(EntityMaid maid, LivingEntity target) { return DefaultMonsterType.canAttack(maid, target, monsterType); } + /** + * 是否拥有额外攻击方式,用于一些额外增伤的设计 + * 比如女仆副手持有灭火器,会额外对下界生物造成二次伤害 + * + * @param maid 女仆 + * @param target 攻击目标 + * @return 是否有额外攻击方式 + */ + default boolean hasExtraAttack(EntityMaid maid, Entity target) { + return false; + } + + /** + * 执行额外伤害 + * + * @param maid 女仆 + * @param target 攻击目标 + * @return 是否成功造成伤害 + */ + default boolean doExtraAttack(EntityMaid maid, Entity target) { + return false; + } + @Override default MenuProvider getTaskConfigGuiProvider(EntityMaid maid) { final int entityId = maid.getId(); @@ -93,14 +116,6 @@ public boolean shouldTriggerClientSideContainerClosingOnOpen() { }; } - default boolean hasExtraAttack(EntityMaid maid, Entity target) { - return false; - } - - default boolean doExtraAttack(EntityMaid maid, Entity target) { - return false; - } - @Override default boolean enablePanic(EntityMaid maid) { return false; diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IMaidTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IMaidTask.java index 781820fd8..c84c22e60 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IMaidTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IMaidTask.java @@ -14,6 +14,7 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; import javax.annotation.Nullable; import java.util.Collections; @@ -21,6 +22,11 @@ import java.util.function.Predicate; public interface IMaidTask { + /** + * 垂直搜索范围 + */ + int VERTICAL_SEARCH_RANGE = 4; + /** * 模式 ID,用于后续模式的判断,也用于本地化的 key * @@ -182,4 +188,32 @@ public boolean shouldTriggerClientSideContainerClosingOnOpen() { default MenuProvider getTaskInfoGuiProvider(EntityMaid maid) { return maid.getMaidBackpackType().getGuiProvider(maid.getId()); } + + /** + * 实体搜索范围 + *

+ * 给一些远程攻击的武器提供另一些搜索范围,实现超远视距打击 + * + * @param maid 女仆 + * @return 实体搜索范围 + */ + default AABB searchDimension(EntityMaid maid) { + float radius = this.searchRadius(maid); + if (maid.hasRestriction()) { + return new AABB(maid.getRestrictCenter()).inflate(radius, VERTICAL_SEARCH_RANGE, radius); + } else { + return maid.getBoundingBox().inflate(radius, VERTICAL_SEARCH_RANGE, radius); + } + } + + /** + * 实体搜索范围的水平范围值 + * + * @param maid 女仆 + * @return 实体搜索范围水平范围值 + */ + default float searchRadius(EntityMaid maid) { + // 默认依据女仆的工作范围划定搜索范围 + return maid.getRestrictRadius(); + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IRangedAttackTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IRangedAttackTask.java index 0223e4097..f043c626e 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IRangedAttackTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/task/IRangedAttackTask.java @@ -2,8 +2,47 @@ import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorUtils; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.targeting.TargetingConditions; +import net.neoforged.neoforge.common.ModConfigSpec; + +import java.util.List; +import java.util.Optional; public interface IRangedAttackTask extends IAttackTask { + /** + * 可见性校验工具,来自于 Sensor + */ + TargetingConditions TARGET_CONDITIONS = TargetingConditions.forCombat(); + + /** + * 寻找第一个可见目标,使用独立的方法,区别于 IAttackTask + * + * @param maid 女仆 + * @return 第一个可视对象 + */ + static Optional findFirstValidAttackTarget(EntityMaid maid) { + if (maid.getBrain().getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).isPresent()) { + List list = maid.getBrain().getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).get(); + return list.stream().filter(e -> maid.canAttack(e) && maid.canSee(e)).findAny(); + } + return Optional.empty(); + } + + /** + * 依据配置文件和 TargetingConditions 来检验攻击目标是否符合条件 + * + * @param maid 女仆 + * @param target 女仆将要攻击的对象 + * @param configRange 相关距离的配置文件 + * @return 能够攻击 + */ + static boolean targetConditionsTest(EntityMaid maid, LivingEntity target, ModConfigSpec.IntValue configRange) { + TARGET_CONDITIONS.range(configRange.get()); + return TARGET_CONDITIONS.test(maid, target); + } + /** * 执行射击动作 * @@ -12,4 +51,18 @@ public interface IRangedAttackTask extends IAttackTask { * @param distanceFactor 距离因素,即弓箭的蓄力值 */ void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor); + + /** + * 女仆是否能看到敌人 + *

+ * 因为原版默认的攻击识别范围是固定死的 16 格,但是一些远程武器我们希望获得超视距打击 + * 通过修改此处来获得更远的攻击距离 + * + * @param maid 女仆 + * @param target 攻击目标 + * @return 是否在可视范围内 + */ + default boolean canSee(EntityMaid maid, LivingEntity target) { + return BehaviorUtils.canSee(maid, target); + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/CustomJsAnimationManger.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/CustomJsAnimationManger.java index dece61d4d..5c6934437 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/CustomJsAnimationManger.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/CustomJsAnimationManger.java @@ -33,7 +33,7 @@ public class CustomJsAnimationManger { @Nullable public static List getCustomAnimation(Path rootPath, IModelInfo item) { List animations = Lists.newArrayList(); - if (item.getAnimation() != null && item.getAnimation().size() > 0) { + if (item.getAnimation() != null && !item.getAnimation().isEmpty()) { for (ResourceLocation res : item.getAnimation()) { Object animation = CustomJsAnimationManger.getCustomAnimation(rootPath, res); if (animation != null) { @@ -48,7 +48,7 @@ public static List getCustomAnimation(Path rootPath, IModelInfo item) { @Nullable public static List getCustomAnimation(ZipFile zipFile, IModelInfo item) { List animations = Lists.newArrayList(); - if (item.getAnimation() != null && item.getAnimation().size() > 0) { + if (item.getAnimation() != null && !item.getAnimation().isEmpty()) { for (ResourceLocation res : item.getAnimation()) { Object animation = CustomJsAnimationManger.getCustomAnimation(zipFile, res); if (animation != null) { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/HardcodedAnimationManger.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/HardcodedAnimationManger.java new file mode 100644 index 000000000..bb6420d7c --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/HardcodedAnimationManger.java @@ -0,0 +1,75 @@ +package com.github.tartaricacid.touhoulittlemaid.client.animation; + +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; +import com.github.tartaricacid.touhoulittlemaid.api.ILittleMaid; +import com.github.tartaricacid.touhoulittlemaid.api.animation.ICustomAnimation; +import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; +import com.github.tartaricacid.touhoulittlemaid.client.animation.script.ModelRendererWrapper; +import com.github.tartaricacid.touhoulittlemaid.client.animation.special.SwimAnimation; +import com.github.tartaricacid.touhoulittlemaid.client.animation.special.TridentAnimation; +import com.github.tartaricacid.touhoulittlemaid.geckolib3.geo.animated.AnimatedGeoModel; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; + +import java.util.HashMap; +import java.util.List; + +/** + * 随着后续版本的更新,一些新的动画会加入,并且采用硬编码进行修改 + *

+ * 这里就是适用于女仆的新动画调用的地方 + */ +public final class HardcodedAnimationManger { + private static final List> ANIMATIONS = Lists.newLinkedList(); + + public static void init() { + HardcodedAnimationManger manager = new HardcodedAnimationManger(); + + // 游泳动画 + manager.addMaidAnimation(new SwimAnimation()); + // 三叉戟使用动画 + manager.addMaidAnimation(new TridentAnimation()); + + // Immersive Melodies 乐器模组兼容 + // ImmersiveMelodiesCompat.addAnimation(manager); + + for (ILittleMaid littleMaid : TouhouLittleMaid.EXTENSIONS) { + littleMaid.addHardcodeAnimation(manager); + } + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void playMaidAnimation(IMaid maid, HashMap models, + float limbSwing, float limbSwingAmount, float ageInTicks, + float netHeadYaw, float headPitch) { + for (ICustomAnimation animation : ANIMATIONS) { + animation.setRotationAngles(maid.asEntity(), models, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + } + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void playGeckoMaidAnimation(IMaid maid, AnimatedGeoModel model, + float limbSwing, float limbSwingAmount, float ageInTicks, + float netHeadYaw, float headPitch) { + for (ICustomAnimation animation : ANIMATIONS) { + animation.setGeckoRotationAngles(maid.asEntity(), model, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + } + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void setupRotations(Mob entity, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks, boolean isGecko) { + for (ICustomAnimation animation : ANIMATIONS) { + if (isGecko) { + animation.setupGeckoRotations(entity, poseStack, ageInTicks, rotationYaw, partialTicks); + } else { + animation.setupRotations(entity, poseStack, ageInTicks, rotationYaw, partialTicks); + } + } + } + + public void addMaidAnimation(ICustomAnimation animation) { + ANIMATIONS.add(animation); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/gecko/AnimationRegister.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/gecko/AnimationRegister.java index 62f2ded8e..22b4f5c04 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/gecko/AnimationRegister.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/gecko/AnimationRegister.java @@ -5,6 +5,7 @@ import com.github.tartaricacid.touhoulittlemaid.entity.item.EntitySit; import com.github.tartaricacid.touhoulittlemaid.geckolib3.core.builder.ILoopType; import com.github.tartaricacid.touhoulittlemaid.geckolib3.core.event.predicate.AnimationEvent; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.vehicle.Boat; @@ -16,6 +17,11 @@ public class AnimationRegister { public static void registerAnimationState() { register("death", ILoopType.EDefaultLoopTypes.PLAY_ONCE, Priority.HIGHEST, (maid, event) -> maid.asEntity().isDeadOrDying()); register("sleep", Priority.HIGHEST, (maid, event) -> maid.asEntity().getPose() == Pose.SLEEPING); + register("swim", Priority.HIGHEST, (maid, event) -> maid.asEntity().isVisuallySwimming()); + + register("ladder_up", Priority.HIGHEST, (maid, event) -> maid.onClimbable() && getVerticalSpeed(maid) > 0); + register("ladder_stillness", Priority.HIGHEST, (maid, event) -> maid.onClimbable() && getVerticalSpeed(maid) == 0); + register("ladder_down", Priority.HIGHEST, (maid, event) -> maid.onClimbable() && getVerticalSpeed(maid) < 0); register("gomoku", Priority.HIGH, (maid, event) -> sitInJoy(maid, Type.GOMOKU)); register("bookshelf", Priority.HIGH, (maid, event) -> sitInJoy(maid, Type.BOOKSHELF)); @@ -49,4 +55,9 @@ private static void register(String animationName, ILoopType loopType, int prior private static void register(String animationName, int priority, BiPredicate> predicate) { register(animationName, ILoopType.EDefaultLoopTypes.LOOP, priority, predicate); } + + private static float getVerticalSpeed(IMaid maid) { + Mob entity = maid.asEntity(); + return 20 * (float) (entity.position().y - entity.yo); + } } \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/inner/MaidBaseAnimation.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/inner/MaidBaseAnimation.java index 1bbe1ed98..5aff8b541 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/inner/MaidBaseAnimation.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/inner/MaidBaseAnimation.java @@ -358,10 +358,11 @@ public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageI ModelRendererWrapper armLeft = modelMap.get("armLeft"); ModelRendererWrapper armRight = modelMap.get("armRight"); + Mob entity = maid.asEntity(); //(maid.isSwingingArms() && !TacCompat.onSwingGun(maid, armLeft, armRight)) //TODO tacz兼容 - if (maid.isSwingingArms()) { + if (!entity.getMainHandItem().isEmpty() && maid.isSwingingArms()) { if (armLeft != null) { armLeft.setRotateAngleX(-1.396f); armLeft.setRotateAngleY(0.785f); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/script/ModelRendererWrapper.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/script/ModelRendererWrapper.java index 98bc7fc2b..f73770482 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/script/ModelRendererWrapper.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/script/ModelRendererWrapper.java @@ -10,6 +10,7 @@ public ModelRendererWrapper(BedrockPart modelRenderer) { this.modelRenderer = modelRenderer; } + @Override public BedrockPart getModelRenderer() { return modelRenderer; } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/SwimAnimation.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/SwimAnimation.java new file mode 100644 index 000000000..b9c874d29 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/SwimAnimation.java @@ -0,0 +1,21 @@ +package com.github.tartaricacid.touhoulittlemaid.client.animation.special; + +import com.github.tartaricacid.touhoulittlemaid.api.animation.ICustomAnimation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Mob; + +public class SwimAnimation implements ICustomAnimation { + @Override + public void setupRotations(Mob mob, PoseStack poseStack, float ageInTicks, float rotationYaw, float partialTicks) { + boolean inSwimFluidType = mob.isInFluidType((type, height) -> mob.canSwimInFluidType(type)); + boolean inSwim = mob.isInWater() || inSwimFluidType; + float xRot = 90 + (inSwim ? mob.getXRot() : 0); + float xRotLerp = Mth.lerp(mob.getSwimAmount(partialTicks), 0, -xRot); + poseStack.mulPose(Axis.XP.rotationDegrees(xRotLerp)); + if (mob.isVisuallySwimming()) { + poseStack.translate(0F, -1F, 0.3F); + } + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/TridentAnimation.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/TridentAnimation.java new file mode 100644 index 000000000..0b7a0fe0f --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/animation/special/TridentAnimation.java @@ -0,0 +1,31 @@ +package com.github.tartaricacid.touhoulittlemaid.client.animation.special; + +import com.github.tartaricacid.touhoulittlemaid.api.animation.ICustomAnimation; +import com.github.tartaricacid.touhoulittlemaid.api.animation.IModelRenderer; +import com.github.tartaricacid.touhoulittlemaid.client.model.bedrock.BedrockPart; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.TridentItem; + +import java.util.HashMap; + +public class TridentAnimation implements ICustomAnimation { + @Override + public void setRotationAngles(Mob mob, HashMap models, + float limbSwing, float limbSwingAmount, float ageInTicks, + float netHeadYaw, float headPitch) { + if (!mob.isSleeping() && mob.isUsingItem() && mob.getUsedItemHand() == InteractionHand.MAIN_HAND + && mob.getMainHandItem().getItem() instanceof TridentItem) { + int tick = mob.getTicksUsingItem(); + BedrockPart armRight = ICustomAnimation.getPartOrNull(models, "armRight"); + if (armRight != null) { + float partialTick = Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(false); + float rot = (tick + partialTick) / 10f; + armRight.xRot = (armRight.getInitRotX() - 80) - Math.min(rot, Mth.PI / 2) - 10; + armRight.zRot = -Math.min(rot, Mth.PI / 6); + } + } + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/entity/GeckoMaidEntity.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/entity/GeckoMaidEntity.java index b3706b28a..108ccc93c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/entity/GeckoMaidEntity.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/entity/GeckoMaidEntity.java @@ -2,6 +2,7 @@ import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; +import com.github.tartaricacid.touhoulittlemaid.client.animation.HardcodedAnimationManger; import com.github.tartaricacid.touhoulittlemaid.client.animation.gecko.AnimationManager; import com.github.tartaricacid.touhoulittlemaid.client.resource.pojo.MaidModelInfo; import com.github.tartaricacid.touhoulittlemaid.geckolib3.core.AnimatableEntity; @@ -40,12 +41,11 @@ public class GeckoMaidEntity extends AnimatableEntity { private static final int FPS = 60; private final IMaid maid; - private MaidModelInfo maidInfo; private final Vector2f headRot = new Vector2f(); - + private final MaidState state; + private MaidModelInfo maidInfo; private float currentTick = -1; private boolean modelDirty = false; - private final MaidState state; public GeckoMaidEntity(T mob, IMaid maid) { super(mob, FPS); @@ -83,24 +83,32 @@ public void registerControllers() { @Override @SuppressWarnings("all") - public boolean setCustomAnimations(AnimationContext context, @NotNull AnimationEvent animationEvent) { - List extraData = animationEvent.getExtraData(); + public boolean setCustomAnimations(AnimationContext context, @NotNull AnimationEvent event) { + List extraData = event.getExtraData(); MolangParser parser = GeckoLibCache.getInstance().parser; if (!Minecraft.getInstance().isPaused() && extraData.size() == 1 && extraData.get(0) instanceof EntityModelData data) { - //AnimationRegister.setParserValue(animationEvent, parser, data, this.maid); - var update = super.setCustomAnimations(context, animationEvent); + var update = super.setCustomAnimations(context, event); AnimatedGeoModel currentModel = this.getCurrentModel(); - if (currentModel != null && currentModel.head() != null) { - IBone head = currentModel.head(); - if (update) { - this.headRot.set(head.getRotationX(), head.getRotationY()); - } - head.setRotationX(this.headRot.x + (float) Math.toRadians(data.headPitch)); - head.setRotationY(this.headRot.y + (float) Math.toRadians(data.netHeadYaw)); + if (currentModel != null) { + this.updateHead(data, currentModel, update); + HardcodedAnimationManger.playGeckoMaidAnimation(maid, currentModel, event.getLimbSwing(), event.getLimbSwingAmount(), + maid.asEntity().tickCount + event.getPartialTick(), data.netHeadYaw, data.headPitch); } return update; } else { - return super.setCustomAnimations(context, animationEvent); + return super.setCustomAnimations(context, event); + } + } + + @SuppressWarnings("all") + private void updateHead(EntityModelData data, AnimatedGeoModel currentModel, boolean update) { + if (currentModel.head() != null) { + IBone head = currentModel.head(); + if (update) { + this.headRot.set(head.getRotationX(), head.getRotationY()); + } + head.setRotationX(this.headRot.x + (float) Math.toRadians(data.headPitch)); + head.setRotationY(this.headRot.y + (float) Math.toRadians(data.netHeadYaw)); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/AddInformationEvent.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/AddInformationEvent.java index 76bc44b06..43f163a84 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/AddInformationEvent.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/AddInformationEvent.java @@ -5,6 +5,7 @@ import com.github.tartaricacid.touhoulittlemaid.item.bauble.BaubleManager; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.bus.api.EventPriority; @@ -17,12 +18,16 @@ public final class AddInformationEvent { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onRenderTooltips(ItemTooltipEvent event) { - if (BaubleManager.getBauble(event.getItemStack()) != null) { + ItemStack stack = event.getItemStack(); + if (stack.isEmpty()) { + return; + } + if (BaubleManager.getBauble(stack) != null) { event.getToolTip().add(Component.literal(" ")); event.getToolTip().add(Component.translatable("tooltips.touhou_little_maid.bauble.desc")); event.getToolTip().add(Component.translatable("tooltips.touhou_little_maid.bauble.usage").withStyle(ChatFormatting.GRAY)); } - if (BackpackManager.findBackpack(event.getItemStack()).isPresent()) { + if (BackpackManager.findBackpack(stack).isPresent()) { event.getToolTip().add(Component.literal(" ")); event.getToolTip().add(Component.translatable("tooltips.touhou_little_maid.backpack.desc")); event.getToolTip().add(Component.translatable("tooltips.touhou_little_maid.backpack.usage").withStyle(ChatFormatting.GRAY)); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/ReloadResourceEvent.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/ReloadResourceEvent.java index 952bad340..d8656db0c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/ReloadResourceEvent.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/event/ReloadResourceEvent.java @@ -5,28 +5,37 @@ import com.github.tartaricacid.touhoulittlemaid.client.resource.CustomPackLoader; import com.github.tartaricacid.touhoulittlemaid.client.resource.GeckoModelLoader; import com.github.tartaricacid.touhoulittlemaid.client.resource.models.PlayerMaidModels; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimplePreparableReloadListener; +import net.minecraft.util.profiling.ProfilerFiller; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.TextureAtlasStitchedEvent; +import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; import org.apache.commons.lang3.time.StopWatch; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) -public final class ReloadResourceEvent { - public static final ResourceLocation BLOCK_ATLAS_TEXTURE = ResourceLocation.parse("textures/atlas/blocks.png"); - +public final class ReloadResourceEvent extends SimplePreparableReloadListener { @SubscribeEvent - public static void onTextureStitchEventPost(TextureAtlasStitchedEvent event) { - if (BLOCK_ATLAS_TEXTURE.equals(event.getAtlas().location())) { + public static void onRegister(RegisterClientReloadListenersEvent event) { + event.registerReloadListener(new ReloadResourceEvent()); + } + + public static void asyncReloadAllPack() { + CompletableFuture.supplyAsync(() -> { reloadAllPack(); - } + return null; + }, Util.backgroundExecutor()); } - public static void reloadAllPack() { + private static void reloadAllPack() { StopWatch watch = StopWatch.createStarted(); { GeckoModelLoader.reload(); @@ -35,6 +44,20 @@ public static void reloadAllPack() { PlayerMaidModels.reload(); } watch.stop(); - TouhouLittleMaid.LOGGER.info("Model loading time: {} ms", watch.getTime(TimeUnit.MICROSECONDS) / 1000.0); + double time = watch.getTime(TimeUnit.MICROSECONDS) / 1000.0; + if (Minecraft.getInstance().player != null) { + Minecraft.getInstance().player.sendSystemMessage(Component.translatable("message.touhou_little_maid.reload.tip", time)); + } + TouhouLittleMaid.LOGGER.info("Model loading time: {} ms", time); + } + + @Override + protected Void prepare(ResourceManager pResourceManager, ProfilerFiller pProfiler) { + reloadAllPack(); + return null; + } + + @Override + protected void apply(Void pObject, ResourceManager pResourceManager, ProfilerFiller pProfiler) { } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/gui/entity/maid/config/MaidConfigContainerGui.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/gui/entity/maid/config/MaidConfigContainerGui.java index 1b9dfad89..dc2900a03 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/gui/entity/maid/config/MaidConfigContainerGui.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/gui/entity/maid/config/MaidConfigContainerGui.java @@ -49,6 +49,7 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setShowBackpack(!this.syncNetwork.showBackpack()); button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.showBackpack())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -59,6 +60,7 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setShowBackItem(!this.syncNetwork.showBackItem()); button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.showBackItem())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -69,6 +71,7 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setShowChatBubble(!this.syncNetwork.showChatBubble()); button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.showChatBubble())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -80,10 +83,12 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setSoundFreq(this.syncNetwork.soundFreq() - 0.1f); button.setValue(Component.literal(Math.round(this.syncNetwork.soundFreq() * 100) + "%").withStyle(ChatFormatting.YELLOW)); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); }, button -> { this.syncNetwork.setSoundFreq(this.syncNetwork.soundFreq() + 0.1f); button.setValue(Component.literal(Math.round(this.syncNetwork.soundFreq() * 100) + "%").withStyle(ChatFormatting.YELLOW)); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -94,10 +99,12 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setPickType(PickType.getPreviousPickType(this.syncNetwork.pickType())); button.setValue(Component.translatable(PickType.getTransKey(this.syncNetwork.pickType())).withStyle(ChatFormatting.DARK_RED)); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); }, button -> { this.syncNetwork.setPickType(PickType.getNextPickType(this.syncNetwork.pickType())); button.setValue(Component.translatable(PickType.getTransKey(this.syncNetwork.pickType())).withStyle(ChatFormatting.DARK_RED)); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -108,6 +115,7 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setOpenDoor(!this.syncNetwork.openDoor()); button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.openDoor())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); buttonTop += 13; @@ -118,6 +126,18 @@ protected void initAdditionWidgets() { button -> { this.syncNetwork.setOpenFenceGate(!this.syncNetwork.openFenceGate()); button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.openFenceGate())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); + } + )); + buttonTop += 13; + + this.addRenderableWidget(new MaidConfigButton(buttonLeft, buttonTop, + Component.translatable("gui.touhou_little_maid.maid_config.active_climbing"), + Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.activeClimbing()), + button -> { + this.syncNetwork.setActiveClimbing(!this.syncNetwork.activeClimbing()); + button.setValue(Component.translatable("gui.touhou_little_maid.maid_config.value." + this.syncNetwork.activeClimbing())); + PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); } )); } @@ -126,12 +146,4 @@ protected void initAdditionWidgets() { protected void renderAddition(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { graphics.drawString(font, Component.translatable("gui.touhou_little_maid.button.maid_config"), leftPos + 140, topPos + 41, 0xFFFFFF, false); } - - @Override - public void onClose() { - if (this.maid != null) { - PacketDistributor.sendToServer(new MaidSubConfigPackage(this.maid.getId(), this.syncNetwork)); - } - super.onClose(); - } } \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/ClientSetupEvent.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/ClientSetupEvent.java index bea8c2776..bdc8e059d 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/ClientSetupEvent.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/ClientSetupEvent.java @@ -6,6 +6,7 @@ import com.github.tartaricacid.touhoulittlemaid.client.overlay.BroomTipsOverlay; import com.github.tartaricacid.touhoulittlemaid.client.overlay.MaidTipsOverlay; import com.github.tartaricacid.touhoulittlemaid.client.overlay.ShowPowerOverlay; +import com.github.tartaricacid.touhoulittlemaid.compat.oculus.OculusCompat; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -23,6 +24,11 @@ public static void onClientSetup(FMLClientSetupEvent event) { event.enqueueWork(AnimationRegister::registerAnimationState); event.enqueueWork(MaidTipsOverlay::init); event.enqueueWork(ShowOptifineScreen::checkOptifineIsLoaded); + + // 客户端兼容 + OculusCompat.init(); + // SimpleHatsCompat.init(); + // ImmersiveMelodiesCompat.init(); } @SubscribeEvent diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/AltarModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/AltarModel.java index df5a75543..bc71a8701 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/AltarModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/AltarModel.java @@ -12,320 +12,476 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; -public class AltarModel extends EntityModel { +public class AltarModel extends EntityModel { public static ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "main"), "altar"); + private final ModelPart bone; + private final ModelPart bone56; + private final ModelPart bone65; + private final ModelPart bone57; + private final ModelPart bone59; + private final ModelPart bone60; + private final ModelPart bone61; + private final ModelPart bone63; + private final ModelPart bone62; + private final ModelPart bone64; + private final ModelPart bone66; + private final ModelPart bone58; private final ModelPart pillar; + private final ModelPart bone2; + private final ModelPart bone3; + private final ModelPart bone4; + private final ModelPart bone5; + private final ModelPart bone10; + private final ModelPart bone6; + private final ModelPart bone7; + private final ModelPart bone8; + private final ModelPart bone9; private final ModelPart pillar2; + private final ModelPart bone11; + private final ModelPart bone12; + private final ModelPart bone13; + private final ModelPart bone14; + private final ModelPart bone15; + private final ModelPart bone16; + private final ModelPart bone17; + private final ModelPart bone18; + private final ModelPart bone19; private final ModelPart pillar3; + private final ModelPart bone20; + private final ModelPart bone21; + private final ModelPart bone22; + private final ModelPart bone23; + private final ModelPart bone24; + private final ModelPart bone25; + private final ModelPart bone26; + private final ModelPart bone27; + private final ModelPart bone28; private final ModelPart pillar4; + private final ModelPart bone29; + private final ModelPart bone30; + private final ModelPart bone31; + private final ModelPart bone32; + private final ModelPart bone33; + private final ModelPart bone34; + private final ModelPart bone35; + private final ModelPart bone36; + private final ModelPart bone37; private final ModelPart pillar5; + private final ModelPart bone38; + private final ModelPart bone39; + private final ModelPart bone40; + private final ModelPart bone41; + private final ModelPart bone42; + private final ModelPart bone43; + private final ModelPart bone44; + private final ModelPart bone45; + private final ModelPart bone46; private final ModelPart pillar6; - private final ModelPart bone; - private final ModelPart bone56; + private final ModelPart bone47; + private final ModelPart bone48; + private final ModelPart bone49; + private final ModelPart bone50; + private final ModelPart bone51; + private final ModelPart bone52; + private final ModelPart bone53; + private final ModelPart bone54; + private final ModelPart bone55; public AltarModel(ModelPart root) { + this.bone = root.getChild("bone"); + this.bone56 = root.getChild("bone56"); + this.bone65 = this.bone56.getChild("bone65"); + this.bone57 = this.bone56.getChild("bone57"); + this.bone59 = this.bone56.getChild("bone59"); + this.bone60 = this.bone56.getChild("bone60"); + this.bone61 = this.bone56.getChild("bone61"); + this.bone63 = this.bone61.getChild("bone63"); + this.bone62 = this.bone56.getChild("bone62"); + this.bone64 = this.bone62.getChild("bone64"); + this.bone66 = this.bone62.getChild("bone66"); + this.bone58 = this.bone56.getChild("bone58"); this.pillar = root.getChild("pillar"); + this.bone2 = this.pillar.getChild("bone2"); + this.bone3 = this.pillar.getChild("bone3"); + this.bone4 = this.pillar.getChild("bone4"); + this.bone5 = this.pillar.getChild("bone5"); + this.bone10 = this.pillar.getChild("bone10"); + this.bone6 = this.bone10.getChild("bone6"); + this.bone7 = this.bone10.getChild("bone7"); + this.bone8 = this.bone10.getChild("bone8"); + this.bone9 = this.bone10.getChild("bone9"); this.pillar2 = root.getChild("pillar2"); + this.bone11 = this.pillar2.getChild("bone11"); + this.bone12 = this.pillar2.getChild("bone12"); + this.bone13 = this.pillar2.getChild("bone13"); + this.bone14 = this.pillar2.getChild("bone14"); + this.bone15 = this.pillar2.getChild("bone15"); + this.bone16 = this.bone15.getChild("bone16"); + this.bone17 = this.bone15.getChild("bone17"); + this.bone18 = this.bone15.getChild("bone18"); + this.bone19 = this.bone15.getChild("bone19"); this.pillar3 = root.getChild("pillar3"); + this.bone20 = this.pillar3.getChild("bone20"); + this.bone21 = this.pillar3.getChild("bone21"); + this.bone22 = this.pillar3.getChild("bone22"); + this.bone23 = this.pillar3.getChild("bone23"); + this.bone24 = this.pillar3.getChild("bone24"); + this.bone25 = this.bone24.getChild("bone25"); + this.bone26 = this.bone24.getChild("bone26"); + this.bone27 = this.bone24.getChild("bone27"); + this.bone28 = this.bone24.getChild("bone28"); this.pillar4 = root.getChild("pillar4"); + this.bone29 = this.pillar4.getChild("bone29"); + this.bone30 = this.pillar4.getChild("bone30"); + this.bone31 = this.pillar4.getChild("bone31"); + this.bone32 = this.pillar4.getChild("bone32"); + this.bone33 = this.pillar4.getChild("bone33"); + this.bone34 = this.bone33.getChild("bone34"); + this.bone35 = this.bone33.getChild("bone35"); + this.bone36 = this.bone33.getChild("bone36"); + this.bone37 = this.bone33.getChild("bone37"); this.pillar5 = root.getChild("pillar5"); + this.bone38 = this.pillar5.getChild("bone38"); + this.bone39 = this.pillar5.getChild("bone39"); + this.bone40 = this.pillar5.getChild("bone40"); + this.bone41 = this.pillar5.getChild("bone41"); + this.bone42 = this.pillar5.getChild("bone42"); + this.bone43 = this.bone42.getChild("bone43"); + this.bone44 = this.bone42.getChild("bone44"); + this.bone45 = this.bone42.getChild("bone45"); + this.bone46 = this.bone42.getChild("bone46"); this.pillar6 = root.getChild("pillar6"); - this.bone = root.getChild("bone"); - this.bone56 = root.getChild("bone56"); + this.bone47 = this.pillar6.getChild("bone47"); + this.bone48 = this.pillar6.getChild("bone48"); + this.bone49 = this.pillar6.getChild("bone49"); + this.bone50 = this.pillar6.getChild("bone50"); + this.bone51 = this.pillar6.getChild("bone51"); + this.bone52 = this.bone51.getChild("bone52"); + this.bone53 = this.bone51.getChild("bone53"); + this.bone54 = this.bone51.getChild("bone54"); + this.bone55 = this.bone51.getChild("bone55"); } public static LayerDefinition createBodyLayer() { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); - PartDefinition pillar = partdefinition.addOrReplaceChild("pillar", CubeListBuilder.create().texOffs(0, 44).addBox(48.0F, -48.0F, 16.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(0, 21).addBox(47.5F, -48.5F, 15.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(47.5F, -33.5F, 15.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone = partdefinition.addOrReplaceChild("bone", CubeListBuilder.create().texOffs(-47, 65).addBox(-24.0F, -1.0F, -24.0F, 48.0F, 0.0F, 48.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone2 = pillar.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(0, 0).addBox(36.9617F, -42.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(40.9617F, -38.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(44.9617F, -34.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone56 = partdefinition.addOrReplaceChild("bone56", CubeListBuilder.create().texOffs(132, 112).addBox(-35.0F, -12.0F, -64.0F, 16.0F, 12.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(110, 182).addBox(-21.5F, -95.0F, -64.0F, 43.0F, 3.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(0, 222).addBox(-45.0F, -66.3F, -57.0F, 90.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(132, 0).addBox(-27.5F, -93.0F, -63.0F, 14.0F, 8.0F, 14.0F, new CubeDeformation(0.0F)) + .texOffs(84, 201).addBox(-25.5F, -92.0F, -60.0F, 51.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(188, 0).addBox(13.5F, -93.0F, -63.0F, 14.0F, 8.0F, 14.0F, new CubeDeformation(0.0F)) + .texOffs(196, 112).addBox(19.0F, -12.0F, -64.0F, 16.0F, 12.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone3 = pillar.addOrReplaceChild("bone3", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(37.0311F, 38.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(33.0311F, 42.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(29.0311F, 46.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone56_r1 = bone56.addOrReplaceChild("bone56_r1", CubeListBuilder.create().texOffs(60, 214).mirror().addBox(-3.5F, -2.0F, -1.5F, 7.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(31.5152F, -67.1264F, -56.0F, 0.0F, 0.0F, -0.1745F)); - PartDefinition bone4 = pillar.addOrReplaceChild("bone4", CubeListBuilder.create().texOffs(0, 0).addBox(36.9964F, -42.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(40.9964F, -38.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(44.9964F, -34.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone57_r1 = bone56.addOrReplaceChild("bone57_r1", CubeListBuilder.create().texOffs(40, 214).mirror().addBox(-3.5F, -2.0F, -1.5F, 7.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(14.5152F, -67.1264F, -56.0F, 0.0F, 0.0F, 0.1745F)); - PartDefinition bone5 = pillar.addOrReplaceChild("bone5", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(36.9964F, 38.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(32.9964F, 42.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(28.9964F, 46.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone56_r2 = bone56.addOrReplaceChild("bone56_r2", CubeListBuilder.create().texOffs(184, 22).addBox(-6.5F, -39.0F, -6.5F, 13.0F, 77.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(24.0F, -47.0F, -56.0F, 0.0F, 0.0F, -0.0873F)); - PartDefinition bone10 = pillar.addOrReplaceChild("bone10", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, 1.5708F, 0.0F)); + PartDefinition bone57_r2 = bone56.addOrReplaceChild("bone57_r2", CubeListBuilder.create().texOffs(202, 201).addBox(-4.5F, -2.75F, -4.0F, 34.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(28.625F, -90.0F, -56.0F, 0.0F, 0.0F, -0.0873F)); - PartDefinition bone6 = bone10.addOrReplaceChild("bone6", CubeListBuilder.create().texOffs(0, 0).addBox(-11.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-7.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-3.7243F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone57_r3 = bone56.addOrReplaceChild("bone57_r3", CubeListBuilder.create().texOffs(228, 182).addBox(-5.5F, -1.5F, -8.0F, 39.0F, 3.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(26.0F, -94.0F, -56.0F, 0.0F, 0.0F, -0.0873F)); - PartDefinition bone7 = bone10.addOrReplaceChild("bone7", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(7.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(3.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-0.2757F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone57_r4 = bone56.addOrReplaceChild("bone57_r4", CubeListBuilder.create().texOffs(0, 201).addBox(-29.5F, -2.75F, -4.0F, 34.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-28.625F, -90.0F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone8 = bone10.addOrReplaceChild("bone8", CubeListBuilder.create().texOffs(0, 0).addBox(7.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(11.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(15.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone57_r5 = bone56.addOrReplaceChild("bone57_r5", CubeListBuilder.create().texOffs(20, 214).addBox(-3.5F, -2.0F, -1.5F, 7.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-14.5152F, -67.1264F, -56.0F, 0.0F, 0.0F, -0.1745F)); - PartDefinition bone9 = bone10.addOrReplaceChild("bone9", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-11.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-15.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-19.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone56_r3 = bone56.addOrReplaceChild("bone56_r3", CubeListBuilder.create().texOffs(0, 214).addBox(-3.5F, -2.0F, -1.5F, 7.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-31.5152F, -67.1264F, -56.0F, 0.0F, 0.0F, 0.1745F)); - PartDefinition pillar2 = partdefinition.addOrReplaceChild("pillar2", CubeListBuilder.create().texOffs(0, 44).addBox(48.0F, -48.0F, -32.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(0, 21).addBox(47.5F, -48.5F, -32.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(47.5F, -33.5F, -32.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone56_r4 = bone56.addOrReplaceChild("bone56_r4", CubeListBuilder.create().texOffs(132, 22).addBox(-6.5F, -39.0F, -6.5F, 13.0F, 77.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-24.0F, -47.0F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone11 = pillar2.addOrReplaceChild("bone11", CubeListBuilder.create().texOffs(0, 0).addBox(36.9617F, -42.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(40.9617F, -38.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(44.9617F, -34.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -14.8F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone57_r6 = bone56.addOrReplaceChild("bone57_r6", CubeListBuilder.create().texOffs(0, 182).addBox(-33.5F, -1.5F, -8.0F, 39.0F, 3.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-26.0F, -94.0F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone12 = pillar2.addOrReplaceChild("bone12", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(37.0311F, 38.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(33.0311F, 42.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(29.0311F, 46.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -14.8F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone65 = bone56.addOrReplaceChild("bone65", CubeListBuilder.create().texOffs(98, 156).addBox(-20.0F, -4.2941F, -2.0F, 40.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -96.7059F, -56.0F)); - PartDefinition bone13 = pillar2.addOrReplaceChild("bone13", CubeListBuilder.create().texOffs(0, 0).addBox(36.9964F, -42.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(40.9964F, -38.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(44.9964F, -34.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -33.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone58_r1 = bone65.addOrReplaceChild("bone58_r1", CubeListBuilder.create().texOffs(110, 140).addBox(-20.5F, -99.0F, -55.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 107.7311F, 28.7446F, -0.2618F, 0.0F, 0.0F)); - PartDefinition bone14 = pillar2.addOrReplaceChild("bone14", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(36.9964F, 38.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(32.9964F, 42.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(28.9964F, 46.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -33.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone57_r7 = bone65.addOrReplaceChild("bone57_r7", CubeListBuilder.create().texOffs(110, 166).addBox(-20.5F, -99.0F, -71.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 78.7433F, 79.4391F, 0.2618F, 0.0F, 0.0F)); - PartDefinition bone15 = pillar2.addOrReplaceChild("bone15", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, -24.0F, 0.0F, -1.5708F, 0.0F)); + PartDefinition bone57 = bone56.addOrReplaceChild("bone57", CubeListBuilder.create().texOffs(10, 156).addBox(-20.0F, -4.2941F, -2.0F, 40.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-40.0F, -98.3934F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone16 = bone15.addOrReplaceChild("bone16", CubeListBuilder.create().texOffs(0, 0).addBox(-11.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-7.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-3.7243F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone59_r1 = bone57.addOrReplaceChild("bone59_r1", CubeListBuilder.create().texOffs(0, 140).addBox(-20.5F, -99.0F, -55.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 107.7311F, 28.7446F, -0.2618F, 0.0F, 0.0F)); - PartDefinition bone17 = bone15.addOrReplaceChild("bone17", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(7.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(3.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-0.2757F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone58_r2 = bone57.addOrReplaceChild("bone58_r2", CubeListBuilder.create().texOffs(0, 166).addBox(-20.5F, -99.0F, -71.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 78.7433F, 79.4391F, 0.2618F, 0.0F, 0.0F)); - PartDefinition bone18 = bone15.addOrReplaceChild("bone18", CubeListBuilder.create().texOffs(0, 0).addBox(7.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(11.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(15.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone59 = bone56.addOrReplaceChild("bone59", CubeListBuilder.create().texOffs(236, 59).addBox(-7.0F, -20.0F, -1.0F, 14.0F, 22.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(268, 62).addBox(-5.5F, -18.5F, -1.7F, 11.0F, 19.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -67.2128F, -60.2462F, 0.0437F, 0.0F, 0.0F)); - PartDefinition bone19 = bone15.addOrReplaceChild("bone19", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-11.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-15.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-19.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone60 = bone56.addOrReplaceChild("bone60", CubeListBuilder.create().texOffs(236, 83).addBox(-7.0F, -20.0F, -1.0F, 14.0F, 22.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(268, 83).addBox(-5.5F, -18.5F, -0.25F, 11.0F, 19.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -67.2563F, -51.751F, -0.0437F, 0.0F, 0.0F)); - PartDefinition pillar3 = partdefinition.addOrReplaceChild("pillar3", CubeListBuilder.create().texOffs(0, 44).mirror().addBox(-64.0F, -48.0F, 16.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 21).mirror().addBox(-64.5F, -48.5F, 15.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-64.5F, -33.5F, 15.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone61 = bone56.addOrReplaceChild("bone61", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); - PartDefinition bone20 = pillar3.addOrReplaceChild("bone20", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-40.9617F, -42.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-44.9617F, -38.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-48.9617F, -34.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone63 = bone61.addOrReplaceChild("bone63", CubeListBuilder.create(), PartPose.offsetAndRotation(38.0F, -31.75F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone21 = pillar3.addOrReplaceChild("bone21", CubeListBuilder.create().texOffs(0, 0).addBox(-41.0311F, 38.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-37.0311F, 42.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-33.0311F, 46.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone62 = bone56.addOrReplaceChild("bone62", CubeListBuilder.create().texOffs(278, 18).addBox(-40.25F, -8.0F, -58.0F, 4.0F, 8.0F, 4.0F, new CubeDeformation(0.5F)) + .texOffs(246, 18).addBox(-40.25F, -27.0F, -58.0F, 4.0F, 19.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(274, 42).addBox(-42.0F, -24.0F, -57.0F, 11.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(236, 41).addBox(-45.0F, -31.0F, -58.5F, 14.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)) + .texOffs(274, 46).addBox(31.0F, -24.0F, -57.0F, 11.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(262, 18).addBox(36.25F, -27.0F, -58.0F, 4.0F, 19.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(278, 30).addBox(36.25F, -8.0F, -58.0F, 4.0F, 8.0F, 4.0F, new CubeDeformation(0.5F)) + .texOffs(236, 50).addBox(31.0F, -31.0F, -58.5F, 14.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); - PartDefinition bone22 = pillar3.addOrReplaceChild("bone22", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-40.9964F, -42.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-44.9964F, -38.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-48.9964F, -34.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone64 = bone62.addOrReplaceChild("bone64", CubeListBuilder.create().texOffs(245, 2).addBox(-8.9962F, -0.5872F, -3.0F, 17.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-38.0F, -31.75F, -56.0F, 0.0F, 0.0F, -0.0873F)); - PartDefinition bone23 = pillar3.addOrReplaceChild("bone23", CubeListBuilder.create().texOffs(0, 0).addBox(-40.9964F, 38.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-36.9964F, 42.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-32.9964F, 46.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone66 = bone62.addOrReplaceChild("bone66", CubeListBuilder.create().texOffs(245, 10).addBox(-8.0038F, -0.5872F, -3.0F, 17.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(38.0F, -31.75F, -56.0F, 0.0F, 0.0F, 0.0873F)); - PartDefinition bone24 = pillar3.addOrReplaceChild("bone24", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, -1.5708F, 0.0F)); + PartDefinition bone58 = bone56.addOrReplaceChild("bone58", CubeListBuilder.create().texOffs(186, 156).addBox(-20.0F, -4.2941F, -2.0F, 40.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(40.0F, -98.3934F, -56.0F, 0.0F, 0.0F, -0.0873F)); - PartDefinition bone25 = bone24.addOrReplaceChild("bone25", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(7.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(3.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-0.2757F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone59_r2 = bone58.addOrReplaceChild("bone59_r2", CubeListBuilder.create().texOffs(220, 140).addBox(-20.5F, -99.0F, -55.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 107.7311F, 28.7446F, -0.2618F, 0.0F, 0.0F)); - PartDefinition bone26 = bone24.addOrReplaceChild("bone26", CubeListBuilder.create().texOffs(0, 0).addBox(-11.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-7.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-3.7243F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone58_r3 = bone58.addOrReplaceChild("bone58_r3", CubeListBuilder.create().texOffs(220, 166).addBox(-20.5F, -99.0F, -71.0F, 41.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 78.7433F, 79.4391F, 0.2618F, 0.0F, 0.0F)); - PartDefinition bone27 = bone24.addOrReplaceChild("bone27", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-11.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-15.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-19.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition pillar = partdefinition.addOrReplaceChild("pillar", CubeListBuilder.create().texOffs(0, 0).addBox(48.0F, -48.0F, 16.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(47.5F, -48.5F, 15.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(47.5F, -33.5F, 15.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone28 = bone24.addOrReplaceChild("bone28", CubeListBuilder.create().texOffs(0, 0).addBox(7.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(11.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(15.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone2 = pillar.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(48, 0).addBox(36.9617F, -42.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(40.9617F, -38.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(44.9617F, -34.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition pillar4 = partdefinition.addOrReplaceChild("pillar4", CubeListBuilder.create().texOffs(0, 44).mirror().addBox(-64.0F, -48.0F, -32.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 21).mirror().addBox(-64.5F, -48.5F, -32.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-64.5F, -33.5F, -32.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone3 = pillar.addOrReplaceChild("bone3", CubeListBuilder.create().texOffs(48, 0).addBox(37.0311F, 38.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(33.0311F, 42.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(29.0311F, 46.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone29 = pillar4.addOrReplaceChild("bone29", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-40.9617F, -42.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-44.9617F, -38.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-48.9617F, -34.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -14.8F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone4 = pillar.addOrReplaceChild("bone4", CubeListBuilder.create().texOffs(48, 0).addBox(36.9964F, -42.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(40.9964F, -38.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(44.9964F, -34.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone30 = pillar4.addOrReplaceChild("bone30", CubeListBuilder.create().texOffs(0, 0).addBox(-41.0311F, 38.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-37.0311F, 42.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-33.0311F, 46.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -14.8F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone5 = pillar.addOrReplaceChild("bone5", CubeListBuilder.create().texOffs(48, 0).addBox(36.9964F, 38.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(32.9964F, 42.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(28.9964F, 46.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone31 = pillar4.addOrReplaceChild("bone31", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-40.9964F, -42.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-44.9964F, -38.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-48.9964F, -34.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -33.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone10 = pillar.addOrReplaceChild("bone10", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, 1.5708F, 0.0F)); - PartDefinition bone32 = pillar4.addOrReplaceChild("bone32", CubeListBuilder.create().texOffs(0, 0).addBox(-40.9964F, 38.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-36.9964F, 42.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-32.9964F, 46.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -33.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone6 = bone10.addOrReplaceChild("bone6", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-7.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-3.7243F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone33 = pillar4.addOrReplaceChild("bone33", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, -24.0F, 0.0F, 1.5708F, 0.0F)); + PartDefinition bone7 = bone10.addOrReplaceChild("bone7", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(3.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-0.2757F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone34 = bone33.addOrReplaceChild("bone34", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(7.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(3.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-0.2757F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone8 = bone10.addOrReplaceChild("bone8", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(11.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(15.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone35 = bone33.addOrReplaceChild("bone35", CubeListBuilder.create().texOffs(0, 0).addBox(-11.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-7.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-3.7243F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone9 = bone10.addOrReplaceChild("bone9", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-15.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-19.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone36 = bone33.addOrReplaceChild("bone36", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-11.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-15.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-19.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition pillar2 = partdefinition.addOrReplaceChild("pillar2", CubeListBuilder.create().texOffs(0, 0).addBox(48.0F, -48.0F, -32.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(47.5F, -48.5F, -32.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(47.5F, -33.5F, -32.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone37 = bone33.addOrReplaceChild("bone37", CubeListBuilder.create().texOffs(0, 0).addBox(7.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(11.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(15.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone11 = pillar2.addOrReplaceChild("bone11", CubeListBuilder.create().texOffs(48, 0).addBox(36.9617F, -42.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(40.9617F, -38.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(44.9617F, -34.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -14.8F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition pillar5 = partdefinition.addOrReplaceChild("pillar5", CubeListBuilder.create().texOffs(0, 44).mirror().addBox(-32.0F, -48.0F, 48.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 21).mirror().addBox(-32.5F, -48.5F, 47.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-32.5F, -33.5F, 47.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone12 = pillar2.addOrReplaceChild("bone12", CubeListBuilder.create().texOffs(48, 0).addBox(37.0311F, 38.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(33.0311F, 42.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(29.0311F, 46.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -14.8F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone38 = pillar5.addOrReplaceChild("bone38", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-13.1213F, -24.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-17.1213F, -20.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-21.1213F, -16.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone13 = pillar2.addOrReplaceChild("bone13", CubeListBuilder.create().texOffs(48, 0).addBox(36.9964F, -42.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(40.9964F, -38.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(44.9964F, -34.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -33.2F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone39 = pillar5.addOrReplaceChild("bone39", CubeListBuilder.create().texOffs(0, 0).addBox(-24.3042F, 9.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-20.3042F, 13.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-16.3042F, 17.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone14 = pillar2.addOrReplaceChild("bone14", CubeListBuilder.create().texOffs(48, 0).addBox(36.9964F, 38.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(32.9964F, 42.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(28.9964F, 46.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -33.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone40 = pillar5.addOrReplaceChild("bone40", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-24.2695F, -13.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-28.2695F, -9.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-32.2695F, -5.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone15 = pillar2.addOrReplaceChild("bone15", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, -24.0F, 0.0F, -1.5708F, 0.0F)); - PartDefinition bone41 = pillar5.addOrReplaceChild("bone41", CubeListBuilder.create().texOffs(0, 0).addBox(-13.156F, 20.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-9.156F, 24.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-5.156F, 28.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone16 = bone15.addOrReplaceChild("bone16", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-7.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-3.7243F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone42 = pillar5.addOrReplaceChild("bone42", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, -1.5708F, 0.0F)); + PartDefinition bone17 = bone15.addOrReplaceChild("bone17", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(3.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-0.2757F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone43 = bone42.addOrReplaceChild("bone43", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(24.4512F, 16.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(20.4512F, 20.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(16.4512F, 24.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone18 = bone15.addOrReplaceChild("bone18", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(11.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(15.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone44 = bone42.addOrReplaceChild("bone44", CubeListBuilder.create().texOffs(0, 0).addBox(16.1161F, -29.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(20.1161F, -25.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(24.1161F, -21.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone19 = bone15.addOrReplaceChild("bone19", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-15.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-19.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone45 = bone42.addOrReplaceChild("bone45", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(16.1161F, 25.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(12.1161F, 29.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(8.1161F, 33.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition pillar3 = partdefinition.addOrReplaceChild("pillar3", CubeListBuilder.create().texOffs(0, 0).addBox(-64.0F, -48.0F, 16.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(-64.5F, -48.5F, 15.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(-64.5F, -33.5F, 15.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone46 = bone42.addOrReplaceChild("bone46", CubeListBuilder.create().texOffs(0, 0).addBox(24.4512F, -20.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(28.4512F, -16.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(32.4512F, -12.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone20 = pillar3.addOrReplaceChild("bone20", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9617F, -42.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-44.9617F, -38.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-48.9617F, -34.2246F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition pillar6 = partdefinition.addOrReplaceChild("pillar6", CubeListBuilder.create().texOffs(0, 44).addBox(16.0F, -48.0F, 48.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(0, 21).addBox(15.5F, -48.5F, 47.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(15.5F, -33.5F, 47.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone21 = pillar3.addOrReplaceChild("bone21", CubeListBuilder.create().texOffs(48, 0).addBox(-41.0311F, 38.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-37.0311F, 42.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-33.0311F, 46.1562F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone47 = pillar6.addOrReplaceChild("bone47", CubeListBuilder.create().texOffs(0, 0).addBox(9.1213F, -24.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(13.1213F, -20.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(17.1213F, -16.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone22 = pillar3.addOrReplaceChild("bone22", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9964F, -42.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-44.9964F, -38.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-48.9964F, -34.1904F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone48 = pillar6.addOrReplaceChild("bone48", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(20.3042F, 9.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(16.3042F, 13.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(12.3042F, 17.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition bone23 = pillar3.addOrReplaceChild("bone23", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9964F, 38.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-36.9964F, 42.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-32.9964F, 46.1904F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone49 = pillar6.addOrReplaceChild("bone49", CubeListBuilder.create().texOffs(0, 0).addBox(20.2695F, -13.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(24.2695F, -9.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(28.2695F, -5.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone24 = pillar3.addOrReplaceChild("bone24", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, -1.5708F, 0.0F)); - PartDefinition bone50 = pillar6.addOrReplaceChild("bone50", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(9.156F, 20.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(5.156F, 24.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(1.156F, 28.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone25 = bone24.addOrReplaceChild("bone25", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(3.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-0.2757F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone51 = pillar6.addOrReplaceChild("bone51", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, 1.5708F, 0.0F)); + PartDefinition bone26 = bone24.addOrReplaceChild("bone26", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, -11.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-7.7243F, -7.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-3.7243F, -3.5766F, 54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + + PartDefinition bone27 = bone24.addOrReplaceChild("bone27", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-15.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-19.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone52 = bone51.addOrReplaceChild("bone52", CubeListBuilder.create().texOffs(0, 0).addBox(-28.4512F, 16.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-24.4512F, 20.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-20.4512F, 24.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + PartDefinition bone28 = bone24.addOrReplaceChild("bone28", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, 7.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(11.7243F, 11.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(15.7243F, 15.5766F, 54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone53 = bone51.addOrReplaceChild("bone53", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-20.1161F, -29.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-24.1161F, -25.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-28.1161F, -21.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + PartDefinition pillar4 = partdefinition.addOrReplaceChild("pillar4", CubeListBuilder.create().texOffs(0, 0).addBox(-64.0F, -48.0F, -32.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(-64.5F, -48.5F, -32.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(-64.5F, -33.5F, -32.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone54 = bone51.addOrReplaceChild("bone54", CubeListBuilder.create().texOffs(0, 0).addBox(-20.1161F, 25.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-16.1161F, 29.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-12.1161F, 33.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + PartDefinition bone29 = pillar4.addOrReplaceChild("bone29", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9617F, -42.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-44.9617F, -38.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-48.9617F, -34.2246F, -0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -14.8F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone55 = bone51.addOrReplaceChild("bone55", CubeListBuilder.create().texOffs(0, 0).mirror().addBox(-28.4512F, -20.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-32.4512F, -16.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 0).mirror().addBox(-36.4512F, -12.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + PartDefinition bone30 = pillar4.addOrReplaceChild("bone30", CubeListBuilder.create().texOffs(48, 0).addBox(-41.0311F, 38.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-37.0311F, 42.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-33.0311F, 46.1562F, -0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -14.8F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone = partdefinition.addOrReplaceChild("bone", CubeListBuilder.create().texOffs(64, 39).addBox(-24.0F, -1.0F, -24.0F, 48.0F, 0.0F, 48.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone31 = pillar4.addOrReplaceChild("bone31", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9964F, -42.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-44.9964F, -38.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-48.9964F, -34.1904F, 0.0955F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -33.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone56 = partdefinition.addOrReplaceChild("bone56", CubeListBuilder.create().texOffs(150, 227).addBox(-32.0F, -12.0F, -64.0F, 16.0F, 12.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(150, 227).mirror().addBox(16.0F, -12.0F, -64.0F, 16.0F, 12.0F, 16.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 236).addBox(-60.0F, -101.0F, -58.0F, 120.0F, 6.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(2, 176).addBox(-54.5F, -95.0F, -64.0F, 109.0F, 3.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(0, 186).addBox(-45.0F, -66.3F, -57.0F, 90.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(192, 171).addBox(-32.0F, -42.0F, -64.0F, 16.0F, 30.0F, 16.0F, new CubeDeformation(0.0F)) - .texOffs(192, 171).mirror().addBox(16.0F, -42.0F, -64.0F, 16.0F, 30.0F, 16.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(153, 188).mirror().addBox(16.5F, -55.0F, -63.5F, 15.0F, 13.0F, 15.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(153, 188).addBox(-31.5F, -55.0F, -63.5F, 15.0F, 13.0F, 15.0F, new CubeDeformation(0.0F)) - .texOffs(49, 184).mirror().addBox(17.0F, -73.0F, -63.0F, 14.0F, 18.0F, 14.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(49, 184).addBox(-31.0F, -73.0F, -63.0F, 14.0F, 18.0F, 14.0F, new CubeDeformation(0.0F)) - .texOffs(30, 173).mirror().addBox(17.5F, -85.0F, -62.5F, 13.0F, 12.0F, 13.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(30, 173).addBox(-30.5F, -85.0F, -62.5F, 13.0F, 12.0F, 13.0F, new CubeDeformation(0.0F)) - .texOffs(0, 192).mirror().addBox(17.0F, -92.0F, -63.0F, 14.0F, 7.0F, 14.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(0, 192).addBox(-31.0F, -92.0F, -63.0F, 14.0F, 7.0F, 14.0F, new CubeDeformation(0.0F)) - .texOffs(28, 208).addBox(-47.0F, -68.3F, -59.0F, 94.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)) - .texOffs(0, 180).addBox(-50.5F, -92.0F, -60.0F, 101.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + PartDefinition bone32 = pillar4.addOrReplaceChild("bone32", CubeListBuilder.create().texOffs(48, 0).addBox(-40.9964F, 38.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-36.9964F, 42.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-32.9964F, 46.1904F, 0.3045F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -33.2F, -0.1745F, 0.1745F, 0.7854F)); + + PartDefinition bone33 = pillar4.addOrReplaceChild("bone33", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, -24.0F, 0.0F, 1.5708F, 0.0F)); - PartDefinition bone57 = bone56.addOrReplaceChild("bone57", CubeListBuilder.create().texOffs(0, 228).addBox(-55.5F, -1.0F, -14.5F, 111.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -98.0F, -56.5F, 0.2618F, 0.0F, 0.0F)); + PartDefinition bone34 = bone33.addOrReplaceChild("bone34", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(3.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-0.2757F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); - PartDefinition bone58 = bone56.addOrReplaceChild("bone58", CubeListBuilder.create().texOffs(0, 222).addBox(-55.5F, -1.0F, 0.5F, 111.0F, 2.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -98.0F, -55.5F, -0.2618F, 0.0F, 0.0F)); + PartDefinition bone35 = bone33.addOrReplaceChild("bone35", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, -11.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-7.7243F, -7.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-3.7243F, -3.5766F, -54.5114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); - PartDefinition bone59 = bone56.addOrReplaceChild("bone59", CubeListBuilder.create().texOffs(224, 234).addBox(-6.0F, -20.0F, -1.0F, 12.0F, 20.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(230, 7).addBox(-4.5F, -18.5F, -1.7F, 9.0F, 17.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -67.3F, -59.25F, 0.0873F, 0.0F, 0.0F)); + PartDefinition bone36 = bone33.addOrReplaceChild("bone36", CubeListBuilder.create().texOffs(48, 0).addBox(-11.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-15.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-19.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone60 = bone56.addOrReplaceChild("bone60", CubeListBuilder.create().texOffs(224, 234).addBox(-6.0F, -20.0F, -1.0F, 12.0F, 20.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(230, 7).addBox(-4.5F, -18.5F, -0.25F, 9.0F, 17.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -67.3F, -52.75F, -0.0873F, 0.0F, 0.0F)); + PartDefinition bone37 = bone33.addOrReplaceChild("bone37", CubeListBuilder.create().texOffs(48, 0).addBox(7.7243F, 7.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(11.7243F, 11.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(15.7243F, 15.5766F, -54.1114F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone61 = bone56.addOrReplaceChild("bone61", CubeListBuilder.create().texOffs(16, 243).mirror().addBox(35.25F, -8.0F, -58.0F, 4.0F, 8.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(5, 178).mirror().addBox(35.25F, -27.0F, -58.0F, 4.0F, 19.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(5, 180).mirror().addBox(32.0F, -24.0F, -57.0F, 9.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(217, 178).mirror().addBox(32.0F, -31.0F, -58.5F, 12.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition pillar5 = partdefinition.addOrReplaceChild("pillar5", CubeListBuilder.create().texOffs(0, 0).addBox(-32.0F, -48.0F, 48.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(-32.5F, -48.5F, 47.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(-32.5F, -33.5F, 47.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - PartDefinition bone63 = bone61.addOrReplaceChild("bone63", CubeListBuilder.create().texOffs(204, 236).mirror().addBox(-6.0F, -0.5F, -3.0F, 14.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(38.0F, -31.75F, -56.0F, 0.0F, 0.0F, 0.0873F)); + PartDefinition bone38 = pillar5.addOrReplaceChild("bone38", CubeListBuilder.create().texOffs(48, 0).addBox(-13.1213F, -24.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-17.1213F, -20.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-21.1213F, -16.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); - PartDefinition bone62 = bone56.addOrReplaceChild("bone62", CubeListBuilder.create().texOffs(16, 243).addBox(-39.25F, -8.0F, -58.0F, 4.0F, 8.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(5, 178).addBox(-39.25F, -27.0F, -58.0F, 4.0F, 19.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(5, 180).addBox(-41.0F, -24.0F, -57.0F, 9.0F, 2.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(217, 178).addBox(-44.0F, -31.0F, -58.5F, 12.0F, 4.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition bone39 = pillar5.addOrReplaceChild("bone39", CubeListBuilder.create().texOffs(48, 0).addBox(-24.3042F, 9.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-20.3042F, 13.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-16.3042F, 17.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); - PartDefinition bone64 = bone62.addOrReplaceChild("bone64", CubeListBuilder.create().texOffs(204, 236).addBox(-8.0F, -0.5F, -3.0F, 14.0F, 2.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-38.0F, -31.75F, -56.0F, 0.0F, 0.0F, -0.0873F)); + PartDefinition bone40 = pillar5.addOrReplaceChild("bone40", CubeListBuilder.create().texOffs(48, 0).addBox(-24.2695F, -13.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-28.2695F, -9.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-32.2695F, -5.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); - return LayerDefinition.create(meshdefinition, 256, 256); + PartDefinition bone41 = pillar5.addOrReplaceChild("bone41", CubeListBuilder.create().texOffs(48, 0).addBox(-13.156F, 20.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-9.156F, 24.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-5.156F, 28.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + + PartDefinition bone42 = pillar5.addOrReplaceChild("bone42", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, -1.5708F, 0.0F)); + + PartDefinition bone43 = bone42.addOrReplaceChild("bone43", CubeListBuilder.create().texOffs(48, 0).addBox(24.4512F, 16.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(20.4512F, 20.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(16.4512F, 24.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + + PartDefinition bone44 = bone42.addOrReplaceChild("bone44", CubeListBuilder.create().texOffs(48, 0).addBox(16.1161F, -29.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(20.1161F, -25.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(24.1161F, -21.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + + PartDefinition bone45 = bone42.addOrReplaceChild("bone45", CubeListBuilder.create().texOffs(48, 0).addBox(16.1161F, 25.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(12.1161F, 29.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(8.1161F, 33.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + + PartDefinition bone46 = bone42.addOrReplaceChild("bone46", CubeListBuilder.create().texOffs(48, 0).addBox(24.4512F, -20.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(28.4512F, -16.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(32.4512F, -12.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + + PartDefinition pillar6 = partdefinition.addOrReplaceChild("pillar6", CubeListBuilder.create().texOffs(0, 0).addBox(16.0F, -48.0F, 48.0F, 16.0F, 48.0F, 16.0F, new CubeDeformation(0.0F)) + .texOffs(64, 21).addBox(15.5F, -48.5F, 47.5F, 17.0F, 6.0F, 17.0F, new CubeDeformation(0.0F)) + .texOffs(64, 0).addBox(15.5F, -33.5F, 47.5F, 17.0F, 4.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition bone47 = pillar6.addOrReplaceChild("bone47", CubeListBuilder.create().texOffs(48, 0).addBox(9.1213F, -24.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(13.1213F, -20.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(17.1213F, -16.731F, 31.1903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 14.8F, -0.1745F, 0.1745F, 0.7854F)); + + PartDefinition bone48 = pillar6.addOrReplaceChild("bone48", CubeListBuilder.create().texOffs(48, 0).addBox(20.3042F, 9.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(16.3042F, 13.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(12.3042F, 17.7179F, 31.2799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 14.8F, -0.1745F, -0.1745F, -0.7854F)); + + PartDefinition bone49 = pillar6.addOrReplaceChild("bone49", CubeListBuilder.create().texOffs(48, 0).addBox(20.2695F, -13.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(24.2695F, -9.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(28.2695F, -5.7521F, 30.8799F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 33.2F, 0.1745F, -0.1745F, 0.7854F)); + + PartDefinition bone50 = pillar6.addOrReplaceChild("bone50", CubeListBuilder.create().texOffs(48, 0).addBox(9.156F, 20.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(5.156F, 24.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(1.156F, 28.6968F, 30.7903F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 33.2F, 0.1745F, 0.1745F, -0.7854F)); + + PartDefinition bone51 = pillar6.addOrReplaceChild("bone51", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 24.0F, 0.0F, 1.5708F, 0.0F)); + + PartDefinition bone52 = bone51.addOrReplaceChild("bone52", CubeListBuilder.create().texOffs(48, 0).addBox(-28.4512F, 16.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-24.4512F, 20.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-20.4512F, 24.8617F, 23.536F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, -9.2F, -0.1745F, 0.1745F, 0.7854F)); + + PartDefinition bone53 = bone51.addOrReplaceChild("bone53", CubeListBuilder.create().texOffs(48, 0).addBox(-20.1161F, -29.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-24.1161F, -25.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-28.1161F, -21.0702F, 23.4166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, -9.2F, -0.1745F, -0.1745F, -0.7854F)); + + PartDefinition bone54 = bone51.addOrReplaceChild("bone54", CubeListBuilder.create().texOffs(48, 0).addBox(-20.1161F, 25.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-16.1161F, 29.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-12.1161F, 33.0702F, 23.0166F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.25F, -27.5F, 9.2F, 0.1745F, -0.1745F, 0.7854F)); + + PartDefinition bone55 = bone51.addOrReplaceChild("bone55", CubeListBuilder.create().texOffs(48, 0).addBox(-28.4512F, -20.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-32.4512F, -16.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(48, 0).addBox(-36.4512F, -12.8617F, 23.136F, 4.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.25F, -27.5F, 9.2F, 0.1745F, 0.1745F, -0.7854F)); + + return LayerDefinition.create(meshdefinition, 512, 512); } @Override public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + } @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) { - pillar.render(poseStack, buffer, packedLight, packedOverlay); - pillar2.render(poseStack, buffer, packedLight, packedOverlay); - pillar3.render(poseStack, buffer, packedLight, packedOverlay); - pillar4.render(poseStack, buffer, packedLight, packedOverlay); - pillar5.render(poseStack, buffer, packedLight, packedOverlay); - pillar6.render(poseStack, buffer, packedLight, packedOverlay); - bone.render(poseStack, buffer, packedLight, packedOverlay); - bone56.render(poseStack, buffer, packedLight, packedOverlay); + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { + bone.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + bone56.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar2.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar3.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar4.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar5.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); + pillar6.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); } } \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/NewEntityFairyModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/NewEntityFairyModel.java index 9c3e1ca4a..6427c96c0 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/NewEntityFairyModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/NewEntityFairyModel.java @@ -17,208 +17,165 @@ public class NewEntityFairyModel extends EntityModel { public static ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "main"), "new_fairy"); private final ModelPart head; - private final ModelPart armRight; + private final ModelPart blink; private final ModelPart armLeft; private final ModelPart body; + private final ModelPart skirt; + private final ModelPart apron2; private final ModelPart legLeft; private final ModelPart legRight; private final ModelPart wingLeft; private final ModelPart wingRight; - private final ModelPart blink; + private final ModelPart armRight; public NewEntityFairyModel(ModelPart root) { super(RenderType::entityTranslucent); this.head = root.getChild("head"); - this.armRight = root.getChild("armRight"); + this.blink = this.head.getChild("blink"); this.armLeft = root.getChild("armLeft"); this.body = root.getChild("body"); + this.skirt = this.body.getChild("skirt"); + this.apron2 = this.skirt.getChild("apron2"); this.legLeft = root.getChild("legLeft"); this.legRight = root.getChild("legRight"); this.wingLeft = root.getChild("wingLeft"); this.wingRight = root.getChild("wingRight"); - this.blink = this.head.getChild("blink"); + this.armRight = root.getChild("armRight"); } public static LayerDefinition createBodyLayer() { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); - PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 15).addBox(-6.0F, -11.75F, -1.0F, 12.0F, 6.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(28, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) - .texOffs(22, 23).addBox(-4.0F, -8.0688F, -4.205F, 8.0F, 13.0F, 8.0F, new CubeDeformation(0.25F)), PartPose.offset(0.0F, 6.0F, 0.0F)); - - PartDefinition blink = head.addOrReplaceChild("blink", CubeListBuilder.create().texOffs(52, 0).addBox(-4.0F, -26.0F, -4.001F, 8.0F, 8.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 18.0F, 0.0F)); - - PartDefinition bone40 = head.addOrReplaceChild("bone40", CubeListBuilder.create().texOffs(0, 43).addBox(-3.75F, 0.25F, 0.25F, 8.0F, 11.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.25F, -0.2F, 3.8F, 0.2618F, 0.0F, 0.0F)); - - PartDefinition bone5 = head.addOrReplaceChild("bone5", CubeListBuilder.create().texOffs(53, 41).addBox(-1.5F, 0.25F, 0.25F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(12, 12).addBox(-1.0F, 0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -8.0F, 4.0F, 0.2618F, 0.0F, 0.0F)); - - PartDefinition bone12 = head.addOrReplaceChild("bone12", CubeListBuilder.create().texOffs(88, 0).addBox(-3.0F, -1.75F, 0.25F, 6.0F, 6.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(80, 0).addBox(-1.0F, 0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -6.2F, 4.5F, 0.0F, 0.0F, 0.0F)); - - PartDefinition bone13 = head.addOrReplaceChild("bone13", CubeListBuilder.create().texOffs(68, 3).addBox(-1.25F, -1.5F, 1.0F, 3.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(68, 0).addBox(-0.8F, -1.0F, 0.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.25F, -1.75F, 3.55F, 0.0F, 0.0F, -0.1745F)); - - PartDefinition bone6 = head.addOrReplaceChild("bone6", CubeListBuilder.create().texOffs(54, 31).addBox(0.5F, -0.75F, -1.75F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(0, 12).addBox(-1.25F, -0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0F, -7.0F, 2.0F, 0.0F, 0.0F, -0.1745F)); - - PartDefinition bone7 = head.addOrReplaceChild("bone7", CubeListBuilder.create().texOffs(6, 12).addBox(-0.75F, -0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) - .texOffs(52, 51).addBox(-3.5F, -0.75F, -1.75F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.0F, -7.0F, 2.0F, 0.0F, 0.0F, 0.1745F)); - - PartDefinition bone14 = head.addOrReplaceChild("bone14", CubeListBuilder.create().texOffs(74, 0).mirror().addBox(-1.2F, -1.0F, 0.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)).mirror(false) - .texOffs(78, 3).mirror().addBox(-1.75F, -1.5F, 1.0F, 3.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-2.25F, -1.75F, 3.55F, 0.0F, 0.0F, 0.1745F)); - - PartDefinition og_hair = head.addOrReplaceChild("og_hair", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, -0.3F, 3.8F, 0.2618F, 0.0F, 0.0F)); - - PartDefinition hair1 = og_hair.addOrReplaceChild("hair1", CubeListBuilder.create().texOffs(70, 12).addBox(-0.2F, 0.25F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.0436F)); - - PartDefinition hair2 = og_hair.addOrReplaceChild("hair2", CubeListBuilder.create().texOffs(72, 12).addBox(-0.75F, 0.05F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.9F, 0.0F, 0.0F, 0.0F, 0.0F, -0.2007F)); - - PartDefinition hair7 = og_hair.addOrReplaceChild("hair7", CubeListBuilder.create().texOffs(74, 12).addBox(-0.75F, -0.25F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.9F, 0.0F, 0.0F, 0.0F, 0.0F, -0.2356F)); - - PartDefinition hair3 = og_hair.addOrReplaceChild("hair3", CubeListBuilder.create().texOffs(76, 12).mirror().addBox(-0.8F, 0.25F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0436F)); - - PartDefinition hair4 = og_hair.addOrReplaceChild("hair4", CubeListBuilder.create().texOffs(78, 12).mirror().addBox(-0.25F, 0.05F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-1.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.1571F)); - - PartDefinition hair5 = og_hair.addOrReplaceChild("hair5", CubeListBuilder.create().texOffs(80, 12).mirror().addBox(-0.25F, -0.25F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-2.9F, 0.0F, 0.0F, 0.0F, 0.0F, 0.2356F)); - - PartDefinition hair6 = og_hair.addOrReplaceChild("hair6", CubeListBuilder.create().texOffs(82, 12).addBox(-0.75F, 0.05F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.1571F)); - - PartDefinition hair8 = og_hair.addOrReplaceChild("hair8", CubeListBuilder.create().texOffs(84, 12).mirror().addBox(-0.25F, 0.05F, 0.25F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-1.9F, 0.0F, 0.0F, 0.0F, 0.0F, 0.2007F)); - - PartDefinition armRight = partdefinition.addOrReplaceChild("armRight", CubeListBuilder.create().texOffs(32, 76).addBox(-1.7887F, 1.4532F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(41, 43).addBox(-2.2887F, 0.4532F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(12, 56).addBox(-2.2887F, 0.4532F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(-0.3F)), PartPose.offsetAndRotation(-1.0F, 6.5F, 0.0F, 0.0F, 0.0F, 0.4363F)); - - PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(16, 44).addBox(-3.0F, -7.5F, -3.0F, 6.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-4.0F, -7.5F, -3.1F, 8.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 13.5F, 0.0F)); - - PartDefinition bone167 = body.addOrReplaceChild("bone167", CubeListBuilder.create(), PartPose.offset(0.0F, -7.5F, -4.0F)); - - PartDefinition bone168 = bone167.addOrReplaceChild("bone168", CubeListBuilder.create().texOffs(12, 37).addBox(0.2891F, 0.0629F, 0.75F, 3.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.4014F)); - - PartDefinition bone169 = bone167.addOrReplaceChild("bone169", CubeListBuilder.create().texOffs(12, 39).addBox(-3.2891F, 0.0629F, 0.75F, 3.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.4014F)); - - PartDefinition bone166 = body.addOrReplaceChild("bone166", CubeListBuilder.create().texOffs(48, 16).addBox(-3.5F, 6.5F, 2.0F, 7.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -5.0F, -4.0F)); - - PartDefinition bone163 = bone166.addOrReplaceChild("bone163", CubeListBuilder.create().texOffs(22, 12).addBox(-2.0F, 0.0F, -0.01F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.0F, 1.0F, -0.3054F, -0.3054F, -2.3126F)); - - PartDefinition bone164 = bone166.addOrReplaceChild("bone164", CubeListBuilder.create().texOffs(18, 12).addBox(-0.75F, -1.25F, -0.01F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.25F, -0.25F, 0.0F)); + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(76, 20).addBox(-9.0F, -12.75F, -1.0F, 18.0F, 13.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(76, 33).addBox(-9.0F, -12.75F, -0.9375F, 18.0F, 13.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(32, 0).addBox(-4.0F, -7.75F, -4.0F, 8.0F, 12.0F, 8.0F, new CubeDeformation(0.5F)) + .texOffs(83, 10).addBox(-3.0F, -7.95F, 4.75F, 6.0F, 6.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(80, 10).addBox(-1.0F, -5.95F, 3.9375F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 6.0F, 0.0F)); - PartDefinition bone165 = bone164.addOrReplaceChild("bone165", CubeListBuilder.create().texOffs(28, 4).addBox(-2.0F, -1.0F, 0.99F, 3.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.25F, -0.75F, 0.0F, -0.2618F, 0.0F, 0.0F)); + PartDefinition og_hair_r1 = head.addOrReplaceChild("og_hair_r1", CubeListBuilder.create().texOffs(70, 10).addBox(-0.1799F, -0.2112F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2616F, 0.0113F, -0.0421F)); - PartDefinition bone9 = bone166.addOrReplaceChild("bone9", CubeListBuilder.create().texOffs(22, 12).mirror().addBox(0.0F, 0.0F, -0.01F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, -1.0F, 1.0F, -0.3054F, 0.3054F, 2.3126F)); + PartDefinition og_hair_r2 = head.addOrReplaceChild("og_hair_r2", CubeListBuilder.create().texOffs(66, 10).addBox(1.2039F, -0.0236F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2568F, 0.0516F, -0.194F)); - PartDefinition decoration3 = body.addOrReplaceChild("decoration3", CubeListBuilder.create().texOffs(0, 0).addBox(-0.5F, -3.0F, -4.5F, 1.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -0.5F, 7.0F)); + PartDefinition og_hair_r3 = head.addOrReplaceChild("og_hair_r3", CubeListBuilder.create().texOffs(64, 10).addBox(2.1776F, -0.0219F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2549F, 0.0605F, -0.2279F)); - PartDefinition bone11 = decoration3.addOrReplaceChild("bone11", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.384F)); + PartDefinition og_hair_r4 = head.addOrReplaceChild("og_hair_r4", CubeListBuilder.create().texOffs(72, 10).addBox(-0.8201F, -0.2112F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2616F, -0.0113F, 0.0421F)); - PartDefinition bone15 = bone11.addOrReplaceChild("bone15", CubeListBuilder.create().texOffs(24, 19).addBox(-3.5466F, -1.7981F, -4.0561F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition og_hair_r5 = head.addOrReplaceChild("og_hair_r5", CubeListBuilder.create().texOffs(74, 10).addBox(-1.3099F, -0.2495F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2587F, -0.0405F, 0.1518F)); - PartDefinition bone21 = decoration3.addOrReplaceChild("bone21", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -0.1745F)); + PartDefinition og_hair_r6 = head.addOrReplaceChild("og_hair_r6", CubeListBuilder.create().texOffs(78, 10).addBox(-3.1776F, -0.0219F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2549F, -0.0605F, 0.2279F)); - PartDefinition bone22 = bone21.addOrReplaceChild("bone22", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition og_hair_r7 = head.addOrReplaceChild("og_hair_r7", CubeListBuilder.create().texOffs(68, 10).addBox(0.3099F, -0.2495F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2587F, 0.0405F, -0.1518F)); - PartDefinition bone23 = bone21.addOrReplaceChild("bone23", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.4363F, 0.0F)); + PartDefinition og_hair_r8 = head.addOrReplaceChild("og_hair_r8", CubeListBuilder.create().texOffs(76, 10).addBox(-2.2039F, -0.0236F, 0.0F, 1.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0812F, 4.161F, 0.2568F, -0.0516F, 0.194F)); - PartDefinition bone24 = bone21.addOrReplaceChild("bone24", CubeListBuilder.create().texOffs(22, 2).addBox(-3.8132F, -1.8283F, -4.1276F, 5.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition bone40_r1 = head.addOrReplaceChild("bone40_r1", CubeListBuilder.create().texOffs(101, 9).addBox(-3.75F, 0.25F, 0.25F, 8.0F, 11.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.25F, -0.2F, 3.8F, 0.2618F, 0.0F, 0.0F)); - PartDefinition bone29 = decoration3.addOrReplaceChild("bone29", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0175F)); + PartDefinition rear_ponytail_r1 = head.addOrReplaceChild("rear_ponytail_r1", CubeListBuilder.create().texOffs(100, 0).addBox(-1.75F, -1.5F, 1.0F, 3.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(120, 0).addBox(-1.2F, -1.0F, 0.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.25F, -1.75F, 4.05F, 0.0F, 0.0F, 0.1745F)); - PartDefinition bone32 = bone29.addOrReplaceChild("bone32", CubeListBuilder.create().texOffs(24, 16).addBox(-4.0659F, -2.888F, -4.1953F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition rear_ponytail_r2 = head.addOrReplaceChild("rear_ponytail_r2", CubeListBuilder.create().texOffs(110, 0).addBox(-1.25F, -1.5F, 1.0F, 3.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(120, 3).addBox(-0.8F, -1.0F, 0.0F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.25F, -1.75F, 4.05F, 0.0F, 0.0F, -0.1745F)); - PartDefinition bone33 = decoration3.addOrReplaceChild("bone33", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 3.1241F)); + PartDefinition pigtails_r1 = head.addOrReplaceChild("pigtails_r1", CubeListBuilder.create().texOffs(64, 0).addBox(-3.5F, -0.75F, -1.75F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(61, 0).addBox(-0.75F, -0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-4.0F, -7.0F, 2.0F, 0.0F, 0.0F, 0.1745F)); - PartDefinition bone34 = bone33.addOrReplaceChild("bone34", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition pigtails_r2 = head.addOrReplaceChild("pigtails_r2", CubeListBuilder.create().texOffs(73, 0).addBox(-1.25F, -0.25F, -0.75F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(76, 0).addBox(0.5F, -0.75F, -1.75F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0F, -7.0F, 2.0F, 0.0F, 0.0F, -0.1745F)); - PartDefinition bone35 = bone33.addOrReplaceChild("bone35", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.4363F, 0.0F)); + PartDefinition bone42_r1 = head.addOrReplaceChild("bone42_r1", CubeListBuilder.create().texOffs(85, 0).addBox(-1.0F, -0.25F, -0.5F, 2.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(88, 0).addBox(-1.5F, -0.25F, 0.5F, 3.0F, 7.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.5F, 4.25F, 0.1745F, 0.0F, 0.0F)); - PartDefinition bone36 = bone33.addOrReplaceChild("bone36", CubeListBuilder.create().texOffs(0, 40).addBox(-4.0659F, 0.888F, -4.1953F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition blink = head.addOrReplaceChild("blink", CubeListBuilder.create().texOffs(24, 0).addBox(-4.0F, -26.0F, -4.001F, 8.0F, 8.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 18.0F, 0.0F)); - PartDefinition bone25 = decoration3.addOrReplaceChild("bone25", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -2.9671F)); + PartDefinition armLeft = partdefinition.addOrReplaceChild("armLeft", CubeListBuilder.create().texOffs(32, 40).addBox(-0.2113F, -0.0469F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(36, 33).addBox(-0.7113F, -1.0469F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(60, 35).addBox(-0.7113F, -1.0469F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(-0.3F)), PartPose.offsetAndRotation(2.5341F, 7.7588F, 0.0F, 0.0F, 0.0F, -0.2618F)); - PartDefinition bone26 = bone25.addOrReplaceChild("bone26", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 16).addBox(-3.0F, -7.5F, -3.0F, 6.0F, 9.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(24, 20).addBox(-4.0F, -7.5F, -3.0F, 8.0F, 7.0F, 6.0F, new CubeDeformation(0.2F)) + .texOffs(0, 33).addBox(-3.5F, 0.5F, -2.0F, 7.0F, 2.0F, 4.0F, new CubeDeformation(-0.0625F)) + .texOffs(18, 16).addBox(-0.5F, -7.0F, -4.01F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(52, 28).addBox(-0.5F, -3.5F, 2.5F, 1.0F, 3.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 13.5F, 0.0F)); - PartDefinition bone27 = bone25.addOrReplaceChild("bone27", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.4363F, 0.0F)); + PartDefinition bone168_r1 = body.addOrReplaceChild("bone168_r1", CubeListBuilder.create().texOffs(0, 31).addBox(-1.5F, -0.5F, -0.5F, 3.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.6875F, -7.25F, -2.75F, 0.0F, 0.0F, 0.3491F)); - PartDefinition bone28 = bone25.addOrReplaceChild("bone28", CubeListBuilder.create().texOffs(22, 0).addBox(-3.8132F, 0.8283F, -4.1276F, 5.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition backbow_r1 = body.addOrReplaceChild("backbow_r1", CubeListBuilder.create().texOffs(64, 20).addBox(-0.2056F, -0.208F, -1.4023F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, -0.2618F, -3.1241F)); - PartDefinition bone17 = decoration3.addOrReplaceChild("bone17", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, -2.7576F)); + PartDefinition backbow_r2 = body.addOrReplaceChild("backbow_r2", CubeListBuilder.create().texOffs(64, 23).addBox(-4.7441F, -0.7487F, -1.3889F, 5.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, 0.2618F, -0.1745F)); - PartDefinition bone18 = bone17.addOrReplaceChild("bone18", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition backbow_r3 = body.addOrReplaceChild("backbow_r3", CubeListBuilder.create().texOffs(64, 25).addBox(-4.6903F, -0.7817F, -1.3744F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, 0.2618F, -0.384F)); - PartDefinition bone19 = bone17.addOrReplaceChild("bone19", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.4363F, 0.0F)); + PartDefinition backbow_r4 = body.addOrReplaceChild("backbow_r4", CubeListBuilder.create().texOffs(62, 28).addBox(-0.4847F, 0.1799F, -1.1529F, 1.0F, 6.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.3927F, 0.0F, 0.48F)); - PartDefinition bone20 = bone17.addOrReplaceChild("bone20", CubeListBuilder.create().texOffs(0, 37).addBox(-3.5466F, -0.2019F, -4.0561F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.2618F, 0.0F)); + PartDefinition backbow_r5 = body.addOrReplaceChild("backbow_r5", CubeListBuilder.create().texOffs(52, 23).addBox(-0.2559F, -0.7487F, -1.3889F, 5.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, -0.2618F, 0.1745F)); - PartDefinition bone38 = decoration3.addOrReplaceChild("bone38", CubeListBuilder.create().texOffs(32, 65).addBox(-1.0F, -1.0F, 0.0F, 1.0F, 6.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.25F, 0.5F, -3.5F, 0.3927F, 0.0F, 0.48F)); + PartDefinition backbow_r6 = body.addOrReplaceChild("backbow_r6", CubeListBuilder.create().texOffs(52, 25).addBox(-0.3097F, -0.7817F, -1.3744F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, -0.2618F, 0.384F)); - PartDefinition bone3 = decoration3.addOrReplaceChild("bone3", CubeListBuilder.create().texOffs(36, 65).addBox(0.0F, -1.0F, 0.0F, 1.0F, 6.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.25F, 0.5F, -3.5F, 0.3927F, 0.0F, -0.48F)); + PartDefinition backbow_r7 = body.addOrReplaceChild("backbow_r7", CubeListBuilder.create().texOffs(58, 28).addBox(-0.5153F, 0.1799F, -1.1529F, 1.0F, 6.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.3927F, 0.0F, -0.48F)); - PartDefinition sittingRotationSkirt = body.addOrReplaceChild("sittingRotationSkirt", CubeListBuilder.create(), PartPose.offset(0.0F, -0.5F, 0.0F)); + PartDefinition backbow_r8 = body.addOrReplaceChild("backbow_r8", CubeListBuilder.create().texOffs(52, 20).addBox(-4.7944F, -0.208F, -1.4023F, 5.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5962F, 4.1137F, 0.0F, 0.2618F, 3.1241F)); - PartDefinition skirt = sittingRotationSkirt.addOrReplaceChild("skirt", CubeListBuilder.create().texOffs(47, 22).addBox(-2.5F, -11.0F, -2.5F, 7.0F, 2.0F, 7.0F, new CubeDeformation(0.0F)) - .texOffs(30, 16).addBox(-2.0F, -12.0F, -2.0F, 6.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-1.0F, 11.0F, -1.0F)); + PartDefinition bowtie_r1 = body.addOrReplaceChild("bowtie_r1", CubeListBuilder.create().texOffs(18, 20).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.5F, -6.5F, -3.75F, -0.3185F, -0.3035F, 0.8345F)); - PartDefinition bone = skirt.addOrReplaceChild("bone", CubeListBuilder.create(), PartPose.offset(1.0F, -5.0F, 1.0F)); + PartDefinition bowtie_r2 = body.addOrReplaceChild("bowtie_r2", CubeListBuilder.create().texOffs(22, 16).addBox(-1.5F, -2.0F, 0.5F, 3.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -5.0F, -4.01F, -0.1745F, 0.0F, 0.0F)); - PartDefinition bone4 = bone.addOrReplaceChild("bone4", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition bowtie_r3 = body.addOrReplaceChild("bowtie_r3", CubeListBuilder.create().texOffs(18, 18).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.5F, -6.5F, -3.75F, -0.3185F, 0.3035F, -0.8345F)); - PartDefinition bone49 = bone4.addOrReplaceChild("bone49", CubeListBuilder.create().texOffs(0, 67).addBox(-2.5F, -5.6578F, 0.0F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 4.4705F, 0.1745F, 0.0F, 0.0F)); + PartDefinition bone168_r2 = body.addOrReplaceChild("bone168_r2", CubeListBuilder.create().texOffs(8, 31).addBox(-1.5F, -0.5F, -0.5F, 3.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.6875F, -7.25F, -2.75F, 0.0F, 0.0F, -0.3491F)); - PartDefinition bone50 = bone49.addOrReplaceChild("bone50", CubeListBuilder.create().texOffs(20, 67).addBox(-2.0F, -5.9922F, -0.101F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, 0.1719F)); + PartDefinition skirt = body.addOrReplaceChild("skirt", CubeListBuilder.create().texOffs(24, 50).addBox(-2.5F, -11.0F, -2.5F, 7.0F, 2.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offset(-1.0F, 10.5F, -1.0F)); - PartDefinition bone51 = bone49.addOrReplaceChild("bone51", CubeListBuilder.create().texOffs(20, 67).addBox(-1.0F, -6.0922F, 0.001F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, -0.1719F)); + PartDefinition apron2_r1 = skirt.addOrReplaceChild("apron2_r1", CubeListBuilder.create().texOffs(45, 48).addBox(-4.0F, -0.5F, 0.0F, 8.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -11.183F, -2.5335F, -0.3054F, 0.0F, 0.0F)); - PartDefinition bone52 = bone.addOrReplaceChild("bone52", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -1.5708F, 0.0F)); + PartDefinition bone59_r1 = skirt.addOrReplaceChild("bone59_r1", CubeListBuilder.create().texOffs(16, 59).addBox(1.3605F, -3.9541F, 0.0311F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.1385F, -3.238F, -0.1601F, -0.0388F, -0.2135F)); - PartDefinition skirtpart_left = bone52.addOrReplaceChild("skirtpart_left", CubeListBuilder.create().texOffs(0, 67).addBox(-2.5F, -5.5578F, 0.0F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 4.4705F, 0.1745F, 0.0F, 0.0F)); + PartDefinition bone58_r1 = skirt.addOrReplaceChild("bone58_r1", CubeListBuilder.create().texOffs(60, 59).addBox(-4.3605F, -3.9541F, 0.0311F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.201F, 5.262F, 0.1765F, -0.036F, 0.214F)); - PartDefinition bone54 = skirtpart_left.addOrReplaceChild("bone54", CubeListBuilder.create().texOffs(20, 67).addBox(-2.5F, -6.0F, -0.001F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, 0.4422F, 0.0F, 0.0F, 0.0F, 0.1719F)); + PartDefinition bone59_r2 = skirt.addOrReplaceChild("bone59_r2", CubeListBuilder.create().texOffs(0, 59).addBox(-4.3605F, -3.9541F, 0.0311F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.1385F, -3.238F, -0.1601F, 0.0388F, 0.2135F)); - PartDefinition bone55 = skirtpart_left.addOrReplaceChild("bone55", CubeListBuilder.create().texOffs(20, 67).addBox(-1.0F, -6.0F, 0.001F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, -0.1719F)); + PartDefinition bone58_r2 = skirt.addOrReplaceChild("bone58_r2", CubeListBuilder.create().texOffs(6, 59).addBox(-2.5F, -4.4173F, 0.0108F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.1385F, -3.2224F, -0.1644F, 0.0F, 0.0F)); - PartDefinition skirtpart_right = bone52.addOrReplaceChild("skirtpart_right", CubeListBuilder.create().texOffs(10, 67).addBox(-2.5F, -5.5578F, -8.9415F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(10, 67).addBox(-2.5F, -5.5578F, -8.941F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.5F, 4.3705F, -0.1745F, 0.0F, 0.0F)); + PartDefinition bone59_r3 = skirt.addOrReplaceChild("bone59_r3", CubeListBuilder.create().texOffs(22, 56).addBox(0.0F, 0.2989F, -3.8614F, 0.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.4375F, -10.5578F, 1.408F, -0.1745F, 0.0F, -0.2182F)); - PartDefinition bone2 = skirtpart_right.addOrReplaceChild("bone2", CubeListBuilder.create().texOffs(26, 67).addBox(-2.5F, -6.0F, -8.941F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.0F, 0.4422F, 0.0F, 0.0F, 0.0F, 0.1719F)); + PartDefinition bone57_r1 = skirt.addOrReplaceChild("bone57_r1", CubeListBuilder.create().texOffs(28, 54).addBox(0.0F, 0.0F, -2.5F, 0.0F, 9.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.4531F, -10.5578F, 0.9705F, 0.0F, 0.0F, -0.2182F)); - PartDefinition bone10 = skirtpart_right.addOrReplaceChild("bone10", CubeListBuilder.create().texOffs(26, 67).addBox(-1.0F, -6.0F, -8.941F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, -0.1719F)); + PartDefinition bone58_r3 = skirt.addOrReplaceChild("bone58_r3", CubeListBuilder.create().texOffs(38, 56).addBox(0.0F, 0.2716F, 0.8809F, 0.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.4375F, -10.5578F, 0.5955F, 0.1745F, 0.0F, -0.2182F)); - PartDefinition skirt_front = bone.addOrReplaceChild("skirt_front", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, -3.1416F, 0.0F)); + PartDefinition bone58_r4 = skirt.addOrReplaceChild("bone58_r4", CubeListBuilder.create().texOffs(50, 59).addBox(-2.5F, -4.4173F, 0.0108F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.201F, 5.3245F, 0.1847F, 0.0F, 0.0F)); - PartDefinition skirt1_front = skirt_front.addOrReplaceChild("skirt1_front", CubeListBuilder.create().texOffs(0, 67).addBox(-2.5F, -5.5578F, 0.0F, 5.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 4.4705F, 0.1745F, 0.0F, 0.0F)); + PartDefinition bone58_r5 = skirt.addOrReplaceChild("bone58_r5", CubeListBuilder.create().texOffs(44, 59).addBox(1.3605F, -3.9541F, 0.0311F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -6.201F, 5.262F, 0.1765F, 0.036F, -0.214F)); - PartDefinition skirt2_front = skirt1_front.addOrReplaceChild("skirt2_front", CubeListBuilder.create().texOffs(20, 67).addBox(-2.0F, -6.0F, -0.001F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, 0.1719F)); + PartDefinition bone59_r4 = skirt.addOrReplaceChild("bone59_r4", CubeListBuilder.create().texOffs(82, 56).addBox(0.0F, 0.2989F, -3.8614F, 0.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.4375F, -10.5578F, 1.408F, -0.1745F, 0.0F, 0.2182F)); - PartDefinition skirt3_front = skirt1_front.addOrReplaceChild("skirt3_front", CubeListBuilder.create().texOffs(20, 67).mirror().addBox(-0.95F, -6.0F, -0.001F, 3.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(2.5F, 0.3422F, 0.0F, 0.0F, 0.0F, -0.1719F)); + PartDefinition bone58_r6 = skirt.addOrReplaceChild("bone58_r6", CubeListBuilder.create().texOffs(66, 56).addBox(0.0F, 0.2716F, 0.8809F, 0.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.4375F, -10.5578F, 0.5955F, 0.1745F, 0.0F, 0.2182F)); - PartDefinition lace2 = skirt.addOrReplaceChild("lace2", CubeListBuilder.create(), PartPose.offsetAndRotation(1.0F, -18.5F, 1.0F, 0.0F, -1.5708F, 0.0F)); + PartDefinition bone57_r2 = skirt.addOrReplaceChild("bone57_r2", CubeListBuilder.create().texOffs(72, 54).addBox(0.0F, 0.0F, -2.5F, 0.0F, 9.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.4531F, -10.5578F, 0.9705F, 0.0F, 0.0F, 0.2182F)); - PartDefinition apron = skirt.addOrReplaceChild("apron", CubeListBuilder.create().texOffs(24, 56).addBox(-4.0F, -0.683F, -0.5335F, 8.0F, 9.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -11.0F, -2.0F, -0.5236F, 0.0F, 0.0F)); + PartDefinition apron2 = skirt.addOrReplaceChild("apron2", CubeListBuilder.create(), PartPose.offsetAndRotation(1.0F, -11.0F, -2.0F, -0.5236F, 0.0F, 0.0F)); - PartDefinition legLeft = partdefinition.addOrReplaceChild("legLeft", CubeListBuilder.create().texOffs(12, 76).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(40, 57).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.2F)), PartPose.offset(2.0F, 15.0F, 0.0F)); + PartDefinition legLeft = partdefinition.addOrReplaceChild("legLeft", CubeListBuilder.create().texOffs(12, 46).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(12, 39).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.2F)), PartPose.offset(2.0F, 15.0F, 0.0F)); - PartDefinition legRight = partdefinition.addOrReplaceChild("legRight", CubeListBuilder.create().texOffs(0, 76).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(40, 64).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.2F)), PartPose.offset(-2.0F, 15.0F, 0.0F)); + PartDefinition legRight = partdefinition.addOrReplaceChild("legRight", CubeListBuilder.create().texOffs(0, 46).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 39).addBox(-1.5F, 0.0F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.2F)), PartPose.offset(-2.0F, 15.0F, 0.0F)); - PartDefinition armLeft = partdefinition.addOrReplaceChild("armLeft", CubeListBuilder.create().texOffs(24, 76).addBox(-0.2113F, 1.4532F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(40, 50).addBox(-0.7113F, 0.4532F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(0, 56).addBox(-0.7113F, 0.4532F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(-0.3F)), PartPose.offsetAndRotation(1.0F, 6.5F, 0.0F, 0.0F, 0.0F, -0.4363F)); + PartDefinition wingLeft = partdefinition.addOrReplaceChild("wingLeft", CubeListBuilder.create(), PartPose.offsetAndRotation(1.0F, 10.0F, 5.0F, 0.0F, 1.2217F, 0.0F)); - PartDefinition wingLeft = partdefinition.addOrReplaceChild("wingLeft", CubeListBuilder.create(), PartPose.offsetAndRotation(1.0F, 8.0F, 4.5F, 0.0F, 1.2217F, 0.0F)); + PartDefinition wingLeftUp_r1 = wingLeft.addOrReplaceChild("wingLeftUp_r1", CubeListBuilder.create().texOffs(0, 77).addBox(0.0F, -3.5858F, -1.4142F, 0.0F, 9.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.0607F, 1.7678F, 0.7854F, 0.0F, 0.0F)); - PartDefinition wingLeftUp = wingLeft.addOrReplaceChild("wingLeftUp", CubeListBuilder.create().texOffs(0, 7).mirror().addBox(0.0F, -2.2019F, 0.0716F, 0.0F, 9.0F, 15.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.6981F, 0.0F, 0.0F)); + PartDefinition wingLeftDown_r1 = wingLeft.addOrReplaceChild("wingLeftDown_r1", CubeListBuilder.create().texOffs(16, 69).addBox(0.0F, 1.4142F, -7.4142F, 0.0F, 15.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.4142F, 1.4142F, 0.7854F, 0.0F, 0.0F)); - PartDefinition wingLeftDown = wingLeft.addOrReplaceChild("wingLeftDown", CubeListBuilder.create().texOffs(0, 20).addBox(0.0F, -1.4679F, 3.2856F, 0.0F, 6.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.6981F, 0.0F, 0.0F)); + PartDefinition wingRight = partdefinition.addOrReplaceChild("wingRight", CubeListBuilder.create(), PartPose.offsetAndRotation(-1.0F, 10.0F, 5.0F, 0.0F, -1.2217F, 0.0F)); - PartDefinition wingRight = partdefinition.addOrReplaceChild("wingRight", CubeListBuilder.create(), PartPose.offsetAndRotation(-1.0F, 8.0F, 4.5F, 0.0F, -1.2217F, 0.0F)); + PartDefinition wingRightDown_r1 = wingRight.addOrReplaceChild("wingRightDown_r1", CubeListBuilder.create().texOffs(0, 69).addBox(0.0F, 1.4142F, -7.4142F, 0.0F, 15.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.4142F, 1.4142F, 0.7854F, 0.0F, 0.0F)); - PartDefinition wingRightUp = wingRight.addOrReplaceChild("wingRightUp", CubeListBuilder.create().texOffs(0, 7).addBox(0.0F, -2.2019F, 0.0716F, 0.0F, 9.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.6981F, 0.0F, 0.0F)); + PartDefinition wingRightUp_r1 = wingRight.addOrReplaceChild("wingRightUp_r1", CubeListBuilder.create().texOffs(0, 53).addBox(0.0F, -3.5858F, -1.4142F, 0.0F, 9.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.0607F, 1.7678F, 0.7854F, 0.0F, 0.0F)); - PartDefinition wingRightDown = wingRight.addOrReplaceChild("wingRightDown", CubeListBuilder.create().texOffs(0, 20).mirror().addBox(0.0F, -1.4679F, 3.2856F, 0.0F, 6.0F, 11.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.6981F, 0.0F, 0.0F)); + PartDefinition armRight = partdefinition.addOrReplaceChild("armRight", CubeListBuilder.create().texOffs(48, 35).addBox(-2.2887F, -1.0469F, -1.5F, 3.0F, 8.0F, 3.0F, new CubeDeformation(-0.3F)) + .texOffs(24, 40).addBox(-1.7887F, -0.0469F, -1.0F, 2.0F, 8.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(24, 33).addBox(-2.2887F, -1.0469F, -1.5F, 3.0F, 4.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-2.5341F, 7.7588F, 0.0F, 0.0F, 0.0F, 0.2618F)); return LayerDefinition.create(meshdefinition, 128, 128); } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/bedrock/BedrockModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/bedrock/BedrockModel.java index 487fe0426..de279164b 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/bedrock/BedrockModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/bedrock/BedrockModel.java @@ -2,6 +2,7 @@ import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; import com.github.tartaricacid.touhoulittlemaid.client.animation.CustomJsAnimationManger; +import com.github.tartaricacid.touhoulittlemaid.client.animation.HardcodedAnimationManger; import com.github.tartaricacid.touhoulittlemaid.client.animation.inner.IAnimation; import com.github.tartaricacid.touhoulittlemaid.client.animation.script.EntityChairWrapper; import com.github.tartaricacid.touhoulittlemaid.client.animation.script.EntityMaidWrapper; @@ -258,6 +259,8 @@ public void setupAnim(T entityIn, float limbSwing, float limbSwingAmount, float IMaid maid = IMaid.convert(mob); if (maid != null) { setupMaidAnim(maid, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, invocable); + // 硬编码动画 + HardcodedAnimationManger.playMaidAnimation(maid, modelMap, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); } return; } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityMaidRenderer.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityMaidRenderer.java index 7b5ee4980..4c28c7bbd 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityMaidRenderer.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityMaidRenderer.java @@ -4,6 +4,7 @@ import com.github.tartaricacid.touhoulittlemaid.api.ILittleMaid; import com.github.tartaricacid.touhoulittlemaid.api.entity.IMaid; import com.github.tartaricacid.touhoulittlemaid.api.event.client.RenderMaidEvent; +import com.github.tartaricacid.touhoulittlemaid.client.animation.HardcodedAnimationManger; import com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper; import com.github.tartaricacid.touhoulittlemaid.client.model.bedrock.BedrockModel; import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.layer.*; @@ -103,11 +104,16 @@ protected void scale(Mob maid, PoseStack poseStack, float partialTickTime) { @Override protected void setupRotations(Mob mob, PoseStack poseStack, float pAgeInTicks, float pRotationYaw, float pPartialTicks, float pScale) { super.setupRotations(mob, poseStack, pAgeInTicks, pRotationYaw, pPartialTicks, pScale); + + // 抱起女仆时的旋转 if (mob.getVehicle() instanceof Player && !this.mainInfo.isGeckoModel()) { poseStack.translate(-0.375, 0.8325, 0.375); poseStack.mulPose(Axis.ZN.rotationDegrees(65)); poseStack.mulPose(Axis.YN.rotationDegrees(-80)); } + + // 其他时候的旋转 + HardcodedAnimationManger.setupRotations(mob, poseStack, pAgeInTicks, pRotationYaw, pPartialTicks, this.mainInfo.isGeckoModel()); } @Override diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/MaidFishingHookRenderer.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/MaidFishingHookRenderer.java index c03c4b332..1075b1d01 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/MaidFishingHookRenderer.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/MaidFishingHookRenderer.java @@ -1,10 +1,10 @@ package com.github.tartaricacid.touhoulittlemaid.client.renderer.entity; +import com.github.tartaricacid.touhoulittlemaid.compat.oculus.OculusCompat; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.entity.projectile.MaidFishingHook; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -86,6 +86,9 @@ protected void renderFishingLine(T fishingHook, float partialTicks, PoseStack po for (int i = 0; i <= 16; ++i) { stringVertex(x, y, z, lineConsumer, lasted, fraction(i), fraction(i + 1), colors[0], colors[1], colors[2]); } + if (OculusCompat.isOculusInstalled()) { + lineConsumer.addVertex(0.0f, 0.0f, 0.0f).setColor(0, 0, 0, 255).setNormal(0.0F, 0.0F, 0.0F); + } } protected float fraction(int numerator) { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/NewEntityFairyRenderer.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/NewEntityFairyRenderer.java index 47608233e..43cf1dda8 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/NewEntityFairyRenderer.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/NewEntityFairyRenderer.java @@ -9,6 +9,8 @@ import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; +import java.util.Locale; + public class NewEntityFairyRenderer extends MobRenderer { private static final ResourceLocation TEXTURE_0 = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "textures/entity/new_maid_fairy/maid_fairy_0.png"); private static final ResourceLocation TEXTURE_1 = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "textures/entity/new_maid_fairy/maid_fairy_1.png"); @@ -28,6 +30,7 @@ public class NewEntityFairyRenderer extends MobRenderer TEXTURE_1; case 2 -> TEXTURE_2; diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/PerspectiveBakedModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/PerspectiveBakedModel.java index e0dddcf0e..c12edc57e 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/PerspectiveBakedModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/PerspectiveBakedModel.java @@ -12,7 +12,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Collections; import java.util.List; public class PerspectiveBakedModel implements BakedModel { @@ -26,7 +25,7 @@ public PerspectiveBakedModel(BakedModel bakedModel2d, BakedModel bakedModel3d) { @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand) { - return Collections.emptyList(); + return this.bakedModel2d.getQuads(state, side, rand); } @Override diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/ReplaceableBakedModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/ReplaceableBakedModel.java index 9e26b2fb8..ae3d66cfc 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/ReplaceableBakedModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/item/ReplaceableBakedModel.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; -import java.util.Collections; import java.util.List; import java.util.function.Supplier; @@ -28,7 +27,11 @@ public ReplaceableBakedModel(BakedModel rawBakedModel, BakedModel replacedBakedM @Override public List getQuads(@Nullable BlockState pState, @Nullable Direction pDirection, RandomSource random) { - return Collections.emptyList(); + if (isReplace.get()) { + return this.replacedBakedModel.getQuads(pState, pDirection, random); + } else { + return this.rawBakedModel.getQuads(pState, pDirection, random); + } } @Override diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/command/subcommand/PackCommand.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/command/subcommand/PackCommand.java index f3bcdaa60..d801ee1cd 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/command/subcommand/PackCommand.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/command/subcommand/PackCommand.java @@ -23,17 +23,11 @@ public static LiteralArgumentBuilder get() { } private static int reloadAllPack(CommandContext context) { + context.getSource().sendSuccess(() -> Component.translatable("commands.touhou_little_maid.pack.reload.start"), true); if (FMLLoader.getDist() == Dist.CLIENT) { - ReloadResourceEvent.reloadAllPack(); + ReloadResourceEvent.asyncReloadAllPack(); } - // DistExecutor.safeRunWhenOn(Dist.DEDICATED_SERVER, () -> PackCommand::sendPackToClient); ServerCustomPackLoader.reloadPacks(); - // TODO:打印加载的时间到客户端聊天栏 - context.getSource().sendSuccess(() -> Component.translatable("commands.touhou_little_maid.pack.reload.info"), true); return Command.SINGLE_SUCCESS; } - - private static void sendPackToClient() { - // TODO: 把服务端模型包发送到每个客户端 - } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/cloth/MenuIntegration.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/cloth/MenuIntegration.java index a3df30955..e721f3ef2 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/cloth/MenuIntegration.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/cloth/MenuIntegration.java @@ -45,95 +45,178 @@ private static void maidConfig(ConfigBuilder root, ConfigEntryBuilder entryBuild DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()) .setSelections(BuiltInRegistries.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))) .setDefaultValue(Items.CAKE).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_tamed_item.tooltip")) - .setSaveConsumer(s -> MaidConfig.MAID_TAMED_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString())).build()); + .setSaveConsumer(s -> { + MaidConfig.MAID_TAMED_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString()); + MaidConfig.MAID_TAMED_ITEM.save(); + }).build()); maid.addEntry(entryBuilder.startDropdownMenu(Component.translatable("config.touhou_little_maid.maid.maid_temptation_item"), DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(BuiltInRegistries.ITEM.get(ResourceLocation.parse(MaidConfig.MAID_TEMPTATION_ITEM.get()))), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()) .setSelections(BuiltInRegistries.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))) .setDefaultValue(Items.CAKE).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_temptation_item.tooltip")) - .setSaveConsumer(s -> MaidConfig.MAID_TEMPTATION_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString())).build()); + .setSaveConsumer(s -> { + MaidConfig.MAID_TEMPTATION_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString()); + MaidConfig.MAID_TEMPTATION_ITEM.save(); + }).build()); maid.addEntry(entryBuilder.startDropdownMenu(Component.translatable("config.touhou_little_maid.maid.maid_ntr_item"), DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(BuiltInRegistries.ITEM.get(ResourceLocation.parse(MaidConfig.MAID_NTR_ITEM.get()))), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()) .setSelections(BuiltInRegistries.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))) .setDefaultValue(Items.STRUCTURE_VOID).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_ntr_item.tooltip")) - .setSaveConsumer(s -> MaidConfig.MAID_NTR_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString())).build()); + .setSaveConsumer(s -> { + MaidConfig.MAID_NTR_ITEM.set(BuiltInRegistries.ITEM.getKey(s).toString()); + MaidConfig.MAID_NTR_ITEM.save(); + }).build()); maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.maid_work_range"), MaidConfig.MAID_WORK_RANGE.get(), 3, 64) .setDefaultValue(12).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_work_range.tooltip")) - .setSaveConsumer(i -> MaidConfig.MAID_WORK_RANGE.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.MAID_WORK_RANGE.set(i); + MaidConfig.MAID_WORK_RANGE.save(); + }).build()); maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.maid_idle_range"), MaidConfig.MAID_IDLE_RANGE.get(), 3, 32) .setDefaultValue(6).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_idle_range.tooltip")) - .setSaveConsumer(i -> MaidConfig.MAID_IDLE_RANGE.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.MAID_IDLE_RANGE.set(i); + MaidConfig.MAID_IDLE_RANGE.save(); + }).build()); maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.maid_sleep_range"), MaidConfig.MAID_SLEEP_RANGE.get(), 3, 32) .setDefaultValue(6).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_sleep_range.tooltip")) - .setSaveConsumer(i -> MaidConfig.MAID_SLEEP_RANGE.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.MAID_SLEEP_RANGE.set(i); + MaidConfig.MAID_SLEEP_RANGE.save(); + }).build()); maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.maid_non_home_range"), MaidConfig.MAID_NON_HOME_RANGE.get(), 3, 32) .setDefaultValue(8).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_non_home_range.tooltip")) - .setSaveConsumer(i -> MaidConfig.MAID_NON_HOME_RANGE.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.MAID_NON_HOME_RANGE.set(i); + MaidConfig.MAID_NON_HOME_RANGE.save(); + }).build()); + + maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.bow_range"), MaidConfig.BOW_RANGE.get(), 8, 192) + .setDefaultValue(48).setTooltip(Component.translatable("config.touhou_little_maid.maid.bow_range.tooltip")) + .setSaveConsumer(i -> { + MaidConfig.BOW_RANGE.set(i); + MaidConfig.BOW_RANGE.save(); + }).build()); + + maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.cross_bow_range"), MaidConfig.CROSS_BOW_RANGE.get(), 8, 192) + .setDefaultValue(64).setTooltip(Component.translatable("config.touhou_little_maid.maid.cross_bow_range.tooltip")) + .setSaveConsumer(i -> { + MaidConfig.CROSS_BOW_RANGE.set(i); + MaidConfig.CROSS_BOW_RANGE.save(); + }).build()); + + maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.danmaku_range"), MaidConfig.DANMAKU_RANGE.get(), 8, 192) + .setDefaultValue(64).setTooltip(Component.translatable("config.touhou_little_maid.maid.danmaku_range.tooltip")) + .setSaveConsumer(i -> { + MaidConfig.DANMAKU_RANGE.set(i); + MaidConfig.DANMAKU_RANGE.save(); + }).build()); + + maid.addEntry(entryBuilder.startIntSlider(Component.translatable("config.touhou_little_maid.maid.trident_range"), MaidConfig.TRIDENT_RANGE.get(), 8, 192) + .setDefaultValue(48).setTooltip(Component.translatable("config.touhou_little_maid.maid.trident_range.tooltip")) + .setSaveConsumer(i -> { + MaidConfig.TRIDENT_RANGE.set(i); + MaidConfig.TRIDENT_RANGE.save(); + }).build()); maid.addEntry(entryBuilder.startIntField(Component.translatable("config.touhou_little_maid.maid.feed_animal_max_number"), MaidConfig.FEED_ANIMAL_MAX_NUMBER.get()) .setMin(6).setMax(65536).setDefaultValue(50).setTooltip(Component.translatable("config.touhou_little_maid.maid.feed_animal_max_number.tooltip")) - .setSaveConsumer(i -> MaidConfig.FEED_ANIMAL_MAX_NUMBER.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.FEED_ANIMAL_MAX_NUMBER.set(i); + MaidConfig.FEED_ANIMAL_MAX_NUMBER.save(); + }).build()); maid.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.maid.maid_change_model"), MaidConfig.MAID_CHANGE_MODEL.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_change_model.tooltip")) - .setSaveConsumer(MaidConfig.MAID_CHANGE_MODEL::set).build()); + .setSaveConsumer(b -> { + MaidConfig.MAID_CHANGE_MODEL.set(b); + MaidConfig.MAID_CHANGE_MODEL.save(); + }).build()); maid.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.maid.maid_gomoku_owner_limit"), MaidConfig.MAID_GOMOKU_OWNER_LIMIT.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_gomoku_owner_limit.tooltip")) - .setSaveConsumer(MaidConfig.MAID_GOMOKU_OWNER_LIMIT::set).build()); + .setSaveConsumer(b -> { + MaidConfig.MAID_GOMOKU_OWNER_LIMIT.set(b); + MaidConfig.MAID_GOMOKU_OWNER_LIMIT.save(); + }).build()); maid.addEntry(entryBuilder.startIntField(Component.translatable("config.touhou_little_maid.maid.owner_max_maid_num"), MaidConfig.OWNER_MAX_MAID_NUM.get()) .setDefaultValue(Integer.MAX_VALUE).setMin(0).setMax(Integer.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.maid.owner_max_maid_num.tooltip")) - .setSaveConsumer(i -> MaidConfig.OWNER_MAX_MAID_NUM.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.OWNER_MAX_MAID_NUM.set(i); + MaidConfig.OWNER_MAX_MAID_NUM.save(); + }).build()); maid.addEntry(entryBuilder.startDoubleField(Component.translatable("config.touhou_little_maid.maid.replace_allay_percent"), MaidConfig.REPLACE_ALLAY_PERCENT.get()) .setDefaultValue(0.2).setMin(0).setMax(1) .setTooltip(Component.translatable("config.touhou_little_maid.maid.replace_allay_percent.tooltip")) - .setSaveConsumer(i -> MaidConfig.REPLACE_ALLAY_PERCENT.set(i)).build()); + .setSaveConsumer(i -> { + MaidConfig.REPLACE_ALLAY_PERCENT.set(i); + MaidConfig.REPLACE_ALLAY_PERCENT.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_backpack_blacklist"), MaidConfig.MAID_BACKPACK_BLACKLIST.get()) .setDefaultValue(MaidConfig.MAID_BACKPACK_BLACKLIST.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_backpack_blacklist.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_BACKPACK_BLACKLIST.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_BACKPACK_BLACKLIST.set(l); + MaidConfig.MAID_BACKPACK_BLACKLIST.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_attack_ignore"), MaidConfig.MAID_ATTACK_IGNORE.get()) .setDefaultValue(Lists.newArrayList()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_attack_ignore.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_ATTACK_IGNORE.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_ATTACK_IGNORE.set(l); + MaidConfig.MAID_ATTACK_IGNORE.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_ranged_attack_ignore"), MaidConfig.MAID_RANGED_ATTACK_IGNORE.get()) .setDefaultValue(Lists.newArrayList()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_ranged_attack_ignore.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_RANGED_ATTACK_IGNORE.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_RANGED_ATTACK_IGNORE.set(l); + MaidConfig.MAID_RANGED_ATTACK_IGNORE.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_work_meals_block_list"), MaidConfig.MAID_WORK_MEALS_BLOCK_LIST.get()) .setDefaultValue(MaidConfig.MAID_WORK_MEALS_BLOCK_LIST.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_work_meals_block_list.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_WORK_MEALS_BLOCK_LIST.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_WORK_MEALS_BLOCK_LIST.set(l); + MaidConfig.MAID_WORK_MEALS_BLOCK_LIST.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_home_meals_block_list"), MaidConfig.MAID_HOME_MEALS_BLOCK_LIST.get()) .setDefaultValue(MaidConfig.MAID_HOME_MEALS_BLOCK_LIST.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_home_meals_block_list.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_HOME_MEALS_BLOCK_LIST.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_HOME_MEALS_BLOCK_LIST.set(l); + MaidConfig.MAID_HOME_MEALS_BLOCK_LIST.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_heal_meals_block_list"), MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST.get()) .setDefaultValue(MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_heal_meals_block_list.tooltip")) - .setSaveConsumer(l -> MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST.set(l)).build()); + .setSaveConsumer(l -> { + MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST.set(l); + MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST.save(); + }).build()); maid.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.maid.maid_work_meals_block_list_regex"), MaidConfig.MAID_WORK_MEALS_BLOCK_LIST_REGEX.get()) .setDefaultValue(MaidConfig.MAID_WORK_MEALS_BLOCK_LIST_REGEX.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_work_meals_block_list_regex.tooltip")) .setSaveConsumer(l -> { MaidConfig.MAID_WORK_MEALS_BLOCK_LIST_REGEX.set(l); + MaidConfig.MAID_WORK_MEALS_BLOCK_LIST_REGEX.save(); MaidMealRegConfigEvent.handleConfig(MaidConfig.MAID_WORK_MEALS_BLOCK_LIST_REGEX.get(), MaidMealRegConfigEvent.WORK_MEAL_REGEX); }).build()); @@ -142,6 +225,7 @@ private static void maidConfig(ConfigBuilder root, ConfigEntryBuilder entryBuild .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_home_meals_block_list_regex.tooltip")) .setSaveConsumer(l -> { MaidConfig.MAID_HOME_MEALS_BLOCK_LIST_REGEX.set(l); + MaidConfig.MAID_HOME_MEALS_BLOCK_LIST_REGEX.save(); MaidMealRegConfigEvent.handleConfig(MaidConfig.MAID_HOME_MEALS_BLOCK_LIST_REGEX.get(), MaidMealRegConfigEvent.HOME_MEAL_REGEX); }).build()); @@ -150,6 +234,7 @@ private static void maidConfig(ConfigBuilder root, ConfigEntryBuilder entryBuild .setTooltip(Component.translatable("config.touhou_little_maid.maid.maid_heal_meals_block_list_regex.tooltip")) .setSaveConsumer(l -> { MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST_REGEX.set(l); + MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST_REGEX.save(); MaidMealRegConfigEvent.handleConfig(MaidConfig.MAID_HEAL_MEALS_BLOCK_LIST_REGEX.get(), MaidMealRegConfigEvent.HEAL_MEAL_REGEX); }).build()); @@ -164,6 +249,7 @@ private static void maidConfig(ConfigBuilder root, ConfigEntryBuilder entryBuild maidMealContainerList.add(Arrays.asList(split[0], split[1])); } MaidConfig.MAID_EATEN_RETURN_CONTAINER_LIST.set(maidMealContainerList); + MaidConfig.MAID_EATEN_RETURN_CONTAINER_LIST.save(); }).build()); } @@ -171,11 +257,17 @@ private static void chairConfig(ConfigBuilder root, ConfigEntryBuilder entryBuil ConfigCategory chair = root.getOrCreateCategory(Component.translatable("entity.touhou_little_maid.chair")); chair.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.chair.chair_change_model"), ChairConfig.CHAIR_CHANGE_MODEL.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.chair.chair_change_model.tooltip")) - .setSaveConsumer(ChairConfig.CHAIR_CHANGE_MODEL::set).build()); + .setSaveConsumer(b -> { + ChairConfig.CHAIR_CHANGE_MODEL.set(b); + ChairConfig.CHAIR_CHANGE_MODEL.save(); + }).build()); chair.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.chair.chair_can_destroyed_by_anyone"), ChairConfig.CHAIR_CAN_DESTROYED_BY_ANYONE.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.chair.chair_can_destroyed_by_anyone.tooltip")) - .setSaveConsumer(ChairConfig.CHAIR_CAN_DESTROYED_BY_ANYONE::set).build()); + .setSaveConsumer(b -> { + ChairConfig.CHAIR_CAN_DESTROYED_BY_ANYONE.set(b); + ChairConfig.CHAIR_CAN_DESTROYED_BY_ANYONE.save(); + }).build()); } @SuppressWarnings("all") @@ -184,58 +276,94 @@ private static void miscConfig(ConfigBuilder root, ConfigEntryBuilder entryBuild misc.addEntry(entryBuilder.startDoubleField(Component.translatable("config.touhou_little_maid.misc.maid_fairy_power_point"), MiscConfig.MAID_FAIRY_POWER_POINT.get()) .setDefaultValue(0.16).setMin(0).setMax(5) .setTooltip(Component.translatable("config.touhou_little_maid.misc.maid_fairy_power_point.tooltip")) - .setSaveConsumer(d -> MiscConfig.MAID_FAIRY_POWER_POINT.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.MAID_FAIRY_POWER_POINT.set(d); + MiscConfig.MAID_FAIRY_POWER_POINT.save(); + }).build()); misc.addEntry(entryBuilder.startIntField(Component.translatable("config.touhou_little_maid.misc.maid_fairy_spawn_probability"), MiscConfig.MAID_FAIRY_SPAWN_PROBABILITY.get()) .setDefaultValue(70).setMin(0).setMax(Integer.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.misc.maid_fairy_spawn_probability.tooltip")) - .setSaveConsumer(d -> MiscConfig.MAID_FAIRY_SPAWN_PROBABILITY.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.MAID_FAIRY_SPAWN_PROBABILITY.set(d); + MiscConfig.MAID_FAIRY_SPAWN_PROBABILITY.save(); + }).build()); misc.addEntry(entryBuilder.startStrList(Component.translatable("config.touhou_little_maid.misc.maid_fairy_blacklist_dimension"), (List) MiscConfig.MAID_FAIRY_BLACKLIST_DIMENSION.get()) .setDefaultValue((List) MiscConfig.MAID_FAIRY_BLACKLIST_DIMENSION.getDefault()) .setTooltip(Component.translatable("config.touhou_little_maid.misc.maid_fairy_blacklist_dimension.tooltip")) - .setSaveConsumer(l -> MiscConfig.MAID_FAIRY_BLACKLIST_DIMENSION.set(l)).build()); + .setSaveConsumer(l -> { + MiscConfig.MAID_FAIRY_BLACKLIST_DIMENSION.set(l); + MiscConfig.MAID_FAIRY_BLACKLIST_DIMENSION.save(); + }).build()); misc.addEntry(entryBuilder.startDoubleField(Component.translatable("config.touhou_little_maid.misc.player_death_loss_power_point"), MiscConfig.PLAYER_DEATH_LOSS_POWER_POINT.get()) .setDefaultValue(1.0).setMin(0).setMax(5) .setTooltip(Component.translatable("config.touhou_little_maid.misc.player_death_loss_power_point.tooltip")) - .setSaveConsumer(d -> MiscConfig.PLAYER_DEATH_LOSS_POWER_POINT.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.PLAYER_DEATH_LOSS_POWER_POINT.set(d); + MiscConfig.PLAYER_DEATH_LOSS_POWER_POINT.save(); + }).build()); misc.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.misc.give_smart_slab"), MiscConfig.GIVE_SMART_SLAB.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.misc.give_smart_slab.tooltip")) - .setSaveConsumer(MiscConfig.GIVE_SMART_SLAB::set).build()); + .setSaveConsumer(b -> { + MiscConfig.GIVE_SMART_SLAB.set(b); + MiscConfig.GIVE_SMART_SLAB.save(); + }).build()); misc.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.misc.give_patchouli_book"), MiscConfig.GIVE_PATCHOULI_BOOK.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.misc.give_patchouli_book.tooltip")) - .setSaveConsumer(MiscConfig.GIVE_PATCHOULI_BOOK::set).build()); + .setSaveConsumer(b -> { + MiscConfig.GIVE_PATCHOULI_BOOK.set(b); + MiscConfig.GIVE_PATCHOULI_BOOK.save(); + }).build()); misc.addEntry(entryBuilder.startDoubleField(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_effect_cost"), MiscConfig.SHRINE_LAMP_EFFECT_COST.get()) .setDefaultValue(0.9).setMin(0).setMax(Double.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_effect_cost.tooltip")) - .setSaveConsumer(d -> MiscConfig.SHRINE_LAMP_EFFECT_COST.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.SHRINE_LAMP_EFFECT_COST.set(d); + MiscConfig.SHRINE_LAMP_EFFECT_COST.save(); + }).build()); misc.addEntry(entryBuilder.startDoubleField(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_max_storage"), MiscConfig.SHRINE_LAMP_MAX_STORAGE.get()) .setDefaultValue(100).setMin(0).setMax(Double.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip")) - .setSaveConsumer(d -> MiscConfig.SHRINE_LAMP_MAX_STORAGE.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.SHRINE_LAMP_MAX_STORAGE.set(d); + MiscConfig.SHRINE_LAMP_MAX_STORAGE.save(); + }).build()); misc.addEntry(entryBuilder.startIntField(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_max_range"), MiscConfig.SHRINE_LAMP_MAX_RANGE.get()) .setDefaultValue(6).setMin(0).setMax(Integer.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip")) - .setSaveConsumer(d -> MiscConfig.SHRINE_LAMP_MAX_RANGE.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.SHRINE_LAMP_MAX_RANGE.set(d); + MiscConfig.SHRINE_LAMP_MAX_RANGE.save(); + }).build()); misc.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.misc.close_optifine_warning"), MiscConfig.CLOSE_OPTIFINE_WARNING.get()) .setDefaultValue(false).setTooltip(Component.translatable("config.touhou_little_maid.misc.close_optifine_warning.tooltip")) - .setSaveConsumer(MiscConfig.CLOSE_OPTIFINE_WARNING::set).build()); + .setSaveConsumer(b -> { + MiscConfig.CLOSE_OPTIFINE_WARNING.set(b); + MiscConfig.CLOSE_OPTIFINE_WARNING.save(); + }).build()); misc.addEntry(entryBuilder.startIntField(Component.translatable("config.touhou_little_maid.misc.scarecrow_range"), MiscConfig.SCARECROW_RANGE.get()) .setDefaultValue(16 * 3).setMin(0).setMax(Integer.MAX_VALUE) .setTooltip(Component.translatable("config.touhou_little_maid.misc.scarecrow_range.tooltip")) - .setSaveConsumer(d -> MiscConfig.SCARECROW_RANGE.set(d)).build()); + .setSaveConsumer(d -> { + MiscConfig.SCARECROW_RANGE.set(d); + MiscConfig.SCARECROW_RANGE.save(); + }).build()); misc.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.misc.use_new_maid_fairy_model"), MiscConfig.USE_NEW_MAID_FAIRY_MODEL.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.misc.use_new_maid_fairy_model.tooltip")) - .setSaveConsumer(MiscConfig.USE_NEW_MAID_FAIRY_MODEL::set).build()); + .setSaveConsumer(b -> { + MiscConfig.USE_NEW_MAID_FAIRY_MODEL.set(b); + MiscConfig.USE_NEW_MAID_FAIRY_MODEL.save(); + }).build()); } private static void vanillaConfig(ConfigBuilder root, ConfigEntryBuilder entryBuilder) { @@ -243,19 +371,31 @@ private static void vanillaConfig(ConfigBuilder root, ConfigEntryBuilder entryBu vanilla.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.vanilla.replace_slime_model"), VanillaConfig.REPLACE_SLIME_MODEL.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.vanilla.replace_slime_model.tooltip")) - .setSaveConsumer(VanillaConfig.REPLACE_SLIME_MODEL::set).build()); + .setSaveConsumer(b -> { + VanillaConfig.REPLACE_SLIME_MODEL.set(b); + VanillaConfig.REPLACE_SLIME_MODEL.save(); + }).build()); vanilla.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.vanilla.replace_xp_texture"), VanillaConfig.REPLACE_XP_TEXTURE.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.vanilla.replace_xp_texture.tooltip")) - .setSaveConsumer(VanillaConfig.REPLACE_XP_TEXTURE::set).build()); + .setSaveConsumer(b -> { + VanillaConfig.REPLACE_XP_TEXTURE.set(b); + VanillaConfig.REPLACE_XP_TEXTURE.save(); + }).build()); vanilla.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.vanilla.replace_totem_texture"), VanillaConfig.REPLACE_TOTEM_TEXTURE.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.vanilla.replace_totem_texture.tooltip")) - .setSaveConsumer(VanillaConfig.REPLACE_TOTEM_TEXTURE::set).build()); + .setSaveConsumer(b -> { + VanillaConfig.REPLACE_TOTEM_TEXTURE.set(b); + VanillaConfig.REPLACE_TOTEM_TEXTURE.save(); + }).build()); vanilla.addEntry(entryBuilder.startBooleanToggle(Component.translatable("config.touhou_little_maid.vanilla.replace_xp_bottle_texture"), VanillaConfig.REPLACE_XP_BOTTLE_TEXTURE.get()) .setDefaultValue(true).setTooltip(Component.translatable("config.touhou_little_maid.vanilla.replace_xp_bottle_texture.tooltip")) - .setSaveConsumer(VanillaConfig.REPLACE_XP_BOTTLE_TEXTURE::set).build()); + .setSaveConsumer(b -> { + VanillaConfig.REPLACE_XP_BOTTLE_TEXTURE.set(b); + VanillaConfig.REPLACE_XP_BOTTLE_TEXTURE.save(); + }).build()); } public static void registerModsPage(ModContainer modContainer) { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/oculus/OculusCompat.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/oculus/OculusCompat.java new file mode 100644 index 000000000..546090274 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/compat/oculus/OculusCompat.java @@ -0,0 +1,14 @@ +package com.github.tartaricacid.touhoulittlemaid.compat.oculus; + +public final class OculusCompat { + public static final String OCULUS = "oculus"; + public static boolean IS_OCULUS_INSTALLED = false; + + public static void init() { + IS_OCULUS_INSTALLED = net.neoforged.fml.ModList.get().getModContainerById(OCULUS).isPresent(); + } + + public static boolean isOculusInstalled() { + return IS_OCULUS_INSTALLED; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/ServerConfig.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/ServerConfig.java index 399b521ff..79e267ddc 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/ServerConfig.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/ServerConfig.java @@ -9,6 +9,9 @@ public class ServerConfig { // 客户端需要下载的包 public static ModConfigSpec.ConfigValue> CLIENT_PACK_DOWNLOAD_URLS; + // 开启女仆 AI 耗时检测 + public static ModConfigSpec.BooleanValue MAID_AI_TIME_DEBUG; + public static ModConfigSpec init() { ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); @@ -16,6 +19,9 @@ public static ModConfigSpec init() { builder.comment("Example: [\"https://www.dropbox.com/download/apple.zip\", \"https://www.dropbox.com/download/cat.zip\"]"); CLIENT_PACK_DOWNLOAD_URLS = builder.define("ClientPackDownloadUrls", Lists.newArrayList()); + builder.comment("When turned on, when the maid AI executes more than 50ms, the entity information of the problem will be logged"); + MAID_AI_TIME_DEBUG = builder.define("MaidAITimeDebug", false); + return builder.build(); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/subconfig/MaidConfig.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/subconfig/MaidConfig.java index 10e41cb83..a447cb74f 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/subconfig/MaidConfig.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/config/subconfig/MaidConfig.java @@ -15,10 +15,17 @@ public final class MaidConfig { public static ModConfigSpec.ConfigValue MAID_TAMED_ITEM; public static ModConfigSpec.ConfigValue MAID_TEMPTATION_ITEM; public static ModConfigSpec.ConfigValue MAID_NTR_ITEM; + public static ModConfigSpec.IntValue MAID_WORK_RANGE; public static ModConfigSpec.IntValue MAID_IDLE_RANGE; public static ModConfigSpec.IntValue MAID_SLEEP_RANGE; public static ModConfigSpec.IntValue MAID_NON_HOME_RANGE; + + public static ModConfigSpec.IntValue BOW_RANGE; + public static ModConfigSpec.IntValue CROSS_BOW_RANGE; + public static ModConfigSpec.IntValue DANMAKU_RANGE; + public static ModConfigSpec.IntValue TRIDENT_RANGE; + public static ModConfigSpec.IntValue FEED_ANIMAL_MAX_NUMBER; public static ModConfigSpec.BooleanValue MAID_CHANGE_MODEL; public static ModConfigSpec.BooleanValue MAID_GOMOKU_OWNER_LIMIT; @@ -71,6 +78,19 @@ public static void init(ModConfigSpec.Builder builder) { builder.comment("The max number of animals around when the maid breeds animals") .translation(translateKey("feed_animal_max_number")); + builder.comment("The max range of maid's bow attack"); + BOW_RANGE = builder.defineInRange("BowRange", 48, 8, 192); + + builder.comment("The max range of maid's crossbow attack"); + CROSS_BOW_RANGE = builder.defineInRange("CrossbowRange", 64, 8, 192); + + builder.comment("The max range of maid's danmaku attack"); + DANMAKU_RANGE = builder.defineInRange("DanmakuRange", 64, 8, 192); + + builder.comment("The max range of maid's trident attack"); + TRIDENT_RANGE = builder.defineInRange("TridentRange", 48, 8, 192); + + builder.comment("The max number of animals around when the maid breeds animals"); FEED_ANIMAL_MAX_NUMBER = builder.defineInRange("FeedAnimalMaxNumber", 50, 6, 65536); builder.comment("Maid can switch models freely") diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/datagen/tag/TagItem.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/datagen/tag/TagItem.java index f22918bdd..385fae7f8 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/datagen/tag/TagItem.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/datagen/tag/TagItem.java @@ -5,6 +5,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -20,6 +21,7 @@ public class TagItem extends ItemTagsProvider { public static final TagKey GOHEI_ENCHANTABLE = TagKey.create(Registries.ITEM, getResourceLocation("gohei_enchantable")); public static final TagKey MAID_PLANTABLE_SEEDS = TagKey.create(Registries.ITEM, getResourceLocation("maid_plantable_seeds")); + public static final TagKey MAID_TAMED_ITEM = TagKey.create(Registries.ITEM, getResourceLocation("maid_tamed_item")); public TagItem(PackOutput pOutput, CompletableFuture pLookupProvider, CompletableFuture> pBlockTags, String modId, @Nullable ExistingFileHelper existingFileHelper) { super(pOutput, pLookupProvider, pBlockTags, modId, existingFileHelper); @@ -32,5 +34,18 @@ protected void addTags(HolderLookup.Provider pProvider) { this.tag(MAID_PLANTABLE_SEEDS).addTag(ItemTags.VILLAGER_PLANTABLE_SEEDS); this.tag(MAID_PLANTABLE_SEEDS).add(Items.NETHER_WART); + + this.tag(MAID_TAMED_ITEM) + .add(Items.CAKE) + .addOptionalTag(ResourceLocation.parse("forge:cakes")) + .addOptionalTag(ResourceLocation.parse("c:cakes")) + .addOptionalTag(ResourceLocation.parse("jmc:cakes")) + .addOptional(ResourceLocation.parse("kawaiidishes:cheese_cake")) + .addOptional(ResourceLocation.parse("kawaiidishes:honey_cheese_cake")) + .addOptional(ResourceLocation.parse("kawaiidishes:chocolate_cheese_cake")) + .addOptional(ResourceLocation.parse("kawaiidishes:piece_of_cake")) + .addOptional(ResourceLocation.parse("kawaiidishes:piece_of_cheesecake")) + .addOptional(ResourceLocation.parse("kawaiidishes:piece_of_chocolate_cheesecake")) + .addOptional(ResourceLocation.parse("kawaiidishes:piece_of_honey_cheesecake")); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/debug/MaidDebugCommand.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/debug/MaidDebugCommand.java index 48877f060..e882982f1 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/debug/MaidDebugCommand.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/debug/MaidDebugCommand.java @@ -11,7 +11,12 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CropBlock; +import net.minecraft.world.level.block.FarmBlock; public final class MaidDebugCommand { private static final String MAID_DEBUG_NAME = "debug"; @@ -20,12 +25,23 @@ public final class MaidDebugCommand { private static final String COUNT_NAME = "count"; private static final String MODEL_ID = "model_id"; + private static final String SET_FARM = "set_farm"; + private static final String SIZE = "size"; + public static LiteralArgumentBuilder get() { LiteralArgumentBuilder debug = Commands.literal(MAID_DEBUG_NAME); + + // 批量生成女仆 LiteralArgumentBuilder spawnMaid = Commands.literal(SPAWN_MAID); RequiredArgumentBuilder modelId = Commands.argument(MODEL_ID, StringArgumentType.string()); RequiredArgumentBuilder count = Commands.argument(COUNT_NAME, IntegerArgumentType.integer(0)); debug.then(spawnMaid.then(modelId.then(count.executes(MaidDebugCommand::spawnMaid)))); + + // 生成大量农田 + LiteralArgumentBuilder setFarm = Commands.literal(SET_FARM); + RequiredArgumentBuilder size = Commands.argument(SIZE, IntegerArgumentType.integer()); + debug.then(setFarm.then(size.executes(MaidDebugCommand::setFarm))); + return debug; } @@ -48,4 +64,30 @@ private static int spawnMaid(CommandContext context) throws } return Command.SINGLE_SUCCESS; } + + private static int setFarm(CommandContext context) throws CommandSyntaxException { + int size = IntegerArgumentType.getInteger(context, SIZE); + ServerPlayer serverPlayer = context.getSource().getPlayerOrException(); + if (size > 0) { + BlockPos blockPos = serverPlayer.blockPosition(); + Level level = serverPlayer.level; + BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); + for (int x = -size; x < size; x++) { + for (int z = -size; z < size; z++) { + BlockPos.MutableBlockPos pos = mutableBlockPos.setWithOffset(blockPos, x, -1, z); + if (x % 5 == 0 && z % 5 == 0) { + // 放置水和荷叶 + level.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); + level.setBlockAndUpdate(pos.move(Direction.UP), Blocks.LILY_PAD.defaultBlockState()); + } else { + // 放置农田和作物 + level.setBlockAndUpdate(pos, Blocks.FARMLAND.defaultBlockState().setValue(FarmBlock.MOISTURE, 7)); + level.setBlockAndUpdate(pos.move(Direction.UP), Blocks.WHEAT.defaultBlockState().setValue(CropBlock.AGE, 7)); + } + } + } + } + + return Command.SINGLE_SUCCESS; + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/MaidBrain.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/MaidBrain.java index c756a404f..3310070e6 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/MaidBrain.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/MaidBrain.java @@ -1,6 +1,7 @@ package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain; import com.github.tartaricacid.touhoulittlemaid.api.task.IMaidTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidFollowOwnerVehicleTask; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.ride.MaidRideBegTask; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.*; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; @@ -32,7 +33,8 @@ public static ImmutableList> getMemoryTypes() { MemoryModuleType.WALK_TARGET, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, - InitEntities.TARGET_POS.get() + InitEntities.TARGET_POS.get(), + InitEntities.CURRENT_ITEMSTACK.get() ); ExtraMaidBrainManager.EXTRA_MAID_BRAINS.forEach(extra -> defaultTypes.addAll(extra.getExtraMemoryTypes())); return ImmutableList.copyOf(defaultTypes); @@ -84,18 +86,22 @@ private static void registerSchedule(Brain brain, EntityMaid maid) { } private static void registerCoreGoals(Brain brain) { - Pair> swim = Pair.of(0, new Swim(0.8f)); + Pair> swimJump = Pair.of(0, new MaidSwimJumpTask(0.8f)); + Pair> breathAirEaten = Pair.of(0, new MaidBreathAirEatenTask()); + Pair> climb = Pair.of(0, new MaidClimbTask()); Pair> look = Pair.of(0, new LookAtTargetSink(45, 90)); Pair> maidPanic = Pair.of(1, new MaidPanicTask()); Pair> maidAwait = Pair.of(1, new MaidAwaitTask()); Pair> interactWithDoor = Pair.of(2, MaidInteractWithDoor.create()); Pair> walkToTarget = Pair.of(2, new MoveToTargetSink()); Pair> followOwner = Pair.of(3, new MaidFollowOwnerTask(0.5f, 2)); + Pair> followOwnerVehicle = Pair.of(3, new MaidFollowOwnerVehicleTask(0.5f, 2)); Pair> healSelf = Pair.of(3, new MaidHealSelfTask()); Pair> pickupItem = Pair.of(10, new MaidPickupEntitiesTask(EntityMaid::isPickup, 0.6f)); Pair> clearSleep = Pair.of(99, new MaidClearSleepTask()); - brain.addActivity(Activity.CORE, ImmutableList.of(swim, look, maidPanic, maidAwait, interactWithDoor, walkToTarget, followOwner, healSelf, pickupItem, clearSleep)); + brain.addActivity(Activity.CORE, ImmutableList.of(swimJump, climb, breathAirEaten, look, maidPanic, maidAwait, interactWithDoor, + walkToTarget, followOwner, followOwnerVehicle, healSelf, pickupItem, clearSleep)); } private static void registerIdleGoals(Brain brain) { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/sensor/MaidNearestLivingEntitySensor.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/sensor/MaidNearestLivingEntitySensor.java index eae4310c1..4abdd58e7 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/sensor/MaidNearestLivingEntitySensor.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/sensor/MaidNearestLivingEntitySensor.java @@ -15,17 +15,9 @@ import java.util.Set; public class MaidNearestLivingEntitySensor extends Sensor { - private static final int VERTICAL_SEARCH_RANGE = 4; - @Override protected void doTick(ServerLevel world, EntityMaid maid) { - float radius = maid.getRestrictRadius(); - AABB aabb; - if (maid.hasRestriction()) { - aabb = new AABB(maid.getRestrictCenter()).inflate(radius, VERTICAL_SEARCH_RANGE, radius); - } else { - aabb = maid.getBoundingBox().inflate(radius, VERTICAL_SEARCH_RANGE, radius); - } + AABB aabb = maid.searchDimension(); List list = world.getEntitiesOfClass(LivingEntity.class, aabb, (entity) -> entity != maid && entity.isAlive()); list.sort(Comparator.comparingDouble(maid::distanceToSqr)); Brain brain = maid.getBrain(); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackStrafingTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackStrafingTask.java index ea61e5779..c24a3f565 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackStrafingTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackStrafingTask.java @@ -30,7 +30,6 @@ protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owne return owner.getMainHandItem().getItem() instanceof ProjectileWeaponItem && owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET) .filter(Entity::isAlive) - .filter(e -> owner.isWithinRestriction(e.blockPosition())) .isPresent(); } @@ -45,7 +44,7 @@ protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) { double distance = owner.distanceTo(target); // 如果在最大攻击距离之内,而且看见的时长足够长 - if (distance < maxAttackDistance) { + if (distance < owner.searchRadius()) { ++this.strafingTime; } else { this.strafingTime = -1; diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackTridentTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackTridentTask.java new file mode 100644 index 000000000..59b56b621 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidAttackTridentTask.java @@ -0,0 +1,110 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.RegistryAccess; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.behavior.BehaviorUtils; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraft.world.item.TridentItem; +import net.minecraft.world.item.enchantment.Enchantments; + +import static com.github.tartaricacid.touhoulittlemaid.datagen.EnchantmentKeys.getEnchantmentLevel; + +public class MaidAttackTridentTask extends Behavior { + private boolean strafingClockwise; + private boolean strafingBackwards; + private int strafingTime = -1; + + public MaidAttackTridentTask() { + super(ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT, + MemoryModuleType.LOOK_TARGET, MemoryStatus.REGISTERED, + MemoryModuleType.ATTACK_TARGET, MemoryStatus.VALUE_PRESENT, + MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryStatus.VALUE_PRESENT), + 1200); + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owner) { + return this.hasTrident(owner) && + owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET) + .filter(Entity::isAlive) + .isPresent(); + } + + @Override + protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) { + owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).ifPresent(target -> { + double distance = owner.distanceTo(target); + float maxAttackDistance = owner.getRestrictRadius(); + + // 如果在最大攻击距离之内,而且看见的时长足够长 + if (distance < owner.searchRadius()) { + ++this.strafingTime; + } else { + this.strafingTime = -1; + } + + // 如果攻击时间也足够长,随机对走位方向和前后走位进行反转 + // 原版 10tick 就可以投出去 + if (this.strafingTime >= 10) { + if (owner.getRandom().nextFloat() < 0.3) { + this.strafingClockwise = !this.strafingClockwise; + } + if (owner.getRandom().nextFloat() < 0.3) { + this.strafingBackwards = !this.strafingBackwards; + } + this.strafingTime = 0; + } + + // 如果攻击时间大于 -1 + if (this.strafingTime > -1) { + RegistryAccess access = owner.level.registryAccess(); + boolean hasChanneling = getEnchantmentLevel(access, Enchantments.CHANNELING, owner.getMainHandItem()) > 0; + boolean canUseChanneling = owner.level.isThundering() && !owner.isUnderWater() && hasChanneling; + boolean tooClose = owner.closerThan(target, 6); + // 引雷附魔在生物处于雷雨处且不在水中时会触发,需要保证安全距离 + boolean inDangerArea = canUseChanneling && tooClose; + + // 依据距离远近决定是否前后走位 + if (distance > maxAttackDistance * 0.5) { + this.strafingBackwards = false; + } else if (distance < maxAttackDistance * 0.2 || inDangerArea) { + this.strafingBackwards = true; + } + + // 应用走位 + owner.getMoveControl().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F); + owner.setYRot(Mth.rotateIfNecessary(owner.getYRot(), owner.yHeadRot, 0.0F)); + BehaviorUtils.lookAtEntity(owner, target); + } else { + // 否则只朝向攻击目标 + BehaviorUtils.lookAtEntity(owner, target); + } + }); + } + + @Override + protected void start(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + entityIn.setSwingingArms(true); + } + + @Override + protected void stop(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + entityIn.setSwingingArms(false); + entityIn.getMoveControl().strafe(0, 0); + } + + @Override + protected boolean canStillUse(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + return this.checkExtraStartConditions(worldIn, entityIn); + } + + private boolean hasTrident(EntityMaid maid) { + return maid.getMainHandItem().getItem() instanceof TridentItem; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidBreathAirEatenTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidBreathAirEatenTask.java new file mode 100644 index 000000000..b976d5e4c --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidBreathAirEatenTask.java @@ -0,0 +1,179 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.github.tartaricacid.touhoulittlemaid.init.InitItems; +import com.github.tartaricacid.touhoulittlemaid.inventory.handler.BaubleItemHandler; +import com.github.tartaricacid.touhoulittlemaid.network.NetworkHandler; +import com.github.tartaricacid.touhoulittlemaid.network.message.SpawnParticlePackage; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.component.DataComponents; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffectUtil; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.alchemy.PotionContents; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.wrapper.RangedWrapper; + +import java.util.List; + +/** + * 女仆在水下,空气值不足时,会尝试吃任何可以补充空气的东西 + */ +public class MaidBreathAirEatenTask extends Behavior { + private static final int MAX_PROBABILITY = 5; + + public MaidBreathAirEatenTask() { + super(ImmutableMap.of()); + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel level, EntityMaid maid) { + // 正在食用可呼吸的食物 + if (maid.getSwimManager().isEatBreatheItem()) { + return false; + } + // 氧气值,默认最大是 300 + // 100 则意味着还有 5 秒呼吸时间 + if (maid.getAirSupply() >= 100) { + return false; + } + // 拥有水下呼吸等效果 + if (MobEffectUtil.hasWaterBreathing(maid)) { + return false; + } + // 溺水保护饰品 + if (hasDrownBauble(maid)) { + return false; + } + // 没有在正在食用物品 + return !maid.isUsingItem(); + } + + @Override + protected void start(ServerLevel level, EntityMaid maid, long gameTime) { + this.eatBreatheItem(maid); + } + + @Override + protected boolean canStillUse(ServerLevel level, EntityMaid maid, long gameTime) { + return this.checkExtraStartConditions(level, maid); + } + + private boolean hasDrownBauble(EntityMaid maid) { + BaubleItemHandler maidBauble = maid.getMaidBauble(); + for (int i = 0; i < maidBauble.getSlots(); i++) { + if (maidBauble.getStackInSlot(i).is(InitItems.DROWN_PROTECT_BAUBLE.get())) { + return true; + } + } + return false; + } + + private void eatBreatheItem(EntityMaid maid) { + // 先查询手部的物品能否吃:能就直接开吃,否就进行后续工作 + for (InteractionHand hand : InteractionHand.values()) { + ItemStack itemInHand = maid.getItemInHand(hand); + if (itemInHand.isEmpty()) { + continue; + } + if (this.isBreatheFood(maid, itemInHand)) { + this.startEatBreatheItem(maid, itemInHand, hand); + return; + } + } + + // 对手部进行处理:如果没有空的手部,那就取副手 + InteractionHand eanHand = InteractionHand.OFF_HAND; + for (InteractionHand hand : InteractionHand.values()) { + if (maid.getItemInHand(hand).isEmpty()) { + eanHand = hand; + break; + } + } + ItemStack itemInHand = maid.getItemInHand(eanHand); + + // 尝试在背包中寻找食物放入 + boolean hasFood = false; + RangedWrapper backpackInv = maid.getAvailableBackpackInv(); + for (int i = 0; i < backpackInv.getSlots(); i++) { + ItemStack stack = backpackInv.getStackInSlot(i); + if (stack.isEmpty()) { + continue; + } + if (this.isBreatheFood(maid, stack)) { + ItemStack foodStack = stack.copy(); + ItemStack handStack = itemInHand.copy(); + maid.setItemInHand(eanHand, foodStack); + backpackInv.setStackInSlot(i, ItemStack.EMPTY); + ItemHandlerHelper.insertItemStacked(backpackInv, handStack, false); + maid.memoryHandItemStack(handStack); + itemInHand = maid.getItemInHand(eanHand); + hasFood = true; + break; + } + } + + // 开吃 + if (hasFood) { + this.startEatBreatheItem(maid, itemInHand, eanHand); + } + } + + private void startEatBreatheItem(EntityMaid maid, ItemStack stack, InteractionHand hand) { + maid.getSwimManager().setEatBreatheItem(true); + + FoodProperties foodProperties = stack.getFoodProperties(maid); + float total = 0; + if (foodProperties != null) { + int nutrition = foodProperties.nutrition(); + float saturationModifier = foodProperties.saturation(); + total = nutrition + nutrition * saturationModifier * 2; + } + maid.startUsingItem(hand); + + // 原版的熟牛肉之类的一般在 20 左右(除了迷之炖菜为 34.2) + if (maid.getRandom().nextInt(MAX_PROBABILITY) < total) { + float healCount = Math.max(total / MAX_PROBABILITY, 1); + maid.heal(healCount); + NetworkHandler.sendToNearby(maid, new SpawnParticlePackage(maid.getId(), SpawnParticlePackage.Type.HEAL, stack.getUseDuration(maid))); + } + } + + private boolean isBreatheFood(EntityMaid maid, ItemStack stack) { + // 寻找药水 + if (stack.getItem() instanceof PotionItem) { + PotionContents mobEffects = stack.get(DataComponents.POTION_CONTENTS); + if (mobEffects == null || !mobEffects.hasEffects()) { + return false; + } + for (MobEffectInstance effect : mobEffects.getAllEffects()) { + if (effect.getEffect() == MobEffects.WATER_BREATHING) { + return true; + } + } + return false; + } + + // 或者能提供水下呼吸的食物 + FoodProperties foodProperties = stack.getFoodProperties(maid); + if (foodProperties == null) { + return false; + } + List effects = foodProperties.effects(); + if (effects.isEmpty()) { + return false; + } + for (FoodProperties.PossibleEffect effect : effects) { + if (effect.effect().getEffect() == MobEffects.WATER_BREATHING) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidClimbTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidClimbTask.java new file mode 100644 index 000000000..f464029d8 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidClimbTask.java @@ -0,0 +1,136 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.behavior.BlockPosTracker; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.Node; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.phys.Vec3; + +public class MaidClimbTask extends Behavior { + public MaidClimbTask() { + super(ImmutableMap.of()); + } + + @Override + protected void start(ServerLevel pLevel, EntityMaid maid, long pGameTime) { + // 初始化女仆动量 + // 将女仆定格在楼梯中心,取消掉 x、z 轴的动量,避免爬楼梯过程中摔死 + BlockPos currentPosition = maid.blockPosition().mutable(); + Vec3 centerPos = Vec3.atCenterOf(currentPosition); + maid.moveTo(centerPos.x, currentPosition.getY(), centerPos.z); + maid.setDeltaMovement(0, maid.getDeltaMovement().y(), 0); + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel pLevel, EntityMaid maid) { + // 如果禁用了主动攀爬能力,就直接返回,不执行后续的操作 + if (!maid.getConfigManager().isActiveClimbing()) { + return false; + } + return maid.onClimbable(); + } + + @Override + protected boolean canStillUse(ServerLevel pLevel, EntityMaid pEntity, long pGameTime) { + return this.checkExtraStartConditions(pLevel, pEntity); + } + + @Override + protected void tick(ServerLevel level, EntityMaid maid, long pGameTime) { + Path path = maid.getNavigation().getPath(); + if (path == null || path.isDone()) { + maid.setCanClimb(false); + return; + } + + maid.setCanClimb(true); + // 获取基础信息:下一个要到达的节点、女仆当前所处坐标、方块 + int beGoNodeIndex = path.getNextNodeIndex(); + Node beGoNode = path.getNode(beGoNodeIndex); + BlockPos maidFeetPos = maid.blockPosition(); + BlockState feetBlock = level.getBlockState(maidFeetPos); + + // 判断上行还是下行 + boolean up = true; + if (beGoNodeIndex > 0) { + Node currentNext = path.getNode(beGoNodeIndex - 1); + Node pointNext = path.getNode(beGoNodeIndex); + if (pointNext.y <= currentNext.y) { + up = false; + } + } + + // 如果是下行,添加 shift 行为 + maid.setShiftKeyDown(!up); + + // 控制上行和下行楼梯的动量 + // 将水平方向的动量关掉,与上面的初始化,定格在方块中心,不然会摔死…… + // 先给一个大点的 y 轴向量,再拉回一点,这样能连续下去 + // 原版的爬楼梯数值为 0.15,有些慢,加快点…… + // 而且速度太慢的话,爬楼梯时间过长,路径就被掐断了, + // 就又会重新规划路线……这样控制比较麻烦,而且也还有其他的东西在干扰…… + // 最好的是一次路径控制完,这样的效果是最好的 + if (maidFeetPos.getY() <= beGoNode.y && up && feetBlock.isLadder(level, maidFeetPos, maid)) { + double yMotion0 = 1; + double yMotion = 0.25; + maid.setDeltaMovement(0, yMotion0, 0); + maid.setDeltaMovement(0, yMotion, 0); + } else { + double yMotion0 = -1; + double yMotion = -0.25; + maid.setDeltaMovement(0, yMotion0, 0); + maid.setDeltaMovement(0, yMotion, 0); + } + + // 对下行做出额外处理 + // 下行的最近节点索引值很奇怪…… + // 女仆都还没到那个下一个节点附近,就启动切换到下一个节点了…… + // 上行的就没有这个问题…… + if (!up && beGoNode.y != maidFeetPos.getY()) { + int nodeCount = path.getNodeCount(); + for (int i1 = 0; i1 < nodeCount; i1++) { + Node node = path.getNode(i1); + Node nextNode = path.getNode(Math.min(i1 + 1, nodeCount - 1)); + // 获取正确的节点信息 + if (node.y == maidFeetPos.getY() && node.x == maidFeetPos.getX() && node.z == maidFeetPos.getZ() && node.y == nextNode.y) { + beGoNodeIndex = i1; + beGoNode = node; + // 更正最近索引点 + path.setNextNodeIndex(i1); + break; + } + } + } + // 控制正常情况下到达该段楼梯节点顶部或者底部向着平台进发 + if ((beGoNode.y - maidFeetPos.getY() >= 0 && beGoNode.y - maidFeetPos.getY() <= 1.2) && beGoNodeIndex + 1 < path.getNodeCount()) { + Node currentNext = path.getNode(beGoNodeIndex); + Node pointNext = path.getNode(beGoNodeIndex + 1); + + boolean beWalkSurface = pointNext.y == currentNext.y; + if (beWalkSurface || pointNext == path.getEndNode() || maidFeetPos.getY() == currentNext.y) { + maid.setCanClimb(false); + // 给予女仆当前坐标与水平节点的x、z方向的差值向量, + // 让其向着那个水平节点进发,脱离楼梯等可爬行物体,不再继续爬楼梯或者停留在上面 + int x1 = pointNext.x - currentNext.x; + int z1 = pointNext.z - currentNext.z; + double y = maid.getDeltaMovement().y(); + maid.setDeltaMovement(0.2, 1, 0.2); + maid.setDeltaMovement(x1 * 0.3, y + 0.012, z1 * 0.3); + // TODO:将身体转向下一个节点 + maid.getBrain().setMemory(MemoryModuleType.LOOK_TARGET, new BlockPosTracker(pointNext.asVec3())); + } + } + } + + @Override + protected void stop(ServerLevel pLevel, EntityMaid maid, long pGameTime) { + maid.setShiftKeyDown(false); + maid.setCanClimb(false); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidCrossbowAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidCrossbowAttack.java new file mode 100644 index 000000000..98bc20163 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidCrossbowAttack.java @@ -0,0 +1,26 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.ai.behavior.CrossbowAttack; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.ItemStack; + +/** + * 原版的 CrossbowAttack 调用了 BehaviorUtils.canSee,导致射击限制在 16 格内 + *

+ * 故略作修改,让其适配自定义距离 + */ +public class MaidCrossbowAttack extends CrossbowAttack { + @Override + protected boolean checkExtraStartConditions(ServerLevel level, EntityMaid maid) { + return maid.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET) + .map(target -> maid.isHolding(this::isCrossbow) && maid.canSee(target)) + .orElse(false); + } + + private boolean isCrossbow(ItemStack stack) { + return stack.getItem() instanceof CrossbowItem; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerTask.java index 51a8e4422..3d7e39535 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerTask.java @@ -75,8 +75,7 @@ private boolean teleportTooClosed(LivingEntity owner, int x, int z) { private boolean canTeleportTo(EntityMaid maid, BlockPos pos) { PathType pathNodeType = WalkNodeEvaluator.getPathTypeStatic(maid, pos); - // FIXME: 水面也可以传送 - if (pathNodeType == PathType.WALKABLE) { + if (pathNodeType == PathType.WALKABLE || pathNodeType == PathType.WATER) { BlockPos blockPos = pos.subtract(maid.blockPosition()); return maid.level().noCollision(maid, maid.getBoundingBox().move(blockPos)); } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerVehicleTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerVehicleTask.java new file mode 100644 index 000000000..bec9aa073 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidFollowOwnerVehicleTask.java @@ -0,0 +1,116 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.api.mixin.IPlayerMixin; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.github.tartaricacid.touhoulittlemaid.mixin.EntityAccessor; +import com.google.common.collect.ImmutableMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.behavior.BehaviorUtils; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class MaidFollowOwnerVehicleTask extends Behavior { + private static final int RANGE = 3; + private final float speedModifier; + private final int stopDistance; + private Entity ownerControlledVehicle; + private Type type = Type.NONE; + + public MaidFollowOwnerVehicleTask(float speedModifier, int stopDistance) { + super(ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED)); + this.speedModifier = speedModifier; + this.stopDistance = stopDistance; + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid maid) { + // 必须是跟随模式并且自身可以移动 + if (!this.maidStateConditions(maid)) { + return false; + } + + // 主人必须在场 + LivingEntity owner = maid.getOwner(); + if (!this.ownerStateConditions(owner) || !(owner instanceof Player player)) { + return false; + } + + Entity ownerControlledVehicle = owner.getControlledVehicle(); + Entity maidVehicle = maid.getVehicle(); + + // 如果主人下船(载具)了,女仆也下船。反之上船了,女仆也跟着上船 + // 当然,这个载具必须还有空位才可以 + if (ownerControlledVehicle == null) { + // 玩家下船有大约 60 tick 冷却时间,在此时间内,一定范围内的女仆才能主动下船,避免误伤 + boolean isCooldown = ((IPlayerMixin) player).tlmInRemoveVehicleCooldown(); + boolean maidInDismountRange = maid.distanceTo(owner) < RANGE; + if (maid.isPassenger() && isCooldown && maidInDismountRange) { + this.type = Type.STOP; + return true; + } + return false; + } + + // 玩家和女仆同坐一艘船,不需要判断 + if (maidVehicle != null && maidVehicle == ownerControlledVehicle) { + return false; + } + + // 乘坐的载具不能添加新的乘客了,不执行 + if (!((EntityAccessor) ownerControlledVehicle).tlmCanAddPassenger(maid)) { + return false; + } + + // 女仆开始尝试骑乘载具 + if (maid.closerThan(ownerControlledVehicle, RANGE)) { + this.ownerControlledVehicle = ownerControlledVehicle; + this.type = Type.RIDE; + return true; + } else if (!maid.getBrain().hasMemoryValue(MemoryModuleType.WALK_TARGET)) { + BehaviorUtils.setWalkAndLookTargetMemories(maid, ownerControlledVehicle, speedModifier, stopDistance); + return false; + } + + return false; + } + + @Override + protected void start(ServerLevel worldIn, EntityMaid maid, long gameTimeIn) { + switch (this.type) { + case RIDE -> Optional.ofNullable(this.ownerControlledVehicle).ifPresent(maid::startRiding); + case STOP -> maid.stopRiding(); + } + } + + @Override + protected void stop(ServerLevel worldIn, EntityMaid maid, long gameTimeIn) { + this.ownerControlledVehicle = null; + this.type = Type.NONE; + } + + private boolean canBrainMoving(EntityMaid maid) { + // 不需要判断是否女仆正在骑乘 + return !maid.isMaidInSittingPose() && !maid.isSleeping() && !maid.isLeashed(); + } + + private boolean maidStateConditions(EntityMaid maid) { + return !maid.isHomeModeEnable() && this.canBrainMoving(maid) && maid.isRideable(); + } + + private boolean ownerStateConditions(@Nullable LivingEntity owner) { + return owner != null && owner.isAlive() && !owner.isSpectator() && !owner.isDeadOrDying(); + } + + enum Type { + RIDE, + STOP, + NONE; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHealSelfTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHealSelfTask.java index 13dd0dd4c..a5c4da61d 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHealSelfTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHealSelfTask.java @@ -79,6 +79,7 @@ protected void start(ServerLevel serverLevel, EntityMaid maid, long gameTime) { backpackInv.setStackInSlot(i, ItemStack.EMPTY); ItemHandlerHelper.insertItemStacked(backpackInv, handStack, false); itemInHand = maid.getItemInHand(eanHand); + maid.memoryHandItemStack(handStack); hasFood = true; break swapItemCheck; } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHomeMealTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHomeMealTask.java index fec4b3ef7..0fa913a26 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHomeMealTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidHomeMealTask.java @@ -72,7 +72,8 @@ protected void start(ServerLevel serverLevel, EntityMaid maid, long gameTime) { // 先对把手上的物品放入背包做预处理:如果放入背包后,手上还有剩余,那就不执行后续吃的逻辑并添加气泡提示 ItemStack itemInHand = maid.getItemInHand(eanHand); IItemHandlerModifiable availableInv = maid.getAvailableBackpackInv(); - ItemStack leftoverStack = ItemHandlerHelper.insertItemStacked(availableInv, itemInHand.copy(), true); + ItemStack handItemCopy = itemInHand.copy(); + ItemStack leftoverStack = ItemHandlerHelper.insertItemStacked(availableInv, handItemCopy, true); if (!leftoverStack.isEmpty()) { ChatBubbleManger.addInnerChatText(maid, "chat_bubble.touhou_little_maid.inner.home_meal.two_hand_is_full"); return; @@ -106,11 +107,12 @@ protected void start(ServerLevel serverLevel, EntityMaid maid, long gameTime) { candidateFood.intStream().skip(skipCount).findFirst().ifPresent(slotIndex -> { ItemStack outputStack = handler.extractItem(slotIndex, 1, false); this.tmpPicnicMat.refresh(); - ItemHandlerHelper.insertItemStacked(availableInv, itemInHand.copy(), false); + ItemHandlerHelper.insertItemStacked(availableInv, handItemCopy, false); maid.setItemInHand(hand, outputStack); ItemStack refreshItemInHand = maid.getItemInHand(hand); for (IMaidMeal maidMeal : maidMeals) { if (maidMeal.canMaidEat(maid, refreshItemInHand, hand)) { + maid.memoryHandItemStack(handItemCopy); maidMeal.onMaidEat(maid, refreshItemInHand, hand); if (maid.getOwner() instanceof ServerPlayer serverPlayer) { InitTrigger.MAID_EVENT.get().trigger(serverPlayer, TriggerType.MAID_PICNIC_EAT); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidMoveToBlockTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidMoveToBlockTask.java index 1347a6571..179ecd527 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidMoveToBlockTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidMoveToBlockTask.java @@ -15,6 +15,10 @@ public abstract class MaidMoveToBlockTask extends MaidCheckRateTask { private final float movementSpeed; private final int verticalSearchRange; protected int verticalSearchStart; + /** + * 最近工作点标志位(用于记录当前工作的方块位置,缓存下来便于下次在该点附近工作) + */ + private BlockPos currentWorkPos; public MaidMoveToBlockTask(float movementSpeed) { this(movementSpeed, 1); @@ -29,7 +33,7 @@ public MaidMoveToBlockTask(float movementSpeed, int verticalSearchRange) { } protected final void searchForDestination(ServerLevel worldIn, EntityMaid maid) { - BlockPos centrePos = maid.getBrainSearchPos(); + BlockPos centrePos = this.getWorkSearchPos(maid); int searchRange = (int) maid.getRestrictRadius(); BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); for (int y = this.verticalSearchStart; y <= this.verticalSearchRange; y = y > 0 ? -y : 1 - y) { @@ -41,6 +45,7 @@ protected final void searchForDestination(ServerLevel worldIn, EntityMaid maid) && checkOwnerPos(maid, mutableBlockPos)) { BehaviorUtils.setWalkAndLookTargetMemories(maid, mutableBlockPos, this.movementSpeed, 0); maid.getBrain().setMemory(InitEntities.TARGET_POS.get(), new BlockPosTracker(mutableBlockPos)); + this.currentWorkPos = mutableBlockPos; this.setNextCheckTickCount(5); return; } @@ -48,6 +53,21 @@ && checkOwnerPos(maid, mutableBlockPos)) { } } } + this.currentWorkPos = null; + } + + // 获取工作的搜寻中心点 + private BlockPos getWorkSearchPos(EntityMaid maid) { + if (maid.hasRestriction()) { + // 当且仅当开启home模式,并且工作点在工作范围内才返回最近工作点 + if (this.currentWorkPos != null && maid.isWithinRestriction(currentWorkPos)) { + return this.currentWorkPos; + } else { + return maid.getRestrictCenter(); + } + } else { + return maid.blockPosition(); + } } private boolean checkOwnerPos(EntityMaid maid, BlockPos mutableBlockPos) { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidRangedWalkToTarget.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidRangedWalkToTarget.java new file mode 100644 index 000000000..bda50a82e --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidRangedWalkToTarget.java @@ -0,0 +1,63 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.mojang.datafixers.kinds.IdF; +import com.mojang.datafixers.kinds.OptionalBox; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.EntityTracker; +import net.minecraft.world.entity.ai.behavior.PositionTracker; +import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder; +import net.minecraft.world.entity.ai.behavior.declarative.MemoryAccessor; +import net.minecraft.world.entity.ai.behavior.declarative.Trigger; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities; +import net.minecraft.world.entity.ai.memory.WalkTarget; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Function; + +/** + * 修改了原版的走向攻击目标的 AI,现在能够依据超远视距和 home 范围进行行走判断 + *

+ * 主要用于远程射击,近战的还是请走 SetWalkTargetFromAttackTargetIfTargetOutOfReach + */ +public class MaidRangedWalkToTarget { + public static BehaviorControl create(float speedModifier) { + return create(entity -> speedModifier); + } + + public static BehaviorControl create(Function speedModifier) { + return BehaviorBuilder.create(maidInstance -> maidInstance.group( + maidInstance.registered(MemoryModuleType.WALK_TARGET), + maidInstance.registered(MemoryModuleType.LOOK_TARGET), + maidInstance.present(MemoryModuleType.ATTACK_TARGET), + maidInstance.registered(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES)) + .apply(maidInstance, (walkTargetMemory, positionMemory, entityMemory, livingEntitiesMemory) + -> setTarget(speedModifier, maidInstance, walkTargetMemory, positionMemory, entityMemory, livingEntitiesMemory))); + } + + @NotNull + private static Trigger setTarget(Function speedModifier, + BehaviorBuilder.Instance maidInstance, + MemoryAccessor walkTargetMemory, + MemoryAccessor positionMemory, + MemoryAccessor entityMemory, + MemoryAccessor livingEntitiesMemory) { + return (level, maid, gameTime) -> { + LivingEntity target = maidInstance.get(entityMemory); + if (maid.canSee(target) && isWithinRestriction(maid, target)) { + walkTargetMemory.erase(); + } else { + positionMemory.set(new EntityTracker(target, true)); + walkTargetMemory.set(new WalkTarget(new EntityTracker(target, false), speedModifier.apply(maid), 0)); + } + return true; + }; + } + + private static boolean isWithinRestriction(EntityMaid maid, LivingEntity target) { + float restrictRadius = maid.getRestrictRadius() * 0.65f; + return target.distanceTo(maid) < restrictRadius; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidShootTargetTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidShootTargetTask.java index 7585e0f4c..584af3c3a 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidShootTargetTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidShootTargetTask.java @@ -6,7 +6,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.behavior.Behavior; -import net.minecraft.world.entity.ai.behavior.BehaviorUtils; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.memory.MemoryStatus; import net.minecraft.world.item.BowItem; @@ -34,8 +33,7 @@ protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owne if (memory.isPresent()) { LivingEntity target = memory.get(); return owner.isHolding(item -> item.getItem() instanceof ProjectileWeaponItem) - && BehaviorUtils.canSee(owner, target) - && BehaviorUtils.isWithinAttackRange(owner, target, 0); + && owner.canSee(target); } return false; } @@ -55,7 +53,7 @@ protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) { owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).ifPresent((target) -> { // 强行看见并朝向 owner.getLookControl().setLookAt(target.getX(), target.getY(), target.getZ()); - boolean canSee = BehaviorUtils.canSee(owner, target); + boolean canSee = owner.canSee(target); boolean seeTimeMoreThanZero = this.seeTime > 0; // 如果两者不一致,重置看见时间 diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidSwimJumpTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidSwimJumpTask.java new file mode 100644 index 000000000..ae275b55e --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidSwimJumpTask.java @@ -0,0 +1,17 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.behavior.Swim; + +public class MaidSwimJumpTask extends Swim { + public MaidSwimJumpTask(float chance) { + super(chance); + } + + @Override + protected boolean canStillUse(ServerLevel level, Mob mob, long gameTime) { + // 在水下的时候禁止被动跳跃 + return super.canStillUse(level, mob, gameTime) && !mob.isUnderWater() && mob.getNavigation().isDone(); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidTridentTargetTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidTridentTargetTask.java new file mode 100644 index 000000000..cee8ea867 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidTridentTargetTask.java @@ -0,0 +1,111 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.RegistryAccess; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +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.TridentItem; +import net.minecraft.world.item.enchantment.Enchantments; + +import java.util.Optional; + +import static com.github.tartaricacid.touhoulittlemaid.datagen.EnchantmentKeys.getEnchantmentLevel; + +public class MaidTridentTargetTask extends Behavior { + /** + * 一秒的间隔使用时间,模拟忠诚后的三叉戟击中目标返回来所需要的时间,不然就太 IMBA 了... + */ + private final int attackCooldown = 20; + private int attackTime = -1; + private int seeTime; + + public MaidTridentTargetTask() { + super(ImmutableMap.of(MemoryModuleType.LOOK_TARGET, MemoryStatus.REGISTERED, + MemoryModuleType.ATTACK_TARGET, MemoryStatus.VALUE_PRESENT), 1200); + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owner) { + Optional memory = owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET); + if (memory.isPresent()) { + LivingEntity target = memory.get(); + return hasTrident(owner) && owner.canSee(target); + } + return false; + } + + @Override + protected boolean canStillUse(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + return entityIn.getBrain().hasMemoryValue(MemoryModuleType.ATTACK_TARGET) && this.checkExtraStartConditions(worldIn, entityIn); + } + + @Override + protected void start(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + entityIn.setSwingingArms(true); + } + + @Override + protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) { + owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).ifPresent((target) -> { + // 强行看见并朝向 + owner.getLookControl().setLookAt(target.getX(), target.getY(), target.getZ()); + boolean canSee = owner.canSee(target); + boolean seeTimeMoreThanZero = this.seeTime > 0; + + // 如果两者不一致,重置看见时间 + if (canSee != seeTimeMoreThanZero) { + this.seeTime = 0; + } + // 如果看见了对方,增加看见时间,否则减少 + if (canSee) { + ++this.seeTime; + } else { + --this.seeTime; + } + + // 如果实体手部处于激活状态 + if (owner.isUsingItem()) { + // 如果看不见对方超时 60,重置激活状态 + if (!canSee && this.seeTime < -60) { + owner.stopUsingItem(); + } else if (canSee) { + // 否则开始进行远程攻击 + int ticksUsingItem = owner.getTicksUsingItem(); + + // 物品最大使用计数大于 30 才可以 + // 如果有引雷,必须 6 格之外(安全范围,以免波及自身) + RegistryAccess access = owner.level.registryAccess(); + boolean hasChanneling = getEnchantmentLevel(access, Enchantments.CHANNELING, owner.getMainHandItem()) > 0; + boolean canUseChanneling = owner.level.isThundering() && !owner.isUnderWater() && hasChanneling; + boolean tooClose = owner.closerThan(target, 6); + // 引雷附魔在生物处于雷雨处且不在水中时会触发,需要保证安全距离 + boolean inSafeArea = !(canUseChanneling && tooClose); + if (ticksUsingItem >= 30 && inSafeArea) { + owner.stopUsingItem(); + owner.performRangedAttack(target, 0); + this.attackTime = this.attackCooldown; + } + } + } else if (--this.attackTime <= 0 && this.seeTime >= -60) { + // 非激活状态,但是时长合适,开始激活手部 + owner.startUsingItem(InteractionHand.MAIN_HAND); + } + }); + } + + @Override + protected void stop(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn) { + this.seeTime = 0; + this.attackTime = -1; + entityIn.stopUsingItem(); + } + + private boolean hasTrident(EntityMaid maid) { + return maid.getMainHandItem().getItem() instanceof TridentItem; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidUseShieldTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidUseShieldTask.java new file mode 100644 index 000000000..c04a7253c --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidUseShieldTask.java @@ -0,0 +1,44 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.google.common.collect.ImmutableMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +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; + +public class MaidUseShieldTask extends Behavior { + private static final int CHECK_RANGE = 8; + + public MaidUseShieldTask() { + super(ImmutableMap.of(MemoryModuleType.ATTACK_TARGET, MemoryStatus.REGISTERED)); + } + + @Override + protected boolean checkExtraStartConditions(ServerLevel serverLevel, EntityMaid maid) { + // 盾牌优先判断,节省性能 + if (!maid.canUseShield()) { + return false; + } + LivingEntity target = maid.getTarget(); + // 如果敌对生物靠太近,盾牌防御 + return target != null && target.isAlive() && target.distanceTo(maid) < CHECK_RANGE; + } + + @Override + protected boolean canStillUse(ServerLevel serverLevel, EntityMaid maid, long gameTime) { + return this.checkExtraStartConditions(serverLevel, maid); + } + + @Override + protected void start(ServerLevel serverLevel, EntityMaid maid, long gameTime) { + maid.startUsingItem(InteractionHand.OFF_HAND); + } + + @Override + protected void stop(ServerLevel serverLevel, EntityMaid maid, long gameTime) { + maid.stopUsingItem(); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidWorkMealTask.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidWorkMealTask.java index 4c69c33f9..94f9e98e9 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidWorkMealTask.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/brain/task/MaidWorkMealTask.java @@ -6,6 +6,7 @@ import com.github.tartaricacid.touhoulittlemaid.entity.favorability.Type; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.entity.task.meal.MaidMealManager; +import com.github.tartaricacid.touhoulittlemaid.init.InitEntities; import com.google.common.collect.ImmutableMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -79,6 +80,7 @@ protected void start(ServerLevel serverLevel, EntityMaid maid, long gameTime) { maid.setItemInHand(eanHand, foodStack); backpackInv.setStackInSlot(i, ItemStack.EMPTY); ItemHandlerHelper.insertItemStacked(backpackInv, handStack, false); + maid.memoryHandItemStack(handStack); itemInHand = maid.getItemInHand(eanHand); hasFood = true; break swapItemCheck; diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/control/MaidMoveControl.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/control/MaidMoveControl.java new file mode 100644 index 000000000..f50a4f31a --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/control/MaidMoveControl.java @@ -0,0 +1,53 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.ai.control; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.navigation.PathNavigation; + +/** + * 参考:net.minecraft.world.entity.monster.Drowned.DrownedMoveControl + */ +public class MaidMoveControl extends MoveControl { + private final EntityMaid maid; + + public MaidMoveControl(EntityMaid maid) { + super(maid); + this.maid = maid; + } + + @Override + public void tick() { + // 用 underwater 是因为如果是 inWater 的话,女仆在登陆的时候,就会一直卡住,上不来 + if (this.maid.isUnderWater() && this.hasWanted()) { + PathNavigation navigation = this.maid.getNavigation(); + if (navigation.isDone()) { + this.maid.getSwimManager().setWantToSwim(false); + } else if (navigation.getPath() != null || maid.getTarget() != null) { + this.maid.getSwimManager().setWantToSwim(true); + } + + if (this.operation != MoveControl.Operation.MOVE_TO || this.maid.getNavigation().isDone()) { + this.maid.setSpeed(0.0F); + return; + } + + double x = this.wantedX - this.maid.getX(); + double y = this.wantedY - this.maid.getY(); + double z = this.wantedZ - this.maid.getZ(); + double sqrt = Math.sqrt(x * x + y * y + z * z); + float yRot = (float) (Math.toDegrees(Mth.atan2(z, x)) - 90); + + this.maid.setYRot(this.rotlerp(this.maid.getYRot(), yRot, 90.0F)); + this.maid.yBodyRot = this.maid.getYRot(); + float speed = (float) (this.speedModifier * this.maid.getAttributeValue(Attributes.MOVEMENT_SPEED)); + float speedLerp = Mth.lerp(1, this.maid.getSpeed(), speed); + // 太慢了,3 倍基础速度 + this.maid.setSpeed(speedLerp * 3); + this.maid.setDeltaMovement(this.maid.getDeltaMovement().add(speedLerp * x * 0.005, speedLerp * y / sqrt * 0.25, speedLerp * z * 0.005)); + } else { + super.tick(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/navigation/MaidNodeEvaluator.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/navigation/MaidNodeEvaluator.java index 120f5fffc..43022c49c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/navigation/MaidNodeEvaluator.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/ai/navigation/MaidNodeEvaluator.java @@ -2,16 +2,18 @@ import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.FenceGateBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.Node; import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.level.pathfinder.PathfindingContext; import net.minecraft.world.level.pathfinder.WalkNodeEvaluator; /** - * 该方法仅修改了栅栏门的寻路判断 + * 该方法仅修改了栅栏门和梯子的寻路判断 */ public class MaidNodeEvaluator extends WalkNodeEvaluator { @Override @@ -19,6 +21,45 @@ public PathType getPathType(PathfindingContext pContext, int pX, int pY, int pZ) return getMaidBlockPathTypeStatic(pContext, new BlockPos.MutableBlockPos(pX, pY, pZ)); } + @Override + public int getNeighbors(Node[] outputArray, Node node) { + int nodeId = super.getNeighbors(outputArray, node); + return this.createClimbNode(nodeId, outputArray, node); + } + + // 将可爬行物加入寻路节点里头 + // 一般这些物体都是相连的,所以向上向下搜寻下 + protected int createClimbNode(int nodeId, Node[] nodes, Node origin) { + // 只有在开启攀爬能力,才将梯子加入寻路节点里 + if (this.mob instanceof EntityMaid maid && maid.getConfigManager().isActiveClimbing()) { + // 向上搜寻 + BlockPos.MutableBlockPos upPos = new BlockPos.MutableBlockPos(origin.x, origin.y + 1, origin.z); + if (isMaidCanClimbBlock(upPos, maid)) { + Node node = this.getNode(upPos); + if (!node.closed) { + node.costMalus = 0; + node.type = PathType.WALKABLE; + if (nodeId + 1 < nodes.length) { + nodes[nodeId++] = node; + } + } + } + // 向下搜寻 + BlockPos.MutableBlockPos downPos = new BlockPos.MutableBlockPos(origin.x, origin.y - 1, origin.z); + if (isMaidCanClimbBlock(downPos, maid)) { + Node node = this.getNode(downPos); + if (!node.closed) { + node.costMalus = 0; + node.type = PathType.WALKABLE; + if (nodeId + 1 < nodes.length) { + nodes[nodeId++] = node; + } + } + } + } + return nodeId; + } + private PathType getMaidBlockPathTypeStatic(PathfindingContext context, BlockPos.MutableBlockPos pos) { int x = pos.getX(); int y = pos.getY(); @@ -47,6 +88,9 @@ private PathType getMaidBlockPathTypeRaw(PathfindingContext context, int pX, int PathType pathType; if (blockState.getBlock() instanceof FenceGateBlock) { pathType = blockState.getValue(FenceGateBlock.OPEN) ? PathType.DOOR_OPEN : PathType.DOOR_WOOD_CLOSED; + } else if (this.mob instanceof EntityMaid maid && this.canClimb(blockState, pos, maid)) { + // 将楼梯视为可行走方块,便于后续将楼梯加入路径节点 + pathType = PathType.WALKABLE; } else { pathType = context.getPathTypeFromState(pX, pY, pZ); } @@ -65,4 +109,21 @@ private boolean canOpenDoor(Block block, EntityMaid maid) { } return true; } + + private boolean canClimb(BlockState blockState, BlockPos blockPos, EntityMaid maid) { + if (isMaidCanClimbBlock(blockState, blockPos, maid)) { + return maid.getConfigManager().isActiveClimbing(); + } + return false; + } + + public static boolean isMaidCanClimbBlock(BlockPos blockPos, EntityMaid maid) { + Level level = maid.level; + BlockState blockState = level.getBlockState(blockPos); + return isMaidCanClimbBlock(blockState, blockPos, maid); + } + + public static boolean isMaidCanClimbBlock(BlockState blockState, BlockPos blockPos, EntityMaid maid) { + return blockState.isLadder(maid.level, blockPos, maid); + } } \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/info/ServerCustomPackLoader.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/info/ServerCustomPackLoader.java index 3c391cf8a..0b998ca46 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/info/ServerCustomPackLoader.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/info/ServerCustomPackLoader.java @@ -175,6 +175,11 @@ private static void loadMaidModelPack(ZipFile zipFile, String domain) { CustomModelPack pack = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), new TypeToken>() { }.getType()); + // 加载时有非常小的概率会偶发,不知为何 + if (pack == null) { + LOGGER.warn(MARKER, "Model pack in domain {} is null, file is {}", domain, zipFile.getName()); + return; + } pack.decorate(domain); for (MaidModelInfo maidModelInfo : pack.getModelList()) { if (maidModelInfo.getEasterEgg() == null) { @@ -202,6 +207,11 @@ private static void loadChairModelPack(ZipFile zipFile, String domain) { CustomModelPack pack = GSON.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), new TypeToken>() { }.getType()); + // 加载时有非常小的概率会偶发,不知为何 + if (pack == null) { + LOGGER.warn(MARKER, "Model pack in domain {} is null, file is {}", domain, zipFile.getName()); + return; + } pack.decorate(domain); for (ChairModelInfo chairModelInfo : pack.getModelList()) { String id = chairModelInfo.getModelId().toString(); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/monster/EntityFairy.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/monster/EntityFairy.java index 7c4d87b11..683427307 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/monster/EntityFairy.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/monster/EntityFairy.java @@ -9,6 +9,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -40,6 +41,7 @@ public class EntityFairy extends Monster implements RangedAttackMob, FlyingAnimal, IHasPowerPoint { public static final EntityType TYPE = EntityType.Builder.of(EntityFairy::new, MobCategory.MONSTER) .sized(0.6f, 1.5f).clientTrackingRange(10).build("fairy"); + public static final String RICK = "rick"; private static final String FAIRY_TYPE_TAG_NAME = "FairyType"; private static final EntityDataAccessor FAIRY_TYPE = SynchedEntityData.defineId(EntityFairy.class, EntityDataSerializers.INT); @@ -144,6 +146,11 @@ protected PathNavigation createNavigation(Level worldIn) { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn) { this.setFairyTypeOrdinal(random.nextInt(FairyType.values().length)); + // 有 5% 概率生成 Rick-rolling 彩蛋 + if (random.nextInt(20) == 0) { + this.setCustomName(Component.literal(RICK)); + this.setCustomNameVisible(true); + } return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn); } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid.java index 244b9a7d1..db3e86250 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/EntityMaid.java @@ -1,5 +1,6 @@ package com.github.tartaricacid.touhoulittlemaid.entity.passive; +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import com.github.tartaricacid.touhoulittlemaid.advancements.maid.TriggerType; import com.github.tartaricacid.touhoulittlemaid.api.backpack.IBackpackData; import com.github.tartaricacid.touhoulittlemaid.api.backpack.IMaidBackpack; @@ -15,8 +16,10 @@ import com.github.tartaricacid.touhoulittlemaid.client.resource.pojo.MaidModelInfo; import com.github.tartaricacid.touhoulittlemaid.config.subconfig.MaidConfig; import com.github.tartaricacid.touhoulittlemaid.data.MaidNumAttachment; +import com.github.tartaricacid.touhoulittlemaid.datagen.tag.TagItem; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.MaidBrain; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.MaidSchedule; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.control.MaidMoveControl; import com.github.tartaricacid.touhoulittlemaid.entity.ai.navigation.MaidPathNavigation; import com.github.tartaricacid.touhoulittlemaid.entity.backpack.*; import com.github.tartaricacid.touhoulittlemaid.entity.chatbubble.ChatBubbleManger; @@ -51,6 +54,7 @@ import com.github.tartaricacid.touhoulittlemaid.world.data.MaidWorldData; import com.google.common.collect.Lists; import com.mojang.serialization.Dynamic; +import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -66,6 +70,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -86,6 +91,7 @@ import net.minecraft.world.entity.ai.Brain; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.behavior.BehaviorUtils; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.item.ItemEntity; @@ -105,6 +111,7 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.BaseFireBlock; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.LevelEvent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -131,10 +138,10 @@ import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.time.Duration; +import java.util.*; +import static com.github.tartaricacid.touhoulittlemaid.config.ServerConfig.MAID_AI_TIME_DEBUG; import static com.github.tartaricacid.touhoulittlemaid.datagen.EnchantmentKeys.getEnchantmentLevel; import static com.github.tartaricacid.touhoulittlemaid.init.InitDataAttachment.MAID_NUM; import static com.github.tartaricacid.touhoulittlemaid.init.InitDataComponent.MODEL_ID_TAG_NAME; @@ -168,6 +175,8 @@ public class EntityMaid extends TamableAnimal implements CrossbowAttackMob, IMai private static final EntityDataAccessor BACKPACK_ITEM_SHOW = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.ITEM_STACK); private static final EntityDataAccessor BACKPACK_FLUID = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.STRING); + private static final long WARNING_TIME_NANOS = Duration.ofMillis(50L).toNanos(); + // 游戏数据记录,包括赢棋次数和赢棋状态 static final EntityDataAccessor GAME_SKILL = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.COMPOUND_TAG); static final EntityDataAccessor GAME_STATUE = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.BYTE); @@ -183,6 +192,7 @@ public class EntityMaid extends TamableAnimal implements CrossbowAttackMob, IMai static final EntityDataAccessor PICKUP_TYPE = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.INT); static final EntityDataAccessor OPEN_DOOR = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.BOOLEAN); static final EntityDataAccessor OPEN_FENCE_GATE = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.BOOLEAN); + static final EntityDataAccessor ACTIVE_CLIMBING = SynchedEntityData.defineId(EntityMaid.class, EntityDataSerializers.BOOLEAN); /** * 开辟空间给任务存储使用,也便于附属模组存储数据 @@ -211,7 +221,10 @@ public class EntityMaid extends TamableAnimal implements CrossbowAttackMob, IMai private final MaidTaskDataMaps taskDataMaps = new MaidTaskDataMaps(); private final FavorabilityManager favorabilityManager; private final MaidScriptBookManager scriptBookManager; + private final MaidSwimManager swimManager; private final SchedulePos schedulePos; + private final ItemCooldowns cooldowns; + public boolean guiOpening = false; public MaidFishingHook fishing = null; @@ -221,6 +234,7 @@ public class EntityMaid extends TamableAnimal implements CrossbowAttackMob, IMai private int playerHurtSoundCount = 120; private int pickupSoundCount = 5; private int backpackDelay = 0; + private int passiveUseShieldTick = 0; private IBackpackData backpackData = null; private boolean syncTaskDataMaps = false; private MaidConfigManager configManager = new MaidConfigManager(this.entityData); @@ -230,12 +244,28 @@ public class EntityMaid extends TamableAnimal implements CrossbowAttackMob, IMai * 女仆现在可以在前哨站生成,那么会打上这个标签 */ private boolean structureSpawn = false; + /** + * 女仆主动爬行标志位,用于管控女仆当前时刻需不需要攀爬 + */ + private boolean canClimb = false; + /** + * 一个记录女仆已经生成墓碑的变量,避免死亡重复生成墓碑 + */ + private boolean alreadyDropped = false; protected EntityMaid(EntityType type, Level world) { super(type, world); this.favorabilityManager = new FavorabilityManager(this); this.scriptBookManager = new MaidScriptBookManager(); - this.schedulePos = new SchedulePos(BlockPos.ZERO, world.dimension().location()); + + // 尝试修复 https://github.com/TartaricAcid/TouhouLittleMaid/issues/631 + ResourceKey dimension = Objects.requireNonNullElse(world.dimension(), Level.OVERWORLD); + this.schedulePos = new SchedulePos(BlockPos.ZERO, dimension.location()); + + this.moveControl = new MaidMoveControl(this); + this.swimManager = new MaidSwimManager(this); + + this.cooldowns = new ItemCooldowns(); } public EntityMaid(Level worldIn) { @@ -382,11 +412,22 @@ public void refreshBrain(ServerLevel serverWorldIn) { @Override protected void customServerAiStep() { + long timeRecord = Util.getNanos(); this.level.getProfiler().push("maidBrain"); if (!guiOpening) { this.getBrain().tick((ServerLevel) this.level, this); } this.level.getProfiler().pop(); + timeRecord = Util.getNanos() - timeRecord; + if (MAID_AI_TIME_DEBUG.get() && timeRecord > WARNING_TIME_NANOS) { + double timeMs = timeRecord / 1000000.0; + BlockPos blockPos = this.blockPosition(); + String taskId = this.getTask().getUid().toString(); + int searchRange = Math.round(this.getRestrictRadius()); + + TouhouLittleMaid.LOGGER.error("Maid's AI taking too long! Time: {} ms, Pos: ({},{},{}), Task ID: {}, Search Range: {}", + timeMs, blockPos.getX(), blockPos.getY(), blockPos.getZ(), taskId, searchRange); + } super.customServerAiStep(); } @@ -470,6 +511,17 @@ public void aiStep() { this.level.getProfiler().push("maidSchedulePos"); this.schedulePos.tick(this); this.level.getProfiler().pop(); + + this.level.getProfiler().push("maidCooldowns"); + this.cooldowns.tick(); + if (this.passiveUseShieldTick > 0) { + this.passiveUseShieldTick--; + // 最后 1 tick 取消盾牌 + if (this.passiveUseShieldTick == 1 && this.isUsingItem() && this.getUsedItemHand() == InteractionHand.OFF_HAND) { + this.stopUsingItem(); + } + } + this.level.getProfiler().pop(); } } @@ -505,7 +557,7 @@ private InteractionResult tameMaid(ItemStack stack, Player player) { this.navigation.stop(); this.setTarget(null); this.brain.eraseMemory(MemoryModuleType.ATTACK_TARGET); - this.level.broadcastEntityEvent(this, (byte) 7); + this.level.broadcastEntityEvent(this, EntityEvent.TAMING_SUCCEEDED); this.playSound(InitSounds.MAID_TAMED.get(), 1, 1); if (player instanceof ServerPlayer serverPlayer) { InitTrigger.MAID_EVENT.get().trigger(serverPlayer, TriggerType.TAMED_MAID); @@ -752,9 +804,19 @@ public boolean hurt(DamageSource source, float amount) { if (NeoForge.EVENT_BUS.post(new MaidAttackEvent(this, source, amount)).isCanceled()) { return false; } - if (source.getEntity() instanceof Player && this.isOwnedBy((Player) source.getEntity())) { - // 玩家对自己女仆的伤害数值为 1/5,最大为 2 + if (source.getEntity() instanceof Player player && this.isAlliedTo(player)) { + // 主人和同 Team 玩家对自己女仆的伤害数值为 1/5,最大为 2 amount = Mth.clamp(amount / 5, 0, 2); + return super.hurt(source, amount); + } + // 使用盾牌 + if (source.is(DamageTypeTags.IS_PROJECTILE) && this.canUseShield()) { + boolean isUsingShield = this.isUsingItem() && this.getUsedItemHand() == InteractionHand.OFF_HAND; + if (!isUsingShield) { + this.startUsingItem(InteractionHand.OFF_HAND); + // 使用五秒的盾牌 + this.passiveUseShieldTick = 100; + } } return super.hurt(source, amount); } @@ -900,8 +962,11 @@ public ItemStack getProjectile(ItemStack weaponStack) { if (this.getOffhandItem().getItem() instanceof FireworkRocketItem) { return this.getOffhandItem(); } + if (!(this.getMainHandItem().getItem() instanceof ProjectileWeaponItem weaponItem)) { + return ItemStack.EMPTY; + } CombinedInvWrapper handler = this.getAvailableInv(true); - int slot = ItemsUtil.findStackSlot(handler, ((CrossbowItem) this.getMainHandItem().getItem()).getAllSupportedProjectiles()); + int slot = ItemsUtil.findStackSlot(handler, weaponItem.getAllSupportedProjectiles()); if (slot < 0) { // 不存在时,返回空 return ItemStack.EMPTY; @@ -1220,10 +1285,57 @@ protected void dropEquipment() { maidWorldData.addTombstones(this, tombstone); } + // 记录墓碑已经生成,避免重复生成 + alreadyDropped = true; level.addFreshEntity(tombstone); } } + @Override + public void remove(RemovalReason reason) { + // TODO: 尝试修复可能存在的目标生成丢失问题,可能会有问题 + if (reason == RemovalReason.KILLED && !alreadyDropped) { + // 女仆被指令杀后也正常生成墓碑 + this.dropEquipment(); + } + super.remove(reason); + } + + @Override + protected void completeUsingItem() { + this.getSwimManager().resetEatBreatheItem(); + super.completeUsingItem(); + this.backCurrentHandItemStack(); + } + + /** + * 当需要临时调换手中物品和背包内物品时,可调用此方法 + * 当置换后的物品使用完后会自动将之前的手中物品再次返回到手上 + * + * @param itemStack 当前手上的物品(必须是能使用--需要持续使用的物品) + */ + public void memoryHandItemStack(ItemStack itemStack) { + this.getBrain().setMemory(InitEntities.CURRENT_ITEMSTACK.get(), itemStack); + } + + /** + * 将之前临时存在背包里的物品再次放在对应的手上 + */ + public void backCurrentHandItemStack() { + this.getBrain().getMemory(InitEntities.CURRENT_ITEMSTACK.get()).ifPresent(itemStack -> { + InteractionHand usedItemHand = this.getUsedItemHand(); + ItemStack itemInHand = this.getItemInHand(usedItemHand); + this.swapHandItem(usedItemHand, itemInHand, itemStack); + this.getBrain().eraseMemory(InitEntities.CURRENT_ITEMSTACK.get()); + }); + } + + private void swapHandItem(InteractionHand hand, ItemStack itemInHand, ItemStack backpackItem) { + ItemStack handItemCopy = itemInHand.copy(); + this.setItemInHand(hand, backpackItem.split(backpackItem.getCount())); + ItemHandlerHelper.insertItemStacked(this.getMaidInv(), handItemCopy, false); + } + @Override public ItemStack eat(Level level, ItemStack food, FoodProperties pFoodProperties) { ItemStack copy = food.copy(); @@ -1403,11 +1515,46 @@ public boolean canPathReach(Entity entity) { return path != null && path.canReach(); } + /** + * @deprecated 给 BehaviorUtils.isWithinAttackRange() 用的
+ * 但是目前为了实现超远视距打击,已经不用原版提供的这个了
+ * 故这里返回 true 还是 false 都不影响了 + */ @Override + @Deprecated public boolean canFireProjectileWeapon(ProjectileWeaponItem shootableItem) { return getTask() instanceof IRangedAttackTask; } + /** + * 因为原版默认的攻击识别范围是固定死的 16 格,但是一些远程武器我们希望获得超视距打击 + * 通过修改此处来获得更远的攻击距离 + */ + public boolean canSee(LivingEntity target) { + if (this.getTask() instanceof IRangedAttackTask rangedTask) { + return rangedTask.canSee(this, target); + } + return BehaviorUtils.canSee(this, target); + } + + /** + * 实体搜索范围 + */ + public AABB searchDimension() { + // 仅工作时,才搜索 task 的范围,避免性能压力 + if (this.getScheduleDetail() == Activity.WORK) { + return this.getTask().searchDimension(this); + } + return TaskManager.getIdleTask().searchDimension(this); + } + + /** + * 实体搜索范围的水平范围值 + */ + public float searchRadius() { + return this.getTask().searchRadius(this); + } + @Override @OnlyIn(Dist.CLIENT) public AABB getBoundingBoxForCulling() { @@ -1883,7 +2030,14 @@ public FavorabilityManager getFavorabilityManager() { @SuppressWarnings("all") public Ingredient getTamedItem() { - return getConfigIngredient(MaidConfig.MAID_TAMED_ITEM.get(), Items.CAKE); + // 可以被配置文件和 tag 同时修改 + Ingredient configIngredient = getConfigIngredient(MaidConfig.MAID_TAMED_ITEM.get(), Items.CAKE); + Ingredient tagIngredient = Ingredient.of(TagItem.MAID_TAMED_ITEM); + return merge(Lists.newArrayList(configIngredient, tagIngredient)); + } + + private Ingredient merge(Collection parts) { + return Ingredient.fromValues(parts.stream().flatMap(i -> Arrays.stream(i.getValues()))); } @SuppressWarnings("all") @@ -1906,4 +2060,148 @@ public ItemStack[] getHandItemsForAnimation() { return handItemsForAnimation; } + @Override + public Vec3 handleOnClimbable(Vec3 deltaMovement) { + Vec3 oriDelta = super.handleOnClimbable(deltaMovement); + // 主动爬行过程中严禁水平方向偏移,防止摔伤,y轴保持原样 + if (this.isCanClimb()) { + Vec3 vec3 = this.position(); + if (vec3.x() % 1 != 0.5D || vec3.z() % 1 != 0.5) { + BlockPos currentPosition = this.blockPosition().mutable(); + Vec3 centerPos = Vec3.atBottomCenterOf(currentPosition); + this.moveTo(centerPos.x, vec3.y(), centerPos.z); + } + oriDelta = new Vec3(0, oriDelta.y, 0); + } + return oriDelta; + } + + /** + * 爬梯子状态加上路径判断 + */ + @Override + public boolean onClimbable() { + boolean result = super.onClimbable(); + if (result) { + // 爬梯时,禁止旋转 + this.getLastClimbablePos().ifPresent(climbablePos -> { + BlockState blockState = this.level.getBlockState(climbablePos); + blockState.getOptionalValue(HorizontalDirectionalBlock.FACING).ifPresent(direction -> { + int yRot = direction.getOpposite().get2DDataValue() * 90; + this.setYRot(yRot); + this.setYHeadRot(yRot); + }); + }); + } + return result; + } + + /** + * 略微修改原版的方法,禁用了向上的动力源 + */ + @Override + public Vec3 handleRelativeFrictionAndCalculateMovement(Vec3 deltaMovement, float friction) { + this.moveRelative(this.getFrictionInfluencedSpeed(friction), deltaMovement); + this.setDeltaMovement(this.handleOnClimbable(this.getDeltaMovement())); + this.move(MoverType.SELF, this.getDeltaMovement()); + return this.getDeltaMovement(); + } + + public boolean isCanClimb() { + return canClimb; + } + + public void setCanClimb(boolean canClimb) { + this.canClimb = canClimb; + } + + public void setNavigation(PathNavigation navigation) { + this.navigation = navigation; + } + + public MaidSwimManager getSwimManager() { + return swimManager; + } + + @Override + @SuppressWarnings("deprecation") + public boolean isPushedByFluid() { + return !this.isSwimming(); + } + + @Override + public void travel(Vec3 travelVector) { + if (this.isControlledByLocalInstance() && this.isInWater() && this.getSwimManager().wantToSwim()) { + this.moveRelative(0.01F, travelVector); + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); + } else { + super.travel(travelVector); + } + } + + @Override + public EntityDimensions getDefaultDimensions(Pose pose) { + return pose == Pose.SWIMMING ? this.getSwimManager().getSwimmingDimensions() : super.getDefaultDimensions(pose); + } + + @Override + public void updateSwimming() { + this.getSwimManager().updateSwimming(); + } + + @Override + public boolean isVisuallySwimming() { + return this.isSwimming(); + } + + public boolean canUseShield() { + ItemStack offhandItem = this.getOffhandItem(); + return offhandItem.canPerformAction(ItemAbilities.SHIELD_BLOCK) && !this.getCooldowns().isOnCooldown(offhandItem.getItem()); + } + + @Override + public boolean isBlocking() { + // 调整原版的机制,女仆只要使用了盾牌,立马就能防御投掷物 + return this.isUsingItem() && !this.useItem.isEmpty() && this.useItem.canPerformAction(ItemAbilities.SHIELD_BLOCK); + } + + @Override + protected void blockUsingShield(LivingEntity attacker) { + super.blockUsingShield(attacker); + if (attacker.getMainHandItem().canDisableShield(this.useItem, this, attacker)) { + this.getCooldowns().addCooldown(this.getUseItem().getItem(), 100); + this.stopUsingItem(); + this.level.broadcastEntityEvent(this, EntityEvent.SHIELD_DISABLED); + } + } + + @Override + protected void hurtCurrentlyUsedShield(float damage) { + if (this.useItem.canPerformAction(ItemAbilities.SHIELD_BLOCK) && damage >= 3.0F) { + int damageAmount = 1 + Mth.floor(damage); + InteractionHand interactionhand = this.getUsedItemHand(); + if (this.level instanceof ServerLevel serverlevel) { + this.useItem.hurtAndBreak(damageAmount, serverlevel, this, item -> { + this.onEquippedItemBroken(item, getSlotForHand(interactionhand)); + this.stopUsingItem(); + }); + } + if (this.useItem.isEmpty()) { + if (interactionhand == InteractionHand.MAIN_HAND) { + this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY); + } else { + this.setItemSlot(EquipmentSlot.OFFHAND, ItemStack.EMPTY); + } + this.useItem = ItemStack.EMPTY; + this.playSound(SoundEvents.SHIELD_BREAK, 0.8F, 0.8F + this.level.random.nextFloat() * 0.4F); + } else { + this.playSound(SoundEvents.SHIELD_BLOCK, 1.0F, 1.0F); + } + } + } + + public ItemCooldowns getCooldowns() { + return cooldowns; + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidConfigManager.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidConfigManager.java index 13c870f43..05cc71a20 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidConfigManager.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidConfigManager.java @@ -21,6 +21,7 @@ public class MaidConfigManager { private static final String PICKUP_TYPE_TAG = "PickupType"; private static final String OPEN_DOOR_TAG = "OpenDoor"; private static final String OPEN_FENCE_GATE_TAG = "OpenFenceGate"; + private static final String ACTIVE_CLIMBING_TAG = "ActiveClimbing"; private final SynchedEntityData entityData; @@ -40,6 +41,7 @@ void defineSynchedData(SynchedEntityData.Builder builder) { builder.define(PICKUP_TYPE, PickType.ALL.ordinal()); builder.define(OPEN_DOOR, true); builder.define(OPEN_FENCE_GATE, true); + builder.define(ACTIVE_CLIMBING, true); } void addAdditionalSaveData(CompoundTag compound) { @@ -55,6 +57,7 @@ void addAdditionalSaveData(CompoundTag compound) { maidSubConfig.putInt(PICKUP_TYPE_TAG, getPickupType().ordinal()); maidSubConfig.putBoolean(OPEN_DOOR_TAG, isOpenDoor()); maidSubConfig.putBoolean(OPEN_FENCE_GATE_TAG, isOpenFenceGate()); + maidSubConfig.putBoolean(ACTIVE_CLIMBING_TAG, isActiveClimbing()); compound.put(MAID_SUB_CONFIG_TAG, maidSubConfig); } @@ -91,6 +94,9 @@ void readAdditionalSaveData(CompoundTag compound) { if (maidSubConfig.contains(OPEN_FENCE_GATE_TAG)) { setOpenFenceGate(maidSubConfig.getBoolean(OPEN_FENCE_GATE_TAG)); } + if (maidSubConfig.contains(ACTIVE_CLIMBING_TAG)) { + setActiveClimbing(maidSubConfig.getBoolean(ACTIVE_CLIMBING_TAG)); + } } } @@ -126,7 +132,8 @@ public SyncNetwork getSyncNetwork() { this.getSoundFreq(), this.getPickupType(), this.isOpenDoor(), - this.isOpenFenceGate() + this.isOpenFenceGate(), + this.isActiveClimbing() ); } @@ -187,6 +194,14 @@ public void setOpenFenceGate(boolean openFenceGate) { this.entityData.set(OPEN_FENCE_GATE, openFenceGate); } + public boolean isActiveClimbing() { + return this.entityData.get(ACTIVE_CLIMBING); + } + + public void setActiveClimbing(boolean activeClimbing) { + this.entityData.set(ACTIVE_CLIMBING, activeClimbing); + } + public static final class SyncNetwork { private boolean showBackpack; private boolean showBackItem; @@ -195,9 +210,10 @@ public static final class SyncNetwork { private PickType pickType; private boolean openDoor; private boolean openFenceGate; + private boolean activeClimbing; public SyncNetwork(boolean showBackpack, boolean showBackItem, boolean showChatBubble, float soundFreq, - PickType pickType, boolean openDoor, boolean openFenceGate) { + PickType pickType, boolean openDoor, boolean openFenceGate, boolean activeClimbing) { this.showBackpack = showBackpack; this.showBackItem = showBackItem; this.showChatBubble = showChatBubble; @@ -205,6 +221,7 @@ public SyncNetwork(boolean showBackpack, boolean showBackItem, boolean showChatB this.pickType = pickType; this.openDoor = openDoor; this.openFenceGate = openFenceGate; + this.activeClimbing = activeClimbing; } public static void encode(SyncNetwork message, FriendlyByteBuf buf) { @@ -215,6 +232,7 @@ public static void encode(SyncNetwork message, FriendlyByteBuf buf) { buf.writeEnum(message.pickType); buf.writeBoolean(message.openDoor); buf.writeBoolean(message.openFenceGate); + buf.writeBoolean(message.activeClimbing); } public static SyncNetwork decode(FriendlyByteBuf buf) { @@ -225,7 +243,8 @@ public static SyncNetwork decode(FriendlyByteBuf buf) { PickType pickType = buf.readEnum(PickType.class); boolean openDoor = buf.readBoolean(); boolean openFenceGate = buf.readBoolean(); - return new SyncNetwork(showBackpack, showBackItem, showChatBubble, soundFreq, pickType, openDoor, openFenceGate); + boolean activeClimbing = buf.readBoolean(); + return new SyncNetwork(showBackpack, showBackItem, showChatBubble, soundFreq, pickType, openDoor, openFenceGate, activeClimbing); } public static void handle(SyncNetwork message, EntityMaid maid) { @@ -237,6 +256,7 @@ public static void handle(SyncNetwork message, EntityMaid maid) { configManager.setPickupType(message.pickType); configManager.setOpenDoor(message.openDoor); configManager.setOpenFenceGate(message.openFenceGate); + configManager.setActiveClimbing(message.activeClimbing); } public boolean showBackpack() { @@ -267,6 +287,10 @@ public boolean openFenceGate() { return openFenceGate; } + public boolean activeClimbing() { + return activeClimbing; + } + public void setShowBackpack(boolean showBackpack) { this.showBackpack = showBackpack; } @@ -294,5 +318,9 @@ public void setOpenDoor(boolean openDoor) { public void setOpenFenceGate(boolean openFenceGate) { this.openFenceGate = openFenceGate; } + + public void setActiveClimbing(boolean activeClimbing) { + this.activeClimbing = activeClimbing; + } } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidSwimManager.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidSwimManager.java new file mode 100644 index 000000000..68ee518b1 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/passive/MaidSwimManager.java @@ -0,0 +1,93 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.passive; + +import com.github.tartaricacid.touhoulittlemaid.entity.ai.navigation.MaidPathNavigation; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.navigation.AmphibiousPathNavigation; +import net.minecraft.world.level.pathfinder.PathType; + +public class MaidSwimManager { + /** + * 游泳碰撞箱 + */ + private static final EntityDimensions SWIMMING_DIMENSIONS = EntityDimensions.scalable(0.6F, 0.6F); + private final MaidPathNavigation groundNavigation; + private final AmphibiousPathNavigation waterNavigation; + private final EntityMaid maid; + /** + * 正在食用可提供水下呼吸的食物标志位 + */ + private boolean isEatBreatheItem = false; + /** + * 主动游泳标志位 + */ + private boolean wantToSwim = false; + + public MaidSwimManager(EntityMaid maid) { + this.maid = maid; + this.groundNavigation = new MaidPathNavigation(maid, maid.level); + this.waterNavigation = new AmphibiousPathNavigation(maid, maid.level); + maid.setPathfindingMalus(PathType.WATER, 0.0F); + } + + /** + * 重置状态,从而控制饮用药水 + */ + public void resetEatBreatheItem() { + if (this.isEatBreatheItem) { + this.isEatBreatheItem = false; + } + } + + /** + * 依据游泳状态,切换成游泳的寻路 + */ + public void updateSwimming() { + if (!maid.level.isClientSide) { + if (maid.isEffectiveAi() && maid.isInWater()) { + maid.setNavigation(this.waterNavigation); + } else { + maid.setNavigation(this.groundNavigation); + this.setWantToSwim(false); + } + + this.updatePose(); + } + } + + /** + * 更新游泳姿势同时更新碰撞箱 + */ + private void updatePose() { + if (this.wantToSwim() && !maid.onGround()) { + maid.setSwimming(true); + maid.setPose(Pose.SWIMMING); + } else { + maid.setSwimming(false); + // 也许有更好的方式? + if (!maid.isSleeping()) { + maid.setPose(Pose.STANDING); + } + } + } + + public void setWantToSwim(boolean pSearchingForLand) { + this.wantToSwim = pSearchingForLand; + } + + public boolean wantToSwim() { + return this.wantToSwim; + } + + public boolean isEatBreatheItem() { + return isEatBreatheItem; + } + + public void setEatBreatheItem(boolean eatBreatheItem) { + isEatBreatheItem = eatBreatheItem; + } + + public EntityDimensions getSwimmingDimensions() { + return SWIMMING_DIMENSIONS; + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/projectile/EntityDanmaku.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/projectile/EntityDanmaku.java index 30b6c5761..cebed1c85 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/projectile/EntityDanmaku.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/projectile/EntityDanmaku.java @@ -77,11 +77,11 @@ protected void onHitEntity(EntityHitResult result) { Entity thrower = getOwner(); Entity hit = result.getEntity(); if (thrower instanceof TamableAnimal tameable) { - if (hit instanceof TamableAnimal && hasSameOwner(tameable, (TamableAnimal) hit)) { + if (hit instanceof TamableAnimal hitTameable && hasSameOwner(tameable, hitTameable)) { this.discard(); return; } - if (hit instanceof LivingEntity && tameable.isOwnedBy((LivingEntity) hit)) { + if (hit instanceof LivingEntity livingEntity && tameable.isAlliedTo(livingEntity)) { this.discard(); return; } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskAttack.java index fbf69627b..3172e0b3b 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskAttack.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskAttack.java @@ -2,6 +2,7 @@ import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; import com.github.tartaricacid.touhoulittlemaid.api.task.IAttackTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidUseShieldTask; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityExtinguishingAgent; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitItems; @@ -51,12 +52,14 @@ public List>> createBrainTasks (target) -> !hasAssaultWeapon(maid) || farAway(target, maid)); BehaviorControl moveToTargetTask = SetWalkTargetFromAttackTargetIfTargetOutOfReach.create(0.6f); BehaviorControl attackTargetTask = MeleeAttack.create(20); + MaidUseShieldTask maidUseShieldTask = new MaidUseShieldTask(); return Lists.newArrayList( Pair.of(5, supplementedTask), Pair.of(5, findTargetTask), Pair.of(5, moveToTargetTask), - Pair.of(5, attackTargetTask) + Pair.of(5, attackTargetTask), + Pair.of(5, maidUseShieldTask) ); } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskBowAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskBowAttack.java index 86e94f6fa..4adacd993 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskBowAttack.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskBowAttack.java @@ -1,9 +1,10 @@ package com.github.tartaricacid.touhoulittlemaid.entity.task; import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; -import com.github.tartaricacid.touhoulittlemaid.api.task.IAttackTask; import com.github.tartaricacid.touhoulittlemaid.api.task.IRangedAttackTask; +import com.github.tartaricacid.touhoulittlemaid.config.subconfig.MaidConfig; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidAttackStrafingTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidRangedWalkToTarget; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidShootTargetTask; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; @@ -15,18 +16,21 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.behavior.*; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.StartAttacking; +import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.BowItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.items.wrapper.CombinedInvWrapper; import javax.annotation.Nullable; @@ -37,7 +41,6 @@ public class TaskBowAttack implements IRangedAttackTask { public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "ranged_attack"); - private static final int MAX_STOP_ATTACK_DISTANCE = 16; @Override public ResourceLocation getUid() { @@ -57,9 +60,9 @@ public SoundEvent getAmbientSound(EntityMaid maid) { @Override public List>> createBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(e -> hasBow(e) && hasArrow(e), IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(e -> hasBow(e) && hasArrow(e), IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasBow(maid) || !hasArrow(maid) || farAway(target, maid)); - BehaviorControl moveToTargetTask = SetWalkTargetFromAttackTargetIfTargetOutOfReach.create(0.6f); + BehaviorControl moveToTargetTask = MaidRangedWalkToTarget.create(0.6f); BehaviorControl maidAttackStrafingTask = new MaidAttackStrafingTask(); BehaviorControl shootTargetTask = new MaidShootTargetTask(2); @@ -74,7 +77,7 @@ public List>> createBrainTasks @Override public List>> createRideBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(e -> hasBow(e) && hasArrow(e), IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(e -> hasBow(e) && hasArrow(e), IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasBow(maid) || !hasArrow(maid) || farAway(target, maid)); BehaviorControl shootTargetTask = new MaidShootTargetTask(2); @@ -93,10 +96,15 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d ItemStack mainHandItem = shooter.getMainHandItem(); if (mainHandItem.getItem() instanceof BowItem) { double x = target.getX() - shooter.getX(); - double y = target.getBoundingBox().minY + target.getBbHeight() / 3.0F - entityArrow.position().y; + double y = target.getEyeY() - shooter.getEyeY(); double z = target.getZ() - shooter.getZ(); - double pitch = Math.sqrt(x * x + z * z) * 0.15D; - entityArrow.shoot(x, y + pitch, z, 1.6F, 1); + // 依据距离调整箭速和不准确度 + float distance = shooter.distanceTo(target); + float velocity = Mth.clamp(distance / 10f, 1.6f, 3.2f); + float inaccuracy = 1 - Mth.clamp(distance / 100f, 0, 0.9f); + // 射出的箭忽略重力,从而能让女仆百发百中 + entityArrow.setNoGravity(true); + entityArrow.shoot(x, y, z, velocity, inaccuracy); mainHandItem.hurtAndBreak(1, shooter, EquipmentSlot.MAINHAND); shooter.playSound(SoundEvents.SKELETON_SHOOT, 1.0F, 1.0F / (shooter.getRandom().nextFloat() * 0.4F + 0.8F)); shooter.level.addFreshEntity(entityArrow); @@ -104,6 +112,29 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d } } + @Override + public boolean canSee(EntityMaid maid, LivingEntity target) { + return IRangedAttackTask.targetConditionsTest(maid, target, MaidConfig.BOW_RANGE); + } + + @Override + public AABB searchDimension(EntityMaid maid) { + if (hasBow(maid)) { + float searchRange = this.searchRadius(maid); + if (maid.hasRestriction()) { + return new AABB(maid.getRestrictCenter()).inflate(searchRange); + } else { + return maid.getBoundingBox().inflate(searchRange); + } + } + return IRangedAttackTask.super.searchDimension(maid); + } + + @Override + public float searchRadius(EntityMaid maid) { + return MaidConfig.BOW_RANGE.get(); + } + @Override public List>> getConditionDescription(EntityMaid maid) { return Lists.newArrayList(Pair.of("has_bow", this::hasBow), Pair.of("has_arrow", this::hasArrow)); @@ -163,6 +194,6 @@ private AbstractArrow getArrow(EntityMaid maid, float chargeTime) { } private boolean farAway(LivingEntity target, EntityMaid maid) { - return maid.distanceTo(target) > MAX_STOP_ATTACK_DISTANCE; + return maid.distanceTo(target) > this.searchRadius(maid); } } \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCocoa.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCocoa.java index 415d7bd6b..62afb302d 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCocoa.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCocoa.java @@ -42,6 +42,7 @@ protected boolean checkPathReach(EntityMaid maid, BlockPos pos) { for (int x = -1; x <= 1; x++) { for (int y = 0; y <= 1; y++) { for (int z = -1; z <= 1; z++) { + // FIXME: 2025-01-20 有性能问题,需要优化 if (maid.canPathReach(pos.offset(x, y, z))) { return true; } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCrossBowAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCrossBowAttack.java index 2e7730ae0..66363e0e6 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCrossBowAttack.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskCrossBowAttack.java @@ -1,9 +1,11 @@ package com.github.tartaricacid.touhoulittlemaid.entity.task; import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; -import com.github.tartaricacid.touhoulittlemaid.api.task.IAttackTask; import com.github.tartaricacid.touhoulittlemaid.api.task.IRangedAttackTask; +import com.github.tartaricacid.touhoulittlemaid.config.subconfig.MaidConfig; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidAttackStrafingTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidCrossbowAttack; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidRangedWalkToTarget; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; import com.github.tartaricacid.touhoulittlemaid.util.ItemsUtil; @@ -13,12 +15,14 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.ai.behavior.*; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.StartAttacking; +import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid; import net.minecraft.world.item.CrossbowItem; import net.minecraft.world.item.FireworkRocketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.phys.AABB; import net.neoforged.neoforge.items.wrapper.CombinedInvWrapper; import org.jetbrains.annotations.Nullable; @@ -27,7 +31,6 @@ public class TaskCrossBowAttack implements IRangedAttackTask { public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "crossbow_attack"); - private static final int MAX_STOP_ATTACK_DISTANCE = 16; @Override public ResourceLocation getUid() { @@ -47,11 +50,11 @@ public SoundEvent getAmbientSound(EntityMaid maid) { @Override public List>> createBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(entityMaid -> hasCrossBow(entityMaid) && hasAmmunition(entityMaid), IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(entityMaid -> hasCrossBow(entityMaid) && hasAmmunition(entityMaid), IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasCrossBow(maid) || !hasAmmunition(maid) || farAway(target, maid)); - BehaviorControl moveToTargetTask = SetWalkTargetFromAttackTargetIfTargetOutOfReach.create(0.6f); + BehaviorControl moveToTargetTask = MaidRangedWalkToTarget.create(0.6f); BehaviorControl maidAttackStrafingTask = new MaidAttackStrafingTask(); - BehaviorControl shootTargetTask = new CrossbowAttack<>(); + BehaviorControl shootTargetTask = new MaidCrossbowAttack(); return Lists.newArrayList( Pair.of(5, supplementedTask), @@ -64,9 +67,9 @@ public List>> createBrainTasks @Override public List>> createRideBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(entityMaid -> hasCrossBow(entityMaid) && hasAmmunition(entityMaid), IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(entityMaid -> hasCrossBow(entityMaid) && hasAmmunition(entityMaid), IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasCrossBow(maid) || !hasAmmunition(maid) || farAway(target, maid)); - BehaviorControl shootTargetTask = new CrossbowAttack<>(); + BehaviorControl shootTargetTask = new MaidCrossbowAttack(); return Lists.newArrayList( Pair.of(5, supplementedTask), @@ -75,6 +78,29 @@ public List>> createRideBrainT ); } + @Override + public boolean canSee(EntityMaid maid, LivingEntity target) { + return IRangedAttackTask.targetConditionsTest(maid, target, MaidConfig.CROSS_BOW_RANGE); + } + + @Override + public AABB searchDimension(EntityMaid maid) { + if (hasCrossBow(maid)) { + float searchRange = this.searchRadius(maid); + if (maid.hasRestriction()) { + return new AABB(maid.getRestrictCenter()).inflate(searchRange); + } else { + return maid.getBoundingBox().inflate(searchRange); + } + } + return IRangedAttackTask.super.searchDimension(maid); + } + + @Override + public float searchRadius(EntityMaid maid) { + return MaidConfig.CROSS_BOW_RANGE.get(); + } + @Override public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) { shooter.performCrossbowAttack(shooter, 1.6F); @@ -108,6 +134,6 @@ private int findArrow(EntityMaid maid) { } private boolean farAway(LivingEntity target, EntityMaid maid) { - return maid.distanceTo(target) > MAX_STOP_ATTACK_DISTANCE; + return maid.distanceTo(target) > this.searchRadius(maid); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskDanmakuAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskDanmakuAttack.java index 5b1462b6e..daf825869 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskDanmakuAttack.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskDanmakuAttack.java @@ -1,10 +1,11 @@ package com.github.tartaricacid.touhoulittlemaid.entity.task; import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; -import com.github.tartaricacid.touhoulittlemaid.api.task.IAttackTask; import com.github.tartaricacid.touhoulittlemaid.api.task.IRangedAttackTask; +import com.github.tartaricacid.touhoulittlemaid.config.subconfig.MaidConfig; import com.github.tartaricacid.touhoulittlemaid.datagen.EnchantmentKeys; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidAttackStrafingTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidRangedWalkToTarget; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidShootTargetTask; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.github.tartaricacid.touhoulittlemaid.entity.projectile.DanmakuShoot; @@ -17,19 +18,19 @@ import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.behavior.BehaviorControl; -import net.minecraft.world.entity.ai.behavior.SetWalkTargetFromAttackTargetIfTargetOutOfReach; import net.minecraft.world.entity.ai.behavior.StartAttacking; import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; import javax.annotation.Nullable; import java.util.Collections; @@ -40,7 +41,6 @@ public class TaskDanmakuAttack implements IRangedAttackTask { public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "danmaku_attack"); - private static final int MAX_STOP_ATTACK_DISTANCE = 16; @Override public ResourceLocation getUid() { @@ -60,9 +60,9 @@ public SoundEvent getAmbientSound(EntityMaid maid) { @Override public List>> createBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(this::hasGohei, IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(this::hasGohei, IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasGohei(maid) || farAway(target, maid)); - BehaviorControl moveToTargetTask = SetWalkTargetFromAttackTargetIfTargetOutOfReach.create(0.6f); + BehaviorControl moveToTargetTask = MaidRangedWalkToTarget.create(0.6f); BehaviorControl maidAttackStrafingTask = new MaidAttackStrafingTask(); BehaviorControl shootTargetTask = new MaidShootTargetTask(2); @@ -77,7 +77,7 @@ public List>> createBrainTasks @Override public List>> createRideBrainTasks(EntityMaid maid) { - BehaviorControl supplementedTask = StartAttacking.create(this::hasGohei, IAttackTask::findFirstValidAttackTarget); + BehaviorControl supplementedTask = StartAttacking.create(this::hasGohei, IRangedAttackTask::findFirstValidAttackTarget); BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasGohei(maid) || farAway(target, maid)); BehaviorControl shootTargetTask = new MaidShootTargetTask(2); @@ -88,12 +88,35 @@ public List>> createRideBrainT ); } + @Override + public boolean canSee(EntityMaid maid, LivingEntity target) { + return IRangedAttackTask.targetConditionsTest(maid, target, MaidConfig.DANMAKU_RANGE); + } + + @Override + public AABB searchDimension(EntityMaid maid) { + if (hasGohei(maid)) { + float searchRange = this.searchRadius(maid); + if (maid.hasRestriction()) { + return new AABB(maid.getRestrictCenter()).inflate(searchRange); + } else { + return maid.getBoundingBox().inflate(searchRange); + } + } + return IRangedAttackTask.super.searchDimension(maid); + } + + @Override + public float searchRadius(EntityMaid maid) { + return MaidConfig.DANMAKU_RANGE.get(); + } + @Override public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) { shooter.getBrain().getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).ifPresent(livingEntities -> { ItemStack mainHandItem = shooter.getMainHandItem(); if (ItemHakureiGohei.isGohei(mainHandItem)) { - long entityCount = livingEntities.stream().filter(shooter::canAttack).count(); + long entityCount = livingEntities.stream().filter(test -> enemyEntityTest(shooter, target, test)).count(); Level level = shooter.level(); // 分为三档 // 1 自机狙 @@ -114,13 +137,18 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d float speed = (0.3f * (distanceFactor + 1)) * (speedyLevel + 1); boolean hurtEnderman = endersEnderLevel > 0; + // 依据距离调整弹幕速度和不准确度 + float distance = shooter.distanceTo(target); + speed = speed + Mth.clamp(distance / 40f - 0.4f, 0, 2.4f); + float inaccuracy = 1 - Mth.clamp(distance / 100f, 0, 0.8f); + if (entityCount <= 1) { if (multiShotLevel > 0) { DanmakuShoot.create().setWorld(level).setThrower(shooter) .setTarget(target).setRandomColor().setRandomType() .setDamage(attackValue * (distanceFactor + 1.2f)).setGravity(0) .setVelocity(speed).setHurtEnderman(hurtEnderman) - .setInaccuracy(1.0f).setFanNum(3).setYawTotal(Math.PI / 12) + .setInaccuracy(inaccuracy).setFanNum(3).setYawTotal(Math.PI / 12) .setImpedingLevel(impedingLevel) .fanShapedShot(); } else { @@ -128,7 +156,7 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d .setTarget(target).setRandomColor().setRandomType() .setDamage(attackValue * (distanceFactor + 1)).setGravity(0) .setVelocity(speed).setHurtEnderman(hurtEnderman) - .setInaccuracy(0.2f).setImpedingLevel(impedingLevel) + .setInaccuracy(inaccuracy / 5).setImpedingLevel(impedingLevel) .aimedShot(); } } else if (entityCount <= 5) { @@ -136,7 +164,7 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d .setTarget(target).setRandomColor().setRandomType() .setDamage(attackValue * (distanceFactor + 1.2f)).setGravity(0) .setVelocity(speed).setHurtEnderman(hurtEnderman) - .setInaccuracy(0.2f).setFanNum(8).setYawTotal(Math.PI / 3) + .setInaccuracy(inaccuracy / 5).setFanNum(8).setYawTotal(Math.PI / 3) .setImpedingLevel(impedingLevel) .fanShapedShot(); } else { @@ -144,7 +172,7 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d .setTarget(target).setRandomColor().setRandomType() .setDamage(attackValue * (distanceFactor + 1.5f)).setGravity(0) .setVelocity(speed).setHurtEnderman(hurtEnderman) - .setInaccuracy(0.2f).setFanNum(32).setYawTotal(2 * Math.PI / 3) + .setInaccuracy(inaccuracy / 5).setFanNum(32).setYawTotal(2 * Math.PI / 3) .setImpedingLevel(impedingLevel) .fanShapedShot(); } @@ -153,6 +181,12 @@ public void performRangedAttack(EntityMaid shooter, LivingEntity target, float d }); } + private boolean enemyEntityTest(EntityMaid shooter, LivingEntity target, LivingEntity test) { + boolean canAttack = shooter.canAttack(test); + boolean sameType = target.getType().equals(test.getType()); + return canAttack && sameType && shooter.canSee(test); + } + @Override public List>> getConditionDescription(EntityMaid maid) { return Collections.singletonList(Pair.of("has_gohei", this::hasGohei)); @@ -163,6 +197,6 @@ private boolean hasGohei(EntityMaid maid) { } private boolean farAway(LivingEntity target, EntityMaid maid) { - return maid.distanceTo(target) > MAX_STOP_ATTACK_DISTANCE; + return maid.distanceTo(target) > this.searchRadius(maid); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskIdle.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskIdle.java index 4efaeaba2..41ed45966 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskIdle.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskIdle.java @@ -26,7 +26,6 @@ public class TaskIdle implements IMaidTask { public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "idle"); - private static final float LOW_TEMPERATURE = 0.15F; @Override public ResourceLocation getUid() { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskManager.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskManager.java index 66d254951..98ed8a650 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskManager.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskManager.java @@ -31,6 +31,8 @@ public static void init() { manager.add(new TaskBowAttack()); manager.add(new TaskCrossBowAttack()); manager.add(new TaskDanmakuAttack()); + manager.add(new TaskTridentAttack()); + manager.add(new TaskNormalFarm()); manager.add(new TaskSugarCane()); manager.add(new TaskMelon()); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskTridentAttack.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskTridentAttack.java new file mode 100644 index 000000000..1b4a46bfb --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/task/TaskTridentAttack.java @@ -0,0 +1,156 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.task; + +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; +import com.github.tartaricacid.touhoulittlemaid.api.task.IRangedAttackTask; +import com.github.tartaricacid.touhoulittlemaid.config.subconfig.MaidConfig; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidAttackTridentTask; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidRangedWalkToTarget; +import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.task.MaidTridentTargetTask; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; +import com.github.tartaricacid.touhoulittlemaid.util.SoundUtil; +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.StartAttacking; +import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.ThrownTrident; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.TridentItem; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.phys.AABB; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.function.Predicate; + +import static com.github.tartaricacid.touhoulittlemaid.datagen.EnchantmentKeys.getEnchantmentHolder; + +public class TaskTridentAttack implements IRangedAttackTask { + public static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(TouhouLittleMaid.MOD_ID, "trident_attack"); + + @Override + public ResourceLocation getUid() { + return UID; + } + + @Override + public ItemStack getIcon() { + return Items.TRIDENT.getDefaultInstance(); + } + + @Nullable + @Override + public SoundEvent getAmbientSound(EntityMaid maid) { + return SoundUtil.attackSound(maid, InitSounds.MAID_RANGE_ATTACK.get(), 0.5f); + } + + @Override + public List>> createBrainTasks(EntityMaid maid) { + BehaviorControl supplementedTask = StartAttacking.create(this::hasTrident, IRangedAttackTask::findFirstValidAttackTarget); + BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasTrident(maid) || farAway(target, maid)); + BehaviorControl moveToTargetTask = MaidRangedWalkToTarget.create(0.6f); + BehaviorControl maidAttackStrafingTask = new MaidAttackTridentTask(); + BehaviorControl shootTargetTask = new MaidTridentTargetTask(); + + return Lists.newArrayList( + Pair.of(5, supplementedTask), + Pair.of(5, findTargetTask), + Pair.of(5, moveToTargetTask), + Pair.of(5, maidAttackStrafingTask), + Pair.of(5, shootTargetTask) + ); + } + + @Override + public List>> createRideBrainTasks(EntityMaid maid) { + BehaviorControl supplementedTask = StartAttacking.create(this::hasTrident, IRangedAttackTask::findFirstValidAttackTarget); + BehaviorControl findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasTrident(maid) || farAway(target, maid)); + BehaviorControl shootTargetTask = new MaidTridentTargetTask(); + + return Lists.newArrayList( + Pair.of(5, supplementedTask), + Pair.of(5, findTargetTask), + Pair.of(5, shootTargetTask) + ); + } + + @Override + public boolean canSee(EntityMaid maid, LivingEntity target) { + return IRangedAttackTask.targetConditionsTest(maid, target, MaidConfig.TRIDENT_RANGE); + } + + @Override + public AABB searchDimension(EntityMaid maid) { + if (hasTrident(maid)) { + float searchRange = this.searchRadius(maid); + if (maid.hasRestriction()) { + return new AABB(maid.getRestrictCenter()).inflate(searchRange); + } else { + return maid.getBoundingBox().inflate(searchRange); + } + } + return IRangedAttackTask.super.searchDimension(maid); + } + + @Override + public float searchRadius(EntityMaid maid) { + return MaidConfig.TRIDENT_RANGE.get(); + } + + @Override + public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) { + ItemStack tridentItem = shooter.getMainHandItem().copy(); + + // 去除忠诚附魔,不然三叉戟返回来是发现主人不是玩家,就翻脸不认人了不给捡了 + Holder loyalty = getEnchantmentHolder(shooter.level.registryAccess(), Enchantments.LOYALTY); + if (tridentItem.getEnchantmentLevel(loyalty) > 0) { + EnchantmentHelper.updateEnchantments(tridentItem, mutable -> mutable.set(loyalty, 0)); + } + + // TODO:伤害和好感度挂钩 + ThrownTrident thrownTrident = new ThrownTrident(shooter.level, shooter, tridentItem); + double x = target.getX() - shooter.getX(); + double y = target.getEyeY() - shooter.getEyeY(); + double z = target.getZ() - shooter.getZ(); + + // 依据距离调整三叉戟速度和不准确度 + float distance = shooter.distanceTo(target); + float velocity = Mth.clamp(distance / 10f, 1.6f, 3.2f); + float inaccuracy = 1 - Mth.clamp(distance / 100f, 0, 0.9f); + + // 射出的三叉戟忽略重力,从而能让女仆百发百中 + thrownTrident.setNoGravity(true); + thrownTrident.shoot(x, y, z, velocity, inaccuracy); + // 不允许任何人捡起 + thrownTrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + + shooter.getMainHandItem().hurtAndBreak(1, shooter, EquipmentSlot.MAINHAND); + shooter.level.addFreshEntity(thrownTrident); + shooter.playSound(SoundEvents.TRIDENT_THROW.value(), 1.0F, 1.0F); + } + + @Override + public List>> getConditionDescription(EntityMaid maid) { + return Lists.newArrayList(Pair.of("has_trident", this::hasTrident)); + } + + private boolean farAway(LivingEntity target, EntityMaid maid) { + return maid.distanceTo(target) > this.searchRadius(maid); + } + + private boolean hasTrident(EntityMaid maid) { + return maid.getMainHandItem().getItem() instanceof TridentItem; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/EntityHurtEvent.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/EntityHurtEvent.java index a6419ca74..389d3db85 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/EntityHurtEvent.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/EntityHurtEvent.java @@ -18,15 +18,17 @@ public final class EntityHurtEvent { public static void onArrowImpact(ProjectileImpactEvent event) { Entity attacker = event.getProjectile().getOwner(); HitResult ray = event.getRayTraceResult(); - if (attacker instanceof TamableAnimal thrower && ray instanceof EntityHitResult) { - Entity victim = ((EntityHitResult) ray).getEntity(); + if (attacker instanceof TamableAnimal thrower && ray instanceof EntityHitResult hitResult) { + Entity victim = hitResult.getEntity(); if (victim instanceof TamableAnimal tameable) { + // 同一主人,那么免伤 if (tameable.getOwnerUUID() != null && tameable.getOwnerUUID().equals(thrower.getOwnerUUID())) { event.setCanceled(true); } } - if (victim instanceof LivingEntity) { - if (thrower.isOwnedBy((LivingEntity) victim)) { + if (victim instanceof LivingEntity livingVictim) { + // 主人和同 Team 玩家免伤 + if (thrower.isAlliedTo(livingVictim)) { event.setCanceled(true); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/maid/PotionItemUse.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/maid/PotionItemUse.java new file mode 100644 index 000000000..d1d0c115c --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/event/maid/PotionItemUse.java @@ -0,0 +1,35 @@ +package com.github.tartaricacid.touhoulittlemaid.event.maid; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.PotionItem; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingEntityUseItemEvent; +import net.neoforged.neoforge.items.ItemHandlerHelper; +import net.neoforged.neoforge.items.wrapper.CombinedInvWrapper; + +@EventBusSubscriber +public class PotionItemUse { + @SubscribeEvent + public static void onMaidPotionItemUse(LivingEntityUseItemEvent.Finish event) { + if (event.getEntity() instanceof EntityMaid maid && event.getItem().getItem() instanceof PotionItem) { + ItemStack potionStack = event.getItem(); + // 原版药水非玩家使用后会原样返回,我们需要正确扣掉内容 + potionStack.shrink(1); + // 说明喝的是堆叠的药水,需要主动给女仆加瓶子 + if (!potionStack.isEmpty()) { + CombinedInvWrapper inv = maid.getAvailableInv(false); + ItemStack leftStack = ItemHandlerHelper.insertItemStacked(inv, new ItemStack(Items.GLASS_BOTTLE), false); + // 如果背包满了,那就生成掉落物,预防一些改动物品堆叠的模组 + if (!leftStack.isEmpty()) { + maid.spawnAtLocation(leftStack); + } + event.setResultStack(potionStack); + } else { + event.setResultStack(new ItemStack(Items.GLASS_BOTTLE)); + } + } + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/geckolib3/geo/animated/AnimatedGeoModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/geckolib3/geo/animated/AnimatedGeoModel.java index 6143b6a95..040171db9 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/geckolib3/geo/animated/AnimatedGeoModel.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/geckolib3/geo/animated/AnimatedGeoModel.java @@ -28,6 +28,12 @@ public class AnimatedGeoModel { @Nullable private final AnimatedGeoBone head; + @Nullable + private final AnimatedGeoBone hat; + @Nullable + private final AnimatedGeoBone leftArm; + @Nullable + private final AnimatedGeoBone rightArm; public AnimatedGeoModel(GeoModel model) { geoModel = model; @@ -46,6 +52,10 @@ public AnimatedGeoModel(GeoModel model) { this.headBones = getLocatorHierarchy("Head"); this.head = bones.get("Head"); + // fixme: 有 hat 部分吗? + this.hat = bones.get("Hat"); + this.leftArm = bones.get("LeftArm"); + this.rightArm = bones.get("RightArm"); } private List getLocatorHierarchy(String locatorName) { @@ -116,4 +126,19 @@ public List headBones() { public AnimatedGeoBone head() { return head; } + + @Nullable + public AnimatedGeoBone hat() { + return hat; + } + + @Nullable + public AnimatedGeoBone leftArm() { + return leftArm; + } + + @Nullable + public AnimatedGeoBone rightArm() { + return rightArm; + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java index 062e9257e..78f6e802c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java @@ -25,6 +25,7 @@ import net.minecraft.world.entity.schedule.Activity; import net.minecraft.world.entity.schedule.Schedule; import net.minecraft.world.entity.schedule.ScheduleBuilder; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.levelgen.Heightmap; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -66,6 +67,7 @@ public final class InitEntities { public static Supplier>> VISIBLE_PICKUP_ENTITIES = MEMORY_MODULE_TYPES.register("visible_pickup_entities", () -> new MemoryModuleType<>(Optional.empty())); public static Supplier> TARGET_POS = MEMORY_MODULE_TYPES.register("target_pos", () -> new MemoryModuleType<>(Optional.empty())); + public static Supplier> CURRENT_ITEMSTACK = MEMORY_MODULE_TYPES.register("current_itemstack", () -> new MemoryModuleType<>(Optional.empty())); public static Supplier> MAID_NEAREST_LIVING_ENTITY_SENSOR = SENSOR_TYPES.register("maid_nearest_living_entity", () -> new SensorType<>(MaidNearestLivingEntitySensor::new)); public static Supplier> MAID_HOSTILES_SENSOR = SENSOR_TYPES.register("maid_hostiles", () -> new SensorType<>(MaidHostilesSensor::new)); public static Supplier> MAID_PICKUP_ENTITIES_SENSOR = SENSOR_TYPES.register("maid_pickup_entities", () -> new SensorType<>(MaidPickupEntitiesSensor::new)); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/bauble/DrownProtectBauble.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/bauble/DrownProtectBauble.java index bbcdae117..f8e33254e 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/bauble/DrownProtectBauble.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/bauble/DrownProtectBauble.java @@ -32,7 +32,8 @@ public void onLivingDamage(MaidDamageEvent event) { ItemStack stack = maid.getMaidBauble().getStackInSlot(slot); maid.hurtAndBreak(stack, 1); maid.getMaidBauble().setStackInSlot(slot, stack); - maid.setAirSupply(200); + // 增加了游泳功能,故此饰品可以增加到最大空气值 + maid.setAirSupply(maid.getMaxAirSupply()); NetworkHandler.sendToNearby(maid, new SpawnParticlePackage(maid.getId(), SpawnParticlePackage.Type.BUBBLE)); if (maid.getOwner() instanceof ServerPlayer serverPlayer) { InitTrigger.MAID_EVENT.get().trigger(serverPlayer, TriggerType.USE_PROTECT_BAUBLE); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/EntityAccessor.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/EntityAccessor.java new file mode 100644 index 000000000..404f4ad88 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/EntityAccessor.java @@ -0,0 +1,11 @@ +package com.github.tartaricacid.touhoulittlemaid.mixin; + +import net.minecraft.world.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Entity.class) +public interface EntityAccessor { + @Invoker("canAddPassenger") + boolean tlmCanAddPassenger(Entity pPassenger); +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinCrossbowItem.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinCrossbowItem.java index b3f24a451..b62a720dd 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinCrossbowItem.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinCrossbowItem.java @@ -1,6 +1,8 @@ package com.github.tartaricacid.touhoulittlemaid.mixin; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -8,24 +10,47 @@ import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.item.CrossbowItem; 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.callback.CallbackInfo; @Mixin(CrossbowItem.class) public class MixinCrossbowItem { - @Inject(method = "shootProjectile(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/projectile/Projectile;IFFFLnet/minecraft/world/entity/LivingEntity;)V", at = @At("HEAD")) + @Inject(method = "shootProjectile(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/projectile/Projectile;IFFFLnet/minecraft/world/entity/LivingEntity;)V", at = @At("HEAD"), cancellable = true) protected void shootProjectile(LivingEntity shooter, Projectile projectile, int index, float velocity, float inaccuracy, float angle, LivingEntity target, CallbackInfo ci) { - if (shooter instanceof EntityMaid maid && projectile instanceof AbstractArrow arrow) { + if (shooter instanceof EntityMaid maid) { // 弩箭伤害也和好感度挂钩 // 但是烟花火箭的伤害是很特殊的,就不应用了 - AttributeInstance attackDamage = maid.getAttribute(Attributes.ATTACK_DAMAGE); - double attackValue = 2.0; - if (attackDamage != null) { - attackValue = attackDamage.getBaseValue(); + if (projectile instanceof AbstractArrow arrow) { + AttributeInstance attackDamage = maid.getAttribute(Attributes.ATTACK_DAMAGE); + double attackValue = 2.0; + if (attackDamage != null) { + attackValue = attackDamage.getBaseValue(); + } + float multiplier = (float) (attackValue / 2.0f); + arrow.setBaseDamage(arrow.getBaseDamage() * multiplier); } - float multiplier = (float) (attackValue / 2.0f); - arrow.setBaseDamage(arrow.getBaseDamage() * multiplier); + this.shootCrossbowProjectile(shooter, target, projectile, 1.6F); + ci.cancel(); } } + + /** + * 修改默认方法,让女仆能实现超远距离打击 + */ + @Unique + private void shootCrossbowProjectile(LivingEntity shooter, LivingEntity target, Projectile projectile, float velocityIn) { + double x = target.getX() - shooter.getX(); + double y = target.getEyeY() - shooter.getEyeY(); + double z = target.getZ() - shooter.getZ(); + // 依据距离调整箭速和不准确度 + float distance = shooter.distanceTo(target); + float velocity = Mth.clamp(distance / 10f, velocityIn, 3.2f); + float inaccuracy = 1 - Mth.clamp(distance / 100f, 0, 0.9f); + // 射出的箭忽略重力,从而能让女仆百发百中 + projectile.setNoGravity(true); + projectile.shoot(x, y, z, velocity, inaccuracy); + shooter.playSound(SoundEvents.CROSSBOW_SHOOT, 1.0F, 1.0F / (shooter.getRandom().nextFloat() * 0.4F + 0.8F)); + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinStructureTemplate.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinStructureTemplate.java index 0bf761a91..6e6a271d5 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinStructureTemplate.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinStructureTemplate.java @@ -10,19 +10,24 @@ import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; 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.callback.CallbackInfoReturnable; import java.util.Optional; +import java.util.Random; @Mixin(StructureTemplate.class) public abstract class MixinStructureTemplate { + @Unique + private static final Random TOUHOU_LITTLE_MAID$RANDOM = new Random(); + @Inject(method = "createEntityIgnoreException(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/nbt/CompoundTag;)Ljava/util/Optional;", at = @At("RETURN"), cancellable = true) private static void createEntityIgnoreException(ServerLevelAccessor accessor, CompoundTag tag, CallbackInfoReturnable> ci) { ci.getReturnValue().ifPresent(entity -> { ServerLevel level = accessor.getLevel(); - if (entity.getType().equals(EntityType.ALLAY) && level.random.nextDouble() < MaidConfig.REPLACE_ALLAY_PERCENT.get()) { + if (entity.getType().equals(EntityType.ALLAY) && TOUHOU_LITTLE_MAID$RANDOM.nextDouble() < MaidConfig.REPLACE_ALLAY_PERCENT.get()) { EntityMaid entityMaid = InitEntities.MAID.get().create(level); ci.setReturnValue(Optional.ofNullable(entityMaid)); } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinThrownTrident.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinThrownTrident.java new file mode 100644 index 000000000..ee4cf2160 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/MixinThrownTrident.java @@ -0,0 +1,21 @@ +package com.github.tartaricacid.touhoulittlemaid.mixin; + +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.world.entity.projectile.ThrownTrident; +import net.minecraft.world.phys.EntityHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ThrownTrident.class) +public class MixinThrownTrident { + @Inject(method = "onHitEntity(Lnet/minecraft/world/phys/EntityHitResult;)V", at = @At("HEAD")) + private void onHitEntity(EntityHitResult result, CallbackInfo ci) { + ThrownTrident trident = (ThrownTrident) (Object) this; + // 击中实体后,恢复重力 + if (trident.isNoGravity() && trident.getOwner() instanceof EntityMaid) { + trident.setNoGravity(false); + } + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/PlayerMixin.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/PlayerMixin.java new file mode 100644 index 000000000..4356f0aeb --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/mixin/PlayerMixin.java @@ -0,0 +1,27 @@ +package com.github.tartaricacid.touhoulittlemaid.mixin; + +import com.github.tartaricacid.touhoulittlemaid.api.mixin.IPlayerMixin; +import net.minecraft.Util; +import net.minecraft.world.entity.player.Player; +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.callback.CallbackInfo; + +@Mixin(Player.class) +public class PlayerMixin implements IPlayerMixin { + @Unique + private long removeVehicleTimestamp = -1L; + + @Inject(method = "removeVehicle()V", at = @At("HEAD")) + private void tlmRemoveVehicle(CallbackInfo ci) { + removeVehicleTimestamp = Util.getMillis(); + } + + @Override + public boolean tlmInRemoveVehicleCooldown() { + // 三秒冷却时间 + return Util.getMillis() - removeVehicleTimestamp < 3000; + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 9d7904fef..ea7ecee21 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -30,4 +30,7 @@ public net.minecraft.client.renderer.entity.EntityRenderDispatcher renderers public net.minecraft.client.renderer.RenderType$CompositeRenderType public net.minecraft.client.renderer.RenderType$CompositeRenderType state public net.minecraft.client.renderer.RenderType$CompositeState textureState -public net.minecraft.client.renderer.RenderStateShard$TextureStateShard texture \ No newline at end of file +public net.minecraft.client.renderer.RenderStateShard$TextureStateShard texture + +public net.minecraft.world.entity.LivingEntity getFrictionInfluencedSpeed(F)F +public net.minecraft.world.entity.LivingEntity handleOnClimbable(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3; \ No newline at end of file diff --git a/src/main/resources/assets/touhou_little_maid/animation/maid.animation.json b/src/main/resources/assets/touhou_little_maid/animation/maid.animation.json index 82c8d1454..73333424a 100644 --- a/src/main/resources/assets/touhou_little_maid/animation/maid.animation.json +++ b/src/main/resources/assets/touhou_little_maid/animation/maid.animation.json @@ -2128,61 +2128,478 @@ } } }, - "chair": { - "animation_length": 0.375, + "swim": { + "loop": true, + "animation_length": 1, "bones": { "Root": { - "rotation": [0, 0, 0], - "position": [0, -5, 0], + "rotation": [72.5, 0, 0], + "position": [0, 0, 21], "scale": 1 }, "UpBody": { - "rotation": [15, 0, 0], + "rotation": [-12.5, 0, 0], "position": [0, 0, 0] }, "LeftArm": { - "rotation": [-68.659, 23.92746, -39.32269], + "rotation": { + "0.0": [-63.42, 11.12, -146.47], + "0.0417": [-58.49, 12.06, -139.67], + "0.0833": [-51.82, 13.38, -130.57], + "0.125": [-43.77, 14.99, -119.63], + "0.1667": [-34.71, 16.81, -107.3], + "0.2083": [-24.99, 18.75, -94.07], + "0.25": [-14.97, 20.72, -80.38], + "0.2917": [-5.01, 22.63, -66.7], + "0.3333": [4.54, 24.4, -53.5], + "0.375": [13.3, 25.94, -41.25], + "0.4167": [20.94, 27.17, -30.39], + "0.4583": [27.08, 27.99, -21.41], + "0.5": [31.36, 28.32, -14.76], + "0.5417": [36.09, 27.02, -4.86], + "0.5833": [35.54, 23.63, -0.56], + "0.625": [30.91, 19.29, -1.59], + "0.6667": [23.45, 15.17, -7.68], + "0.7083": [14.38, 12.39, -18.54], + "0.75": [4.91, 11.39, -33.26], + "0.7917": [-8.54, 10.8, -55.87], + "0.8333": [-23.93, 10.53, -82.36], + "0.875": [-39.17, 10.51, -108.69], + "0.9167": [-52.22, 10.66, -130.84], + "0.9583": [-60.99, 10.89, -144.78], + "1.0": [-63.42, 11.12, -146.47] + }, "position": [0, 0, 0] }, "LeftForeArm": { - "rotation": [-60.94031, 19.61291, -8.71337], + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0.39, -0.06, -2.5], + "0.0833": [1.17, -0.19, -5.7], + "0.125": [1.76, -0.29, -9.9], + "0.1667": [1.56, -0.25, -15.4], + "0.2083": [0, 0, -22.5], + "0.25": [-2.09, 0.15, -28.44], + "0.2917": [-5.09, 0.18, -35.87], + "0.3333": [-8.68, 0.2, -44.22], + "0.375": [-12.54, 0.32, -52.94], + "0.4167": [-16.36, 0.65, -61.44], + "0.4583": [-19.82, 1.29, -69.17], + "0.5": [-22.6, 2.37, -75.55], + "0.5417": [-24.37, 3.98, -80.03], + "0.5833": [-25.25, 7.11, -83.29], + "0.625": [-25.31, 11.64, -85.41], + "0.6667": [-24.71, 16.87, -86.3], + "0.7083": [-23.6, 22.09, -85.87], + "0.75": [-22.12, 26.61, -84.03], + "0.7917": [-20.43, 29.73, -80.7], + "0.8333": [-18.67, 30.73, -75.81], + "0.875": [-14.47, 26.36, -60.1], + "0.9167": [-8.98, 17.03, -37.63], + "0.9583": [-3.66, 6.87, -15.3], + "1.0": [0, 0, 0] + }, "position": [0, 0, 0] }, "RightArm": { - "rotation": [-87.59409, -11.75726, 65.47122], + "rotation": { + "0.0": [-63.42, -11.12, 146.47], + "0.0417": [-58.49, -12.06, 139.67], + "0.0833": [-51.82, -13.38, 130.57], + "0.125": [-43.77, -14.99, 119.63], + "0.1667": [-34.71, -16.81, 107.3], + "0.2083": [-24.99, -18.75, 94.07], + "0.25": [-14.97, -20.72, 80.38], + "0.2917": [-5.01, -22.63, 66.7], + "0.3333": [4.54, -24.4, 53.5], + "0.375": [13.3, -25.94, 41.25], + "0.4167": [20.94, -27.17, 30.39], + "0.4583": [27.08, -27.99, 21.41], + "0.5": [31.36, -28.32, 14.76], + "0.5417": [36.09, -27.02, 4.86], + "0.5833": [35.54, -23.63, 0.56], + "0.625": [30.91, -19.29, 1.59], + "0.6667": [23.45, -15.17, 7.68], + "0.7083": [14.38, -12.39, 18.54], + "0.75": [5.72, -11.43, 31.5], + "0.7917": [-5.85, -10.92, 50.01], + "0.8333": [-19.08, -10.74, 71.81], + "0.875": [-32.71, -10.79, 94.63], + "0.9167": [-45.48, -10.95, 116.2], + "0.9583": [-56.14, -11.1, 134.23], + "1.0": [-63.42, -11.12, 146.47] + }, "position": [0, 0, 0] }, "RightForeArm": { - "rotation": [-47.5, 0, 0], + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0.39, 0.06, 2.5], + "0.0833": [1.17, 0.19, 5.7], + "0.125": [1.76, 0.29, 9.9], + "0.1667": [1.56, 0.25, 15.4], + "0.2083": [0, 0, 22.5], + "0.25": [-2.09, -0.15, 28.44], + "0.2917": [-5.09, -0.18, 35.87], + "0.3333": [-8.68, -0.2, 44.22], + "0.375": [-12.54, -0.32, 52.94], + "0.4167": [-16.36, -0.65, 61.44], + "0.4583": [-19.82, -1.29, 69.17], + "0.5": [-22.6, -2.37, 75.55], + "0.5417": [-24.37, -3.98, 80.03], + "0.5833": [-25.25, -7.11, 83.29], + "0.625": [-25.31, -11.64, 85.41], + "0.6667": [-24.71, -16.87, 86.3], + "0.7083": [-23.6, -22.09, 85.87], + "0.75": [-22.12, -26.61, 84.03], + "0.7917": [-20.43, -29.73, 80.7], + "0.8333": [-18.67, -30.73, 75.81], + "0.875": [-14.47, -26.36, 60.1], + "0.9167": [-8.98, -17.03, 37.63], + "0.9583": [-3.66, -6.87, 15.3], + "1.0": [0, 0, 0] + }, "position": [0, 0, 0] }, "LeftLeg": { - "rotation": [-142.5, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [-20, 0, 5], + "0.0417": [-17.86, 0.01, 4.46], + "0.0833": [-14.85, 0.03, 3.72], + "0.125": [-11.32, 0.04, 2.82], + "0.1667": [-7.64, 0.03, 1.84], + "0.2083": [-4.17, 0, 0.83], + "0.25": [-1.45, -0.06, -0.01], + "0.2917": [1.81, -0.15, -1.02], + "0.3333": [5.21, -0.25, -2.09], + "0.375": [8.36, -0.36, -3.14], + "0.4167": [10.89, -0.45, -4.05], + "0.4583": [12.39, -0.52, -4.73], + "0.5": [12.49, -0.54, -5.06], + "0.5417": [9.54, -0.49, -4.91], + "0.5833": [3.81, -0.38, -4.24], + "0.625": [-3.15, -0.23, -3.23], + "0.6667": [-9.77, -0.09, -2.09], + "0.7083": [-14.49, 0, -0.99], + "0.75": [-16.7, 0.03, -0.07], + "0.7917": [-18.62, 0.04, 1.12], + "0.8333": [-20.14, 0.04, 2.41], + "0.875": [-21.14, 0.03, 3.63], + "0.9167": [-21.53, 0.02, 4.58], + "0.9583": [-21.19, 0, 5.1], + "1.0": [-20, 0, 5] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "LeftLowerLeg": { - "rotation": [105, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [25, 0, 0], + "0.0417": [19.92, 0, 0], + "0.0833": [12.5, 0, 0], + "0.125": [5.08, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [-2.17, 0, 0], + "0.25": [-2.66, 0, 0], + "0.2917": [-1.82, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [2.86, 0, 0], + "0.4167": [6.89, 0, 0], + "0.4583": [11.85, 0, 0], + "0.5": [17.5, 0, 0], + "0.5417": [25.31, 0, 0], + "0.5833": [34.91, 0, 0], + "0.625": [43.26, 0, 0], + "0.6667": [47.34, 0, 0], + "0.7083": [46.89, 0, 0], + "0.75": [44.9, 0, 0], + "0.7917": [41.8, 0, 0], + "0.8333": [38.04, 0, 0], + "0.875": [34.04, 0, 0], + "0.9167": [30.24, 0, 0], + "0.9583": [27.08, 0, 0], + "1.0": [25, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "LeftFoot": { - "rotation": [37.5, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [25, 0, 0], + "0.0417": [23.34, 0, 0], + "0.0833": [20.74, 0, 0], + "0.125": [17.81, 0, 0], + "0.1667": [15.18, 0, 0], + "0.2083": [13.48, 0, 0], + "0.25": [13.33, 0, 0], + "0.2917": [14.97, 0, 0], + "0.3333": [17.95, 0, 0], + "0.375": [21.86, 0, 0], + "0.4167": [26.28, 0, 0], + "0.4583": [30.8, 0, 0], + "0.5": [35, 0, 0], + "0.5417": [42.05, 0, 0], + "0.5833": [50.03, 0, 0], + "0.625": [56.8, 0, 0], + "0.6667": [60.2, 0, 0], + "0.7083": [57.61, 0, 0], + "0.75": [50.31, 0, 0], + "0.7917": [42.92, 0, 0], + "0.8333": [39.09, 0, 0], + "0.875": [34.94, 0, 0], + "0.9167": [30.91, 0, 0], + "0.9583": [27.45, 0, 0], + "1.0": [25, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "RightLeg": { - "rotation": [-127.5, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [12.5, 0, 7.5], + "0.0417": [8.48, 0, 6.61], + "0.0833": [2.61, 0, 5.34], + "0.125": [-3.95, 0, 3.87], + "0.1667": [-10.04, 0, 2.36], + "0.2083": [-14.49, 0, 0.99], + "0.25": [-16.59, 0, 0.02], + "0.2917": [-18.25, 0, -1.06], + "0.3333": [-19.47, 0, -2.15], + "0.375": [-20.26, 0, -3.17], + "0.4167": [-20.61, 0, -4.04], + "0.4583": [-20.52, 0, -4.68], + "0.5": [-20, 0, -5], + "0.5417": [-18.21, 0, -4.88], + "0.5833": [-15.24, 0, -4.26], + "0.625": [-11.58, 0, -3.29], + "0.6667": [-7.73, 0, -2.1], + "0.7083": [-4.17, 0, -0.83], + "0.75": [-1.4, 0, 0.32], + "0.7917": [1.95, 0, 1.85], + "0.8333": [5.47, 0, 3.53], + "0.875": [8.71, 0, 5.15], + "0.9167": [11.25, 0, 6.5], + "0.9583": [12.66, 0, 7.35], + "1.0": [12.5, 0, 7.5] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "RightLowerLeg": { - "rotation": [75, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [17.5, 0, 0], + "0.0417": [24.08, 0, 0], + "0.0833": [33.81, 0, 0], + "0.125": [42.85, 0, 0], + "0.1667": [47.34, 0, 0], + "0.2083": [47.06, 0, 0], + "0.25": [45.49, 0, 0], + "0.2917": [42.9, 0, 0], + "0.3333": [39.6, 0, 0], + "0.375": [35.87, 0, 0], + "0.4167": [32, 0, 0], + "0.4583": [28.28, 0, 0], + "0.5": [25, 0, 0], + "0.5417": [18.35, 0, 0], + "0.5833": [11.11, 0, 0], + "0.625": [4.56, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [-2.17, 0, 0], + "0.75": [-2.66, 0, 0], + "0.7917": [-1.82, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [3.56, 0, 0], + "0.9167": [8.75, 0, 0], + "0.9583": [13.95, 0, 0], + "1.0": [17.5, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "RightFoot": { - "rotation": [55, 0, 0], - "position": [0, 0, 0] + "rotation": { + "0.0": [35, 0, 0], + "0.0417": [40.52, 0, 0], + "0.0833": [48.68, 0, 0], + "0.125": [56.29, 0, 0], + "0.1667": [60.2, 0, 0], + "0.2083": [57.61, 0, 0], + "0.25": [50.31, 0, 0], + "0.2917": [42.92, 0, 0], + "0.3333": [39.28, 0, 0], + "0.375": [35.5, 0, 0], + "0.4167": [31.75, 0, 0], + "0.4583": [28.19, 0, 0], + "0.5": [25, 0, 0], + "0.5417": [22.31, 0, 0], + "0.5833": [19.41, 0, 0], + "0.625": [16.69, 0, 0], + "0.6667": [14.52, 0, 0], + "0.7083": [13.27, 0, 0], + "0.75": [13.33, 0, 0], + "0.7917": [15.26, 0, 0], + "0.8333": [18.89, 0, 0], + "0.875": [23.44, 0, 0], + "0.9167": [28.15, 0, 0], + "0.9583": [32.26, 0, 0], + "1.0": [35, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } }, "AllBody": { - "rotation": [0, 0, 0], - "position": [0, -10.5, 0], + "rotation": [0, "1.5*v.L6_P0-0.4*v.L4_P0", "0.6*v.L6_P0"], + "position": [0, 0, 0], "scale": 1 }, "AllHead": { @@ -2190,19 +2607,88 @@ "position": [0, 0, 0] }, "Head": { - "rotation": [-15, 0, 0], + "rotation": { + "0.0": [-27.5, 0, 0], + "0.0417": [-27.23, 0, 0], + "0.0833": [-26.84, 0, 0], + "0.125": [-26.37, 0, 0], + "0.1667": [-25.83, 0, 0], + "0.2083": [-25.26, 0, 0], + "0.25": [-24.69, 0, 0], + "0.2917": [-24.13, 0, 0], + "0.3333": [-23.61, 0, 0], + "0.375": [-23.16, 0, 0], + "0.4167": [-22.81, 0, 0], + "0.4583": [-22.58, 0, 0], + "0.5": [-22.5, 0, 0], + "0.5417": [-22.6, 0, 0], + "0.5833": [-22.87, 0, 0], + "0.625": [-23.28, 0, 0], + "0.6667": [-23.8, 0, 0], + "0.7083": [-24.38, 0, 0], + "0.75": [-25, 0, 0], + "0.7917": [-25.62, 0, 0], + "0.8333": [-26.2, 0, 0], + "0.875": [-26.72, 0, 0], + "0.9167": [-27.13, 0, 0], + "0.9583": [-27.4, 0, 0], + "1.0": [-27.5, 0, 0] + }, "position": [0, 0, 0] }, + "DownBody": { + "rotation": { + "0.0": [0, 0, -5], + "0.0417": [0, 0, -4.45], + "0.0833": [0, 0, -3.68], + "0.125": [0, 0, -2.73], + "0.1667": [0, 0, -1.67], + "0.2083": [0, 0, -0.53], + "0.25": [0, 0, 0.63], + "0.2917": [0, 0, 1.74], + "0.3333": [0, 0, 2.78], + "0.375": [0, 0, 3.67], + "0.4167": [0, 0, 4.38], + "0.4583": [0, 0, 4.84], + "0.5": [0, 0, 5], + "0.5417": [0, 0, 4.84], + "0.5833": [0, 0, 4.38], + "0.625": [0, 0, 3.67], + "0.6667": [0, 0, 2.78], + "0.7083": [0, 0, 1.74], + "0.75": [0, 0, 0.63], + "0.7917": [0, 0, -0.53], + "0.8333": [0, 0, -1.67], + "0.875": [0, 0, -2.73], + "0.9167": [0, 0, -3.68], + "0.9583": [0, 0, -4.45], + "1.0": [0, 0, -5] + } + }, "LongHair": { - "rotation": [15, 0, 0] + "rotation": [30, 0, 0] }, - "Skirt": { - "rotation": [-123.71393, -4.07256, -8.03263], - "position": [0.3, -3.45, 1.8] + "MAllBody": { + "rotation": ["-v.L6_P00", 0, 0] + }, + "MHead": { + "rotation": ["ysm.head_pitch", "math.clamp(ysm.head_yaw,-60,60)", 0] + }, + "FLongHair": { + "rotation": [0, 0, 0] + }, + "ElytraLocator": { + "rotation": [0, 0, 0] + }, + "MLongHair": { + "rotation": [0, 0, 0] + }, + "molang": { + "rotation": ["v.bv=math.cos(2*query.anim_time*360/(24/24))*3", 0, 0] } } }, - "gomoku": { + "chair": { "animation_length": 0.375, "bones": { "Root": { @@ -2276,7 +2762,7 @@ } } }, - "bookshelf": { + "gomoku": { "animation_length": 0.375, "bones": { "Root": { @@ -2350,7 +2836,7 @@ } } }, - "computer": { + "bookshelf": { "animation_length": 0.375, "bones": { "Root": { @@ -2424,7 +2910,7 @@ } } }, - "keyboard": { + "computer": { "animation_length": 0.375, "bones": { "Root": { @@ -2498,7 +2984,7 @@ } } }, - "picnic": { + "keyboard": { "animation_length": 0.375, "bones": { "Root": { @@ -2572,12 +3058,86 @@ } } }, - "sleep": { + "picnic": { "animation_length": 0.375, "bones": { "Root": { - "rotation": [-13.25506, -77.79629, 23.76148], - "position": [-10, 0, -3], + "rotation": [0, 0, 0], + "position": [0, -5, 0], + "scale": 1 + }, + "UpBody": { + "rotation": [15, 0, 0], + "position": [0, 0, 0] + }, + "LeftArm": { + "rotation": [-68.659, 23.92746, -39.32269], + "position": [0, 0, 0] + }, + "LeftForeArm": { + "rotation": [-60.94031, 19.61291, -8.71337], + "position": [0, 0, 0] + }, + "RightArm": { + "rotation": [-87.59409, -11.75726, 65.47122], + "position": [0, 0, 0] + }, + "RightForeArm": { + "rotation": [-47.5, 0, 0], + "position": [0, 0, 0] + }, + "LeftLeg": { + "rotation": [-142.5, 0, 0], + "position": [0, 0, 0] + }, + "LeftLowerLeg": { + "rotation": [105, 0, 0], + "position": [0, 0, 0] + }, + "LeftFoot": { + "rotation": [37.5, 0, 0], + "position": [0, 0, 0] + }, + "RightLeg": { + "rotation": [-127.5, 0, 0], + "position": [0, 0, 0] + }, + "RightLowerLeg": { + "rotation": [75, 0, 0], + "position": [0, 0, 0] + }, + "RightFoot": { + "rotation": [55, 0, 0], + "position": [0, 0, 0] + }, + "AllBody": { + "rotation": [0, 0, 0], + "position": [0, -10.5, 0], + "scale": 1 + }, + "AllHead": { + "rotation": [0, 0, 0], + "position": [0, 0, 0] + }, + "Head": { + "rotation": [-15, 0, 0], + "position": [0, 0, 0] + }, + "LongHair": { + "rotation": [15, 0, 0] + }, + "Skirt": { + "rotation": [-123.71393, -4.07256, -8.03263], + "position": [0.3, -3.45, 1.8] + } + } + }, + "sleep": { + "animation_length": 0.375, + "bones": { + "Root": { + "rotation": [-13.25506, -77.79629, 23.76148], + "position": [-10, 0, -3], "scale": 1 }, "UpBody": { @@ -3324,6 +3884,1302 @@ } } }, + "ladder_up": { + "loop": true, + "animation_length": 1, + "bones": { + "Root": { + "position": { + "0.0": [1.7, 0, 0], + "0.0417": [1.66684, 0.0599, 0], + "0.0833": [1.57528, 0.23844, 0], + "0.125": [1.4048, 0.5, 0], + "0.1667": [1.12013, 0.76156, 0], + "0.2083": [0.65667, 0.9401, 0], + "0.25": [0, 1, 0], + "0.2917": [-0.71074, 0.9401, 0], + "0.3333": [-1.26504, 0.76156, 0], + "0.375": [-1.62506, 0.5, 0], + "0.4167": [-1.84547, 0.23844, 0], + "0.4583": [-1.96266, 0.0599, 0], + "0.5": [-2, 0, 0], + "0.5417": [-1.96811, 0.0599, 0], + "0.5833": [-1.85476, 0.23844, 0], + "0.625": [-1.63615, 0.5, 0], + "0.6667": [-1.27523, 0.76156, 0], + "0.7083": [-0.71651, 0.9401, 0], + "0.75": [0, 1, 0], + "0.7917": [0.67501, 0.9401, 0], + "0.8333": [1.15129, 0.76156, 0], + "0.875": [1.43773, 0.5, 0], + "0.9167": [1.60229, 0.23844, 0], + "0.9583": [1.68243, 0.0599, 0], + "1.0": [1.7, 0, 0] + } + }, + "UpBody": { + "rotation": { + "0.0": [7.5, 0, -2.335], + "0.0417": [7.5, 0, -2.465], + "0.0833": [7.5, 0, -2.5], + "0.125": [7.5, 0, -2.465], + "0.1667": [7.5, 0, -2.335], + "0.2083": [7.5, 0, -2.08], + "0.25": [7.5, 0, -1.64], + "0.2917": [7.5, 0, -0.945], + "0.3333": [7.5, 0, 0], + "0.375": [7.5, 0, 0.945], + "0.4167": [7.5, 0, 1.64], + "0.4583": [7.5, 0, 2.08], + "0.5": [7.5, 0, 2.335], + "0.5417": [7.5, 0, 2.465], + "0.5833": [7.5, 0, 2.5], + "0.625": [7.5, 0, 2.465], + "0.6667": [7.5, 0, 2.335], + "0.7083": [7.5, 0, 2.08], + "0.75": [7.5, 0, 1.64], + "0.7917": [7.5, 0, 0.945], + "0.8333": [7.5, 0, 0], + "0.875": [7.5, 0, -0.945], + "0.9167": [7.5, 0, -1.64], + "0.9583": [7.5, 0, -2.08], + "1.0": [7.5, 0, -2.335] + } + }, + "Head": { + "rotation": { + "0.0": [0, 0, 0], + "1.0": [0, 0, 0] + } + }, + "LongHair": { + "rotation": { + "0.0": [39.6, 2.14, 3.38], + "0.0417": [39.6, 3.44, 1.3], + "0.0833": [39.6, 4.53, -0.87], + "0.125": [39.6, 5.33, -3.04], + "0.1667": [39.6, 5.77, -5.11], + "0.2083": [39.6, 5.79, -6.96], + "0.25": [39.6, 5.35, -8.46], + "0.2917": [39.6, 4.53, -9.18], + "0.3333": [39.6, 3.45, -9.03], + "0.375": [39.6, 2.17, -8.23], + "0.4167": [39.6, 0.75, -6.95], + "0.4583": [39.6, -0.71, -5.3], + "0.5": [39.6, -2.14, -3.38], + "0.5417": [39.6, -3.44, -1.3], + "0.5833": [39.6, -4.53, 0.87], + "0.625": [39.6, -5.33, 3.04], + "0.6667": [39.6, -5.77, 5.11], + "0.7083": [39.6, -5.79, 6.96], + "0.75": [39.6, -5.35, 8.46], + "0.7917": [39.6, -4.53, 9.18], + "0.8333": [39.6, -3.45, 9.03], + "0.875": [39.6, -2.17, 8.23], + "0.9167": [39.6, -0.75, 6.95], + "0.9583": [39.6, 0.71, 5.3], + "1.0": [39.6, 2.14, 3.38] + } + }, + "LeftArm": { + "rotation": { + "0.0": [-145.26175, -21.27158, 44.88345], + "0.0417": [-132.56947, -22.82532, 41.71761], + "0.0833": [-119.24895, -23.8232, 37.33811], + "0.125": [-105.84699, -24.46148, 32.065], + "0.1667": [-92.98313, -24.84982, 26.25427], + "0.2083": [-81.22649, -25.05785, 20.26751], + "0.25": [-70.99201, -25.13466, 14.44333], + "0.2917": [-62.50108, -25.11785, 9.0751], + "0.3333": [-55.80603, -25.03827, 4.39922], + "0.375": [-50.84381, -24.92385, 0.59113], + "0.4167": [-47.48806, -24.8019, -2.22906], + "0.4583": [-45.58688, -24.7019, -3.99012], + "0.5": [-44.98535, -24.65905, -4.65718], + "0.5417": [-46.48814, -24.23809, -3.94462], + "0.5833": [-51.60625, -23.08885, -1.34896], + "0.625": [-61.40533, -21.4238, 3.40334], + "0.6667": [-76.68604, -19.50182, 10.23834], + "0.7083": [-96.38655, -17.60093, 18.40153], + "0.75": [-116.24982, -15.98733, 26.55696], + "0.7917": [-131.89245, -14.8884, 33.5301], + "0.8333": [-142.08342, -14.47735, 38.8005], + "0.875": [-147.5569, -14.86791, 42.35805], + "0.9167": [-149.37271, -16.12205, 44.40246], + "0.9583": [-148.39909, -18.26006, 45.17285], + "1.0": [-145.26175, -21.27158, 44.88345] + } + }, + "LeftForeArm": { + "rotation": { + "0.0": [-7.23507, -0.486, 36.83069], + "0.0417": [-8.13204, -0.34549, 36.76026], + "0.0833": [-11.10461, -0.12491, 36.56569], + "0.125": [-16.37997, 0.14573, 36.27178], + "0.1667": [-24.02122, 0.44816, 35.9033], + "0.2083": [-33.73274, 0.76962, 35.48516], + "0.2917": [-55.65982, 1.43045, 34.59921], + "0.3333": [-65.37134, 1.75192, 34.18108], + "0.375": [-73.01259, 2.05435, 33.81259], + "0.4167": [-78.28795, 2.32499, 33.51869], + "0.4583": [-81.26052, 2.54557, 33.32411], + "0.5": [-82.15749, 2.68608, 33.25368], + "0.5417": [-81.17076, 2.66252, 33.32411], + "0.5833": [-78.14328, 2.48327, 33.51869], + "0.625": [-72.85166, 2.20669, 33.81259], + "0.6667": [-65.23389, 1.86828, 34.18108], + "0.7083": [-55.58058, 1.49286, 34.59921], + "0.7917": [-33.81197, 0.70721, 35.48516], + "0.8333": [-24.15867, 0.33179, 35.9033], + "0.875": [-16.54089, -0.00661, 36.27178], + "0.9167": [-11.24928, -0.2832, 36.56569], + "0.9583": [-8.2218, -0.46245, 36.76026], + "1.0": [-7.23507, -0.486, 36.83069] + } + }, + "RightArm": { + "rotation": { + "0.0": [-44.98535, 24.65905, 4.65718], + "0.0417": [-46.48814, 24.23809, 3.94462], + "0.0833": [-51.60625, 23.08885, 1.34896], + "0.125": [-61.40533, 21.4238, -3.40334], + "0.1667": [-76.68604, 19.50182, -10.23834], + "0.2083": [-96.38655, 17.60093, -18.40153], + "0.25": [-116.24982, 15.98733, -26.55696], + "0.2917": [-131.89245, 14.8884, -33.5301], + "0.3333": [-142.08342, 14.47735, -38.8005], + "0.375": [-147.5569, 14.86791, -42.35805], + "0.4167": [-149.37271, 16.12205, -44.40246], + "0.4583": [-148.39909, 18.26006, -45.17285], + "0.5": [-145.26175, 21.27158, -44.88345], + "0.5417": [-132.56947, 22.82532, -41.71761], + "0.5833": [-119.24895, 23.8232, -37.33811], + "0.625": [-105.84699, 24.46148, -32.065], + "0.6667": [-92.98313, 24.84982, -26.25427], + "0.7083": [-81.22649, 25.05785, -20.26751], + "0.75": [-70.99201, 25.13466, -14.44333], + "0.7917": [-62.50108, 25.11785, -9.0751], + "0.8333": [-55.80603, 25.03827, -4.39922], + "0.875": [-50.84381, 24.92385, -0.59113], + "0.9167": [-47.48806, 24.8019, 2.22906], + "0.9583": [-45.58688, 24.7019, 3.99012], + "1.0": [-44.98535, 24.65905, 4.65718] + } + }, + "RightForeArm": { + "rotation": { + "0.0": [-82.15749, -2.68608, -33.25368], + "0.0417": [-81.17076, -2.66252, -33.32411], + "0.0833": [-78.14328, -2.48327, -33.51869], + "0.125": [-72.85166, -2.20669, -33.81259], + "0.1667": [-65.23389, -1.86828, -34.18108], + "0.2083": [-55.58058, -1.49286, -34.59921], + "0.2917": [-33.81197, -0.70721, -35.48516], + "0.3333": [-24.15867, -0.33179, -35.9033], + "0.375": [-16.54089, 0.00661, -36.27178], + "0.4167": [-11.24928, 0.2832, -36.56569], + "0.4583": [-8.2218, 0.46245, -36.76026], + "0.5": [-7.23507, 0.486, -36.83069], + "0.5417": [-8.13204, 0.34549, -36.76026], + "0.5833": [-11.10461, 0.12491, -36.56569], + "0.625": [-16.37997, -0.14573, -36.27178], + "0.6667": [-24.02122, -0.44816, -35.9033], + "0.7083": [-33.73274, -0.76962, -35.48516], + "0.7917": [-55.65982, -1.43045, -34.59921], + "0.8333": [-65.37134, -1.75192, -34.18108], + "0.875": [-73.01259, -2.05435, -33.81259], + "0.9167": [-78.28795, -2.32499, -33.51869], + "0.9583": [-81.26052, -2.54557, -33.32411], + "1.0": [-82.15749, -2.68608, -33.25368] + } + }, + "DownBody": { + "rotation": { + "0.0": [0, 0, 5], + "0.0417": [0, 0, 4.91], + "0.0833": [0, 0, 4.62], + "0.125": [0, 0, 4.05], + "0.1667": [0, 0, 3.13], + "0.2083": [0, 0, 1.75], + "0.25": [0, 0, 0], + "0.2917": [0, 0, -1.75], + "0.3333": [0, 0, -3.13], + "0.375": [0, 0, -4.05], + "0.4167": [0, 0, -4.62], + "0.4583": [0, 0, -4.91], + "0.5": [0, 0, -5], + "0.5417": [0, 0, -4.92], + "0.5833": [0, 0, -4.63], + "0.625": [0, 0, -4.07], + "0.6667": [0, 0, -3.14], + "0.7083": [0, 0, -1.76], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 1.76], + "0.8333": [0, 0, 3.14], + "0.875": [0, 0, 4.07], + "0.9167": [0, 0, 4.63], + "0.9583": [0, 0, 4.92], + "1.0": [0, 0, 5] + } + }, + "LeftLeg": { + "rotation": { + "0.0": [-12.5, 0, 0], + "0.0417": [-10.43169, -0.36405, 0.09101], + "0.0833": [-9.84808, -1.08972, 0.27243], + "0.125": [-11.11278, -1.97432, 0.49358], + "0.1667": [-14.67586, -2.94456, 0.73614], + "0.2083": [-21.00568, -3.96172, 0.99043], + "0.25": [-30.33669, -5, 1.25], + "0.2917": [-42.141, -6.03828, 1.50957], + "0.3333": [-54.74698, -7.05544, 1.76386], + "0.375": [-66.09556, -8.02568, 2.00642], + "0.4167": [-74.97268, -8.91028, 2.22757], + "0.4583": [-81.17628, -9.63595, 2.40899], + "0.5": [-85, -10, 2.5], + "0.5417": [-86.76478, -9.63595, 2.40899], + "0.5833": [-86.13396, -8.91028, 2.22757], + "0.625": [-82.48886, -8.02568, 2.00642], + "0.6667": [-75.44945, -7.05544, 1.76386], + "0.7083": [-65.47628, -6.03828, 1.50957], + "0.75": [-54.14379, -5, 1.25], + "0.7917": [-43.25518, -3.96172, 0.99043], + "0.8333": [-33.85793, -2.94456, 0.73614], + "0.875": [-26.23036, -1.97432, 0.49358], + "0.9167": [-20.27168, -1.08972, 0.27243], + "0.9583": [-15.76726, -0.36405, 0.09101], + "1.0": [-12.5, 0, 0] + } + }, + "LeftLowerLeg": { + "rotation": { + "0.0": [1, 0, 0], + "0.0417": [-0.52752, 0, 0], + "0.0833": [1.01353, 0, 0], + "0.125": [6.4516, 0, 0], + "0.1667": [16.65209, 0, 0], + "0.2083": [31.91227, 0, 0], + "0.25": [50.68283, 0, 0], + "0.2917": [69.19536, 0, 0], + "0.3333": [83.97854, 0, 0], + "0.375": [93.87908, 0, 0], + "0.4167": [99.31139, 0, 0], + "0.4583": [101.09898, 0, 0], + "0.5": [100, 0, 0], + "0.5417": [97.01765, 0, 0], + "0.5833": [92.51897, 0, 0], + "0.625": [86.09509, 0, 0], + "0.6667": [77.2918, 0, 0], + "0.7083": [65.85144, 0, 0], + "0.75": [52.32317, 0, 0], + "0.7917": [38.49073, 0, 0], + "0.8333": [26.35006, 0, 0], + "0.875": [16.76701, 0, 0], + "0.9167": [9.63099, 0, 0], + "0.9583": [4.51533, 0, 0], + "1.0": [1, 0, 0] + } + }, + "LeftFoot": { + "rotation": { + "0.0": [12.5, 0, 0], + "0.0417": [11.67587, 0, 0], + "0.0833": [10.4188, 0, 0], + "0.125": [8.63908, 0, 0], + "0.1667": [6.24763, 0, 0], + "0.2083": [3.20592, 0, 0], + "0.25": [-0.36238, 0, 0], + "0.2917": [-4.05549, 0, 0], + "0.3333": [-7.31677, 0, 0], + "0.375": [-9.7786, 0, 0], + "0.4167": [-11.38388, 0, 0], + "0.4583": [-12.24311, 0, 0], + "0.5": [-12.5, 0, 0], + "0.5417": [-12.1492, 0, 0], + "0.5833": [-10.98978, 0, 0], + "0.625": [-8.86073, 0, 0], + "0.6667": [-5.67416, 0, 0], + "0.7083": [-1.59925, 0, 0], + "0.75": [2.78073, 0, 0], + "0.7917": [6.69729, 0, 0], + "0.8333": [9.66671, 0, 0], + "0.875": [11.60119, 0, 0], + "0.9167": [12.61418, 0, 0], + "0.9583": [12.86543, 0, 0], + "1.0": [12.5, 0, 0] + } + }, + "RightLeg": { + "rotation": { + "0.0": [-85, 10, -2.5], + "0.0417": [-86.76478, 9.63595, -2.40899], + "0.0833": [-86.13396, 8.91028, -2.22757], + "0.125": [-82.48886, 8.02568, -2.00642], + "0.1667": [-75.44945, 7.05544, -1.76386], + "0.2083": [-65.47628, 6.03828, -1.50957], + "0.25": [-54.14379, 5, -1.25], + "0.2917": [-43.25518, 3.96172, -0.99043], + "0.3333": [-33.85793, 2.94456, -0.73614], + "0.375": [-26.23036, 1.97432, -0.49358], + "0.4167": [-20.27168, 1.08972, -0.27243], + "0.4583": [-15.76726, 0.36405, -0.09101], + "0.5": [-12.5, 0, 0], + "0.5417": [-10.43169, 0.36405, -0.09101], + "0.5833": [-9.84808, 1.08972, -0.27243], + "0.625": [-11.11278, 1.97432, -0.49358], + "0.6667": [-14.67586, 2.94456, -0.73614], + "0.7083": [-21.00568, 3.96172, -0.99043], + "0.75": [-30.33669, 5, -1.25], + "0.7917": [-42.141, 6.03828, -1.50957], + "0.8333": [-54.74698, 7.05544, -1.76386], + "0.875": [-66.09556, 8.02568, -2.00642], + "0.9167": [-74.97268, 8.91028, -2.22757], + "0.9583": [-81.17628, 9.63595, -2.40899], + "1.0": [-85, 10, -2.5] + } + }, + "RightLowerLeg": { + "rotation": { + "0.0": [100, 0, 0], + "0.0417": [97.01765, 0, 0], + "0.0833": [92.51897, 0, 0], + "0.125": [86.09509, 0, 0], + "0.1667": [77.2918, 0, 0], + "0.2083": [65.85144, 0, 0], + "0.25": [52.32317, 0, 0], + "0.2917": [38.49073, 0, 0], + "0.3333": [26.35006, 0, 0], + "0.375": [16.76701, 0, 0], + "0.4167": [9.63099, 0, 0], + "0.4583": [4.51533, 0, 0], + "0.5": [1, 0, 0], + "0.5417": [-0.52752, 0, 0], + "0.5833": [1.01353, 0, 0], + "0.625": [6.4516, 0, 0], + "0.6667": [16.65209, 0, 0], + "0.7083": [31.91227, 0, 0], + "0.75": [50.68283, 0, 0], + "0.7917": [69.19536, 0, 0], + "0.8333": [83.97854, 0, 0], + "0.875": [93.87908, 0, 0], + "0.9167": [99.31139, 0, 0], + "0.9583": [101.09898, 0, 0], + "1.0": [100, 0, 0] + } + }, + "RightFoot": { + "rotation": { + "0.0": [-12.5, 0, 0], + "0.0417": [-12.1492, 0, 0], + "0.0833": [-10.98978, 0, 0], + "0.125": [-8.86073, 0, 0], + "0.1667": [-5.67416, 0, 0], + "0.2083": [-1.59925, 0, 0], + "0.25": [2.78073, 0, 0], + "0.2917": [6.69729, 0, 0], + "0.3333": [9.66671, 0, 0], + "0.375": [11.60119, 0, 0], + "0.4167": [12.61418, 0, 0], + "0.4583": [12.86543, 0, 0], + "0.5": [12.5, 0, 0], + "0.5417": [11.67587, 0, 0], + "0.5833": [10.4188, 0, 0], + "0.625": [8.63908, 0, 0], + "0.6667": [6.24763, 0, 0], + "0.7083": [3.20592, 0, 0], + "0.75": [-0.36238, 0, 0], + "0.7917": [-4.05549, 0, 0], + "0.8333": [-7.31677, 0, 0], + "0.875": [-9.7786, 0, 0], + "0.9167": [-11.38388, 0, 0], + "0.9583": [-12.24311, 0, 0], + "1.0": [-12.5, 0, 0] + } + } + } + }, + "ladder_stillness": { + "loop": true, + "animation_length": 1, + "bones": { + "Root": { + "position": { + "0.0": [1.7, 0, 0], + "0.0417": [1.7, 0, 0], + "0.0833": [1.7, 0, 0], + "0.125": [1.7, 0, 0], + "0.1667": [1.7, 0, 0], + "0.2083": [1.7, 0, 0], + "0.25": [1.7, 0, 0], + "0.2917": [1.7, 0, 0], + "0.3333": [1.7, 0, 0], + "0.375": [1.7, 0, 0], + "0.4167": [1.7, 0, 0], + "0.4583": [1.7, 0, 0], + "0.5": [1.7, 0, 0], + "0.5417": [1.7, 0, 0], + "0.5833": [1.7, 0, 0], + "0.625": [1.7, 0, 0], + "0.6667": [1.7, 0, 0], + "0.7083": [1.7, 0, 0], + "0.75": [1.7, 0, 0], + "0.7917": [1.7, 0, 0], + "0.8333": [1.7, 0, 0], + "0.875": [1.7, 0, 0], + "0.9167": [1.7, 0, 0], + "0.9583": [1.7, 0, 0], + "1.0": [1.7, 0, 0] + } + }, + "UpBody": { + "rotation": { + "0.0": [7.55, 0, -2.33], + "0.0417": [7.52, 0, -2.33], + "0.0833": [7.5, 0, -2.33], + "0.125": [7.5, 0, -2.33], + "0.1667": [7.53, 0, -2.33], + "0.2083": [7.57, 0, -2.33], + "0.25": [7.63, 0.01, -2.33], + "0.2917": [7.69, 0.01, -2.33], + "0.3333": [7.75, 0.01, -2.33], + "0.375": [7.81, 0.01, -2.33], + "0.4167": [7.87, 0.01, -2.33], + "0.4583": [7.93, 0.02, -2.33], + "0.5": [7.97, 0.02, -2.33], + "0.5417": [8, 0.02, -2.33], + "0.5833": [8, 0.02, -2.33], + "0.625": [7.98, 0.02, -2.33], + "0.6667": [7.95, 0.02, -2.33], + "0.7083": [7.91, 0.02, -2.33], + "0.75": [7.86, 0.01, -2.33], + "0.7917": [7.81, 0.01, -2.33], + "0.8333": [7.75, 0.01, -2.33], + "0.875": [7.69, 0.01, -2.33], + "0.9167": [7.64, 0.01, -2.33], + "0.9583": [7.59, 0, -2.33], + "1.0": [7.55, 0, -2.33] + } + }, + "Head": { + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } + }, + "LongHair": { + "rotation": { + "0.0": [39.6, 2.14, 3.38], + "0.0417": [39.6, 2.14, 3.38], + "0.0833": [39.6, 2.14, 3.38], + "0.125": [39.6, 2.14, 3.38], + "0.1667": [39.6, 2.14, 3.38], + "0.2083": [39.6, 2.14, 3.38], + "0.25": [39.6, 2.14, 3.38], + "0.2917": [39.6, 2.14, 3.38], + "0.3333": [39.6, 2.14, 3.38], + "0.375": [39.6, 2.14, 3.38], + "0.4167": [39.6, 2.14, 3.38], + "0.4583": [39.6, 2.14, 3.38], + "0.5": [39.6, 2.14, 3.38], + "0.5417": [39.6, 2.14, 3.38], + "0.5833": [39.6, 2.14, 3.38], + "0.625": [39.6, 2.14, 3.38], + "0.6667": [39.6, 2.14, 3.38], + "0.7083": [39.6, 2.14, 3.38], + "0.75": [39.6, 2.14, 3.38], + "0.7917": [39.6, 2.14, 3.38], + "0.8333": [39.6, 2.14, 3.38], + "0.875": [39.6, 2.14, 3.38], + "0.9167": [39.6, 2.14, 3.38], + "0.9583": [39.6, 2.14, 3.38], + "1.0": [39.6, 2.14, 3.38] + } + }, + "LeftArm": { + "rotation": { + "0.0": [-145.26, -21.27, 44.88], + "0.0417": [-145.23, -21.29, 44.87], + "0.0833": [-145.16, -21.32, 44.84], + "0.125": [-145.07, -21.35, 44.81], + "0.1667": [-144.97, -21.39, 44.78], + "0.2083": [-144.87, -21.44, 44.74], + "0.25": [-144.77, -21.48, 44.7], + "0.2917": [-144.67, -21.52, 44.66], + "0.3333": [-144.57, -21.56, 44.63], + "0.375": [-144.48, -21.6, 44.59], + "0.4167": [-144.39, -21.64, 44.56], + "0.4583": [-144.32, -21.67, 44.53], + "0.5": [-144.28, -21.68, 44.52], + "0.5417": [-144.32, -21.67, 44.53], + "0.5833": [-144.39, -21.64, 44.56], + "0.625": [-144.48, -21.6, 44.59], + "0.6667": [-144.57, -21.56, 44.63], + "0.7083": [-144.67, -21.52, 44.66], + "0.75": [-144.77, -21.48, 44.7], + "0.7917": [-144.87, -21.44, 44.74], + "0.8333": [-144.97, -21.39, 44.78], + "0.875": [-145.07, -21.35, 44.81], + "0.9167": [-145.16, -21.32, 44.84], + "0.9583": [-145.23, -21.29, 44.87], + "1.0": [-145.26, -21.27, 44.88] + } + }, + "LeftForeArm": { + "rotation": { + "0.0": [-7.24, -0.49, 36.83], + "0.0417": [-7.32, -0.48, 36.83], + "0.0833": [-7.48, -0.47, 36.82], + "0.125": [-7.68, -0.45, 36.82], + "0.1667": [-7.9, -0.43, 36.81], + "0.2083": [-8.12, -0.41, 36.8], + "0.25": [-8.36, -0.4, 36.8], + "0.2917": [-8.59, -0.38, 36.79], + "0.3333": [-8.82, -0.36, 36.78], + "0.375": [-9.03, -0.34, 36.77], + "0.4167": [-9.23, -0.33, 36.77], + "0.4583": [-9.39, -0.31, 36.76], + "0.5": [-9.48, -0.31, 36.76], + "0.5417": [-9.39, -0.31, 36.76], + "0.5833": [-9.23, -0.33, 36.77], + "0.625": [-9.03, -0.34, 36.77], + "0.6667": [-8.82, -0.36, 36.78], + "0.7083": [-8.59, -0.38, 36.79], + "0.75": [-8.36, -0.4, 36.8], + "0.7917": [-8.12, -0.41, 36.8], + "0.8333": [-7.9, -0.43, 36.81], + "0.875": [-7.68, -0.45, 36.82], + "0.9167": [-7.48, -0.47, 36.82], + "0.9583": [-7.32, -0.48, 36.83], + "1.0": [-7.24, -0.49, 36.83] + } + }, + "RightArm": { + "rotation": { + "0.0": [-44.99, 24.66, 4.66], + "0.0417": [-44.95, 24.65, 4.67], + "0.0833": [-44.87, 24.62, 4.69], + "0.125": [-44.78, 24.59, 4.73], + "0.1667": [-44.68, 24.56, 4.77], + "0.2083": [-44.58, 24.52, 4.82], + "0.25": [-44.47, 24.48, 4.87], + "0.2917": [-44.36, 24.45, 4.92], + "0.3333": [-44.26, 24.41, 4.96], + "0.375": [-44.16, 24.38, 5.01], + "0.4167": [-44.07, 24.35, 5.04], + "0.4583": [-43.99, 24.32, 5.07], + "0.5": [-43.96, 24.31, 5.08], + "0.5417": [-43.99, 24.32, 5.07], + "0.5833": [-44.07, 24.35, 5.04], + "0.625": [-44.16, 24.38, 5.01], + "0.6667": [-44.26, 24.41, 4.96], + "0.7083": [-44.36, 24.45, 4.92], + "0.75": [-44.47, 24.48, 4.87], + "0.7917": [-44.58, 24.52, 4.82], + "0.8333": [-44.68, 24.56, 4.77], + "0.875": [-44.78, 24.59, 4.73], + "0.9167": [-44.87, 24.62, 4.69], + "0.9583": [-44.95, 24.65, 4.67], + "1.0": [-44.99, 24.66, 4.66] + } + }, + "RightForeArm": { + "rotation": { + "0.0": [-82.16, -2.69, -33.25], + "0.0417": [-82.2, -2.75, -33.25], + "0.0833": [-82.31, -2.77, -33.25], + "0.125": [-82.48, -2.77, -33.25], + "0.1667": [-82.69, -2.76, -33.24], + "0.2083": [-82.92, -2.74, -33.24], + "0.25": [-83.16, -2.72, -33.23], + "0.2917": [-83.4, -2.7, -33.23], + "0.3333": [-83.63, -2.68, -33.22], + "0.375": [-83.83, -2.67, -33.22], + "0.4167": [-84, -2.67, -33.22], + "0.4583": [-84.11, -2.69, -33.21], + "0.5": [-84.16, -2.75, -33.21], + "0.5417": [-84.12, -2.81, -33.21], + "0.5833": [-84.01, -2.83, -33.22], + "0.625": [-83.84, -2.82, -33.22], + "0.6667": [-83.63, -2.79, -33.22], + "0.7083": [-83.4, -2.76, -33.23], + "0.75": [-83.16, -2.72, -33.23], + "0.7917": [-82.91, -2.68, -33.24], + "0.8333": [-82.68, -2.65, -33.24], + "0.875": [-82.48, -2.62, -33.25], + "0.9167": [-82.31, -2.61, -33.25], + "0.9583": [-82.2, -2.63, -33.25], + "1.0": [-82.16, -2.69, -33.25] + } + }, + "DownBody": { + "rotation": { + "0.0": [0, 0, 5], + "0.0417": [0, 0, 5], + "0.0833": [0, 0, 5], + "0.125": [0, 0, 5], + "0.1667": [0, 0, 5], + "0.2083": [0, 0, 5], + "0.25": [0, 0, 5], + "0.2917": [0, 0, 5], + "0.3333": [0, 0, 5], + "0.375": [0, 0, 5], + "0.4167": [0, 0, 5], + "0.4583": [0, 0, 5], + "0.5": [0, 0, 5], + "0.5417": [0, 0, 5], + "0.5833": [0, 0, 5], + "0.625": [0, 0, 5], + "0.6667": [0, 0, 5], + "0.7083": [0, 0, 5], + "0.75": [0, 0, 5], + "0.7917": [0, 0, 5], + "0.8333": [0, 0, 5], + "0.875": [0, 0, 5], + "0.9167": [0, 0, 5], + "0.9583": [0, 0, 5], + "1.0": [0, 0, 5] + } + }, + "LeftLeg": { + "rotation": { + "0.0": [-12.5, 0, 0], + "0.0417": [-12.5, 0, 0], + "0.0833": [-12.5, 0, 0], + "0.125": [-12.5, 0, 0], + "0.1667": [-12.5, 0, 0], + "0.2083": [-12.5, 0, 0], + "0.25": [-12.5, 0, 0], + "0.2917": [-12.5, 0, 0], + "0.3333": [-12.5, 0, 0], + "0.375": [-12.5, 0, 0], + "0.4167": [-12.5, 0, 0], + "0.4583": [-12.5, 0, 0], + "0.5": [-12.5, 0, 0], + "0.5417": [-12.5, 0, 0], + "0.5833": [-12.5, 0, 0], + "0.625": [-12.5, 0, 0], + "0.6667": [-12.5, 0, 0], + "0.7083": [-12.5, 0, 0], + "0.75": [-12.5, 0, 0], + "0.7917": [-12.5, 0, 0], + "0.8333": [-12.5, 0, 0], + "0.875": [-12.5, 0, 0], + "0.9167": [-12.5, 0, 0], + "0.9583": [-12.5, 0, 0], + "1.0": [-12.5, 0, 0] + } + }, + "LeftLowerLeg": { + "rotation": { + "0.0": [1, 0, 0], + "0.0417": [1, 0, 0], + "0.0833": [1, 0, 0], + "0.125": [1, 0, 0], + "0.1667": [1, 0, 0], + "0.2083": [1, 0, 0], + "0.25": [1, 0, 0], + "0.2917": [1, 0, 0], + "0.3333": [1, 0, 0], + "0.375": [1, 0, 0], + "0.4167": [1, 0, 0], + "0.4583": [1, 0, 0], + "0.5": [1, 0, 0], + "0.5417": [1, 0, 0], + "0.5833": [1, 0, 0], + "0.625": [1, 0, 0], + "0.6667": [1, 0, 0], + "0.7083": [1, 0, 0], + "0.75": [1, 0, 0], + "0.7917": [1, 0, 0], + "0.8333": [1, 0, 0], + "0.875": [1, 0, 0], + "0.9167": [1, 0, 0], + "0.9583": [1, 0, 0], + "1.0": [1, 0, 0] + } + }, + "LeftFoot": { + "rotation": { + "0.0": [12.5, 0, 0], + "0.0417": [12.5, 0, 0], + "0.0833": [12.5, 0, 0], + "0.125": [12.5, 0, 0], + "0.1667": [12.5, 0, 0], + "0.2083": [12.5, 0, 0], + "0.25": [12.5, 0, 0], + "0.2917": [12.5, 0, 0], + "0.3333": [12.5, 0, 0], + "0.375": [12.5, 0, 0], + "0.4167": [12.5, 0, 0], + "0.4583": [12.5, 0, 0], + "0.5": [12.5, 0, 0], + "0.5417": [12.5, 0, 0], + "0.5833": [12.5, 0, 0], + "0.625": [12.5, 0, 0], + "0.6667": [12.5, 0, 0], + "0.7083": [12.5, 0, 0], + "0.75": [12.5, 0, 0], + "0.7917": [12.5, 0, 0], + "0.8333": [12.5, 0, 0], + "0.875": [12.5, 0, 0], + "0.9167": [12.5, 0, 0], + "0.9583": [12.5, 0, 0], + "1.0": [12.5, 0, 0] + } + }, + "RightLeg": { + "rotation": { + "0.0": [-85, 10, -2.5], + "0.0417": [-85, 10, -2.5], + "0.0833": [-85, 10, -2.5], + "0.125": [-85, 10, -2.5], + "0.1667": [-85, 10, -2.5], + "0.2083": [-85, 10, -2.5], + "0.25": [-85, 10, -2.5], + "0.2917": [-85, 10, -2.5], + "0.3333": [-85, 10, -2.5], + "0.375": [-85, 10, -2.5], + "0.4167": [-85, 10, -2.5], + "0.4583": [-85, 10, -2.5], + "0.5": [-85, 10, -2.5], + "0.5417": [-85, 10, -2.5], + "0.5833": [-85, 10, -2.5], + "0.625": [-85, 10, -2.5], + "0.6667": [-85, 10, -2.5], + "0.7083": [-85, 10, -2.5], + "0.75": [-85, 10, -2.5], + "0.7917": [-85, 10, -2.5], + "0.8333": [-85, 10, -2.5], + "0.875": [-85, 10, -2.5], + "0.9167": [-85, 10, -2.5], + "0.9583": [-85, 10, -2.5], + "1.0": [-85, 10, -2.5] + } + }, + "RightLowerLeg": { + "rotation": { + "0.0": [100, 0, 0], + "0.0417": [100, 0, 0], + "0.0833": [100, 0, 0], + "0.125": [100, 0, 0], + "0.1667": [100, 0, 0], + "0.2083": [100, 0, 0], + "0.25": [100, 0, 0], + "0.2917": [100, 0, 0], + "0.3333": [100, 0, 0], + "0.375": [100, 0, 0], + "0.4167": [100, 0, 0], + "0.4583": [100, 0, 0], + "0.5": [100, 0, 0], + "0.5417": [100, 0, 0], + "0.5833": [100, 0, 0], + "0.625": [100, 0, 0], + "0.6667": [100, 0, 0], + "0.7083": [100, 0, 0], + "0.75": [100, 0, 0], + "0.7917": [100, 0, 0], + "0.8333": [100, 0, 0], + "0.875": [100, 0, 0], + "0.9167": [100, 0, 0], + "0.9583": [100, 0, 0], + "1.0": [100, 0, 0] + } + }, + "RightFoot": { + "rotation": { + "0.0": [-12.5, 0, 0], + "0.0417": [-12.5, 0, 0], + "0.0833": [-12.5, 0, 0], + "0.125": [-12.5, 0, 0], + "0.1667": [-12.5, 0, 0], + "0.2083": [-12.5, 0, 0], + "0.25": [-12.5, 0, 0], + "0.2917": [-12.5, 0, 0], + "0.3333": [-12.5, 0, 0], + "0.375": [-12.5, 0, 0], + "0.4167": [-12.5, 0, 0], + "0.4583": [-12.5, 0, 0], + "0.5": [-12.5, 0, 0], + "0.5417": [-12.5, 0, 0], + "0.5833": [-12.5, 0, 0], + "0.625": [-12.5, 0, 0], + "0.6667": [-12.5, 0, 0], + "0.7083": [-12.5, 0, 0], + "0.75": [-12.5, 0, 0], + "0.7917": [-12.5, 0, 0], + "0.8333": [-12.5, 0, 0], + "0.875": [-12.5, 0, 0], + "0.9167": [-12.5, 0, 0], + "0.9583": [-12.5, 0, 0], + "1.0": [-12.5, 0, 0] + } + } + } + }, + "ladder_down": { + "loop": true, + "animation_length": 1, + "bones": { + "Root": { + "position": { + "0.0": [1.7, 0, 0], + "0.0417": [1.7, -0.01, 0], + "0.0833": [1.7, -0.02, 0], + "0.125": [1.7, -0.05, 0], + "0.1667": [1.7, -0.08, 0], + "0.2083": [1.7, -0.11, 0], + "0.25": [1.7, -0.15, 0], + "0.2917": [1.7, -0.19, 0], + "0.3333": [1.7, -0.22, 0], + "0.375": [1.7, -0.25, 0], + "0.4167": [1.7, -0.28, 0], + "0.4583": [1.7, -0.29, 0], + "0.5": [1.7, -0.3, 0], + "0.5417": [1.7, -0.3, 0], + "0.5833": [1.7, -0.28, 0], + "0.625": [1.7, -0.26, 0], + "0.6667": [1.7, -0.23, 0], + "0.7083": [1.7, -0.19, 0], + "0.75": [1.7, -0.15, 0], + "0.7917": [1.7, -0.11, 0], + "0.8333": [1.7, -0.07, 0], + "0.875": [1.7, -0.04, 0], + "0.9167": [1.7, -0.02, 0], + "0.9583": [1.7, 0, 0], + "1.0": [1.7, 0, 0] + } + }, + "UpBody": { + "rotation": { + "0.0": [7.5, 0, 0], + "0.0417": [7.52, 0, 0], + "0.0833": [7.55, 0, 0], + "0.125": [7.6, 0, 0], + "0.1667": [7.65, 0, 0], + "0.2083": [7.7, 0, 0], + "0.25": [7.75, 0, 0], + "0.2917": [7.8, 0, 0], + "0.3333": [7.85, 0, 0], + "0.375": [7.9, 0, 0], + "0.4167": [7.95, 0, 0], + "0.4583": [7.98, 0, 0], + "0.5": [8, 0, 0], + "0.5417": [7.98, 0, 0], + "0.5833": [7.95, 0, 0], + "0.625": [7.9, 0, 0], + "0.6667": [7.85, 0, 0], + "0.7083": [7.8, 0, 0], + "0.75": [7.75, 0, 0], + "0.7917": [7.7, 0, 0], + "0.8333": [7.65, 0, 0], + "0.875": [7.6, 0, 0], + "0.9167": [7.55, 0, 0], + "0.9583": [7.52, 0, 0], + "1.0": [7.5, 0, 0] + } + }, + "Head": { + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } + }, + "LongHair": { + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } + }, + "LeftArm": { + "rotation": { + "0.0": [-45.26, -24.76, -4.39], + "0.0417": [-45.11, -24.71, -4.46], + "0.0833": [-45.02, -24.67, -4.55], + "0.125": [-44.99, -24.66, -4.66], + "0.1667": [-45.02, -24.67, -4.74], + "0.2083": [-45.11, -24.71, -4.76], + "0.25": [-45.26, -24.76, -4.72], + "0.2917": [-45.45, -24.83, -4.61], + "0.3333": [-45.66, -24.91, -4.46], + "0.375": [-45.88, -24.99, -4.28], + "0.4167": [-46.1, -25.07, -4.1], + "0.4583": [-46.31, -25.15, -3.94], + "0.5": [-46.5, -25.22, -3.84], + "0.5417": [-46.64, -25.27, -3.8], + "0.5833": [-46.74, -25.31, -3.82], + "0.625": [-46.77, -25.32, -3.9], + "0.6667": [-46.74, -25.31, -4.01], + "0.7083": [-46.64, -25.27, -4.1], + "0.75": [-46.5, -25.22, -4.17], + "0.7917": [-46.31, -25.15, -4.22], + "0.8333": [-46.1, -25.07, -4.25], + "0.875": [-45.88, -24.99, -4.28], + "0.9167": [-45.66, -24.91, -4.31], + "0.9583": [-45.45, -24.83, -4.34], + "1.0": [-45.26, -24.76, -4.39] + } + }, + "LeftForeArm": { + "rotation": { + "0.0": [-49.66, 2.69, 33.25], + "0.0417": [-49.68, 2.74, 33.25], + "0.0833": [-49.88, 2.77, 33.24], + "0.125": [-50.19, 2.76, 33.23], + "0.1667": [-50.59, 2.75, 33.21], + "0.2083": [-51.05, 2.72, 33.19], + "0.25": [-51.53, 2.69, 33.17], + "0.2917": [-52.02, 2.66, 33.14], + "0.3333": [-52.48, 2.64, 33.12], + "0.375": [-52.88, 2.62, 33.1], + "0.4167": [-53.19, 2.62, 33.09], + "0.4583": [-53.39, 2.64, 33.08], + "0.5": [-53.41, 2.7, 33.08], + "0.5417": [-53.28, 2.76, 33.08], + "0.5833": [-53.04, 2.78, 33.09], + "0.625": [-52.72, 2.77, 33.1], + "0.6667": [-52.36, 2.75, 33.12], + "0.7083": [-51.95, 2.72, 33.14], + "0.75": [-51.53, 2.69, 33.17], + "0.7917": [-51.12, 2.66, 33.19], + "0.8333": [-50.71, 2.63, 33.21], + "0.875": [-50.35, 2.61, 33.23], + "0.9167": [-50.03, 2.61, 33.24], + "0.9583": [-49.79, 2.63, 33.25], + "1.0": [-49.66, 2.69, 33.25] + } + }, + "RightArm": { + "rotation": { + "0.0": [-45.26, 24.76, 4.39], + "0.0417": [-45.11, 24.71, 4.46], + "0.0833": [-45.02, 24.67, 4.55], + "0.125": [-44.99, 24.66, 4.66], + "0.1667": [-45.02, 24.67, 4.74], + "0.2083": [-45.11, 24.71, 4.76], + "0.25": [-45.26, 24.76, 4.72], + "0.2917": [-45.45, 24.83, 4.61], + "0.3333": [-45.66, 24.91, 4.46], + "0.375": [-45.88, 24.99, 4.28], + "0.4167": [-46.1, 25.07, 4.1], + "0.4583": [-46.31, 25.15, 3.94], + "0.5": [-46.5, 25.22, 3.84], + "0.5417": [-46.64, 25.27, 3.8], + "0.5833": [-46.74, 25.31, 3.82], + "0.625": [-46.77, 25.32, 3.9], + "0.6667": [-46.74, 25.31, 4.01], + "0.7083": [-46.64, 25.27, 4.1], + "0.75": [-46.5, 25.22, 4.17], + "0.7917": [-46.31, 25.15, 4.22], + "0.8333": [-46.1, 25.07, 4.25], + "0.875": [-45.88, 24.99, 4.28], + "0.9167": [-45.66, 24.91, 4.31], + "0.9583": [-45.45, 24.83, 4.34], + "1.0": [-45.26, 24.76, 4.39] + } + }, + "RightForeArm": { + "rotation": { + "0.0": [-49.66, -2.69, -33.25], + "0.0417": [-49.68, -2.74, -33.25], + "0.0833": [-49.88, -2.77, -33.24], + "0.125": [-50.19, -2.76, -33.23], + "0.1667": [-50.59, -2.75, -33.21], + "0.2083": [-51.05, -2.72, -33.19], + "0.25": [-51.53, -2.69, -33.17], + "0.2917": [-52.02, -2.66, -33.14], + "0.3333": [-52.48, -2.64, -33.12], + "0.375": [-52.88, -2.62, -33.1], + "0.4167": [-53.19, -2.62, -33.09], + "0.4583": [-53.39, -2.64, -33.08], + "0.5": [-53.41, -2.7, -33.08], + "0.5417": [-53.28, -2.76, -33.08], + "0.5833": [-53.04, -2.78, -33.09], + "0.625": [-52.72, -2.77, -33.1], + "0.6667": [-52.36, -2.75, -33.12], + "0.7083": [-51.95, -2.72, -33.14], + "0.75": [-51.53, -2.69, -33.17], + "0.7917": [-51.12, -2.66, -33.19], + "0.8333": [-50.71, -2.63, -33.21], + "0.875": [-50.35, -2.61, -33.23], + "0.9167": [-50.03, -2.61, -33.24], + "0.9583": [-49.79, -2.63, -33.25], + "1.0": [-49.66, -2.69, -33.25] + } + }, + "DownBody": { + "rotation": { + "0.0": [0, 0, 0], + "0.0417": [0, 0, 0], + "0.0833": [0, 0, 0], + "0.125": [0, 0, 0], + "0.1667": [0, 0, 0], + "0.2083": [0, 0, 0], + "0.25": [0, 0, 0], + "0.2917": [0, 0, 0], + "0.3333": [0, 0, 0], + "0.375": [0, 0, 0], + "0.4167": [0, 0, 0], + "0.4583": [0, 0, 0], + "0.5": [0, 0, 0], + "0.5417": [0, 0, 0], + "0.5833": [0, 0, 0], + "0.625": [0, 0, 0], + "0.6667": [0, 0, 0], + "0.7083": [0, 0, 0], + "0.75": [0, 0, 0], + "0.7917": [0, 0, 0], + "0.8333": [0, 0, 0], + "0.875": [0, 0, 0], + "0.9167": [0, 0, 0], + "0.9583": [0, 0, 0], + "1.0": [0, 0, 0] + } + }, + "LeftLeg": { + "rotation": { + "0.0": [-54.72, -9.68, -12.44], + "0.0417": [-54.87, -9.71, -12.42], + "0.0833": [-55, -9.74, -12.39], + "0.125": [-55.11, -9.76, -12.38], + "0.1667": [-55.16, -9.78, -12.37], + "0.2083": [-55.11, -9.76, -12.38], + "0.25": [-55, -9.74, -12.39], + "0.2917": [-54.87, -9.71, -12.42], + "0.3333": [-54.72, -9.68, -12.44], + "0.375": [-54.57, -9.65, -12.47], + "0.4167": [-54.42, -9.62, -12.49], + "0.4583": [-54.26, -9.58, -12.52], + "0.5": [-54.11, -9.55, -12.54], + "0.5417": [-53.97, -9.52, -12.57], + "0.5833": [-53.84, -9.49, -12.59], + "0.625": [-53.73, -9.47, -12.61], + "0.6667": [-53.67, -9.46, -12.62], + "0.7083": [-53.73, -9.47, -12.61], + "0.75": [-53.84, -9.49, -12.59], + "0.7917": [-53.97, -9.52, -12.57], + "0.8333": [-54.11, -9.55, -12.54], + "0.875": [-54.26, -9.58, -12.52], + "0.9167": [-54.42, -9.62, -12.49], + "0.9583": [-54.57, -9.65, -12.47], + "1.0": [-54.72, -9.68, -12.44] + } + }, + "LeftLowerLeg": { + "rotation": { + "0.0": [60, 0, 0], + "0.0417": [59.93, 0, 0], + "0.0833": [59.78, 0, 0], + "0.125": [59.61, 0, 0], + "0.1667": [59.41, 0, 0], + "0.2083": [59.21, 0, 0], + "0.25": [59, 0, 0], + "0.2917": [58.79, 0, 0], + "0.3333": [58.59, 0, 0], + "0.375": [58.39, 0, 0], + "0.4167": [58.22, 0, 0], + "0.4583": [58.07, 0, 0], + "0.5": [58, 0, 0], + "0.5417": [58.07, 0, 0], + "0.5833": [58.22, 0, 0], + "0.625": [58.39, 0, 0], + "0.6667": [58.59, 0, 0], + "0.7083": [58.79, 0, 0], + "0.75": [59, 0, 0], + "0.7917": [59.21, 0, 0], + "0.8333": [59.41, 0, 0], + "0.875": [59.61, 0, 0], + "0.9167": [59.78, 0, 0], + "0.9583": [59.93, 0, 0], + "1.0": [60, 0, 0] + } + }, + "LeftFoot": { + "rotation": { + "0.0": [-27.32, -2.29, 12.06], + "0.0417": [-27.32, -2.29, 12.06], + "0.0833": [-27.32, -2.29, 12.06], + "0.125": [-27.32, -2.29, 12.06], + "0.1667": [-27.32, -2.29, 12.06], + "0.2083": [-27.32, -2.29, 12.06], + "0.25": [-27.32, -2.29, 12.06], + "0.2917": [-27.32, -2.29, 12.06], + "0.3333": [-27.32, -2.29, 12.06], + "0.375": [-27.32, -2.29, 12.06], + "0.4167": [-27.32, -2.29, 12.06], + "0.4583": [-27.32, -2.29, 12.06], + "0.5": [-27.32, -2.29, 12.06], + "0.5417": [-27.32, -2.29, 12.06], + "0.5833": [-27.32, -2.29, 12.06], + "0.625": [-27.32, -2.29, 12.06], + "0.6667": [-27.32, -2.29, 12.06], + "0.7083": [-27.32, -2.29, 12.06], + "0.75": [-27.32, -2.29, 12.06], + "0.7917": [-27.32, -2.29, 12.06], + "0.8333": [-27.32, -2.29, 12.06], + "0.875": [-27.32, -2.29, 12.06], + "0.9167": [-27.32, -2.29, 12.06], + "0.9583": [-27.32, -2.29, 12.06], + "1.0": [-27.32, -2.29, 12.06] + } + }, + "RightLeg": { + "rotation": { + "0.0": [-54.72, 9.68, 12.44], + "0.0417": [-54.87, 9.71, 12.42], + "0.0833": [-55, 9.74, 12.39], + "0.125": [-55.11, 9.76, 12.38], + "0.1667": [-55.16, 9.78, 12.37], + "0.2083": [-55.11, 9.76, 12.38], + "0.25": [-55, 9.74, 12.39], + "0.2917": [-54.87, 9.71, 12.42], + "0.3333": [-54.72, 9.68, 12.44], + "0.375": [-54.57, 9.65, 12.47], + "0.4167": [-54.42, 9.62, 12.49], + "0.4583": [-54.26, 9.58, 12.52], + "0.5": [-54.11, 9.55, 12.54], + "0.5417": [-53.97, 9.52, 12.57], + "0.5833": [-53.84, 9.49, 12.59], + "0.625": [-53.73, 9.47, 12.61], + "0.6667": [-53.67, 9.46, 12.62], + "0.7083": [-53.73, 9.47, 12.61], + "0.75": [-53.84, 9.49, 12.59], + "0.7917": [-53.97, 9.52, 12.57], + "0.8333": [-54.11, 9.55, 12.54], + "0.875": [-54.26, 9.58, 12.52], + "0.9167": [-54.42, 9.62, 12.49], + "0.9583": [-54.57, 9.65, 12.47], + "1.0": [-54.72, 9.68, 12.44] + } + }, + "RightLowerLeg": { + "rotation": { + "0.0": [60, 0, 0], + "0.0417": [59.93, 0, 0], + "0.0833": [59.78, 0, 0], + "0.125": [59.61, 0, 0], + "0.1667": [59.41, 0, 0], + "0.2083": [59.21, 0, 0], + "0.25": [59, 0, 0], + "0.2917": [58.79, 0, 0], + "0.3333": [58.59, 0, 0], + "0.375": [58.39, 0, 0], + "0.4167": [58.22, 0, 0], + "0.4583": [58.07, 0, 0], + "0.5": [58, 0, 0], + "0.5417": [58.07, 0, 0], + "0.5833": [58.22, 0, 0], + "0.625": [58.39, 0, 0], + "0.6667": [58.59, 0, 0], + "0.7083": [58.79, 0, 0], + "0.75": [59, 0, 0], + "0.7917": [59.21, 0, 0], + "0.8333": [59.41, 0, 0], + "0.875": [59.61, 0, 0], + "0.9167": [59.78, 0, 0], + "0.9583": [59.93, 0, 0], + "1.0": [60, 0, 0] + } + }, + "RightFoot": { + "rotation": { + "0.0": [-27.32, 2.29, -12.06], + "0.0417": [-27.32, 2.29, -12.06], + "0.0833": [-27.32, 2.29, -12.06], + "0.125": [-27.32, 2.29, -12.06], + "0.1667": [-27.32, 2.29, -12.06], + "0.2083": [-27.32, 2.29, -12.06], + "0.25": [-27.32, 2.29, -12.06], + "0.2917": [-27.32, 2.29, -12.06], + "0.3333": [-27.32, 2.29, -12.06], + "0.375": [-27.32, 2.29, -12.06], + "0.4167": [-27.32, 2.29, -12.06], + "0.4583": [-27.32, 2.29, -12.06], + "0.5": [-27.32, 2.29, -12.06], + "0.5417": [-27.32, 2.29, -12.06], + "0.5833": [-27.32, 2.29, -12.06], + "0.625": [-27.32, 2.29, -12.06], + "0.6667": [-27.32, 2.29, -12.06], + "0.7083": [-27.32, 2.29, -12.06], + "0.75": [-27.32, 2.29, -12.06], + "0.7917": [-27.32, 2.29, -12.06], + "0.8333": [-27.32, 2.29, -12.06], + "0.875": [-27.32, 2.29, -12.06], + "0.9167": [-27.32, 2.29, -12.06], + "0.9583": [-27.32, 2.29, -12.06], + "1.0": [-27.32, 2.29, -12.06] + } + } + } + }, "parallel0": { "loop": true, "animation_length": 0.375, diff --git a/src/main/resources/assets/touhou_little_maid/lang/en_us.json b/src/main/resources/assets/touhou_little_maid/lang/en_us.json index ee9261383..68ff4a88f 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/en_us.json +++ b/src/main/resources/assets/touhou_little_maid/lang/en_us.json @@ -191,6 +191,37 @@ "block.touhou_little_maid.cchess": "Xiangqi (Chinese Chess)", "block.touhou_little_maid.wchess": "Chess", "block.touhou_little_maid.scarecrow": "Granite Inari Fox", + "entity.touhou_little_maid.maid.tip": "Tame a maid with a cake and you are able to assist them with their tasks you choose. Look in Memorizable Gensokyo to learn more about it.", + "entity.touhou_little_maid.fairy.tip": "Flies and shoots danmaku at you. Drops power points when killed.", + "entity.touhou_little_maid.broom.tip": "Requires a maid mounted on a broom in order to fly across the sky. Be advised some flying hostile mobs will still reach you such as Maid Fairies or Phantoms.", + "item.touhou_little_maid.power_point.tip": "Power Points are found in loots, throw it to recieve power points.", + "item.touhou_little_maid.broom.tip": "Requires a maid mounted on a broom in order to fly across the sky. Be advised some flying hostile mobs will still reach you such as Maid Fairies or Phantoms.", + "item.touhou_little_maid.maid_backpack_small.tip": "Expands your maid's inventory slots up to 12.", + "item.touhou_little_maid.maid_backpack_middle.tip": "Expands your maid's inventory slots up to 24.", + "item.touhou_little_maid.maid_backpack_big.tip": "Expands your maid's inventory slots up to 36.", + "item.touhou_little_maid.explosion_protect_bauble.tip": "Gives maid resistence to explosion damage.", + "item.touhou_little_maid.fall_protect_bauble.tip": "Gives maid resistence to fall damage.", + "item.touhou_little_maid.drown_protect_bauble.tip": "Gives maid resistence to drown damage.", + "item.touhou_little_maid.fire_protect_bauble.tip": "Gives maid resistence to burning damage.", + "item.touhou_little_maid.projectile_protect_bauble.tip": "Gives maid resistence to projectiles.", + "item.touhou_little_maid.magic_protect_bauble.tip": "Gives maid resistence to effects.", + "item.touhou_little_maid.item_magnet_bauble.tip": "Extends the maid's pickup range.", + "item.touhou_little_maid.mute_bauble.tip": "Silence your maid if you're not a fan of their frequent talking.", + "item.touhou_little_maid.nimble_fabric.tip": "Gives maid the ability to dodge incoming projectile by teleporting.", + "item.touhou_little_maid.crafting_table_backpack.tip": "Expands your maid's inventory slots up to 18, making your maid a portable Crafting Table.", + "item.touhou_little_maid.furnace_backpack.tip": "Expands your maid's inventory slots up to 18, making your maid a portable Furnace.", + "item.touhou_little_maid.hakurei_gohei.tip": "A gohei used for creating an altar after you constructed it. Maids holding this gohei allows them to shoot danmaku at hostile monsters.", + "item.touhou_little_maid.sanae_gohei.tip": "A gohei used for creating an altar after you constructed it. Maids holding this gohei allows them to shoot danmaku at hostile monsters.", + "item.touhou_little_maid.film.tip": "Your maid is deceased. to revive it, Place it in the altar along with Gold Ingot, Iron Ingot, Lapis Lazuli, Coal, and Redstone on each pillar, or place it in the Shrine", + "item.touhou_little_maid.wireless_io.tip": "Gap is configurable to send items from chest to maid, vice versa.", + "item.touhou_little_maid.picnic_basket.tip": "Maids up to four will enjoy picnic when their time is idle. Be sure to load this basket with food. This increases favorability to your maids.", + "block.touhou_little_maid.gomoku.tip": "Challenge your maid to a Gomoku board game, are you able to outsmart your maid on this board game?", + "block.touhou_little_maid.maid_bed.tip": "Maids rest on this bed when it's time to rest. This increases favorability to your maid.", + "block.touhou_little_maid.shrine.tip": "Shrines are found in any loot chest at a rare rate, this can be used for ressurecting your maid, and will reduce your health to one.", + "block.touhou_little_maid.computer.tip": "This brings joy to increases favorability to your maid.", + "block.touhou_little_maid.keyboard.tip": "This brings joy to increases favorability to your maid.", + "block.touhou_little_maid.bookshelf.tip": "This brings joy to increases favorability to your maid.", + "block.touhou_little_maid.scarecrow.tip": "Placed on the ground, it prevents the fairy maid from spawning in a square area.", "tooltips.touhou_little_maid.chair.place.desc": "Right click on the top of the block to place it.", "tooltips.touhou_little_maid.chair.destroy.desc": "Shift left hit can destroy it.", "tooltips.touhou_little_maid.chair.gui.desc": "Shift right click can open skin gui.", @@ -368,6 +399,7 @@ "gui.touhou_little_maid.maid_config.pick_type": "Pickup Type", "gui.touhou_little_maid.maid_config.open_door": "Open Door", "gui.touhou_little_maid.maid_config.open_fence_gate": "Open Fence Gate", + "gui.touhou_little_maid.maid_config.active_climbing": "Can Active Climbing", "gui.touhou_little_maid.maid_config.value.true": "ON", "gui.touhou_little_maid.maid_config.value.false": "OFF", "gui.touhou_little_maid.maid_config.value.item": "Item", @@ -411,6 +443,7 @@ "message.touhou_little_maid.missing_patchouli.title": "[TLM]", "message.touhou_little_maid.missing_patchouli.click_here": "Click Here To Install Patchouli Mod To Get The Manual", "message.touhou_little_maid.missing_patchouli.url": "https://www.curseforge.com/minecraft/mc-mods/patchouli", + "message.touhou_little_maid.reload.tip": "[TLM] Model loading time: %.2f ms", "message.touhou_little_maid.change_model.disabled": "Model switch is disabled.", "message.touhou_little_maid.extinguisher.player_cannot_use": "Your lack of knowledge does not know how to use this item", "message.touhou_little_maid.altar.not_enough_power": "You don't have enough power.", @@ -467,7 +500,7 @@ "message.touhou_little_maid.wchess.move_limit": "Draw by 50-Move Rule!", "message.touhou_little_maid.wchess.reset": "Right click on the light yellow area on either side to reset", "message.touhou_little_maid.entity_id_copy.copy": "The id of the entity has been copied: %s", - "commands.touhou_little_maid.pack.reload.info": "All model pack have been reloaded!", + "commands.touhou_little_maid.pack.reload.start": "All model packages start to be reloaded...", "commands.touhou_little_maid.power.handle.info": "%d players's power point is changed", "commands.touhou_little_maid.maid_num.handle.info": "%d players's maid num is changed", "commands.touhou_little_maid.power.get.info": "%s: %.2f", @@ -489,6 +522,14 @@ "config.touhou_little_maid.maid.maid_sleep_range.tooltip": "The max range of maid sleep mode", "config.touhou_little_maid.maid.maid_non_home_range": "Maid Non-Home Range", "config.touhou_little_maid.maid.maid_non_home_range.tooltip": "The max range of maid's Non-Home mode", + "config.touhou_little_maid.maid.bow_range": "Maid Bow Range", + "config.touhou_little_maid.maid.bow_range.tooltip": "The max range of maid's bow attack", + "config.touhou_little_maid.maid.cross_bow_range": "Maid Crossbow Range", + "config.touhou_little_maid.maid.cross_bow_range.tooltip": "The max range of maid's crossbow attack", + "config.touhou_little_maid.maid.danmaku_range": "Maid Danmaku Range", + "config.touhou_little_maid.maid.danmaku_range.tooltip": "The max range of maid's danmaku attack", + "config.touhou_little_maid.maid.trident_range": "Maid Trident Range", + "config.touhou_little_maid.maid.trident_range.tooltip": "The max range of maid's trident attack", "config.touhou_little_maid.maid.feed_animal_max_number": "Max Number of Animals", "config.touhou_little_maid.maid.feed_animal_max_number.tooltip": "The max number of animals around when the maid breeds animals", "config.touhou_little_maid.maid.maid_change_model": "Maid Change Model", @@ -565,6 +606,7 @@ "task.touhou_little_maid.ranged_attack": "Bow", "task.touhou_little_maid.crossbow_attack": "Crossbow", "task.touhou_little_maid.danmaku_attack": "Danmaku", + "task.touhou_little_maid.trident_attack": "Trident", "task.touhou_little_maid.farm": "Farm", "task.touhou_little_maid.sugar_cane": "Sugarcane", "task.touhou_little_maid.melon": "Melon", @@ -596,6 +638,8 @@ "task.touhou_little_maid.crossbow_attack.condition.has_ammunition": "Have a arrow in inventory or a firework in offhand", "task.touhou_little_maid.danmaku_attack.desc": "Maid will use danmaku to attack surrounding hostile mobs", "task.touhou_little_maid.danmaku_attack.condition.has_gohei": "Mainhand holds a hakurei's gohei", + "task.touhou_little_maid.trident_attack.desc": "Maid will use trident to attack surrounding hostile mobs", + "task.touhou_little_maid.trident_attack.condition.has_trident": "Mainhand holds a trident", "task.touhou_little_maid.farm.desc": "Maid will plant or harvest normal crops around", "task.touhou_little_maid.sugar_cane.desc": "Maid will plant or harvest sugar cane around", "task.touhou_little_maid.melon.desc": "Maid will harvest melon around", @@ -626,7 +670,8 @@ "button.touhou_little_maid.maid.mode.idle": "Idle", "button.touhou_little_maid.maid.mode.attack": "Attack", "button.touhou_little_maid.maid.mode.range_attack": "Range Attack", - "button.touhou_little_maid.maid.mode.danmaku_attack": "Danmaku Sttack", + "button.touhou_little_maid.maid.mode.danmaku_attack": "Danmaku Attack", + "button.touhou_little_maid.maid.mode.trident_attack": "Trident Attack", "button.touhou_little_maid.maid.mode.farm": "Farm", "button.touhou_little_maid.maid.mode.feed": "Feed", "button.touhou_little_maid.maid.mode.shears": "Shears", @@ -658,7 +703,8 @@ "subtitle.touhou_little_maid.maid.mode.idle": "Maid Idle Sound", "subtitle.touhou_little_maid.maid.mode.attack": "Maid Attack Sound", "subtitle.touhou_little_maid.maid.mode.range_attack": "Maid Range Attack Sound", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid Danmaku Sttack Sound", + "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid Danmaku Attack Sound", + "subtitle.touhou_little_maid.maid.mode.trident_attack": "Maid Trident Attack Sound", "subtitle.touhou_little_maid.maid.mode.farm": "Maid Farm Sound", "subtitle.touhou_little_maid.maid.mode.feed": "Maid Feed Sound", "subtitle.touhou_little_maid.maid.mode.shears": "Maid Shears Sound", diff --git a/src/main/resources/assets/touhou_little_maid/lang/es_es.json b/src/main/resources/assets/touhou_little_maid/lang/es_es.json index 103f069ed..594b33ae1 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/es_es.json +++ b/src/main/resources/assets/touhou_little_maid/lang/es_es.json @@ -1,4 +1,112 @@ { + "advancements.touhou_little_maid.base.craft_gohei.description": "Fabrica un gohei", + "advancements.touhou_little_maid.base.craft_gohei.title": "¿La clave de Gensou?", + "advancements.touhou_little_maid.base.build_altar.description": "Construye un altar, y deja que comience la diversión", + "advancements.touhou_little_maid.base.build_altar.title": "Construcción completada", + "advancements.touhou_little_maid.base.change_chair_model.description": "Cambia la skin de la silla", + "advancements.touhou_little_maid.base.change_chair_model.title": "Asientos diferentes", + "advancements.touhou_little_maid.base.change_maid_model.description": "Cambia la skin de la Maid", + "advancements.touhou_little_maid.base.change_maid_model.title": "¡Cosplay!", + "advancements.touhou_little_maid.base.change_maid_sound.description": "Cambia los sonidos de la Maid", + "advancements.touhou_little_maid.base.change_maid_sound.title": "Actuación de voz", + "advancements.touhou_little_maid.base.craft_chair.description": "Craftea una silla", + "advancements.touhou_little_maid.base.craft_chair.title": "Reiner, siéntate", + "advancements.touhou_little_maid.base.kill_maid_fairy.description": "Mata una hada maid", + "advancements.touhou_little_maid.base.kill_maid_fairy.title": "Pequeñas haditas molestas", + "advancements.touhou_little_maid.base.pickup_power_point.description": "Recoger el punto de energía", + "advancements.touhou_little_maid.base.pickup_power_point.title": "Prueba el arcoiris", + "advancements.touhou_little_maid.base.spawn_maid.description": "Invoca a una maid desde el altar", + "advancements.touhou_little_maid.base.spawn_maid.title": "Una nueva vida", + "advancements.touhou_little_maid.base.tamed_maid.description": "Domestica a una Maid con un pastel, sé que les encantan los dulces", + "advancements.touhou_little_maid.base.tamed_maid.title": "Bienvenido a casa, maestro", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.description": "Viste a tu Maid con una armadura de Netherita completa", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.title": "Bofuri", + "advancements.touhou_little_maid.challenge.any_equipment.description": "Viste a tu maid con cualquier armadura", + "advancements.touhou_little_maid.challenge.any_equipment.title": "A prepararse", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "Alimenta a tu Maid con una manzana de oro encantada", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.title": "Buena Manzana", + "advancements.touhou_little_maid.challenge.kill_100.description": "La Maid elimina a 100 enemigos", + "advancements.touhou_little_maid.challenge.kill_100.title": "Cazadora Lunática", + "advancements.touhou_little_maid.challenge.kill_wither.description": "La Maid mata a un Wither", + "advancements.touhou_little_maid.challenge.kill_wither.title": "Asesina de Wither", + "advancements.touhou_little_maid.challenge.kill_dragon.description": "La maid elimina al dragón del end", + "advancements.touhou_little_maid.challenge.kill_dragon.title": "Y se fue con una explosión", + "advancements.touhou_little_maid.challenge.kill_slime_300.description": "La maid elimina a 300 slimes, sean regulares o cubos de magma", + "advancements.touhou_little_maid.challenge.kill_slime_300.title": "Bienes pegajosos", + "advancements.touhou_little_maid.challenge.lightning_bolt.description": "Invoca un relámpago desde un altar, y deja que el relámpago golpee a la maid", + "advancements.touhou_little_maid.challenge.lightning_bolt.title": "¡Tojiko está furiosa!", + "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "La Maid alcanza los 100 PV", + "advancements.touhou_little_maid.challenge.maid_100_healthy.title": "Saludable al 100%", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "La maid pescó y capturó un libro encantado", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.title": "Vamos a ser carretealistas", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.description": "Domestica a una maid desde el puesto de saqueo", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.title": "¡Rescatada una princesa!", + "advancements.touhou_little_maid.favorability.favorability_increased.description": "Aumenta la favorabilidad de tu maid", + "advancements.touhou_little_maid.favorability.favorability_increased.title": "Un gran poder...", + "advancements.touhou_little_maid.favorability.favorability_increased_max.description": "Maximiza la favorabilidad de tu maid", + "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "¡Conlleva una gran responsabilidad!", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "Las maids comen comida en el picnic", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "Un buen momento juntos", + "advancements.touhou_little_maid.favorability.maid_sit_joy.description": "Tu maid se sienta en cualquier bloque de alegría", + "advancements.touhou_little_maid.favorability.maid_sit_joy.title": "Un lugar cómodo", + "advancements.touhou_little_maid.favorability.maid_sleep.description": "La maid duerme en la cama", + "advancements.touhou_little_maid.favorability.maid_sleep.title": "No dejes que los chinches de cama muerdan", + "advancements.touhou_little_maid.favorability.win_cchess.description": "Gana una partida de Xiangqi con tu Maid", + "advancements.touhou_little_maid.favorability.win_cchess.title": "¡Maestro del Ajedrez!", + "advancements.touhou_little_maid.favorability.win_wchess.description": "Gana una partida de Ajedrez con tu Maid", + "advancements.touhou_little_maid.favorability.win_wchess.title": "¡Jaque mate!", + "advancements.touhou_little_maid.favorability.win_gomoku.description": "Gana una partida de Gomoku con tu Maid", + "advancements.touhou_little_maid.favorability.win_gomoku.title": "¡Cinco en una fila!", + "advancements.touhou_little_maid.maid_base.chisel_statue.description": "Cincela una estatua a partir de un bloque de arcilla", + "advancements.touhou_little_maid.maid_base.chisel_statue.title": "Creando arte", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.description": "La maid bebe un balde de leche", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.title": "Brujas molestas...", + "advancements.touhou_little_maid.maid_base.maid_backpack.description": "Equipa cualquier mochila en tu maid", + "advancements.touhou_little_maid.maid_base.maid_backpack.title": "Empaquetalo", + "advancements.touhou_little_maid.maid_base.maid_farm.description": "Deja que la maid plante o coseche cultivos", + "advancements.touhou_little_maid.maid_base.maid_farm.title": "El Viejo MacDonald tenía una granja", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.description": "Dejar que la maid críe animales", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.title": "Experto animal", + "advancements.touhou_little_maid.maid_base.maid_feed_player.description": "La maid alimenta a un jugador hambriento", + "advancements.touhou_little_maid.maid_base.maid_feed_player.title": "Cómetelo", + "advancements.touhou_little_maid.maid_base.maid_fishing.description": "La Maid sale a pescar", + "advancements.touhou_little_maid.maid_base.maid_fishing.title": "No, esto no es KKHTA", + "advancements.touhou_little_maid.maid_base.maid_kill_mob.description": "La maid mata a un mob", + "advancements.touhou_little_maid.maid_base.maid_kill_mob.title": "Pequeña cazadora", + "advancements.touhou_little_maid.maid_base.photo_maid.description": "Sesión de fotos con tu maid", + "advancements.touhou_little_maid.maid_base.photo_maid.title": "Ayaya...", + "advancements.touhou_little_maid.maid_base.pickup_garage_kit.description": "Recoge el kit de garaje", + "advancements.touhou_little_maid.maid_base.pickup_garage_kit.title": "¡Kit de Garaje!", + "advancements.touhou_little_maid.maid_base.pickup_maid.description": "Haz clic derecho en tu maid con la montura", + "advancements.touhou_little_maid.maid_base.pickup_maid.title": "Princesa Carry", + "advancements.touhou_little_maid.maid_base.reborn_maid.description": "Resucita a tu maid del altar", + "advancements.touhou_little_maid.maid_base.reborn_maid.title": "Después de la otra vida\n", + "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.description": "Resucita a tu maid del templo", + "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.title": "Vida compartida", + "advancements.touhou_little_maid.maid_base.switch_schedule.description": "Cambia el horario de la maid", + "advancements.touhou_little_maid.maid_base.switch_schedule.title": "Mantén el seguimiento del tiempo", + "advancements.touhou_little_maid.maid_base.switch_task.description": "Cambiar la tarea de la maid", + "advancements.touhou_little_maid.maid_base.switch_task.title": "Cambio de trabajo", + "advancements.touhou_little_maid.maid_base.take_maid_xp.description": "Clic derecho a la Maid con una botella de vidrio para retirar la xp", + "advancements.touhou_little_maid.maid_base.take_maid_xp.title": "Cosecha de hoy", + "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.description": "Equipa un imán de un objeto en tu maid", + "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.title": "No tan fuera de alcance", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.description": "La maid esquiva un proyectil con una tela ágil", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.title": "¡Rozado!", + "advancements.touhou_little_maid.maid_base.use_protect_bauble.description": "Equipa una protección en tu maid", + "advancements.touhou_little_maid.maid_base.use_protect_bauble.title": "¡Protege!", + "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.description": "Usa el pergamino de zorro rojo para encontrar la maid", + "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.title": "Nunca voy a decir adiós", + "advancements.touhou_little_maid.maid_base.use_servant_bell.description": "Utilice la campana de sirvienta para llamar a la maid", + "advancements.touhou_little_maid.maid_base.use_servant_bell.title": "Never Gonna Give You Up", + "advancements.touhou_little_maid.maid_base.use_trumpet.description": "Usa la trompeta para llamar a todas las maids", + "advancements.touhou_little_maid.maid_base.use_trumpet.title": "Mascotas zun", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.description": "La maid cancela la muerte con el elixir de orbe ultramarino o el tótem de inmortalidad", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.title": "Oooh, soy un zombie", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.description": "Usa el pergamino de zorro blanco para encontrar la tumba de la maid", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.title": "Nunca voy a correr por ahí y abandonarte", + "advancements.touhou_little_maid.maid_base.use_wireless_io.description": "Transfiere algunos objetos del cofre a la maid por brecha, viceversa", + "advancements.touhou_little_maid.maid_base.use_wireless_io.title": "Brecha la mente", "entity.touhou_little_maid.chair": "Silla", "entity.touhou_little_maid.maid": "Sirvienta", "entity.touhou_little_maid.fairy": "Hada Sirvienta", @@ -6,8 +114,10 @@ "entity.touhou_little_maid.box": "Caja de Pastel", "entity.touhou_little_maid.power_point": "Puntos de poder", "entity.touhou_little_maid.throw_power_point": "Puntos de poder", + "entity.touhou_little_maid.extinguishing_agent": "Agente extintor", "entity.touhou_little_maid.sit": "Sentar", "entity.touhou_little_maid.tombstone": "Lápida", + "entity.touhou_little_maid.tombstone.display": "Descansó aquí", "entity.touhou_little_maid.broom": "Escoba de Marisa", "item_group.touhou_little_maid.main": "Touhou Little Maid: Principal", "item_group.touhou_little_maid.chair": "Touhou Little Maid: Silla", @@ -17,8 +127,13 @@ "item.touhou_little_maid.maid_backpack_small": "Mochila pequeña", "item.touhou_little_maid.maid_backpack_middle": "Mochila mediana", "item.touhou_little_maid.maid_backpack_big": "Mochila grande", + "item.touhou_little_maid.crafting_table_backpack": "Mochila de mesa de crafteo", + "item.touhou_little_maid.ender_chest_backpack": "Mochila de cofre de ender", + "item.touhou_little_maid.furnace_backpack": "Mochila de horno", + "item.touhou_little_maid.tank_backpack": "Mochila de tanque", "item.touhou_little_maid.chair": "Silla", "item.touhou_little_maid.hakurei_gohei": "Gohei de Hakurei", + "item.touhou_little_maid.sanae_gohei": "Gohei de Sanae", "item.touhou_little_maid.extinguisher": "Extintor", "item.touhou_little_maid.ultramarine_orb_elixir": "Elixir de Orbe Ultramarino", "item.touhou_little_maid.explosion_protect_bauble": "Chuchería de Protección contra Explosiones", @@ -40,15 +155,40 @@ "item.touhou_little_maid.smart_slab": "Hechizo de almas", "item.touhou_little_maid.trumpet": "Trompeta", "item.touhou_little_maid.wireless_io": "§6Brecha", + "item.touhou_little_maid.chair_show": "Exhibición de silla", + "item.touhou_little_maid.red_fox_scroll": "Pergamino de zorro rojo", + "item.touhou_little_maid.white_fox_scroll": "Pergamino de zorro blanco", + "item.touhou_little_maid.favorability_tool_add": "Herramienta de favorabilidad", + "item.touhou_little_maid.favorability_tool_full": "Herramienta de favorabilidad", + "item.touhou_little_maid.favorability_tool_reduce": "Herramienta de favorabilidad", + "item.touhou_little_maid.kappa_compass": "Brújula de kappa", + "item.touhou_little_maid.broom": "Escoba de Marisa", "item.touhou_little_maid.picnic_basket": "Cesta de pícnic", + "item.touhou_little_maid.servant_bell": "Campana de sirvienta", + "item.touhou_little_maid.monster_list": "Lista de monstruos (eliminada)", + "item.touhou_little_maid.advancement_icon": "Icono de avance", + "item.touhou_little_maid.entity_id_copy": "Copiador de ID de entidad", + "enchantment.touhou_little_maid.impeding": "Danmaku inminente", + "enchantment.touhou_little_maid.impeding.desc": "Danmaku puede infligir lentitud I - IV al enemigo", + "enchantment.touhou_little_maid.speedy": "Danmaku veloz", + "enchantment.touhou_little_maid.speedy.desc": "Danmaku viaja x2 a velocidad normal en el nivel I y x3 en el nivel II", + "enchantment.touhou_little_maid.enders_ender": "Fin del ender", + "enchantment.touhou_little_maid.enders_ender.desc": "Danmaku puede dañar al enderman o al dragón del end", "block.touhou_little_maid.maid_bed": "Cama de maid", "block.touhou_little_maid.garage_kit": "Kit de Garaje", "block.touhou_little_maid.maid_beacon": "Lámpara de Santuario", "block.touhou_little_maid.model_switcher": "Cambiar modelo", + "block.touhou_little_maid.gomoku": "Gomoku", "block.touhou_little_maid.keyboard": "Teclado", + "block.touhou_little_maid.bookshelf": "Estantería", "block.touhou_little_maid.computer": "Computador", + "block.touhou_little_maid.shrine": "Santuario", "block.touhou_little_maid.altar": "Altar", "block.touhou_little_maid.statue": "Estatua", + "block.touhou_little_maid.picnic_mat": "Esterilla de picnic", + "block.touhou_little_maid.cchess": "Xiangqi (Ajedrez Chino)", + "block.touhou_little_maid.wchess": "Ajedrez", + "block.touhou_little_maid.scarecrow": "Zorro Inari de granito", "tooltips.touhou_little_maid.chair.place.desc": "Click derecho en la parte de arriba de un bloque para colocarlo.", "tooltips.touhou_little_maid.chair.destroy.desc": "Shift + click izquierdo para destruirlo.", "tooltips.touhou_little_maid.chair.gui.desc": "Shift + click derecho para abrir la lista de skins.", @@ -58,8 +198,11 @@ "tooltips.touhou_little_maid.info.model_name": "Nombre del modelo", "tooltips.touhou_little_maid.info.experience": "Experiencia", "tooltips.touhou_little_maid.info.favorability": "Amistad", + "tooltips.touhou_little_maid.info.game_skill.gomoku": "Derrotas: %d, Rango: %d", "tooltips.touhou_little_maid.bauble.desc": "Adorno de Maid", "tooltips.touhou_little_maid.bauble.usage": "Necesita ser colocado en el inventario especial de la maid", + "tooltips.touhou_little_maid.backpack.desc": "§6[Mochila de maid]", + "tooltips.touhou_little_maid.backpack.usage": "Usa este item para hacer clic derecho en la maid", "tooltips.touhou_little_maid.substitute_jizo.desc": "Click derecho en la maid para hacerla invulnerable, solo en creativo", "tooltips.touhou_little_maid.photo.no_data.desc": "A esta foto le faltan Datos de la Maid", "tooltips.touhou_little_maid.film.no_data.desc": "A esta película le faltan datos de la Maid", @@ -79,7 +222,42 @@ "tooltips.touhou_little_maid.wireless_io.binding_pos.has": "Estableciendo Posicion: %d, %d, %d", "tooltips.touhou_little_maid.wireless_io.binding_pos.none": "Desvincular cofre", "tooltips.touhou_little_maid.maid_beacon.desc": "Poder de Almacenamiento: %s", + "tooltips.touhou_little_maid.chair_show.desc": "Sostén este objeto y acércate sigilosamente para ver la hitbox de la silla", + "tooltips.touhou_little_maid.model_switcher.bounded": "Ya atado a la maid", + "tooltips.touhou_little_maid.custom_sound.credit": "Reproducir un sonido de crédito", + "tooltips.touhou_little_maid.custom_sound.open_url": "Abrir la url del paquete de sonido", + "tooltips.touhou_little_maid.custom_sound.play_sound": "Haz clic para reproducir el sonido", + "tooltips.touhou_little_maid.fox_scroll.dimension": "§a▍ §7Dimensión: %s", + "tooltips.touhou_little_maid.fox_scroll.position": "§a▍ §7Posición: [%s§7]", "tooltips.touhou_little_maid.fox_scroll.red": "Usado para encontrar Maids en chunks descargados", + "tooltips.touhou_little_maid.fox_scroll.white": "Usado para encontrar la tumba de la Maid", + "tooltips.touhou_little_maid.favorability_tool.add": "Haz clic derecho en la maid para agregar 64 (shift es 1) puntos de favorabilidad,", + "tooltips.touhou_little_maid.favorability_tool.reduce": "Haz clic derecho en la maid para reducir 64 (shift es 1) puntos de favorabilidad", + "tooltips.touhou_little_maid.favorability_tool.full": "Click derecho a la maid para poner la amistad al máximo", + "tooltips.touhou_little_maid.tank_backpack.empty_fluid": "Vacío", + "tooltips.touhou_little_maid.tank_backpack.fluid": "%s: %d mB", + "tooltips.touhou_little_maid.tank_backpack.capacity": "Capacidad: %d mB", + "tooltips.touhou_little_maid.item_container.empty": "Vacío", + "tooltips.touhou_little_maid.broom.desc": "Clic derecho en el bloque para colocar la escoba", + "tooltips.touhou_little_maid.scarecrow.desc": "Puesto en el suelo, evita que las Maids sirvientas aparezcan en un área cuadrada alrededor de %dx%d", + "tooltips.touhou_little_maid.servant_bell.uuid": "UUID: %s", + "tooltips.touhou_little_maid.servant_bell.desc.1": "- Clic derecho a la Maid para marcarla.", + "tooltips.touhou_little_maid.servant_bell.desc.2": "- Después de marcarla, puedes teletransportar a la Maid después de usarla.", + "tooltips.touhou_little_maid.monster_list.desc": "La versión 1.1.13 y posteriores eliminaron este objeto y ya no puede utilizarse", + "tooltips.touhou_little_maid.advancement_icon.desc": "Solo para mostrar iconos de avance", + "tooltips.touhou_little_maid.entity_id_copy.desc": "Se utiliza para copiar el ID de la entidad para facilitar la rellenación de la lista de ataques", + "overlay.touhou_little_maid.compass.tips": "Clic derecho para mostrar el área de tareas de la maid", + "overlay.touhou_little_maid.golden_apple.tips": "El clic con shift de manzana dorada se puede alimentar a la maid", + "overlay.touhou_little_maid.potion.tips": "El clic con shift de poción se puede alimentar a la maid", + "overlay.touhou_little_maid.milk_bucket.tips": "Shift + Clic con una cubeta de leche elimina los efectos de pociones de la Maid", + "overlay.touhou_little_maid.script_book.tips": "Puede escribir texto de burbujas de chat a la maid", + "overlay.touhou_little_maid.glass_bottle.tips": "Haz clic derecho para quitar la experiencia, haz clic con shift para sacarla todo", + "overlay.touhou_little_maid.name_tag.tips": "Clic derecho para nombrar a la Maid", + "overlay.touhou_little_maid.lead.tips": "Clic derecho para atar a la maid", + "overlay.touhou_little_maid.debug_stick.tips": "Cambiar UUID del dueño de la maid", + "overlay.touhou_little_maid.ntr_item.tips": "Cambia la maid de otra persona a la tuya", + "overlay.touhou_little_maid.remove_backpack.tips": "Quitar la mochila de la Maid", + "overlay.touhou_little_maid.saddle.tips": "Clic derecho para llevar a la Maid en tus brazos", "gui.touhou_little_maid.schedule.day": "Turno de dia", "gui.touhou_little_maid.schedule.night": "Turno de Noche", "gui.touhou_little_maid.schedule.all": "Todo el día", @@ -87,6 +265,7 @@ "gui.touhou_little_maid.activity.idle": "Ocioso", "gui.touhou_little_maid.activity.rest": "Descanso", "gui.touhou_little_maid.button.skin": "Cambiar skin", + "gui.touhou_little_maid.button.sound": "Definir paquete de sonido", "gui.touhou_little_maid.task.next_page": "Siguiente Página", "gui.touhou_little_maid.task.previous_page": "Página Anterior", "gui.touhou_little_maid.task.close": "Cerrar", @@ -95,6 +274,8 @@ "gui.touhou_little_maid.skin.text.date": "Fecha: %s", "gui.touhou_little_maid.skin.button.close": "Cerrar", "gui.touhou_little_maid.skin.tooltips.show_details": "Shift Click para abrir los detalles del GUI", + "gui.touhou_little_maid.skin.tooltips.maid_use_sound_pack_id": "Usar paquete de sonido: %s", + "gui.touhou_little_maid.skin.enable_cache": "Caché de iconos", "gui.touhou_little_maid.button.home.true": "El modo casero esta activo", "gui.touhou_little_maid.button.home.false": "El modo casero esta inactivo", "gui.touhou_little_maid.button.home.desc": "§Haz click en este botón para establecer si la maid va a seguir al jugador.", @@ -105,6 +286,20 @@ "gui.touhou_little_maid.button.maid_riding_set.false": "Montar Entidad está deshabilitada", "gui.touhou_little_maid.button.maid_riding_set.desc": "§Haz click en este botón para establecer si la maid va a seguir al jugador", "gui.touhou_little_maid.button.model_download": "Abrir el GUI de descarga para el paquete de Modelos", + "gui.touhou_little_maid.button.model_download.statue.first": "Haz clic aquí para descargar más modelos y sonidos!", + "gui.touhou_little_maid.button.model_download.statue.update": "¡Hay algunos nuevos modelos y sonidos!", + "gui.touhou_little_maid.button.main": "Principal", + "gui.touhou_little_maid.button.main.desc": " -§a La pantalla principal de la maid que se utiliza principalmente para administrar el inventario", + "gui.touhou_little_maid.button.task_config": "Configuración de tarea", + "gui.touhou_little_maid.button.task_config.desc": " -§a Configurar configuraciones especiales para tareas de trabajo", + "gui.touhou_little_maid.button.maid_config": "Configuración de maid", + "gui.touhou_little_maid.button.maid_config.desc": " -§a Configuración para configurar algunas de las funciones de la maid actual", + "gui.touhou_little_maid.button.task_book": "Libro de tareas", + "gui.touhou_little_maid.button.task_book.desc": " -§a Usado para abrir la entrada del libro de tareas de Gensokyo Memorizable", + "gui.touhou_little_maid.button.task_info": "Información de la tarea", + "gui.touhou_little_maid.button.task_info.desc": " -§a Usado para mostrar la información simple de la tarea", + "gui.touhou_little_maid.button.global_config": "Configuración global", + "gui.touhou_little_maid.button.global_config.desc": " -§a Click para navegar a la pantalla de configuración de ropa", "gui.touhou_little_maid.name_tag.edit_box": "Cuadro de edición de etiqueta", "gui.touhou_little_maid.tag.always_show": "Siempre mostrar el nombre", "gui.touhou_little_maid.wireless_io.filter_mode": "Cambiar Filtro", @@ -135,32 +330,249 @@ "gui.touhou_little_maid.resources_download.file_size": "Tamaño: %s", "gui.touhou_little_maid.resources_download.upload_time": "Tiempo de subida: %s", "gui.touhou_little_maid.resources_download.license": "Licencia: %s", + "gui.touhou_little_maid.resources_download.fail": "Parece haber un problema con la red...", "gui.touhou_little_maid.resources_download.reload": "Touhou_little_maid", + "gui.touhou_little_maid.resources_download.all": "Todo", + "gui.touhou_little_maid.resources_download.maid": "Maid", + "gui.touhou_little_maid.resources_download.chair": "Silla", + "gui.touhou_little_maid.resources_download.sound": "Sonido", + "gui.touhou_little_maid.resources_download.update": "Actualización", + "gui.touhou_little_maid.resources_download.all.tips": "Todos los paquetes de recursos", + "gui.touhou_little_maid.resources_download.maid.tips": "Paquetes de recursos de maid", + "gui.touhou_little_maid.resources_download.chair.tips": "Paquete de recursos de silla", + "gui.touhou_little_maid.resources_download.sound.tips": "Paquete de recursos de sonido", + "gui.touhou_little_maid.resources_download.update.tips": "Necesita actualizar el paquete de recursos", "gui.touhou_little_maid.resources_download.not_download": "No Descargado", "gui.touhou_little_maid.resources_download.downloaded": "Descargado", "gui.touhou_little_maid.resources_download.downloading": "Descargando", "gui.touhou_little_maid.resources_download.need_update": "Necesita actualizar", + "gui.touhou_little_maid.resources_download.delete": "Eliminar paquete", + "gui.touhou_little_maid.resources_download.delete.confirm": "¿Quieres eliminar este archivo?", + "gui.touhou_little_maid.resources_download.open_link": "Abrir sitio web del autor", + "gui.touhou_little_maid.resources_download.open_folder": "Abrir carpeta de paquetes", + "gui.touhou_little_maid.resources_download.search": "Buscar...", + "gui.touhou_little_maid.resources_download.hot_search": "Búsquedas populares:", + "gui.touhou_little_maid.resources_download.hot_search_key": "Klee, Stelle, Lamu, Arisu, Suzuran, Nahida, Frieren, Nagato, Elaina, Cheshire, Honkai, Nyaruko, Fate", + "gui.touhou_little_maid.resources_download.need_reload.title": "§6§nAdvertencia de recarga", + "gui.touhou_little_maid.resources_download.need_reload.subtitle": "¡Usa el comando de recarga del paquete §4§o/tlm para recargar el paquete!", + "gui.touhou_little_maid.resources_download.state.downloading": "Descargando archivo %s...", + "gui.touhou_little_maid.resources_download.state.downloaded": "Archivo %s descargado, Tiempo tomado: %.3fs", + "gui.touhou_little_maid.model_gui.easter_egg.encrypt": "Este es un easter egg de nombrado de modelo cifrado", "gui.touhou_little_maid.model_gui.easter_egg.normal": "gui. touhou_little_maid. model_gui. easter_egg. normal", "gui.touhou_little_maid.maid_config.sound_frequency": "Frecuencias de sonido de la Sirvienta", "gui.touhou_little_maid.maid_config.show_chat_bubble": "Mostrar burbujas de chat", "gui.touhou_little_maid.maid_config.show_backpack": "Mostrar mochila", + "gui.touhou_little_maid.maid_config.show_back_item": "Mostrar objetos de espalda", + "gui.touhou_little_maid.maid_config.pick_type": "Tipo de recogida", + "gui.touhou_little_maid.maid_config.open_door": "Abrir puerta", + "gui.touhou_little_maid.maid_config.open_fence_gate": "Abrir puerta de valla", + "gui.touhou_little_maid.maid_config.value.true": "ENCENDIDO", + "gui.touhou_little_maid.maid_config.value.false": "APAGADO", + "gui.touhou_little_maid.maid_config.value.item": "Objeto", + "gui.touhou_little_maid.maid_config.value.xp": "EXP", + "gui.touhou_little_maid.maid_config.value.all": "Todo", + "gui.touhou_little_maid.model_switcher.direction.north": "Dirección: N", + "gui.touhou_little_maid.model_switcher.direction.south": "Dirección: S", + "gui.touhou_little_maid.model_switcher.direction.east": "Dirección: E", + "gui.touhou_little_maid.model_switcher.direction.west": "Dirección: O", "gui.touhou_little_maid.model_switcher.list.add": "Añadir", + "gui.touhou_little_maid.model_switcher.uuid.empty": "¡Maid sin vínculo, usa el clic derecho de la maid para vincular!", + "gui.touhou_little_maid.custom_sound.pack.title": "§l§nPaquete de sonido de maid", + "gui.touhou_little_maid.custom_sound.pack.apply": "Aplicar paquete de sonido", + "gui.touhou_little_maid.custom_sound.sounds.preview": "§l§nVista previa de sonido", + "gui.touhou_little_maid.fox_scroll.position": "Pos: [%s]", + "gui.touhou_little_maid.fox_scroll.distance.same_dimension": "Distancia: %dm", + "gui.touhou_little_maid.fox_scroll.distance.different_dimension": "Distancia: ???m", + "gui.touhou_little_maid.fox_scroll.track": "Localizar", + "gui.touhou_little_maid.fox_scroll.empty": "No hay coordenadas de maid", + "gui.touhou_little_maid.optifine_warning.title": "Aviso de Optifine en Touhou Little Maid", + "gui.touhou_little_maid.optifine_warning.text": "Antes de continuar, ten en cuenta que Optifine se conoce por generar crasheos, errores visuales de entidades y muchos otros errores.\n\nAntes de reportar un error, elimina primero Optifine y vuelva a revisar si el bug sigue presente.\n\n¡Problemas relacionados con Optifine no tienen solución en Touhou Little Maid!\n\nPuedes usar los mods Oculus y Embeddium como alternativas a Optifine.", "gui.touhou_little_maid.optifine_warning.embeddium": "Descargar Embeddium", + "gui.touhou_little_maid.optifine_warning.oculus": "Descargar Oculus", + "gui.touhou_little_maid.cloth_config_warning.tips": "Necesitarás instalar el mod de Cloth Config API para usar la función de configuración de juego", "gui.touhou_little_maid.cloth_config_warning.download": "Descarga Cloth Config API", + "gui.touhou_little_maid.patchouli_warning.tips": "Necesitarás instalar el mod de Patchouli para abrir la función de entrada de libro", + "gui.touhou_little_maid.patchouli_warning.download": "Descargar Patchouli", + "gui.touhou_little_maid.servant_bell.edit_box": "Por favor ingresa algunos consejos", + "gui.touhou_little_maid.cache_screen.progress": "Progreso: %d/%d", + "gui.touhou_little_maid.cache_screen.desc": "Cacheando icono del modelo, por favor espere...", + "gui.touhou_little_maid.monster_type.friendly": "§aAmigable", + "gui.touhou_little_maid.monster_type.neutral": "§7Neutral", + "gui.touhou_little_maid.monster_type.hostile": "§cHostil", + "gui.touhou_little_maid.monster_type.title": "Lista de ataque de maid", + "gui.touhou_little_maid.monster_type.add": "Añadir", + "gui.touhou_little_maid.default_task_config.title": "La tarea actual no tiene ninguna configuración...", + "chat_bubble.touhou_little_maid.inner.feed_animal.max_number": "Tantos animales... ¡Ya no los alimento!", + "chat_bubble.touhou_little_maid.inner.home_meal.two_hand_is_full": "Mis manos estaban llenas de objetos... ¡No pude comer!", + "chat_bubble.touhou_little_maid.inner.home_meal.meal_is_empty": "¡Date prisa, date prisa, no tengo nada para comer!", + "chat_bubble.touhou_little_maid.inner.fishing.no_sit": "¡Tengo que sentarme on una silla o bote para pescar!", + "message.touhou_little_maid.missing_patchouli.title": "[TLM]", + "message.touhou_little_maid.missing_patchouli.click_here": "Haz clic aquí para instalar el mod Patchouli para obtener el manual", + "message.touhou_little_maid.missing_patchouli.url": "https://www.curseforge.com/minecraft/mc-mods/patchouli", "message.touhou_little_maid.change_model.disabled": "El cambio de modelo esta desactivado.", "message.touhou_little_maid.extinguisher.player_cannot_use": "Tu falta de conocimiento no te permite utilizar este item", "message.touhou_little_maid.altar.not_enough_power": "No tienes suficiente poder.", "message.touhou_little_maid.owner_maid_num.can_not_add": "No puedes domar mas maids, alcanzaste el limite (%d/%d)", - "commands.touhou_little_maid.pack.reload.info": "¡Todos los paquetes de modelos han sido recargados!", + "message.touhou_little_maid.photo.not_suitable_for_place_maid": "Este maldito lugar no puede colocar la maid.", + "message.touhou_little_maid.photo.have_no_nbt_data": "Esta maldita foto no tiene datos NBT.", + "message.touhou_little_maid.chisel.hit_block_error": "Haz clic derecho en el bloque de arcilla", + "message.touhou_little_maid.chisel.offhand_not_photo": "Por favor, ten una foto de la maid en tu mano", + "message.touhou_little_maid.gomoku.win": "El jugador gana", + "message.touhou_little_maid.gomoku.lose": "El jugador pierde", + "message.touhou_little_maid.gomoku.reset": "Clic derecho en la caja de ajedrez para reiniciar", + "message.touhou_little_maid.gomoku.round": "Ronda: %d", + "message.touhou_little_maid.gomoku.no_maid": "No hay ninguna maid participando en el juego", + "message.touhou_little_maid.gomoku.not_owner": "La maid participando en el juego no es tuya", + "message.touhou_little_maid.gomoku.rank_up.title": "§6§nFelicidades", + "message.touhou_little_maid.gomoku.rank_up.subtitle": "¡Las habilidades de gomoku de tu maid han mejorado!", + "message.touhou_little_maid.trumpet.unloaded_maid": "También hay %d maids en trozos descargados. ¡Usa el pergamino de zorro rojo para encontrarlas!", + "message.touhou_little_maid.shrine.not_film": "¡Sólo se puede colocar una película en el templo!", + "message.touhou_little_maid.shrine.health_low": "¡El HP del jugador es demasiado bajo!", + "message.touhou_little_maid.kappa_compass.clear": "Todas las posiciones han sido borradas", + "message.touhou_little_maid.kappa_compass.full": "La posición está llena, por favor haga clic con shift para borrarlos", + "message.touhou_little_maid.kappa_compass.far_away": "Demasiado lejos de la posición anterior, el máximo solo puede ser 64", + "message.touhou_little_maid.kappa_compass.maid_write": "Se ha escrito con éxito la posición de la maid", + "message.touhou_little_maid.kappa_compass.maid_clear": "Se ha limpiado con éxito la posición de la maid", + "message.touhou_little_maid.kappa_compass.maid_dimension_check": "La dimensión del registro es inconsistente con la dimensión de la maid actual", + "message.touhou_little_maid.kappa_compass.no_data": "Esta brújula no registra ninguna posición", + "message.touhou_little_maid.kappa_compass.work": "§a▍ §7Pos Trabajo: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.idle": "§a▍ §7Pos Inactiva: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.sleep": "§a▍ §7Pos Dormida: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.work_area": "Área de Trabajo", + "message.touhou_little_maid.kappa_compass.idle_area": "Área de Descanso", + "message.touhou_little_maid.kappa_compass.sleep_area": "Área de sueño", + "message.touhou_little_maid.kappa_compass.usage.set_pos": "§6- §bHaz clic derecho en el bloque para establecer la posición", + "message.touhou_little_maid.kappa_compass.usage.clear_pos": "§6- §bHaz clic derecho con shift en el bloque para limpiar la posición", + "message.touhou_little_maid.kappa_compass.usage.write_pos_to_maid": "§d- §2Haz clic derecho en la maid para escribir la posición", + "message.touhou_little_maid.kappa_compass.usage.clear_maid_pos": "§d- §2Haz clic derecho con shift en la maid para limpiar la posición", + "message.touhou_little_maid.check_schedule_pos.too_far": "§c§lEstá muy lejos de la posición registrada\n\n§6§nPor favor, haz clic derecho en la maid usando la brújula del kappa para limpiar la posición registrada", + "message.touhou_little_maid.check_schedule_pos.dimension": "§c§lLa dimensión del registro es inconsistente con la dimensión de la maid actual\n\n§6§nPor favor, haga clic derecho en la maid usando la brújula del kappa para limpiar la posición registrada", + "message.touhou_little_maid.script_book.remove": "Limpiada correctamente el script de la burbuja de chat de la maid", + "message.touhou_little_maid.script_book.install": "Instalada correctamente el script de la burbuja de chat de la maid", + "message.touhou_little_maid.script_book.copy": "Copiada correctamente el script de la burbuja de chat de la maid", + "message.touhou_little_maid.broom.unable_fly": "Necesitas una Maid para sentarte en tu escoba antes de poder usarla", + "message.touhou_little_maid.saddle.how_to_eject": "Haz clic derecho de nuevo con la silla de montar en la mano para expulsar a la maid", + "message.touhou_little_maid.tombstone.not_yours.1": "¡Esta tumba de maid no es tuya! Si eres un administrador de un servidor, por favor usa el objeto NTR para hacer clic derecho para eliminarla", + "message.touhou_little_maid.tombstone.not_yours.2": "Item NTR actual: ", + "message.touhou_little_maid.servant_bell.show_pos": "La maid está en el chunk de descarga, por favor sigue la pista de pos para encontrarla", + "message.touhou_little_maid.servant_bell.not_same_dimension": "La maid y tú no están en la misma dimensión, la maid está en la dimensión %s", + "message.touhou_little_maid.servant_bell.no_result": "No se encontró ninguna Maid", + "message.touhou_little_maid.servant_bell.data_is_empty": "No hay datos registrados en ella", + "message.touhou_little_maid.cchess.check": "Verificar", + "message.touhou_little_maid.cchess.repeat": "¡Empate por repetición!", + "message.touhou_little_maid.cchess.move_limit": "¡Empate por regla de 60 movimientos!", + "message.touhou_little_maid.cchess.reset": "Haz clic derecho en el área negra derecha para restablecer", + "message.touhou_little_maid.wchess.move_limit": "¡Empate por regla de 50 movimientos!", + "message.touhou_little_maid.wchess.reset": "Haz clic derecho en el área amarilla ligera de ambos lados para restablecer", + "message.touhou_little_maid.entity_id_copy.copy": "El ID de la entidad ha sido copiado: %s", "commands.touhou_little_maid.power.handle.info": "Se ha cambiado el punto de poder de %d jugadores", "commands.touhou_little_maid.maid_num.handle.info": "Se ha cambiado el número de la criada de %d jugadores", + "commands.touhou_little_maid.power.get.info": "%s: %.2f", + "commands.touhou_little_maid.maid_num.get.info": "%s: %d", + "argument.touhou_little_maid.handle_type.invalid": "Tipo de manejo no es válido", + "death.attack.touhou_little_maid.danmaku": "%1$s fue bombardeado por %2$s usando danmaku", + "config.touhou_little_maid.maid": "Maid", + "config.touhou_little_maid.maid.maid_tamed_item": "Objeto domesticado de maid", + "config.touhou_little_maid.maid.maid_tamed_item.tooltip": "El item que puede domesticar a las maids\nUtiliza el nombre registrado del item directamente o escribe el nombre de la etiqueta con # como prefijo", + "config.touhou_little_maid.maid.maid_temptation_item": "Objeto de tentación de maid", + "config.touhou_little_maid.maid.maid_temptation_item.tooltip": "El item que puede tentar a las maids\nUtiliza el nombre registrado del item directamente o escribe el nombre de la etiqueta con # como prefijo", + "config.touhou_little_maid.maid.maid_ntr_item": "Item NTR de maid", + "config.touhou_little_maid.maid.maid_ntr_item.tooltip": "El item que puede hacer NTR a las maids\nUtiliza el nombre registrado del item directamente o escribe el nombre de la etiqueta con # como prefijo", + "config.touhou_little_maid.maid.maid_work_range": "Rango de trabajo de maid", + "config.touhou_little_maid.maid.maid_work_range.tooltip": "El rango máximo del modo de trabajo de la maid", + "config.touhou_little_maid.maid.maid_idle_range": "Rango de inactividad de maid", + "config.touhou_little_maid.maid.maid_idle_range.tooltip": "El rango máximo del modo de inactividad de la maid", + "config.touhou_little_maid.maid.maid_sleep_range": "Rango de sueño de maid", + "config.touhou_little_maid.maid.maid_sleep_range.tooltip": "El rango máximo del modo de sueño de la maid", + "config.touhou_little_maid.maid.maid_non_home_range": "Rango fuera del hogar de la maid", + "config.touhou_little_maid.maid.maid_non_home_range.tooltip": "El rango máximo fuera del hogar de la maid", + "config.touhou_little_maid.maid.feed_animal_max_number": "Número máximo de animales", + "config.touhou_little_maid.maid.feed_animal_max_number.tooltip": "El número máximo de animales alrededor cuando la Maid cría animales", + "config.touhou_little_maid.maid.maid_change_model": "Modelo de cambio de la maid", + "config.touhou_little_maid.maid.maid_change_model.tooltip": "La maid puede cambiar modelos libremente", + "config.touhou_little_maid.maid.owner_max_maid_num": "Número máximo de maids adueñadas", + "config.touhou_little_maid.maid.owner_max_maid_num.tooltip": "El número máximo de Maids que el jugador posee", + "config.touhou_little_maid.maid.replace_allay_percent": "Reemplazar el porcentaje de allay", + "config.touhou_little_maid.maid.replace_allay_percent.tooltip": "Porcentaje de probabilidad de reemplazar generación de allays en puestos de saqueo con maids", + "config.touhou_little_maid.maid.maid_backpack_blacklist": "Lista negra de mochila de maid", + "config.touhou_little_maid.maid.maid_backpack_blacklist.tooltip": "Estos objetos no pueden colocarse en la mochila de la maid", + "config.touhou_little_maid.maid.maid_attack_ignore": "Ignorar ataque de maid", + "config.touhou_little_maid.maid.maid_attack_ignore.tooltip": "La entidad que la maid no reconocerá como objetivo de ataque", + "config.touhou_little_maid.maid.maid_ranged_attack_ignore": "Ignorar ataque a distancia de la maid", + "config.touhou_little_maid.maid.maid_ranged_attack_ignore.tooltip": "La entidad a la que la maid no dañará cuando esté en ataque a distancia", + "config.touhou_little_maid.maid.maid_gomoku_owner_limit": "Límite de propietarios de maid gomoku", + "config.touhou_little_maid.maid.maid_gomoku_owner_limit.tooltip": "La maid solo puede jugar gomoku con su dueño", + "config.touhou_little_maid.maid.maid_work_meals_block_list": "Lista de bloqueo de comidas de maid en trabajo", + "config.touhou_little_maid.maid.maid_work_meals_block_list.tooltip": "Estos items no se pueden utilizar como comidas de trabajo de una maid", + "config.touhou_little_maid.maid.maid_home_meals_block_list": "Lista de bloqueo de comidas de maid en casa", + "config.touhou_little_maid.maid.maid_home_meals_block_list.tooltip": "Estos items no se pueden utilizar como comidas de casa de una maid", + "config.touhou_little_maid.maid.maid_heal_meals_block_list": "Lista de bloqueo de comidas de maid para curar", + "config.touhou_little_maid.maid.maid_heal_meals_block_list.tooltip": "Estos items no se pueden utilizar como comidas para curar una maid", + "config.touhou_little_maid.maid.maid_work_meals_block_list_regex": "Lista de bloqueo de expresión regular de comidas para la maid", + "config.touhou_little_maid.maid.maid_work_meals_block_list_regex.tooltip": "Estos elementos no se pueden usar como comidas de trabajo de maid que coincidan con la expresión regular, todas las palabras deben coincidir", + "config.touhou_little_maid.maid.maid_home_meals_block_list_regex": "Lista de bloqueo de expresión regular de comidas para la maid en casa", + "config.touhou_little_maid.maid.maid_home_meals_block_list_regex.tooltip": "Estos elementos no se pueden usar como comidas de casa de maid que coincidan con la expresión regular, todas las palabras deben coincidir", + "config.touhou_little_maid.maid.maid_heal_meals_block_list_regex": "Lista de bloqueo de expresión regular de comidas para la maid para curar", + "config.touhou_little_maid.maid.maid_heal_meals_block_list_regex.tooltip": "Estos elementos no se pueden usar como comidas para curar la maid que coincidan con la expresión regular, todas las palabras deben coincidir", + "config.touhou_little_maid.maid.maid_eaten_return_container_list": "Lista de contenedores devueltos comidos por la maid", + "config.touhou_little_maid.maid.maid_eaten_return_container_list.tooltip": "Estas entradas configuran el contenedor que se devuelve después de que una maid ha comido\nPor ejemplo: §eminecraft:beetroot_soup§c,§eminecraft:bowl", + "config.touhou_little_maid.maid.maid_gun_long_distance": "Pistola de maid de larga distancia", + "config.touhou_little_maid.maid.maid_gun_long_distance.tooltip": "Distancia de reconocimiento de una maid bajo la tarea del arma, adecuada para rifles de francotirador", + "config.touhou_little_maid.maid.maid_gun_medium_distance": "Pistola de maid de media distancia", + "config.touhou_little_maid.maid.maid_gun_medium_distance.tooltip": "Distancia de reconocimiento de una maid bajo la tarea del arma, adecuada para la mayoría de los tipos", + "config.touhou_little_maid.maid.maid_gun_near_distance": "Pistola de maid a corta distancia", + "config.touhou_little_maid.maid.maid_gun_near_distance.tooltip": "Distancia de reconocimiento de una maid bajo la tarea del arma, adecuada para pistolas y escopetas", + "config.touhou_little_maid.chair": "Silla", + "config.touhou_little_maid.chair.chair_change_model": "Modelo de cambio de silla", + "config.touhou_little_maid.chair.chair_change_model.tooltip": "La silla puede cambiar modelos libremente", + "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone": "La silla puede ser destruida por cualquiera", + "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone.tooltip": "La silla puede ser destruida por cualquiera", + "config.touhou_little_maid.misc": "Varios", + "config.touhou_little_maid.misc.maid_fairy_power_point": "Punto de poder de hada maid", + "config.touhou_little_maid.misc.maid_fairy_power_point.tooltip": "Punto de poder de hada maid", + "config.touhou_little_maid.misc.maid_fairy_spawn_probability": "Posibilidad de generación de hada maid", + "config.touhou_little_maid.misc.maid_fairy_spawn_probability.tooltip": "Probabilidad de generación de hada maid (zombie es 100, enderman es 10)", + "config.touhou_little_maid.misc.maid_fairy_blacklist_biome": "Lista negra de bioma de hada maid", + "config.touhou_little_maid.misc.maid_fairy_blacklist_biome.tooltip": "El siguiente bioma no genera hadas maids", + "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension": "Lista negra de dimensión de hada maid", + "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension.tooltip": "La siguiente dimensión no genera hadas maids", + "config.touhou_little_maid.misc.player_death_loss_power_point": "Pérdida de puntos de poder por muerte de jugador", + "config.touhou_little_maid.misc.player_death_loss_power_point.tooltip": "Pérdida de puntos de poder tras la muerte del jugador", + "config.touhou_little_maid.misc.give_smart_slab": "Dar losa inteligente", + "config.touhou_little_maid.misc.give_smart_slab.tooltip": "Dar un item de hechizo de alma al jugador que se une por primera vez", + "config.touhou_little_maid.misc.give_patchouli_book": "Dar libro de Patchouli", + "config.touhou_little_maid.misc.give_patchouli_book.tooltip": "Dar el item de libro Gensokyo Memorizable para jugador que se une por primera vez", + "config.touhou_little_maid.misc.shrine_lamp_effect_cost": "Costo de efecto de lámpara de templo", + "config.touhou_little_maid.misc.shrine_lamp_effect_cost.tooltip": "Costo de efecto de lámpara de templo (Punto inferior/por hora)", + "config.touhou_little_maid.misc.shrine_lamp_max_storage": "Almacenamiento máximo de lámpara de templo", + "config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip": "Almacenamiento máximo de lámpara de templo con punto de poder", + "config.touhou_little_maid.misc.shrine_lamp_max_range": "Rango máximo de lámpara de templo", + "config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip": "Rango máximo de absorción de puntos de poder de lampara de templo", + "config.touhou_little_maid.misc.close_optifine_warning": "Cerrar advertencia de Optifine", + "config.touhou_little_maid.misc.close_optifine_warning.tooltip": "Desactivar o no la advertencia de Optifine", + "config.touhou_little_maid.misc.scarecrow_range": "Rango de zorro inari de granito", + "config.touhou_little_maid.misc.scarecrow_range.tooltip": "El rango del zorro inari de granito para evitar que las hadas maid se generen", + "config.touhou_little_maid.misc.use_new_maid_fairy_model": "Usar nuevo modelo de hadas maid", + "config.touhou_little_maid.misc.use_new_maid_fairy_model.tooltip": "Utiliza o no la nueva versión del modelo hada maid", + "config.touhou_little_maid.vanilla": "Vanilla", + "config.touhou_little_maid.vanilla.replace_slime_model": "Reemplazar modelo de slime", + "config.touhou_little_maid.vanilla.replace_slime_model.tooltip": "Si reemplazar el modelo de slime de vanilla por el yukkuri", + "config.touhou_little_maid.vanilla.replace_xp_texture": "Reemplazar textura de XP", + "config.touhou_little_maid.vanilla.replace_xp_texture.tooltip": "Si se debe reemplazar las texturas de los orbes originales de xp con los puntos de ítems", + "config.touhou_little_maid.vanilla.replace_totem_texture": "Reemplazar textura del tótem", + "config.touhou_little_maid.vanilla.replace_totem_texture.tooltip": "Si se debe reemplazar la textura original del tótem con puntos de vida", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture": "Reemplazar textura de la botella de XP", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture.tooltip": "Si se debe reemplazar las texturas de las botella de xp vanilla con los puntos de ítems", "task.touhou_little_maid.idle": "Ocioso", "task.touhou_little_maid.attack": "Ataque", "task.touhou_little_maid.ranged_attack": "Arco", + "task.touhou_little_maid.crossbow_attack": "Ballesta", + "task.touhou_little_maid.danmaku_attack": "Danmaku", "task.touhou_little_maid.farm": "Sembrar", "task.touhou_little_maid.sugar_cane": "Caña de azúcar", "task.touhou_little_maid.melon": "Sandías", "task.touhou_little_maid.cocoa": "Cacao", + "task.touhou_little_maid.honey": "Miel", "task.touhou_little_maid.grass": "Hierba", "task.touhou_little_maid.snow": "Nieve", "task.touhou_little_maid.feed": "Alimentar", @@ -169,15 +581,85 @@ "task.touhou_little_maid.torch": "Antorcha", "task.touhou_little_maid.feed_animal": "Alimentar", "task.touhou_little_maid.extinguishing": "Extintor", + "task.touhou_little_maid.board_games": "Partidas", + "task.touhou_little_maid.gun_attack": "Arma", + "task.touhou_little_maid.fishing": "Pescando", + "task.touhou_little_maid.desc.title": "[Consejos]", + "task.touhou_little_maid.desc.condition": "[Condición Extra]", + "task.touhou_little_maid.desc.enable_condition": "[Activar condición]", + "task.touhou_little_maid.idle.desc": "La Maid no hará nada en esta tarea", + "task.touhou_little_maid.attack.desc": "La Maid atacará cuerpo a cuerpo hacia enemigos hostiles", + "task.touhou_little_maid.attack.condition.assault_weapon": "La mano principal tiene un arma de asalto", + "task.touhou_little_maid.attack.condition.extinguisher": "A mano alzada, un extintor puede causar daño adicional al mob inmune al fuego", + "task.touhou_little_maid.ranged_attack.desc": "La maid atacará con arcos hacia enemigos hostiles", + "task.touhou_little_maid.ranged_attack.condition.has_bow": "La mano principal sostiene un arco", + "task.touhou_little_maid.ranged_attack.condition.has_arrow": "Tiene una flecha en el inventario", + "task.touhou_little_maid.crossbow_attack.desc": "La maid usará ballesta para atacar a los mobs hostiles", + "task.touhou_little_maid.crossbow_attack.condition.has_crossbow": "La mano principal sostiene una ballesta", + "task.touhou_little_maid.crossbow_attack.condition.has_ammunition": "Ten una flecha en el inventario o un fuego artificial a mano derecha", + "task.touhou_little_maid.danmaku_attack.desc": "La maid usará danmaku para atacar a los mobs hostiles", + "task.touhou_little_maid.danmaku_attack.condition.has_gohei": "La mano principal tiene un gohei de hakurei", + "task.touhou_little_maid.farm.desc": "La maid plantará o recolectará cultivos normales alrededor", + "task.touhou_little_maid.sugar_cane.desc": "La maid plantará o recolectará caña de azúcar alrededor", + "task.touhou_little_maid.melon.desc": "La maid recolectará sandía alrededor", + "task.touhou_little_maid.melon.condition.has_silk_touch": "La mano principal sostiene una herramienta toque de seda que hace que la sandía misma se deje caer", + "task.touhou_little_maid.cocoa.desc": "La maid plantará o recolectará cacao alrededor", + "task.touhou_little_maid.honey.desc": "La maid recogerá miel de las colmenas circundantes", + "task.touhou_little_maid.honey.condition.has_bottle": "La mano principal sostiene unas tijeras (Recoger panal de miel)", + "task.touhou_little_maid.honey.condition.has_shears": "Tiene una botella de vidrio (recoger miel)", + "task.touhou_little_maid.grass.desc": "La maid limpiará las flores o pasto de los alrededores", + "task.touhou_little_maid.snow.desc": "La maid limpiará la nieve circundante, si tiene una pala puede recoger bolas de nieve", + "task.touhou_little_maid.feed.desc": "La maid alimentará con comida cuando el maestro tenga hambre", + "task.touhou_little_maid.shears.desc": "La maid intentará esquilar las criaturas circundantes", + "task.touhou_little_maid.milk.desc": "La maid intentará recoger leche de las vacas circundantes con cubo", "task.touhou_little_maid.milk.condition.has_bucket": "Tener un cubo de leche en el inventario", "task.touhou_little_maid.torch.desc": "La maid kawai intentara colocar antorchas en las zonas oscuras al rededor suyo", "task.touhou_little_maid.torch.condition.has_torch": "Tener una antorcha en el inventario", + "task.touhou_little_maid.feed_animal.desc": "La maid intentará criar a los animales que la rodean, tiene un límite superior y se puede configurar", + "task.touhou_little_maid.feed_animal.condition.can_feed": "Tiene algunos alimentos de los animales en el inventario", + "task.touhou_little_maid.feed_animal.condition.assault_weapon": "La mano principal tiene un arma de asalto (mata a criaturas excedentes)", "task.touhou_little_maid.extinguishing.desc": "La linda maid intentara ser bombero apagando el fuego cerca de ella", "task.touhou_little_maid.extinguishing.condition.has_extinguisher": "Tiene que tener un extintor en la mano principal, no querras que apague el fuego con las manos", + "task.touhou_little_maid.board_games.desc": "La maid buscará alrededor del tablero gomoku", + "task.touhou_little_maid.gun_attack.desc": "La maid es capaz de usar la pistola TacZ", + "task.touhou_little_maid.gun_attack.condition.has_tacz_gun": "La mano principal tiene una pistola TacZ", + "task.touhou_little_maid.fishing.desc": "La maid buscará una silla alrededor y se sentará sobre ella, y luego comenzará a pescar", + "task.touhou_little_maid.fishing.condition.has_fishing_rod": "La mano principal tiene una caña de pescar", + "task.touhou_little_maid.advanced.id": "ID de tarea: %s", + "button.touhou_little_maid.maid.mode.idle": "Inactiva", + "button.touhou_little_maid.maid.mode.attack": "Ataque", + "button.touhou_little_maid.maid.mode.range_attack": "Ataque a distancia", + "button.touhou_little_maid.maid.mode.farm": "Cosechar", + "button.touhou_little_maid.maid.mode.feed": "Alimentar", + "button.touhou_little_maid.maid.mode.shears": "Esquilar", + "button.touhou_little_maid.maid.mode.milk": "Obtener leche", + "button.touhou_little_maid.maid.mode.torch": "Antorcha", + "button.touhou_little_maid.maid.mode.feed_animal": "Alimentar animal", + "button.touhou_little_maid.maid.mode.extinguishing": "Extintor", + "button.touhou_little_maid.maid.mode.snow": "Quitar nieve", + "button.touhou_little_maid.maid.mode.break": "Romper", + "button.touhou_little_maid.maid.mode.furnace": "Horno", + "button.touhou_little_maid.maid.mode.brewing": "Destilación", + "button.touhou_little_maid.maid.ai.find_target": "Buscar objetivo", + "button.touhou_little_maid.maid.ai.hurt": "Herida", + "button.touhou_little_maid.maid.ai.hurt_fire": "Herida en fuego", + "button.touhou_little_maid.maid.ai.hurt_player": "Dañar al jugador", + "button.touhou_little_maid.maid.ai.tamed": "Domesticada", + "button.touhou_little_maid.maid.ai.item_get": "Obtener objeto", + "button.touhou_little_maid.maid.ai.death": "Muerte", + "button.touhou_little_maid.maid.ai.game_win": "La maid gana", + "button.touhou_little_maid.maid.ai.game_lost": "La maid pierde", + "button.touhou_little_maid.maid.environment.hot": "Sentir calor", + "button.touhou_little_maid.maid.environment.cold": "Sentir frío", + "button.touhou_little_maid.maid.environment.rain": "Lluvia", + "button.touhou_little_maid.maid.environment.snow": "Nieve", + "button.touhou_little_maid.maid.environment.morning": "Mañana", + "button.touhou_little_maid.maid.environment.night": "Noche", + "button.touhou_little_maid.maid.credit": "Crédito", + "button.touhou_little_maid.maid.return": "Regresar", "subtitle.touhou_little_maid.maid.mode.idle": "Maid ociosa", "subtitle.touhou_little_maid.maid.mode.attack": "Maid atacando", "subtitle.touhou_little_maid.maid.mode.range_attack": "Maid atacando a distancia", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid atacando con Danmaku", "subtitle.touhou_little_maid.maid.mode.farm": "Maid cosechando", "subtitle.touhou_little_maid.maid.mode.feed": "Maid alimentando", "subtitle.touhou_little_maid.maid.mode.shears": "Maid esquilando", @@ -196,6 +678,8 @@ "subtitle.touhou_little_maid.maid.ai.tamed": "Maid domesticada", "subtitle.touhou_little_maid.maid.ai.item_get": "Maid agarrando items", "subtitle.touhou_little_maid.maid.ai.death": "Muerte de maid", + "subtitle.touhou_little_maid.maid.ai.game_win": "Sonido de victoria de maid", + "subtitle.touhou_little_maid.maid.ai.game_lost": "Sonido de derrota de maid", "subtitle.touhou_little_maid.maid.environment.hot": "Maid sintiendo calor", "subtitle.touhou_little_maid.maid.environment.cold": "Maid sintiendo frió", "subtitle.touhou_little_maid.maid.environment.rain": "Sonido de maid con lluvia", @@ -206,8 +690,14 @@ "subtitle.touhou_little_maid.item.camera_use": "Cámara usada", "subtitle.touhou_little_maid.item.album_open": "Álbum abierto", "subtitle.touhou_little_maid.block.altar_craft": "Altar crafteado", + "subtitle.touhou_little_maid.block.gomoku": "Sonido de gomoku", + "subtitle.touhou_little_maid.block.gomoku_reset": "Sonido de gomoku reiniciado", "subtitle.touhou_little_maid.entity.box": "Caja abierta", "subtitle.touhou_little_maid.item.compass": "Brújula seleccionando punto", + "touhou_little_maid.subtitles.entity.fairy.ambient": "Sonido ambiente de hada", + "touhou_little_maid.subtitles.entity.fairy.death": "Sonido de muerte de hada", + "touhou_little_maid.subtitles.entity.fairy.hurt": "Sonido de hada herida", + "emi.category.touhou_little_maid.altar": "Altar crafteado", "jei.touhou_little_maid.altar_craft.title": "Altar crafteado", "jei.touhou_little_maid.altar_craft.result": "%s", "jei.touhou_little_maid.altar_craft.item_craft.result": "Fabrica un objeto", @@ -215,7 +705,18 @@ "jei.touhou_little_maid.altar_craft.spawn_lightning_bolt.result": "Aparecer relampago", "jei.touhou_little_maid.altar_craft.reborn_maid.result": "Reanimar maid", "jei.touhou_little_maid.garage_kit.info": "La estatua de tamaño 1x1 puede ser convertida", + "top.touhou_little_maid.entity_maid.task": "Modo: ", + "top.touhou_little_maid.entity_maid.invulnerable": "Invulnerable", + "top.touhou_little_maid.entity_maid.schedule": "Horario: ", + "top.touhou_little_maid.entity_maid.favorability": "Nivel de Favorabilidad: %d", + "top.touhou_little_maid.entity_maid.nex_favorability_point": "%d puntos para mejorar", + "domesticationinnovation.touhou_little_maid.enchantment.undead_curse": "§4¡El encantamiento de maldición no muerta no se puede aplicar a las maids!", + "domesticationinnovation.touhou_little_maid.enchantment.blazing_protection": "§4¡El encantamiento de protección contra llamas no se puede aplicar a las maids!", + "config.jade.plugin_touhou_little_maid.maid": "Mostrar información adicional de la maid", + "config.jade.plugin_touhou_little_maid.shrine_lamp": "Mostrar información extra de la lámpara de templo", + "patchouli.touhou_little_maid.book.name": "Gensokyo Memorizable", "patchouli.touhou_little_maid.book.landing_text": "Un mod sobre maids y touhou project. $(br2)Gracias a Snownee por ayudar en la programación.$(br)Gracias a Succinum, Pajinyi, ZeniCrow, Tian_mi, Paulzzh, Yuriscat y otros artistas por hacer excelentes modelos y texturas.$(br)Gracias a Verclene, el autor de little maid mob Mod.", + "patchouli.touhou_little_maid.book.categories.maid.name": "Maid", "patchouli.touhou_little_maid.book.categories.maid.description": "Introducción a las funciones básicas de la maid", "patchouli.touhou_little_maid.book.categories.other.name": "Otro", "patchouli.touhou_little_maid.book.categories.other.description": "Introduce contenido variado", @@ -228,35 +729,138 @@ "patchouli.touhou_little_maid.book.entries.maid.item_magnet.pages.0.text": "Una joya que aumenta el rango para recoger objetos.$(br2)Después de equiparlo, el rango para agarrar objetos, flechas, exp y puntos de poder aumentara considerablemente.", "patchouli.touhou_little_maid.book.entries.maid.maid_base.name": "Maid base", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.0.text": "Hay muchas funciones básicas que las maids pueden hacer, tales como:$(li)por defecto, la doncella recogerá activamente los items, flechas orbes de experiencia que estén a su alrededor. La GUI principal tiene para cambiar el modo de recogida;$(li)Por defecto, la maid siempre seguirá al jugador.", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.1.text": "$(li)Shift + click derecho en la maid teniendo la mano vacía la cambiara al modo sentado. En este modo, no hará nada, incluyendo evitar el peligro.$(li)Cuando la maid este montando alguna entidad, shit + click derecho con una mano vacía la bajara de dicha entidad.$(li)El jugador puede usar la manzana dorada o una poción en una maid apretando click derecho en ella sosteniendo el item.", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.2.text": "$(li)La experiencia obtenida por la maid se convierte en botellas de experiencia si el jugador hace click derecho sosteniendo una botella vacía.$(li)La maid se puede equipar una cráneo y otros modelos.$(li) Haga click derecho a una maid sin nombre,y podrás nombrarla directamente.$(li)uando la maid sostiene el objeto tentador para los animales, puede atraer a los animales que la rodean.", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.3.text": "$(li)Usa la montura para hacer clic derecho en la maid para llevar la maid en tus brazos.$(li)Los creepers evitarán las maids.", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.name": "Amuletos de la sirvienta", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.0.text": "Este mod proporciona varios amuletos que se pueden activar para proteger a tus maids kawaii bajo ciertas condiciones, necesitan ser colocadas en el inventario de amuletos (bauble).$(li)Elixir Orbe Ultramarina: Se puede usar 6 veces para evitar la muerte de una majestuosa maid.", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.1.text": "$(li)Joya de protección: Cuando la maid recibe el daño correspondiente, el evento de daño sera cancelado.$(li)Tela de agilidad: Cuando una maid es equipada con esta joya si es golpeada por un proyectil, por ejemplo una flecha, tendrá el mismo comportamiento que un enderman, osea se va a teletransportar.", "patchouli.touhou_little_maid.book.entries.maid.maid_config.name": "Configuración de Maid", "patchouli.touhou_little_maid.book.entries.maid.maid_config.pages.0.text": "Este mod añade un montón de configuración para las maids. Puede activar/desactivar cada modo de las maids, establecer algunos atributos de las maids, y limitar el número máximo de maids que pueden ser domesticadas por el jugador.", "patchouli.touhou_little_maid.book.entries.maid.maid_skin.name": "Apariencia de la Sirvienta", + "patchouli.touhou_little_maid.book.entries.maid.maid_skin.pages.0.text": "La skin de la maid es totalmente personalizable, puedes cambiar fácilmente la skin de las maids en el juego.$(br2)también puedes añadir un paquete de recursos de terceros para aumentar el estilo de la skin de la maid.$(br2)Usa $(l:https://blockbench. et/)Blockbench$(/l) software para crear fácilmente tu propio paquete de recursos de la maid, y colocar el paquete en la carpeta $(#f00)tlm_custom_pack$() bajo el directorio del juego.", "patchouli.touhou_little_maid.book.entries.maid.maid_skin.pages.1.text": "Puedes hacer click en el botón de la imagen para abrir la interfaz de personalización.", "patchouli.touhou_little_maid.book.entries.maid.maid_sound.name": "Sonido de Maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.0.text": "Puedes hacer paquetes de recursos de sonido personalizados para reemplazar o expandir los efectos de sonido de la maid.", + "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.1.text": "Puedes hacer click en el botón de la imagen para abrir la interfaz de personalización de la maid.", "patchouli.touhou_little_maid.book.entries.maid.maid_task.name": "Tareas de Maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.0.text": "Cuando abres la GUI de una maid, puedes ver un botón de tarea de maid, haz clic en él para cambiar la tarea de la maid.$(br2)También puedes hacer clic en el botón de programación para cambiar la programación de la maid para que pueda trabajar, descansar o dormir en diferentes períodos de tiempo.", + "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.1.text": "Haz clic en el botón en la esquina inferior derecha de la imagen para cambiar de imagen", "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.name": "Amuleto del silencio", "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.pages.0.text": "Después de equipar esto la maid no te dirá ni los buenos días.", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.name": "Nombrar huevos", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.0.text": "Una maid con un nombre especifico puede mostrar un modelo especial.$(br2)Por defecto, una maid nombrada como $(#ff0000)=>id$() puede convertiste en el modelo de aspecto del jugador correspondiente a ese id.$(br2)El paquete de recursos de la maid también puede añadir modelos personalizados de huevos, incluso modelos de huevos cifrados SHA1.", + "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.1.text": "Maid con el nombre $(#ff0000)=>Notch$().", "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.name": "Generar Maid", + "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.0.text": "La manera de conseguir una maid es muy especial y se debe hacer a través de un altar de bloques múltiples.$(br2)Dado a que es probable que la receta cambie en el futuro, por favor revisa las recetas del altar en JEI.$(br2)Después de que la maid aparezca con éxito en el altar, obtendrás una caja de pastel con la maid, simplemente haz click derecho para abrir la caja.", + "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.1.text": "Necesitas hacer click derecho tres veces para activar las diferentes etapas de apertura, y finalmente la caja del pastel desaparecerá.$(br2)Necesitaras un pastel para domesticar a la maid. Los elementos para domesticar a la maid pueden ser cambiados en el archivo de configuración.$(br2)La maid domesticada es idéntica a una mascota del vanilla, y puedes hacer click derecho para abrir su GUI.", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.name": "Jizo sustituto", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.pages.0.text": "El jizo sustituto es un item del modo creativo este puede hacer invencible a una maid haciendo click derecho en la maid.", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.name": "Casa de la maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.0.text": "Cuando se hace clic en el botón del modo hogar, la maid registrará la posición actual y se moverá dentro de un rango de 12 a su alrededor. (El rango se puede modificar en el archivo de configuración)", + "patchouli.touhou_little_maid.book.entries.maid.film.name": "Película", + "patchouli.touhou_little_maid.book.entries.maid.film.pages.0.text": "La maid soltará una película después de la muerte, y la película se puede utilizar en altar para renacer a la maid. La película$(br2)no será destruida por fuego o lava.", + "patchouli.touhou_little_maid.book.entries.maid.gap.name": "Brecha", + "patchouli.touhou_little_maid.book.entries.maid.gap.pages.0.text": "Una bolsa que puede transportar objetos. $(br2)Puedes hacer clic derecho en el cofre con la brecha para marcarlo, luego abre su GUI para hacer algunos ajustes, y finalmente colocarlo en el inventario de amuletos de la maid. $(br2)Después de esto, la maid eliminará/depositará los objetos especificados \"inalámbricamente\" del cofre.", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.1.text": "Puedes usar la brújula para ver la posición de casa de la maid", + "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.name": "Guerra de bola de neve", + "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.pages.0.text": "Cuando la maid está en la nieve y en tareas inactivas, la maid lanza bolas de nieve al jugador u otras maids", + "patchouli.touhou_little_maid.book.entries.maid.chat_bubbles.name": "Burbujas de chat", + "patchouli.touhou_little_maid.book.entries.maid.chat_bubbles.pages.0.text": "La maid de vez en cuando muestra varias burbujas de chat, que también se pueden personalizar a través de paquetes de modelos", + "patchouli.touhou_little_maid.book.entries.maid.other_backpack.name": "Otra mochila", + "patchouli.touhou_little_maid.book.entries.maid.other_backpack.pages.0.text": "Algunas mochilas tienen otras funciones, como la mochila de mesa de crafteo, la mochila de horno y la mochila de cofre de ender", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.name": "Área de tarea de maid", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.0.text": "La brújula de kappa es una herramienta que puede definir el área de tareas de la maid. Puedes usarlo para establecer los lugares donde trabaja la maid, descansar o dormir.", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.1.text": "Primero tienes que hacer clic derecho en el bloque para establecer la posición, luego hacer clic derecho en la maid para escribir la posición. $(br2)Cuando el modo de casa de maid está activado, funcionará dentro del área.", + "patchouli.touhou_little_maid.book.entries.maid.last_slot.name": "Última ranura especial", + "patchouli.touhou_little_maid.book.entries.maid.last_slot.pages.0.text": "La última ranura en la columna superior de la mochila de la maid tendrá un efecto especial de visualización:$(li)Estandarte: El estandarte correspondiente se muestra en la espalda de la maid$(li)Arma: el arma correspondiente se muestra en la espalda de la maid$(li)Plantas: las plantas correspondientes se muestran encima de la cabeza de la maid", + "patchouli.touhou_little_maid.book.entries.maid.last_slot.pages.1.text": "Efecto de visualización del estandarte", + "patchouli.touhou_little_maid.book.entries.maid.maid_meal.name": "Comida de maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.0.text": "La maid puede comer mientras trabaja o está herida para aumentar su favorabilidad o restaurar su salud. ¡$(br2)Por favor pon comida en su mano principal o fuera de la mano!", + "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.1.text": "Cuando las maids están inactivas, buscarán tapetes de picnic cercanos para comer, lo que aumentará enormemente su preferencia.$(br2)¡Sírveles una comida deliciosa!", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.name": "Campana de sirvienta", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.pages.0.text": "La campana de sirvienta puede encontrar a la maid una por una. Si la maidestá en el chunk de descarga, también puede preguntarle dónde está la maid.$(br2)Mantén presionado este objeto y haz clic derecho en la maid para vincularlo!", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.name": "Cincel y estatuas", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.0.text": "Haz clic derecho en la arcilla con un cincel para hacer estatuas de diferentes tamaños. Actualmente admite tamaños de 1x1x1, 1x1x2, 2x2x4, 3x3x6.", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.1.text": "El jugador sujeta una foto de la maid en la mano, la mano principal tiene el cincel, luego haz click derecho en la esquina inferior izquierda de la estructura multibloque para grabar la maid en la foto.", + "patchouli.touhou_little_maid.book.entries.other.garage_kit.name": "Kit de garaje", + "patchouli.touhou_little_maid.book.entries.other.garage_kit.pages.0.text": "La estatua de tamaño 1x1 quemada al fuego puede ser convertida.", + "patchouli.touhou_little_maid.book.entries.other.maid_beacon.name": "Lámpara de templo", + "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.0.text": "La lámpara de templo es una buena decoración y tiene ciertas funciones prácticas. Haz clic derecho en la parte superior de la lámpara de templo para abrir la GUI, almacena el punto de poder del jugador.$(br2)La lámpara de templo también es un arma.", + "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.1.text": "También puede seleccionar el efecto, entonces consumirá puntos de poder para darle el efecto a las maid de los alrededores.$(br2)La lámpara también es una buena herramienta para recoger automáticamente puntos de poder. Puede recoger automáticamente puntos de energía dentro de 6 bloques y almacenarlos.", + "patchouli.touhou_little_maid.book.entries.other.trumpet.name": "Trompeta", + "patchouli.touhou_little_maid.book.entries.other.trumpet.pages.0.text": "Una herramienta para llamar a las maids, click derecho para usar.$(br2)$(4)$(l)Nota: este item solo puede llamar a las maids que estén en un chunk cargado. desde un punto de vista técnico, actualmente NO HAY FORMA de llamar a una maid en un chunk sin cargar.", "patchouli.touhou_little_maid.book.entries.other.chair.name": "Cojín personalizado", + "patchouli.touhou_little_maid.book.entries.other.chair.pages.0.text": "El cojín personalizado es un objeto puramente decorativo, colocado directamente en el suelo con el click derecho y el click izquierdo puede destruirlo, click derecho para sentarte, con shift y click derecho puedes abrir el GUI para cambiar el estilo del mismo.", + "patchouli.touhou_little_maid.book.entries.other.chair.pages.1.text": "Las maids pueden sentarse directamente en un cojín cuando estén cerca, utiliza el click derecho para que la maid deje el cojín.$(br2)El modelo del cojín es completamente personalizable, también puedes añadir un modelo personalizado con un paquete de recursos. Para cpsas relacionadas con la personalización, por favor revisa la wiki.", "patchouli.touhou_little_maid.book.entries.other.command.name": "Comando", + "patchouli.touhou_little_maid.book.entries.other.command.pages.0.text": "$(#f00)/tlm$(): Este es el comando proporcionado por el mod$(br2)Puedes usarlo para establecer poder, número de maid, o recargar el paquete del modelo.", "patchouli.touhou_little_maid.book.entries.other.extinguisher.name": "Extintor", "patchouli.touhou_little_maid.book.entries.other.extinguisher.pages.0.text": "El item se usa con el modo de extinción de la maid y no puede ser utilizado por los jugadores.", "patchouli.touhou_little_maid.book.entries.other.maid_bed.name": "Cama de maid", + "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.0.text": "El jugador puede dormir y, naturalmente, la maid también puede dormir. Durante el horario de sueño, la maid buscará la cama de los alrededores para dormir.$(br2)La maid durmiente ya no será atacada por criaturas hostiles y el GUI de la maid no se puede abrir en este momento.", + "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.1.text": "Maid durmiendo en la cama.", "patchouli.touhou_little_maid.book.entries.other.power_point.name": "Puntos de poder", "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "Click derecho para arrojarlo $(br2)Puedes encontrar los puntos de poder en forma de objeto en cofres de mazmorras.", + "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.name": "Cámara y foto", + "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.pages.0.text": "Llevar a una maid a través de dimensiones o a grandes distancias es un problema, y la cámara esta diseñada para este propósito.$(br2)Solo toma una foto a tu maid con la cámara y conviértela en una foto, luego tenla foto en la mano y haz click derecho en un bloque para liberarla.", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.name": "Cambiador de modelos", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.0.text": "Utilizado en modo creativo, principalmente diseñado para servidores, puede utilizarse para mostrar modelos de maid", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.1.text": "Primero tienes que hacer clic derecho en la maid con el bloque en tu mano luego coloque en el suelo y abra la interfaz de usuario para configurar el modelo que deseas mostrar.$(br2)Luego ingresa la señal de redstone en sus lados izquierdo y derecho para cambiar el modelo de la maid.", + "patchouli.touhou_little_maid.book.entries.other.chair_show.name": "Exhibición de sillas", + "patchouli.touhou_little_maid.book.entries.other.chair_show.pages.0.text": "Al mantener presionado el objeto y presionar el botón de sigilo, toda la silla mostrará la caja de colisión", + "patchouli.touhou_little_maid.book.entries.other.favorability_tool.name": "Herramienta de favorabilidad", + "patchouli.touhou_little_maid.book.entries.other.favorability_tool.pages.0.text": "Click derecho en la maid para cambiar la favorabilidad de la maid, solo modo creativo.", + "patchouli.touhou_little_maid.book.entries.other.fox_scroll.name": "Pergamino de zorro", + "patchouli.touhou_little_maid.book.entries.other.fox_scroll.pages.0.text": "Usado para encontrar la maid o tumba de la maid.", + "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.name": "Zorro inari de granito", + "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.pages.0.text": "El zorro inari de granito puede evitar la aparición de hadas maids, pero no evitará la aparición de otros mobs.$(br2)El rango de prevención es un rango cuadrado, ¡y la dirección Y cubre todo, desde el punto más bajo hasta el punto más alto!", + "patchouli.touhou_little_maid.book.entries.other.gomoku.name": "Gomoku", + "patchouli.touhou_little_maid.book.entries.other.gomoku.pages.0.text": "Puedes jugar gomoku con la maid y ganar aumentará la favorabilidad de la maid.$(br2)Después de que el jugador gane varias veces, las habilidades de gomoku de la maid también aumentarán.", + "patchouli.touhou_little_maid.book.entries.other.maid_joy.name": "Alegría de la maid", + "patchouli.touhou_little_maid.book.entries.other.maid_joy.pages.0.text": "La maid jugará en él durante su horario inactivo, lo que puede aumentar su favorabilidad.", + "patchouli.touhou_little_maid.book.entries.other.shrine.name": "Santuario", + "patchouli.touhou_little_maid.book.entries.other.shrine.pages.0.text": "Se puede encontrar con una baja probabilidad en el cofre de botín. Puede consumir la salud del jugador y renacer la maid en la película.", + "patchouli.touhou_little_maid.book.entries.other.broom.name": "Escoba", + "patchouli.touhou_little_maid.book.entries.other.broom.pages.0.text": "La escoba es un vehículo portable, pero se requiere que tú y la Maid lo usen juntos. $(br2)Usa el ratón para controlar la escoba para subir o bajar, y WASD para controlar el movimiento hacia adelante, atrás, izquierda y derecha.", + "patchouli.touhou_little_maid.book.entries.other.picnic_basket.name": "Cesta de picnic", + "patchouli.touhou_little_maid.book.entries.other.picnic_basket.pages.0.text": "La cesta de picnic puede almacenar comida, también puede convertirse en una manta de picnic haciendo clic derecho en un bloque y colocarlo en el suelo.", "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.name": "Gohei y Danmaku", + "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.pages.0.text": "El gohei es un arma cuerpo a cuerpo común.$(br2) La Maid sosteniendo un gohei disparará danmaku en la tarea de danmaku.$(br2) El Gohei puede encantarse con 2 encantamientos vanilla: disparo múltiple y carga rápida, ¡también puede encantarse con 3 nuevos encantamientos añadidos en este mod!", + "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.pages.1.text": "El gohei es una herramienta importante para construir un altar multi-bloque.", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.name": "Altar de bloques múltiples", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.0.text": "El altar es una estructura de bloques múltiples que es requerida para los crafteos de este mod.$(br2)Las recetas del altar pueden ser obtenidas utilizando el JEI, y el crafteo tambien requiere $(l:overview/power_point)power point$() del jugador.", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.1.text": "Presiona el click derecho en el centro de la lana roja con $(l:overview/gohei_and_danmaku)gohei$() para construir el altar.", + "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.2.title": "Altar Multi-bloque", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.3.text": "Puedes colocar un item dando click derecho en la parte superior de los seis pilares de madera del altar. Puedes remover un item teniendo la mano vacía y dando clilc derecho.$(br2)Cuando los items son colocados y los puntos de poder del jugador son suficientes, el altar activara el crafteo.$(br2)El crafteo puede ser interrumpido debido a la falta de poder, después de obtener el poder suficiente. haga click derecho para reactivar el crafteo.", "patchouli.touhou_little_maid.book.entries.overview.power_point.name": "Puntos de poder", + "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.0.text": "Los puntos de poder son un importante recurso de este mod, estos se obtienen matando a la $(l:overview/world_spawn#fairy)hada maid$().$(br2)Puede ser utilizado para crear el $(l:overview/multiblocks_altar)altar$().", + "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.1.text": "Cuando sostienes el $(l:overview/gohei_and_danmaku)gohei$(), Puedes ver tus puntos de poder en la esquina superior izquierda de la pantalla.$(br2)El poder maximo que se puede obtener es 5, no subira mas de ese numero. $(br2)La maid puede recoger puntos de poder y reparará todos los elementos en su inventario que tengan el encantamiento $(5)Reparación$().", + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.name": "Touhou Project", "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.text": "Touhou project es una serie de juegos shoot 'em up creada por un único miembro de Team Shanghai Alice conocido como ZUN.", - "patchouli.touhou_little_maid.book.entries.overview.world_spawn.name": "Punto de aparición" + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.link_text": "Touhou Wiki", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.name": "Punto de aparición", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.0.text": "Este mod añade dos mobs. $(br2)El botín que suelta los mobs son ingredientes de crafteo importantes.$(br2)El probabilidad de aparición de las criaturas hostiles de este mod puede ser modificado en el archivo de configuracion. cuando es puesto en 0, estos monstruos no aparecerán.", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.1.text": "Aparecerá en cualquier bioma por la noche, volará y disparará a danmaku para atacar a jugadores o gólems de hierro.", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.2.text": "En la jaula de los puestos de saqueadores, existe la posibilidad de que aparezca una maid", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.name": "Hacer modelo personalizado", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.0.text": "Hacer un paquete de modelo personalizado es muy simple, todo lo que necesitas es el software de Blockbench, Blockbench es un software libre y de código abierto que es fácil de usar. $(br2)El modelo personalizado también soporta animaciones de Bedrock Edition, así como un rico conjunto de variables molang.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.text": "He diseñado especialmente un plugin para hacer el paquete de modelo para Blockbench, visita el enlace de abajo para aprender cómo instalar el plugin.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.link_text": "Abrir enlace", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.name": "Descargar modelo personalizado", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.1.text": "Puedes encontrar el botón de descarga del paquete de modelos en la parte inferior de la GUI.", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.text": "Haz clic en él para abrir la descarga de GUI y elige descargar el paquete de modelos que te guste.$(br2)Los paquetes de modelo están hechos por jugadores. Si también deseas publicar tu paquete de modelo personalizado, puedes hacer clic en el botón de abajo para unirte a nuestro grupo de Discord y enviar tu paquete de modelo.", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.link_text": "Link de Discord", + "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.name": "Cambios Vanilla", + "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.pages.0.text": "Hemos modificado el modelo de Slime al yukkuri.", + "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.pages.1.text": "También cambiamos las texturas de Orbes de Experiencia, Botella de Experiencia, y el Tótem de la inmortalidad. $(br2)Estos pueden desactivarse en el archivo de configuración.", + "patchouli.touhou_little_maid.book.entries.overview.favorability.name": "Amistad", + "patchouli.touhou_little_maid.book.entries.overview.favorability.pages.0.text": "Favorabilidad puede aumentar la salud y el ataque de la maid.$(br2)Mejorar favorabilidad de la maid$(li)Cuando la maid está inactiva, juega con el teclado, la computadora, la librería y el gomoku.$(li)La maid duerme.$(br2)Reduce la favorabilidad de la maid:$(li)Muerte de la maid.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.name": "Texto personalizado de burbuja de chat", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.0.text": "Puedes usar un libro y una pluma para personalizar el texto de la burbuja de chat de la maid.$(br2)Simplemente escribe el texto en el formato que se muestra a la derecha y usa una línea en blanco para separar cada texto.$(br2)Puedes escribir varias páginas y se analizará cada una de ellas.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.1.text": "Incluso puedes insertar caracteres de formato de vanilla para mostrar texto de color.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.2.text": "Pero debe haber un nombre de tipo en la primera línea de cada página. Especifica bajo qué circunstancias se muestra el texto.$(br2)Los nombres de tipo disponibles son estos:$(br)Relacionado con el horario:$(li)trabajo: se muestra durante cualquier horario de trabajo$(li)inactividad: se muestra durante el horario de descanso o la tarea inactiva$(li)dormir: se muestra durante el sueño", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.3.text": "Situación especial:$(li)mañana: Mostrar en la mañana$(li)noche: mostrar en la noche$(li)lluvia: mostrar cuando llueva$(li)nieve: mostrar cuando nieva$(li)frío: mostrar cuando está en un bioma frío$(li)caliente: mostrar cuando está en un bioma caliente$(li)herida: se muestra cuando es herida$(li)suplicar: se muestra cuando suplica", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.4.text": "Tarea de trabajo:$(li)Se mostrará en una tarea de trabajo específica, como ataque, granja, etc.$(br2)Cuando hayas escrito el texto, solo necesitas hacer clic derecho en la maid para escribir el texto.$(br)Si haces clic derecho en la maid con un libro y una pluma (o un libro escrito) mientras mantienes presionada la tecla shift, puedes borrar el texto de la maid.$(br)Si sostienes un libro y una pluma en blanco y haces clic derecho en una maid que ya tiene un texto, puedes copiar el texto de la maid al libro.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.5.text": "Cuando la función de consejos avanzados (F3+H) está activada, puede ver el id de la tarea." } diff --git a/src/main/resources/assets/touhou_little_maid/lang/fr_fr.json b/src/main/resources/assets/touhou_little_maid/lang/fr_fr.json index 2b4b031d3..a406ee470 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/fr_fr.json +++ b/src/main/resources/assets/touhou_little_maid/lang/fr_fr.json @@ -13,7 +13,8 @@ "advancements.touhou_little_maid.base.craft_chair.title": "Seize Chaises Sèchent", "advancements.touhou_little_maid.base.kill_maid_fairy.description": "Tuer une Maid Féérique", "advancements.touhou_little_maid.base.kill_maid_fairy.title": "Ennuyantes Petites Fées", - "advancements.touhou_little_maid.base.pickup_power_point.description": "Ramasser des Power Points", + "advancements.touhou_little_maid.base.pickup_power_point.description": "Ramasser des Points Spirituels", + "advancements.touhou_little_maid.base.pickup_power_point.title": "Taste the Rainbow", "advancements.touhou_little_maid.base.spawn_maid.description": "Invoquer une Maid depuis le Sanctuaire", "advancements.touhou_little_maid.base.spawn_maid.title": "Une Nouvelle Vie", "advancements.touhou_little_maid.base.tamed_maid.description": "Apprivoisez une Maid avec un gâteau", @@ -24,60 +25,88 @@ "advancements.touhou_little_maid.challenge.any_equipment.title": "Optimisation en cours", "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "Nourrissez votre Maid avec une pomme dorée enchantée", "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.title": "Good Apple", - "advancements.touhou_little_maid.challenge.kill_100.description": "Faite tuer 100 monstres à votre Maid", + "advancements.touhou_little_maid.challenge.kill_100.description": "Faites tuer 100 monstres à votre Maid", "advancements.touhou_little_maid.challenge.kill_100.title": "Chasseur Lunatique", - "advancements.touhou_little_maid.challenge.kill_wither.description": "Faite tuer un Wither à votre Maid", + "advancements.touhou_little_maid.challenge.kill_wither.description": "Faites tuer un Wither à votre Maid", "advancements.touhou_little_maid.challenge.kill_wither.title": "Tueur de Wither", - "advancements.touhou_little_maid.challenge.kill_dragon.description": "Faite tuer l'Ender Dragon à votre Maid", + "advancements.touhou_little_maid.challenge.kill_dragon.description": "Faites tuer l'Ender Dragon à votre Maid", "advancements.touhou_little_maid.challenge.kill_dragon.title": "Savoir attacher la Dragonne", - "advancements.touhou_little_maid.challenge.kill_slime_300.description": "Faite tuer 300 Slimes ou Magma Cube à votre Maid", + "advancements.touhou_little_maid.challenge.kill_slime_300.description": "Faites tuer 300 Slimes ou Magma Cube à votre Maid", "advancements.touhou_little_maid.challenge.kill_slime_300.title": "Un peu gluant mais appétissant", "advancements.touhou_little_maid.challenge.lightning_bolt.description": "Invoque la foudre à un Sanctuaire, et laisse l'éclair frapper une Maid", "advancements.touhou_little_maid.challenge.lightning_bolt.title": "La colère de Tojiko !", - "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "Faite augmenter les PV d'une Maid jusqu'à 100", + "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "Faites augmenter les PV d'une Maid jusqu'à 100", "advancements.touhou_little_maid.challenge.maid_100_healthy.title": "Cent pour Sang", - "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "Faite pêcher un livre enchanté à votre Maid", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "Faites pêcher un livre enchanté à votre Maid", "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.title": "Poisson d'Av-Reel", "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.description": "Apprivoisez une Maid trouvé dans un avant-poste de pillard", "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.title": "Vous avez sauvé une Princesse !", "advancements.touhou_little_maid.favorability.favorability_increased.description": "Augmenter l'affinité d'une Maid", "advancements.touhou_little_maid.favorability.favorability_increased.title": "Un grand pouvoir...", "advancements.touhou_little_maid.favorability.favorability_increased_max.description": "Augmenter au maximum l'affinité d'une Maid", - "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "...implique de grandes responsabilités !", - "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "Faite manger vos Maids sur un Panier de Pique-Nique", + "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "...de grandes responsabilités !", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "Faites manger vos Maids sur un Panier de Pique-Nique", "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "Un délicieux moment ensemble", - "advancements.touhou_little_maid.favorability.maid_sleep.description": "Faite dormir votre Maid dans un Lit pour Maid", - "advancements.touhou_little_maid.favorability.win_wchess.description": "Gagner une partie d'échec contre votre Maid", + "advancements.touhou_little_maid.favorability.maid_sit_joy.description": "Faites asseoir votre Maid sur n'importe quel Jouet pour Maid", + "advancements.touhou_little_maid.favorability.maid_sit_joy.title": "Un endroit confortable", + "advancements.touhou_little_maid.favorability.maid_sleep.description": "Faites dormir votre Maid dans un Lit pour Maid", + "advancements.touhou_little_maid.favorability.maid_sleep.title": "Bonne nuit les petits", + "advancements.touhou_little_maid.favorability.win_cchess.description": "Gagnez une partie de Xiangqi contre votre Maid", + "advancements.touhou_little_maid.favorability.win_cchess.title": "Maître des échecs !", + "advancements.touhou_little_maid.favorability.win_wchess.description": "Gagnez une partie d'échec contre votre Maid", "advancements.touhou_little_maid.favorability.win_wchess.title": "Échec et mat !", - "advancements.touhou_little_maid.favorability.win_gomoku.description": "Gagner une partie de Gomoku contre votre Maid", + "advancements.touhou_little_maid.favorability.win_gomoku.description": "Gagnez une partie de Gomoku contre votre Maid", "advancements.touhou_little_maid.favorability.win_gomoku.title": "Cinq à la suite !", - "advancements.touhou_little_maid.maid_base.maid_feed_player.description": "Faite vous nourrir directement par votre Maid", + "advancements.touhou_little_maid.maid_base.chisel_statue.description": "Fabriquez une statuette avec un bloc d'argile", + "advancements.touhou_little_maid.maid_base.chisel_statue.title": "Arts Craft", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.description": "Faites boire un seau de lait à votre Maid", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.title": "Sorcières embêtantes...", + "advancements.touhou_little_maid.maid_base.maid_backpack.description": "Équipez n'importe quel sac à dos sur votre Maid", + "advancements.touhou_little_maid.maid_base.maid_backpack.title": "Emballé, c'est pesé", + "advancements.touhou_little_maid.maid_base.maid_farm.description": "Faites planter ou récolter des cultures à votre Maid", + "advancements.touhou_little_maid.maid_base.maid_farm.title": "Le vieux MacDonald a une Ferme", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.description": "Faites que votre Maid élève des animaux", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.title": "30 Millions d'Amis", + "advancements.touhou_little_maid.maid_base.maid_feed_player.description": "Faites vous nourrir directement par votre Maid", "advancements.touhou_little_maid.maid_base.maid_feed_player.title": "Mange mon pain Eren", - "advancements.touhou_little_maid.maid_base.maid_fishing.description": "Faite partir votre Maid à la pêche", + "advancements.touhou_little_maid.maid_base.maid_fishing.description": "Faites partir votre Maid à la pêche", "advancements.touhou_little_maid.maid_base.maid_fishing.title": "Non, ce n'est pas KKHTA", - "advancements.touhou_little_maid.maid_base.maid_kill_mob.description": "Faite tuer un monstre à votre Maid", + "advancements.touhou_little_maid.maid_base.maid_kill_mob.description": "Faites tuer un monstre à votre Maid", "advancements.touhou_little_maid.maid_base.maid_kill_mob.title": "Petite Chasseuse", "advancements.touhou_little_maid.maid_base.photo_maid.description": "Prenez votre Maid en photo", "advancements.touhou_little_maid.maid_base.photo_maid.title": "Ayaya...", - "advancements.touhou_little_maid.maid_base.pickup_garage_kit.description": "Créer et récupérer une Statuette", + "advancements.touhou_little_maid.maid_base.pickup_garage_kit.description": "Créez et récupérer une Statuette", "advancements.touhou_little_maid.maid_base.pickup_garage_kit.title": "La Résine Spécial d'Olivier", - "advancements.touhou_little_maid.maid_base.pickup_maid.description": "Faite un clic droit sur votre Maid avec une selle", + "advancements.touhou_little_maid.maid_base.pickup_maid.description": "Faites un clic droit sur votre Maid avec une selle", "advancements.touhou_little_maid.maid_base.pickup_maid.title": "Petite Princesse", - "advancements.touhou_little_maid.maid_base.reborn_maid.description": "Ressuscité votre Maid à un Sanctuaire", + "advancements.touhou_little_maid.maid_base.reborn_maid.description": "Ressuscitez votre Maid à un Sanctuaire", "advancements.touhou_little_maid.maid_base.reborn_maid.title": "La vie après la mort", - "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.description": "Ressuscité votre Maid à un Autel", + "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.description": "Ressuscitez votre Maid à un Autel", "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.title": "Vie partagée", + "advancements.touhou_little_maid.maid_base.switch_schedule.description": "Modifiez les horaires de votre Maid", "advancements.touhou_little_maid.maid_base.switch_schedule.title": "Jamais en retard ni en avance", + "advancements.touhou_little_maid.maid_base.switch_task.description": "Changez la tâche d'une Maid", + "advancements.touhou_little_maid.maid_base.switch_task.title": "Nouveau job !", + "advancements.touhou_little_maid.maid_base.take_maid_xp.description": "Faites un clic droit sur votre Maid en tenu une Fiole pour récupérer son XP", + "advancements.touhou_little_maid.maid_base.take_maid_xp.title": "Récolte du Jour", "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.description": "Équipez un Aimant à objet à votre Maid", + "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.title": "Accio !", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.description": "Faites esquiver un projectile à votre Maid grâce à une Étoffe Habile", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.title": "Pas de flèche dans le genou !", "advancements.touhou_little_maid.maid_base.use_protect_bauble.description": "Équipez n'importe quelle Relique de protection à votre Maid", "advancements.touhou_little_maid.maid_base.use_protect_bauble.title": "Protéger !", - "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.description": "Utiliser un Parchemin de Renard Roux pour retrouver votre Maid se trouvant dans un chunk non chargé", + "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.description": "Utilisez un Parchemin de Renard Roux pour retrouver votre Maid se trouvant dans un chunk non chargé", "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.title": "Never Gonna Say Goodbye", + "advancements.touhou_little_maid.maid_base.use_servant_bell.description": "Utilisez la Cloche de Serviteur pour rappeler votre Maid", "advancements.touhou_little_maid.maid_base.use_servant_bell.title": "Never Gonna Give You Up", - "advancements.touhou_little_maid.maid_base.use_undead_bauble.description": "Faite que votre Maid annule une mort grâce à un Élixir d'orbe ultramarine ou à un Totem d'immortalité", - "advancements.touhou_little_maid.maid_base.use_undead_bauble.title": "Oooh, je suis zombie", - "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.description": "Utilisé un Parchemin de Renard Blanc pour retrouver la tombe de votre Maid", + "advancements.touhou_little_maid.maid_base.use_trumpet.description": "Utilisez la trompette pour rappeler toutes vos Maids", + "advancements.touhou_little_maid.maid_base.use_trumpet.title": "Zun-pets", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.description": "Faites que votre Maid annule une mort grâce à un Élixir d'orbe ultramarine ou à un Totem d'immortalité", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.title": "Oooh, je suis une Zombie", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.description": "Utilisez un Parchemin de Renard Blanc pour retrouver la tombe de votre Maid", "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.title": "Never Gonna Run Around and Desert You", + "advancements.touhou_little_maid.maid_base.use_wireless_io.description": "Utilisez une Brèche pour transférer des objets d'un coffre à une Maid, ou inversement", + "advancements.touhou_little_maid.maid_base.use_wireless_io.title": "Une Pensée Ébréchée", "entity.touhou_little_maid.chair": "Chaise", "entity.touhou_little_maid.maid": "Maid", "entity.touhou_little_maid.fairy": "Maid féerique", @@ -85,7 +114,7 @@ "entity.touhou_little_maid.box": "Boîte à gâteau", "entity.touhou_little_maid.power_point": "Point Spirituel", "entity.touhou_little_maid.throw_power_point": "Point Spirituel", - "entity.touhou_little_maid.extinguishing_agent": "Pompière", + "entity.touhou_little_maid.extinguishing_agent": "Pompier", "entity.touhou_little_maid.sit": "Assis", "entity.touhou_little_maid.tombstone": "Pierre tombale", "entity.touhou_little_maid.tombstone.display": "ce repose ici", @@ -103,17 +132,18 @@ "item.touhou_little_maid.furnace_backpack": "Sac à dos Fourneau", "item.touhou_little_maid.tank_backpack": "Sac à dos Réservoir", "item.touhou_little_maid.chair": "Chaise", + "item.touhou_little_maid.chair.prefix": "Chaise: ", "item.touhou_little_maid.hakurei_gohei": "Gohei de Hakurei", "item.touhou_little_maid.sanae_gohei": "Gohei de Sanae", "item.touhou_little_maid.extinguisher": "Extincteur", - "item.touhou_little_maid.ultramarine_orb_elixir": "§6Élixir d'orbe ultramarine", + "item.touhou_little_maid.ultramarine_orb_elixir": "§6Élixir d'Orbe Ultramarine", "item.touhou_little_maid.explosion_protect_bauble": "§6Relique anti-explosion", "item.touhou_little_maid.fire_protect_bauble": "§6Relique anti-feu", "item.touhou_little_maid.projectile_protect_bauble": "§6Relique anti-projectile", "item.touhou_little_maid.magic_protect_bauble": "§6Relique anti-potion", "item.touhou_little_maid.fall_protect_bauble": "§6Relique anti-chute", "item.touhou_little_maid.drown_protect_bauble": "§6Relique anti-noyade", - "item.touhou_little_maid.nimble_fabric": "§6Étoffe Nimble", + "item.touhou_little_maid.nimble_fabric": "§6Étoffe Habile", "item.touhou_little_maid.item_magnet_bauble": "§6Aimant à objet", "item.touhou_little_maid.mute_bauble": "§6Relique de mutisme", "item.touhou_little_maid.entity_placeholder": "Apparition ???", @@ -126,86 +156,271 @@ "item.touhou_little_maid.smart_slab": "Sort d'âme", "item.touhou_little_maid.trumpet": "Trompette", "item.touhou_little_maid.wireless_io": "§6Brèche", - "item.touhou_little_maid.chair_show": "Révélateur pour Chaise", + "item.touhou_little_maid.chair_show": "Révélateur de Chaise", "item.touhou_little_maid.red_fox_scroll": "Parchemin de Renard Roux", "item.touhou_little_maid.white_fox_scroll": "Parchemin de Renard Blanc", "item.touhou_little_maid.favorability_tool_add": "Outil d'Affinité", "item.touhou_little_maid.favorability_tool_full": "Outil d'Affinité", "item.touhou_little_maid.favorability_tool_reduce": "Outil d'Affinité", - "item.touhou_little_maid.kappa_compass": "Boussole de Kappa", + "item.touhou_little_maid.kappa_compass": "Boussole Kappa", "item.touhou_little_maid.broom": "Balai de Marisa", "item.touhou_little_maid.picnic_basket": "Panier de Pique-Nique", + "item.touhou_little_maid.servant_bell": "Cloche de Serviteur", + "item.touhou_little_maid.monster_list": "Liste de Monstre (Retirée)", + "item.touhou_little_maid.advancement_icon": "Icône de Progression", + "item.touhou_little_maid.entity_id_copy": "Copieur d'ID d'entité", + "enchantment.touhou_little_maid.impeding": "Danmaku Entravant", + "enchantment.touhou_little_maid.impeding.desc": "Les Danmaku peuvent infliger lenteur I - IV aux ennemies", + "enchantment.touhou_little_maid.speedy": "Danmaku Véloce", + "enchantment.touhou_little_maid.speedy.desc": "La vitesse des Danmaku double au niveau 1 et triple au niveau 2", + "enchantment.touhou_little_maid.enders_ender": "L'Ender de l'Ender", + "enchantment.touhou_little_maid.enders_ender.desc": "Les Danmaku peuvent causer des dégâts aux Endermans et à l'Ender Dragon", "block.touhou_little_maid.maid_bed": "Lit pour Maid", "block.touhou_little_maid.garage_kit": "Statuette", + "block.touhou_little_maid.garage_kit.prefix": "Statuette: ", "block.touhou_little_maid.maid_beacon": "Lanterne de Sanctuaire", + "block.touhou_little_maid.model_switcher": "Changeur de Modèle", "block.touhou_little_maid.gomoku": "Gomoku", + "block.touhou_little_maid.keyboard": "Piano", + "block.touhou_little_maid.bookshelf": "Bibliothèque", "block.touhou_little_maid.computer": "Ordinateur", "block.touhou_little_maid.shrine": "Autel", + "block.touhou_little_maid.altar": "Sanctuaire", + "block.touhou_little_maid.statue": "Statuette", + "block.touhou_little_maid.picnic_mat": "Nappe de Pique-Nique", + "block.touhou_little_maid.cchess": "Xiangqi (Échecs Chinois)", + "block.touhou_little_maid.wchess": "Échecs", "block.touhou_little_maid.scarecrow": "Inari Renard en Granite", - "tooltips.touhou_little_maid.chair.place.desc": "Faite un clic droit sur le sommet d'un bloc pour le placer.", - "tooltips.touhou_little_maid.chair.destroy.desc": "Accroupie + clic gauche pour le détruire.", - "tooltips.touhou_little_maid.chair.gui.desc": "Accroupie + clic droit pour ouvrir l'interface de skin.", + "entity.touhou_little_maid.maid.tip": "Apprivoisez une Maid avec un gâteau et choisissez-lui une tâche pour qu'elle vous assiste. Regardez dans votre livre \"Mémoire de Gensokyo\" pour en savoir plus.", + "entity.touhou_little_maid.fairy.tip": "Peu voler et tirer des Danmaku sur vous. Donne des Points Spirituels une fois tués.", + "entity.touhou_little_maid.broom.tip": "Votre Maid doit être assise avec vous pour pouvoir vous envolez dans ciel. Les monstres volant comme les Maids Féériques et les Phantoms pourront toujours vous atteindres.", + "item.touhou_little_maid.power_point.tip": "Points Spirituels pouvant être trouvés dans les coffres de donjon. Lancer les pour obtenir des Points Spirituels.", + "item.touhou_little_maid.broom.tip": "Votre Maid doit être assise avec vous pour pouvoir vous envolez dans ciel. Les monstres volant comme les Maids Féériques et les Phantoms pourront toujours vous atteindres.", + "item.touhou_little_maid.maid_backpack_small.tip": "Augmente l'inventaire de votre Maid de 12 cases.", + "item.touhou_little_maid.maid_backpack_middle.tip": "Augmente l'inventaire de votre Maid de 24 cases.", + "item.touhou_little_maid.maid_backpack_big.tip": "Augmente l'inventaire de votre Maid de 36 cases.", + "item.touhou_little_maid.explosion_protect_bauble.tip": "Donne à votre Maid une résistance aux dégâts d'explosion.", + "item.touhou_little_maid.fall_protect_bauble.tip": "Donne à votre Maid une résistance aux dégâts de chute.", + "item.touhou_little_maid.drown_protect_bauble.tip": "Donne à votre Maid une résistance aux dégâts de noyade.", + "item.touhou_little_maid.fire_protect_bauble.tip": "Donne à votre Maid une résistance aux dégâts de feu.", + "item.touhou_little_maid.projectile_protect_bauble.tip": "Donne à votre Maid une résistance aux dégâts des projectiles.", + "item.touhou_little_maid.magic_protect_bauble.tip": "Donne à votre Maid une résistance aux effets.", + "item.touhou_little_maid.item_magnet_bauble.tip": "Augmente la portée de ramassage de votre Maid.", + "item.touhou_little_maid.mute_bauble.tip": "Réduit votre Maid au silence si vous n'êtes pas fan de l'entendre parler fréquemment.", + "item.touhou_little_maid.nimble_fabric.tip": "Donne à votre Maid la capacitée d'esquiver les projectiles en se téléportant.", + "item.touhou_little_maid.crafting_table_backpack.tip": "Augmente l'inventaire de votre Maid de 18 cases et lui fait transporter un Établi utilisable à tout instant.", + "item.touhou_little_maid.furnace_backpack.tip": "Augmente l'inventaire de votre Maid de 18 cases et lui fait transporter un Fourneau utilisable à tout instant.", + "item.touhou_little_maid.hakurei_gohei.tip": "Le Gohei est utile pour créer le Sanctuaire après que vous l'ayez pré-construit. Une Maid peut tenir un Gohei pour tirer des Danmaku sur les monstres hostiles.", + "item.touhou_little_maid.sanae_gohei.tip": "Le Gohei est utile pour créer le Sanctuaire après que vous l'ayez pré-construit. Une Maid peut tenir un Gohei pour tirer des Danmaku sur les monstres hostiles.", + "item.touhou_little_maid.film.tip": "Votre Maid est décédée. Pour la ressusciter, placez-la dans le Sanctuaire avec un Lingot d'or, un Lingot de Fer, un Lapis Lazuli, un Charbon et une Redstone sur chaque pilier, ou placez-la dans un Autel", + "item.touhou_little_maid.wireless_io.tip": "La Brèche est configurable pour envoyer des objets du coffre à la Maid et vice versa.", + "item.touhou_little_maid.picnic_basket.tip": "Jusqu'à quatre Maids peuvent profiter du Pique-Nique lorsqu'elles sont en heures de pause. Soyez sûr d'avoir remplie le panier avec de la nourriture. Cela augmenteras l'affinité de vos Maids.", + "block.touhou_little_maid.gomoku.tip": "Défiez votre Maid au Gomoku, serez-vous capable de la surpasser dans ce jeu de société ?", + "block.touhou_little_maid.maid_bed.tip": "Les Maids dorment dans ce lit quand il est temps de se reposer. Cela augmente leur affinité.", + "block.touhou_little_maid.shrine.tip": "Les Autels peuvent être rarement trouvés dans n'importe quel coffre, ils peuvent être utilisés pour ressusciter votre Maid mais cela réduiras votre santé à 1.", + "block.touhou_little_maid.computer.tip": "Permet à votre Maid de se divertir ce qui augmente son affinité.", + "block.touhou_little_maid.keyboard.tip": "Permet à votre Maid de se divertir ce qui augmente son affinité.", + "block.touhou_little_maid.bookshelf.tip": "Permet à votre Maid de se divertir ce qui augmente son affinité.", + "block.touhou_little_maid.scarecrow.tip": "Une fois placé au sol, il empêchera les Maids Féériques d'apparaître dans une zone prédéfinie.", + "tooltips.touhou_little_maid.chair.place.desc": "Faites un clic droit sur le sommet d'un bloc pour le placer.", + "tooltips.touhou_little_maid.chair.destroy.desc": "Accroupi + clic gauche pour le détruire.", + "tooltips.touhou_little_maid.chair.gui.desc": "Accroupi + clic droit pour ouvrir l'interface de skin.", + "tooltips.touhou_little_maid.schedule.desc": "§7Cliquez pour changer d'horaire", + "tooltips.touhou_little_maid.info.title": "Détail de la Maid", + "tooltips.touhou_little_maid.info.owner": "Maitre", "tooltips.touhou_little_maid.info.model_name": "Nom du modèle", + "tooltips.touhou_little_maid.info.experience": "Expérience", "tooltips.touhou_little_maid.info.favorability": "Affinité", - "tooltips.touhou_little_maid.bauble.desc": "§a[Maid Relique]", + "tooltips.touhou_little_maid.info.game_skill.gomoku": "Défaite: %d, Rang: %d", + "tooltips.touhou_little_maid.bauble.desc": "§a[Relique de Maid]", "tooltips.touhou_little_maid.bauble.usage": "Doit être placé dans l'inventaire à relique de la Maid", - "tooltips.touhou_little_maid.substitute_jizo.desc": "Faite un clic droit avec sur une Maid pour la rendre invulnérable, obtenable uniquement en créatif", + "tooltips.touhou_little_maid.backpack.desc": "§6[Sac à dos de Maid]", + "tooltips.touhou_little_maid.backpack.usage": "Utilisez cet item sur votre Maid à l'aide d'un clic droit pour le lui équipé", + "tooltips.touhou_little_maid.substitute_jizo.desc": "Faites un clic droit sur une Maid avec le Substitut de Jizo pour la rendre invulnérable, obtenable uniquement en créatif", + "tooltips.touhou_little_maid.photo.no_data.desc": "Il n'y a pas de Maid sur cette photo", + "tooltips.touhou_little_maid.film.no_data.desc": "Il n'y a pas de Maid sur cette pellicule", "tooltips.touhou_little_maid.photo.maid.desc": "Nom de la Maid: %s", + "tooltips.touhou_little_maid.camera.desc": "Peux capturer une Maid, du moins dans la plupart des cas...", + "tooltips.touhou_little_maid.smart_slab.desc": "Objet réutilisable, clic droit pour invoquer ou révoquer la Maid", + "tooltips.touhou_little_maid.smart_slab.maid_name": "Nom de la Maid : %s", + "tooltips.touhou_little_maid.smart_slab.maid_name.unknown": "Inconnu", "tooltips.touhou_little_maid.trumpet.desc.usage": "Téléporte toute vos Maids sur vous", "tooltips.touhou_little_maid.trumpet.desc.note": "Attention : Les Maids doivent être dans un chunk actuellement chargé pour être téléportées !", + "tooltips.touhou_little_maid.wireless_io.usage.1": "Une Maid avec cette Relique peut retirer/déposer des objets depuis un coffre.", + "tooltips.touhou_little_maid.wireless_io.usage.2": "Accroupi + clic droit sur un coffre pour les liés ensembles, clic droit dans les airs pour ouvrir son interface.", + "tooltips.touhou_little_maid.wireless_io.io_mode.input": "Maid -> Coffre", + "tooltips.touhou_little_maid.wireless_io.io_mode.output": "Coffre -> Maid", "tooltips.touhou_little_maid.wireless_io.filter_mode.blacklist": "Liste noire", "tooltips.touhou_little_maid.wireless_io.filter_mode.whitelist": "Liste blanche", + "tooltips.touhou_little_maid.wireless_io.binding_pos.has": "Position enregistrée: %d, %d, %d", + "tooltips.touhou_little_maid.wireless_io.binding_pos.none": "Aucun Coffre lié", + "tooltips.touhou_little_maid.maid_beacon.desc": "Point Stocké: %s", + "tooltips.touhou_little_maid.chair_show.desc": "Tenez cet objet en main et accroupissez-vous pour voir la hit box des chaises", + "tooltips.touhou_little_maid.model_switcher.bounded": "Lier à une Maid", + "tooltips.touhou_little_maid.custom_sound.credit": "Jouer un son de crédit", + "tooltips.touhou_little_maid.custom_sound.open_url": "Ouvrir l'url du pack de sons", + "tooltips.touhou_little_maid.custom_sound.play_sound": "Cliquez pour jouer le son", "tooltips.touhou_little_maid.fox_scroll.dimension": "§a▍ §7Dimension: %s", "tooltips.touhou_little_maid.fox_scroll.position": "§a▍ §7Position: [%s§7]", - "tooltips.touhou_little_maid.fox_scroll.red": "Utilisé le pour trouver vos Maids se trouvant dans des chunks non chargé", - "tooltips.touhou_little_maid.fox_scroll.white": "Utilisé le pour trouver les tombes de vos Maids", + "tooltips.touhou_little_maid.fox_scroll.red": "Utilisez le pour trouver vos Maids se trouvant dans des chunks non chargé", + "tooltips.touhou_little_maid.fox_scroll.white": "Utilisez le pour trouver les tombes de vos Maids", + "tooltips.touhou_little_maid.favorability_tool.add": "Clic droit sur une Maid pour ajouter 64 d'affinité (Accroupi pour 1)", + "tooltips.touhou_little_maid.favorability_tool.reduce": "Clic droit sur une Maid pour retirer 64 d'affinité (Accroupi pour 1)", + "tooltips.touhou_little_maid.favorability_tool.full": "Clic droit sur une Maid pour monter son affinité au maximum", + "tooltips.touhou_little_maid.tank_backpack.empty_fluid": "Vide", "tooltips.touhou_little_maid.tank_backpack.fluid": "%s: %d mB", "tooltips.touhou_little_maid.tank_backpack.capacity": "Capacité: %d mB", "tooltips.touhou_little_maid.item_container.empty": "Vide", "tooltips.touhou_little_maid.broom.desc": "Clic droit sur un bloc pour le placer et Shift + Clic pour le reprendre", "tooltips.touhou_little_maid.scarecrow.desc": "Une fois placé au sol, il empêchera les Maids Féériques d'apparaître dans une zone carrée de %dx%d", "tooltips.touhou_little_maid.servant_bell.uuid": "UUID: %s", + "tooltips.touhou_little_maid.servant_bell.desc.1": "- Clic droit sur votre Maid avec la cloche en main pour les liés ensembles.", + "tooltips.touhou_little_maid.servant_bell.desc.2": "- Utilisez la cloche après l'avoir lié permettras de téléporter votre Maid à vous.", + "tooltips.touhou_little_maid.monster_list.desc": "Les Versions 1.1.13 ainsi que les versions suivantes ont supprimé cet objet et il peut plus être utilisé", + "overlay.touhou_little_maid.compass.tips": "Clic droit pour afficher la zone de tâches de la Maid", + "overlay.touhou_little_maid.golden_apple.tips": "Cliquez droit sur la Maid en étant accroupi pour lui faire manger la pomme", + "overlay.touhou_little_maid.potion.tips": "Cliquez droit sur la Maid en étant accroupi pour lui faire boire la potion", + "overlay.touhou_little_maid.milk_bucket.tips": "Faites un clic droit sur la Maid en étant accroupi pour lui faire boire le lait et soigner ses effets négatifs", + "overlay.touhou_little_maid.script_book.tips": "Permet d'écrire du texte pour les bulles de dialogues des Maids", + "overlay.touhou_little_maid.glass_bottle.tips": "Clic droit pour ajouter le texte, Accroupi + Clic droit pour le retirer", + "overlay.touhou_little_maid.name_tag.tips": "Clic droit pour nommer la Maid", + "overlay.touhou_little_maid.lead.tips": "Clic droit pour tenir la Maid en laisse", + "overlay.touhou_little_maid.debug_stick.tips": "Change l'UUID du Maitre de la Maid", + "overlay.touhou_little_maid.ntr_item.tips": "Vous permet de devenir le Maitre de la Maid de quelqu'un d'autre", + "overlay.touhou_little_maid.remove_backpack.tips": "Retirer le sac à dos de la Maid", + "overlay.touhou_little_maid.saddle.tips": "Faites un clic droit avec une Selle en main pour porter votre Maid dans vos bras", + "gui.touhou_little_maid.schedule.day": "Travail de jour", + "gui.touhou_little_maid.schedule.night": "Travail de nuit", + "gui.touhou_little_maid.schedule.all": "Temps plein", + "gui.touhou_little_maid.activity.work": "Travail", "gui.touhou_little_maid.activity.idle": "Inactif", + "gui.touhou_little_maid.activity.rest": "Repos", "gui.touhou_little_maid.button.skin": "Changer de Skin", + "gui.touhou_little_maid.button.sound": "Définir un Pack de Sons", + "gui.touhou_little_maid.task.next_page": "Page suivante", + "gui.touhou_little_maid.task.previous_page": "Page précédente", "gui.touhou_little_maid.task.close": "Fermer", + "gui.touhou_little_maid.task.switch": "Changer de tâche", "gui.touhou_little_maid.skin.text.version": "Version: %s", "gui.touhou_little_maid.skin.text.date": "Date: %s", "gui.touhou_little_maid.skin.button.close": "Fermer", "gui.touhou_little_maid.skin.tooltips.show_details": "Shift + Clic pour ouvrir les détails GUI", + "gui.touhou_little_maid.skin.tooltips.maid_use_sound_pack_id": "Utilisez le Pack de Sons : %s", + "gui.touhou_little_maid.skin.enable_cache": "Affichage des Icones", + "gui.touhou_little_maid.button.home.true": "Le Mode Maison est Activé", + "gui.touhou_little_maid.button.home.false": "Le Mode Maison est Désactivé", + "gui.touhou_little_maid.button.home.desc": "§7Cliquez sur ce bouton pour définir si la Maid doit suivre le joueur.", "gui.touhou_little_maid.button.pickup.true": "Ramassage Automatique Activé", "gui.touhou_little_maid.button.pickup.false": "Ramassage Automatique Désactivé", - "gui.touhou_little_maid.tag.always_show": "Toujours afficher le nom", + "gui.touhou_little_maid.button.pickup.desc": "§7Cliquez sur ce bouton pour définir si la Maid doit prendre l'initiative de ramasser les objets.", + "gui.touhou_little_maid.button.maid_riding_set.true": "Le Mode Monte est activé", + "gui.touhou_little_maid.button.maid_riding_set.false": "Le Mode Monte est désactivé", + "gui.touhou_little_maid.button.maid_riding_set.desc": "§7Cliquez sur ce bouton pour définir si la Maid peut monter sur les autres entités.", + "gui.touhou_little_maid.button.model_download": "Ouvrir l'Interface de Téléchargement des Packs de Modèles", + "gui.touhou_little_maid.button.model_download.statue.first": "Cliquez ici pour télécharger plus de modèles et de sons!", + "gui.touhou_little_maid.button.model_download.statue.update": "Il y a de nouveaux modèles et sons!", + "gui.touhou_little_maid.skin_details.beg": "Animation Tête Inclinée", + "gui.touhou_little_maid.skin_details.walk": "Animation de Marche", + "gui.touhou_little_maid.skin_details.sit": "Animation Assis", + "gui.touhou_little_maid.skin_details.ride": "Animation en Monture", + "gui.touhou_little_maid.skin_details.helmet": "Afficher le Casque", + "gui.touhou_little_maid.skin_details.chest_plate": "Afficher le Plastron", + "gui.touhou_little_maid.skin_details.leggings": "Afficher les Jambières", + "gui.touhou_little_maid.skin_details.boots": "Afficher les Bottes", + "gui.touhou_little_maid.skin_details.main_hand": "Objet Main Principale", + "gui.touhou_little_maid.skin_details.off_hand": "Objet Main Secondaire", + "gui.touhou_little_maid.skin_details.show_passenger": "Afficher Personnage", + "gui.touhou_little_maid.skin_details.left_mouse": "Clic Gauche : Rotation", + "gui.touhou_little_maid.skin_details.right_mouse": "Clic Droit : Déplacer", + "gui.touhou_little_maid.skin_details.mouse_wheel": "Molette : Zoomer", + "gui.touhou_little_maid.maid_beacon.cost_power": "Coût: %s/h", + "gui.touhou_little_maid.maid_beacon.add_one": "Déposer Un", + "gui.touhou_little_maid.maid_beacon.min_one": "Prendre Un", "gui.touhou_little_maid.maid_beacon.overflow_delete_true": "Détruire le surplus de Points", "gui.touhou_little_maid.maid_beacon.overflow_delete_false": "Garder le surplus de Points", + "gui.touhou_little_maid.resources_download.author": "Auteur: %s", "gui.touhou_little_maid.resources_download.author.delimiter": ",", "gui.touhou_little_maid.resources_download.file_size": "Taille: %s", "gui.touhou_little_maid.resources_download.upload_time": "Temps d'Envoie: %s", "gui.touhou_little_maid.resources_download.license": "Licence: %s", + "gui.touhou_little_maid.resources_download.fail": "Il semble y avoir un problème avec le réseau...", "gui.touhou_little_maid.resources_download.reload": "Actualiser", + "gui.touhou_little_maid.resources_download.all": "Tout", "gui.touhou_little_maid.resources_download.maid": "Maid", "gui.touhou_little_maid.resources_download.chair": "Chaise", + "gui.touhou_little_maid.resources_download.sound": "Bruitage", + "gui.touhou_little_maid.resources_download.update": "Update", + "gui.touhou_little_maid.resources_download.all.tips": "Tous les Packs de Ressources", + "gui.touhou_little_maid.resources_download.maid.tips": "Packs de Ressources des Maids", + "gui.touhou_little_maid.resources_download.chair.tips": "Packs de Ressources des Chaises", + "gui.touhou_little_maid.resources_download.sound.tips": "Packs de Ressources des Bruitages", + "gui.touhou_little_maid.resources_download.update.tips": "Packs de Ressources devant être mis à jour", + "gui.touhou_little_maid.resources_download.not_download": "Non Téléchargé", + "gui.touhou_little_maid.resources_download.downloaded": "Téléchargé", + "gui.touhou_little_maid.resources_download.downloading": "Téléchargement", + "gui.touhou_little_maid.resources_download.need_update": "Update Requise", + "gui.touhou_little_maid.resources_download.delete": "Supprimer le pack", + "gui.touhou_little_maid.resources_download.delete.confirm": "Voulez-vous supprimer ces fichiers ?", + "gui.touhou_little_maid.resources_download.open_link": "Ouvrir le site Web de l'auteur", + "gui.touhou_little_maid.resources_download.open_folder": "Ouvrir le dossier du Pack", "gui.touhou_little_maid.resources_download.search": "Recherche...", - "gui.touhou_little_maid.resources_download.need_reload.subtitle": "Utilisé la commande §4§o/tlm pack reload§r pour recharger tous les packs de modèle.", - "gui.touhou_little_maid.maid_config.show_chat_bubble": "Afficher les bulles de dialogues", + "gui.touhou_little_maid.resources_download.hot_search": "Recherche populaire :", + "gui.touhou_little_maid.resources_download.hot_search_key": "Klee, Stelle, Lamu, Arisu, Suzuran, Nahida, Frieren, Nagato, Elaina, Cheshire, Honkai, Nyaruko, Fate, Nanachi", + "gui.touhou_little_maid.resources_download.need_reload.title": "§6§nRecharger l'Alerte", + "gui.touhou_little_maid.resources_download.need_reload.subtitle": "Utilisez la commande §4§o/tlm pack reload§r pour recharger tous les packs de modèle.", + "gui.touhou_little_maid.resources_download.state.downloading": "Téléchargement du fichier %s...", + "gui.touhou_little_maid.resources_download.state.downloaded": "Fichier %s téléchargé, Temps écoulé : %.3fs", + "gui.touhou_little_maid.maid_config.sound_frequency": "Fréquence à parler", + "gui.touhou_little_maid.maid_config.show_chat_bubble": "Bulles de Dialogues", "gui.touhou_little_maid.maid_config.show_backpack": "Afficher le sac à dos", - "gui.touhou_little_maid.maid_config.show_back_item": "Afficher les objets dans le dos", + "gui.touhou_little_maid.maid_config.show_back_item": "Objets dans le dos", + "gui.touhou_little_maid.maid_config.pick_type": "Mode de ramassage", + "gui.touhou_little_maid.maid_config.open_door": "Peut ouvrir les portes", + "gui.touhou_little_maid.maid_config.open_fence_gate": "Peut ouvrir les clôtures", + "gui.touhou_little_maid.maid_config.value.true": "ON", + "gui.touhou_little_maid.maid_config.value.false": "OFF", + "gui.touhou_little_maid.maid_config.value.item": "Objet", + "gui.touhou_little_maid.maid_config.value.xp": "XP", + "gui.touhou_little_maid.maid_config.value.all": "Tout", "gui.touhou_little_maid.model_switcher.direction.north": "Face: N", "gui.touhou_little_maid.model_switcher.direction.south": "Face: S", "gui.touhou_little_maid.model_switcher.direction.east": "Face: E", "gui.touhou_little_maid.model_switcher.direction.west": "Face: W", "gui.touhou_little_maid.model_switcher.list.add": "Ajouter", + "gui.touhou_little_maid.model_switcher.uuid.empty": "Non lié, faites un clic droit sur une Maid pour les lier ensemble !", + "gui.touhou_little_maid.custom_sound.pack.title": "§l§nMaid Pack de Sons", + "gui.touhou_little_maid.custom_sound.pack.apply": "Appliquer un Pack de Sons", + "gui.touhou_little_maid.custom_sound.sounds.preview": "§l§nAperçu du Son", "gui.touhou_little_maid.fox_scroll.position": "Pos: [%s]", "gui.touhou_little_maid.fox_scroll.distance.same_dimension": "Distance: %dm", "gui.touhou_little_maid.fox_scroll.distance.different_dimension": "Distance: ???m", "gui.touhou_little_maid.fox_scroll.empty": "Il n'y a pas de coordonnées de Maid à afficher", + "gui.touhou_little_maid.optifine_warning.title": "Avertissement Optifine - Touhou Little Maid", "gui.touhou_little_maid.optifine_warning.text": "Avant de continuer, veuillez noter qu'Optifine est connu pour provoquer des plantages, plusieurs bugs visuels d'entités et de nombreux autres problèmes.\n\nAvant de signaler un bug, veuillez d'abord supprimer Optifine et vérifier à nouveau si le bug est toujours présent.\n\nLes problèmes liés à Optifine ne peuvent pas être résolus par Touhou Little Maid !\n\nVous pouvez utiliser les mods Oculus et Embeddium comme alternatives à Optifine.\n", "gui.touhou_little_maid.optifine_warning.embeddium": "Télécharger Embeddium", "gui.touhou_little_maid.optifine_warning.oculus": "Télécharger Oculus", "gui.touhou_little_maid.patchouli_warning.download": "Télécharger Patchouli", + "gui.touhou_little_maid.servant_bell.edit_box": "Veuillez renommer la cloche", + "gui.touhou_little_maid.cache_screen.progress": "Progression : %d/%d", + "gui.touhou_little_maid.cache_screen.desc": "Mise en cache des modèles, veuillez patienter...", + "gui.touhou_little_maid.monster_type.friendly": "§aAmical", + "gui.touhou_little_maid.monster_type.neutral": "§7Neutre", + "gui.touhou_little_maid.monster_type.hostile": "§cHostile", + "chat_bubble.touhou_little_maid.inner.feed_animal.max_number": "Tant d'animaux... Je ne les nourrirais plus !", + "chat_bubble.touhou_little_maid.inner.home_meal.two_hand_is_full": "Mes mains sont pleines... Je ne peux pas manger !", + "chat_bubble.touhou_little_maid.inner.home_meal.meal_is_empty": "Vite ! Vite ! Je n'ai rien à manger !", + "chat_bubble.touhou_little_maid.inner.fishing.no_sit": "Je dois m'asseoir sur une chaise ou un bateau pour pêcher !", + "message.touhou_little_maid.missing_patchouli.title": "[TLM]", + "message.touhou_little_maid.missing_patchouli.click_here": "Cliquez ici pour installer le mod Patchouli pour ainsi obtenir le manuel", + "message.touhou_little_maid.missing_patchouli.url": "https://www.curseforge.com/minecraft/mc-mods/patchouli", + "message.touhou_little_maid.reload.tip": "[TLM] Temps de chargement du modèle : %.2f ms", "message.touhou_little_maid.change_model.disabled": "Le changement de modèle est désactivé.", "message.touhou_little_maid.extinguisher.player_cannot_use": "Votre manque de connaissances ne vous permet pas d'utiliser cet objet", "message.touhou_little_maid.altar.not_enough_power": "Vous n'avez pas assez de Points Spirituels.", "message.touhou_little_maid.owner_maid_num.can_not_add": "Vous ne pouvez plus apprivoiser de Maid, vous avez atteint la limite (%d/%d)", + "message.touhou_little_maid.photo.not_suitable_for_place_maid": "Vous ne pouvez pas invoquer de Maid à cet endroit.", + "message.touhou_little_maid.chisel.hit_block_error": "Veuillez faire un clic droit sur un bloc d'argile", + "message.touhou_little_maid.chisel.offhand_not_photo": "Veuillez saisir dans votre main secondaire une photo de votre Maid prise avec l'appareil photo d'Aya", "message.touhou_little_maid.gomoku.win": "Le Joueur a Gagné !", "message.touhou_little_maid.gomoku.lose": "Le Joueur a Perdu !", "message.touhou_little_maid.gomoku.reset": "Clic droit sur une boite de pion pour réinitialiser le jeu", @@ -217,23 +432,127 @@ "message.touhou_little_maid.trumpet.unloaded_maid": "Il y a %d Maid(s) dans des chunks non chargés, utilisez le Parchemin de Renard Roux pour les trouver !", "message.touhou_little_maid.shrine.not_film": "Placer une Pellicule dans l'autel afin de ressusciter votre Maid !", "message.touhou_little_maid.shrine.health_low": "Les PV du joueur sont trop bas !", + "message.touhou_little_maid.kappa_compass.clear": "Toutes les positions ont été supprimées", + "message.touhou_little_maid.kappa_compass.full": "Toutes les positions sont déjà définies, Accroupi + Clic droit pour les supprimer", + "message.touhou_little_maid.kappa_compass.far_away": "Vous êtes trop loin de la position précédente, le maximum ne peut être que de 64 blocs", + "message.touhou_little_maid.kappa_compass.maid_write": "Position de la Maid définie avec Succès !", + "message.touhou_little_maid.kappa_compass.maid_clear": "Position de la Maid supprimer avec Succès !", + "message.touhou_little_maid.kappa_compass.maid_dimension_check": "La Maid ne se trouve pas dans la même dimension que les positions enregistrées par cette Boussole", + "message.touhou_little_maid.kappa_compass.no_data": "Cette Boussole ne contient aucune position d'enregistrée", + "message.touhou_little_maid.kappa_compass.work": "§a▍ §7Zone de Travail: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.idle": "§a▍ §7Zone de Repos: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.sleep": "§a▍ §7Zone pour dormir: [%d, %d, %d§7]", + "message.touhou_little_maid.kappa_compass.work_area": "Zone de Travail", + "message.touhou_little_maid.kappa_compass.idle_area": "Zone de Repos", + "message.touhou_little_maid.kappa_compass.sleep_area": "Zone pour dormir", + "message.touhou_little_maid.kappa_compass.usage.set_pos": "§6- §bClic droit sur un bloc pour définir des positions", + "message.touhou_little_maid.kappa_compass.usage.clear_pos": "§6- §bAccroupi + Clic droit sur un bloc pour supprimer les positions", + "message.touhou_little_maid.kappa_compass.usage.write_pos_to_maid": "§d- §2Clic droit sur votre Maid pour lui donner les positions enregistrées", + "message.touhou_little_maid.kappa_compass.usage.clear_maid_pos": "§d- §2Accroupi + Clic droit sur votre Maid pour supprimer ses positions", + "message.touhou_little_maid.check_schedule_pos.too_far": "§c§lLa Maid est trop loin de la position enregistrée\n\n§6§nVeuillez faire Accroupi + Clic droit sur votre Maid en utilisant la Boussole Kappa pour supprimer ses positions enregistrées", + "message.touhou_little_maid.check_schedule_pos.dimension": "§c§lLa Maid ne se trouve pas dans la même dimension que les positions enregistrées par cette Boussole\n\n§6§nVeuillez faire Accroupi + Clic droit sur votre Maid en utilisant la Boussole Kappa pour supprimer ses positions enregistrées", + "message.touhou_little_maid.script_book.remove": "Le script de bulle de chat de la Maid a été effacé avec succès", + "message.touhou_little_maid.script_book.install": "Le script de bulle de chat de la Maid a été installé avec succès", + "message.touhou_little_maid.script_book.copy": "Le script de bulle de chat de la Maid a été copié avec succès", "message.touhou_little_maid.broom.unable_fly": "Votre Maid doit être assise avec vous pour pouvoir vous envolez.", - "commands.touhou_little_maid.pack.reload.info": "Tous les packs de modèles ont été rechargés !", + "message.touhou_little_maid.saddle.how_to_eject": "Faites à nouveau un clic droit avec la Selle en main pour déposer votre Maid", + "message.touhou_little_maid.tombstone.not_yours.1": "La Maid de cette Pierre tombale n'ai pas la vôtre ! Si vous êtes l'administrateur du serveur, veuillez faire un clic droit avec l'objet de Cocu pour la supprimer", + "message.touhou_little_maid.tombstone.not_yours.2": "Objet actuel de Cocu: ", + "message.touhou_little_maid.servant_bell.show_pos": "La Maid se trouve dans un chunk non chargé, suivez le marqueur pour la retrouver", + "message.touhou_little_maid.servant_bell.not_same_dimension": "Votre Maid n'est pas dans la même dimension que vous, elle se trouve dans la dimension %s", + "message.touhou_little_maid.servant_bell.no_result": "Aucune Maids n'a été trouvée", + "message.touhou_little_maid.servant_bell.data_is_empty": "Aucune Maids n'est lié à cette cloche", + "message.touhou_little_maid.cchess.check": "Échec", + "message.touhou_little_maid.cchess.repeat": "Nulle par répétition !", + "message.touhou_little_maid.cchess.move_limit": "Nulle par la Règle des 60 coups !", + "message.touhou_little_maid.cchess.reset": "Clic droit sur une des zones noires à droite pour réinitialiser le jeu", + "message.touhou_little_maid.wchess.move_limit": "Nulle par la Règle des 50 coups !", + "message.touhou_little_maid.wchess.reset": "Clic droit sur une des zones claires situé sur les côtés pour réinitialiser le jeu", + "message.touhou_little_maid.entity_id_copy.copy": "L'id de l'entité a été copié : %s", + "commands.touhou_little_maid.pack.reload.start": "Tous les packs de modèles vont être rechargés...", "commands.touhou_little_maid.power.handle.info": "Les Points Spirituels de %d joueur(s) ont changés", "commands.touhou_little_maid.maid_num.handle.info": "Le nombre de Maid de %d joueur(s) à changé", "commands.touhou_little_maid.power.get.info": "%s: %.2f", "commands.touhou_little_maid.maid_num.get.info": "%s: %d", + "death.attack.touhou_little_maid.danmaku": "%1$s a été abattu par %2$s utilisant un Danmaku", "config.touhou_little_maid.maid": "Maid", + "config.touhou_little_maid.maid.maid_tamed_item": "Objet pour Apprivoisement", + "config.touhou_little_maid.maid.maid_tamed_item.tooltip": "L'objet qui sera utilisé pour apprivoiser une Maid\nUtilisez directement le nom de l'objet, ou écrivez le nom précédé du tag #", + "config.touhou_little_maid.maid.maid_temptation_item": "Objet de Tentation", + "config.touhou_little_maid.maid.maid_temptation_item.tooltip": "L'objet qui tentera les Maids\nUtilisez directement le nom de l'objet, ou écrivez le nom précédé du tag #", + "config.touhou_little_maid.maid.maid_ntr_item": "Objet de Cocu", + "config.touhou_little_maid.maid.maid_ntr_item.tooltip": "L'item permettant à la Maid de changé de Maitre (Elle vous trompe !)\nUtilisez directement le nom de l'objet, ou écrivez le nom précédé du tag #", + "config.touhou_little_maid.maid.maid_work_range": "Portée du Mode Travail", + "config.touhou_little_maid.maid.maid_work_range.tooltip": "Portée maximale que la Maid auras dans son Mode Travail", + "config.touhou_little_maid.maid.maid_idle_range": "Portée du Mode Inactif", + "config.touhou_little_maid.maid.maid_idle_range.tooltip": "Portée maximale que la Maid auras dans son Mode Inactif", + "config.touhou_little_maid.maid.maid_sleep_range": "Portée pour Dormir", + "config.touhou_little_maid.maid.maid_sleep_range.tooltip": "Portée maximale que la Maid auras pour aller Dormir", + "config.touhou_little_maid.maid.maid_non_home_range": "Portée sans le mode Maison", + "config.touhou_little_maid.maid.maid_non_home_range.tooltip": "Portée maximale de la Maid quand le Mode Maison est Désactivé", + "config.touhou_little_maid.maid.bow_range": "Portée de l'Arc", + "config.touhou_little_maid.maid.bow_range.tooltip": "Portée maximale des attaques à l'Arc de la Maid", + "config.touhou_little_maid.maid.cross_bow_range": "Portée de l'Arbalète", + "config.touhou_little_maid.maid.cross_bow_range.tooltip": "Portée maximale des attaques à l'Arbalète de la Maid", + "config.touhou_little_maid.maid.danmaku_range": "Portée du Danmaku", + "config.touhou_little_maid.maid.danmaku_range.tooltip": "Portée maximale des attaques Danmaku de la Maid", + "config.touhou_little_maid.maid.trident_range": "Portée du Trident", + "config.touhou_little_maid.maid.trident_range.tooltip": "Portée maximale des attaques au Trident de la Maid", + "config.touhou_little_maid.maid.feed_animal_max_number": "Nombre maximum d'animaux", + "config.touhou_little_maid.maid.feed_animal_max_number.tooltip": "Le nombre maximum d'animaux lorsque la Maid doit en nourrir", + "config.touhou_little_maid.maid.maid_change_model": "Changement de Modèle", + "config.touhou_little_maid.maid.maid_change_model.tooltip": "Les Maids peuvent changer de modèle librement", + "config.touhou_little_maid.maid.owner_max_maid_num": "Limite de Maid par Joueur", + "config.touhou_little_maid.maid.owner_max_maid_num.tooltip": "Le nombre maximum de Maid que le joueur peut avoir", + "config.touhou_little_maid.maid.replace_allay_percent": "Remplacement des Allays", + "config.touhou_little_maid.maid.replace_allay_percent.tooltip": "Pourcentage de chance de remplacer un Allay par une Maid dans les avant-postes de Pillard", + "config.touhou_little_maid.maid.maid_backpack_blacklist": "Liste noire du Sac à Dos", + "config.touhou_little_maid.maid.maid_backpack_blacklist.tooltip": "Liste Noire des objets ne pouvant pas être placés dans le Sac à Dos des Maids", + "config.touhou_little_maid.maid.maid_attack_ignore": "Cible d'Attaque", + "config.touhou_little_maid.maid.maid_attack_ignore.tooltip": "Liste des entités que la Maid ne reconnaîtra pas comme cible d'attaque", + "config.touhou_little_maid.maid.maid_ranged_attack_ignore": "Cible d'Attaque Distante", + "config.touhou_little_maid.maid.maid_ranged_attack_ignore.tooltip": "Liste des entités que la Maid ne reconnaîtra pas comme cible d'attaque distante", + "config.touhou_little_maid.maid.maid_gomoku_owner_limit": "Gomoku limité au Maitre", + "config.touhou_little_maid.maid.maid_gomoku_owner_limit.tooltip": "La Maid ne jouera au Gomoku qu'avec son Maitre", + "config.touhou_little_maid.maid.maid_work_meals_block_list": "Liste Noire Repas de Travail", + "config.touhou_little_maid.maid.maid_work_meals_block_list.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids pendant leurs horaires de travail", + "config.touhou_little_maid.maid.maid_home_meals_block_list": "Liste Noire Repas Maison", + "config.touhou_little_maid.maid.maid_home_meals_block_list.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids en Mode Maison", + "config.touhou_little_maid.maid.maid_heal_meals_block_list": "Liste Noire Repas de Soin", + "config.touhou_little_maid.maid.maid_heal_meals_block_list.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids pour se soigner", + "config.touhou_little_maid.maid.maid_work_meals_block_list_regex": "Liste Noire Repas de Travail RegEx", + "config.touhou_little_maid.maid.maid_work_meals_block_list_regex.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids pendant leurs horaires de travail, tous les mots doivent correspondre pour fonctionner en RegEx", + "config.touhou_little_maid.maid.maid_home_meals_block_list_regex": "Liste Noire Repas Maison RegEx", + "config.touhou_little_maid.maid.maid_home_meals_block_list_regex.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids en Mode Maison, tous les mots doivent correspondre pour fonctionner en RegEx", + "config.touhou_little_maid.maid.maid_heal_meals_block_list_regex": "Liste Noire Repas de Soin RegEx", + "config.touhou_little_maid.maid.maid_heal_meals_block_list_regex.tooltip": "Ces objets ne peuvent pas être utilisés comme repas par les Maids pour se soigner, tous les mots doivent correspondre pour fonctionner en RegEx", + "config.touhou_little_maid.maid.maid_eaten_return_container_list": "Liste récipients récupérer", + "config.touhou_little_maid.maid.maid_eaten_return_container_list.tooltip": "Liste des récipients récupérer après qu'une Maid est finis de manger dedans \nEg: §eminecraft:beetroot_soup§c,§eminecraft:bowl", + "config.touhou_little_maid.maid.maid_gun_long_distance": "Portée des Armes à Feu Longue Distance", + "config.touhou_little_maid.maid.maid_gun_long_distance.tooltip": "Distance de visée d'une Maid dans avec la tâche Tireur pour les Snipers", + "config.touhou_little_maid.maid.maid_gun_medium_distance": "Portée des Armes à Feu Moyenne Distance", + "config.touhou_little_maid.maid.maid_gun_medium_distance.tooltip": "Distance de visée d'une Maid dans avec la tâche Tireur, adapté à la plupart des types d'armes", + "config.touhou_little_maid.maid.maid_gun_near_distance": "Portée des Armes à Feu Courte Distance", + "config.touhou_little_maid.maid.maid_gun_near_distance.tooltip": "Distance de visée d'une Maid dans avec la tâche Tireur pour les Pistolets et Shotguns", "config.touhou_little_maid.chair": "Chaise", "config.touhou_little_maid.chair.chair_change_model": "Changement de modèle des chaises", "config.touhou_little_maid.chair.chair_change_model.tooltip": "Les chaises peuvent librement changer de modèle", "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone": "Chaises pouvant être détruites par n'importe qui", "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone.tooltip": "Les chaises peuvent être détruites par n'importe qui", + "config.touhou_little_maid.misc": "Divers", "config.touhou_little_maid.misc.maid_fairy_power_point": "Points Spirituels des Maids Féériques", "config.touhou_little_maid.misc.maid_fairy_power_point.tooltip": "Points Spirituels donnés par les Maids Féériques", + "config.touhou_little_maid.misc.maid_fairy_spawn_probability": "Maid Féérique Probabilité de Spawn", + "config.touhou_little_maid.misc.maid_fairy_spawn_probability.tooltip": "Probabilité que les Maids Féérique ont de spawn (Zombie est à 100, Enderman est à 10)", + "config.touhou_little_maid.misc.maid_fairy_blacklist_biome": "Maid Féérique Liste Noire des Biomes", + "config.touhou_little_maid.misc.maid_fairy_blacklist_biome.tooltip": "Les Maids Féérique ne peuvent pas spawn dans les biomes suivants", + "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension": "Maid Féérique Liste Noire des Dimensions", + "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension.tooltip": "Les Maids Féérique ne peuvent pas spawn dans les dimensions suivantes", "config.touhou_little_maid.misc.player_death_loss_power_point": "Points Spirituels perdus à la mort du joueur", "config.touhou_little_maid.misc.player_death_loss_power_point.tooltip": "Nombre de Points Spirituels perdus à la mort du joueur", - "config.touhou_little_maid.misc.give_patchouli_book": "Donner un livre Patchouli", + "config.touhou_little_maid.misc.give_smart_slab": "Donnez un Sort d'âme", + "config.touhou_little_maid.misc.give_smart_slab.tooltip": "Donne un Sort d'âme (avec une Maid à l'intérieur) aux Joueurs rejoignant pour la première fois", + "config.touhou_little_maid.misc.give_patchouli_book": "Donnez un livre Patchouli", "config.touhou_little_maid.misc.give_patchouli_book.tooltip": "Donne le livre \"Mémoire de Gensokyo\" quand un joueur rejoint la partie pour la première fois", "config.touhou_little_maid.misc.shrine_lamp_effect_cost": "Lanterne de Sanctuaire : Coût des Effets Bonus", "config.touhou_little_maid.misc.shrine_lamp_effect_cost.tooltip": "Lanterne de Sanctuaire : Coût des Effets Bonus (Point Spirituel/Par Heure)", @@ -241,30 +560,125 @@ "config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip": "Lanterne de Sanctuaire : Stockage Maximum de Point Spirituel", "config.touhou_little_maid.misc.shrine_lamp_max_range": "Lanterne de Sanctuaire : Portée Maximum", "config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip": "Lanterne de Sanctuaire : Portée Maximum d'Absorption de Point Spirituel", + "config.touhou_little_maid.misc.close_optifine_warning": "Avertissement Optifine", + "config.touhou_little_maid.misc.close_optifine_warning.tooltip": "Activer ou Désactiver l'avertissement Optifine", "config.touhou_little_maid.misc.scarecrow_range": "Portée du Inari Renard en Granite", - "config.touhou_little_maid.misc.scarecrow_range.tooltip": "La portée que possède le Inari Renard en Granite pour empêcher les Maids féeriques d'apparaitre", - "task.touhou_little_maid.idle": "Inactive", - "task.touhou_little_maid.attack": "Combattante", - "task.touhou_little_maid.ranged_attack": "Archère", - "task.touhou_little_maid.crossbow_attack": "Arbalétrière", - "task.touhou_little_maid.danmaku_attack": "Prêtresse", - "task.touhou_little_maid.farm": "Ferme", + "config.touhou_little_maid.misc.scarecrow_range.tooltip": "La portée que possède le Inari Renard en Granite pour empêcher les Maids féerique d'apparaitre", + "config.touhou_little_maid.misc.use_new_maid_fairy_model": "Nouveau skin de Fée", + "config.touhou_little_maid.misc.use_new_maid_fairy_model.tooltip": "Remplace le skin des Maids Féérique par leur nouvelle version", + "config.touhou_little_maid.vanilla": "Vanilla", + "config.touhou_little_maid.vanilla.replace_slime_model": "Remplacer le modèle des Slimes", + "config.touhou_little_maid.vanilla.replace_slime_model.tooltip": "Remplace le modèle des Slimes par des Yukkuri", + "config.touhou_little_maid.vanilla.replace_xp_texture": "Remplacer la texture de l'XP", + "config.touhou_little_maid.vanilla.replace_xp_texture.tooltip": "Remplace la texture des orbes d'XP par celle des points de score", + "config.touhou_little_maid.vanilla.replace_totem_texture": "Remplacer la texture du Totem", + "config.touhou_little_maid.vanilla.replace_totem_texture.tooltip": "Remplace la texture des Totems d'immortalité par un 1Up", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture": "Remplacer la texture de la Fiole d'XP", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture.tooltip": "Remplace la texture des fioles d'XP par un point de score", + "task.touhou_little_maid.idle": "Inactif", + "task.touhou_little_maid.attack": "Mêlée", + "task.touhou_little_maid.ranged_attack": "Distant", + "task.touhou_little_maid.crossbow_attack": "Sniper", + "task.touhou_little_maid.danmaku_attack": "Magie", + "task.touhou_little_maid.trident_attack": "Lancier", + "task.touhou_little_maid.farm": "Champ", "task.touhou_little_maid.sugar_cane": "Sucre", "task.touhou_little_maid.melon": "Potager", "task.touhou_little_maid.cocoa": "Cacao", + "task.touhou_little_maid.honey": "Miel", "task.touhou_little_maid.grass": "Herbe", "task.touhou_little_maid.snow": "Neige", "task.touhou_little_maid.feed": "Nourrir", - "task.touhou_little_maid.shears": "Cisailles", + "task.touhou_little_maid.shears": "Tondre", "task.touhou_little_maid.milk": "Traire", - "task.touhou_little_maid.torch": "Torche", + "task.touhou_little_maid.torch": "Éclairer", "task.touhou_little_maid.feed_animal": "Élevage", - "task.touhou_little_maid.extinguishing": "Pompière", + "task.touhou_little_maid.extinguishing": "Pompier", + "task.touhou_little_maid.board_games": "Jeux", + "task.touhou_little_maid.gun_attack": "Tireur", + "task.touhou_little_maid.fishing": "Pêche", + "task.touhou_little_maid.desc.title": "[Info]", + "task.touhou_little_maid.desc.condition": "[Condition Spécial]", + "task.touhou_little_maid.desc.enable_condition": "[Condition d'Activation]", + "task.touhou_little_maid.idle.desc": "Votre Maid ne fera rien lorsqu'elle à cette tâche", + "task.touhou_little_maid.attack.desc": "Votre Maid attaquera au corps à corps les monstres environnants", + "task.touhou_little_maid.attack.condition.assault_weapon": "Doit tenir une arme de mêlée dans sa main principale", + "task.touhou_little_maid.attack.condition.extinguisher": "Tenir un Extincteur dans sa main secondaire permet de causer des dégâts supplémentaires aux monstres ayant une résistance au feu", + "task.touhou_little_maid.ranged_attack.desc": "Votre Maid attaquera à l'Arc les monstres environnants", + "task.touhou_little_maid.ranged_attack.condition.has_bow": "Doit tenir un arc dans sa main principale", + "task.touhou_little_maid.ranged_attack.condition.has_arrow": "Doit avoir des Flèches dans son inventaire", + "task.touhou_little_maid.crossbow_attack.desc": "Votre Maid attaquera à l'Arbalète les monstres environnants", + "task.touhou_little_maid.crossbow_attack.condition.has_crossbow": "Doit tenir une arbalète dans sa main principale", + "task.touhou_little_maid.crossbow_attack.condition.has_ammunition": "Doit avoir des Flèches dans son inventaire ou des Fusées de feu d'artifice dans sa main secondaire", + "task.touhou_little_maid.danmaku_attack.desc": "Votre Maid lanceront un Danmaku sur les monstres environnants", + "task.touhou_little_maid.danmaku_attack.condition.has_gohei": "Doit tenir un Gohei dans sa main principale", + "task.touhou_little_maid.trident_attack.desc": "Votre Maid attaquera au Trident les monstres environnants", + "task.touhou_little_maid.trident_attack.condition.has_trident": "Doit tenir un trident sa main principale", + "task.touhou_little_maid.farm.desc": "Votre Maid plantera et récoltera les cultures environnantes", + "task.touhou_little_maid.sugar_cane.desc": "Votre Maid plantera et récoltera la Canne à sucre environnante", + "task.touhou_little_maid.melon.desc": "Votre Maid plantera et récoltera les Pastèques environnantes", + "task.touhou_little_maid.melon.condition.has_silk_touch": "Peut tenir un outil avec Toucher de Soie pour récolter la pastèque en entier", + "task.touhou_little_maid.cocoa.desc": "Votre Maid plantera et récoltera les Fèves de cacao environnantes", + "task.touhou_little_maid.honey.desc": "Votre Maid collectera le Miel des ruches environnantes", + "task.touhou_little_maid.honey.condition.has_bottle": "Doit tenir des cisailles dans sa main principale pour collecter des Rayons de miel", + "task.touhou_little_maid.honey.condition.has_shears": "Doit avoir des fioles dans son inventaire et aucunes cisailles en main pour collecter des Fioles de miel", + "task.touhou_little_maid.grass.desc": "Votre Maid détruira et ramassera toutes les fleurs et herbes environnantes", + "task.touhou_little_maid.snow.desc": "Votre Maid détruira la neige environnante, tenir une pelle lui permet de récupérer des boules de neige", + "task.touhou_little_maid.feed.desc": "La Maid nourrira son Maitre quand il/elle à faim", + "task.touhou_little_maid.shears.desc": "La Maid tondra les créatures environnantes", + "task.touhou_little_maid.milk.desc": "Votre Maid collecteras du lait avec un seau sur les vaches environnantes", + "task.touhou_little_maid.milk.condition.has_bucket": "Doit avoir un Seau dans son inventaire", + "task.touhou_little_maid.torch.desc": "Votre Maid placeras des torches dans les zones sombres environnantes", + "task.touhou_little_maid.torch.condition.has_torch": "Doit avoir des torches dans son inventaire", + "task.touhou_little_maid.feed_animal.desc": "Votre Maid nourriras les animaux proches, une limite peut être configurée dans les options", + "task.touhou_little_maid.feed_animal.condition.can_feed": "Doit avoir de la nourriture pour animaux dans son inventaire", + "task.touhou_little_maid.feed_animal.condition.assault_weapon": "Peut tenir une arme de mêlée dans sa main principale afin de tuer le surplus d'animaux avant de les nourrir (Limite définie dans les options du mod)", + "task.touhou_little_maid.extinguishing.desc": "Votre Maid éteindra les incendies autour d'elle", + "task.touhou_little_maid.extinguishing.condition.has_extinguisher": "Doit tenir un extincteur", + "task.touhou_little_maid.board_games.desc": "Votre Maid cherchera un Gomoku ou un jeu d'échecs à proximité pour jouer avec vous", + "task.touhou_little_maid.gun_attack.desc": "Votre Maid utilisera les armes à feu de TacZ", + "task.touhou_little_maid.gun_attack.condition.has_tacz_gun": "Doit tenir une arme à feu de TacZ", + "task.touhou_little_maid.fishing.desc": "La Maid va chercher une chaise près d'elle et s'asseoir dessus pour ensuite commencer à pêcher", + "task.touhou_little_maid.fishing.condition.has_fishing_rod": "Doit tenir une Canne à pêche dans sa main principal", + "task.touhou_little_maid.advanced.id": "ID de la tâche : %s", + "button.touhou_little_maid.maid.mode.idle": "Inactif", + "button.touhou_little_maid.maid.mode.attack": "Attaque de Mêlée", + "button.touhou_little_maid.maid.mode.range_attack": "Attaque à Distance", + "button.touhou_little_maid.maid.mode.danmaku_attack": "Attaque Magique", + "button.touhou_little_maid.maid.mode.trident_attack": "Attaque au Trident", + "button.touhou_little_maid.maid.mode.farm": "Entretient un Champ", + "button.touhou_little_maid.maid.mode.feed": "Nourrit le joueur", + "button.touhou_little_maid.maid.mode.shears": "Tond un animal", + "button.touhou_little_maid.maid.mode.milk": "Obtient du Lait", + "button.touhou_little_maid.maid.mode.torch": "Pose une torche", + "button.touhou_little_maid.maid.mode.feed_animal": "Nourrit un animal", + "button.touhou_little_maid.maid.mode.extinguishing": "Éteint du feu", + "button.touhou_little_maid.maid.mode.snow": "Retire de la Neige", + "button.touhou_little_maid.maid.mode.break": "Détruit", + "button.touhou_little_maid.maid.mode.furnace": "Utilise un Four", + "button.touhou_little_maid.maid.mode.brewing": "Alchimie", + "button.touhou_little_maid.maid.ai.find_target": "Trouve une Cible", + "button.touhou_little_maid.maid.ai.hurt": "Blesser", + "button.touhou_little_maid.maid.ai.hurt_fire": "Blesser par du Feu", + "button.touhou_little_maid.maid.ai.hurt_player": "Blesser par le Joueur", + "button.touhou_little_maid.maid.ai.tamed": "Apprivoisé", + "button.touhou_little_maid.maid.ai.item_get": "Obtient un Objet", + "button.touhou_little_maid.maid.ai.death": "Meurt", + "button.touhou_little_maid.maid.ai.game_win": "Victoire aux jeux", + "button.touhou_little_maid.maid.ai.game_lost": "Défaite aux jeux", + "button.touhou_little_maid.maid.environment.hot": "Trop Chaud", + "button.touhou_little_maid.maid.environment.cold": "Trop Froid", + "button.touhou_little_maid.maid.environment.rain": "Pluie", + "button.touhou_little_maid.maid.environment.snow": "Neige", + "button.touhou_little_maid.maid.environment.morning": "Matin", + "button.touhou_little_maid.maid.environment.night": "Nuit", + "button.touhou_little_maid.maid.credit": "Crédit", "button.touhou_little_maid.maid.return": "Retour", "subtitle.touhou_little_maid.maid.mode.idle": "Maid Bruitage : Attendre", "subtitle.touhou_little_maid.maid.mode.attack": "Maid Bruitage : Attaque", - "subtitle.touhou_little_maid.maid.mode.range_attack": "Maid Bruitage : Distance", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid Bruitage : Danmaku", + "subtitle.touhou_little_maid.maid.mode.range_attack": "Maid Bruitage : Attaque Distante", + "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid Bruitage : Attaque Danmaku", + "subtitle.touhou_little_maid.maid.mode.trident_attack": "Maid Bruitage : Attaque au Trident", "subtitle.touhou_little_maid.maid.mode.farm": "Maid Bruitage : Récolte", "subtitle.touhou_little_maid.maid.mode.feed": "Maid Bruitage : Nourrir", "subtitle.touhou_little_maid.maid.mode.shears": "Maid Bruitage : Tondre", @@ -283,6 +697,8 @@ "subtitle.touhou_little_maid.maid.ai.tamed": "Maid Bruitage : Apprivoiser", "subtitle.touhou_little_maid.maid.ai.item_get": "Maid Bruitage : Ramassage", "subtitle.touhou_little_maid.maid.ai.death": "Maid Bruitage : Mort", + "subtitle.touhou_little_maid.maid.ai.game_win": "Maid Bruitage : Victoire", + "subtitle.touhou_little_maid.maid.ai.game_lost": "Maid Bruitage : Défaite", "subtitle.touhou_little_maid.maid.environment.hot": "Maid Bruitage : Chaleur", "subtitle.touhou_little_maid.maid.environment.cold": "Maid Bruitage : Froid", "subtitle.touhou_little_maid.maid.environment.rain": "Maid Bruitage : Pluie", @@ -292,15 +708,25 @@ "subtitle.touhou_little_maid.other.credit": "Son des crédits", "subtitle.touhou_little_maid.item.camera_use": "Bruitage d'utilisation de l'appareil photo", "subtitle.touhou_little_maid.item.album_open": "Bruitage d'ouverture de l'album", - "subtitle.touhou_little_maid.block.altar_craft": "Bruitage de la création du sanctuaire", + "subtitle.touhou_little_maid.block.altar_craft": "Bruitage de la Création du Sanctuaire", + "subtitle.touhou_little_maid.block.gomoku": "Bruitage du Gomoku", + "subtitle.touhou_little_maid.block.gomoku_reset": "Bruitage du Gomoku Réinitialisé", "subtitle.touhou_little_maid.entity.box": "Bruitage d'ouverture de boite", "subtitle.touhou_little_maid.item.compass": "Bruitage Boussole : Sélection des Coordonnées", + "touhou_little_maid.subtitles.entity.fairy.ambient": "Bruitage de Fée", + "touhou_little_maid.subtitles.entity.fairy.death": "Bruitage de Décès de Fée", + "touhou_little_maid.subtitles.entity.fairy.hurt": "Bruitage de Fée Blessée", + "emi.category.touhou_little_maid.altar": "Craft du Sanctuaire", "jei.touhou_little_maid.altar_craft.title": "Craft du Sanctuaire", + "jei.touhou_little_maid.altar_craft.result": "Résultat: %s", "jei.touhou_little_maid.altar_craft.item_craft.result": "Fabriquer un objet", "jei.touhou_little_maid.altar_craft.spawn_box.result": "Invoquer une nouvelle maid", "jei.touhou_little_maid.altar_craft.spawn_lightning_bolt.result": "Invoque la foudre", + "jei.touhou_little_maid.altar_craft.reborn_maid.result": "Ressusciter une Maid avec une Pellicule", "jei.touhou_little_maid.garage_kit.info": "Lorsque vous travaillez un bloc d'argile à l'aide d'un Burin directement au-dessus d'une flamme, cela fera cuir votre statuette vous permettant après quelque temps de la récupérer sans la détruire.$(br2)Pour en savoir plus, allez à la page du Burin dans la section Divers.", + "top.touhou_little_maid.entity_maid.task": "Mode: ", "top.touhou_little_maid.entity_maid.invulnerable": "Invulnérable", + "top.touhou_little_maid.entity_maid.schedule": "Horaire: ", "top.touhou_little_maid.entity_maid.favorability": "Niveau d'Affinité: %d", "config.jade.plugin_touhou_little_maid.shrine_lamp": "Afficher plus d'infos pour la Lanterne de Sanctuaire", "patchouli.touhou_little_maid.book.name": "Mémoire de Gensokyo", @@ -311,24 +737,48 @@ "patchouli.touhou_little_maid.book.categories.other.description": "Aperçu de multiple contenu divers", "patchouli.touhou_little_maid.book.categories.overview.name": "Vue d'ensemble", "patchouli.touhou_little_maid.book.entries.maid.backpack.name": "Sac à dos", + "patchouli.touhou_little_maid.book.entries.maid.backpack.pages.1.text": "Une Maid avec un petit sac à dos.", "patchouli.touhou_little_maid.book.entries.maid.item_magnet.name": "Aimant à objet", "patchouli.touhou_little_maid.book.entries.maid.item_magnet.pages.0.text": "Une relique qui étend considérablement la portée de ramassage d'objets, de flèches, d'orbes d'EXP et de Points Spirituels d'une Maid une fois qu'elle lui a été équipé.", "patchouli.touhou_little_maid.book.entries.maid.maid_base.name": "Maid : Les bases", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.0.text": "Les Maids peuvent accomplir de nombreuses tâches :$(li)La maid ramasse automatiquement les objets, flèches et orbes d'EXP proche d'elle, mais cela peu-être changé via le bouton de ramassage.$(li)Par défaut, la maid suivra toujours le joueur.", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.3.text": "$(li)Avec une Selle en main, faites un clic droit sur votre Maid pour la porter dans vos bras.$(li)Les Creepers fuiront les Maids.", + "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.name": "Relique de Maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.0.text": "Ce mod ajoute plusieurs reliques pouvant être activée de différentes manières afin de protéger vos Maids, mais elles doivent être placées dans leur inventaire à relique pour fonctionner.$(li)Élixir d'Orbe Ultramarine : Peut être utilisé jusqu'à 6 fois pour empêcher la mort d'une Maid.", + "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.1.text": "$(li)Relique de Protection : Annule les dégâts subit par la Maid selon la relique équipée. (Exemple : La Relique Anti-feu annuleras les dégâts de brûlure)$(li)Étoffe Habile : Lorsqu'une Maid équipée de cette Relique est touchée par un projectile, elle ce téléporteras pour l'esquiver à la manière d'un Enderman.", "patchouli.touhou_little_maid.book.entries.maid.maid_config.name": "Maid : Configuration", + "patchouli.touhou_little_maid.book.entries.maid.maid_skin.name": "Skin de Maid", + "patchouli.touhou_little_maid.book.entries.maid.maid_skin.pages.1.text": "Cliquez sur le bouton indiqué sur l'image pour ouvrir l'interface de skin de la Maid.", "patchouli.touhou_little_maid.book.entries.maid.maid_sound.name": "Maid : Effets sonores", "patchouli.touhou_little_maid.book.entries.maid.maid_task.name": "Maid : Les tâches", - "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.name": "Relique de Silence", - "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.pages.0.text": "Une fois équipée de cette relique, la maid ne parlera plus.", + "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.name": "Relique de mutisme", + "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.pages.0.text": "Une fois équipée de cette relique, la Maid ne parlera plus.", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.name": "Renommez une maid", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.0.text": "Il est possible de donner à une Maid l'apparence d'un joueur.$(br2)Pour cela, nommée votre Maid avec $(#ff0000)=>id$() en remplaçant $(#ff0000)id$() par le nom du joueur voulu .$(br2)Les ressources packs des Maids vous permet aussi d'avoir des modèles personnalisé.", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.1.text": "Maid avec le nom $(#ff0000)=>Notch$().", "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.name": "Spawn des Maids", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.name": "Substitut de Jizo", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.pages.0.text": "Le Substitut de Jizo est un objet du mode créatif qui rend invincible une maid en faisant un clic droit sur elle.", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.name": "Mode Maison", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.0.text": "Lorsque le Mode Maison est activé, la Maid enregistre sa position actuelle et se déplace dans un rayon de 12 blocs environnant. (Le rayon peut être modifié dans les options)", "patchouli.touhou_little_maid.book.entries.maid.film.name": "Pellicule", "patchouli.touhou_little_maid.book.entries.maid.film.pages.0.text": "Une Pellicule est donnée en faisant clic droit sur la tombe d'une Maid, elle peu ensuite être utilisé à un Autel pour ressuscité votre Maid contre quelques PV.$(br2)La Pellicule ne peu pas être détruite par le feu ou la lave.", "patchouli.touhou_little_maid.book.entries.maid.gap.name": "Brèche", + "patchouli.touhou_little_maid.book.entries.maid.gap.pages.0.text": "Une relique pour Maid permettant de transférer des objets avec un coffre.$(br2)Clic droit dans les airs avec la Brèche en main pour ouvrir son interface. Accroupi + clic droit sur un coffre pour les liés ensembles.$(br2)Placez-le ensuite dans l'inventaire à Relique de la Maid.", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.1.text": "Vous pouvez utiliser la Boussole Vanilla pour voir les zones de tâches de votre Maid", + "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.name": "Bataille de boules de neige", + "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.pages.0.text": "Quand la Maid est sur de la neige et en tâche \"Inactif\", elle lancera des boules de neige sur le joueur et aux autres Maids", + "patchouli.touhou_little_maid.book.entries.maid.chat_bubbles.name": "Bulles de Dialogues", + "patchouli.touhou_little_maid.book.entries.maid.chat_bubbles.pages.0.text": "La Maid affiche occasionnellement plusieurs bulles de dialogues, qui peuvent également être personnalisées par des packs de modèles", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.name": "Zone de tâche", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.0.text": "La Boussole Kappa est un outil permettant de définir les zones de tâches d'une Maid. Vous pouvez l'utiliser pour définir les endroits où votre Maid travaille, se repose et dort.", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.1.text": "Vous devez tout d'abord faire un clic droit sur un bloc pour définir jusqu'à trois positions, puis faire un clic droit sur la Maid pour les lui assigner.$(br2)Elle ira ensuite travailler dans les zones définies si son Mode Maison est activé.", + "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.1.text": "Quand la Maid est en heure de pause, elle cherchera une Nappe de Pique-Nique pour manger, ce qui augmentera grandement son affinité.$(br2)Servez leur de la délicieuse nourriture !", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.name": "Cloche de Serviteur", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.pages.0.text": "La Cloche de Serviteur peut téléporter une de vos Maids à vous. Si la Maid ce trouve sur un chunk non chargé, la cloche vous indiqueras sa position.$(br2)Faites un clic droit sur votre Maid avec l'objet dans votre main pour les lier ensembles ! Vous pourrez alors renommez la cloche comme bon vous semble.", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.name": "Burin et Statuette", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.0.text": "Faites un clic droit sur un bloc d'argile avec un burin pour créer une statue de tailles variable. Prend actuellement en charge les tailles 1x1x1, 1x1x2, 2x2x4, 3x3x6.", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.1.text": "Le joueur doit tenir un Burin dans sa main principal, une photo d'une Maid dans sa main secondaire (elle peut être obtenu avec l'appareil photo d'Aya), et faire un clic droit sur le bloc le plus en bas à gauche de la structure pour reproduire la Maid représentée sur la photo.", "patchouli.touhou_little_maid.book.entries.other.garage_kit.name": "Statuette", "patchouli.touhou_little_maid.book.entries.other.garage_kit.pages.0.text": "Lorsque vous travaillez un bloc d'argile à l'aide d'un Burin directement au-dessus d'une flamme, cela fera cuir votre statuette vous permettant après quelque temps de la récupérer sans la détruire.$(br2)Pour en savoir plus, allez à la page du Burin dans la section Divers.", "patchouli.touhou_little_maid.book.entries.other.maid_beacon.name": "Lanterne de Sanctuaire", @@ -337,23 +787,30 @@ "patchouli.touhou_little_maid.book.entries.other.trumpet.name": "Trompette", "patchouli.touhou_little_maid.book.entries.other.trumpet.pages.0.text": "Un outil pour téléporter les Maids sur vous, clic droit pour l'utiliser. $(br2)$(4)$(l)Note : Cet objet ne peut pas téléporter une Maid se trouvant dans un chunk qui n'ai pas actuellement chargé.", "patchouli.touhou_little_maid.book.entries.other.chair.name": "Coussin", - "patchouli.touhou_little_maid.book.entries.other.chair.pages.0.text": "Le coussin est un objet purement décoratif. Placé le directement sur le sol avec un clic droit et faite accroupie + clic gauche pour le détruire. Faite un clic droit dessus pour vous asseoir et accroupie + clic droit pour ouvrir son interface et changer son apparence.", + "patchouli.touhou_little_maid.book.entries.other.chair.pages.0.text": "Le coussin est un objet purement décoratif. Placé le directement sur le sol avec un clic droit et faite accroupi + clic gauche pour le détruire. Faites un clic droit dessus pour vous asseoir et accroupi + clic droit pour ouvrir son interface et changer son apparence.", "patchouli.touhou_little_maid.book.entries.other.command.name": "Commande", "patchouli.touhou_little_maid.book.entries.other.command.pages.0.text": "$(#f00)/tlm$(): Il s'agit de la commande fournie avec le mod$(br2)Vous pouvez l'utilisé pour modifier les Points Spirituels, le nombre de Maid ou rechargé les packs de modèle.", "patchouli.touhou_little_maid.book.entries.other.extinguisher.name": "Extincteur", - "patchouli.touhou_little_maid.book.entries.other.extinguisher.pages.0.text": "Seule une Maid avec la tâche Pompière pourra utiliser cet objet, un joueur en sera incapable.", + "patchouli.touhou_little_maid.book.entries.other.extinguisher.pages.0.text": "Seule une Maid avec la tâche \"Pompier\" pourra utiliser cet objet, un joueur en sera incapable.", "patchouli.touhou_little_maid.book.entries.other.maid_bed.name": "Lit pour Maid", - "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.0.text": "Tout comme le joueur, la Maid peu dormir. Quand son heure de coucher est arrivé, la Maid chercheras un lit proche pour se reposer.$(br2)La Maid endormie ne sera pas attaquée par des créatures hostiles, et le menu GUI de la Maid ne pourras pas être ouvert pendant cette période.", + "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.0.text": "Tout comme le joueur, la Maid peu dormir. Quand son heure de coucher est arrivé, la Maid chercheras un lit proche pour se reposer.$(br2)La Maid endormie ne sera pas attaquée par des créatures hostiles, et l'interface de la Maid ne pourras pas être ouvert pendant cette période.", "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.1.text": "Une Maid qui dort dans un lit.", - "patchouli.touhou_little_maid.book.entries.other.power_point.name": "Point Spirituel", - "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "Des Points Spirituels peuvent être trouvés dans les coffres de donjon.$(br2)Faite un clic droit pour les lancer et obtenir les Points Spirituels qu'elles contiennent.", + "patchouli.touhou_little_maid.book.entries.other.power_point.name": "Point Spirituel (Objet)", + "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "Des Points Spirituels peuvent être trouvés dans les coffres de donjon.$(br2)Faites un clic droit pour les lancer et obtenir les Points Spirituels qu'elles contiennent.", + "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.name": "Appareil photo d'Aya", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.name": "Changeur de Modèle", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.0.text": "Utilisable en Créatif, principalement conçu pour les serveurs, peut être utilisé pour afficher les modèles des Maids", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.1.text": "Vous devez d'abord faire un clic droit sur la Maid avec le bloc en main, puis le placer sur le sol et cliquez droit dessus pour ouvrir l'interface et définir le modèle que vous souhaitez afficher.$(br2)Placez ensuite un signal de redstone à sa gauche ou à sa droite et allumer le pour changer le modèle de la Maid.", "patchouli.touhou_little_maid.book.entries.other.favorability_tool.name": "Outil d'Affinité", - "patchouli.touhou_little_maid.book.entries.other.favorability_tool.pages.0.text": "Faite un clic droit sur une Maid pour modifier son Affinité, disponible uniquement en mode créatif.", + "patchouli.touhou_little_maid.book.entries.other.favorability_tool.pages.0.text": "Faites un clic droit sur une Maid pour modifier son Affinité, disponible uniquement en mode créatif.", "patchouli.touhou_little_maid.book.entries.other.fox_scroll.name": "Parchemin de Renard", - "patchouli.touhou_little_maid.book.entries.other.fox_scroll.pages.0.text": "Utilisé le pour trouver vos Maids se trouvant dans des chunks non chargé ou pour trouver leurs tombes.", + "patchouli.touhou_little_maid.book.entries.other.fox_scroll.pages.0.text": "Utilisez le pour trouver vos Maids se trouvant dans des chunks non chargé ou pour trouver leurs tombes.", "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.name": "Inari Renard en Granite", "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.pages.0.text": "Le Inari Renard en Granite peut empêcher l'apparition des Maids Féériques, mais n'affecteras pas les autres monstres.$(br2)Son rayon d'action couvre 48x48 blocs par défaut dans une zone en carré, allant du point Y le plus bas au plus élevé.", "patchouli.touhou_little_maid.book.entries.other.gomoku.name": "Gomoku", + "patchouli.touhou_little_maid.book.entries.other.gomoku.pages.0.text": "Vous pouvez jouer au Gomoku avec votre Maid, et gagner augmentera son affinité.$(br2)Si le joueur gagne plusieurs fois, la Maid deviendras de plus en plus forte à ce jeu.", + "patchouli.touhou_little_maid.book.entries.other.maid_joy.name": "Jouet pour Maid", + "patchouli.touhou_little_maid.book.entries.other.maid_joy.pages.0.text": "La Maid jouera avec pendant ses heures de pause, ce qui augmenteras son affinité.", "patchouli.touhou_little_maid.book.entries.other.shrine.name": "Autel", "patchouli.touhou_little_maid.book.entries.other.shrine.pages.0.text": "A une faible chance d'apparaitre dans les coffres naturels. Placer une Pellicule dans l'autel consommera des PV du joueur pour ressuscité la Maid correspondante.", "patchouli.touhou_little_maid.book.entries.other.broom.name": "Balai", @@ -363,15 +820,21 @@ "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.name": "Gohei et Danmaku", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.name": "Sanctuaire", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.0.text": "Le sanctuaire est une structure requise pour les différentes fabrications de ce mod.$(br2)Les recettes du sanctuaire peuvent être obtenues en utilisant le mod JEI, et la fabrication nécessite également des $(l:overview/power_point)Points Spirituels$() du joueur.", - "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.1.text": "Faite un clic droit avec le $(l:overview/gohei_and_danmaku)Gohei$() sur la laine rouge au centre côté gauche pour le construire.", + "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.1.text": "Faites un clic droit avec le $(l:overview/gohei_and_danmaku)Gohei$() sur la laine rouge au centre côté gauche pour le construire.", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.2.title": "Sanctuaire", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.3.text": "Placer un objet sur le haut d'un pilier du sanctuaire en le tenant et en faisant un clic droit. Vous pouvez le retirer de la même façon si votre main est vide.$(br2)Une fois les objets placé et avec suffisamment de Points Spirituels, le craft s’activera automatiquement. Il sera cependant interrompu si les Points Spirituels sont insuffisant et devras être relancer.", "patchouli.touhou_little_maid.book.entries.overview.power_point.name": "Point Spirituel", "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.0.text": "Les Points Spirituels sont une ressource important de ce mod, pouvant être obtenu en tuant des $(l:overview/world_spawn#fairy)Maid Féérique$().$(br2)Ils sont utilisés pour les différents craft du $(l:overview/multiblocks_altar)Sanctuaire$().", "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.1.text": "Lorsque vous tenez votre $(l:overview/gohei_and_danmaku)Gohei$() en main, vous pouvez voir votre nombre de Points Spirituels en haut à gauche de l'écran.$(br2)Vous ne pouvez pas en avoir plus de 5.$(br2)Les Maids avec le Ramassage Automatique Activé peuvent récupérer des Points Spirituels, et répareront tout les objets de leur inventaire qui ont l'enchantement $(5)Raccommodage$().", + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.name": "Touhou Project", "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.text": "Touhou Project est une série de jeux indépendants du genre shoot'em up créés par ZUN, le seul membre de la Team Shanghai Alice.", "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.link_text": "Touhou Wiki", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.name": "Spawn des créatures", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.link_text": "Ouvrir le Lien", "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.link_text": "Lien Discord", - "patchouli.touhou_little_maid.book.entries.overview.favorability.name": "Affinité" + "patchouli.touhou_little_maid.book.entries.overview.favorability.name": "Affinité", + "patchouli.touhou_little_maid.book.entries.overview.favorability.pages.0.text": "L'Affinité peu augmenter la santé et la puissance de la Maid.$(br2)Augmente l'affinité :$(li)Pendant ses heures de pause, la Maid peut jouer avec le Piano, l'Ordinateur, la Bibliothèque et au Gomoku.$(li)Quand la Maid dort.$(br2)Réduit l'affinité :$(li)Quand la Maid est tué.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.name": "Bulle de Dialogue Personnalisé", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.0.text": "Vous pouvez utiliser un \"Livre et plume\" pour personnaliser le texte des Bulles de dialogues de la Maid.$(br2)Écrivez simplement le texte dans le format indiqué sur l'image de droite avec une ligne vide pour séparer chaque bulle.$(br2)Vous pouvez écrire plusieurs pages et chacune sera analysée.", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.1.text": "Vous pouvez même utiliser des caractères spéciaux vanilla pour afficher le texte en coloré." } diff --git a/src/main/resources/assets/touhou_little_maid/lang/ja_jp.json b/src/main/resources/assets/touhou_little_maid/lang/ja_jp.json index 58c16e369..2c9e1a4fb 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/ja_jp.json +++ b/src/main/resources/assets/touhou_little_maid/lang/ja_jp.json @@ -1,4 +1,112 @@ { + "advancements.touhou_little_maid.base.craft_gohei.description": "御幣をクラフトする", + "advancements.touhou_little_maid.base.craft_gohei.title": "幻想への鍵?", + "advancements.touhou_little_maid.base.build_altar.description": "祭壇を建てて、幻想を始めよう", + "advancements.touhou_little_maid.base.build_altar.title": "幻想への境界", + "advancements.touhou_little_maid.base.change_chair_model.description": "椅子のスキンを変更", + "advancements.touhou_little_maid.base.change_chair_model.title": "座布団変わった?", + "advancements.touhou_little_maid.base.change_maid_model.description": "メイドのスキンを切り替える", + "advancements.touhou_little_maid.base.change_maid_model.title": "コスプレ!", + "advancements.touhou_little_maid.base.change_maid_sound.description": "メイドのサウンドを切り替える", + "advancements.touhou_little_maid.base.change_maid_sound.title": "声優", + "advancements.touhou_little_maid.base.craft_chair.description": "椅子をクラフトする", + "advancements.touhou_little_maid.base.craft_chair.title": "どうぞお座りください", + "advancements.touhou_little_maid.base.kill_maid_fairy.description": "妖精メイドを倒す", + "advancements.touhou_little_maid.base.kill_maid_fairy.title": "いたずらに命をかけて", + "advancements.touhou_little_maid.base.pickup_power_point.description": "Pアイテムを拾う", + "advancements.touhou_little_maid.base.pickup_power_point.title": "Power up!", + "advancements.touhou_little_maid.base.spawn_maid.description": "祭壇からメイドを召喚する", + "advancements.touhou_little_maid.base.spawn_maid.title": "新生活", + "advancements.touhou_little_maid.base.tamed_maid.description": "メイドにケーキを渡し雇用契約を結ぶ。お給料はおいしいご飯とお菓子!", + "advancements.touhou_little_maid.base.tamed_maid.title": "おかえりなさい ご主人様!", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.description": "すべてのネザライト防具でメイドを着飾る", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.title": "黄金のネザライトの塊で出来たメイド", + "advancements.touhou_little_maid.challenge.any_equipment.description": "いずれかの防具でメイドを着飾る", + "advancements.touhou_little_maid.challenge.any_equipment.title": "ZUN帽", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "エンチャントされた金のリンゴをメイドに食べさせる", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.title": "Good Apple!!", + "advancements.touhou_little_maid.challenge.kill_100.description": "メイドが 100 体のmobを倒す", + "advancements.touhou_little_maid.challenge.kill_100.title": "ルナシューター", + "advancements.touhou_little_maid.challenge.kill_wither.description": "メイドがウィザーを倒す", + "advancements.touhou_little_maid.challenge.kill_wither.title": "がしゃどくろ?大調伏", + "advancements.touhou_little_maid.challenge.kill_dragon.description": "メイドがエンダードラゴンを倒す", + "advancements.touhou_little_maid.challenge.kill_dragon.title": "決 着", + "advancements.touhou_little_maid.challenge.kill_slime_300.description": "メイドがスライムとマグマキューブを合計 300 体倒す", + "advancements.touhou_little_maid.challenge.kill_slime_300.title": "ゆっくりしていってね!!!", + "advancements.touhou_little_maid.challenge.lightning_bolt.description": "祭壇から雷を召喚し、メイドに落とす", + "advancements.touhou_little_maid.challenge.lightning_bolt.title": "屠自古が怒った!", + "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "メイドのHPが 100 に達する", + "advancements.touhou_little_maid.challenge.maid_100_healthy.title": "健康に気使って長く生きてきました!", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "メイドがエンチャントの本を釣り上げる", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.title": "持ってかないでー", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.description": "ピリジャーの前哨基地からメイドを助ける", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.title": "奴はとんでもないものを盗んでいきました…", + "advancements.touhou_little_maid.favorability.favorability_increased.description": "メイドの好感度を上げる", + "advancements.touhou_little_maid.favorability.favorability_increased.title": "大いなる力には、", + "advancements.touhou_little_maid.favorability.favorability_increased_max.description": "メイドの好感度を最大にする", + "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "大いなる責任が伴う", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "メイドがピクニックマットで食事をとる", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "宴会の始まりだ!", + "advancements.touhou_little_maid.favorability.maid_sit_joy.description": "メイドが娯楽を楽しむ", + "advancements.touhou_little_maid.favorability.maid_sit_joy.title": "憩いの場", + "advancements.touhou_little_maid.favorability.maid_sleep.description": "メイドがベッドで眠る", + "advancements.touhou_little_maid.favorability.maid_sleep.title": "今は眠りなさい 貴方の槐安(かいあん)は今作られる", + "advancements.touhou_little_maid.favorability.win_cchess.description": "シャンチーでメイドに勝利する", + "advancements.touhou_little_maid.favorability.win_cchess.title": "シャンチーマスター!", + "advancements.touhou_little_maid.favorability.win_wchess.description": "チェスでメイドに勝利する", + "advancements.touhou_little_maid.favorability.win_wchess.title": "チェックメイトだッ", + "advancements.touhou_little_maid.favorability.win_gomoku.description": "五目並べでメイドに勝利する", + "advancements.touhou_little_maid.favorability.win_gomoku.title": "私が勝ったから今夜のおゆはんは和食ね", + "advancements.touhou_little_maid.maid_base.chisel_statue.description": "粘土ブロックから彫像を彫りだす", + "advancements.touhou_little_maid.maid_base.chisel_statue.title": "彫像を作り出す程度の能力", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.description": "メイドがミルクバケツを飲む", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.title": "通り魔女にご注意を…", + "advancements.touhou_little_maid.maid_base.maid_backpack.description": "メイドにバックパックを背負わせる", + "advancements.touhou_little_maid.maid_base.maid_backpack.title": "バナナはおやつに入りますか?", + "advancements.touhou_little_maid.maid_base.maid_farm.description": "メイドが作物を植える、または収穫をする", + "advancements.touhou_little_maid.maid_base.maid_farm.title": "稲田姫様に叱られるから", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.description": "メイドが動物を繁殖させる", + "advancements.touhou_little_maid.maid_base.maid_feed_animal.title": "畜生調伏のメイド", + "advancements.touhou_little_maid.maid_base.maid_feed_player.description": "メイドがお腹が空いたご主人にご飯を食べさせる", + "advancements.touhou_little_maid.maid_base.maid_feed_player.title": "お粗末様でした!", + "advancements.touhou_little_maid.maid_base.maid_fishing.description": "メイドが釣りをする", + "advancements.touhou_little_maid.maid_base.maid_fishing.title": "いいや、これはKKHTAじゃないよ", + "advancements.touhou_little_maid.maid_base.maid_kill_mob.description": "メイドがmobを倒す", + "advancements.touhou_little_maid.maid_base.maid_kill_mob.title": "イージーシューター", + "advancements.touhou_little_maid.maid_base.photo_maid.description": "メイドを撮影する", + "advancements.touhou_little_maid.maid_base.photo_maid.title": "あやややや…", + "advancements.touhou_little_maid.maid_base.pickup_garage_kit.description": "ガレージキットを手に入れる", + "advancements.touhou_little_maid.maid_base.pickup_garage_kit.title": "偶像に世界を委ねて", + "advancements.touhou_little_maid.maid_base.pickup_maid.description": "サドルを持ったままメイドを右クリックする", + "advancements.touhou_little_maid.maid_base.pickup_maid.title": "お姫様抱っこ", + "advancements.touhou_little_maid.maid_base.reborn_maid.description": "祭壇でメイドを復活させる", + "advancements.touhou_little_maid.maid_base.reborn_maid.title": "もう一生あなたについていきます!", + "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.description": "分社でメイドを復活させる", + "advancements.touhou_little_maid.maid_base.shrine_reborn_maid.title": "あなたは私で 私はあなた", + "advancements.touhou_little_maid.maid_base.switch_schedule.description": "メイドのスケジュールを切り替える", + "advancements.touhou_little_maid.maid_base.switch_schedule.title": "シフト管理", + "advancements.touhou_little_maid.maid_base.switch_task.description": "メイドの仕事を切り替える", + "advancements.touhou_little_maid.maid_base.switch_task.title": "お仕事お仕事!", + "advancements.touhou_little_maid.maid_base.take_maid_xp.description": "ガラス瓶を持ちメイドを右クリックして経験値を受け取る", + "advancements.touhou_little_maid.maid_base.take_maid_xp.title": "今日の成果", + "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.description": "アイテムマグネットをメイドに装備させる", + "advancements.touhou_little_maid.maid_base.use_item_magnet_bauble.title": "のびーるアーム", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.description": "ひらり布をメイドに装備させ発射物を回避させる", + "advancements.touhou_little_maid.maid_base.use_nimble_fabric.title": "Grazed!", + "advancements.touhou_little_maid.maid_base.use_protect_bauble.description": "メイドに耐性の宝玉を装備させる", + "advancements.touhou_little_maid.maid_base.use_protect_bauble.title": "備えあれば嬉しいな", + "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.description": "赤いきつねのスクロールを使用してメイドを見つける", + "advancements.touhou_little_maid.maid_base.use_red_fox_scroll.title": "「じゃあね」なんて言わないで", + "advancements.touhou_little_maid.maid_base.use_servant_bell.description": "サーバントベルを使ってメイドを集合させる", + "advancements.touhou_little_maid.maid_base.use_servant_bell.title": "Never Gonna Give You Up", + "advancements.touhou_little_maid.maid_base.use_trumpet.description": "トランペットを使ってすべてのメイドを呼び寄せる", + "advancements.touhou_little_maid.maid_base.use_trumpet.title": "Zun-pets", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.description": "メイドが紺珠の薬か不死のトーテムで死を回避する", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.title": "うおー! やーらーれーたー?", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.description": "白いきつねのスクロールを使ってメイドの墓石を見つける", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.title": "死神が説教されているうちに", + "advancements.touhou_little_maid.maid_base.use_wireless_io.description": "八雲紫のスキマを使用してチェストからメイドにアイテムを移動させる", + "advancements.touhou_little_maid.maid_base.use_wireless_io.title": "「チェストとインベントリの境界」", "entity.touhou_little_maid.chair": "チェア", "entity.touhou_little_maid.maid": "メイド", "entity.touhou_little_maid.fairy": "妖精メイド", @@ -48,17 +156,22 @@ "item.touhou_little_maid.trumpet": "トランペット", "item.touhou_little_maid.wireless_io": "八雲紫のスキマ", "item.touhou_little_maid.chair_show": "椅子の表示", + "item.touhou_little_maid.red_fox_scroll": "赤いきつねのスクロール", + "item.touhou_little_maid.white_fox_scroll": "白いきつねのスクロール", "item.touhou_little_maid.favorability_tool_add": "好感度ツール: 増加", "item.touhou_little_maid.favorability_tool_full": "好感度ツール: 最大", "item.touhou_little_maid.favorability_tool_reduce": "好感度ツール: 減少", "item.touhou_little_maid.kappa_compass": "河童コンパス", "item.touhou_little_maid.broom": "魔理沙のホウキ", "item.touhou_little_maid.picnic_basket": "ピクニックバスケット", + "item.touhou_little_maid.servant_bell": "サーバントベル", + "item.touhou_little_maid.monster_list": "モンスターリスト(削除済み)", "enchantment.touhou_little_maid.impeding": "粘着弾", "enchantment.touhou_little_maid.impeding.desc": "弾幕は敵に移動速度低下Ⅰ~Ⅳを与えることができます", "enchantment.touhou_little_maid.speedy": "高速弾", "enchantment.touhou_little_maid.speedy.desc": "弾の速度が速くなります。Ⅰで2倍、Ⅱで3倍。", "enchantment.touhou_little_maid.enders_ender": "エンダーの終焉", + "enchantment.touhou_little_maid.enders_ender.desc": "弾幕がエンダーマンとエンダードラゴンにダメージを与えることが出来るようになります", "block.touhou_little_maid.maid_bed": "メイド用ベッド", "block.touhou_little_maid.garage_kit": "ガレージキット", "block.touhou_little_maid.maid_beacon": "神社の灯篭", @@ -71,6 +184,9 @@ "block.touhou_little_maid.altar": "祭壇", "block.touhou_little_maid.statue": "彫像", "block.touhou_little_maid.picnic_mat": "ピクニックマット", + "block.touhou_little_maid.cchess": "シャンチー(中国将棋)", + "block.touhou_little_maid.wchess": "チェス", + "block.touhou_little_maid.scarecrow": "花崗稲荷の白狐像", "tooltips.touhou_little_maid.chair.place.desc": "ブロックの上面を右クリックして配置します。", "tooltips.touhou_little_maid.chair.destroy.desc": "Shift+左クリックで破壊できます。", "tooltips.touhou_little_maid.chair.gui.desc": "Shift+右クリックでスキンGUIを開きます。", @@ -82,6 +198,8 @@ "tooltips.touhou_little_maid.info.favorability": "好感度", "tooltips.touhou_little_maid.bauble.desc": "§a[メイド専用 宝玉]", "tooltips.touhou_little_maid.bauble.usage": "メイドの宝玉インベントリに配置する必要があります", + "tooltips.touhou_little_maid.backpack.desc": "§6[メイドのバックパック]", + "tooltips.touhou_little_maid.backpack.usage": "このアイテムを持ちながらメイドを右クリックします", "tooltips.touhou_little_maid.substitute_jizo.desc": "メイドに右クリックすると無敵になります。クリエイティブモード限定", "tooltips.touhou_little_maid.photo.no_data.desc": "この写真にはメイドが写っていません", "tooltips.touhou_little_maid.film.no_data.desc": "このフィルムにはメイドが写っていません", @@ -101,8 +219,12 @@ "tooltips.touhou_little_maid.wireless_io.binding_pos.has": "チェストの座標: %d, %d, %d", "tooltips.touhou_little_maid.wireless_io.binding_pos.none": "チェストが設定されていません", "tooltips.touhou_little_maid.maid_beacon.desc": "溜まったP点:%s", + "tooltips.touhou_little_maid.chair_show.desc": "このアイテムを持ちながらスニークすることで椅子の判定を確認出来る", + "tooltips.touhou_little_maid.custom_sound.credit": "クレジットサウンドを鳴らす", "tooltips.touhou_little_maid.custom_sound.open_url": "サウンドパックのURLを開く", "tooltips.touhou_little_maid.custom_sound.play_sound": "クリックして音を再生", + "tooltips.touhou_little_maid.fox_scroll.dimension": "§a §7ディメンション: %s", + "tooltips.touhou_little_maid.fox_scroll.position": "§a §7座標: [%s§7]", "tooltips.touhou_little_maid.fox_scroll.red": "読み込まれていないチャンクにいるメイドを表示します", "tooltips.touhou_little_maid.fox_scroll.white": "メイドの墓石の位置を表示します", "tooltips.touhou_little_maid.favorability_tool.add": "メイドを右クリックし64ptの好感度を与える(shift時は1pt)", @@ -113,14 +235,21 @@ "tooltips.touhou_little_maid.tank_backpack.capacity": "容量: %d mB", "tooltips.touhou_little_maid.item_container.empty": "空", "tooltips.touhou_little_maid.broom.desc": "ブロックを右クリックしてほうきを置く", + "tooltips.touhou_little_maid.scarecrow.desc": "設置した場所から%dx%dの正方形の範囲に妖精メイドがスポーンするのを防ぎます", + "tooltips.touhou_little_maid.servant_bell.desc.1": "- メイドを右クリックしてマークします", + "tooltips.touhou_little_maid.servant_bell.desc.2": "- マークされたメイドはベルを使用するとテレポートします", + "tooltips.touhou_little_maid.monster_list.desc": "Version 1.1.13 以降でこのアイテムは削除され、使用できなくなりました", "overlay.touhou_little_maid.compass.tips": "メイドのタスクエリアを表示するには右クリックしてください", "overlay.touhou_little_maid.golden_apple.tips": "金のリンゴはshift + 右クリックでメイドに与えることができます", "overlay.touhou_little_maid.potion.tips": "ポーションはshift + 右クリックでメイドに与えることができます", "overlay.touhou_little_maid.milk_bucket.tips": "ミルクバケツはshift + 右クリックでメイドのポーション効果を解除します", "overlay.touhou_little_maid.script_book.tips": "メイドのチャットバブルのテキストを書き込むことができます", "overlay.touhou_little_maid.name_tag.tips": "右クリックでメイドに名前を付ける", + "overlay.touhou_little_maid.lead.tips": "右クリックでリードをつなぐ", "overlay.touhou_little_maid.debug_stick.tips": "メイドの雇用主UUIDを変更する", "overlay.touhou_little_maid.ntr_item.tips": "他人のメイドをヘッドハンティングしよう", + "overlay.touhou_little_maid.remove_backpack.tips": "メイドからバックパックを取り外す", + "overlay.touhou_little_maid.saddle.tips": "右クリックでメイドを持ち抱える", "gui.touhou_little_maid.schedule.day": "日勤", "gui.touhou_little_maid.schedule.night": "夜勤", "gui.touhou_little_maid.schedule.all": "24時間労働", @@ -150,6 +279,16 @@ "gui.touhou_little_maid.button.model_download": "メイドのリソースパックのダウンロードGUIを開く", "gui.touhou_little_maid.button.model_download.statue.first": "さらに多くのモデルやサウンドをダウンロードするには、ここをクリックしてください!", "gui.touhou_little_maid.button.model_download.statue.update": "いくつかの新しいモデルやサウンドがあります!", + "gui.touhou_little_maid.button.main": "メイン", + "gui.touhou_little_maid.button.main.desc": " -§aメイドのメイン画面、主にインベントリ整理に使用します。", + "gui.touhou_little_maid.button.task_config": "お仕事の設定", + "gui.touhou_little_maid.button.task_config.desc": " -§aお仕事に特別な設定をするために使用します。", + "gui.touhou_little_maid.button.maid_config": "メイドの設定", + "gui.touhou_little_maid.button.maid_config.desc": " -§a個別にメイドの機能を設定するために使用します。", + "gui.touhou_little_maid.button.task_book": "覚えやすい幻想郷は読みましたか?", + "gui.touhou_little_maid.button.task_book.desc": " -§aこのmodの説明書である「覚えやすい幻想郷」について教えてくれます。", + "gui.touhou_little_maid.button.global_config": "グローバル設定", + "gui.touhou_little_maid.button.global_config.desc": " -§aクリックすると詳細設定画面に移動します", "gui.touhou_little_maid.name_tag.edit_box": "名前変更欄", "gui.touhou_little_maid.tag.always_show": "常に名前を表示するか", "gui.touhou_little_maid.wireless_io.filter_mode": "フィルターモードの切り替え", @@ -185,22 +324,48 @@ "gui.touhou_little_maid.resources_download.all": "全て", "gui.touhou_little_maid.resources_download.maid": "メイド", "gui.touhou_little_maid.resources_download.chair": "チェア", + "gui.touhou_little_maid.resources_download.sound": "サウンド", + "gui.touhou_little_maid.resources_download.chair.tips": "椅子のリソースパック", "gui.touhou_little_maid.resources_download.not_download": "ダウンロードされていません", "gui.touhou_little_maid.resources_download.downloaded": "ダウンロード完了", "gui.touhou_little_maid.resources_download.downloading": "ダウンロード中", "gui.touhou_little_maid.resources_download.need_update": "更新が必要", "gui.touhou_little_maid.resources_download.delete.confirm": "このファイルを削除しますか?", "gui.touhou_little_maid.resources_download.open_link": "著者のウェブサイトを開く", + "gui.touhou_little_maid.resources_download.search": "検索中...", "gui.touhou_little_maid.model_gui.easter_egg.normal": "これは通常のイースターエッグモデルです", "gui.touhou_little_maid.maid_config.sound_frequency": "メイドの声の周波数", "gui.touhou_little_maid.maid_config.show_chat_bubble": "チャットバブルを表示する", "gui.touhou_little_maid.maid_config.show_backpack": "バックパックを表示する", + "gui.touhou_little_maid.maid_config.pick_type": "拾う物の種類", + "gui.touhou_little_maid.maid_config.open_door": "ドアを開ける", + "gui.touhou_little_maid.maid_config.open_fence_gate": "フェンスゲートを開ける", + "gui.touhou_little_maid.maid_config.value.true": "ON", + "gui.touhou_little_maid.maid_config.value.false": "OFF", + "gui.touhou_little_maid.maid_config.value.item": "アイテム", + "gui.touhou_little_maid.maid_config.value.xp": "経験値", + "gui.touhou_little_maid.maid_config.value.all": "全て", + "gui.touhou_little_maid.model_switcher.direction.north": "向き: N", + "gui.touhou_little_maid.model_switcher.direction.south": "向き: S", + "gui.touhou_little_maid.model_switcher.direction.east": "向き: E", + "gui.touhou_little_maid.model_switcher.direction.west": "向き: W", + "gui.touhou_little_maid.model_switcher.list.add": "追加", "gui.touhou_little_maid.custom_sound.pack.apply": "このサウンドパックを適用する", + "gui.touhou_little_maid.fox_scroll.position": "座標: [%s]", "gui.touhou_little_maid.fox_scroll.distance.same_dimension": "距離: %dm", "gui.touhou_little_maid.fox_scroll.distance.different_dimension": "距離:???m", + "gui.touhou_little_maid.fox_scroll.empty": "任意のメイドの座標がありません", + "gui.touhou_little_maid.cache_screen.progress": "進行状況: %d/%d", + "gui.touhou_little_maid.monster_type.friendly": "§a友好", + "gui.touhou_little_maid.monster_type.neutral": "§7中立", + "gui.touhou_little_maid.monster_type.hostile": "§c敵対", + "gui.touhou_little_maid.monster_type.title": "メイドの攻撃リスト", + "gui.touhou_little_maid.monster_type.add": "追加", + "gui.touhou_little_maid.default_task_config.title": "現在のお仕事には細かい設定はありません...", "chat_bubble.touhou_little_maid.inner.feed_animal.max_number": "もう!押さないで! I ご飯あげないよ!", "chat_bubble.touhou_little_maid.inner.home_meal.two_hand_is_full": "しまった!両手が塞がってる! I おいしいご飯が食べられない!", "chat_bubble.touhou_little_maid.inner.home_meal.meal_is_empty": "はやくはやく! I お腹ペコペコです!", + "chat_bubble.touhou_little_maid.inner.fishing.no_sit": "椅子やボートに座りながら釣りがしたいです!", "message.touhou_little_maid.missing_patchouli.title": "[TLM]", "message.touhou_little_maid.missing_patchouli.click_here": "覚えやすい幻想郷を手に入れるための Patchouli Mod をインストールするには、ここをクリックしてください。", "message.touhou_little_maid.missing_patchouli.url": "https://www.curseforge.com/minecraft/mc-mods/patchouli", @@ -219,10 +384,14 @@ "message.touhou_little_maid.gomoku.not_owner": "ゲームに参加しているメイドはあなたのものではありません", "message.touhou_little_maid.gomoku.rank_up.title": "§6§nCongratulations", "message.touhou_little_maid.gomoku.rank_up.subtitle": "メイドがリベンジに燃えています!五目並べの腕前が上がりました!", + "message.touhou_little_maid.trumpet.unloaded_maid": "読み込まれていないチャンクに %d メイドがいます。赤いきつねのスクロールを使って見つけましょう!", "message.touhou_little_maid.shrine.not_film": "分社にはメイドの写ったフィルムのみ置くことができます", "message.touhou_little_maid.shrine.health_low": "HPが低すぎます!", "message.touhou_little_maid.kappa_compass.clear": "すべての位置設定がクリアされました", + "message.touhou_little_maid.kappa_compass.full": "位置設定がいっぱいです。shift+右クリックでクリアしてください。", "message.touhou_little_maid.kappa_compass.far_away": "前の位置から距離が離れすぎています。最大値は 64 に制限されています。", + "message.touhou_little_maid.kappa_compass.maid_write": "メイドに位置設定を書き込みました", + "message.touhou_little_maid.kappa_compass.maid_clear": "メイドの位置設定をクリアしました", "message.touhou_little_maid.kappa_compass.maid_dimension_check": "記録されたディメンションが現在のメイドのディメンションと一致していません", "message.touhou_little_maid.kappa_compass.no_data": "このコンパスは位置を記録していません", "message.touhou_little_maid.kappa_compass.work": "§a §7お仕事エリア: [%d, %d, %d§7]", @@ -233,16 +402,28 @@ "message.touhou_little_maid.kappa_compass.sleep_area": "睡眠エリア", "message.touhou_little_maid.kappa_compass.usage.set_pos": "§6- §b右クリックで位置を設定します", "message.touhou_little_maid.kappa_compass.usage.clear_pos": "§6- §bShift + 右クリックで位置をクリアします", + "message.touhou_little_maid.kappa_compass.usage.write_pos_to_maid": "§d- §2メイドに右クリックをして位置を書き込みます", + "message.touhou_little_maid.kappa_compass.usage.clear_maid_pos": "§d- §2Shift + 右クリックでメイドの位置設定をクリアします", + "message.touhou_little_maid.check_schedule_pos.too_far": "§c§l記憶された位置設定から離れすぎています\n\n§6§n記憶された位置設定をクリアする場合、河童コンパスを持ちメイドを右クリックしてください", + "message.touhou_little_maid.check_schedule_pos.dimension": "§c§lメイドに記憶された位置設定のディメンションと現在のディメンションが異なっています\n\n§6§記憶された位置設定をクリアする場合、河童コンパスを持ちメイドを右クリックしてください", "message.touhou_little_maid.script_book.remove": "メイドのチャットバブルスクリプトをクリアしました", "message.touhou_little_maid.script_book.install": "メイドのチャットバブルスクリプトを正常にインストールしました", "message.touhou_little_maid.script_book.copy": "メイドのチャットバブルスクリプトをコピーしました", "message.touhou_little_maid.broom.unable_fly": "メイドさんと一緒に乗る必要があります!", - "commands.touhou_little_maid.pack.reload.info": "すべてのモデルパックが再読み込みされました!", + "message.touhou_little_maid.saddle.how_to_eject": "サドルを持って再度右クリックすることでメイドを降ろすことが出来ます", + "message.touhou_little_maid.tombstone.not_yours.1": "このメイドの墓石はあなたのものではありません!サーバー管理者の場合は、引き抜きアイテムで右クリックして削除してください", + "message.touhou_little_maid.tombstone.not_yours.2": "現在の引き抜きアイテム: ", + "message.touhou_little_maid.servant_bell.show_pos": "メイドはロードされていないチャンクにいるようです、マーカーに従って見つけてあげましょう", + "message.touhou_little_maid.servant_bell.not_same_dimension": "メイドと同じディメンションにいないようです、メイドは %s ディメンションにいます。", + "message.touhou_little_maid.servant_bell.no_result": "メイドが見つかりません", + "message.touhou_little_maid.servant_bell.data_is_empty": "データが記録されていません", "commands.touhou_little_maid.power.handle.info": "%d プレイヤーの霊力が変更されました", "commands.touhou_little_maid.maid_num.handle.info": "%d プレイヤーのメイド番号が変更されました", "commands.touhou_little_maid.power.get.info": "%s: %.2f", "commands.touhou_little_maid.maid_num.get.info": "%s: %d", "argument.touhou_little_maid.handle_type.invalid": "ハンドルタイプが無効です", + "death.attack.touhou_little_maid.danmaku": "%1$s は %2$s の弾幕によってピチューンした", + "config.touhou_little_maid.maid": "メイド", "config.touhou_little_maid.maid.maid_tamed_item": "メイドの雇用アイテム", "config.touhou_little_maid.maid.maid_tamed_item.tooltip": "メイドを雇用できるアイテム", "config.touhou_little_maid.maid.maid_temptation_item": "メイドを魅了するアイテム", @@ -259,12 +440,23 @@ "config.touhou_little_maid.maid.maid_non_home_range.tooltip": "非ホームモードの最大範囲", "config.touhou_little_maid.maid.feed_animal_max_number": "動物の最大数", "config.touhou_little_maid.maid.feed_animal_max_number.tooltip": "メイドが動物を繁殖させる時の最大数", + "config.touhou_little_maid.maid.maid_change_model": "メイドのモデル変更", "config.touhou_little_maid.maid.maid_change_model.tooltip": "メイドのモデルを自由に切り替えることができます", "config.touhou_little_maid.maid.owner_max_maid_num": "メイドの最大雇用数", "config.touhou_little_maid.maid.owner_max_maid_num.tooltip": "プレイヤーが雇用できるメイドの最大数", + "config.touhou_little_maid.maid.replace_allay_percent": "アレイの置き換え確率", + "config.touhou_little_maid.maid.replace_allay_percent.tooltip": "ピリジャーの前哨基地でアレイをメイドに置き換える確率", "config.touhou_little_maid.maid.maid_backpack_blacklist": "バックパックのブラックリスト", "config.touhou_little_maid.maid.maid_backpack_blacklist.tooltip": "これらのアイテムはメイドバックパックに入れられません", + "config.touhou_little_maid.maid.maid_attack_ignore": "メイドの近接攻撃を無効化", + "config.touhou_little_maid.maid.maid_attack_ignore.tooltip": "メイドが攻撃の標的として認識しなくなる", "config.touhou_little_maid.maid.maid_gomoku_owner_limit.tooltip": "メイドは雇用主とのみ五目並べをプレイできます", + "config.touhou_little_maid.chair": "椅子", + "config.touhou_little_maid.chair.chair_change_model": "椅子のモデル変更", + "config.touhou_little_maid.chair.chair_change_model.tooltip": "椅子は自由にモデルを切り替えることができます", + "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone": "誰でも椅子を破壊できる", + "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone.tooltip": "誰にでも椅子を破壊されることがある", + "config.touhou_little_maid.misc": "その他", "config.touhou_little_maid.misc.maid_fairy_power_point": "妖精メイドのPアイテム", "config.touhou_little_maid.misc.maid_fairy_power_point.tooltip": "妖精メイドのPアイテム", "config.touhou_little_maid.misc.maid_fairy_spawn_probability": "メイド妖精のスポーン確率", @@ -285,6 +477,11 @@ "config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip": "神社の灯篭のPアイテム最大保存容量", "config.touhou_little_maid.misc.shrine_lamp_max_range": "神社の灯篭の最大範囲", "config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip": "神社の灯籠がPアイテムを収集する最大範囲", + "config.touhou_little_maid.misc.scarecrow_range": "白狐像の効果範囲", + "config.touhou_little_maid.misc.scarecrow_range.tooltip": "白狐像が妖精メイドのスポーンを防ぐ範囲", + "config.touhou_little_maid.misc.use_new_maid_fairy_model": "新しい妖精メイドのモデルを使用する", + "config.touhou_little_maid.misc.use_new_maid_fairy_model.tooltip": "妖精メイドの新しいバージョンのモデルを使用するかどうか", + "config.touhou_little_maid.vanilla": "バニラの要素", "config.touhou_little_maid.vanilla.replace_slime_model": "スライムモデルの置き換え", "config.touhou_little_maid.vanilla.replace_slime_model.tooltip": "バニラスライムのモデルをゆっくり に置き換えるかどうか", "config.touhou_little_maid.vanilla.replace_xp_texture": "XPオーブのテクスチャの置き換え", @@ -312,6 +509,8 @@ "task.touhou_little_maid.feed_animal": "飼育", "task.touhou_little_maid.extinguishing": "消火", "task.touhou_little_maid.board_games": "ゲーム", + "task.touhou_little_maid.gun_attack": "銃火器", + "task.touhou_little_maid.fishing": "釣り", "task.touhou_little_maid.desc.title": "[説明]", "task.touhou_little_maid.desc.condition": "[必要な条件]", "task.touhou_little_maid.idle.desc": "何もしません", @@ -348,10 +547,11 @@ "task.touhou_little_maid.extinguishing.desc": "メイドは周囲の火を消そうとします", "task.touhou_little_maid.extinguishing.condition.has_extinguisher": "メイドが消火器を持っている", "task.touhou_little_maid.board_games.desc": "メイドは近くの五目並べを探します", + "task.touhou_little_maid.fishing.desc": "メイドは椅子やボートに座って釣りを始めます", + "task.touhou_little_maid.fishing.condition.has_fishing_rod": "メインハンドに釣り竿を持っている", "button.touhou_little_maid.maid.mode.idle": "待機", "button.touhou_little_maid.maid.mode.attack": "近接攻撃", "button.touhou_little_maid.maid.mode.range_attack": "遠隔攻撃", - "button.touhou_little_maid.maid.mode.danmaku_attack": "弾幕", "button.touhou_little_maid.maid.mode.farm": "農業", "button.touhou_little_maid.maid.mode.feed": "お食事", "button.touhou_little_maid.maid.mode.shears": "毛刈り", @@ -370,6 +570,8 @@ "button.touhou_little_maid.maid.ai.tamed": "雇用時", "button.touhou_little_maid.maid.ai.item_get": "アイテムを拾う", "button.touhou_little_maid.maid.ai.death": "死亡", + "button.touhou_little_maid.maid.ai.game_win": "ゲームに勝利", + "button.touhou_little_maid.maid.ai.game_lost": "ゲームに敗北", "button.touhou_little_maid.maid.environment.hot": "暑い", "button.touhou_little_maid.maid.environment.cold": "寒い", "button.touhou_little_maid.maid.environment.rain": "雨天", @@ -381,7 +583,6 @@ "subtitle.touhou_little_maid.maid.mode.idle": "メイドの待機の音", "subtitle.touhou_little_maid.maid.mode.attack": "メイドの近接攻撃の音", "subtitle.touhou_little_maid.maid.mode.range_attack": "メイドの遠隔攻撃の音", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "メイドの弾幕の音", "subtitle.touhou_little_maid.maid.mode.farm": "農業係のメイドの音", "subtitle.touhou_little_maid.maid.mode.feed": "餌係のメイドの音", "subtitle.touhou_little_maid.maid.mode.shears": "毛刈り係のメイドの音", @@ -400,6 +601,8 @@ "subtitle.touhou_little_maid.maid.ai.tamed": "メイドを雇った時の音", "subtitle.touhou_little_maid.maid.ai.item_get": "メイドがアイテムを拾った時の音", "subtitle.touhou_little_maid.maid.ai.death": "メイドが死んだ時の音", + "subtitle.touhou_little_maid.maid.ai.game_win": "メイドがゲームに勝った時の音", + "subtitle.touhou_little_maid.maid.ai.game_lost": "メイドがゲームに負けたときの音", "subtitle.touhou_little_maid.maid.environment.hot": "メイドが暑いと感じた時の音", "subtitle.touhou_little_maid.maid.environment.cold": "メイドが寒いと感じた時の音", "subtitle.touhou_little_maid.maid.environment.rain": "雨の時のメイドの音", @@ -414,6 +617,10 @@ "subtitle.touhou_little_maid.block.gomoku_reset": "五目並べのリセット時の音", "subtitle.touhou_little_maid.entity.box": "ボックスを開ける音", "subtitle.touhou_little_maid.item.compass": "コンパスの座標の設定の音", + "touhou_little_maid.subtitles.entity.fairy.ambient": "妖精メイドが何もしてないときの音", + "touhou_little_maid.subtitles.entity.fairy.death": "妖精メイドが死んだ時の音", + "touhou_little_maid.subtitles.entity.fairy.hurt": "妖精メイドが攻撃された音", + "emi.category.touhou_little_maid.altar": "祭壇のクラフト", "jei.touhou_little_maid.altar_craft.title": "祭壇のクラフト", "jei.touhou_little_maid.altar_craft.result": "結果: %s", "jei.touhou_little_maid.altar_craft.item_craft.result": "アイテムの作成", @@ -426,6 +633,8 @@ "top.touhou_little_maid.entity_maid.schedule": "スケジュール: ", "top.touhou_little_maid.entity_maid.favorability": "好感度: %d", "top.touhou_little_maid.entity_maid.nex_favorability_point": "%d ポイントでアップグレードできます", + "domesticationinnovation.touhou_little_maid.enchantment.undead_curse": "§4アンデッド化の呪いエンチャントはメイドに適用することはできません!", + "domesticationinnovation.touhou_little_maid.enchantment.blazing_protection": "§4炎属性のエンチャントはメイドに適用できません!", "config.jade.plugin_touhou_little_maid.maid": "メイドの追加情報を表示", "config.jade.plugin_touhou_little_maid.shrine_lamp": "神社の灯篭の追加情報を表示", "patchouli.touhou_little_maid.book.name": "覚えやすい幻想郷", @@ -445,6 +654,7 @@ "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.0.text": "メイドは多くの基本的機能があります。$(li)デフォルトでは、メイドは周辺のアイテムと経験値オーブを回収します。メイドノメインGUIにはピックアップモードを切り替えるボタンがあります。$(li)デフォルトでは、メイドは常にプレイヤーの傍に居ます。", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.1.text": "$(li)メイドをShift + 右クリックすると、お座りモードを切り替えることができます。 お座りモードでは、メイドは危険を避けることも含めて何もしません。$(li)メイドが他のエンティティに乗っているとき、Shift + 右クリックすると、それらから降りることができます。$(li)金のリンゴやポーションを持ちながらShift + 右クリックでそれらをメイドに与えます。", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.2.text": "$(li)プレイヤーがガラス瓶を持ったままメイドを右クリックすると、メイドが拾った経験値をエンチャントの瓶に変換できます。$(li)メイドは生物の頭を装備し、そのモデルをレンダリングできます。$ (li)空の名札を持ってメイドを右クリックすると、直接名前を付けることができます。$(li)メイドが動物の誘引アイテムを持っていると、周囲の動物を引き寄せることができます", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.3.text": "$(li)サドルを持ちながらメイドを右クリックして、メイドを持ち抱えましょう。$(li)クリーパーはメイドを避けます。", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.name": "メイド専用 宝玉", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.0.text": "このModは、特定の条件下でメイドさんを保護するためにトリガーすることができるいくつかの宝玉を提供しています、これらは宝玉のインベントリに配置する必要があります。$(li)Ultramarine Orb Elixir: メイドの死を避けるために6回使用できます。", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.pages.1.text": "$(li)耐性の宝玉:特定の条件下の時、ダメージを無効化します。$(li)ひらり布:遠距離攻撃がメイドに向かってきた時、エンダーマンのようにテレポートします。", @@ -455,6 +665,7 @@ "patchouli.touhou_little_maid.book.entries.maid.maid_skin.pages.1.text": "画像のボタンをクリックして、メイドスキンのGUIを開きます。", "patchouli.touhou_little_maid.book.entries.maid.maid_sound.name": "メイドのサウンド", "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.0.text": "カスタムサウンドリソースパックを作成して、メイドの効果音を置き換えたり拡張したりできます。", + "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.1.text": "画像のボタンをクリックして、メイドサウンドのGUIを開きます。", "patchouli.touhou_little_maid.book.entries.maid.maid_task.name": "メイドタスク", "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.0.text": "メイドのGUIを開くと、メイドのタスクボタンが表示され、クリックしてメイドのタスクを切り替えることができます。$(br2)スケジュールボタンをクリックしてメイドのスケジュールを切り替え、異なる$(br2)時間帯に仕事、休息、睡眠ができるようにスケジュールを設定できます。", "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.1.text": "画像を切り替えるには、画像の右下隅のボタンをクリックします", @@ -489,6 +700,8 @@ "patchouli.touhou_little_maid.book.entries.maid.maid_meal.name": "メイドの食事", "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.0.text": "メイドは仕事中や怪我をしているときに食事をして好感度を上げたり、健康を回復したりすることができます。$(br2)食べ物をメインハンドかオフハンドに置いてください。", "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.1.text": "メイド達はピクニックマットで食事をすることで好感度が大幅に上がります。$(br2)美味しいご飯をご馳走してあげてください!", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.name": "サーバントベル", + "patchouli.touhou_little_maid.book.entries.maid.servant_bell.pages.0.text": "サーバントベルは一人ずつメイドを呼び寄せることが出来ます。読み込まれていないチャンクにメイドがいる場合はどこにいるか教えてくれます。$(br2)このアイテムを持ってメイドを右クリックすることでマーキングをします", "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.name": "彫刻刀と彫像", "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.0.text": "彫刻刀で粘土ブロックを右クリックすると、さまざまなサイズの彫像を作成できます。1x1x1、1x1x2、2x2x4、3x3x6のサイズに対応。", "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.1.text": "オフハンドにメイドの写真、メインハンドに彫刻刀を持って粘土ブロックに右クリックすると写真のメイドを彫刻することができます。", @@ -513,9 +726,17 @@ "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "右クリックで投げるとP点をドロップします。$(br2)このP点はダンジョンなどの構造物のチェストにあります。", "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.name": "カメラと写真", "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.pages.0.text": "メイドを長距離移動させることや別ディメンションへ移動させることは大変手間がかかります。それを解決する為にカメラは設計されています。$(br2)カメラをメイドに使用することでメイドを写真の中にしまうことができます。写真は右クリックして中のメイドを解放できます。", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.name": "モデルスイッチャー", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.0.text": "クリエイティブモードで使用できます。主にサーバー用に設計されており、メイドモデルを切り替えるために使用できます。", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.1.text": "まず、モデルスイッチャーを持ちながらメイドを右クリックする必要があります 地面に置いてGUIを開き、表示するモデルを設定します。$(br2)その後、左右のレッドストーン信号を入力してメイドモデルを切り替えます。", + "patchouli.touhou_little_maid.book.entries.other.chair_show.name": "椅子の表示", + "patchouli.touhou_little_maid.book.entries.other.chair_show.pages.0.text": "このアイテムを持ったままスニークをすると、すべての椅子の当たり判定が表示されます", "patchouli.touhou_little_maid.book.entries.other.favorability_tool.name": "好感度ツール", "patchouli.touhou_little_maid.book.entries.other.favorability_tool.pages.0.text": "右クリックでメイドの好感度を変更します。クリエイティブモード限定。", + "patchouli.touhou_little_maid.book.entries.other.fox_scroll.name": "きつねのスクロール", "patchouli.touhou_little_maid.book.entries.other.fox_scroll.pages.0.text": "メイドやメイドの墓石を見つけるために使用します。", + "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.name": "花崗稲荷の白狐像", + "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.pages.0.text": "花崗稲荷の白狐像は妖精メイドのスポーンを防ぐことが出来ますが、他のmobのスポーンを防ぐ効果はありません。$(br2)効果範囲は正方形で、y方向は地底から天界まですべてをカバーしています!", "patchouli.touhou_little_maid.book.entries.other.gomoku.name": "五目並べ", "patchouli.touhou_little_maid.book.entries.other.gomoku.pages.0.text": "メイドと五目並べをすることができ、勝つとメイドの好感度が上がります。$(br2)何度も勝つとメイドの五目並べスキルもアップします。", "patchouli.touhou_little_maid.book.entries.other.maid_joy.name": "メイドの娯楽", @@ -542,6 +763,8 @@ "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.link_text": "東方wiki", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.name": "ワールドの生成", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.0.text": "このModはモブを追加します。$(br2)ドロップアイテムは貴重なクラフトの素材となります。$(br2)Modにより追加された敵対的なモブはコンフィグによりスポーンの確率を変更できます。値を0に設定した場合、スポーンしなくなります。", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.1.text": "夜にいくつかのバイオームでスポーンし、飛びながら弾幕を撃ちプレイヤーやメイドを攻撃します。", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.2.text": "ピリジャーの前哨基地の檻の中にメイドが囚われている可能性があります", "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.name": "カスタムモデルを作成", "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.link_text": "リンクを開く", "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.name": "カスタムモデルをダウンロードする", diff --git a/src/main/resources/assets/touhou_little_maid/lang/ko_kr.json b/src/main/resources/assets/touhou_little_maid/lang/ko_kr.json index bb5a0bd8f..dd7f82772 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/ko_kr.json +++ b/src/main/resources/assets/touhou_little_maid/lang/ko_kr.json @@ -98,7 +98,6 @@ "subtitle.touhou_little_maid.maid.mode.idle": "메이드 음성", "subtitle.touhou_little_maid.maid.mode.attack": "메이드가 공격함", "subtitle.touhou_little_maid.maid.mode.range_attack": "메이드가 활을 쏨", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "메이드가 탄막을 쏨", "subtitle.touhou_little_maid.maid.mode.farm": "메이드가 농사를 지음", "subtitle.touhou_little_maid.maid.mode.feed": "메이드가 음식을 먹음", "subtitle.touhou_little_maid.maid.mode.shears": "메이드가 양털을 깎음", diff --git a/src/main/resources/assets/touhou_little_maid/lang/pt_br.json b/src/main/resources/assets/touhou_little_maid/lang/pt_br.json index ed46bd8fb..f74457a00 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/pt_br.json +++ b/src/main/resources/assets/touhou_little_maid/lang/pt_br.json @@ -151,7 +151,6 @@ "message.touhou_little_maid.photo.have_no_nbt_data": "Esta maldita foto não tem dados NBT.", "message.touhou_little_maid.chisel.hit_block_error": "Por favor, clique com o botão direito no bloco de argila", "message.touhou_little_maid.chisel.offhand_not_photo": "Por favor, tenha uma foto com empregada na mão secundária", - "commands.touhou_little_maid.pack.reload.info": "Todos os modelos de pacote foram recarregados!", "commands.touhou_little_maid.power.handle.info": "O ponto de poder dos jogadores %d foi alterado", "commands.touhou_little_maid.maid_num.handle.info": "O número de empregada dos jogadores %d foi alterado", "argument.touhou_little_maid.handle_type.invalid": "Tipo de manipulação inválida", @@ -194,7 +193,6 @@ "subtitle.touhou_little_maid.maid.mode.idle": "Som Ocioso da Maid", "subtitle.touhou_little_maid.maid.mode.attack": "Som de ataque da Maid", "subtitle.touhou_little_maid.maid.mode.range_attack": "Som de Longa Distancia da Maid", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Som de Danmaku da Maid", "subtitle.touhou_little_maid.maid.mode.farm": "Som de Plantar da Maid", "subtitle.touhou_little_maid.maid.mode.feed": "Som de Alimentar da Maid", "subtitle.touhou_little_maid.maid.mode.shears": "Som de Tosa da Maid", diff --git a/src/main/resources/assets/touhou_little_maid/lang/ru_ru.json b/src/main/resources/assets/touhou_little_maid/lang/ru_ru.json index 0cc78e98c..dc6d3559a 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/ru_ru.json +++ b/src/main/resources/assets/touhou_little_maid/lang/ru_ru.json @@ -135,7 +135,6 @@ "message.touhou_little_maid.photo.have_no_nbt_data": "У этого фото нет данных NBT.", "message.touhou_little_maid.chisel.hit_block_error": "Пожалуйста, нажмите ПКМ по блоку глины", "message.touhou_little_maid.chisel.offhand_not_photo": "Пожалуйста, возьмите фото горничной в свою вторую руку", - "commands.touhou_little_maid.pack.reload.info": "Все наборы моделей были перезагружены!", "commands.touhou_little_maid.power.handle.info": "%d очки силы игрока изменены", "commands.touhou_little_maid.maid_num.handle.info": "%d кол-во горничных игрока изменены", "argument.touhou_little_maid.handle_type.invalid": "Неверный тип файла", @@ -180,7 +179,6 @@ "subtitle.touhou_little_maid.maid.mode.idle": "Звук стоящей горничной", "subtitle.touhou_little_maid.maid.mode.attack": "Звук атаки горничной", "subtitle.touhou_little_maid.maid.mode.range_attack": "Звук стрельбы горничной", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Звук атаки данмаку горничной", "subtitle.touhou_little_maid.maid.mode.farm": "Звук фермерства горничной", "subtitle.touhou_little_maid.maid.mode.feed": "Звук корма животных горничной", "subtitle.touhou_little_maid.maid.mode.shears": "Звук подстригания овец горничной", diff --git a/src/main/resources/assets/touhou_little_maid/lang/vi_vn.json b/src/main/resources/assets/touhou_little_maid/lang/vi_vn.json index da2098a68..81b18595e 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/vi_vn.json +++ b/src/main/resources/assets/touhou_little_maid/lang/vi_vn.json @@ -1,4 +1,60 @@ { + "advancements.touhou_little_maid.base.craft_gohei.description": "Tạo một cây gohei", + "advancements.touhou_little_maid.base.craft_gohei.title": "Chìa khóa đến Gensou?", + "advancements.touhou_little_maid.base.build_altar.description": "Xây dựng một bàn thờ, và hãy để niềm vui bắt đầu", + "advancements.touhou_little_maid.base.build_altar.title": "Hoàn thành xây dựng", + "advancements.touhou_little_maid.base.change_chair_model.description": "Thay đổi hình dạng ghế", + "advancements.touhou_little_maid.base.change_chair_model.title": "Ghế ngồi khác nhau", + "advancements.touhou_little_maid.base.change_maid_model.description": "Thay đổi trang phục người hầu", + "advancements.touhou_little_maid.base.change_maid_model.title": "Cosplay!", + "advancements.touhou_little_maid.base.change_maid_sound.description": "Thay đổi âm thanh người hầu", + "advancements.touhou_little_maid.base.change_maid_sound.title": "Lồng tiếng", + "advancements.touhou_little_maid.base.craft_chair.description": "Tạo một chiếc ghế", + "advancements.touhou_little_maid.base.craft_chair.title": "Reiner, ngồi xuống", + "advancements.touhou_little_maid.base.kill_maid_fairy.description": "Giết một tiểu tiên hầu gái", + "advancements.touhou_little_maid.base.kill_maid_fairy.title": "Những nàng tiên nhỏ phiền phức", + "advancements.touhou_little_maid.base.pickup_power_point.description": "Nhặt điểm sức mạnh", + "advancements.touhou_little_maid.base.pickup_power_point.title": "Nếm thử Cầu Vòng", + "advancements.touhou_little_maid.base.spawn_maid.description": "Triệu hồi hầu gái từ bàn thờ", + "advancements.touhou_little_maid.base.spawn_maid.title": "Một Kiếp Người Mới", + "advancements.touhou_little_maid.base.tamed_maid.description": "Thuần phục một hầu gái bằng bánh, ta biết họ yêu ngọt", + "advancements.touhou_little_maid.base.tamed_maid.title": "Chào Mừng Chủ Nhân Về Nhà", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.description": "Trang bị cho hầu gái bộ giáp hắc thạch đầy đủ", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.title": "Bofuri", + "advancements.touhou_little_maid.challenge.any_equipment.description": "Trang bị cho nàng hầu gái bất kỳ bộ giáp nào", + "advancements.touhou_little_maid.challenge.any_equipment.title": "Lên đồ", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "Cho hầu gái ăn táo vàng phù phép", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.title": "Táo tốt", + "advancements.touhou_little_maid.challenge.kill_100.description": "Hầu gái diệt 100 quái", + "advancements.touhou_little_maid.challenge.kill_100.title": "Thợ Săn Điên Cuồng", + "advancements.touhou_little_maid.challenge.kill_wither.description": "Hầu gái diệt Wither", + "advancements.touhou_little_maid.challenge.kill_wither.title": "Kẻ Diệt Wither", + "advancements.touhou_little_maid.challenge.kill_dragon.description": "Hầu gái diệt rồng Ender", + "advancements.touhou_little_maid.challenge.kill_dragon.title": "Rồng-bay đi với một tiếng nổ lớn", + "advancements.touhou_little_maid.challenge.kill_slime_300.description": "Nàng hầu gái diệt 300 slime, bất kể slime thường hay magma", + "advancements.touhou_little_maid.challenge.kill_slime_300.title": "Vị ngọt dẻo", + "advancements.touhou_little_maid.challenge.lightning_bolt.description": "Triệu hồi một tia sét từ bàn thờ, để tia sét đánh vào hầu gái", + "advancements.touhou_little_maid.challenge.lightning_bolt.title": "Tojiko nổi giận!", + "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "Máu hầu gái đạt 100", + "advancements.touhou_little_maid.challenge.maid_100_healthy.title": "Khỏe mạnh 100%", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "Hầu gái câu được một cuốn sách phù phép", + "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.title": "Hãy \"reel\" một chút nào", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.description": "Thu phục hầu gái từ đồn kẻ cướp", + "advancements.touhou_little_maid.challenge.tamed_maid_in_pillager_outpost.title": "Cứu được công chúa rồi!", + "advancements.touhou_little_maid.favorability.favorability_increased.description": "Tăng cường sự yêu thích của hầu gái", + "advancements.touhou_little_maid.favorability.favorability_increased.title": "Với sức mạnh vĩ đại...", + "advancements.touhou_little_maid.favorability.favorability_increased_max.description": "Đạt mức yêu thích tối đa cho hầu gái", + "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "Một trọng trách lớn đến rồi!", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "Hầu gái ăn uống trong buổi dã ngoại", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "Thời gian vui vẻ bên nhau", + "advancements.touhou_little_maid.favorability.maid_sit_joy.description": "Hầu gái ngồi trên bất kỳ khối vui vẻ nào", + "advancements.touhou_little_maid.favorability.maid_sit_joy.title": "Một chỗ ngồi thoải mái", + "advancements.touhou_little_maid.maid_base.use_trumpet.description": "Dùng kèn gọi tất cả nàng hầu gái về", + "advancements.touhou_little_maid.maid_base.use_trumpet.title": "Thú cưng Zun", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.description": "Hầu gái tránh được cái chết nhờ thuốc viên ngọc lam hoặc vật tổ trường sinh", + "advancements.touhou_little_maid.maid_base.use_undead_bauble.title": "Ôi, tôi là xác sống rồi", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.description": "Dùng white fox scroll để tìm mộ nàng hầu gái", + "advancements.touhou_little_maid.maid_base.use_white_fox_scroll.title": "Never Gonna Run Around and Desert You", "entity.touhou_little_maid.chair": "Ghế", "entity.touhou_little_maid.maid": "Người Hầu", "entity.touhou_little_maid.fairy": "Tiên giúp việc", @@ -134,7 +190,6 @@ "message.touhou_little_maid.photo.have_no_nbt_data": "Cái tấm ảnh đáng nguyền rủa này không có dữ liệu NBT nào.", "message.touhou_little_maid.chisel.hit_block_error": "Vui lòng nhấp chuột phải vào khối đất sét", "message.touhou_little_maid.chisel.offhand_not_photo": "Vui lòng có một tấm ảnh của maid trên tay phụ của bạn", - "commands.touhou_little_maid.pack.reload.info": "Tất cả gói mô hình đã được tải lại!", "commands.touhou_little_maid.power.handle.info": "%d Sức mạnh của người chơi đã thay đổi", "commands.touhou_little_maid.maid_num.handle.info": "%d số lượng người Hầu người chơi có được đã thay đổi", "task.touhou_little_maid.idle": "Chờ", @@ -175,7 +230,6 @@ "subtitle.touhou_little_maid.maid.mode.idle": "Maid đang chờ", "subtitle.touhou_little_maid.maid.mode.attack": "Maid tấng công", "subtitle.touhou_little_maid.maid.mode.range_attack": "Maid tấng công xa", - "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "Maid dùng Danmaku", "subtitle.touhou_little_maid.maid.mode.farm": "Maid làm nông", "subtitle.touhou_little_maid.maid.mode.feed": "Maid cho ăn", "subtitle.touhou_little_maid.maid.mode.shears": "Maid cắt lông", diff --git a/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json b/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json index 71023835a..a6b8e2032 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json +++ b/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json @@ -4,7 +4,7 @@ "advancements.touhou_little_maid.base.build_altar.description": "修建女仆模组的祭坛", "advancements.touhou_little_maid.base.build_altar.title": "Construction Complete", "advancements.touhou_little_maid.base.change_chair_model.description": "修改坐垫的模型", - "advancements.touhou_little_maid.base.change_chair_model.title": "我新买的家具啊", + "advancements.touhou_little_maid.base.change_chair_model.title": "我刚买的家具啊", "advancements.touhou_little_maid.base.change_maid_model.description": "切换女仆的模型", "advancements.touhou_little_maid.base.change_maid_model.title": "Cosplay!", "advancements.touhou_little_maid.base.change_maid_sound.description": "切换女仆的声音", @@ -13,29 +13,29 @@ "advancements.touhou_little_maid.base.craft_chair.title": "莱纳,你坐啊", "advancements.touhou_little_maid.base.kill_maid_fairy.description": "杀死一只妖精女仆", "advancements.touhou_little_maid.base.kill_maid_fairy.title": "退治异变", - "advancements.touhou_little_maid.base.pickup_power_point.description": "捡起任意数量的 P 点", - "advancements.touhou_little_maid.base.pickup_power_point.title": "P 点充能中", + "advancements.touhou_little_maid.base.pickup_power_point.description": "捡起任意数量的P点", + "advancements.touhou_little_maid.base.pickup_power_point.title": "P点充能中", "advancements.touhou_little_maid.base.spawn_maid.description": "从祭坛中生成一只女仆", "advancements.touhou_little_maid.base.spawn_maid.title": "见习神明", "advancements.touhou_little_maid.base.tamed_maid.description": "用蛋糕驯服女仆", "advancements.touhou_little_maid.base.tamed_maid.title": "欢迎回家,主人", - "advancements.touhou_little_maid.challenge.all_netherite_equipment.description": "将女仆全部装备上下界合金护甲", - "advancements.touhou_little_maid.challenge.all_netherite_equipment.title": "因为怕痛所以全点防御力了", - "advancements.touhou_little_maid.challenge.any_equipment.description": "给女仆装备任意护甲", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.description": "给女仆装备全套下界合金盔甲", + "advancements.touhou_little_maid.challenge.all_netherite_equipment.title": "因为太怕痛就全点防御力了", + "advancements.touhou_little_maid.challenge.any_equipment.description": "给女仆装备任意盔甲", "advancements.touhou_little_maid.challenge.any_equipment.title": "整装待发", - "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "用附魔金苹果喂养女仆", + "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.description": "喂给女仆附魔金苹果", "advancements.touhou_little_maid.challenge.eat_enchanted_golden_apple.title": "Good Apple", - "advancements.touhou_little_maid.challenge.kill_100.description": "女仆杀死100只生物", + "advancements.touhou_little_maid.challenge.kill_100.description": "女仆杀死了100只生物", "advancements.touhou_little_maid.challenge.kill_100.title": "赤色杀人魔", - "advancements.touhou_little_maid.challenge.kill_wither.description": "女仆杀死凋零", - "advancements.touhou_little_maid.challenge.kill_wither.title": "凋零杀手", - "advancements.touhou_little_maid.challenge.kill_dragon.description": "女仆杀死末影龙", + "advancements.touhou_little_maid.challenge.kill_wither.description": "女仆杀死了凋灵", + "advancements.touhou_little_maid.challenge.kill_wither.title": "凋灵杀手", + "advancements.touhou_little_maid.challenge.kill_dragon.description": "女仆杀死了末影龙", "advancements.touhou_little_maid.challenge.kill_dragon.title": "屠龙勇士", - "advancements.touhou_little_maid.challenge.kill_slime_300.description": "女仆杀死 300 只史莱姆", - "advancements.touhou_little_maid.challenge.kill_slime_300.title": "杀了三百只史莱姆,不知不觉就满级了", + "advancements.touhou_little_maid.challenge.kill_slime_300.description": "女仆杀死了300只史莱姆", + "advancements.touhou_little_maid.challenge.kill_slime_300.title": "杀了300只史莱姆,不知不觉就练到了满级", "advancements.touhou_little_maid.challenge.lightning_bolt.description": "从祭坛中合成出闪电,并用闪电击中女仆", "advancements.touhou_little_maid.challenge.lightning_bolt.title": "何方道友在此渡劫?", - "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "女仆血量达到一百点", + "advancements.touhou_little_maid.challenge.maid_100_healthy.description": "女仆的生命值达到100点", "advancements.touhou_little_maid.challenge.maid_100_healthy.title": "百分百健康", "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.description": "女仆钓鱼钓到附魔书", "advancements.touhou_little_maid.challenge.maid_fishing_enchanted_book.title": "这本书真不是偷得啦", @@ -46,7 +46,7 @@ "advancements.touhou_little_maid.favorability.favorability_increased_max.description": "女仆好感度达到满级", "advancements.touhou_little_maid.favorability.favorability_increased_max.title": "最最最最喜欢主人了", "advancements.touhou_little_maid.favorability.maid_picnic_eat.description": "女仆在野餐垫上吃东西", - "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "野炊时刻到", + "advancements.touhou_little_maid.favorability.maid_picnic_eat.title": "野炊时间到", "advancements.touhou_little_maid.favorability.maid_sit_joy.description": "女仆使用任意娱乐方块", "advancements.touhou_little_maid.favorability.maid_sit_joy.title": "休息,休息一下", "advancements.touhou_little_maid.favorability.maid_sleep.description": "女仆在女仆床上睡觉", @@ -59,7 +59,7 @@ "advancements.touhou_little_maid.favorability.win_gomoku.title": "我要成为五子棋大师!", "advancements.touhou_little_maid.maid_base.chisel_statue.description": "把黏土雕刻成女仆雕像", "advancements.touhou_little_maid.maid_base.chisel_statue.title": "陛下,奇观误国啊", - "advancements.touhou_little_maid.maid_base.clear_maid_effects.description": "使用牛奶桶清除女仆的效果", + "advancements.touhou_little_maid.maid_base.clear_maid_effects.description": "使用奶桶清除女仆的效果", "advancements.touhou_little_maid.maid_base.clear_maid_effects.title": "邪气退散", "advancements.touhou_little_maid.maid_base.maid_backpack.description": "给女仆装备任意背包", "advancements.touhou_little_maid.maid_base.maid_backpack.title": "背背背背背起了行囊", @@ -112,8 +112,8 @@ "entity.touhou_little_maid.fairy": "女仆妖精", "entity.touhou_little_maid.danmaku": "弹幕", "entity.touhou_little_maid.box": "蛋糕盒", - "entity.touhou_little_maid.power_point": "P 点", - "entity.touhou_little_maid.throw_power_point": "P 点", + "entity.touhou_little_maid.power_point": "P点", + "entity.touhou_little_maid.throw_power_point": "P点", "entity.touhou_little_maid.extinguishing_agent": "灭火剂", "entity.touhou_little_maid.sit": "座位", "entity.touhou_little_maid.tombstone": "墓碑", @@ -148,7 +148,7 @@ "item.touhou_little_maid.mute_bauble": "§6禁言饰品", "item.touhou_little_maid.entity_placeholder": "生成???", "item.touhou_little_maid.substitute_jizo": "替身地藏", - "item.touhou_little_maid.power_point": "P 点", + "item.touhou_little_maid.power_point": "P点", "item.touhou_little_maid.camera": "文文的相机", "item.touhou_little_maid.photo": "照片", "item.touhou_little_maid.film": "胶片", @@ -168,11 +168,11 @@ "item.touhou_little_maid.servant_bell": "仆人铃", "item.touhou_little_maid.monster_list": "妖怪名单(移除)", "item.touhou_little_maid.advancement_icon": "进度图标", - "item.touhou_little_maid.entity_id_copy": "实体 ID 复制器", + "item.touhou_little_maid.entity_id_copy": "实体ID复制器", "enchantment.touhou_little_maid.impeding": "阻碍", - "enchantment.touhou_little_maid.impeding.desc": "弹幕会对敌方造成缓慢 I - IV 的效果", + "enchantment.touhou_little_maid.impeding.desc": "弹幕会对敌方造成缓慢I - IV的效果", "enchantment.touhou_little_maid.speedy": "极速", - "enchantment.touhou_little_maid.speedy.desc": "lv I 会将弹幕速度提升两倍,lv II 会提升三倍", + "enchantment.touhou_little_maid.speedy.desc": "lv I会将弹幕速度提升两倍,lv II会提升三倍", "enchantment.touhou_little_maid.enders_ender": "末影终结者", "enchantment.touhou_little_maid.enders_ender.desc": "弹幕能够伤害末影人和末影龙", "block.touhou_little_maid.maid_bed": "女仆床", @@ -191,16 +191,47 @@ "block.touhou_little_maid.cchess": "中国象棋", "block.touhou_little_maid.wchess": "国际象棋", "block.touhou_little_maid.scarecrow": "麻石狐像", + "entity.touhou_little_maid.maid.tip": "使用蛋糕驯服女仆,然后她们就可以执行你设定的任务。查看《记忆中的幻想乡》来学习更多内容!", + "entity.touhou_little_maid.fairy.tip": "一边飞行,一边朝你发射弹幕。杀死后会掉落 P 点。", + "entity.touhou_little_maid.broom.tip": "需要女仆也在上面时才能飞行。请注意,一些飞行的敌对生物仍然能接近你,例如女仆妖精或幻翼。", + "item.touhou_little_maid.power_point.tip": "P 点可以在战利品箱子里找到,丢出去来吸取 P 点。", + "item.touhou_little_maid.broom.tip": "需要女仆也在上面时才能飞行。请注意,一些飞行的敌对生物仍然能接近你,例如女仆妖精或幻翼。", + "item.touhou_little_maid.maid_backpack_small.tip": "将女仆的背包拓展到 12 格。", + "item.touhou_little_maid.maid_backpack_middle.tip": "将女仆的背包拓展到 24 格。", + "item.touhou_little_maid.maid_backpack_big.tip": "将女仆的背包拓展到 36 格。", + "item.touhou_little_maid.explosion_protect_bauble.tip": "让女仆能够抵御爆炸伤害。", + "item.touhou_little_maid.fall_protect_bauble.tip": "让女仆能够抵御摔落伤害。", + "item.touhou_little_maid.drown_protect_bauble.tip": "让女仆能够抵御溺水伤害。", + "item.touhou_little_maid.fire_protect_bauble.tip": "让女仆能够抵御火焰伤害。", + "item.touhou_little_maid.projectile_protect_bauble.tip": "让女仆能够抵御弹射物伤害。", + "item.touhou_little_maid.magic_protect_bauble.tip": "让女仆能够抵药水伤害。", + "item.touhou_little_maid.item_magnet_bauble.tip": "拓展女仆的拾取范围。", + "item.touhou_little_maid.mute_bauble.tip": "如果你不喜欢女仆经常说话,它能让你的女仆保持沉默", + "item.touhou_little_maid.nimble_fabric.tip": "使女仆能够通过传送来躲避来袭的弹射物。", + "item.touhou_little_maid.crafting_table_backpack.tip": "将女仆的背包拓展到 18 格,同时提供一个便携式的合成台。", + "item.touhou_little_maid.furnace_backpack.tip": "将女仆的背包拓展到 18 格,同时提供一个便携式的熔炉。", + "item.touhou_little_maid.hakurei_gohei.tip": "用于创建祭坛所用的工具。手持御币的女仆可以向敌对的生物发射弹幕。", + "item.touhou_little_maid.sanae_gohei.tip": "用于创建祭坛所用的工具。手持御币的女仆可以向敌对的生物发射弹幕。", + "item.touhou_little_maid.film.tip": "你的女仆已经逝去了。要使她复活,请将其与金锭、铁锭、青金石、煤和红石一起放置在祭坛的每根柱子上,或将其放置在神龛中来复活", + "item.touhou_little_maid.wireless_io.tip": "隙间可以把物品从箱子传送到女仆,反之亦然。", + "item.touhou_little_maid.picnic_basket.tip": "四位女仆可以在休息日程时在这个野餐垫上享受野餐。一定要把食物装在野餐垫里,这会增加女仆的好感度。", + "block.touhou_little_maid.gomoku.tip": "在五子棋游戏中挑战女仆,你能在这个游戏中智胜女仆吗?", + "block.touhou_little_maid.maid_bed.tip": "女仆在休息日程时会在这张床上睡觉。这会增加女仆的好感度。", + "block.touhou_little_maid.shrine.tip": "神龛以罕见的几率出现在任何战利品箱中,这可以用来复活你的女仆,并将你的生命值降低到 1。", + "block.touhou_little_maid.computer.tip": "这个方块能够给女仆带来欢乐,从而增加女仆的好感度。", + "block.touhou_little_maid.keyboard.tip": "这个方块能够给女仆带来欢乐,从而增加女仆的好感度。", + "block.touhou_little_maid.bookshelf.tip": "这个方块能够给女仆带来欢乐,从而增加女仆的好感度。", + "block.touhou_little_maid.scarecrow.tip": "放置在地面上,可以阻止妖精女仆在特定区域内生成。", "tooltips.touhou_little_maid.chair.place.desc": "右击方块顶部进行放置。", - "tooltips.touhou_little_maid.chair.destroy.desc": "Shift 左击破坏它。", - "tooltips.touhou_little_maid.chair.gui.desc": "Shift 右击打开皮肤界面。", + "tooltips.touhou_little_maid.chair.destroy.desc": "Shift左击破坏它。", + "tooltips.touhou_little_maid.chair.gui.desc": "Shift右击打开皮肤界面。", "tooltips.touhou_little_maid.schedule.desc": "§7点击切换日程表", "tooltips.touhou_little_maid.info.title": "女仆详细信息", "tooltips.touhou_little_maid.info.owner": "主人", "tooltips.touhou_little_maid.info.model_name": "模型名", "tooltips.touhou_little_maid.info.experience": "经验", "tooltips.touhou_little_maid.info.favorability": "好感度", - "tooltips.touhou_little_maid.info.game_skill.gomoku": "输:%d 次,段位:%d", + "tooltips.touhou_little_maid.info.game_skill.gomoku": "输:%d次,段位:%d", "tooltips.touhou_little_maid.bauble.desc": "§a[女仆饰品]", "tooltips.touhou_little_maid.bauble.usage": "需要放置在女仆的饰品栏中", "tooltips.touhou_little_maid.backpack.desc": "§6[女仆背包]", @@ -216,14 +247,14 @@ "tooltips.touhou_little_maid.trumpet.desc.usage": "召回所有女仆", "tooltips.touhou_little_maid.trumpet.desc.note": "§c请谨记:只有加载区块上的女仆才可以被召回!", "tooltips.touhou_little_maid.wireless_io.usage.1": "拥有此饰品的女仆能够存入/取出箱子里面物品", - "tooltips.touhou_little_maid.wireless_io.usage.2": "Shift 右击箱子绑定坐标,而后右击空气打开 GUI", - "tooltips.touhou_little_maid.wireless_io.io_mode.input": "女仆 -> 箱子", - "tooltips.touhou_little_maid.wireless_io.io_mode.output": "箱子 -> 女仆", + "tooltips.touhou_little_maid.wireless_io.usage.2": "Shift右击箱子绑定坐标,而后右击空气打开GUI", + "tooltips.touhou_little_maid.wireless_io.io_mode.input": "女仆->箱子", + "tooltips.touhou_little_maid.wireless_io.io_mode.output": "箱子->女仆", "tooltips.touhou_little_maid.wireless_io.filter_mode.blacklist": "黑名单", "tooltips.touhou_little_maid.wireless_io.filter_mode.whitelist": "白名单", "tooltips.touhou_little_maid.wireless_io.binding_pos.has": "绑定坐标:%d,%d,%d", "tooltips.touhou_little_maid.wireless_io.binding_pos.none": "未绑定箱子", - "tooltips.touhou_little_maid.maid_beacon.desc": "存储 P 点:%s", + "tooltips.touhou_little_maid.maid_beacon.desc": "存储P点:%s", "tooltips.touhou_little_maid.chair_show.desc": "潜行时手持此物品可以查看坐垫的碰撞箱", "tooltips.touhou_little_maid.model_switcher.bounded": "已经绑定女仆", "tooltips.touhou_little_maid.custom_sound.credit": "播放一个声音包的备注说明", @@ -233,30 +264,30 @@ "tooltips.touhou_little_maid.fox_scroll.position": "位置:[%s]", "tooltips.touhou_little_maid.fox_scroll.red": "用来在未加载区块上寻找女仆", "tooltips.touhou_little_maid.fox_scroll.white": "用来寻找女仆墓碑", - "tooltips.touhou_little_maid.favorability_tool.add": "右击女仆可增加 64(潜行是 1)点好感度", - "tooltips.touhou_little_maid.favorability_tool.reduce": "右击女仆可减少 64(潜行是 1)点好感度", + "tooltips.touhou_little_maid.favorability_tool.add": "右击女仆可增加64(潜行是1)点好感度", + "tooltips.touhou_little_maid.favorability_tool.reduce": "右击女仆可减少64(潜行是1)点好感度", "tooltips.touhou_little_maid.favorability_tool.full": "右击女仆可加满好感度", "tooltips.touhou_little_maid.tank_backpack.empty_fluid": "空", - "tooltips.touhou_little_maid.tank_backpack.fluid": "%s: %d mB", - "tooltips.touhou_little_maid.tank_backpack.capacity": "容量:%d mB", + "tooltips.touhou_little_maid.tank_backpack.fluid": "%s:%dmB", + "tooltips.touhou_little_maid.tank_backpack.capacity": "容量:%dmB", "tooltips.touhou_little_maid.item_container.empty": "空", "tooltips.touhou_little_maid.broom.desc": "右击方块来放置扫帚", - "tooltips.touhou_little_maid.scarecrow.desc": "放置在地上,可以阻止女仆妖精在 %dx%d 方形范围内生成", + "tooltips.touhou_little_maid.scarecrow.desc": "放置在地上,可以阻止女仆妖精在%dx%d方形范围内生成", "tooltips.touhou_little_maid.servant_bell.uuid": "UUID:%s", "tooltips.touhou_little_maid.servant_bell.desc.1": "- 右击女仆进行绑定;", "tooltips.touhou_little_maid.servant_bell.desc.2": "- 绑定后,右击使用即可召回女仆。", - "tooltips.touhou_little_maid.monster_list.desc": "自 1.1.13 版本后移除此物品", + "tooltips.touhou_little_maid.monster_list.desc": "自1.1.13版本后移除此物品", "tooltips.touhou_little_maid.advancement_icon.desc": "仅用于进度图标显示的物品", - "tooltips.touhou_little_maid.entity_id_copy.desc": "用于复制实体 ID,方便填写女仆攻击列表", + "tooltips.touhou_little_maid.entity_id_copy.desc": "用于复制实体ID,方便填写女仆攻击列表", "overlay.touhou_little_maid.compass.tips": "右击可以显示女仆的任务区域", - "overlay.touhou_little_maid.golden_apple.tips": "手持金苹果可以使用 Shift 右击喂给女仆", - "overlay.touhou_little_maid.potion.tips": "手持药水可以使用 Shift 右击喂给女仆", - "overlay.touhou_little_maid.milk_bucket.tips": "手持奶桶可以使用 Shift 右击清除女仆的药水效果", + "overlay.touhou_little_maid.golden_apple.tips": "手持金苹果可以使用Shift右击喂给女仆", + "overlay.touhou_little_maid.potion.tips": "手持药水可以使用Shift右击喂给女仆", + "overlay.touhou_little_maid.milk_bucket.tips": "手持奶桶可以使用Shift右击清除女仆的药水效果", "overlay.touhou_little_maid.script_book.tips": "它可以向女仆写入聊天气泡文本", - "overlay.touhou_little_maid.glass_bottle.tips": "右击取出经验,Shift 右击全部取出", + "overlay.touhou_little_maid.glass_bottle.tips": "右击取出经验,Shift右击全部取出", "overlay.touhou_little_maid.name_tag.tips": "右击命名女仆", "overlay.touhou_little_maid.lead.tips": "右击拴住女仆", - "overlay.touhou_little_maid.debug_stick.tips": "改变女仆的主人 UUID", + "overlay.touhou_little_maid.debug_stick.tips": "改变女仆的主人UUID", "overlay.touhou_little_maid.ntr_item.tips": "将其他人的女仆转换成你自己的", "overlay.touhou_little_maid.remove_backpack.tips": "移除女仆的背包", "overlay.touhou_little_maid.saddle.tips": "右击将女仆抱在怀里", @@ -275,11 +306,11 @@ "gui.touhou_little_maid.skin.text.version": "版本:%s", "gui.touhou_little_maid.skin.text.date": "日期:%s", "gui.touhou_little_maid.skin.button.close": "关闭", - "gui.touhou_little_maid.skin.tooltips.show_details": "Shift 点击打开详情界面", + "gui.touhou_little_maid.skin.tooltips.show_details": "Shift点击打开详情界面", "gui.touhou_little_maid.skin.tooltips.maid_use_sound_pack_id": "使用声音包:%s", "gui.touhou_little_maid.skin.enable_cache": "图标缓存", - "gui.touhou_little_maid.button.home.true": "Home 模式已开启(不跟随玩家)", - "gui.touhou_little_maid.button.home.false": "Home 模式已关闭(跟随玩家)", + "gui.touhou_little_maid.button.home.true": "Home模式已开启(不跟随玩家)", + "gui.touhou_little_maid.button.home.false": "Home模式已关闭(跟随玩家)", "gui.touhou_little_maid.button.home.desc": "§7点击此按钮可以设置女仆是否跟随玩家", "gui.touhou_little_maid.button.pickup.true": "拾物模式已开启", "gui.touhou_little_maid.button.pickup.false": "拾物模式已关闭", @@ -305,7 +336,7 @@ "gui.touhou_little_maid.name_tag.edit_box": "命名牌文本框", "gui.touhou_little_maid.tag.always_show": "是否总是显示名称", "gui.touhou_little_maid.wireless_io.filter_mode": "切换过滤模式", - "gui.touhou_little_maid.wireless_io.io_mode": "切换 I/O 模式", + "gui.touhou_little_maid.wireless_io.io_mode": "切换I/O模式", "gui.touhou_little_maid.wireless_io.config_slot": "打开槽位设置", "gui.touhou_little_maid.custom_model_details_gui.title": "自定义模型详情界面", "gui.touhou_little_maid.skin_details.beg": "祈求状态", @@ -322,11 +353,11 @@ "gui.touhou_little_maid.skin_details.left_mouse": "鼠标左键:旋转", "gui.touhou_little_maid.skin_details.right_mouse": "鼠标右键:移动", "gui.touhou_little_maid.skin_details.mouse_wheel": "鼠标滚轮:缩放", - "gui.touhou_little_maid.maid_beacon.cost_power": "消耗 P 点:%s/h", + "gui.touhou_little_maid.maid_beacon.cost_power": "消耗P点:%s/小时", "gui.touhou_little_maid.maid_beacon.add_one": "存入一点", "gui.touhou_little_maid.maid_beacon.min_one": "取出一点", - "gui.touhou_little_maid.maid_beacon.overflow_delete_true": "删除溢出 P 点", - "gui.touhou_little_maid.maid_beacon.overflow_delete_false": "保留溢出 P 点", + "gui.touhou_little_maid.maid_beacon.overflow_delete_true": "删除溢出P点", + "gui.touhou_little_maid.maid_beacon.overflow_delete_false": "保留溢出P点", "gui.touhou_little_maid.resources_download.author": "作者:%s", "gui.touhou_little_maid.resources_download.author.delimiter": ",", "gui.touhou_little_maid.resources_download.file_size": "大小:%s", @@ -349,16 +380,16 @@ "gui.touhou_little_maid.resources_download.downloading": "下载中", "gui.touhou_little_maid.resources_download.need_update": "需更新", "gui.touhou_little_maid.resources_download.delete": "删除资源包", - "gui.touhou_little_maid.resources_download.delete.confirm": "你确定要删除此文件吗?", + "gui.touhou_little_maid.resources_download.delete.confirm": "你确定要删除此文件吗?", "gui.touhou_little_maid.resources_download.open_link": "打开作者的主页网站", "gui.touhou_little_maid.resources_download.open_folder": "打开资源包文件夹", "gui.touhou_little_maid.resources_download.search": "搜索……", "gui.touhou_little_maid.resources_download.hot_search": "热门搜索:", "gui.touhou_little_maid.resources_download.hot_search_key": "可莉、星、拉姆、爱丽丝、铃兰、纳希坦、芙莉莲、长门、伊蕾娜、柴郡、崩坏、奈亚子、Fate", "gui.touhou_little_maid.resources_download.need_reload.title": "§6§n需要重载", - "gui.touhou_little_maid.resources_download.need_reload.subtitle": "使用 §4§o/tlm pack reload§r 指令重载所有资源包!", - "gui.touhou_little_maid.resources_download.state.downloading": "正在下载 %s 文件……", - "gui.touhou_little_maid.resources_download.state.downloaded": "已成功下载 %s 文件,耗时 %.3f 秒", + "gui.touhou_little_maid.resources_download.need_reload.subtitle": "使用§4§o/tlm pack reload§r指令重载所有资源包!", + "gui.touhou_little_maid.resources_download.state.downloading": "正在下载%s文件……", + "gui.touhou_little_maid.resources_download.state.downloaded": "已成功下载%s文件,耗时%.3f秒", "gui.touhou_little_maid.model_gui.easter_egg.encrypt": "这是一个加密的命名彩蛋", "gui.touhou_little_maid.model_gui.easter_egg.normal": "这是一个普通的命名彩蛋", "gui.touhou_little_maid.maid_config.sound_frequency": "女仆声音频率", @@ -368,6 +399,7 @@ "gui.touhou_little_maid.maid_config.pick_type": "拾取类型", "gui.touhou_little_maid.maid_config.open_door": "能否开门", "gui.touhou_little_maid.maid_config.open_fence_gate": "能否开栅栏门", + "gui.touhou_little_maid.maid_config.active_climbing": "能否主动爬梯", "gui.touhou_little_maid.maid_config.value.true": "开启", "gui.touhou_little_maid.maid_config.value.false": "关闭", "gui.touhou_little_maid.maid_config.value.item": "物品", @@ -383,16 +415,16 @@ "gui.touhou_little_maid.custom_sound.pack.apply": "应用此声音包", "gui.touhou_little_maid.custom_sound.sounds.preview": "§l§n声音预览", "gui.touhou_little_maid.fox_scroll.position": "位置:[%s]", - "gui.touhou_little_maid.fox_scroll.distance.same_dimension": "距离:%d 米", + "gui.touhou_little_maid.fox_scroll.distance.same_dimension": "距离:%d米", "gui.touhou_little_maid.fox_scroll.distance.different_dimension": "距离:???米", "gui.touhou_little_maid.fox_scroll.track": "追踪", "gui.touhou_little_maid.fox_scroll.empty": "没有任何女仆坐标", - "gui.touhou_little_maid.optifine_warning.title": "车万女仆 Optifine 警告", - "gui.touhou_little_maid.optifine_warning.text": "在你点击继续按钮之前,请注意:Optifine 目前很容易导致游戏崩溃、实体渲染错误和许多其他问题。\n\n在反馈错误之前,请先删除 Optifine,然后再次检查错误是否仍然存在。\n\nOptifine 相关问题在女仆模组这边可能永远无法解决!\n\n推荐你使用 Oculus 和 Embeddium 模组作为 Optifine 的替代品。", - "gui.touhou_little_maid.optifine_warning.embeddium": "下载 Embeddium 模组", - "gui.touhou_little_maid.optifine_warning.oculus": "下载 Oculus 模组", - "gui.touhou_little_maid.cloth_config_warning.tips": "你需要安装 Cloth Config API 模组才能使用游戏内配置功能", - "gui.touhou_little_maid.cloth_config_warning.download": "下载 Cloth Config API 模组", + "gui.touhou_little_maid.optifine_warning.title": "车万女仆Optifine警告", + "gui.touhou_little_maid.optifine_warning.text": "在你点击继续按钮之前,请注意:Optifine目前很容易导致游戏崩溃、实体渲染错误和许多其他问题。\n\n在反馈错误之前,请先删除Optifine,然后再次检查错误是否仍然存在。\n\nOptifine相关问题在女仆模组这边可能永远无法解决!\n\n推荐你使用Oculus和Embeddium模组作为Optifine的替代品。", + "gui.touhou_little_maid.optifine_warning.embeddium": "下载Embeddium模组", + "gui.touhou_little_maid.optifine_warning.oculus": "下载Oculus模组", + "gui.touhou_little_maid.cloth_config_warning.tips": "你需要安装Cloth Config API模组才能使用游戏内配置功能", + "gui.touhou_little_maid.cloth_config_warning.download": "下载Cloth Config API模组", "gui.touhou_little_maid.patchouli_warning.tips": "你需要下载帕秋莉手册才可以启用跳转到手册对应章节功能", "gui.touhou_little_maid.patchouli_warning.download": "下载帕秋莉手册模组", "gui.touhou_little_maid.servant_bell.edit_box": "请输入提示文本", @@ -411,28 +443,29 @@ "message.touhou_little_maid.missing_patchouli.title": "[车万女仆]", "message.touhou_little_maid.missing_patchouli.click_here": "点击这里安装帕秋莉手册模组来获取手册", "message.touhou_little_maid.missing_patchouli.url": "https://www.curseforge.com/minecraft/mc-mods/patchouli", + "message.touhou_little_maid.reload.tip": "[TLM] 模型加载耗时:%.2f ms", "message.touhou_little_maid.change_model.disabled": "模型切换功能已禁用", "message.touhou_little_maid.extinguisher.player_cannot_use": "你匮乏的知识并不了解这物品该如何使用", - "message.touhou_little_maid.altar.not_enough_power": "你没有足够多的 P 点", + "message.touhou_little_maid.altar.not_enough_power": "你没有足够多的P点", "message.touhou_little_maid.owner_maid_num.can_not_add": "你无法再驯服女仆,你已经达到了上限(%d/%d)", "message.touhou_little_maid.photo.not_suitable_for_place_maid": "这该死的地方不能放置女仆", - "message.touhou_little_maid.photo.have_no_nbt_data": "这该死的照片没有 NBT 数据", + "message.touhou_little_maid.photo.have_no_nbt_data": "这该死的照片没有NBT数据", "message.touhou_little_maid.chisel.hit_block_error": "请右击黏土块", "message.touhou_little_maid.chisel.offhand_not_photo": "请将女仆照片拿在副手", "message.touhou_little_maid.gomoku.win": "玩家获胜", "message.touhou_little_maid.gomoku.lose": "玩家失败", "message.touhou_little_maid.gomoku.reset": "右击棋盒进行重置", "message.touhou_little_maid.gomoku.round": "回合:%d", - "message.touhou_little_maid.gomoku.no_maid": "没有女仆来参与五子棋游戏", + "message.touhou_little_maid.gomoku.no_maid": "没有女仆来参与游戏", "message.touhou_little_maid.gomoku.not_owner": "参与游戏的女仆不是你的", "message.touhou_little_maid.gomoku.rank_up.title": "§6§n恭喜", "message.touhou_little_maid.gomoku.rank_up.subtitle": "你的女仆五子棋棋技提升了!", - "message.touhou_little_maid.trumpet.unloaded_maid": "在卸载区块上还有 %d 个女仆,请使用红狐狸卷轴来寻找她们!", + "message.touhou_little_maid.trumpet.unloaded_maid": "在卸载区块上还有%d个女仆,请使用红狐狸卷轴来寻找她们!", "message.touhou_little_maid.shrine.not_film": "只有胶片可以放入神龛中!", - "message.touhou_little_maid.shrine.health_low": "玩家血量过低!", + "message.touhou_little_maid.shrine.health_low": "玩家的生命值过低!", "message.touhou_little_maid.kappa_compass.clear": "所有的坐标已经清除", - "message.touhou_little_maid.kappa_compass.full": "坐标已满,请 Shift 右击进行清除", - "message.touhou_little_maid.kappa_compass.far_away": "距离前一个坐标过远,最大只能为 64", + "message.touhou_little_maid.kappa_compass.full": "坐标已满,请Shift右击进行清除", + "message.touhou_little_maid.kappa_compass.far_away": "距离前一个坐标过远,最大只能为64", "message.touhou_little_maid.kappa_compass.maid_write": "成功为女仆写入坐标", "message.touhou_little_maid.kappa_compass.maid_clear": "成功清除女仆的坐标", "message.touhou_little_maid.kappa_compass.maid_dimension_check": "记录的维度与当前女仆所处的维度不相同", @@ -444,20 +477,20 @@ "message.touhou_little_maid.kappa_compass.idle_area": "休息区域", "message.touhou_little_maid.kappa_compass.sleep_area": "睡觉区域", "message.touhou_little_maid.kappa_compass.usage.set_pos": "§6- §b右击方块设置坐标", - "message.touhou_little_maid.kappa_compass.usage.clear_pos": "§6- §bShift 右击方块清除坐标", + "message.touhou_little_maid.kappa_compass.usage.clear_pos": "§6- §bShift右击方块清除坐标", "message.touhou_little_maid.kappa_compass.usage.write_pos_to_maid": "§d- §2右击女仆写入坐标", - "message.touhou_little_maid.kappa_compass.usage.clear_maid_pos": "§d- §2Shift 右击女仆清除坐标", - "message.touhou_little_maid.check_schedule_pos.too_far": "§c§l距离记录的坐标过远\n\n§6§n请使用河童的罗盘 Shift 右击女仆来清除记录的坐标", - "message.touhou_little_maid.check_schedule_pos.dimension": "§c§l记录的维度与女仆当前所处维度不一致\n\n§6§n请使用河童的罗盘 Shift 右击女仆来清除记录的坐标", + "message.touhou_little_maid.kappa_compass.usage.clear_maid_pos": "§d- §2Shift右击女仆清除坐标", + "message.touhou_little_maid.check_schedule_pos.too_far": "§c§l距离记录的坐标过远\n\n§6§n请使用河童的罗盘Shift右击女仆来清除记录的坐标", + "message.touhou_little_maid.check_schedule_pos.dimension": "§c§l记录的维度与女仆当前所处维度不一致\n\n§6§n请使用河童的罗盘Shift右击女仆来清除记录的坐标", "message.touhou_little_maid.script_book.remove": "成功清除女仆的聊天气泡台本", "message.touhou_little_maid.script_book.install": "成功写入女仆的聊天气泡台本", "message.touhou_little_maid.script_book.copy": "成功复制女仆的聊天气泡台本", "message.touhou_little_maid.broom.unable_fly": "你需要一个女仆也坐在扫帚上才能使用它", "message.touhou_little_maid.saddle.how_to_eject": "使用鞍再次右击即可放下女仆", - "message.touhou_little_maid.tombstone.not_yours.1": "这个女仆墓碑不是你的!如果你是服务器管理员,请使用 NTR 物品来移除它", - "message.touhou_little_maid.tombstone.not_yours.2": "当前 NTR 物品:", + "message.touhou_little_maid.tombstone.not_yours.1": "这个女仆墓碑不是你的!如果你是服务器管理员,请使用NTR物品来移除它", + "message.touhou_little_maid.tombstone.not_yours.2": "当前NTR物品:", "message.touhou_little_maid.servant_bell.show_pos": "女仆在卸载区块上,请遵循坐标指引来找到她", - "message.touhou_little_maid.servant_bell.not_same_dimension": "女仆和你不在同一维度,女仆在 %s 维度", + "message.touhou_little_maid.servant_bell.not_same_dimension": "女仆和你不在同一维度,女仆在%s维度", "message.touhou_little_maid.servant_bell.no_result": "找不到女仆", "message.touhou_little_maid.servant_bell.data_is_empty": "这上面没有任何数据", "message.touhou_little_maid.cchess.check": "将军", @@ -466,13 +499,13 @@ "message.touhou_little_maid.cchess.reset": "右击棋盘右侧黑色区域重置", "message.touhou_little_maid.wchess.move_limit": "五十回合限制!", "message.touhou_little_maid.wchess.reset": "右击任意一侧的淡黄色区域进行重置", - "message.touhou_little_maid.entity_id_copy.copy": "该实体 ID 已经被复制:%s", - "commands.touhou_little_maid.pack.reload.info": "所有的模型包已经重载!", - "commands.touhou_little_maid.power.handle.info": "修改了 %d 位玩家的 P 点", - "commands.touhou_little_maid.maid_num.handle.info": "修改了 %d 位玩家的女仆数量", - "commands.touhou_little_maid.power.get.info": "%s: %.2f", - "commands.touhou_little_maid.maid_num.get.info": "%s: %d", - "argument.touhou_little_maid.handle_type.invalid": "不合法的 Handle 类型", + "message.touhou_little_maid.entity_id_copy.copy": "该实体ID已经被复制:%s", + "commands.touhou_little_maid.pack.reload.start": "所有的模型开始重载", + "commands.touhou_little_maid.power.handle.info": "修改了%d位玩家的P点", + "commands.touhou_little_maid.maid_num.handle.info": "修改了%d位玩家的女仆数量", + "commands.touhou_little_maid.power.get.info": "%s:%.2f", + "commands.touhou_little_maid.maid_num.get.info": "%s:%d", + "argument.touhou_little_maid.handle_type.invalid": "不合法的Handle类型", "death.attack.touhou_little_maid.danmaku": "%1$s被%2$s的弹幕打得满身疮痍", "config.touhou_little_maid.maid": "女仆", "config.touhou_little_maid.maid.maid_tamed_item": "驯服女仆的物品", @@ -489,6 +522,14 @@ "config.touhou_little_maid.maid.maid_sleep_range.tooltip": "女仆处于睡觉模式时的最大范围", "config.touhou_little_maid.maid.maid_non_home_range": "女仆跟随范围", "config.touhou_little_maid.maid.maid_non_home_range.tooltip": "当女仆处于跟随情况下时的活动范围", + "config.touhou_little_maid.maid.bow_range": "女仆弓箭范围", + "config.touhou_little_maid.maid.bow_range.tooltip": "女仆在弓箭模式下的最大攻击范围", + "config.touhou_little_maid.maid.cross_bow_range": "女仆弩箭范围", + "config.touhou_little_maid.maid.cross_bow_range.tooltip": "女仆在弩箭模式下的最大攻击范围", + "config.touhou_little_maid.maid.danmaku_range": "女仆弹幕范围", + "config.touhou_little_maid.maid.danmaku_range.tooltip": "女仆在弹幕模式下的最大攻击范围", + "config.touhou_little_maid.maid.trident_range": "女仆三叉戟范围", + "config.touhou_little_maid.maid.trident_range.tooltip": "女仆在三叉戟模式下的最大攻击范围", "config.touhou_little_maid.maid.feed_animal_max_number": "繁殖动物的最大数量", "config.touhou_little_maid.maid.feed_animal_max_number.tooltip": "女仆处于繁殖动物模式时,周围最大可以繁殖的动物数量", "config.touhou_little_maid.maid.maid_change_model": "女仆能否切换模型", @@ -525,28 +566,28 @@ "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone": "坐垫可破坏", "config.touhou_little_maid.chair.chair_can_destroyed_by_anyone.tooltip": "坐垫可以被任意玩家破坏", "config.touhou_little_maid.misc": "杂项", - "config.touhou_little_maid.misc.maid_fairy_power_point": "女仆妖精 P 点数", - "config.touhou_little_maid.misc.maid_fairy_power_point.tooltip": "设定女仆妖精的 P 点数", + "config.touhou_little_maid.misc.maid_fairy_power_point": "女仆妖精P点数", + "config.touhou_little_maid.misc.maid_fairy_power_point.tooltip": "设定女仆妖精的P点数", "config.touhou_little_maid.misc.maid_fairy_spawn_probability": "女仆妖精生成权重", - "config.touhou_little_maid.misc.maid_fairy_spawn_probability.tooltip": "女仆妖精生成权重(僵尸是 100,末影人为 10)", + "config.touhou_little_maid.misc.maid_fairy_spawn_probability.tooltip": "女仆妖精生成权重(僵尸是100,末影人为10)", "config.touhou_little_maid.misc.maid_fairy_blacklist_biome": "女仆妖精黑名单生物群系", "config.touhou_little_maid.misc.maid_fairy_blacklist_biome.tooltip": "以下生物群系不会生成女仆妖精", "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension": "女仆妖精黑名单维度", "config.touhou_little_maid.misc.maid_fairy_blacklist_dimension.tooltip": "以下维度不会生成女仆妖精", - "config.touhou_little_maid.misc.player_death_loss_power_point": "玩家死亡后损失 P 点", - "config.touhou_little_maid.misc.player_death_loss_power_point.tooltip": "在玩家死亡后会损失的 P 点,设置为 5 表示全部损失", + "config.touhou_little_maid.misc.player_death_loss_power_point": "玩家死亡后损失P点", + "config.touhou_little_maid.misc.player_death_loss_power_point.tooltip": "在玩家死亡后会损失的P点,设置为5表示全部损失", "config.touhou_little_maid.misc.give_smart_slab": "是否给予魂符", "config.touhou_little_maid.misc.give_smart_slab.tooltip": "当玩家首次加入游戏时,是否给予玩家一个魂符", "config.touhou_little_maid.misc.give_patchouli_book": "是否给予帕秋莉手册", - "config.touhou_little_maid.misc.give_patchouli_book.tooltip": "当玩家首次进入游戏时候,给予一本“记忆中的幻想乡”手册", + "config.touhou_little_maid.misc.give_patchouli_book.tooltip": "当玩家首次进入游戏时候,给予一本《记忆中的幻想乡》手册", "config.touhou_little_maid.misc.shrine_lamp_effect_cost": "庭灯效果的损耗", - "config.touhou_little_maid.misc.shrine_lamp_effect_cost.tooltip": "神社庭灯施加女仆效果时,P 点损耗情况(P 点/小时)", + "config.touhou_little_maid.misc.shrine_lamp_effect_cost.tooltip": "神社庭灯施加女仆效果时,P点损耗情况(P点/小时)", "config.touhou_little_maid.misc.shrine_lamp_max_storage": "庭灯最大储量", - "config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip": "神社庭灯的最大 P 点储量", + "config.touhou_little_maid.misc.shrine_lamp_max_storage.tooltip": "神社庭灯的最大P点储量", "config.touhou_little_maid.misc.shrine_lamp_max_range": "庭灯最大范围", - "config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip": "神社庭灯能够吸收多大范围内的 P 点", - "config.touhou_little_maid.misc.close_optifine_warning": "关闭 Optifine 警告", - "config.touhou_little_maid.misc.close_optifine_warning.tooltip": "是否关闭 Optifine 警告", + "config.touhou_little_maid.misc.shrine_lamp_max_range.tooltip": "神社庭灯能够吸收多大范围内的P点", + "config.touhou_little_maid.misc.close_optifine_warning": "关闭Optifine警告", + "config.touhou_little_maid.misc.close_optifine_warning.tooltip": "是否关闭Optifine警告", "config.touhou_little_maid.misc.scarecrow_range": "麻石狐像范围", "config.touhou_little_maid.misc.scarecrow_range.tooltip": "麻石狐像阻止女仆妖精生成的范围", "config.touhou_little_maid.misc.use_new_maid_fairy_model": "使用新版女仆妖精模型", @@ -554,17 +595,18 @@ "config.touhou_little_maid.vanilla": "原版设置", "config.touhou_little_maid.vanilla.replace_slime_model": "替换史莱姆模型", "config.touhou_little_maid.vanilla.replace_slime_model.tooltip": "将史莱姆模型替换为油库里", - "config.touhou_little_maid.vanilla.replace_xp_texture": "替换经验球材质", - "config.touhou_little_maid.vanilla.replace_xp_texture.tooltip": "将原版经验球材质替换为得分道具", - "config.touhou_little_maid.vanilla.replace_totem_texture": "替换不死图腾材质", - "config.touhou_little_maid.vanilla.replace_totem_texture.tooltip": "将不死图腾材质替换为命点", - "config.touhou_little_maid.vanilla.replace_xp_bottle_texture": "替换附魔之瓶材质", - "config.touhou_little_maid.vanilla.replace_xp_bottle_texture.tooltip": "将附魔之瓶材质替换为得分道具", + "config.touhou_little_maid.vanilla.replace_xp_texture": "替换经验球纹理", + "config.touhou_little_maid.vanilla.replace_xp_texture.tooltip": "将原版经验球纹理替换为得分道具", + "config.touhou_little_maid.vanilla.replace_totem_texture": "替换不死图腾纹理", + "config.touhou_little_maid.vanilla.replace_totem_texture.tooltip": "将不死图腾纹理替换为命点", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture": "替换附魔之瓶纹理", + "config.touhou_little_maid.vanilla.replace_xp_bottle_texture.tooltip": "将附魔之瓶纹理替换为得分道具", "task.touhou_little_maid.idle": "空闲", "task.touhou_little_maid.attack": "攻击", "task.touhou_little_maid.ranged_attack": "弓兵", "task.touhou_little_maid.crossbow_attack": "弩兵", "task.touhou_little_maid.danmaku_attack": "弹幕攻击", + "task.touhou_little_maid.trident_attack": "三叉戟攻击", "task.touhou_little_maid.farm": "农场", "task.touhou_little_maid.sugar_cane": "甘蔗", "task.touhou_little_maid.melon": "瓜类", @@ -596,16 +638,18 @@ "task.touhou_little_maid.crossbow_attack.condition.has_ammunition": "背包内有箭或者副手有烟花", "task.touhou_little_maid.danmaku_attack.desc": "女仆会主动用弹幕攻击周围的敌对生物", "task.touhou_little_maid.danmaku_attack.condition.has_gohei": "主手持有博丽的御币", + "task.touhou_little_maid.trident_attack.desc": "女仆会主动用三叉戟攻击周围的敌对生物", + "task.touhou_little_maid.trident_attack.condition.has_trident": "主手持有三叉戟", "task.touhou_little_maid.farm.desc": "女仆会主动种植、收获周围的普通作物", "task.touhou_little_maid.sugar_cane.desc": "女仆会主动种植、收获周围的甘蔗", "task.touhou_little_maid.melon.desc": "女仆会主动收获周围的瓜类", - "task.touhou_little_maid.melon.condition.has_silk_touch": "主手持有带有精准采集附魔的工具时,能够精准采集西瓜", + "task.touhou_little_maid.melon.condition.has_silk_touch": "主手持有带有精准采集魔咒的工具时,能够精准采集西瓜", "task.touhou_little_maid.cocoa.desc": "女仆会主动种植、收获周围的可可", "task.touhou_little_maid.honey.desc": "女仆将会从周围的蜂箱中收集蜂蜜", "task.touhou_little_maid.honey.condition.has_bottle": "主手持有剪刀(用以收集蜜脾)", "task.touhou_little_maid.honey.condition.has_shears": "背包内有玻璃瓶(用以收集蜂蜜)", "task.touhou_little_maid.grass.desc": "女仆会主动清理周围的花草", - "task.touhou_little_maid.snow.desc": "女仆会主动清理周围的雪,持有铲子会掉落雪球", + "task.touhou_little_maid.snow.desc": "女仆会主动清理周围的雪,持有锹会掉落雪球", "task.touhou_little_maid.feed.desc": "女仆会主动投喂周围饥饿的主人", "task.touhou_little_maid.shears.desc": "女仆会主动“剪”周围的生物", "task.touhou_little_maid.milk.desc": "女仆会主动用铁桶收集周围牛的奶", @@ -627,6 +671,7 @@ "button.touhou_little_maid.maid.mode.attack": "攻击", "button.touhou_little_maid.maid.mode.range_attack": "范围攻击", "button.touhou_little_maid.maid.mode.danmaku_attack": "弹幕攻击", + "button.touhou_little_maid.maid.mode.trident_attack": "三叉戟攻击", "button.touhou_little_maid.maid.mode.farm": "农场", "button.touhou_little_maid.maid.mode.feed": "喂养", "button.touhou_little_maid.maid.mode.shears": "剪刀", @@ -659,6 +704,7 @@ "subtitle.touhou_little_maid.maid.mode.attack": "女仆:攻击", "subtitle.touhou_little_maid.maid.mode.range_attack": "女仆:范围攻击", "subtitle.touhou_little_maid.maid.mode.danmaku_attack": "女仆:弹幕攻击", + "subtitle.touhou_little_maid.maid.mode.trident_attack": "女仆:三叉戟攻击", "subtitle.touhou_little_maid.maid.mode.farm": "女仆:农场", "subtitle.touhou_little_maid.maid.mode.feed": "女仆:喂养", "subtitle.touhou_little_maid.maid.mode.shears": "女仆:剪刀", @@ -703,18 +749,18 @@ "jei.touhou_little_maid.altar_craft.spawn_box.result": "生成新的女仆", "jei.touhou_little_maid.altar_craft.spawn_lightning_bolt.result": "生成闪电", "jei.touhou_little_maid.altar_craft.reborn_maid.result": "从胶片中复活女仆", - "jei.touhou_little_maid.garage_kit.info": "火烤 1x1 大小的雕像可以转换成它", + "jei.touhou_little_maid.garage_kit.info": "火烤1x1大小的雕像可以转换成它", "top.touhou_little_maid.entity_maid.task": "模式:", "top.touhou_little_maid.entity_maid.invulnerable": "无敌", "top.touhou_little_maid.entity_maid.schedule": "日程表:", "top.touhou_little_maid.entity_maid.favorability": "好感度等级:%d", - "top.touhou_little_maid.entity_maid.nex_favorability_point": "还需要 %d 点来升级", - "domesticationinnovation.touhou_little_maid.enchantment.undead_curse": "§4来世诅咒附魔无法用于女仆!", - "domesticationinnovation.touhou_little_maid.enchantment.blazing_protection": "§4烈焰保护附魔无法用于女仆!", + "top.touhou_little_maid.entity_maid.nex_favorability_point": "还需要%d点来升级", + "domesticationinnovation.touhou_little_maid.enchantment.undead_curse": "§4来世诅咒魔咒无法用于女仆!", + "domesticationinnovation.touhou_little_maid.enchantment.blazing_protection": "§4烈焰保护魔咒无法用于女仆!", "config.jade.plugin_touhou_little_maid.maid": "显示女仆额外信息", "config.jade.plugin_touhou_little_maid.shrine_lamp": "显示神社庭灯额外信息", "patchouli.touhou_little_maid.book.name": "记忆中的幻想乡", - "patchouli.touhou_little_maid.book.landing_text": "一个与女仆和东方 Project 有关的模组。$(br2)感谢雪尼在代码方面的帮助。$(br)感谢琥珀酸、帕金伊、天顶乌、天幂、Paulzzh、尤里的猫以及其他美工制作了如此优秀的模型和材质。$(br)感谢 Little Maid Mob 的作者 Verclene。", + "patchouli.touhou_little_maid.book.landing_text": "一个与女仆和东方Project有关的模组。$(br2)感谢雪尼在代码方面的帮助。$(br)感谢琥珀酸、帕金伊、天顶乌、天幂、Paulzzh、尤里的猫以及其他美工制作了如此优秀的模型和纹理。$(br)感谢Little Maid Mob的作者Verclene。", "patchouli.touhou_little_maid.book.categories.maid.name": "女仆概览", "patchouli.touhou_little_maid.book.categories.maid.description": "介绍女仆的基本内容", "patchouli.touhou_little_maid.book.categories.other.name": "其他内容", @@ -725,10 +771,10 @@ "patchouli.touhou_little_maid.book.entries.maid.backpack.pages.0.text": "背包能够拓展女仆的物品栏。只需要手持背包右击女仆即可装备上对应的背包。背包拥有三种不同等级。$(br2)使用剪刀来移除女仆的背包。", "patchouli.touhou_little_maid.book.entries.maid.backpack.pages.1.text": "装备了小背包的女仆", "patchouli.touhou_little_maid.book.entries.maid.item_magnet.name": "物品磁铁", - "patchouli.touhou_little_maid.book.entries.maid.item_magnet.pages.0.text": "能够拓展拾取范围的饰品$(br2)装备上此饰品后,女仆拾取物品、箭、经验球、P 点的范围将大大增加", + "patchouli.touhou_little_maid.book.entries.maid.item_magnet.pages.0.text": "能够拓展拾取范围的饰品$(br2)装备上此饰品后,女仆拾取物品、箭、经验球、P点的范围将大大增加", "patchouli.touhou_little_maid.book.entries.maid.maid_base.name": "女仆基础", - "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.0.text": "女仆拥有许许多多的基本行为,比如:$(li)默认情况下女仆会主动拾取周围的物品、箭、经验球和 P 点,女仆的主界面有按钮可以切换拾物模式;$(li)默认情况下,女仆总是跟随着玩家。", - "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.1.text": "$(li)Shift 空手右击女仆能够切换待命模式。待命模式下的女仆什么也不会做,哪怕是规避风险。$(li)当女仆骑在其他实体上时,只需要 Shift 右击就可以把她们弄下来。$(li)玩家可以 Shift 右击女仆来对其使用金苹果或药水这样的物品。", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.0.text": "女仆拥有许许多多的基本行为,比如:$(li)默认情况下女仆会主动拾取周围的物品、箭、经验球和P点,女仆的主界面有按钮可以切换拾物模式;$(li)默认情况下,女仆总是跟随着玩家。", + "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.1.text": "$(li)Shift空手右击女仆能够切换待命模式。待命模式下的女仆什么也不会做,哪怕是规避风险。$(li)当女仆骑在其他实体上时,只需要Shift右击就可以把她们弄下来。$(li)玩家可以Shift右击女仆来对其使用金苹果或药水这样的物品。", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.2.text": "$(li)当玩家手持玻璃瓶右击女仆时,女仆先前拾取的经验会转换成附魔之瓶。$(li)女仆能够装备并渲染头颅。$(li)用空白的命名牌右击女仆,能够直接命名。$(li)当女仆手持动物的吸引物时,能够吸引周围的动物。", "patchouli.touhou_little_maid.book.entries.maid.maid_base.pages.3.text": "$(li)使用鞍右击女仆将其抱在怀里。$(li)苦力怕会躲避女仆。", "patchouli.touhou_little_maid.book.entries.maid.maid_bauble.name": "女仆饰品", @@ -743,25 +789,25 @@ "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.0.text": "你可以制作自定义的声音资源包来替换或者拓展女仆的音效。", "patchouli.touhou_little_maid.book.entries.maid.maid_sound.pages.1.text": "点击图中按钮打开女仆声音切换界面。", "patchouli.touhou_little_maid.book.entries.maid.maid_task.name": "女仆工作模式", - "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.0.text": "当你打开女仆的 GUI 时,你可以找到切换工作模式的按钮,点击即可切换女仆的工作模式。$(br2)你还可以点击日程表按钮来切换女仆的日程,让其在不同的时间工作、休息或者睡觉", + "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.0.text": "当你打开女仆的GUI时,你可以找到切换工作模式的按钮,点击即可切换女仆的工作模式。$(br2)你还可以点击日程表按钮来切换女仆的日程,让其在不同的时间工作、休息或者睡觉", "patchouli.touhou_little_maid.book.entries.maid.maid_task.pages.1.text": "点击图中右下角按钮切换图片", "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.name": "禁言饰品", "patchouli.touhou_little_maid.book.entries.maid.mute_bauble.pages.0.text": "装备上此饰品后,女仆会变得十分安静。", "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.name": "命名彩蛋", - "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.0.text": "特殊命名的女仆能够显示特殊模型,默认情况下,使用 $(#ff0000)=>玩家ID$() 命名的女仆能变成该 ID 对应的玩家皮肤模型。$(br2)女仆资源包也可以添加自定义的模型彩蛋,甚至是 SHA1 加密过的模型彩蛋。", - "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.1.text": "命名为 $(#ff0000)=>Notch$() 的女仆模型。", + "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.0.text": "特殊命名的女仆能够显示特殊模型,默认情况下,使用$(#ff0000)=>玩家ID$()命名的女仆能变成该ID对应的玩家皮肤模型。$(br2)女仆资源包也可以添加自定义的模型彩蛋,甚至是SHA1加密过的模型彩蛋。", + "patchouli.touhou_little_maid.book.entries.maid.naming_eggs.pages.1.text": "命名为$(#ff0000)=>Notch$()的女仆模型。", "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.name": "生成女仆", - "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.0.text": "获取女仆的方式非常特殊,而且必须通过多方块祭坛才能获取。$(br2)因为合成表很有可能会在后续发生改变,所以请查询 JEI 的祭坛标签。$(br2)当在多方块祭坛中成功生成女仆后,你将会得到一个包装着女仆的蛋糕盒。", - "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.1.text": "蛋糕盒右击即可打开,你需要右击三次触发不同的打开阶段,最后蛋糕盒会消失。$(br2)你需要一块蛋糕才能驯服女仆。驯服的物品可在配置文件中进行更改,此处不再累述。$(br2)驯服的女仆和原版宠物行为几乎一致,你可以右击打开她的 GUI。", + "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.0.text": "获取女仆的方式非常特殊,而且必须通过多方块祭坛才能获取。$(br2)因为合成表很有可能会在后续发生改变,所以请查询JEI的祭坛标签。$(br2)当在多方块祭坛中成功生成女仆后,你将会得到一个包装着女仆的蛋糕盒。", + "patchouli.touhou_little_maid.book.entries.maid.spawn_maid.pages.1.text": "蛋糕盒右击即可打开,你需要右击三次触发不同的打开阶段,最后蛋糕盒会消失。$(br2)你需要一块蛋糕才能驯服女仆。驯服的物品可在配置文件中进行更改,此处不再累述。$(br2)驯服的女仆和原版宠物行为几乎一致,你可以右击打开她的GUI。", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.name": "替身地藏", "patchouli.touhou_little_maid.book.entries.maid.substitute_jizo.pages.0.text": "替身地藏是一个创造模式物品,右击女仆可将其切换为无敌模式。", - "patchouli.touhou_little_maid.book.entries.maid.maid_home.name": "女仆 Home", - "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.0.text": "当 Home 模式按钮被点击时,女仆会记录当前坐标,并在 12 格范围内移动。(可在配置文件中设置范围)", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.name": "女仆Home", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.0.text": "当Home模式按钮被点击时,女仆会记录当前坐标,并在12格范围内移动。(可在配置文件中设置范围)", "patchouli.touhou_little_maid.book.entries.maid.film.name": "胶片", "patchouli.touhou_little_maid.book.entries.maid.film.pages.0.text": "女仆会在死后掉落胶片,胶片可在祭坛中合成来复活女仆。$(br2)胶片不会被火焰或熔岩烧毁。", "patchouli.touhou_little_maid.book.entries.maid.gap.name": "隙间", - "patchouli.touhou_little_maid.book.entries.maid.gap.pages.0.text": "一个能够传输物品的饰品。$(br2)你可以手持隙间右击箱子进行标记,而后打开它的 GUI 进行各种设置,最后将其放置在女仆的饰品栏中。$(br2)这之后,女仆就能从箱子中“无线”的取出/存入物品。", - "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.1.text": "你可以使用指南针来看到女仆的 Home 坐标", + "patchouli.touhou_little_maid.book.entries.maid.gap.pages.0.text": "一个能够传输物品的饰品。$(br2)你可以手持隙间右击箱子进行标记,而后打开它的GUI进行各种设置,最后将其放置在女仆的饰品栏中。$(br2)这之后,女仆就能从箱子中“无线”的取出/存入物品。", + "patchouli.touhou_little_maid.book.entries.maid.maid_home.pages.1.text": "你可以使用指南针来看到女仆的Home坐标", "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.name": "打雪仗", "patchouli.touhou_little_maid.book.entries.maid.snowball_fight.pages.0.text": "当女仆在雪地中,并且处于空闲模式时,女仆就会朝玩家或者其他女仆丢雪球。", "patchouli.touhou_little_maid.book.entries.maid.chat_bubbles.name": "聊天气泡", @@ -770,42 +816,42 @@ "patchouli.touhou_little_maid.book.entries.maid.other_backpack.pages.0.text": "有些背包拥有其他功能,例如工作台背包、熔炉背包和末影箱背包", "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.name": "女仆任务范围", "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.0.text": "河童的罗盘是一个能够划分女仆任务区域的工具,你可以通过它设定女仆工作、休息和睡觉的地点。", - "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.1.text": "首先你需要右击方块标记坐标,然后右击女仆即可写入坐标。$(br2)当女仆 Home 模式开启时,就会在上述划定的区域内工作。", + "patchouli.touhou_little_maid.book.entries.maid.kappa_compass.pages.1.text": "首先你需要右击方块标记坐标,然后右击女仆即可写入坐标。$(br2)当女仆Home模式开启时,就会在上述划定的区域内工作。", "patchouli.touhou_little_maid.book.entries.maid.last_slot.name": "特殊的最后一格", "patchouli.touhou_little_maid.book.entries.maid.last_slot.pages.0.text": "女仆背包最上方一栏的最后一格会有特殊显示效果:$(li)旗帜:女仆背上显示对应旗帜$(li)武器:女仆背上显示对应武器$(li)植物:女仆头顶显示对应植物", "patchouli.touhou_little_maid.book.entries.maid.last_slot.pages.1.text": "旗帜的显示效果", "patchouli.touhou_little_maid.book.entries.maid.maid_meal.name": "女仆用餐", - "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.0.text": "女仆在工作或者受伤时可以进食,从而提升好感度或者恢复血量。$(br2)请给她们的主手或副手放上食物!", + "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.0.text": "女仆在工作或者受伤时可以进食,从而提升好感度或者恢复生命值。$(br2)请给她们的主手或副手放上食物!", "patchouli.touhou_little_maid.book.entries.maid.maid_meal.pages.1.text": "女仆在空闲日程时,会寻找周围的野餐垫进食,这会大幅度提升她们的好感度。$(br2)请给她们放上美味的大餐吧!", "patchouli.touhou_little_maid.book.entries.maid.servant_bell.name": "仆人铃", "patchouli.touhou_little_maid.book.entries.maid.servant_bell.pages.0.text": "仆人铃可以一对一的召唤回女仆,如果女仆在卸载区块上,它也能提示你女仆所处的位置。$(br2)手持此物品右击女仆即可进行绑定!", "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.name": "雕刻刀与雕像", - "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.0.text": "雕刻刀右击黏土可以做成不同尺寸大小的雕像,目前支持 1x1x1、1x1x2、2x2x4、3x3x6 大小尺寸。", + "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.0.text": "雕刻刀右击黏土可以做成不同尺寸大小的雕像,目前支持1x1x1、1x1x2、2x2x4、3x3x6大小尺寸。", "patchouli.touhou_little_maid.book.entries.other.chisel_and_statues.pages.1.text": "玩家副手持有女仆照片,主手持有雕刻刀,右击多方块结构的左下角,即可雕刻出照片中的女仆。", "patchouli.touhou_little_maid.book.entries.other.garage_kit.name": "手办", - "patchouli.touhou_little_maid.book.entries.other.garage_kit.pages.0.text": "火烤 1x1 大小的雕像可以转换成它。", + "patchouli.touhou_little_maid.book.entries.other.garage_kit.pages.0.text": "火烤1x1大小的雕像可以转换成它。", "patchouli.touhou_little_maid.book.entries.other.maid_beacon.name": "神社庭灯", - "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.0.text": "神社庭灯既是一个不错的装饰物,还具有一定的实用功能。右击神社庭灯的上部能够打开 GUI,存储玩家的 P 点。$(br2)庭灯同样也是一个拥有攻击力的武器。", - "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.1.text": "同时还能点击按钮选择相应的效果,这些效果会消耗 P 点来为周围范围的女仆带来对应增益效果。$(br2)神社庭灯还是一个自动收集 P 点的好工具,它能够自动收集其 6 格范围内的 P 点,并将其存储起来。", + "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.0.text": "神社庭灯既是一个不错的装饰物,还具有一定的实用功能。右击神社庭灯的上部能够打开GUI,存储玩家的P点。$(br2)庭灯同样也是一个拥有攻击力的武器。", + "patchouli.touhou_little_maid.book.entries.other.maid_beacon.pages.1.text": "同时还能点击按钮选择相应的效果,这些效果会消耗P点来为周围范围的女仆带来对应增益效果。$(br2)神社庭灯还是一个自动收集P点的好工具,它能够自动收集其6格范围内的P点,并将其存储起来。", "patchouli.touhou_little_maid.book.entries.other.trumpet.name": "小号", "patchouli.touhou_little_maid.book.entries.other.trumpet.pages.0.text": "一个用来召回女仆的工具,右击即可使用。$(br2)$(4)$(l)需要注意:这个道具只能召回已加载区块上的女仆。从技术角度说,目前还没有任!何!办!法!可以召回卸载区块上的女仆。", "patchouli.touhou_little_maid.book.entries.other.chair.name": "自定义坐垫", - "patchouli.touhou_little_maid.book.entries.other.chair.pages.0.text": "自定义坐垫是纯装饰向的物品,直接右击放置在地上,shift 左击能够打掉它。右击能够坐上,shift 右击可以打开切换坐垫样式的 GUI。", - "patchouli.touhou_little_maid.book.entries.other.chair.pages.1.text": "部分坐垫在女仆靠近时可以直接坐上,shift 右击女仆能够使其离开坐垫。$(br2)坐垫模型也可以完全自定义,也可通过资源包快捷添加自定义模型。", + "patchouli.touhou_little_maid.book.entries.other.chair.pages.0.text": "自定义坐垫是纯装饰向的物品,直接右击放置在地上,Shift左击能够打掉它。右击能够坐上,Shift右击可以打开切换坐垫样式的GUI。", + "patchouli.touhou_little_maid.book.entries.other.chair.pages.1.text": "部分坐垫在女仆靠近时可以直接坐上,Shift右击女仆能够使其离开坐垫。$(br2)坐垫模型也可以完全自定义,也可通过资源包快捷添加自定义模型。", "patchouli.touhou_little_maid.book.entries.other.command.name": "指令", - "patchouli.touhou_little_maid.book.entries.other.command.pages.0.text": "$(#f00)/tlm$():这是本模组提供的指令。$(br2)你可以通过它设置 P 点,女仆数量或者重载模型包。", + "patchouli.touhou_little_maid.book.entries.other.command.pages.0.text": "$(#f00)/tlm$():这是本模组提供的指令。$(br2)你可以通过它设置P点,女仆数量或者重载模型包。", "patchouli.touhou_little_maid.book.entries.other.extinguisher.name": "灭火器", "patchouli.touhou_little_maid.book.entries.other.extinguisher.pages.0.text": "配合女仆灭火模式进行使用的物品,玩家无法使用。", "patchouli.touhou_little_maid.book.entries.other.maid_bed.name": "女仆床", - "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.0.text": "玩家可以睡觉,自然而然女仆也可以睡觉。在睡觉的日程中,女仆会寻找周围的床睡觉。$(br2)睡着状态的女仆不会再被敌对性生物攻击,此时女仆的 GUI 也无法打开。", + "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.0.text": "玩家可以睡觉,自然而然女仆也可以睡觉。在睡觉的日程中,女仆会寻找周围的床睡觉。$(br2)睡着状态的女仆不会再被敌对性生物攻击,此时女仆的GUI也无法打开。", "patchouli.touhou_little_maid.book.entries.other.maid_bed.pages.1.text": "睡在床上的女仆。", - "patchouli.touhou_little_maid.book.entries.other.power_point.name": "P 点", - "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "右击丢出,能够掉落实体 P 点。$(br2)你可在地牢战利品箱内发现物品形态的 P 点。", + "patchouli.touhou_little_maid.book.entries.other.power_point.name": "P点", + "patchouli.touhou_little_maid.book.entries.other.power_point.pages.0.text": "右击丢出,能够掉落实体P点。$(br2)你可在地牢战利品箱内发现物品形态的P点。", "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.name": "相机与照片", "patchouli.touhou_little_maid.book.entries.other.camera_and_photo.pages.0.text": "在跨维度或者远距离携带女仆是一个麻烦的事情,相机就是为此设计的。$(br2)只需要用相机对着自己的女仆拍摄就能将其变成照片,之后拿着照片对着方块右击又可以将其释放出来。", "patchouli.touhou_little_maid.book.entries.other.model_switcher.name": "模型切换器", "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.0.text": "用于创造模式,主要面向服务器设计,可以用于展示女仆模型。", - "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.1.text": "首先你需要手持此方块右击女仆。然后将其放置在地上,并右击打开 GUI 来设置你想展示的模型。$(br2)接下来在其左右两侧输入红石信号,即可切换此女仆的模型。", + "patchouli.touhou_little_maid.book.entries.other.model_switcher.pages.1.text": "首先你需要手持此方块右击女仆。然后将其放置在地上,并右击打开GUI来设置你想展示的模型。$(br2)接下来在其左右两侧输入红石信号,即可切换此女仆的模型。", "patchouli.touhou_little_maid.book.entries.other.chair_show.name": "坐垫显示器", "patchouli.touhou_little_maid.book.entries.other.chair_show.pages.0.text": "当手持并按下潜行键时,所有的坐垫都会显示碰撞箱。", "patchouli.touhou_little_maid.book.entries.other.favorability_tool.name": "好感度工具", @@ -813,53 +859,53 @@ "patchouli.touhou_little_maid.book.entries.other.fox_scroll.name": "狐狸卷轴", "patchouli.touhou_little_maid.book.entries.other.fox_scroll.pages.0.text": "用来寻找女仆或者女仆墓碑。", "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.name": "麻石狐像", - "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.pages.0.text": "麻石狐像可以阻止一定范围内女仆妖精的生成,不会影响其他生物的生成$(br2)限制范围是一个矩形范围,Y 方向则是从最低点到最高点全部覆盖!", + "patchouli.touhou_little_maid.book.entries.other.granite_inari_fox.pages.0.text": "麻石狐像可以阻止一定范围内女仆妖精的生成,不会影响其他生物的生成$(br2)限制范围是一个矩形范围,Y轴则是从最低点到最高点全部覆盖!", "patchouli.touhou_little_maid.book.entries.other.gomoku.name": "五子棋", "patchouli.touhou_little_maid.book.entries.other.gomoku.pages.0.text": "你可以和女仆一起玩五子棋,获胜能够增加女仆的好感度。$(br2)在玩家多次取得胜利后,女仆的五子棋技术也会上升。", "patchouli.touhou_little_maid.book.entries.other.maid_joy.name": "女仆娱乐", "patchouli.touhou_little_maid.book.entries.other.maid_joy.pages.0.text": "女仆能够在空闲日程玩耍,这能够增加她的好感度。", "patchouli.touhou_little_maid.book.entries.other.shrine.name": "神龛", - "patchouli.touhou_little_maid.book.entries.other.shrine.pages.0.text": "有很低概率在战利品箱中发现。能够通过消耗玩家血量来复活胶片中的女仆。", + "patchouli.touhou_little_maid.book.entries.other.shrine.pages.0.text": "有很低概率在战利品箱中发现。能够通过消耗玩家的生命值来复活胶片中的女仆。", "patchouli.touhou_little_maid.book.entries.other.broom.name": "扫帚", - "patchouli.touhou_little_maid.book.entries.other.broom.pages.0.text": "扫帚是一个便携的交通工具,但是需要你和女仆共同来使用。$(br2)通过鼠标来控制扫帚拉升或者下降,WASD 控制前后左右移动。", + "patchouli.touhou_little_maid.book.entries.other.broom.pages.0.text": "扫帚是一个便携的交通工具,但是需要你和女仆共同来使用。$(br2)通过鼠标来控制扫帚拉升或者下降,WASD控制前后左右移动。", "patchouli.touhou_little_maid.book.entries.other.picnic_basket.name": "野餐篮", "patchouli.touhou_little_maid.book.entries.other.picnic_basket.pages.0.text": "野餐篮可以存储食物,右击放置在地上即可变成野餐垫。", "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.name": "御币与弹幕", - "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.pages.0.text": "御币是一个普通的近战武器。$(br2)手持御币的女仆,在弹幕模式下会发射弹幕。$(br2)御币可以附加两个原版附魔:多重射击和快速装填。还能附加三个本模组新增的附魔!", + "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.pages.0.text": "御币是一个普通的近战武器。$(br2)手持御币的女仆,在弹幕模式下会发射弹幕。$(br2)御币可以附加两个原版魔咒:多重射击和快速装填。还能附加三个本模组新增的魔咒!", "patchouli.touhou_little_maid.book.entries.overview.gohei_and_danmaku.pages.1.text": "御币还是构建多方块祭坛的重要工具。", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.name": "多方块祭坛", - "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.0.text": "祭坛是本模组用于合成所必需的多方块结构。$(br2)祭坛的合成表可以通过 JEI 获取,合成同时还需要玩家的$(l:overview/power_point)power 值$()。", + "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.0.text": "祭坛是本模组用于合成所必需的多方块结构。$(br2)祭坛的合成表可以通过JEI获取,合成同时还需要玩家的$(l:overview/power_point)Power值$()。", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.1.text": "使用$(l:overview/gohei_and_danmaku)御币$()右击第四层中间偏左的红色羊毛正面,能够构建祭坛。", "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.2.title": "多方块祭坛", - "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.3.text": "你可以右击六个橡木柱子的顶端来放置物品。通过空手 Shift 右击来移除物品。$(br2)当物品完全放置且玩家的 Power 值足够,祭坛就能触发合成。$(br2)因为缺少 Power 而导致的合成中断,在获取足够 Power 以后,再次右击可以重新触发合成。", - "patchouli.touhou_little_maid.book.entries.overview.power_point.name": "Power 道具", - "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.0.text": "Power 道具是本模组重要的资源,通过杀死$(l:overview/world_spawn#fairy)女仆妖精$()来获取。$(br2)能够用于$(l:overview/multiblocks_altar)祭坛$()合成。", - "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.1.text": "当你手持$(l:overview/gohei_and_danmaku)御币$()时,在游戏屏幕的左上角就能看到 power 值。$(br2)Power 值最大为 5,超过此数值不再增长。$(br2)女仆能够拾取 P 点,并会修复其背包内所有拥有$(5)经验修补$()附魔的物品。", - "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.name": "东方 Project", - "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.text": "东方 Project 是日本同人社团上海爱丽丝幻乐团制作的一系列同人作品,系列以清版弹幕射击游戏为主。", - "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.link_text": "Touhou 百科", + "patchouli.touhou_little_maid.book.entries.overview.multiblocks_altar.pages.3.text": "你可以右击六个橡木柱子的顶端来放置物品。通过空手Shift右击来移除物品。$(br2)当物品完全放置且玩家的Power值足够,祭坛就能触发合成。$(br2)因为缺少Power而导致的合成中断,在获取足够Power以后,再次右击可以重新触发合成。", + "patchouli.touhou_little_maid.book.entries.overview.power_point.name": "Power道具", + "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.0.text": "Power道具是本模组重要的资源,通过杀死$(l:overview/world_spawn#fairy)女仆妖精$()来获取。$(br2)能够用于$(l:overview/multiblocks_altar)祭坛$()合成。", + "patchouli.touhou_little_maid.book.entries.overview.power_point.pages.1.text": "当你手持$(l:overview/gohei_and_danmaku)御币$()时,在游戏屏幕的左上角就能看到Power值。$(br2)Power值最大为5,超过此数值不再增长。$(br2)女仆能够拾取P点,并会修复其背包内所有拥有$(5)经验修补$()魔咒的物品。", + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.name": "东方Project", + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.text": "东方Project是日本同人社团上海爱丽丝幻乐团制作的一系列同人作品,系列以清版弹幕射击游戏为主。", + "patchouli.touhou_little_maid.book.entries.overview.what_is_touhou.pages.0.link_text": "Touhou百科", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.name": "世界生成", - "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.0.text": "这个模组添加了一种怪物。$(br2)怪物的掉落物是重要的合成材料。$(br2)本模组敌对性生物的生成几率均可在配置文件中进行修改,设置为 0 时可以禁止这些怪物生成。", + "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.0.text": "这个模组添加了一种怪物。$(br2)怪物的掉落物是重要的合成材料。$(br2)本模组敌对性生物的生成几率均可在配置文件中进行修改,设置为0时可以禁止这些怪物生成。", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.1.text": "在任意群系的夜晚生成,会以飞行状态弹幕攻击玩家或铁傀儡。", "patchouli.touhou_little_maid.book.entries.overview.world_spawn.pages.2.text": "女仆有概率在掠夺者前哨站的笼子里生成", "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.name": "制作自定义模型", - "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.0.text": "制作一个自定义模型包非常简单,你只需要 Blockbech。Blockbench 是一个免费开源的软件,而且非常易于上手。$(br2)自定义模型也支持基岩版动画,并且提供了大量 molang 参数可用。", - "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.text": "我特意设计了一个 Blockbench 插件用于制作模型包,访问下方链接学习如何安装此插件。", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.0.text": "制作一个自定义模型包非常简单,你只需要Blockbech。Blockbench是一个免费开源的软件,而且非常易于上手。$(br2)自定义模型也支持基岩版动画,并且提供了大量molang参数可用。", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.text": "我特意设计了一个Blockbench插件用于制作模型包,访问下方链接学习如何安装此插件。", "patchouli.touhou_little_maid.book.entries.overview.make_custom_model.pages.1.link_text": "打开链接", "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.name": "下载自定义模型", - "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.1.text": "你可以在女仆 GUI 下找到模型包下载按钮。", - "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.text": "点击即可打开下载界面,选择并下载你喜欢的模型包。$(br2)这些模型包全部由玩家制作。如果你也想发布自己的模型包,你可以点击下方链接加入我们的 Discord 群组来提交你的模型包。", - "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.link_text": "Discord 链接", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.1.text": "你可以在女仆GUI下找到模型包下载按钮。", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.text": "点击即可打开下载界面,选择并下载你喜欢的模型包。$(br2)这些模型包全部由玩家制作。如果你也想发布自己的模型包,你可以点击下方链接加入我们的Discord群组来提交你的模型包。", + "patchouli.touhou_little_maid.book.entries.overview.download_custom_model.pages.2.link_text": "Discord链接", "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.name": "原版修改", "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.pages.0.text": "我们把史莱姆模型修改成了油库里。", - "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.pages.1.text": "我们还修改了经验球、附魔之瓶和不死图腾的材质。$(br2)这些都可以在配置文件中关闭。", + "patchouli.touhou_little_maid.book.entries.overview.vanilla_change.pages.1.text": "我们还修改了经验球、附魔之瓶和不死图腾的纹理。$(br2)这些都可以在配置文件中关闭。", "patchouli.touhou_little_maid.book.entries.overview.favorability.name": "好感度", - "patchouli.touhou_little_maid.book.entries.overview.favorability.pages.0.text": "好感度能够增加女仆的血量和攻击力。$(br2)提升女仆好感度:$(li)女仆在空闲日程,玩耍电子琴、电脑、书架和五子棋。$(li)女仆睡觉。$(br2)减少女仆好感度:$(li)女仆死亡。", + "patchouli.touhou_little_maid.book.entries.overview.favorability.pages.0.text": "好感度能够增加女仆的生命值和攻击力。$(br2)提升女仆好感度:$(li)女仆在空闲日程,玩耍电子琴、电脑、书架和五子棋。$(li)女仆睡觉。$(br2)减少女仆好感度:$(li)女仆死亡。", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.name": "自定义聊天气泡文本", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.0.text": "你可以用书与笔来自定义女仆的聊天气泡文本。$(br2)如右图所示格式书写台本即可,用一个空行来分割每条台本。$(br2)你可以书写多页,每一页都会被解析。", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.1.text": "你甚至可以插入原版的格式符,用来显示彩色文本。", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.2.text": "但是每页的第一行必须要有类型名称,它指明了该台本在什么情况下显示。$(br2)可用的类型名称有这些:$(br)日程相关:$(li)work:任意工作日程时显示$(li)idle:休息或空闲状态时显示$(li)sleep:睡觉时显示", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.3.text": "其他情况:$(li)morning:早上时显示$(li)night:傍晚时显示$(li)rain:下雨时显示$(li)snow:下雪时显示$(li)cold:处于寒冷的群系时显示$(li)hot:处于炎热的群系时显示$(li)hurt:受伤时显示$(li)beg:祈求状态时显示", - "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.4.text": "工作模式:$(li)会在特定的工作模式时显示,比如 attack,farm 等。$(br2)当你写好了台本,只需要对着女仆右击即可写入台本。$(br)如果你是在按下 Shift 键时,手持书与笔(或者成书)右击女仆,那么就可以清除女仆的台本。$(br)如果你是拿着空白的书与笔右击已经有台本的女仆,可以将女仆的台本复制到书上。", + "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.4.text": "工作模式:$(li)会在特定的工作模式时显示,比如attack、farm 等。$(br2)当你写好了台本,只需要对着女仆右击即可写入台本。$(br)如果你是在按下Shift键时,手持书与笔(或者成书)右击女仆,那么就可以清除女仆的台本。$(br)如果你是拿着空白的书与笔右击已经有台本的女仆,可以将女仆的台本复制到书上。", "patchouli.touhou_little_maid.book.entries.overview.make_custom_chatbubble_text.pages.5.text": "当开启了高级文本提示功能时(F3+H),你可以在工作模式切换界面的文本提示上看到这些名称。" } \ No newline at end of file diff --git a/src/main/resources/assets/touhou_little_maid/models/item/servant_bell.json b/src/main/resources/assets/touhou_little_maid/models/item/servant_bell.json index 148e615e2..820bc57ba 100644 --- a/src/main/resources/assets/touhou_little_maid/models/item/servant_bell.json +++ b/src/main/resources/assets/touhou_little_maid/models/item/servant_bell.json @@ -29,9 +29,6 @@ "translation": [0, 0.5, 0], "scale": [0.75, 0.75, 0.75] }, - "gui": { - "rotation": [0, 180, 0] - }, "head": { "translation": [0, 15, 0] } diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/altar.png b/src/main/resources/assets/touhou_little_maid/textures/entity/altar.png index dd9a1d36a..62d44bea2 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/altar.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/altar.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_0.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_0.png index ce1488a27..4cc0450cb 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_0.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_0.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_1.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_1.png index a5166bae9..5cdedffd8 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_1.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_1.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_10.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_10.png index a0b4a92cb..31a11c5de 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_10.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_10.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_11.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_11.png index bc6b43bff..3b9c6de97 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_11.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_11.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_12.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_12.png index e793f5d76..40606f356 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_12.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_12.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_13.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_13.png index 450d8e51d..02e80deaf 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_13.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_13.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_14.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_14.png index ef40a6c62..5941b4164 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_14.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_14.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_15.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_15.png index 05e81e281..01657a5e1 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_15.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_15.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_16.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_16.png index e16290045..62782e5e1 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_16.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_16.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_17.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_17.png index d86cbb83a..f50341ff7 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_17.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_17.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_2.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_2.png index 0e8970103..359fd4342 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_2.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_2.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_3.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_3.png index 89ab1f62f..b3375ac0a 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_3.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_3.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_4.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_4.png index 899260389..662e59cbb 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_4.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_4.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_5.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_5.png index b7ab6dfd8..c489dfd64 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_5.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_5.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_6.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_6.png index a0ddafd0e..7bacccfc6 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_6.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_6.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_7.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_7.png index a3ddfe3b8..db5556a77 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_7.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_7.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_8.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_8.png index b3dfbe368..42516cbbc 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_8.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_8.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_9.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_9.png index 947835e4f..e5b85fe76 100644 Binary files a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_9.png and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_9.png differ diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_rick.png b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_rick.png new file mode 100644 index 000000000..f98404a6f Binary files /dev/null and b/src/main/resources/assets/touhou_little_maid/textures/entity/new_maid_fairy/maid_fairy_rick.png differ diff --git a/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip b/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip index 4a6204932..61e6ab706 100644 Binary files a/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip and b/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip differ diff --git a/src/main/resources/data/minecraft/tags/items/piglin_loved.json b/src/main/resources/data/minecraft/tags/item/piglin_loved.json similarity index 100% rename from src/main/resources/data/minecraft/tags/items/piglin_loved.json rename to src/main/resources/data/minecraft/tags/item/piglin_loved.json diff --git a/src/main/resources/data/spawnanimations/tags/entity_type/dig_up_animation.json b/src/main/resources/data/spawnanimations/tags/entity_type/dig_up_animation.json new file mode 100644 index 000000000..96639e9db --- /dev/null +++ b/src/main/resources/data/spawnanimations/tags/entity_type/dig_up_animation.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "touhou_little_maid:fairy" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/tacz/tags/blocks/interact_key/whitelist.json b/src/main/resources/data/tacz/tags/block/interact_key/whitelist.json similarity index 100% rename from src/main/resources/data/tacz/tags/blocks/interact_key/whitelist.json rename to src/main/resources/data/tacz/tags/block/interact_key/whitelist.json diff --git a/src/main/resources/data/tacz/tags/entity_types/interact_key/whitelist.json b/src/main/resources/data/tacz/tags/entity_type/interact_key/whitelist.json similarity index 100% rename from src/main/resources/data/tacz/tags/entity_types/interact_key/whitelist.json rename to src/main/resources/data/tacz/tags/entity_type/interact_key/whitelist.json diff --git a/src/main/resources/touhou_little_maid.mixins.json b/src/main/resources/touhou_little_maid.mixins.json index 1ed392be2..26b19431c 100644 --- a/src/main/resources/touhou_little_maid.mixins.json +++ b/src/main/resources/touhou_little_maid.mixins.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_17", "refmap": "touhou_little_maid.refmap.json", "mixins": [ - "EntityMixin", "FenceGateBlockAccessor", "FishingHookPredicateMixin", "MixinArrowEntity", "MixinStructureTemplate" + "EntityAccessor", "EntityMixin", "FenceGateBlockAccessor", "FishingHookPredicateMixin", "MixinArrowEntity", + "MixinCrossbowItem", "MixinStructureTemplate", "MixinThrownTrident", "PlayerMixin" ], "client": [ "client.HumanoidModelMixin", "client.ItemPropertiesMixin", "client.LanguageMixin",