From 3da99bc6f3e049d6eda9e446af2ccd7a64b099f4 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Wed, 4 Sep 2024 15:50:10 +0800 Subject: [PATCH] =?UTF-8?q?2024-09-04=20=E7=89=88=E6=9C=AC0.0.2.2=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0:=201.=20=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E4=BB=A4/lp=20leash=20data=E7=B3=BB=E5=88=97?= =?UTF-8?q?=202.=20=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=96=B0=E7=9A=84=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E8=A7=84=E5=88=99LP.CreateLeashFenceKnotEntityIfAbsen?= =?UTF-8?q?t=203.=E5=8A=A0=E5=85=A5=E4=BA=86=E6=9C=AC=E6=A8=A1=E7=B5=84?= =?UTF-8?q?=E7=9A=84logo=20=E4=BF=AE=E6=94=B9=E4=B8=8E=E8=B0=83=E6=95=B4?= =?UTF-8?q?=EF=BC=9A=201.=E8=B0=83=E6=95=B4=E4=BA=86=E5=8E=9F=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E9=83=A8=E5=88=86=E5=8F=AF=E8=83=BD=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E8=AF=AF=E8=A7=A3=E7=9A=84=E7=BF=BB=E8=AF=91=202.=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=AE=A9=E9=9D=9E=E7=8E=A9=E5=AE=B6=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=89=B5=E5=BC=95=E7=8E=A9=E5=AE=B6=E5=AE=9E=E4=BD=93=E6=97=B6?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=92=8C=E7=AC=AC=E4=BA=8C=E4=B8=89=E4=BA=BA?= =?UTF-8?q?=E7=A7=B0=E6=A0=93=E7=BB=B3=E8=83=BD=E8=A2=AB=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=203.=E7=B0=A1=E5=8C=96=E4=BA=86=E6=8C=87=E4=BB=A4=E5=90=8D=204?= =?UTF-8?q?.=E5=B0=87get=E6=8C=87=E4=BB=A4=E6=AC=8A=E9=99=90=E6=94=BE?= =?UTF-8?q?=E9=96=8B=EF=BC=8Cset=E6=8C=87=E4=BB=A4=E9=9C=802=E7=B4=9A?= =?UTF-8?q?=E5=8F=8A=E4=BB=A5=E4=B8=8A=E7=9A=84=E6=AC=8A=E9=99=90=E5=9F=B7?= =?UTF-8?q?=E8=A1=8C=20=E5=85=B7=E9=AB=94=E6=96=B0=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E8=AB=8B=E8=A6=8B=20README.md=20=E4=BB=8B=E7=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +- gradle.properties | 2 +- .../211976637bfb5e111401ad2bfb58570ef2fb3dff | 4 +- .../a1129211d3ad6d65c101bb152ae8c66c8256bccb | 4 +- .../ed628fd843215c1bf29a07b9cbd1b26a6af0636d | 4 +- .../assets/leashedplayer/lang/en_us.json | 19 +- .../assets/leashedplayer/lang/zh_cn.json | 19 +- .../assets/leashedplayer/lang/zh_tw.json | 19 +- .../leashedplayer/LeashedPlayer.java | 2 +- .../content/commands/LeashCommand.java | 234 ++++++++++++++++-- .../CreateLeashFenceKnotEntityIfAbsent.java | 25 ++ .../LanguageAndOtherData/ModLangKeyValue.java | 21 +- .../leashedplayer/mixin/both/MixinPlayer.java | 1 + .../mixin/client/MixinLevelRenderer.java | 28 +++ .../mixin/client/MixinPlayerRenderer.java | 26 ++ .../MixinServerGamePacketListenerImpl.java | 10 +- .../modInterface/PlayerLeashable.java | 65 +++++ .../resources/META-INF/neoforge.mods.toml | 6 +- src/main/resources/leashedplayerlogo.png | Bin 0 -> 67389 bytes 19 files changed, 446 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CreateLeashFenceKnotEntityIfAbsent.java create mode 100644 src/main/resources/leashedplayerlogo.png diff --git a/README.md b/README.md index 4c8fc16..397da02 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# 版本 0.0.2.2 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 ## 简介 现在开始你可以用拴绳栓住玩家,也可以栓住自己了,不如尝试栓住彼此来通关我的世界吧( @@ -11,10 +12,16 @@ ## 指令 -* `/lp leash length [<玩家>] setLength <长度> ` - 设置该玩家的拴绳长度 [ 如果<玩家>为空则代表执行对象是自己 ,<长度> 为在 5 ~ 1024之间的浮点数 ] +* `/lp leash length [<玩家>] set <长度> ` - 设置该玩家的拴绳长度 [ 如果<玩家>为空则代表执行对象是自己 ,<长度> 为在 5 ~ 1024之间的浮点数 ] -* `/lp leash length [<玩家>] [getLength]` - 获取该玩家的拴绳长度 [ 如果<玩家>为空则代表执行对象是自己 , [getLength] 可不写] +* `/lp leash length [<玩家>] [get]` - 顯示该玩家的拴绳长度 [ 如果<玩家>为空则代表执行对象是自己 , [get] 可不写] + +* `/lp leash data [<玩家>] set <實體>/<方塊坐標>` - 設置該玩家的的拴繩數據實體設置為<實體>/位於<方塊坐標>處的柵欄上的拴繩結實體 + +* `/lp leash data [<玩家>] [get]` - 顯示该玩家的拴绳數據 [ 如果<玩家>为空则代表执行对象是自己 , [get] 可不写] ## 游戏规则 -* `LP.TeleportWithLeashedPlayers` - 来决定被栓玩家是否在传送时能随拴绳持有者一起传送 [默认值: True] \ No newline at end of file +* `LP.TeleportWithLeashedPlayers` - 此規則啓用后, 被栓玩家將會随玩家拴绳持有者一起传送 [默认值: True] + +* `LP.CreateLeashFenceKnotEntityIfAbsent` - 此規則啓用后, 在設置 leashData 時,如果對應方塊坐標上的柵欄沒有拴繩結則會自動創建這個實體並綁定 [默认值: True] \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index be81186..b97bba6 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=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=0.0.1 +mod_version=0.0.2.2 # 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/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index a655a10..d39d5c3 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21 2024-09-03T17:46:39.9837977 Languages: en_us for mod: leashedplayer -d770cde6d74b269e8a0447edeb0a65668dda07d3 assets/leashedplayer/lang/en_us.json +// 1.21 2024-09-04T14:54:14.4635752 Languages: en_us for mod: leashedplayer +3e231f3b588ab61d2990c49bf1f1deca5593dbbf assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index 931b7fa..a8ab8f3 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21 2024-09-03T17:46:39.9827933 Languages: zh_cn for mod: leashedplayer -eb4dc9fdfece3e001d0f32abcad5de6b926b0a4d assets/leashedplayer/lang/zh_cn.json +// 1.21 2024-09-04T14:54:14.4585471 Languages: zh_cn for mod: leashedplayer +6db8ccbbd7d3bf13e819c2ae1762f37e2c332043 assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index d90dea0..77191da 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21 2024-09-03T17:46:39.9817953 Languages: zh_tw for mod: leashedplayer -0f4c1499f9241f8d8c33033dbcad397c4f3df5fa assets/leashedplayer/lang/zh_tw.json +// 1.21 2024-09-04T14:54:14.4535174 Languages: zh_tw for mod: leashedplayer +86fa3a80c53a50ad5af47129384e506cddda79aa 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 0d4184c..f629b5b 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -1,7 +1,16 @@ { - "gamerule.RWN.TeleportWithLeashedPlayers": "Teleport with leashed player", - "gamerule.RWN.TeleportWithLeashedPlayers.description": "You will teleport with your leashed players ", - "leashedplayer.command.leash.message.leash.length.fail": "Failed (Internal Error)", - "leashedplayer.command.leash.message.leash.length.set": "The Leash length of %s is set to %f blocks", - "leashedplayer.command.leash.message.leash.length.show": "The Leash Length of %s is %f blocks" + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "Create Leash Fence Knot Entity if absent", + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "Create LeashKnot Entity if it's absent on fence", + "gamerule.LP.TeleportWithLeashedPlayers": "Teleport leashed player with player holder", + "gamerule.LP.TeleportWithLeashedPlayers.description": "Holder will teleport with their leashed players ", + "leashedplayer.command.leash.message.leash.data.null": "%1$s has no LeashDataEntity", + "leashedplayer.command.leash.message.leash.data.show": "%1$s's LeashDataEntity is %2$s", + "leashedplayer.command.leash.message.leash.leash_data.set": "%1$s LeashDataEntity now is set as %2$s", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.diff_level": "%1$s and %2$s are not at a same level", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.forbid_same_entity": "Prohibit setting the same entity", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.no_knot_exist_in_that_pos": "No knot found at (X:%f,Y:%f,Z:%f)", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.too_far": "The distance between %1$s and %2$s is larger than the 1.2 times of LeashLength, LeashLength is %3$s blocks", + "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" } \ 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 35f62a5..c0a6909 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -1,7 +1,16 @@ { - "gamerule.RWN.TeleportWithLeashedPlayers": "传送被栓玩家", - "gamerule.RWN.TeleportWithLeashedPlayers.description": "传送时将被栓玩家与自己一起传送", - "leashedplayer.command.leash.message.leash.length.fail": "失败(内部错误)", - "leashedplayer.command.leash.message.leash.length.set": "%s的拴绳长度被设置为%f格", - "leashedplayer.command.leash.message.leash.length.show": "%s的拴绳长度为%f格" + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建栓绳结", + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在栅栏处缺失栓绳结,则创建它", + "gamerule.LP.TeleportWithLeashedPlayers": "被栓玩家随玩家持有者传送", + "gamerule.LP.TeleportWithLeashedPlayers.description": "传送时将被栓玩家与持有者一起传送", + "leashedplayer.command.leash.message.leash.data.null": "%1$s沒有拴绳数据实体", + "leashedplayer.command.leash.message.leash.data.show": "%1$s的拴绳数据实体为%2$s", + "leashedplayer.command.leash.message.leash.leash_data.set": "%1$s拴绳数据实体被设置为%2$s", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.diff_level": "%1$s和%2$s不在同一维度上", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.forbid_same_entity": "禁止设置同一实体", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.no_knot_exist_in_that_pos": "未找到栓绳结在(X:%f, Y:%f, Z:%f)处", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.too_far": "%1$s到%2$s的距离超过了1.2倍 栓绳长度,原长:%3$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格" } \ 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 1cc33af..567eba9 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -1,7 +1,16 @@ { - "gamerule.RWN.TeleportWithLeashedPlayers": "傳送被栓玩家", - "gamerule.RWN.TeleportWithLeashedPlayers.description": "傳送時將被栓玩家與隨自己一起傳送", - "leashedplayer.command.leash.message.leash.length.fail": "失敗(内部錯誤)", - "leashedplayer.command.leash.message.leash.length.set": "%s的栓繩長度被設置為%f格", - "leashedplayer.command.leash.message.leash.length.show": "%s的栓繩長度為%f格" + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建栓繩結", + "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在柵欄処缺失拴繩結,則創建它", + "gamerule.LP.TeleportWithLeashedPlayers": "被栓玩家随玩家持有者傳送", + "gamerule.LP.TeleportWithLeashedPlayers.description": "將被栓玩家將隨持有者一起傳送", + "leashedplayer.command.leash.message.leash.data.null": "%1$s沒有栓繩數據實體", + "leashedplayer.command.leash.message.leash.data.show": "%1$s栓繩數據實體為%2$s", + "leashedplayer.command.leash.message.leash.leash_data.set": "%1$s栓繩數據實體設置為%2$s", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.diff_level": "%1$s和%2$s不在同一緯度上", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.forbid_same_entity": "禁止設置同一實體", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.no_knot_exist_in_that_pos": "未找到栓繩結在(X:%f, Y:%f, Z:%f)処", + "leashedplayer.command.leash.message.leash.leash_data.set.failed.too_far": "%1$s到%2$s的距離超過了1.2倍栓繩長度,原長:%3$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格" } \ No newline at end of file diff --git a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java index 17bea37..c23c73b 100644 --- a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java @@ -1,7 +1,7 @@ package com.r3944realms.leashedplayer; import net.neoforged.fml.common.Mod; -//TODO: 13:40 + @Mod(LeashedPlayer.MOD_ID) public class LeashedPlayer { public static final String MOD_ID = "leashedplayer"; 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 93477eb..412d302 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java @@ -5,19 +5,40 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry; +import com.r3944realms.leashedplayer.content.gamerules.Server.CreateLeashFenceKnotEntityIfAbsent; import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Leashable; +import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; +import org.jetbrains.annotations.Nullable; public class LeashCommand { private final static String LEASHEDPLAYER_LEASH_MESSAGE_ = "leashedplayer.command.leash.message."; - public final static String LEASH_LENGTH_SHOW = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.show", - LEASH_LENGTH_FAIL = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.fail", - LEASH_LENGTH_SET = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.set"; + public final static String LEASH_FAILED = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.failed", + LEASH_LENGTH_SHOW = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.show", + LEASH_LENGTH_SET = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.length.set", + NO_LEASH_DATA = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.data.null", + LEASH_DATA_SHOW = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.data.show", + LEASH_DATA_SET = LEASHEDPLAYER_LEASH_MESSAGE_ + "leash.leash_data.set", + LEASH_DATA_SET_FAILED_DIFF_LEVEL = LEASH_DATA_SET + ".failed.diff_level", + LEASH_DATA_SET_FAILED_TOO_FAR = LEASH_DATA_SET + ".failed.too_far", + LEASH_DATA_SET_FAILED_NO_KNOT_EXISTED_IN_THAT_POS = LEASH_DATA_SET + ".failed.no_knot_exist_in_that_pos", + LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY = LEASH_DATA_SET + ".failed.forbid_same_entity"; + public static void register(CommandDispatcher dispatcher) { LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); Command getSelfLeashLength = context -> { @@ -25,9 +46,9 @@ public class LeashCommand { try { ServerPlayer player = source.getPlayerOrException(); float leashLength = ((ILivingEntityExtension)player).getLeashLength(); - source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SHOW, player.getName(), leashLength), true); + source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SHOW, player.getDisplayName(), leashLength), true); } catch (Exception e) { - source.sendFailure(Component.translatable(LEASH_LENGTH_FAIL)); + source.sendFailure(Component.translatable(LEASH_FAILED)); return -1; } return 0; @@ -37,9 +58,9 @@ public class LeashCommand { try { ServerPlayer player = EntityArgument.getPlayer(context, "player"); float leashLength = ((ILivingEntityExtension)player).getLeashLength(); - source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SHOW, player.getName(), leashLength), true); + source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SHOW, player.getDisplayName(), leashLength), true); } catch (Exception e) { - source.sendFailure(Component.translatable(LEASH_LENGTH_FAIL)); + source.sendFailure(Component.translatable(LEASH_FAILED)); return -1; } return 0; @@ -50,9 +71,9 @@ public class LeashCommand { ServerPlayer player = source.getPlayerOrException(); float leashLength = context.getArgument("leashLength", Float.class); ((ILivingEntityExtension)player).setLeashLength(leashLength); - source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SET, player.getName(), leashLength), true); + source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SET, player.getDisplayName(), leashLength), true); } catch (Exception e) { - source.sendFailure(Component.translatable(LEASH_LENGTH_FAIL)); + source.sendFailure(Component.translatable(LEASH_FAILED)); return -1; } return 0; @@ -60,22 +81,102 @@ public class LeashCommand { Command setLengthLeashLength = context -> { CommandSourceStack source = context.getSource(); try { -// Player player = context.getArgument("player", Player.class); ServerPlayer player = EntityArgument.getPlayer(context, "player"); float leashLength = context.getArgument("leashLength", Float.class); ((ILivingEntityExtension)player).setLeashLength(leashLength); - source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SET, player.getName(), leashLength), true); + source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SET, player.getDisplayName(), leashLength), true); } catch (Exception e) { - source.sendFailure(Component.translatable(LEASH_LENGTH_FAIL)); + source.sendFailure(Component.translatable(LEASH_FAILED)); return -1; } return 0; }; - LiteralArgumentBuilder $$leashRoot = Commands.literal("leash").requires(cs -> cs.hasPermission(2)); + //获取Data 构造一个MutableComponent显示数据 + Command geSelfLeashData = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = source.getPlayerOrException(); + Integer x = LeashLengthResultInt(player, source); + if (x != null) return x; + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + + Command getRefPlayerLeashData = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = EntityArgument.getPlayer(context, "targetPlayer"); + Integer x = LeashLengthResultInt(player, source); + if (x != null) return x; + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + //设置前要判断其实体距离(同一维度,且距离不得大于其绳长的1.2倍(待定,也许可以设置在配置文件里) + Command setSelfLeashDataEntity = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = source.getPlayerOrException(); + Integer x = LeashDataEntityResultInt(context, player, source); + if (x != null) return x; + + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + Command setSelfLeashDataByBlockPos = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = source.getPlayerOrException(); + Integer x = LeashDataBlockPosResultInt(context, source, player); + if (x != null) return x; + + + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + + Command setRefPlayerLeashDataEntity = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = EntityArgument.getPlayer(context, "targetPlayer"); + Integer x = LeashDataEntityResultInt(context, player, source); + if (x != null) return x; + + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + Command setRefPlayerLeashDataByBlockPos = context -> { + CommandSourceStack source = context.getSource(); + try { + ServerPlayer player = EntityArgument.getPlayer(context, "targetPlayer"); + Integer x = LeashDataBlockPosResultInt(context, source, player); + if (x != null) return x; + + } catch (Exception e) { + source.sendFailure(Component.translatable(LEASH_FAILED)); + return -1; + } + return 0; + }; + LiteralArgumentBuilder $$leashRoot = Commands.literal("leash"); literalArgumentBuilder.then( $$leashRoot.then(Commands.literal("length").executes(getSelfLeashLength) - .then(Commands.literal("getLength").executes(getSelfLeashLength)) - .then(Commands.literal("setLength") + .then(Commands.literal("get").executes(getSelfLeashLength)) + .then(Commands.literal("set").requires(cs -> cs.hasPermission(2)) .then(Commands.argument("leashLength", FloatArgumentType.floatArg(5, 1024)).executes(setSelfLengthLeashLength) ) ) @@ -85,8 +186,8 @@ public class LeashCommand { $$leashRoot.then( Commands.literal("length") .then(Commands.argument("player", EntityArgument.player()).executes(getRefPlayerLeashLength) - .then(Commands.literal("getLength").executes(getRefPlayerLeashLength)) - .then(Commands.literal("setLength") + .then(Commands.literal("get").executes(getRefPlayerLeashLength)) + .then(Commands.literal("set").requires(cs -> cs.hasPermission(2)) .then( Commands.argument("leashLength", FloatArgumentType.floatArg(5, 1024)).executes(setLengthLeashLength) ) @@ -95,7 +196,106 @@ public class LeashCommand { ) + ); + literalArgumentBuilder.then( + $$leashRoot.then( + Commands.literal("data") + .then(Commands.argument("targetPlayer", EntityArgument.player()).executes(getRefPlayerLeashData) + .then(Commands.literal("get") + .executes(getRefPlayerLeashData) + ) + .then(Commands.literal("set").requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("holderEntity", EntityArgument.entity()) + .executes(setRefPlayerLeashDataEntity) + ) + .then(Commands.argument("BlockPos", BlockPosArgument.blockPos()) + .executes(setRefPlayerLeashDataByBlockPos) + ) + ) + ) + ) + ); + literalArgumentBuilder.then( + $$leashRoot.then( + Commands.literal("data") + .then(Commands.literal("get") + .executes(geSelfLeashData) + ) + .then(Commands.literal("set").requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("holderEntity", EntityArgument.entity()) + .executes(setSelfLeashDataEntity) + ) + .then(Commands.argument("BlockPos", BlockPosArgument.blockPos()) + .executes(setSelfLeashDataByBlockPos) + ) + ) + ) ); dispatcher.register(literalArgumentBuilder); } + + private static @Nullable Integer LeashLengthResultInt(ServerPlayer player, CommandSourceStack source) throws Exception { + Leashable.LeashData leashDataFromEntityData = ((PlayerLeashable) player).getLeashDataFromEntityData(); + + if(leashDataFromEntityData == null) { + source.sendSuccess(() -> Component.translatable(NO_LEASH_DATA, player.getDisplayName()), true); + return 1; + } else { + Entity leashDataEntity = PlayerLeashable.getLeashDataEntityOrThrown(leashDataFromEntityData, source.getLevel()); + source.sendSuccess(() -> Component.translatable(LEASH_DATA_SHOW, player.getDisplayName(), leashDataEntity.getDisplayName()), true); + } + return null; + } + + private static @Nullable Integer LeashDataBlockPosResultInt(CommandContext context, CommandSourceStack source, ServerPlayer player) { + BlockPos blockPos = BlockPosArgument.getBlockPos(context, "BlockPos"); + Entity leashDataEntity = PlayerLeashable.getLeashFenceKnotEntity(source.getLevel(), blockPos); + PlayerLeashable leashedPlayer = (PlayerLeashable) player; + Component targetPlayerDisplayName = player.getDisplayName(); + if(leashDataEntity == null) { + ServerLevel level = context.getSource().getLevel(); + if(GameruleRegistry.getGameruleBoolValue(level,CreateLeashFenceKnotEntityIfAbsent.ID)) { + if(level.getBlockState(blockPos).is(BlockTags.FENCES)) { + Entity leashKnotFence = PlayerLeashable.createLeashKnotFence(level, blockPos); + leashedPlayer.setLeashedTo(leashKnotFence, true); + source.sendSuccess(() -> Component.translatable(LEASH_DATA_SET, targetPlayerDisplayName, leashKnotFence.getDisplayName()), true); + return null; + } + } + source.sendFailure(Component.translatable(LEASH_DATA_SET_FAILED_NO_KNOT_EXISTED_IN_THAT_POS, blockPos.getX(), blockPos.getY(), blockPos.getZ())); + return 1; + } + Component leashDataEntityDisplayName = leashDataEntity.getDisplayName(); + + return LeashDataCommonPartResultInt(source, player, leashDataEntity, leashedPlayer, targetPlayerDisplayName, leashDataEntityDisplayName); + } + + private static @Nullable Integer LeashDataEntityResultInt(CommandContext context, ServerPlayer player, CommandSourceStack source) throws CommandSyntaxException { + Entity leashDataEntity = EntityArgument.getEntity(context, "holderEntity"); + PlayerLeashable leashedPlayer = (PlayerLeashable) player; + Component targetPlayerDisplayName = player.getDisplayName(); + Component leashDataEntityDisplayName = leashDataEntity.getDisplayName(); + if(player.equals(leashDataEntity)) { + source.sendFailure(Component.translatable(LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY)); + return 1; + } + return LeashDataCommonPartResultInt(source, player, leashDataEntity, leashedPlayer, targetPlayerDisplayName, leashDataEntityDisplayName); + } + + private static @Nullable Integer LeashDataCommonPartResultInt(CommandSourceStack source, ServerPlayer player, Entity leashDataEntity, PlayerLeashable leashedPlayer, Component targetPlayerDisplayName, Component leashDataEntityDisplayName) { + if(player.level() != leashDataEntity.level()) { + source.sendFailure(Component.translatable(LEASH_DATA_SET_FAILED_DIFF_LEVEL, targetPlayerDisplayName, leashDataEntityDisplayName)); + return 2; + } + ILivingEntityExtension targetPlayerExtension = (ILivingEntityExtension) player; + if (player.distanceTo(leashDataEntity) > targetPlayerExtension.getLeashLength() * 1.2f) { + source.sendFailure(Component.translatable(LEASH_DATA_SET_FAILED_TOO_FAR, targetPlayerDisplayName, leashDataEntityDisplayName, targetPlayerExtension.getLeashLength())); + return 3; + } + leashedPlayer.setLeashedTo(leashDataEntity, true); + source.sendSuccess(() -> Component.translatable(LEASH_DATA_SET, targetPlayerDisplayName, leashDataEntityDisplayName), true); + return null; + } + + } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CreateLeashFenceKnotEntityIfAbsent.java b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CreateLeashFenceKnotEntityIfAbsent.java new file mode 100644 index 0000000..cd1a8a6 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CreateLeashFenceKnotEntityIfAbsent.java @@ -0,0 +1,25 @@ +package com.r3944realms.leashedplayer.content.gamerules.Server; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.content.gamerules.Gamerules; +import com.r3944realms.leashedplayer.utils.Util; +import net.minecraft.world.level.GameRules; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; + +import static com.r3944realms.leashedplayer.content.gamerules.Gamerules.GAMERULE_REGISTRY; + +@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD) +public class CreateLeashFenceKnotEntityIfAbsent { + public static final boolean DEFAULT_VALUE = true; + public static final String ID = Util.getGameruleName(CreateLeashFenceKnotEntityIfAbsent.class); + public static final String DESCRIPTION_KEY = Gamerules.getDescriptionKey(CreateLeashFenceKnotEntityIfAbsent.class); + public static final String NAME_KEY = Gamerules.getNameKey(CreateLeashFenceKnotEntityIfAbsent.class); + public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER; + + @SubscribeEvent + public static void onCommonSetup(final FMLCommonSetupEvent event) { + GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE); + } +} 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 9e44c44..da8b418 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.gamerules.Server.CreateLeashFenceKnotEntityIfAbsent; import com.r3944realms.leashedplayer.content.gamerules.Server.TeleportWithLeashedPlayers; import com.r3944realms.leashedplayer.utils.Enum.LanguageEnum; import com.r3944realms.leashedplayer.utils.Enum.ModPartEnum; @@ -13,13 +14,23 @@ import java.util.function.Supplier; public enum ModLangKeyValue { //COMMAND_MESSAGE - MESSAGE_LEASH_LENGTH_FAIL(LeashCommand.LEASH_LENGTH_FAIL, ModPartEnum.COMMAND, "Failed (Internal Error)", "失败(内部错误)", "失敗(内部錯誤)", false), - MESSAGE_LEASH_LENGTH_SHOW(LeashCommand.LEASH_LENGTH_SHOW, ModPartEnum.COMMAND, "The Leash Length of %s is %f blocks", "%s的拴绳长度为%f格", "%s的栓繩長度為%f格" , false), - MESSAGE_LEASH_LENGTH_SET(LeashCommand.LEASH_LENGTH_SET, ModPartEnum.COMMAND, "The Leash length of %s is set to %f blocks", "%s的拴绳长度被设置为%f格", "%s的栓繩長度被設置為%f格" , false), + MESSAGE_LEASH_LENGTH_FAILED(LeashCommand.LEASH_FAILED, ModPartEnum.COMMAND, "Failed (Internal Error, maybe your command is incorrect)", "失败(内部错误,可能是你输的指令有误)", "失敗(内部錯誤,,可能你輸入的指令有誤)", false), + MESSAGE_LEASH_LENGTH_SHOW(LeashCommand.LEASH_LENGTH_SHOW, ModPartEnum.COMMAND, "The Leash Length of %1$s is %2$s blocks", "%1$s的拴绳长度为%2$s格", "%1$s的栓繩長度為%2$s格" , false), + MESSAGE_LEASH_LENGTH_SET(LeashCommand.LEASH_LENGTH_SET, ModPartEnum.COMMAND, "The Leash length of %1$s is set to %2$s blocks", "%1$s的拴绳长度被设置为%2$s格", "%1$s的栓繩長度被設置為%2$s格" , false), + MESSAGE_LEASH_GET_LEASH_DATA(LeashCommand.LEASH_DATA_SHOW, ModPartEnum.COMMAND, "%1$s's LeashDataEntity is %2$s", "%1$s的拴绳数据实体为%2$s", "%1$s栓繩數據實體為%2$s",false), + MESSAGE_LEASH_NO_LEASH_DATA(LeashCommand.NO_LEASH_DATA, ModPartEnum.COMMAND, "%1$s has no LeashDataEntity", "%1$s沒有拴绳数据实体", "%1$s沒有栓繩數據實體", false), + MESSAGE_LEASH_SET_LEASH_DATA(LeashCommand.LEASH_DATA_SET, ModPartEnum.COMMAND, "%1$s LeashDataEntity now is set as %2$s", "%1$s拴绳数据实体被设置为%2$s", "%1$s栓繩數據實體設置為%2$s", false), + MESSAGE_LEASH_SET_FAILED_DIFF_LEVEL(LeashCommand.LEASH_DATA_SET_FAILED_DIFF_LEVEL, ModPartEnum.COMMAND,"%1$s and %2$s are not at a same level", "%1$s和%2$s不在同一维度上", "%1$s和%2$s不在同一緯度上", false), + MESSAGE_LEASH_SET_FAILED_TOO_FAR(LeashCommand.LEASH_DATA_SET_FAILED_TOO_FAR, ModPartEnum.COMMAND,"The distance between %1$s and %2$s is larger than the 1.2 times of LeashLength, LeashLength is %3$s blocks", "%1$s到%2$s的距离超过了1.2倍 栓绳长度,原长:%3$s 格", "%1$s到%2$s的距離超過了1.2倍栓繩長度,原長:%3$s 格", false), + MESSAGE_LEASH_SET_FAILED_NO_KNOT_EXIST_IN_THAT_POS(LeashCommand.LEASH_DATA_SET_FAILED_NO_KNOT_EXISTED_IN_THAT_POS, ModPartEnum.COMMAND, "No knot found at (X:%f,Y:%f,Z:%f)", "未找到栓绳结在(X:%f, Y:%f, Z:%f)处", "未找到栓繩結在(X:%f, Y:%f, Z:%f)処", false), + MESSAGE_LEASH_SET_FAILED_FORBID_SAME_ENTITY(LeashCommand.LEASH_DATA_SET_FAILED_FORBID_SAME_ENTITY, ModPartEnum.COMMAND, "Prohibit setting the same entity","禁止设置同一实体", "禁止設置同一實體", false), //GAME_RULE_NAME - TELEPORT_WITH_LEASHED_PLAYERS(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport with leashed player", "传送被栓玩家", "傳送被栓玩家" ,false), + 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), //GAME_RULE_DESCRIPTION - TELEPORT_WITH_LEASHED_DESCRIPTION(TeleportWithLeashedPlayers.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "You will teleport with your leashed players ", "传送时将被栓玩家与自己一起传送", "傳送時將被栓玩家與隨自己一起傳送" ,false), + TELEPORT_WITH_LEASHED_DESCRIPTION(TeleportWithLeashedPlayers.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Holder will teleport with their leashed players ", "传送时将被栓玩家与持有者一起传送", "將被栓玩家將隨持有者一起傳送" ,false), + CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT_DESCRIPTION(CreateLeashFenceKnotEntityIfAbsent.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Create LeashKnot Entity if it's absent on fence", "如果在栅栏处缺失栓绳结,则创建它", "如果在柵欄処缺失拴繩結,則創建它",false), + ; private final Supplier supplier; private String key; diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java index f514510..c55faa0 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java @@ -213,6 +213,7 @@ public abstract class MixinPlayer extends LivingEntity implements PlayerLeashabl private void saveLeashData(@org.jetbrains.annotations.Nullable LeashData pLeashData) { CompoundTag compoundTag = new CompoundTag(); this.writeLeashData(compoundTag, pLeashData); + this.entityData.set(Pl$LEASH_DATA, compoundTag); } @SuppressWarnings("AddedMixinMembersNamePattern") diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinLevelRenderer.java b/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinLevelRenderer.java index 294b058..1badcb3 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinLevelRenderer.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinLevelRenderer.java @@ -2,6 +2,7 @@ package com.r3944realms.leashedplayer.mixin.client; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.datafixers.util.Either; +import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; import com.r3944realms.leashedplayer.modInterface.IPlayerRendererExtension; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.client.Camera; @@ -12,11 +13,13 @@ import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Leashable; import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; @@ -27,6 +30,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; +import java.util.List; import java.util.UUID; @Mixin(LevelRenderer.class) @@ -83,9 +87,33 @@ public abstract class MixinLevelRenderer { playerRendererExtension.renderLeashForCamera(pCamera, partialTickTime, poseStack, multibuffersource$buffersource, LeashFenceKnotEntity.getOrCreateKnot(level, delayedLeashInfo.right().get())); } else if (delayedLeashInfo.right().isEmpty() && delayedLeashInfo.left().isPresent()) { assert level != null; + Player playerByUUID = level.getPlayerByUUID(delayedLeashInfo.left().get()); if (playerByUUID != null) { playerRendererExtension.renderLeashForCamera(pCamera, partialTickTime, poseStack, multibuffersource$buffersource, playerByUUID); + } else { + float MaxLeashLength = ((ILivingEntityExtension) abstractClientPlayer).getLeashLength() * 2f; + List entities = level.getEntities( + null, + new AABB( + abstractClientPlayer.getX() - MaxLeashLength, + abstractClientPlayer.getY() - MaxLeashLength, + abstractClientPlayer.getZ() - MaxLeashLength, + abstractClientPlayer.getX() + MaxLeashLength, + abstractClientPlayer.getY() + MaxLeashLength, + abstractClientPlayer.getZ() + MaxLeashLength + ) + ); + Entity holder = null; + for (Entity entity_ : entities) { + if(entity_.getUUID().equals(delayedLeashInfo.left().get())) { + holder = entity_; + break; + } + } + if (holder != null) { + playerRendererExtension.renderLeashForCamera(pCamera, partialTickTime, poseStack, multibuffersource$buffersource, holder); + } } } } diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinPlayerRenderer.java b/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinPlayerRenderer.java index 2783caf..a5ba5bc 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinPlayerRenderer.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/client/MixinPlayerRenderer.java @@ -3,6 +3,7 @@ package com.r3944realms.leashedplayer.mixin.client; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.datafixers.util.Either; +import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; import com.r3944realms.leashedplayer.modInterface.IPlayerRendererExtension; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.client.Camera; @@ -22,6 +23,7 @@ import net.minecraft.world.entity.Leashable; import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LightLayer; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; @@ -30,6 +32,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.List; import java.util.UUID; @Mixin(PlayerRenderer.class) @@ -57,6 +60,29 @@ public abstract class MixinPlayerRenderer extends LivingEntityRenderer entities = level.getEntities( + null, + new AABB( + pEntity.getX() - MaxLeashLength, + pEntity.getY() - MaxLeashLength, + pEntity.getZ() - MaxLeashLength, + pEntity.getX() + MaxLeashLength, + pEntity.getY() + MaxLeashLength, + pEntity.getZ() + MaxLeashLength + ) + ); + Entity holder = null; + for (Entity entity_ : entities) { + if(entity_.getUUID().equals(delayedLeashInfo.left().get())) { + holder = entity_; + break; + } + } + if (holder != null) { + renderLeash(pEntity, pPartialTicks, pPoseStack, pBuffer, holder); + } } } } diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java b/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java index 5dac58c..44fc5bf 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/server/MixinServerGamePacketListenerImpl.java @@ -24,12 +24,12 @@ public class MixinServerGamePacketListenerImpl { @Shadow public ServerPlayer player; @Unique - private List Whimsy$LeashPlayers = new ArrayList<>(); + private List Pl$LeashPlayers = new ArrayList<>(); @Inject(method = {"teleport(DDDFFLjava/util/Set;)V"}, at = {@At("HEAD")}) private void teleportHead(double pX, double pY, double pZ, float pYaw, float pPitch, Set pRelativeSet, CallbackInfo ci) { try { //獲取Holder - this.Whimsy$LeashPlayers = ((PlayerLeashable)this.player).getLeashHolder() != null ? Collections.emptyList() : Objects.requireNonNull(this.player.getServer()).getPlayerList().getPlayers().stream().filter(serverPlayer -> (serverPlayer instanceof PlayerLeashable) && ((PlayerLeashable)serverPlayer).getLeashHolder() == this.player && player != serverPlayer).collect(Collectors.toList()); + this.Pl$LeashPlayers = ((PlayerLeashable)this.player).getLeashHolder() != null ? Collections.emptyList() : Objects.requireNonNull(this.player.getServer()).getPlayerList().getPlayers().stream().filter(serverPlayer -> (serverPlayer instanceof PlayerLeashable) && ((PlayerLeashable)serverPlayer).getLeashHolder() == this.player && player != serverPlayer).collect(Collectors.toList()); } catch (Exception e) { logger.error("Internal Error:",e); } @@ -37,9 +37,9 @@ public class MixinServerGamePacketListenerImpl { @Inject(method = {"teleport(DDDFFLjava/util/Set;)V"}, at = {@At("TAIL")}) private void teleportTail(double pX, double pY, double pZ, float pYaw, float pPitch, Set pRelativeSet, CallbackInfo ci) { if(GameruleRegistry.getGameruleBoolValue(this.player.serverLevel(), TeleportWithLeashedPlayers.ID)) { - for (Entity whimsy$LeashPlayer : this.Whimsy$LeashPlayers) { - if(whimsy$LeashPlayer instanceof ServerPlayer) { - if(whimsy$LeashPlayer instanceof PlayerLeashable playerLeashable) { + for (Entity Pl$LeashPlayer : this.Pl$LeashPlayers) { + if(Pl$LeashPlayer instanceof ServerPlayer) { + if(Pl$LeashPlayer instanceof PlayerLeashable playerLeashable) { playerLeashable.dropLeash(false,false); if(((ServerPlayer) playerLeashable).serverLevel() == this.player.serverLevel()) { ((ServerPlayer) playerLeashable).connection.teleport(pX, pY, pZ, pYaw, pPitch, pRelativeSet); diff --git a/src/main/java/com/r3944realms/leashedplayer/modInterface/PlayerLeashable.java b/src/main/java/com/r3944realms/leashedplayer/modInterface/PlayerLeashable.java index 15f0830..0d21fad 100644 --- a/src/main/java/com/r3944realms/leashedplayer/modInterface/PlayerLeashable.java +++ b/src/main/java/com/r3944realms/leashedplayer/modInterface/PlayerLeashable.java @@ -1,13 +1,18 @@ package com.r3944realms.leashedplayer.modInterface; +import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Leashable; +import net.minecraft.world.entity.decoration.LeashFenceKnotEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.util.Optional; +import java.util.UUID; public interface PlayerLeashable extends Leashable { @@ -51,4 +56,64 @@ public interface PlayerLeashable extends Leashable { //这边覆写去掉了乘坐相关的逻辑,即乘坐状态下也可以正常被栓住,不影响其乘坐状态 } + static Entity getLeashDataEntityOrThrown(@NotNull Leashable.LeashData leashDataFromEntityData, @NotNull ServerLevel level) throws Exception { + if(leashDataFromEntityData.delayedLeashInfo != null) { + Optional UUID = leashDataFromEntityData.delayedLeashInfo.left(); + Optional BlockPos = leashDataFromEntityData.delayedLeashInfo.right(); + if (UUID.isPresent()) { + return level.getEntity(UUID.get()); + } else if(BlockPos.isPresent()) { + return LeashFenceKnotEntity.getOrCreateKnot(level, BlockPos.get()); + } else { + throw new Exception("invalid delayedLeashInfo"); + } + } + else if(leashDataFromEntityData.leashHolder != null) { + return leashDataFromEntityData.leashHolder; + } + else if(leashDataFromEntityData.delayedLeashHolderId != 0) { + Entity entity = level.getEntity(leashDataFromEntityData.delayedLeashHolderId); + if(entity == null) { + throw new Exception("Not found Entity. maybe the pId is invalid"); + } + return entity; + } + else { + throw new Exception("invalid leash data"); + } + } + static boolean isLeashFenceKnotEntityExisted(ServerLevel pLevel, BlockPos pPos) { + int i = pPos.getX(); + int j = pPos.getY(); + int k = pPos.getZ(); + + for (LeashFenceKnotEntity leashfenceknotentity : pLevel.getEntitiesOfClass( + LeashFenceKnotEntity.class, new AABB((double)i - 1.0, (double)j - 1.0, (double)k - 1.0, (double)i + 1.0, (double)j + 1.0, (double)k + 1.0) + )) { + if (leashfenceknotentity.getPos().equals(pPos)) { + return true; + } + } + return false; + } + @Nullable + static Entity getLeashFenceKnotEntity(ServerLevel pLevel, BlockPos pPos) { + int i = pPos.getX(); + int j = pPos.getY(); + int k = pPos.getZ(); + + for (LeashFenceKnotEntity leashfenceknotentity : pLevel.getEntitiesOfClass( + LeashFenceKnotEntity.class, new AABB((double)i - 1.0, (double)j - 1.0, (double)k - 1.0, (double)i + 1.0, (double)j + 1.0, (double)k + 1.0) + )) { + if (leashfenceknotentity.getPos().equals(pPos)) { + return leashfenceknotentity; + } + } + return null; + } + static Entity createLeashKnotFence(ServerLevel pLevel, BlockPos pPos) { + LeashFenceKnotEntity leashfenceknotentity = new LeashFenceKnotEntity(pLevel, pPos); + pLevel.addFreshEntity(leashfenceknotentity); + return leashfenceknotentity; + } } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index a7fedad..db4e426 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -14,7 +14,7 @@ loaderVersion="${loader_version_range}" #mandatory license="${mod_license}" # A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +issueTrackerURL="https://github.com/3944Realms/R39_Whimsy_NeoForgeModProject_Sub/issues" #optional # A list of mods - how many allowed here is determined by the individual mod loader [[mods]] #mandatory @@ -32,10 +32,10 @@ displayName="${mod_name}" #mandatory #updateJSONURL="https://change.me.example.invalid/updates.json" #optional # A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional +displayURL="https://github.com/3944Realms/R39_Whimsy_NeoForgeModProject_Sub" #optional # A file name (in the root of the mod JAR) containing a logo for display -#logoFile="examplemod.png" #optional +logoFile= "leashedplayerlogo.png" #optional # A text field displayed in the mod UI #credits="" #optional diff --git a/src/main/resources/leashedplayerlogo.png b/src/main/resources/leashedplayerlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..7756ae293c88a6017c2e18214150b636fcbe7da8 GIT binary patch literal 67389 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 z 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%0A@&O9(XVhBw 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 literal 0 HcmV?d00001