From 800a60ab97bfabb6910c0a870fd0f54b1796bb38 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Wed, 27 Nov 2024 00:25:37 +0800 Subject: [PATCH] =?UTF-8?q?2024/11/26=20=E8=81=94=E5=8A=A8=E5=86=85?= =?UTF-8?q?=E5=AE=B9#3=20=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9B=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=86=85=E5=AE=B9=20=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=8C=89=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../211976637bfb5e111401ad2bfb58570ef2fb3dff | 4 +- .../a1129211d3ad6d65c101bb152ae8c66c8256bccb | 4 +- .../ed628fd843215c1bf29a07b9cbd1b26a6af0636d | 4 +- .../assets/leashedplayer/lang/en_us.json | 5 ++ .../assets/leashedplayer/lang/zh_cn.json | 5 ++ .../assets/leashedplayer/lang/zh_tw.json | 5 ++ .../leashedplayer/ClientEventHandler.java | 54 ++++++++++++++++- .../leashedplayer/CommonEventHandler.java | 1 - .../leashedplayer/LeashedPlayer.java | 14 +++++ .../LanguageAndOtherData/ModLangKeyValue.java | 8 +++ .../leashedplayer/mixin/both/MixinPlayer.java | 2 +- .../network/LeashedPlayerNetwork.java | 12 ++++ .../leashedplayer/network/server/Code.java | 8 +++ .../server/DecreaseLeashRopeLength.java | 59 ++++++++++++++++++ .../server/IncreaseLeashRopeLength.java | 60 +++++++++++++++++++ .../r3944realms/leashedplayer/utils/Util.java | 39 +++++++++++- 16 files changed, 272 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/r3944realms/leashedplayer/network/server/Code.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/network/server/DecreaseLeashRopeLength.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/network/server/IncreaseLeashRopeLength.java diff --git a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index 0e215dc..62015f2 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21 2024-11-26T17:09:48.5933988 Languages: en_us for mod: leashedplayer -57ac9ce831572aed1cf8738231d163e08de00da8 assets/leashedplayer/lang/en_us.json +// 1.21 2024-11-27T00:15:38.1934553 Languages: en_us for mod: leashedplayer +d32d19599105d6c5575757a7f0344f066445bd15 assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index 3ff063d..91c2867 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21 2024-11-26T17:09:48.5933988 Languages: zh_cn for mod: leashedplayer -3920364b756e9b539f175e6ac73a363020a232dd assets/leashedplayer/lang/zh_cn.json +// 1.21 2024-11-27T00:15:38.1929375 Languages: zh_cn for mod: leashedplayer +be8f599c80c4ea7e7f6de238f6acf213fe9827d2 assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index 40dd397..ed95c5f 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21 2024-11-26T17:09:48.5933988 Languages: zh_tw for mod: leashedplayer -08058702caab57d64d479cf22d4b5c1e10c4110d assets/leashedplayer/lang/zh_tw.json +// 1.21 2024-11-27T00:15:38.1846441 Languages: zh_tw for mod: leashedplayer +73006b0556ae8066c61837a9ff35a1b50126f510 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 ad24ad5..3d79d0d 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -99,6 +99,11 @@ "leashedplayer.lead_breaker.item.desc": "§7can break the link of leash", "leashedplayer.lead_breaker.item.use_fai": "§cFailed to break §f%1$s§c 's Leashed Link to §f%2$s", "leashedplayer.lead_breaker.item.use_suf": "§aSuccessfully break §f%1$s§a 's Leashed Link to §f%2$s ", + "leashedplayer.leash_rope.length.decrease": "§Decrease the §f%s §cLength of Leash Rope§7(§bLength§7:§e%d§7)", + "leashedplayer.leash_rope.length.decrease.self": "§cDecrease the Length of Leash Rope§7(§bLength§7:§e%d§7)", + "leashedplayer.leash_rope.length.failed": "§cFailed", + "leashedplayer.leash_rope.length.increase": "§aIncrease the §f%s §aLength of Leash Rope§7(§bLength§7:§e%d§7)", + "leashedplayer.leash_rope.length.increase.self": "§aIncrease the Length of Leash Rope§7(§bLength§7:§e%d§7)", "leashedplayer.leash_rope_arrow.try_to_pickup.push_shift_tip": "§aPush §f§lShift§a to pick up quickly", "multiplayer.disconnect.addiction": "You've triggered the anti-addiction mechanic, and you'll come back when you rest!", "painting.leashedplayer.group_photo.author": "§9Leisure §4Time §eDock§r", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json index 9633a34..38978e9 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -99,6 +99,11 @@ "leashedplayer.lead_breaker.item.desc": "§7可以破坏拴绳链接", "leashedplayer.lead_breaker.item.use_fai": "§c无法剪断§f%2$s§c对§f%1$s§c拴绳链接", "leashedplayer.lead_breaker.item.use_suf": "§a成功剪断§f%2$s§a对§f%1$s§a拴绳链接", + "leashedplayer.leash_rope.length.decrease": "§c减少§f%s的拴绳长度§c§7(§b长度§7:§e%d§7)", + "leashedplayer.leash_rope.length.decrease.self": "§c减少拴绳长度§c§7(§b长度§7:§e%d§7)", + "leashedplayer.leash_rope.length.failed": "§c失败", + "leashedplayer.leash_rope.length.increase": "§a增加§f%s的拴绳长度§a§7(§b长度§7:§e%d§7)", + "leashedplayer.leash_rope.length.increase.self": "§a增加拴绳长度§a§7(§b长度§7:§e%d§7)", "leashedplayer.leash_rope_arrow.try_to_pickup.push_shift_tip": "§a按下§f§lShift键§a以加快拾取", "multiplayer.disconnect.addiction": "你触发了防沉迷机制,休息会再来吧!", "painting.leashedplayer.group_photo.author": "§9闲趣§4时§e坞§r", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json index e3ae2eb..08a0317 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -99,6 +99,11 @@ "leashedplayer.lead_breaker.item.desc": "§7可以破壞拴繩鏈接", "leashedplayer.lead_breaker.item.use_fai": "§c未能剪斷§f%2$s§c對§f%1$s§c拴繩鏈接", "leashedplayer.lead_breaker.item.use_suf": "§a成功剪斷§f%2$s§a對§f%1$s§a拴繩鏈接", + "leashedplayer.leash_rope.length.decrease": "§c減少§f%s§c的拴繩長度§7(§長度§7:§e%d§7)", + "leashedplayer.leash_rope.length.decrease.self": "§c減少拴繩長度§7(§長度§7:§e%d§7)", + "leashedplayer.leash_rope.length.failed": "§c失敗", + "leashedplayer.leash_rope.length.increase": "§a增加§f%s§a的拴繩長度§7(§長度§7:§e%d§7)", + "leashedplayer.leash_rope.length.increase.self": "§a增加拴繩長度§7(§長度§7:§e%d§7)", "leashedplayer.leash_rope_arrow.try_to_pickup.push_shift_tip": "§a按下§f§lShift鍵§a以加速拾取", "multiplayer.disconnect.addiction": "你觸發了防沉迷機制,休息會再來吧!", "painting.leashedplayer.group_photo.author": "§9閑趣§4時§e塢§r", diff --git a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java index de17107..0816f7d 100644 --- a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java @@ -9,6 +9,11 @@ import com.r3944realms.leashedplayer.content.gamerules.Server.OpenTOPNeededModeW import com.r3944realms.leashedplayer.content.items.ModItemRegister; import com.r3944realms.leashedplayer.content.items.type.ILeashRopeArrow; import com.r3944realms.leashedplayer.content.items.type.INestleRopeArrow; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; +import com.r3944realms.leashedplayer.network.server.Code; +import com.r3944realms.leashedplayer.network.server.DecreaseLeashRopeLength; +import com.r3944realms.leashedplayer.network.server.IncreaseLeashRopeLength; +import com.r3944realms.leashedplayer.utils.Util; import mcjty.theoneprobe.config.Config; import mcjty.theoneprobe.gui.GuiNote; import net.minecraft.ChatFormatting; @@ -16,6 +21,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.gui.screens.DisconnectedScreen; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.client.resources.PlayerSkin; @@ -24,15 +30,22 @@ import net.minecraft.network.DisconnectionDetails; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.FastColor; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.item.component.ChargedProjectiles; +import net.minecraft.world.phys.HitResult; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.network.PacketDistributor; + +import java.util.List; public abstract class ClientEventHandler { @@ -79,10 +92,44 @@ public abstract class ClientEventHandler { } @SubscribeEvent public static void onKetBoardInput(InputEvent.Key event) { - if(ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE.isDown()) { - assert Minecraft.getInstance().player != null; + Minecraft minecraft = Minecraft.getInstance(); + LocalPlayer player = minecraft.player; + assert player != null; + if (ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE.isDown()) { String prefix = (Command.SHOULD_USE_PREFIX ? Command.PREFIX : "") + " "; - Minecraft.getInstance().player.connection.sendCommand(prefix + "talkArea usePreference"); + player.connection.sendCommand(prefix + "talkArea usePreference"); + } + if (ModKeyMapping.KEY_ADD_LEASH_LENGTH.isDown()) { + PlayerLeashable playerLeashable = (PlayerLeashable) player; + if (playerLeashable.getLeashDataFromEntityData() == null) { + assert minecraft.level != null; + List refLookAtEntityHitResult = Util.getRefLookAtEntityHitResult(player, minecraft.level, 32, entity -> entity instanceof LivingEntity); + Entity theNearestEntityFromHitResultList = Util.getTheNearestEntityFromHitResultList(player, refLookAtEntityHitResult); + if(theNearestEntityFromHitResultList != null) { + if (theNearestEntityFromHitResultList instanceof Player refPlayer) { + PacketDistributor.sendToServer(new IncreaseLeashRopeLength(Code.OTHER_ST, refPlayer.getStringUUID())); + } + } + } + if (playerLeashable.getLeashDataFromEntityData() != null) { + PacketDistributor.sendToServer(new IncreaseLeashRopeLength(Code.SELF, player.getStringUUID())); + } + } + if (ModKeyMapping.KEY_SUB_LEASH_LENGTH.isDown()) { + PlayerLeashable playerLeashable = (PlayerLeashable) player; + if (playerLeashable.getLeashDataFromEntityData() == null) { + assert minecraft.level != null; + List refLookAtEntityHitResult = Util.getRefLookAtEntityHitResult(player, minecraft.level, 32, entity -> entity instanceof LivingEntity); + Entity theNearestEntityFromHitResultList = Util.getTheNearestEntityFromHitResultList(player, refLookAtEntityHitResult); + if(theNearestEntityFromHitResultList != null) { + if (theNearestEntityFromHitResultList instanceof Player refPlayer) { + PacketDistributor.sendToServer(new DecreaseLeashRopeLength(Code.OTHER_ST, refPlayer.getStringUUID())); + } + } + } + if (playerLeashable.getLeashDataFromEntityData() != null) { + PacketDistributor.sendToServer(new DecreaseLeashRopeLength(Code.SELF, player.getStringUUID())); + } } } } @@ -152,5 +199,6 @@ public abstract class ClientEventHandler { ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get() ); } + } } diff --git a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java index f8060b3..e7cf82e 100644 --- a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java @@ -38,7 +38,6 @@ import net.minecraft.world.level.block.DispenserBlock; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.AnvilUpdateEvent; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent; diff --git a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java index 40d780f..2249922 100644 --- a/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/LeashedPlayer.java @@ -25,6 +25,8 @@ public class LeashedPlayer { private static Double M1;//拴繩掉落距離倍基數 private static Double M2;//繩箭拴繩掉落距離倍基數 + private static Integer M3; //拴绳最小长度 + private static Integer M4; //拴绳最大长度 public LeashedPlayer(IEventBus event) { ModItemRegister.register(event); ModPaintingsRegister.register(event); @@ -56,6 +58,18 @@ public class LeashedPlayer { } return M2; } + public static Integer M3() { + if(M3 == null) { + M3 = LeashPlayerCommonConfig.MinimumLeashLengthCanBeSet.get(); + } + return M3; + } + public static Integer M4() { + if(M4 == null) { + M4 = LeashPlayerCommonConfig.MaximumLeashLengthCanBeSet.get(); + } + return M4; + } } 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 33c2333..78ad42a 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -18,6 +18,9 @@ import com.r3944realms.leashedplayer.content.items.type.SpectralLeashRopeArrowIt import com.r3944realms.leashedplayer.content.items.type.TippedLeashRopeArrow; import com.r3944realms.leashedplayer.content.sounds.ModSoundRegister; import com.r3944realms.leashedplayer.datagen.provider.attributes.ModPaintingVariants; +import com.r3944realms.leashedplayer.network.server.Code; +import com.r3944realms.leashedplayer.network.server.DecreaseLeashRopeLength; +import com.r3944realms.leashedplayer.network.server.IncreaseLeashRopeLength; import com.r3944realms.leashedplayer.utils.Enum.LanguageEnum; import com.r3944realms.leashedplayer.utils.Enum.ModPartEnum; import net.minecraft.world.item.Item; @@ -99,6 +102,11 @@ public enum ModLangKeyValue { MESSAGE_LEASH_BREAKER_USE_SUF(LeadBreakerItem.MESSAGE_USE_SUF, ModPartEnum.MESSAGE, "§aSuccessfully break §f%1$s§a 's Leashed Link to §f%2$s ", "§a成功剪断§f%2$s§a对§f%1$s§a拴绳链接", "§a成功剪斷§f%2$s§a對§f%1$s§a拴繩鏈接", false), MESSAGE_LEASH_BREAKER_USE_FAI(LeadBreakerItem.MESSAGE_USE_FAI, ModPartEnum.MESSAGE, "§cFailed to break §f%1$s§c 's Leashed Link to §f%2$s", "§c无法剪断§f%2$s§c对§f%1$s§c拴绳链接", "§c未能剪斷§f%2$s§c對§f%1$s§c拴繩鏈接", false), MESSAGE_LEASH_NOT_SUPPORT_TO_NOT_PLAYER_ENTITY(ModKeyMapping.NOT_SUPPORT_TO_NOT_PLAYER_ENTITY, ModPartEnum.MESSAGE, "Only work on Players", "只在玩家身上有效", "僅對玩家有效", false), + MESSAGE_LEASH_ADD_LEASH_LENGTH(IncreaseLeashRopeLength.INCREASE_LEASH_ROPE_LENGTH, ModPartEnum.MESSAGE, "§aIncrease the §f%s §aLength of Leash Rope§7(§bLength§7:§e%d§7)", "§a增加§f%s的拴绳长度§a§7(§b长度§7:§e%d§7)", "§a增加§f%s§a的拴繩長度§7(§長度§7:§e%d§7)", false), + MESSAGE_LEASH_SUB_LEASH_LENGTH(DecreaseLeashRopeLength.DECREASE_LEASH_ROPE_LENGTH, ModPartEnum.MESSAGE, "§Decrease the §f%s §cLength of Leash Rope§7(§bLength§7:§e%d§7)", "§c减少§f%s的拴绳长度§c§7(§b长度§7:§e%d§7)", "§c減少§f%s§c的拴繩長度§7(§長度§7:§e%d§7)", false), + MESSAGE_LEASH_ADD_SELF_LEASH_LENGTH(IncreaseLeashRopeLength.INCREASE_SELF_LEASH_ROPE_LENGTH, ModPartEnum.MESSAGE, "§aIncrease the Length of Leash Rope§7(§bLength§7:§e%d§7)", "§a增加拴绳长度§a§7(§b长度§7:§e%d§7)", "§a增加拴繩長度§7(§長度§7:§e%d§7)", false), + MESSAGE_LEASH_SUB_SELF_LEASH_LENGTH(DecreaseLeashRopeLength.DECREASE_SELF_LEASH_ROPE_LENGTH, ModPartEnum.MESSAGE, "§cDecrease the Length of Leash Rope§7(§bLength§7:§e%d§7)", "§c减少拴绳长度§c§7(§b长度§7:§e%d§7)", "§c減少拴繩長度§7(§長度§7:§e%d§7)", false), + MESSAGE_LEASH_FAILED_SET_LENGTH(Code.LEASH_LENGTH_FAILED_SET, ModPartEnum.MESSAGE, "§cFailed", "§c失败", "§c失敗", false), //GAME_RULE_NAME DEFAULT_AREA_TALK_NAME(DefaultTalkArea.NAME_KEY, ModPartEnum.NAME, "Default Area Talk", "默认聊天区域可见半径", "默認聊天區域可見半徑",false), TELEPORT_WITH_LEASHED_PLAYERS_NAME(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false), 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 64b3b65..f3a758f 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java @@ -33,7 +33,7 @@ import java.util.Objects; import java.util.function.Consumer; @Mixin(Player.class) -public abstract class MixinPlayer extends LivingEntity implements PlayerLeashable, ILivingEntityExtension { +public abstract class MixinPlayer extends LivingEntity implements PlayerLeashable, ILivingEntityExtension { @Unique protected int Pl$LeashKeepTick;//保存状态,当超过断裂绳长时若LeashKeepTick大于0,则不断裂 diff --git a/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java b/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java index aecbff2..4dadfcb 100644 --- a/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java +++ b/src/main/java/com/r3944realms/leashedplayer/network/LeashedPlayerNetwork.java @@ -3,6 +3,8 @@ package com.r3944realms.leashedplayer.network; import com.r3944realms.leashedplayer.LeashedPlayer; import com.r3944realms.leashedplayer.network.client.BooleanGameRuleValueChangeData; import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement; +import com.r3944realms.leashedplayer.network.server.DecreaseLeashRopeLength; +import com.r3944realms.leashedplayer.network.server.IncreaseLeashRopeLength; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; @@ -24,6 +26,16 @@ public class LeashedPlayerNetwork { BooleanGameRuleValueChangeData.STREAM_CODEC, BooleanGameRuleValueChangeData::handle ); + registrar.playToServer( + IncreaseLeashRopeLength.TYPE, + IncreaseLeashRopeLength.STREAM_CODEC, + IncreaseLeashRopeLength::handle + ); + registrar.playToServer( + DecreaseLeashRopeLength.TYPE, + DecreaseLeashRopeLength.STREAM_CODEC, + DecreaseLeashRopeLength::handle + ); } } diff --git a/src/main/java/com/r3944realms/leashedplayer/network/server/Code.java b/src/main/java/com/r3944realms/leashedplayer/network/server/Code.java new file mode 100644 index 0000000..00c8560 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/network/server/Code.java @@ -0,0 +1,8 @@ +package com.r3944realms.leashedplayer.network.server; + +public enum Code { + OTHER_ST, + OTHER_WE, + SELF; + public static final String LEASH_LENGTH_FAILED_SET = "leashedplayer.leash_rope.length.failed"; +} diff --git a/src/main/java/com/r3944realms/leashedplayer/network/server/DecreaseLeashRopeLength.java b/src/main/java/com/r3944realms/leashedplayer/network/server/DecreaseLeashRopeLength.java new file mode 100644 index 0000000..b0f4e1b --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/network/server/DecreaseLeashRopeLength.java @@ -0,0 +1,59 @@ +package com.r3944realms.leashedplayer.network.server; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +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.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public record DecreaseLeashRopeLength(Code code, String playerUUID) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"sub_leash_rope_length")); + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite( + NeoForgeStreamCodecs.enumCodec(Code.class), DecreaseLeashRopeLength::code, + ByteBufCodecs.STRING_UTF8, DecreaseLeashRopeLength::playerUUID, + DecreaseLeashRopeLength::new + ); + public static final String DECREASE_LEASH_ROPE_LENGTH = "leashedplayer.leash_rope.length.decrease", + DECREASE_SELF_LEASH_ROPE_LENGTH = DECREASE_LEASH_ROPE_LENGTH + ".self"; + + public void handle(IPayloadContext context) { + context.enqueueWork(() -> { + Player player = context.player(); + ServerLevel level = (ServerLevel) player.level(); + Player playerByUUID = level.getPlayerByUUID(UUID.fromString(playerUUID)); + if (playerByUUID != null) { + ILivingEntityExtension entityExtension = (ILivingEntityExtension) playerByUUID; + Entity leashDataEntity = PlayerLeashable.getLeashDataEntity((ServerPlayer) playerByUUID, level); + if ((leashDataEntity != null && code == Code.OTHER_ST && leashDataEntity == player ) || (leashDataEntity != null && code == Code.OTHER_ST)) { + float newValue = Math.max(Math.min(entityExtension.getLeashLength() - 1, LeashedPlayer.M4()), LeashedPlayer.M3()); + entityExtension.setLeashLength(newValue); + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(DECREASE_LEASH_ROPE_LENGTH, playerByUUID.getDisplayName(), newValue), true); + } else if (code == Code.SELF) { + float newValue = Math.max(Math.min(entityExtension.getLeashLength() - 1, LeashedPlayer.M4()), LeashedPlayer.M3()); + entityExtension.setLeashLength(newValue); + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(DECREASE_SELF_LEASH_ROPE_LENGTH, newValue), true); + } else { + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(Code.LEASH_LENGTH_FAILED_SET), true); + } + } + }); + } + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/network/server/IncreaseLeashRopeLength.java b/src/main/java/com/r3944realms/leashedplayer/network/server/IncreaseLeashRopeLength.java new file mode 100644 index 0000000..93820fe --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/network/server/IncreaseLeashRopeLength.java @@ -0,0 +1,60 @@ +package com.r3944realms.leashedplayer.network.server; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; +import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +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.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public record IncreaseLeashRopeLength(Code code, String playerUUID) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"add_leash_rope_length")); + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite( + NeoForgeStreamCodecs.enumCodec(Code.class), IncreaseLeashRopeLength::code, + ByteBufCodecs.STRING_UTF8, IncreaseLeashRopeLength::playerUUID, + IncreaseLeashRopeLength::new + ); + public static final String INCREASE_LEASH_ROPE_LENGTH = "leashedplayer.leash_rope.length.increase", + INCREASE_SELF_LEASH_ROPE_LENGTH = INCREASE_LEASH_ROPE_LENGTH + ".self"; + + + public void handle(IPayloadContext context) { + context.enqueueWork(() -> { + Player player = context.player(); + ServerLevel level = (ServerLevel) player.level(); + Player playerByUUID = level.getPlayerByUUID(UUID.fromString(playerUUID)); + if (playerByUUID != null) { + ILivingEntityExtension entityExtension = (ILivingEntityExtension) playerByUUID; + Entity leashDataEntity = PlayerLeashable.getLeashDataEntity((ServerPlayer) playerByUUID, level); + if ((leashDataEntity != null && code == Code.OTHER_ST && leashDataEntity == player ) || (leashDataEntity != null && code == Code.OTHER_ST)) { + float newValue = Math.max(Math.min(entityExtension.getLeashLength() + 1, LeashedPlayer.M4()), LeashedPlayer.M3()); + entityExtension.setLeashLength(newValue); + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(INCREASE_LEASH_ROPE_LENGTH, playerByUUID.getDisplayName(), newValue), true); + } else if (code == Code.SELF) { + float newValue = Math.max(Math.min(entityExtension.getLeashLength() + 1, LeashedPlayer.M4()), LeashedPlayer.M3()); + entityExtension.setLeashLength(newValue); + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(INCREASE_SELF_LEASH_ROPE_LENGTH, newValue), true); + } else { + ((ServerPlayer) playerByUUID).sendSystemMessage(Component.translatable(Code.LEASH_LENGTH_FAILED_SET), true); + } + } + }); + } + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/utils/Util.java b/src/main/java/com/r3944realms/leashedplayer/utils/Util.java index 60e5733..c23e070 100644 --- a/src/main/java/com/r3944realms/leashedplayer/utils/Util.java +++ b/src/main/java/com/r3944realms/leashedplayer/utils/Util.java @@ -6,10 +6,17 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.*; import net.neoforged.fml.loading.FMLPaths; +import org.jetbrains.annotations.Nullable; import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.Function; import static com.r3944realms.leashedplayer.utils.Logger.logger; @@ -61,4 +68,34 @@ public class Util { thrower.level().addFreshEntity(thrownItem); } + + public static List getRefLookAtEntityHitResult(Entity looker, Level level, float distance, Function condition) { + Vec3 startPosition = looker.getEyePosition(); + Vec3 endPosition = looker.getLookAngle().normalize().scale(distance).add(startPosition); + BlockHitResult clip = level.clip(new ClipContext(startPosition, endPosition, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, looker)); + endPosition = clip.getLocation(); + AABB range = looker.getBoundingBox().expandTowards(endPosition.subtract(startPosition)); + List hits = new ArrayList<>(); + List entities = level.getEntities(looker, range, condition::apply); + for (Entity entity : entities) { + Vec3 vec3 = entity.getBoundingBox().clip(startPosition, endPosition).orElse(null); + if(vec3 != null) { + EntityHitResult entityHitResult = new EntityHitResult(entity, vec3); + hits.add(entityHitResult); + } + } + return hits; + } + + @Nullable + public static Entity getTheNearestEntityFromHitResultList(Entity looker, List hitResults) { + if(!hitResults.isEmpty()) { + hitResults.sort(Comparator.comparingDouble(e -> e.getLocation().distanceTo(looker.getEyePosition()))); + HitResult hitResult = hitResults.getFirst(); + if (hitResult instanceof EntityHitResult entityHitResult) + return entityHitResult.getEntity(); + else return null; + } + else return null; + } }