diff --git a/README.md b/README.md index 9a81d71..cc1c68f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 版本 0.0.3.6 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 +# 版本 0.0.3.8 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 ## 简介 现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧( @@ -15,7 +15,7 @@ 4. 拴绳箭最大存活时间 ## 新物品 和 实体 -### 拴绳箭 +### 拴绳箭 [有普通和荧光两种箭矢] 获得飞一样的感觉(操作不当可能会摔死 #### 射中实体时,会将射击者拴绳绑定在改实体上(该实体父类必须是有LivingEntity类型),同时拴绳箭会以普通的箭矢掉落 #### 射中栅栏时,会自动将玩家拴在上面 ,同时拴绳箭会以普通的箭矢掉落 @@ -32,6 +32,7 @@ * `/lp leash clear [<玩家[可多个对象]>] ` - 清除該玩家的的拴繩數據實體 [ 如果<玩家>为空则代表执行对象是自己 ] +* `/lp motion [<实体[可多个对象]>] add/set/multiply ` - 给实体添加/设置/倍乘 加速度 ## 游戏规则 diff --git a/build.gradle b/build.gradle index 75ad141..58bcbe4 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ runs { data { // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it // workingDirectory project.file('run-data') - + systemProperty('gradle.task', 'runData') // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() } diff --git a/gradle.properties b/gradle.properties index e04da80..46655a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -32,7 +32,7 @@ mod_name=Leashed Player # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=0.0.3.7 +mod_version=0.0.3.8 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 index 428a5dd..1375903 100644 --- a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -1 +1,2 @@ -// 1.21.1 2024-09-08T14:20:00.5319153 Registries +// 1.21.1 2024-10-21T20:49:37.2148772 Registries +6f79a674215db9f9d2820b1c7f052c60ce729fee data/leashedplayer/painting_variant/group_photo.json diff --git a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index 839418e..2c9b9bc 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-05T22:32:01.8406652 Languages: en_us for mod: leashedplayer -27fb1feca9c95470e67902e0a5287fa717f71137 assets/leashedplayer/lang/en_us.json +// 1.21.1 2024-10-21T20:49:37.2158765 Languages: en_us for mod: leashedplayer +dc78768edb63e137acf5074f92a68563e1b28406 assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index 14bea95..ef09831 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-05T22:32:01.8406652 Languages: zh_cn for mod: leashedplayer -cf1999519d9de039d6a7d3e6f241f67b68c968ed assets/leashedplayer/lang/zh_cn.json +// 1.21.1 2024-10-21T20:49:37.2148772 Languages: zh_cn for mod: leashedplayer +6bf33a9eeda115951df58977924696be03f6f1bf assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index 222c7a5..54b989e 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21.1 2024-10-05T22:32:01.8406652 Languages: zh_tw for mod: leashedplayer -8d4b3e4d8f0513352a7ef4e1373be64f4d77f9cd assets/leashedplayer/lang/zh_tw.json +// 1.21.1 2024-10-21T20:49:37.2138769 Languages: zh_tw for mod: leashedplayer +d44d60e27eacfee6c34a8b9a5fcdd164f25cb5a5 assets/leashedplayer/lang/zh_tw.json diff --git a/src/generated/resources/assets/leashedplayer/lang/en_us.json b/src/generated/resources/assets/leashedplayer/lang/en_us.json index 7788078..61b1a4b 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -37,5 +37,10 @@ "leashedplayer.command.leash.message.leash.data.show": "%1$s's LeashDataEntity is %2$s", "leashedplayer.command.leash.message.leash.length.failed": "Failed (Internal Error, maybe your command is incorrect)", "leashedplayer.command.leash.message.leash.length.set": "The Leash length of %1$s is set to %2$s blocks", - "leashedplayer.command.leash.message.leash.length.show": "The Leash Length of %1$s is %2$s blocks" + "leashedplayer.command.leash.message.leash.length.show": "The Leash Length of %1$s is %2$s blocks", + "leashedplayer.command.motion.message.adder.successful": "§bAdd Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.multiply.successful": "§bMultiply Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.setter.successful": "§bSet Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "painting.leashedplayer.group_photo.author": "§9Leisure §4Time §eDock§r", + "painting.leashedplayer.group_photo.title": "§dGroup Photo §7[§6memorable§7]§r" } \ No newline at end of file diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json index a7fdc32..7c79b45 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -37,5 +37,10 @@ "leashedplayer.command.leash.message.leash.data.show": "%1$s的拴绳数据实体为%2$s", "leashedplayer.command.leash.message.leash.length.failed": "失败(内部错误,可能是你输的指令有误)", "leashedplayer.command.leash.message.leash.length.set": "%1$s的拴绳长度被设置为%2$s格", - "leashedplayer.command.leash.message.leash.length.show": "%1$s的拴绳长度为%2$s格" + "leashedplayer.command.leash.message.leash.length.show": "%1$s的拴绳长度为%2$s格", + "leashedplayer.command.motion.message.adder.successful": "§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.multiply.successful": "§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.setter.successful": "§b设置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "painting.leashedplayer.group_photo.author": "§9闲趣§4时§e坞§r", + "painting.leashedplayer.group_photo.title": "§d集体照 §7[§6纪念§7]§r" } \ No newline at end of file diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json index d42976b..0e3dded 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -37,5 +37,10 @@ "leashedplayer.command.leash.message.leash.data.show": "%1$s拴繩數據實體為%2$s", "leashedplayer.command.leash.message.leash.length.failed": "失敗(内部錯誤,,可能你輸入的指令有誤)", "leashedplayer.command.leash.message.leash.length.set": "%1$s的拴繩長度被設置為%2$s格", - "leashedplayer.command.leash.message.leash.length.show": "%1$s的拴繩長度為%2$s格" + "leashedplayer.command.leash.message.leash.length.show": "%1$s的拴繩長度為%2$s格", + "leashedplayer.command.motion.message.adder.successful": "§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.multiply.successful": "§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "leashedplayer.command.motion.message.setter.successful": "§b設置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", + "painting.leashedplayer.group_photo.author": "§9閑趣§4時§e塢§r", + "painting.leashedplayer.group_photo.title": "§d集體照 §7[§6紀念§7]§r" } \ No newline at end of file diff --git a/src/generated/resources/data/leashedplayer/painting_variant/group_photo.json b/src/generated/resources/data/leashedplayer/painting_variant/group_photo.json new file mode 100644 index 0000000..d908454 --- /dev/null +++ b/src/generated/resources/data/leashedplayer/painting_variant/group_photo.json @@ -0,0 +1,5 @@ +{ + "asset_id": "leashedplayer:group_photo", + "height": 3, + "width": 4 +} \ No newline at end of file diff --git a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java index 87830ff..a664ca4 100644 --- a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java @@ -2,7 +2,7 @@ package com.r3944realms.leashedplayer; import com.mojang.brigadier.CommandDispatcher; import com.r3944realms.leashedplayer.content.commands.LeashCommand; -import com.r3944realms.leashedplayer.content.items.ModCreativeTab; +import com.r3944realms.leashedplayer.content.commands.MotionCommand; import com.r3944realms.leashedplayer.content.items.ModItemRegister; import net.minecraft.commands.CommandSourceStack; import net.minecraft.world.level.block.DispenserBlock; @@ -19,6 +19,7 @@ public class CommonEventHandler { public static void onRegisterCommander(RegisterCommandsEvent event) { CommandDispatcher dispatcher = event.getDispatcher(); LeashCommand.register(dispatcher); + MotionCommand.register(dispatcher); } } @@ -28,43 +29,9 @@ public class CommonEventHandler { public static void onCommonSetup(FMLCommonSetupEvent event) { DispenserBlock.registerProjectileBehavior(ModItemRegister.LEASH_ROPE_ARROW.get()); DispenserBlock.registerProjectileBehavior(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get()); -// NeoForge.EVENT_BUS.addListener(Mod::onPlayerTick); + + } -// public static void onPlayerTick(PlayerTickEvent.Pre event) { -// if (!event.getEntity().level().isClientSide && !event.getEntity().isUsingItem()) { -// Player player = event.getEntity(); -// -// // 检测玩家视线中的实体 -// Entity entity = getEntityLookedAt(player); -// -// // 如果实体是自定义箭实体 -// if (entity instanceof LeashRopeArrow la) { -// -// // 处理玩家右键点击箭的交互逻辑 -// if (player.isShiftKeyDown()) { // 可以结合 Shift 键 -// if(la.pickup == AbstractArrow.Pickup.ALLOWED || ( player.isCreative() && la.pickup != AbstractArrow.Pickup.DISALLOWED )){ -// player.take(la, 1); -// player.addItem(ModItemRegister.LEASH_ROPE_ARROW.get().getDefaultInstance()); -// } -// } -// } -// } -// } -// -// // 射线检测方法,获取玩家视线内的实体//TODO:分离 Maybe XD -// private static Entity getEntityLookedAt(Player player) { -// double reach = 5.0D; // 设置射线检测距离 //TODO:与Player互动距离同步 -// Vec3 eyePosition = player.getEyePosition(1.0F); -// Vec3 lookVector = player.getViewVector(1.0F).scale(reach); -// Vec3 targetPosition = eyePosition.add(lookVector); -// -// // 创建一个射线并检测结果 -// AABB boundingBox = player.getBoundingBox().expandTowards(lookVector).inflate(1.0D, 1.0D, 1.0D); -// EntityHitResult hitResult = ProjectileUtil.getEntityHitResult(player, eyePosition, targetPosition, boundingBox, e -> e instanceof LeashRopeArrow, reach); -// -// return hitResult == null ? null : hitResult.getEntity(); -// } -// } } diff --git a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java index ec9dc8f..deeb692 100644 --- a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java @@ -5,6 +5,7 @@ import com.r3944realms.leashedplayer.content.criteriaTriggers.ModCriteriaTrigger import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.items.ModCreativeTab; import com.r3944realms.leashedplayer.content.items.ModItemRegister; +import com.r3944realms.leashedplayer.content.paintings.paintings.ModPaintingsRegister; import com.r3944realms.leashedplayer.utils.Util; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModLoadingContext; @@ -19,6 +20,7 @@ public class LeashedPlayer { private static Double M2;//繩箭拴繩掉落距離倍基數 public LeashedPlayer(IEventBus event) { ModItemRegister.register(event); + ModPaintingsRegister.register(event); ModEntityRegister.register(event); ModCreativeTab.register(event); ModCriteriaTriggers.register(event); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java index 4d75cfe..290786e 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java @@ -1,7 +1,22 @@ package com.r3944realms.leashedplayer.content.commands; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public class Command { public static final String PREFIX = LeashPlayerCommonConfig.LeashedPlayerModCommandPrefix.get(); + + static LiteralArgumentBuilder getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List> list) { + LiteralArgumentBuilder literal = Commands.literal(name); + if (shouldAddToList) { + assert list != null; + list.add(literal); + } + return literal; + } } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java index 1247206..fa28bee 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java @@ -28,6 +28,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; + public class LeashCommand { public static final Integer MIN_VALUE = LeashPlayerCommonConfig.MinimumLeashLengthCanBeSet.get(); public static final Integer MAX_VALUE = LeashPlayerCommonConfig.MaximumLeashLengthCanBeSet.get(); @@ -50,14 +52,7 @@ public class LeashCommand { LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY = LEASH_DATA_SET + ".failed.forbid_same_entity", LEASH_DATA_CLEAR_FAILED_NO_DATA = LEASH_DATA_CLEAR + ".leash.clear.failed.no_data" ; - private static LiteralArgumentBuilder getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List> list) { - LiteralArgumentBuilder literal = Commands.literal(name); - if (shouldAddToList) { - assert list != null; - list.add(literal); - } - return literal; - } + public static void register(CommandDispatcher dispatcher) { boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java new file mode 100644 index 0000000..f4678b0 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java @@ -0,0 +1,126 @@ +package com.r3944realms.leashedplayer.content.commands; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.DoubleArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig; +import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; + +public class MotionCommand { + private final static String LEASHED_PLAYER_MOTION_MESSAGE_ = "leashedplayer.command.motion.message."; + public final static String MOTION_SETTER_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "setter.successful", + MOTION_ADDER_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "adder.successful", + MOTION_MULTIPLY_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "multiply.successful"; + public static void register(CommandDispatcher dispatcher) { + boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); + @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); + LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); + LiteralArgumentBuilder $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !shouldUsePrefix, nodeList); + com.mojang.brigadier.Command motionVecAdder = context -> { + CommandSourceStack source = context.getSource(); + for(Entity entity : EntityArgument.getEntities(context, "targets")){ + Vec3 motionVec = new Vec3( + DoubleArgumentType.getDouble(context, "vecX"), + DoubleArgumentType.getDouble(context, "vecY"), + DoubleArgumentType.getDouble(context, "vecZ") + ); + if(entity instanceof ServerPlayer player) { + PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.ADD, motionVec.x, motionVec.y, motionVec.z)); + } else { + entity.addDeltaMovement(motionVec); + } + double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z; + source.sendSuccess(() -> Component.translatable(MOTION_ADDER_SUCCESSFUL, entity.getName().copy().withStyle(), vecX, vecY, vecZ), true); + } + return 0; + }; + Command motionVecSetter = context -> { + CommandSourceStack source = context.getSource(); + for(Entity entity : EntityArgument.getEntities(context, "targets")){ + Vec3 motionVec = new Vec3( + DoubleArgumentType.getDouble(context, "vecX"), + DoubleArgumentType.getDouble(context, "vecY"), + DoubleArgumentType.getDouble(context, "vecZ") + ); + if(entity instanceof ServerPlayer player) { + PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.SET, motionVec.x, motionVec.y, motionVec.z)); + } else { + entity.setDeltaMovement(motionVec); + } + double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z; + source.sendSuccess(() -> Component.translatable(MOTION_SETTER_SUCCESSFUL, entity.getName().copy(), vecX, vecY, vecZ), true); + } + return 0; + }; + Command motionVecMultiply = context -> { + CommandSourceStack source = context.getSource(); + for(Entity entity : EntityArgument.getEntities(context, "targets")){ + Vec3 motionFactorVec = new Vec3( + DoubleArgumentType.getDouble(context, "vecXFactor"), + DoubleArgumentType.getDouble(context, "vecYFactor"), + DoubleArgumentType.getDouble(context, "vecZFactor") + ); + if(entity instanceof ServerPlayer player) { + PacketDistributor.sendToPlayer(player, new UpdatePlayerMovement(UpdatePlayerMovement.Operation.MULTIPLY, motionFactorVec.x, motionFactorVec.y, motionFactorVec.z)); + } else { + entity.setDeltaMovement(entity.getDeltaMovement().multiply(motionFactorVec)); + } + double vecX = entity.getDeltaMovement().x, vecY = entity.getDeltaMovement().y, vecZ = entity.getDeltaMovement().z; + source.sendSuccess(() -> Component.translatable(MOTION_MULTIPLY_SUCCESSFUL, entity.getName().copy(), vecX, vecY, vecZ), true); + } + return 0; + }; + + LiteralArgumentBuilder Motion = $$motionRoot.requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("targets", EntityArgument.entities()) + .then(Commands.literal("add") + .then(Commands.argument("vecX", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecY", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecZ", DoubleArgumentType.doubleArg()) + .executes(motionVecAdder) + ) + ) + ) + ) + .then(Commands.literal("set") + .then(Commands.argument("vecX", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecY", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecZ", DoubleArgumentType.doubleArg()) + .executes(motionVecSetter) + ) + ) + ) + ) + .then(Commands.literal("multiply") + .then(Commands.argument("vecXFactor", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecYFactor", DoubleArgumentType.doubleArg()) + .then(Commands.argument("vecZFactor", DoubleArgumentType.doubleArg()) + .executes(motionVecMultiply) + ) + ) + ) + ) + ); + if(shouldUsePrefix){ + literalArgumentBuilder.then(Motion); + dispatcher.register(literalArgumentBuilder); + } else { + nodeList.forEach(dispatcher::register); + } + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/paintings/paintings/ModPaintingsRegister.java b/src/main/java/com/r3944realms/leashedplayer/content/paintings/paintings/ModPaintingsRegister.java new file mode 100644 index 0000000..505d523 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/paintings/paintings/ModPaintingsRegister.java @@ -0,0 +1,25 @@ +package com.r3944realms.leashedplayer.content.paintings.paintings; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.decoration.PaintingVariant; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Supplier; + +public class ModPaintingsRegister { + public static final DeferredRegister PAINTING_VARIANT = + DeferredRegister.create(Registries.PAINTING_VARIANT, LeashedPlayer.MOD_ID); + public static final Supplier GROUP_PHOTO = PAINTING_VARIANT.register("group_photo", () -> new PaintingVariant(1920, 1080, getAssetId("group_photo"))); + + private static @NotNull ResourceLocation getAssetId( String paint_name) { + return ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "textures/painting/"+paint_name+".png"); + } + + public static void register(IEventBus eventBus) { + PAINTING_VARIANT.register(eventBus); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java index 5528186..f8f4275 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -1,6 +1,7 @@ package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData; import com.r3944realms.leashedplayer.content.commands.LeashCommand; +import com.r3944realms.leashedplayer.content.commands.MotionCommand; import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.gamerules.Server.CreateLeashFenceKnotEntityIfAbsent; import com.r3944realms.leashedplayer.content.gamerules.Server.KeepLeashNotDropTime; @@ -8,6 +9,7 @@ import com.r3944realms.leashedplayer.content.gamerules.Server.TeleportWithLeashe import com.r3944realms.leashedplayer.content.items.type.LeashRopeArrowItem; import com.r3944realms.leashedplayer.content.items.ModCreativeTab; import com.r3944realms.leashedplayer.content.items.ModItemRegister; +import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants; import com.r3944realms.leashedplayer.utils.Enum.LanguageEnum; import com.r3944realms.leashedplayer.utils.Enum.ModPartEnum; import net.minecraft.world.item.Item; @@ -26,6 +28,9 @@ public enum ModLangKeyValue { TEST_FABRIC_ITEM(ModItemRegister.FABRIC, ModPartEnum.ITEM, "Fabric", "Fabric", "Fabric", true), //ITEM_DESC DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false), + //PAINTING + GROUP_PHOTO_TITLE(ModPaintingVariants.getPaintingVariantTitleKey(ModPaintingVariants.GROUP_PHOTO),ModPartEnum.TITLE, "§dGroup Photo §7[§6memorable§7]§r", "§d集体照 §7[§6纪念§7]§r", "§d集體照 §7[§6紀念§7]§r", false), + GROUP_PHOTO_AUTHOR(ModPaintingVariants.getPaintingVariantAuthorKey(ModPaintingVariants.GROUP_PHOTO),ModPartEnum.AUTHOR, "§9Leisure §4Time §eDock§r","§9闲趣§4时§e坞§r","§9閑趣§4時§e塢§r",false), //ENTITY LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("leash_rope_arrow"), ModPartEnum.ENTITY, "Leash Rope Arrow", "拴绳箭", "拴繩箭", false), SPECTRAL_LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("spectral_leash_rope_arrow"), ModPartEnum.ENTITY, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", false), @@ -44,6 +49,9 @@ public enum ModLangKeyValue { MESSAGE_LEASH_CLEAR(LeashCommand.LEASH_DATA_CLEAR, ModPartEnum.COMMAND, "%1$s's LeashData(LeashHolderEntity: %2$s) now is clear", "%1$s的拴绳数据(拴绳持有者实体:%2$s)现在已清除", "%1$s的拴繩數據(拴繩持有者實體:%2$s)現在已清除", false), MESSAGE_LEASH_SET_FAILED_FORBID_SAME_ENTITY(LeashCommand.LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY, ModPartEnum.COMMAND, "Prohibit setting the same entity","禁止设置同一实体", "禁止設置同一實體", false), MESSAGE_LEASH_CLEAR_FAILED(LeashCommand.LEASH_DATA_CLEAR_FAILED_NO_DATA, ModPartEnum.COMMAND, "%1$s has no LeashData can be clear", "%1$s沒有拴绳数据可清除", "%1$s沒有拴繩數據實體可被清除", false), + MESSAGE_MOTION_ADDER_SUCCESSFUL(MotionCommand.MOTION_ADDER_SUCCESSFUL, ModPartEnum.COMMAND, "§bAdd Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b添加成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r", false), + MESSAGE_MOTION_SETTER_SUCCESSFUL(MotionCommand.MOTION_SETTER_SUCCESSFUL, ModPartEnum.COMMAND, "§bSet Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b设置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b設置成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",false), + MESSAGE_MOTION_MULTIPLY_SUCCESSFUL(MotionCommand.MOTION_MULTIPLY_SUCCESSFUL, ModPartEnum.COMMAND, "§bMultiply Successfully.§a%s§7:§f[§eVec§7: §a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r","§b倍乘成功.§a%s§7:§f[§e加速度§7:§a(§f%f§7,§f%f§7,§f%f§a)§f]§r",false), //GAME_RULE_NAME TELEPORT_WITH_LEASHED_PLAYERS(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false), CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false), diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/ModDataGeneratorHandler.java b/src/main/java/com/r3944realms/leashedplayer/datagen/ModDataGeneratorHandler.java index 9238222..1590c94 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/ModDataGeneratorHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/ModDataGeneratorHandler.java @@ -25,6 +25,7 @@ public class ModDataGeneratorHandler { addLanguage(event, LanguageEnum.TraditionalChinese); addLanguage(event, LanguageEnum.LiteraryChinese); ModDataPackBuiltInEntriesProvider(event, holderFolder); + ModPaintVariantTagsProvider(event, holderFolder, existingFileHelper); ItemModelGenerator(event, existingFileHelper); RecipeGenerator(event, holderFolder); ModTagsProvider(event, event.getLookupProvider(), existingFileHelper); @@ -66,10 +67,19 @@ public class ModDataGeneratorHandler { event.includeServer(), (DataProvider.Factory) pOutput -> new ModDataPackBuiltInEntriesProvider(pOutput, future) ); - }private static void ModAdvancementProvider(GatherDataEvent event, CompletableFuture pLookUpProvider, ExistingFileHelper helper) { + } + private static void ModAdvancementProvider(GatherDataEvent event, CompletableFuture pLookUpProvider, ExistingFileHelper helper) { event.getGenerator().addProvider( event.includeServer(), (DataProvider.Factory) pOutput -> new ModAdvancementProvider(pOutput, pLookUpProvider, helper)); } + private static void ModPaintVariantTagsProvider(GatherDataEvent event, CompletableFuture completableFuture, ExistingFileHelper helper) { + event.getGenerator().addProvider( + event.includeServer(), + (DataProvider.Factory) pOutput -> { + return new ModPaintingVariantTagsProvider(pOutput, completableFuture, LeashedPlayer.MOD_ID, helper); + } + ); + } } diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModDataPackBuiltInEntriesProvider.java b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModDataPackBuiltInEntriesProvider.java index 37d568a..a531797 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModDataPackBuiltInEntriesProvider.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModDataPackBuiltInEntriesProvider.java @@ -1,8 +1,10 @@ package com.r3944realms.leashedplayer.datagen.provider; import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants; import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; @@ -11,7 +13,7 @@ import java.util.concurrent.CompletableFuture; public class ModDataPackBuiltInEntriesProvider extends DatapackBuiltinEntriesProvider { public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() - ; + .add(Registries.PAINTING_VARIANT, ModPaintingVariants::bootstrap); public ModDataPackBuiltInEntriesProvider(PackOutput output, CompletableFuture registries) { super(output, registries, BUILDER, Set.of(LeashedPlayer.MOD_ID)); CompletableFuture registryProvider = getRegistryProvider(); diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModPaintingVariantTagsProvider.java b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModPaintingVariantTagsProvider.java new file mode 100644 index 0000000..368dd1a --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/ModPaintingVariantTagsProvider.java @@ -0,0 +1,24 @@ +package com.r3944realms.leashedplayer.datagen.provider; + +import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.PaintingVariantTagsProvider; +import net.minecraft.tags.PaintingVariantTags; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class ModPaintingVariantTagsProvider extends PaintingVariantTagsProvider { + public ModPaintingVariantTagsProvider(PackOutput pOutput, CompletableFuture pProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { + super(pOutput, pProvider, modId, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.@NotNull Provider pProvider) { + this.tag(PaintingVariantTags.PLACEABLE) + .add(ModPaintingVariants.GROUP_PHOTO); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/provider/attributes/ModPaintingVariants.java b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/attributes/ModPaintingVariants.java new file mode 100644 index 0000000..17f4942 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/provider/attributes/ModPaintingVariants.java @@ -0,0 +1,41 @@ +package com.r3944realms.leashedplayer.datagen.provider.attributes; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.decoration.PaintingVariant; + +public class ModPaintingVariants { + public static final ResourceKey GROUP_PHOTO = create("group_photo"); + + public static void bootstrap(BootstrapContext pContext) { + PaintingVariantBootstrap(pContext); + } + public static void PaintingVariantBootstrap(BootstrapContext pContext) { + ModPaintingVariants.register(pContext, ModPaintingVariants.GROUP_PHOTO, 4, 3); + } + private static void register(BootstrapContext pContext, ResourceKey pKey, int pWidth, int pHeight) { + pContext.register(pKey, new PaintingVariant(pWidth, pHeight, pKey.location())); + } + private static ResourceKey create(String pName) { + return ResourceKey.create(Registries.PAINTING_VARIANT, ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, pName)); + } + + public static String getPaintingVariantTitleKey(ResourceKey pKey) { + return "painting." + pKey.location().getNamespace() + "." + pKey.location().getPath() + ".title"; + } + + public static String getPaintingVariantAuthorKey(ResourceKey pKey) { + return "painting." + pKey.location().getNamespace() + "." + pKey.location().getPath() + ".author"; + } + + public static String getPaintingVariantTitleKey(String pName) { + return "painting." + LeashedPlayer.MOD_ID + "." + pName + ".title"; + } + + public static String getPaintingVariantAuthorKey(String pName) { + return "painting." + LeashedPlayer.MOD_ID + "." + pName + ".author"; + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/MixinPlugin.java b/src/main/java/com/r3944realms/leashedplayer/mixin/MixinPlugin.java new file mode 100644 index 0000000..16053c7 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/MixinPlugin.java @@ -0,0 +1,53 @@ +package com.r3944realms.leashedplayer.mixin; + +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class MixinPlugin implements IMixinConfigPlugin { + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + // 检查当前是否在数据生成阶段 + // 根据需要添加逻辑来控制特定Mixin类的应用 + boolean isRegister = mixinClassName.split("com\\.r3944realms\\.leashedplayer\\.mixin\\.")[1].split("\\.")[0].equals("registry"); + if (isRegister) { + return isDataGeneration(); + } + return true; // 其他Mixin类默认应用 + } + + private boolean isDataGeneration() { + // 使用你的逻辑来检查是否在数据生成阶段 + String environment = System.getProperty("gradle.task"); + return "runData".equals(environment); + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/registry/MixinPaintingVariants.java b/src/main/java/com/r3944realms/leashedplayer/mixin/registry/MixinPaintingVariants.java new file mode 100644 index 0000000..9eadd23 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/registry/MixinPaintingVariants.java @@ -0,0 +1,19 @@ +package com.r3944realms.leashedplayer.mixin.registry; + + +import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.world.entity.decoration.PaintingVariant; +import net.minecraft.world.entity.decoration.PaintingVariants; +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(PaintingVariants.class) +public class MixinPaintingVariants { + @Inject(method = {"bootstrap"}, at = @At("TAIL")) + private static void bootstrap(BootstrapContext pContext , CallbackInfo ci) { + ModPaintingVariants.PaintingVariantBootstrap(pContext); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java b/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java new file mode 100644 index 0000000..344c529 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java @@ -0,0 +1,23 @@ +package com.r3944realms.leashedplayer.network; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD) +public class LeashedPlayerNetwork { + + @SubscribeEvent + public static void registerPackets(RegisterPayloadHandlersEvent event) { + PayloadRegistrar registrar = event.registrar(LeashedPlayer.MOD_ID); + registrar.playToClient( + UpdatePlayerMovement.TYPE, + UpdatePlayerMovement.STREAM_CODEC, + UpdatePlayerMovement::handle + ); + } + +} diff --git a/src/main/java/com/r3944realms/leashedplayer/network/client/UpdatePlayerMovement.java b/src/main/java/com/r3944realms/leashedplayer/network/client/UpdatePlayerMovement.java new file mode 100644 index 0000000..8a1c0ea --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/network/client/UpdatePlayerMovement.java @@ -0,0 +1,55 @@ +package com.r3944realms.leashedplayer.network.client; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +/** + * @author qyl27 + * @param operation + * @param x + * @param y + * @param z + */ +public record UpdatePlayerMovement(Operation operation, double x, double y, double z) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"update_player_movement")); + @Override + public @NotNull Type type() { + return TYPE; + } + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite( + NeoForgeStreamCodecs.enumCodec(Operation.class), UpdatePlayerMovement::operation, + ByteBufCodecs.DOUBLE, UpdatePlayerMovement::x, + ByteBufCodecs.DOUBLE, UpdatePlayerMovement::y, + ByteBufCodecs.DOUBLE, UpdatePlayerMovement::z, + UpdatePlayerMovement::new + ); + public void handle(IPayloadContext context) { + context.enqueueWork(() -> { + Player player = context.player(); + switch (operation) { + case ADD -> player.addDeltaMovement(new Vec3(x, y, z)); + case SET -> player.setDeltaMovement(new Vec3(x, y, z)); + case MULTIPLY -> player.addDeltaMovement(player.getDeltaMovement().multiply(x, y, z)); + } + } + + ); + } + public enum Operation { + SET, + ADD, + MULTIPLY + } +} + + diff --git a/src/main/resources/assets/leashedplayer/textures/painting/group_photo.png b/src/main/resources/assets/leashedplayer/textures/painting/group_photo.png new file mode 100644 index 0000000..14e9f92 Binary files /dev/null and b/src/main/resources/assets/leashedplayer/textures/painting/group_photo.png differ diff --git a/src/main/resources/leashedplayer.mixins.json b/src/main/resources/leashedplayer.mixins.json index 4021e04..aba28ef 100644 --- a/src/main/resources/leashedplayer.mixins.json +++ b/src/main/resources/leashedplayer.mixins.json @@ -5,6 +5,7 @@ "both.MixinLivingEntity", "both.MixinPlayer", "item.MixinLeadItem", + "registry.MixinPaintingVariants", "server.MixinServerGamePacketListenerImpl" ], "client": [ @@ -15,5 +16,6 @@ "refmap": "whimsicality.refmap.json", "required": true, "minVersion": "0.8", - "compatibilityLevel": "JAVA_17" + "compatibilityLevel": "JAVA_17", + "plugin": "com.r3944realms.leashedplayer.mixin.MixinPlugin" } \ No newline at end of file