2024/11/26

联动内容#3
增加一些提示内容
添加了按键
This commit is contained in:
叁玖领域 2024-11-27 00:25:37 +08:00
parent 52f30a4275
commit 800a60ab97
16 changed files with 272 additions and 12 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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<HitResult> 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<HitResult> 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()
);
}
}
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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),

View File

@ -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则不断裂

View File

@ -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
);
}
}

View File

@ -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";
}

View File

@ -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<DecreaseLeashRopeLength> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"sub_leash_rope_length"));
public static final StreamCodec<FriendlyByteBuf, DecreaseLeashRopeLength> 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<? extends CustomPacketPayload> type() {
return TYPE;
}
}

View File

@ -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<IncreaseLeashRopeLength> TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID,"add_leash_rope_length"));
public static final StreamCodec<FriendlyByteBuf, IncreaseLeashRopeLength> 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<? extends CustomPacketPayload> type() {
return TYPE;
}
}

View File

@ -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<HitResult> getRefLookAtEntityHitResult(Entity looker, Level level, float distance, Function<Entity, Boolean> 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<HitResult> hits = new ArrayList<>();
List<? extends Entity> 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<HitResult> 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;
}
}